Cyril Dupland
Implement V2 workflow for agent orchestration, including new chat tools agent with retrieval capabilities, classifier node enhancements, and summarizer integration. Add detailed documentation for V2 features and prompts, ensuring improved agent interaction and context handling.
2dcccd3 | """Orchestrated V2 workflow with tool-calling retrieval autonomy.""" | |
| from datetime import datetime | |
| from langgraph.graph import StateGraph, END | |
| from langchain_core.language_models.chat_models import BaseChatModel | |
| from graphs.state import AgentState | |
| from graphs.agents.classifier_agent import classifier_node | |
| from graphs.agents.chat_tools_agent import chat_with_tools_node | |
| from graphs.agents.summarizer_agent import summarizer_llm_node, summarizer_export_node | |
| from graphs.prompts_v2 import load_v2_prompt | |
| from typing import Callable | |
| def _build_v2_workflow( | |
| classify_runner: Callable[[AgentState], AgentState], | |
| tools_agent_runner: Callable[[AgentState], AgentState], | |
| summarizer_llm_runner: Callable[[AgentState], AgentState], | |
| summarizer_export_runner: Callable[[AgentState], AgentState], | |
| ): | |
| workflow = StateGraph(AgentState) | |
| workflow.add_node("classify", classify_runner) | |
| workflow.add_node("tools_agent", tools_agent_runner) | |
| workflow.add_node("summarizer_llm", summarizer_llm_runner) | |
| workflow.add_node("summarizer_export", summarizer_export_runner) | |
| workflow.set_entry_point("classify") | |
| workflow.add_conditional_edges( | |
| "classify", | |
| lambda s: getattr(s.get("classification"), "classification", "CLASSIC"), | |
| { | |
| "CLASSIC": "tools_agent", | |
| "SUMMARIZE": "summarizer_llm", | |
| "UNKNOWN": "tools_agent", | |
| }, | |
| ) | |
| workflow.add_edge("tools_agent", END) | |
| workflow.add_edge("summarizer_llm", "summarizer_export") | |
| workflow.add_edge("summarizer_export", END) | |
| return workflow | |
| def create_orchestrated_graph_v2(llm: BaseChatModel, checkpointer=None): | |
| # Lazy imports keep module importable in notebook contexts that do not | |
| # need runtime PDF generation dependencies. | |
| from tools.pdf import markdown_to_pdf | |
| from tools.storage import upload_pdf_to_supabase | |
| chat_prompt_v2_template = load_v2_prompt("chat_system.md") | |
| today_date = datetime.now().strftime("%d/%m/%Y") | |
| chat_prompt_v2 = chat_prompt_v2_template.replace("{{TODAY_DATE}}", today_date) | |
| tools_policy_v2 = load_v2_prompt("tools_policy.md") | |
| classifier_prompt_v2 = load_v2_prompt("classifier_system.md") | |
| summarizer_prompt_v2 = load_v2_prompt("summarizer_system.md") | |
| workflow = _build_v2_workflow( | |
| classify_runner=classifier_node(llm, system_prompt=classifier_prompt_v2), | |
| tools_agent_runner=chat_with_tools_node( | |
| llm, | |
| base_system_prompt=chat_prompt_v2, | |
| tools_policy_prompt=tools_policy_v2, | |
| ), | |
| summarizer_llm_runner=summarizer_llm_node( | |
| llm, | |
| system_prompt=summarizer_prompt_v2, | |
| ), | |
| summarizer_export_runner=summarizer_export_node( | |
| markdown_to_pdf=markdown_to_pdf, | |
| upload_pdf=upload_pdf_to_supabase, | |
| ), | |
| ) | |
| return workflow.compile(checkpointer=checkpointer) | |