71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
from langgraph.graph import StateGraph, START, END
|
|
from state import BriefState
|
|
from nodes import outline_node, research_step_node, synthesize_node
|
|
|
|
def should_continue_research(state: BriefState) -> str:
|
|
"""
|
|
Условие: продолжать исследование или переходить к синтезу
|
|
"""
|
|
if state["step_index"] < len(state["outline"]):
|
|
return "continue"
|
|
else:
|
|
return "synthesize"
|
|
|
|
def build_research_graph():
|
|
"""
|
|
Строит граф исследовательского агента
|
|
|
|
Структура:
|
|
START → outline → research_step → (пока есть пункты) → research_step → synthesize → END
|
|
"""
|
|
graph = StateGraph(BriefState)
|
|
|
|
# Добавляем узлы
|
|
graph.add_node("outline", outline_node)
|
|
graph.add_node("research_step", research_step_node)
|
|
graph.add_node("synthesize", synthesize_node)
|
|
|
|
# Добавляем рёбра
|
|
graph.add_edge(START, "outline")
|
|
graph.add_edge("outline", "research_step")
|
|
|
|
# Условное ребро после research_step
|
|
graph.add_conditional_edges(
|
|
"research_step",
|
|
should_continue_research,
|
|
{
|
|
"continue": "research_step", # Берём следующий пункт
|
|
"synthesize": "synthesize" # Завершаем исследование
|
|
}
|
|
)
|
|
|
|
# После синтеза завершаем
|
|
graph.add_edge("synthesize", END)
|
|
|
|
return graph.compile()
|
|
|
|
# Пример использования
|
|
if __name__ == "__main__":
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
# Создаём граф
|
|
app = build_research_graph()
|
|
|
|
# Входное состояние
|
|
initial_state = {
|
|
"topic": "Как студенту безопасно подключать MCP к LangChain",
|
|
"outline": None,
|
|
"step_index": 0,
|
|
"notes": [],
|
|
"final_brief": None
|
|
}
|
|
|
|
# Запуск
|
|
final_state = app.invoke(initial_state)
|
|
|
|
# Вывод результата
|
|
print("\n" + "="*80)
|
|
print("ИТОГОВЫЙ ИССЛЕДОВАТЕЛЬСКИЙ БРИФ")
|
|
print("="*80)
|
|
print(final_state["final_brief"]) |