Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -347,6 +347,11 @@ def parser_node(state: State) -> State:
|
|
| 347 |
'''
|
| 348 |
props_string = state["props_string"]
|
| 349 |
query_task = state["query_task"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 350 |
|
| 351 |
check_prompt = f'Determine if there is enough CONTEXT below to answer the original \
|
| 352 |
QUERY TASK. If there is, respond with "PROCEED #" . If there is not enough information \
|
|
@@ -397,6 +402,21 @@ TOOL RESULTS: {props_string}. '
|
|
| 397 |
|
| 398 |
return {"messages": res}
|
| 399 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 400 |
def get_chemtool(state):
|
| 401 |
'''
|
| 402 |
'''
|
|
@@ -425,6 +445,8 @@ def loop_or_not(state):
|
|
| 425 |
print(f"(line 417) Loop? {state['loop_again']}")
|
| 426 |
if state["loop_again"] == "loop_again":
|
| 427 |
return True
|
|
|
|
|
|
|
| 428 |
else:
|
| 429 |
return False
|
| 430 |
|
|
@@ -446,6 +468,7 @@ builder.add_node("similars_node", similars_node)
|
|
| 446 |
builder.add_node("loop_node", loop_node)
|
| 447 |
builder.add_node("parser_node", parser_node)
|
| 448 |
builder.add_node("reflect_node", reflect_node)
|
|
|
|
| 449 |
|
| 450 |
builder.add_edge(START, "first_node")
|
| 451 |
builder.add_conditional_edges("first_node", get_chemtool, {
|
|
@@ -473,9 +496,11 @@ builder.add_conditional_edges("loop_node", get_chemtool, {
|
|
| 473 |
|
| 474 |
builder.add_conditional_edges("parser_node", loop_or_not, {
|
| 475 |
True: "retry_node",
|
|
|
|
| 476 |
False: "reflect_node"})
|
| 477 |
|
| 478 |
builder.add_edge("reflect_node", END)
|
|
|
|
| 479 |
|
| 480 |
graph = builder.compile()
|
| 481 |
|
|
|
|
| 347 |
'''
|
| 348 |
props_string = state["props_string"]
|
| 349 |
query_task = state["query_task"]
|
| 350 |
+
tool_choice = state["tool_choice"]
|
| 351 |
+
|
| 352 |
+
if (tool_choice[0] == None) and (tool_choice[1] == None):
|
| 353 |
+
state["loop_again"] = "finish_gracefully"
|
| 354 |
+
return state
|
| 355 |
|
| 356 |
check_prompt = f'Determine if there is enough CONTEXT below to answer the original \
|
| 357 |
QUERY TASK. If there is, respond with "PROCEED #" . If there is not enough information \
|
|
|
|
| 402 |
|
| 403 |
return {"messages": res}
|
| 404 |
|
| 405 |
+
def graceful_exit_node(state: State) -> State:
|
| 406 |
+
'''
|
| 407 |
+
Called when the Agent cannot assign any tools for the task
|
| 408 |
+
'''
|
| 409 |
+
props_string = state["props_string"]
|
| 410 |
+
prompt = f'You are a chemistry agent that has not been able to fulfill the task assigned. \
|
| 411 |
+
Write an apology to the user and include any information in the CONTEXT below, just in case it can \
|
| 412 |
+
prove useful. \n \
|
| 413 |
+
CONTEXT: {props_string} \'
|
| 414 |
+
|
| 415 |
+
res = chat_model.invoke(prompt)
|
| 416 |
+
|
| 417 |
+
return {"messages": res}
|
| 418 |
+
|
| 419 |
+
|
| 420 |
def get_chemtool(state):
|
| 421 |
'''
|
| 422 |
'''
|
|
|
|
| 445 |
print(f"(line 417) Loop? {state['loop_again']}")
|
| 446 |
if state["loop_again"] == "loop_again":
|
| 447 |
return True
|
| 448 |
+
elif tate["loop_again"] == "finish_gracefully":
|
| 449 |
+
return 'lets_get_outta_here'
|
| 450 |
else:
|
| 451 |
return False
|
| 452 |
|
|
|
|
| 468 |
builder.add_node("loop_node", loop_node)
|
| 469 |
builder.add_node("parser_node", parser_node)
|
| 470 |
builder.add_node("reflect_node", reflect_node)
|
| 471 |
+
builder.add_node("graceful_exit_node", graceful_exit_node)
|
| 472 |
|
| 473 |
builder.add_edge(START, "first_node")
|
| 474 |
builder.add_conditional_edges("first_node", get_chemtool, {
|
|
|
|
| 496 |
|
| 497 |
builder.add_conditional_edges("parser_node", loop_or_not, {
|
| 498 |
True: "retry_node",
|
| 499 |
+
'lets_get_outta_here': "graceful_exit_node",
|
| 500 |
False: "reflect_node"})
|
| 501 |
|
| 502 |
builder.add_edge("reflect_node", END)
|
| 503 |
+
builder.add_edge("graceful_exit_node", END)
|
| 504 |
|
| 505 |
graph = builder.compile()
|
| 506 |
|