Files
ailine/app/graph_builder.py

79 lines
2.5 KiB
Python
Raw Normal View History

2026-04-13 19:49:18 +08:00
"""
LangGraph 状态图构建模块 - 精简版仅负责组装图
所有节点逻辑已拆分到独立模块
2026-04-13 19:49:18 +08:00
"""
from langchain_core.language_models import BaseLLM
from langgraph.graph import StateGraph, START, END
# 本地模块
2026-04-20 14:05:57 +08:00
from app.graph.state import MessagesState, GraphContext
from app.nodes import (
create_llm_call_node,
create_tool_call_node,
create_retrieve_memory_node,
create_summarize_node,
should_continue
)
from app.memory import Mem0Client
2026-04-17 01:26:05 +08:00
from app.nodes.finalize import finalize_node
2026-04-14 20:39:58 +08:00
2026-04-13 19:49:18 +08:00
class GraphBuilder:
"""LangGraph 状态图构建器 - 仅负责组装图"""
2026-04-13 19:49:18 +08:00
def __init__(self, llm: BaseLLM, tools: list, tools_by_name: dict):
2026-04-13 19:49:18 +08:00
"""
初始化构建器
Args:
llm: 大语言模型实例
tools: 工具列表
tools_by_name: 名称到工具函数的映射
"""
self.llm = llm
self.tools = tools
self.tools_by_name = tools_by_name
2026-04-14 17:34:12 +08:00
# ⭐ 创建 Mem0 客户端(懒加载,首次使用时初始化)
self.mem0_client = Mem0Client(llm)
2026-04-13 19:49:18 +08:00
def build(self) -> StateGraph:
2026-04-13 19:49:18 +08:00
"""
构建未编译的状态图
2026-04-14 17:34:12 +08:00
Returns:
StateGraph 实例
"""
builder = StateGraph(MessagesState, context_schema=GraphContext)
2026-04-14 17:34:12 +08:00
# ⭐ 通过工厂函数创建节点(依赖注入)
retrieve_memory_node = create_retrieve_memory_node(self.mem0_client)
llm_call_node = create_llm_call_node(self.llm, self.tools)
tool_call_node = create_tool_call_node(self.tools_by_name)
summarize_node = create_summarize_node(self.mem0_client)
2026-04-14 17:34:12 +08:00
# 添加节点
builder.add_node("retrieve_memory", retrieve_memory_node)
builder.add_node("llm_call", llm_call_node)
builder.add_node("tool_node", tool_call_node)
builder.add_node("summarize", summarize_node)
2026-04-17 01:26:05 +08:00
builder.add_node("finalize", finalize_node)
2026-04-14 17:34:12 +08:00
# 添加边
2026-04-14 17:34:12 +08:00
builder.add_edge(START, "retrieve_memory")
builder.add_edge("retrieve_memory", "llm_call")
builder.add_conditional_edges(
"llm_call",
should_continue,
2026-04-14 17:34:12 +08:00
{
"tool_node": "tool_node",
"summarize": "summarize",
2026-04-17 01:26:05 +08:00
"finalize": "finalize"
2026-04-14 17:34:12 +08:00
}
)
2026-04-13 19:49:18 +08:00
builder.add_edge("tool_node", "llm_call")
2026-04-17 01:26:05 +08:00
builder.add_edge("summarize", "finalize")
builder.add_edge("finalize", END)
2026-04-14 17:34:12 +08:00
2026-04-17 01:26:05 +08:00
return builder