From b6acca7a83ca32154a4b48b949a85f8413f62d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=B4=D0=B5=D0=BB=D0=B8=D0=BD=D0=B0=20=D0=A1=D0=B0?= =?UTF-8?q?=D1=82=D1=82=D0=B0=D1=80=D0=BE=D0=B2=D0=B0?= Date: Thu, 4 Jun 2026 16:26:38 +0000 Subject: [PATCH] add graph.py --- graph.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 graph.py diff --git a/graph.py b/graph.py new file mode 100644 index 0000000..8e74c29 --- /dev/null +++ b/graph.py @@ -0,0 +1,73 @@ +from langgraph.graph import StateGraph, START, END +from state import ReflectState +from nodes import draft_answer, reflect, rewrite + +def should_continue(state: ReflectState) -> str: + """Функция-условие: продолжать или завершить""" + # Проверяем вердикт + if state["verdict"] == "ok": + print(f"✅ Ответ принят после {state['round']} раундов") + return "end" + + # Проверяем лимит раундов + if state["round"] >= state["max_rounds"]: + print(f"⚠️ Достигнут лимит раундов ({state['max_rounds']}). Возвращаем последнюю версию.") + return "end" + + # Требуется доработка + print(f"🔄 Запускаем раунд доработки {state['round'] + 1}/{state['max_rounds']}") + return "rewrite" + +def build_reflection_graph(max_rounds: int = 2): + """Строит граф с рефлексией""" + # Инициализация графа с состоянием + graph = StateGraph(ReflectState) + + # Добавляем узлы + graph.add_node("draft_answer", draft_answer) + graph.add_node("reflect", reflect) + graph.add_node("rewrite", rewrite) + + # Добавляем рёбра + graph.add_edge(START, "draft_answer") + graph.add_edge("draft_answer", "reflect") + + # Условное ребро после рефлексии + graph.add_conditional_edges( + "reflect", + should_continue, + { + "rewrite": "rewrite", + "end": END + } + ) + + # После rewrite возвращаемся на reflect для повторной оценки + graph.add_edge("rewrite", "reflect") + + # Компилируем граф + return graph.compile() + +# Пример использования +if __name__ == "__main__": + # Создаём граф + app = build_reflection_graph(max_rounds=2) + + # Входное состояние + initial_state = { + "question": "Объясни студенту разницу между tool и resource в MCP", + "draft": "", + "critique": "", + "verdict": "needs_revision", + "round": 1, + "max_rounds": 2 + } + + # Запуск + final_state = app.invoke(initial_state) + + # Вывод результата + print("\n" + "="*80) + print("ФИНАЛЬНЫЙ ОТВЕТ:") + print("="*80) + print(final_state["draft"]) \ No newline at end of file