Commit
·
0ec910b
1
Parent(s):
c71050f
asf
Browse files
app.py
CHANGED
@@ -21,15 +21,84 @@ class BasicAgent:
|
|
21 |
"""A langgraph agent."""
|
22 |
def __init__(self):
|
23 |
print("BasicAgent initialized.")
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
|
26 |
def __call__(self, question: str) -> str:
|
27 |
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
28 |
-
|
29 |
-
|
30 |
-
messages =
|
31 |
-
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
|
35 |
def run_and_submit_all( profile: gr.OAuthProfile | None):
|
|
|
21 |
"""A langgraph agent."""
|
22 |
def __init__(self):
|
23 |
print("BasicAgent initialized.")
|
24 |
+
# Assumes build_graph() and sys_msg are available from your agent.py
|
25 |
+
# You need to import them here.
|
26 |
+
# from your_agent_file import build_graph, sys_msg as agent_system_message
|
27 |
+
# self.graph = build_graph()
|
28 |
+
# self.system_message = agent_system_message
|
29 |
+
|
30 |
+
# Let's assume for now agent.py is structured to be imported like this:
|
31 |
+
# Option 1: if agent.py defines them globally
|
32 |
+
# from agent import build_graph, sys_msg
|
33 |
+
# self.graph = build_graph(provider="huggingface") # Or your desired provider
|
34 |
+
# self.sys_msg_for_graph = sys_msg
|
35 |
+
|
36 |
+
# Option 2: If build_graph also returns the sys_msg or if sys_msg is part of the graph object
|
37 |
+
# This depends on how you refactor agent.py for importability
|
38 |
+
|
39 |
+
# For this example, I'll assume you import them directly:
|
40 |
+
from agent import build_graph, sys_msg as agent_sys_msg # Make sure agent.py is in PYTHONPATH or same dir
|
41 |
+
|
42 |
+
self.graph = build_graph(provider="huggingface") # Specify the provider
|
43 |
+
self.agent_system_message = agent_sys_msg
|
44 |
+
|
45 |
|
46 |
def __call__(self, question: str) -> str:
|
47 |
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
48 |
+
|
49 |
+
# INCORRECT INVOCATION:
|
50 |
+
# messages = [HumanMessage(content=question)] # <-- MISSING SYSTEM MESSAGE
|
51 |
+
# messages = self.graph.invoke({"messages": messages})
|
52 |
+
|
53 |
+
# CORRECTED INVOCATION:
|
54 |
+
# You MUST include the system message that was loaded in agent.py
|
55 |
+
initial_graph_messages = [self.agent_system_message, HumanMessage(content=question)]
|
56 |
+
|
57 |
+
print("Invoking graph with (system_message + human_question):")
|
58 |
+
# Optional: print the messages being sent for debugging
|
59 |
+
# for m in initial_graph_messages:
|
60 |
+
# m.pretty_print()
|
61 |
+
# print("-" * 20)
|
62 |
+
|
63 |
+
try:
|
64 |
+
graph_output = self.graph.invoke({"messages": initial_graph_messages})
|
65 |
+
except Exception as e:
|
66 |
+
# This will catch the StopIteration if it propagates from the graph
|
67 |
+
print(f"ERROR during graph.invoke: {e}")
|
68 |
+
# Depending on how your outer loop handles errors,
|
69 |
+
# you might want to return a specific error string or re-raise
|
70 |
+
# For the Hugging Face course, it expects the AGENT ERROR string.
|
71 |
+
# The run_and_submit_all function already handles this by catching exceptions from agent().
|
72 |
+
raise # Re-raise the exception to be caught by run_and_submit_all
|
73 |
+
|
74 |
+
# Parsing the answer
|
75 |
+
if graph_output and "messages" in graph_output and graph_output["messages"]:
|
76 |
+
final_ai_message = graph_output["messages"][-1] # Get the last message
|
77 |
+
|
78 |
+
# Debug: print the final AI message object
|
79 |
+
# print("Final AI Message Object from Graph:")
|
80 |
+
# final_ai_message.pretty_print()
|
81 |
+
|
82 |
+
if hasattr(final_ai_message, 'content'):
|
83 |
+
raw_answer = str(final_ai_message.content)
|
84 |
+
|
85 |
+
# Your specific parsing: "answer = messages['messages'][-1].content; return answer[14:]"
|
86 |
+
# This assumes the answer ALWAYS starts with "FINAL ANSWER: " (14 characters)
|
87 |
+
if raw_answer.upper().startswith("FINAL ANSWER: "):
|
88 |
+
answer = raw_answer[14:].strip() # Remove "FINAL ANSWER: " and leading/trailing whitespace
|
89 |
+
else:
|
90 |
+
# The LLM didn't follow the "FINAL ANSWER: " format
|
91 |
+
print(f"Warning: LLM output did not start with 'FINAL ANSWER: '. Raw output: '{raw_answer}'")
|
92 |
+
answer = raw_answer # Return the raw answer if format is not met, or handle as error
|
93 |
+
else:
|
94 |
+
answer = "Agent Error: Final message from graph has no content."
|
95 |
+
print(f"Final message object was: {final_ai_message}")
|
96 |
+
else:
|
97 |
+
answer = "Agent Error: Graph did not return expected messages structure."
|
98 |
+
print(f"Raw graph output: {graph_output}")
|
99 |
+
|
100 |
+
print(f"Agent returning answer: {answer}")
|
101 |
+
return answer
|
102 |
|
103 |
|
104 |
def run_and_submit_all( profile: gr.OAuthProfile | None):
|