092_agent_api / graph.py
anhkhoiphan's picture
Bỏ router, để orchestrator quyết định khi nào trả lời directly
4eb7b2b
from langgraph.graph import END, START, StateGraph
from src.nodes import (
direct_response_node,
final_response_node,
orchestrator_node,
should_call_tool,
tool_node,
)
from src.state import AgentState
def build_graph():
builder = StateGraph(AgentState)
builder.add_node("orchestrator", orchestrator_node)
builder.add_node("tool_node", tool_node)
builder.add_node("final_response", final_response_node)
builder.add_node("direct_response", direct_response_node)
builder.add_edge(START, "orchestrator")
builder.add_conditional_edges(
"orchestrator", should_call_tool,
{"tool_node": "tool_node", "direct_response": "direct_response"},
)
builder.add_edge("tool_node", "final_response")
builder.add_edge("final_response", END)
builder.add_edge("direct_response", END)
return builder.compile()
graph = build_graph()
def run(initial_state: AgentState) -> AgentState:
"""
Chạy graph với AgentState đã được khởi tạo sẵn.
Args:
initial_state: AgentState với conversation_id, sender_id, raw_query đã điền đủ.
Returns:
AgentState cuối cùng (có final_answer).
"""
return graph.invoke(initial_state)
def print_result(result: AgentState, label: str = "") -> None:
SEP = "═" * 60
if label:
print(f"\n{SEP}\n {label}\n{SEP}")
print(f" 📌 iters : {result.get('iters')} / {result.get('max_iters')}")
print(f" 📌 # messages : {len(result.get('messages', []))}")
print(f"{'─' * 60}")
print(f"\n✅ final_answer:\n")
print(result.get("final_answer") or "(trống)")