Files
ailine/backend/app/main_graph/state.py

38 lines
1.2 KiB
Python
Raw Normal View History

2026-04-21 11:02:16 +08:00
"""
极简 Agent 状态定义 - 只保留真正需要的字段
保留的核心字段
- messages: 对话历史LangGraph 必需
- user_id: 用户标识
- 记忆相关turns_since_last_summary, memory_context
- 安全限制current_step, max_steps
- 统计llm_calls, last_token_usage, last_elapsed_time
2026-04-21 11:02:16 +08:00
"""
from typing import Annotated, Sequence, Optional, Dict, Any
from dataclasses import dataclass, field
refactor: 单图方案重构 + 动态模型选择 + chat_services优化 ## 核心改动 ### 1. 单图方案重构 - 删除了多图(self.graphs),改为单图(self.graph) - 新增 MainGraphState.current_model 字段用于运行时注入模型 - llm_call 节点改为动态选择模型(create_dynamic_llm_call_node) ### 2. chat_services 优化 - 添加 _cached_services 缓存,避免重复初始化 - 新增 get_cached_chat_services() 函数,用于单图注入 - 新增 _check_http_service_available() 统一HTTP探测逻辑 - 减少重复代码,LocalVLLMChatProvider和LocalSmallModelProvider共用探测方法 ### 3. AIAgentService 重构 - initialize() 只构建一次图,传入 chat_services 字典 - 新增 _resolve_model() 模型回退逻辑 - 新增 _build_invocation() 统一构建调用参数 - process_message() 和 process_message_stream() 改为注入 current_model - 流式处理代码拆分,增加可读性 ### 4. 新增和删除文件 - 新增:backend/app/main_graph/main_graph_builder.py(图构建) - 新增:backend/app/main_graph/subgraph_wrapper.py(子图封装) - 新增:tools/test/test_tavily_search.py(测试) - 删除:backend/app/main_graph/graph.py(旧图) - 删除:backend/app/main_graph/utils/main_graph_builder.py(旧构建器) - 删除:backend/app/main_graph/utils/__init__.py ### 5. 其他更新 - README.md:新增模型服务使用情况详解章节 - backend/app/model_services/__init__.py:新增 get_cached_chat_services 导出 ## 方案优势 - 内存优化:N张图 → 1张图 - 灵活性:运行时动态选择模型,支持同会话不同模型 - 性能:模型服务缓存,初始化仅一次 - 可维护性:减少重复代码,统一HTTP探测逻辑
2026-05-05 17:30:55 +08:00
from langgraph.graph import add_messages
from langchain_core.messages import BaseMessage
2026-04-21 11:02:16 +08:00
@dataclass
class AgentState:
"""Agent 状态"""
# ========== 核心持久化字段(必需) ==========
messages: Annotated[Sequence[BaseMessage], add_messages] = field(default_factory=list)
user_id: str = ""
# ========== 安全限制字段(防止无限循环) ==========
max_steps: int = 10
current_step: int = 0
# ========== 记忆相关字段(保留) ==========
turns_since_last_summary: int = 0
memory_context: str = ""
# ========== 统计字段(保留) ==========
llm_calls: int = 0
last_token_usage: Dict[str, Any] = field(default_factory=dict)
last_elapsed_time: float = 0.0