feat: 完成极简 LangGraph 架构迁移,添加 Baosi API 支持
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 6m36s

主要变更:
- 迁移到极简 LangGraph 标准架构(START → init_state → 记忆 → Agent ⇄ Tools → finalize → END)
- 添加 Baosi API 支持,配置 ops4.7 模型
- 保留本地模型作为默认首选,Baosi 作为备选
- 新架构使用 LangGraph 原生 ToolNode 和 bind_tools
- 移除旧的混合路由、JSON 解析等复杂逻辑
- 把旧代码移到 deprecated/ 目录
- 添加新的 Agent 节点和 Tools 模块
- 添加测试脚本验证新架构
- 所有测试通过 ✓
This commit is contained in:
2026-05-07 00:48:17 +08:00
parent 5e762da740
commit 22fdb625a4
23 changed files with 1232 additions and 494 deletions

View File

@@ -1,148 +1,37 @@
"""
主图状态定义 - React 模式增强版
Main Graph State Definition - React Mode Enhanced
极简 Agent 状态定义 - 只保留真正需要的字段
字段分类说明
- 持久化字段:跨轮次保留,不重置
- 临时字段:每轮对话开始时重置
保留的核心字段:
- messages: 对话历史LangGraph 必需)
- user_id: 用户标识
- 记忆相关turns_since_last_summary, memory_context
- 安全限制current_step, max_steps
- 统计llm_calls, last_token_usage, last_elapsed_time
"""
from enum import Enum, auto
from typing import Optional, Dict, Any, Annotated, Sequence, TypedDict, List
from typing import Annotated, Sequence, Optional, Dict, Any
from dataclasses import dataclass, field
from langgraph.graph import add_messages
from langchain_core.messages import BaseMessage
# ========== 枚举类型 ==========
class CurrentAction(Enum):
"""主图当前操作类型"""
NONE = auto()
GENERAL_CHAT = auto()
NEWS_ANALYSIS = auto()
DICTIONARY = auto()
CONTACT = auto()
class ErrorSeverity(Enum):
"""错误严重程度"""
INFO = auto() # 信息级别,继续执行
WARNING = auto() # 警告级别,可以重试
ERROR = auto() # 错误级别,需要处理
FATAL = auto() # 致命错误,终止执行
@dataclass
class ErrorRecord:
"""错误记录"""
error_type: str
error_message: str
severity: ErrorSeverity = ErrorSeverity.ERROR
source: str = "" # 来源:哪个节点/子图/工具
timestamp: str = ""
retry_count: int = 0 # 已重试次数
max_retries: int = 3 # 最大重试次数
context: Dict[str, Any] = field(default_factory=dict) # 错误上下文
@dataclass
class ReactReasoningState:
"""React 推理状态"""
last_reasoning: Optional[Dict[str, Any]] = None
reasoning_result: Optional[Any] = None # 实际类型是 ReasoningResult
@dataclass
class HybridRouterState:
"""混合路由状态"""
decision: Optional[Any] = None # 实际类型是 HybridRouterResult
start_time: Optional[str] = None
@dataclass
class FastPathState:
"""快速路径状态"""
chitchat_success: bool = False
rag_success: bool = False
tool_success: bool = False
failed: bool = False
fail_reason: str = ""
@dataclass
class MainGraphState:
"""
主图状态定义
字段分类:
- 持久化字段:跨轮次保留,不重置
- 临时字段:每轮对话开始时重置
"""
# ==================================================
# 持久化字段(每轮保留)
# ==================================================
class AgentState:
"""Agent 状态"""
# ========== 核心持久化字段(必需) ==========
messages: Annotated[Sequence[BaseMessage], add_messages] = field(default_factory=list)
turns_since_last_summary: int = 0 # 距离上次总结的轮数
user_id: str = ""
# ==================================================
# 临时字段(每轮重置)
# ==================================================
# ========== 安全限制字段(防止无限循环) ==========
max_steps: int = 10
current_step: int = 0
# 主图控制字段
user_query: str = ""
current_action: CurrentAction = CurrentAction.NONE
current_model: str = "" # 本次请求使用的模型
intent_confidence: float = 0.0
# ========== 记忆相关字段(保留) ==========
turns_since_last_summary: int = 0
memory_context: str = ""
# React 推理专用字段
reasoning_step: int = 0
max_steps: int = 10 # 避免过长循环
last_action: str = ""
reasoning_history: List[Dict[str, Any]] = field(default_factory=list)
# RAG 相关字段
rag_context: str = ""
rag_retrieved: bool = False
rag_docs: List[Dict[str, Any]] = field(default_factory=list)
rag_confidence: float = 0.0 # RAG 检索置信度 (0.0-1.0)
rag_attempts: int = 0 # RAG 检索次数统计
# 联网搜索相关字段
web_search_results: List[str] = field(default_factory=list)
# 错误处理字段
errors: List[ErrorRecord] = field(default_factory=list)
current_error: Optional[ErrorRecord] = None
retry_action: Optional[str] = None
error_message: str = ""
# 子图结果字段
news_result: Optional[Dict[str, Any]] = None
dictionary_result: Optional[Dict[str, Any]] = None
contact_result: Optional[Dict[str, Any]] = None
# 执行状态
current_phase: str = "init"
final_result: str = ""
success: bool = False
# 元数据
start_time: Optional[str] = None
end_time: Optional[str] = None
# 结构化状态
react_reasoning: ReactReasoningState = field(default_factory=ReactReasoningState)
hybrid_router: HybridRouterState = field(default_factory=HybridRouterState)
fast_path: FastPathState = field(default_factory=FastPathState)
# 统计字段(用于反馈)
# ========== 统计字段(保留) ==========
llm_calls: int = 0
last_token_usage: Dict[str, Any] = field(default_factory=dict)
last_elapsed_time: float = 0.0
memory_context: str = "" # 记忆检索结果
# 向后兼容(保留但不推荐使用)
debug_info: Dict[str, Any] = field(default_factory=dict)