Skip to content
This repository was archived by the owner on Nov 8, 2025. It is now read-only.

Commit c624052

Browse files
=一部分文档
1 parent c843323 commit c624052

4 files changed

Lines changed: 286 additions & 0 deletions

File tree

docs/Agent图结构.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Agent 图结构
2+
3+
XieShui Agent 的核心运行逻辑通过 LangGraph 定义在一个有向图中,该图在 [`src/main_agent/graph.py`](src/main_agent/graph.py) 中构建。这个图由一系列节点(Nodes)和连接这些节点的边(Edges)组成,共同定义了 Agent 的处理流程。
4+
5+
## 图的构建
6+
7+
图的构建使用 `StateGraph`,并以 `MainAgentState` 作为其状态模型,`Configuration` 作为配置模式:
8+
9+
```python
10+
builder = StateGraph(MainAgentState, config_schema=Configuration)
11+
```
12+
13+
## 节点(Nodes)
14+
15+
每个节点代表 Agent 流程中的一个特定处理步骤。以下是 `graph.py` 中定义的节点及其功能:
16+
17+
* **`welcome`**: 欢迎节点,通常用于 Agent 启动时向用户发送欢迎消息或初始化某些状态。
18+
* **`finish_interrupt`**: 完成中断节点,可能用于在某些条件下中断当前流程并进行总结或结束。
19+
* **`agent_execution`**: Agent 执行节点,这是 Agent 的主要工作节点,负责根据当前状态和用户输入进行推理和决策。
20+
* **`no_tools_warning`**: 无工具警告节点,当 Agent 决定不需要使用工具时,可能会路由到此节点,给出相应的提示。
21+
* **`ask_interrupt`**: 提问中断节点,当 Agent 需要向用户提问以获取更多信息时,会路由到此节点。
22+
* **`tools`**: 工具执行节点,当 Agent 决定使用外部工具时,会在此节点调用相应的工具。
23+
* **`summarization`**: 总结节点,用于对对话历史或工具执行结果进行总结。
24+
25+
## 边(Edges)
26+
27+
边定义了节点之间的流转路径。LangGraph 支持两种类型的边:
28+
29+
* **直接边 (`add_edge`)**: 从一个节点直接流向另一个节点。
30+
* **条件边 (`add_conditional_edges`)**: 根据一个条件函数的结果,动态地选择下一个节点。
31+
32+
以下是 `graph.py` 中定义的边及其逻辑:
33+
34+
1. **`builder.add_edge(START, "welcome")`**:
35+
* **描述**: 图的起始点直接连接到 `welcome` 节点。这意味着 Agent 流程总是从欢迎消息开始。
36+
37+
2. **`builder.add_edge("welcome", "finish_interrupt")`**:
38+
* **描述**: `welcome` 节点处理完成后,直接流向 `finish_interrupt` 节点。
39+
40+
3. **`builder.add_edge("finish_interrupt", "agent_execution")`**:
41+
* **描述**: `finish_interrupt` 节点处理完成后,直接流向 `agent_execution` 节点,进入 Agent 的主要执行逻辑。
42+
43+
4. **`builder.add_conditional_edges("agent_execution", should_tool, ["tools", "no_tools_warning"])`**:
44+
* **描述**: 这是 Agent 决策的关键点。`agent_execution` 节点处理完成后,根据 `should_tool` 条件函数的结果进行路由:
45+
* 如果 `should_tool` 返回 `"tools"`,则流向 `tools` 节点(表示 Agent 决定使用工具)。
46+
* 如果 `should_tool` 返回 `"no_tools_warning"`,则流向 `no_tools_warning` 节点(表示 Agent 决定不使用工具)。
47+
48+
5. **`builder.add_conditional_edges("tools", tool_result_transport, ["summarization", "agent_execution", "ask_interrupt"])`**:
49+
* **描述**: `tools` 节点执行完成后,根据 `tool_result_transport` 条件函数的结果进行路由:
50+
* 如果返回 `"summarization"`,则流向 `summarization` 节点(可能工具执行成功,需要总结)。
51+
* 如果返回 `"agent_execution"`,则流向 `agent_execution` 节点(可能工具执行后需要进一步的 Agent 决策)。
52+
* 如果返回 `"ask_interrupt"`,则流向 `ask_interrupt` 节点(可能工具执行需要用户提供更多信息)。
53+
54+
6. **`builder.add_edge("ask_interrupt", "agent_execution")`**:
55+
* **描述**: `ask_interrupt` 节点处理完成后,流回 `agent_execution` 节点,等待用户输入并继续 Agent 的执行。
56+
57+
7. **`builder.add_edge("no_tools_warning", "agent_execution")`**:
58+
* **描述**: `no_tools_warning` 节点处理完成后,流回 `agent_execution` 节点,继续 Agent 的执行。
59+
60+
8. **`builder.add_edge("summarization", "finish_interrupt")`**:
61+
* **描述**: `summarization` 节点处理完成后,流向 `finish_interrupt` 节点,可能准备结束当前流程或进行最终总结。
62+
63+
## 编译
64+
65+
最后,图通过 `builder.compile()` 方法进行编译,并指定了名称和检查点机制:
66+
67+
```python
68+
builder.compile(name="XieshuiMainAgent", checkpointer=MemorySaver())
69+
```
70+
71+
* **`name="XieshuiMainAgent"`**: 为编译后的图指定一个名称。
72+
* **`checkpointer=MemorySaver()`**: 使用 `MemorySaver` 作为检查点,这意味着 Agent 的状态将在内存中保存,以便在中断后恢复。
73+
74+
## 总结
75+
76+
XieShui Agent 的 LangGraph 图结构清晰地定义了其运行时的行为模式。通过节点和边的精心设计,Agent 能够实现复杂的决策逻辑、工具调用、状态管理和用户交互,从而提供强大的智能服务。

docs/Agent架构概述.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Agent 架构概述
2+
3+
本文档旨在概述 XieShui Agent 的核心架构。XieShui Agent 是一个基于 LangGraph 构建的智能代理,它通过定义清晰的状态、节点和边来管理复杂的对话流程和任务执行。
4+
5+
## 核心组件
6+
7+
XieShui Agent 的核心组件包括:
8+
9+
1. **LangGraph 图 (`graph.py`)**: 定义了 Agent 的整体运行流程,包括各个处理步骤(节点)以及它们之间的转换逻辑(边)。
10+
2. **Agent 状态管理 (`state.py`)**: 定义了 `MainAgentState`,用于在 Agent 运行过程中维护和传递关键信息,如对话历史、用户信息和当前 Agent 模式。
11+
3. **LLM 管理 (`llm_manager.py`)**: 负责配置和实例化不同用途的语言模型(LLM),确保 Agent 能够根据需要调用合适的模型。
12+
4. **Agent 配置 (`conf.py`)**: 提供了 Agent 的全局配置选项。
13+
14+
## 架构概览
15+
16+
XieShui Agent 的架构设计旨在实现模块化和可扩展性。通过将不同的功能封装在独立的节点中,并利用 LangGraph 的状态管理和条件路由能力,Agent 能够灵活地响应用户输入并执行复杂的任务。
17+
18+
### LangGraph 的应用
19+
20+
LangGraph 是构建 XieShui Agent 的核心框架。它允许我们以图形化的方式定义 Agent 的行为,每个节点代表一个特定的处理步骤(例如,欢迎消息、工具执行、总结),而边则定义了这些步骤之间的流转逻辑。这种设计使得 Agent 的逻辑清晰可见,易于理解和维护。
21+
22+
### 状态管理
23+
24+
`MainAgentState` 是 Agent 运行时的单一事实来源。它包含了 Agent 在整个交互过程中所需的所有数据。通过在节点之间传递和更新这个状态对象,Agent 能够保持上下文,并根据历史信息做出决策。
25+
26+
### LLM 管理
27+
28+
`LLMManager` 提供了一个统一的接口来管理和获取不同配置的 LLM 实例。这使得 Agent 能够根据任务需求(例如,摘要、工具调用、通用对话)选择最合适的 LLM,从而优化性能和成本。
29+
30+
### 配置管理
31+
32+
`Configuration` 类用于定义 Agent 的全局配置。这使得 Agent 的行为可以通过外部配置进行调整,而无需修改核心代码。
33+
34+
## 后续文档
35+
36+
在后续文档中,我们将深入探讨每个核心组件的细节:
37+
38+
* [Agent 状态管理](Agent状态管理.md)
39+
* [LLM 管理](LLM管理.md)
40+
* [Agent 图结构](Agent图结构.md)

docs/Agent状态管理.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Agent 状态管理
2+
3+
在 XieShui Agent 中,`MainAgentState` 类负责管理 Agent 在整个交互过程中的状态。它是一个基于 Pydantic `BaseModel` 定义的数据结构,确保了状态的类型安全和易于序列化。
4+
5+
## `MainAgentState` 定义
6+
7+
`MainAgentState` 定义在 [`src/main_agent/utils/state.py`](src/main_agent/utils/state.py) 中,其结构如下:
8+
9+
```python
10+
from __future__ import annotations
11+
12+
from typing import Annotated, List
13+
from pydantic import BaseModel, Field
14+
from langchain_core.messages import AnyMessage
15+
from langgraph.graph.message import add_messages
16+
17+
class MainAgentState(BaseModel):
18+
"""
19+
Agent 状态模型
20+
"""
21+
messages: Annotated[List[AnyMessage], add_messages] = Field(default=[], description="Agent 消息列表,包含交互历史,储存和传递对话内容")
22+
current_user_info: dict = Field(default={}, description="当前用户信息,包含用户的基本信息和偏好设置")
23+
agent_mode: str = Field(default="default", description="Agent 模式,指示当前的工作模式或任务类型", examples=["default", "research", "execution"])
24+
```
25+
26+
## 字段说明
27+
28+
### `messages`
29+
30+
* **类型**: `Annotated[List[AnyMessage], add_messages]`
31+
* **默认值**: `[]`
32+
* **描述**: 这是一个消息列表,用于存储 Agent 与用户之间的所有交互历史。`AnyMessage` 可以是 LangChain 提供的任何消息类型(例如 `HumanMessage``AIMessage``ToolMessage` 等)。`Annotated``add_messages` 的使用表明这个字段在 LangGraph 中具有特殊行为,每次更新时会追加新的消息而不是完全覆盖。这对于维护完整的对话上下文至关重要。
33+
34+
### `current_user_info`
35+
36+
* **类型**: `dict`
37+
* **默认值**: `{}`
38+
* **描述**: 用于存储当前用户的相关信息,例如用户的偏好设置、个人资料或其他与用户会话相关的上下文数据。这使得 Agent 能够根据用户的具体情况进行个性化响应。
39+
40+
### `agent_mode`
41+
42+
* **类型**: `str`
43+
* **默认值**: `"default"`
44+
* **描述**: 指示 Agent 当前所处的工作模式或任务类型。例如,Agent 可能有“default”(默认)、“research”(研究)或“execution”(执行)等模式。不同的模式可以触发 Agent 内部不同的行为逻辑或工具集,从而实现多功能性。
45+
46+
## 状态管理的重要性
47+
48+
`MainAgentState` 在 XieShui Agent 的运行中扮演着核心角色:
49+
50+
* **上下文维护**: 通过 `messages` 字段,Agent 能够记住之前的对话内容,从而进行连贯且有意义的交流。
51+
* **个性化响应**: `current_user_info` 允许 Agent 根据用户的特定信息调整其行为和响应。
52+
* **行为路由**: `agent_mode` 字段可以作为 LangGraph 中条件边的判断依据,引导 Agent 进入不同的处理流程。
53+
54+
通过对 `MainAgentState` 的有效管理,XieShui Agent 能够实现复杂、有状态的交互逻辑。

docs/LLM管理.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# LLM 管理
2+
3+
XieShui Agent 通过 `LLMManager` 类来统一管理和实例化不同配置的语言模型(LLM)。这种设计使得 Agent 能够根据不同的任务需求灵活地选择和使用合适的 LLM,同时方便了模型配置的集中管理。
4+
5+
## `LLMConfig`:LLM 配置模型
6+
7+
`LLMConfig` 定义了单个 LLM 实例的配置参数。它是一个基于 Pydantic `BaseModel` 的数据结构,确保了配置的类型安全。
8+
9+
`LLMConfig` 定义在 [`src/main_agent/llm_manager.py`](src/main_agent/llm_manager.py) 中,其结构如下:
10+
11+
```python
12+
from typing import Any, Dict, Optional
13+
from pathlib import Path
14+
from pydantic import BaseModel, Field
15+
from langchain_openai import ChatOpenAI
16+
import json
17+
18+
class LLMConfig(BaseModel):
19+
"""
20+
LLM 配置模型
21+
"""
22+
model_name: str = Field(default="deepseek/deepseek-chat-v3-0324", description="LLM 模型名称")
23+
temperature: float = Field(default=0.3, description="LLM 温度")
24+
base_url: str = Field(default="https://openrouter.ai/api/v1", description="LLM API Base URL")
25+
max_retries: int = Field(default=3, description="LLM 最大重试次数")
26+
max_tokens: int = Field(default=8192, description="LLM 最大 token 数")
27+
frequency_penalty: float = Field(default=0.0, description="LLM 频率惩罚")
28+
api_key_path: str = Field(default=(Path(__file__).parent / "api_key.json").as_posix(), description="API Key 文件路径")
29+
30+
def get_api_key(self) -> Optional[str]:
31+
json_text = Path(self.api_key_path).read_text(encoding="utf-8").strip()
32+
return json.loads(json_text).get(self.model_name)
33+
```
34+
35+
### 字段说明
36+
37+
* **`model_name`**: LLM 的模型名称,例如 `"deepseek/deepseek-chat-v3-0324"`
38+
* **`temperature`**: 控制模型输出的随机性。值越高,输出越随机。
39+
* **`base_url`**: LLM API 的基础 URL。
40+
* **`max_retries`**: API 请求的最大重试次数。
41+
* **`max_tokens`**: 模型生成响应的最大 token 数。
42+
* **`frequency_penalty`**: 对重复 token 的惩罚,值越高,模型越倾向于生成新的 token。
43+
* **`api_key_path`**: 存储 API Key 的 JSON 文件路径。`get_api_key` 方法会从该文件中读取对应 `model_name` 的 API Key。
44+
45+
## `LLMManager`:LLM 管理器
46+
47+
`LLMManager` 是一个单例模式的类,负责存储和提供不同配置的 LLM 实例。
48+
49+
`LLMManager` 定义在 [`src/main_agent/llm_manager.py`](src/main_agent/llm_manager.py) 中,其结构如下:
50+
51+
```python
52+
class LLMManager:
53+
"""
54+
LLM 管理器,用于管理 LLM 配置组和实例化 LLM 模型。
55+
"""
56+
def __init__(self):
57+
self._llm_configs: Dict[str, LLMConfig] = {}
58+
59+
def set_llm_configs(self, llm_configs: Dict[str, LLMConfig]):
60+
"""
61+
设置 LLM 配置组。
62+
"""
63+
self._llm_configs = llm_configs
64+
65+
def get_llm(self, config_name: str = "default", **override_params: Any) -> ChatOpenAI:
66+
"""
67+
根据配置组名称和覆盖参数获取 LLM 实例。
68+
"""
69+
if config_name not in self._llm_configs:
70+
raise ValueError(f"LLM config group '{config_name}' not found.")
71+
72+
config = self._llm_configs[config_name].model_copy(update=override_params)
73+
api_key = config.get_api_key()
74+
75+
llm = ChatOpenAI(
76+
model=config.model_name,
77+
temperature=config.temperature,
78+
base_url=config.base_url,
79+
api_key=api_key,
80+
max_retries=config.max_retries,
81+
max_tokens=config.max_tokens,
82+
frequency_penalty=config.frequency_penalty,
83+
)
84+
return llm
85+
86+
# 全局 LLM 管理器实例
87+
llm_manager = LLMManager()
88+
89+
def initialize_llm_manager(llm_configs: Dict[str, LLMConfig]):
90+
"""
91+
初始化全局 LLM 管理器实例的配置。
92+
"""
93+
llm_manager.set_llm_configs(llm_configs)
94+
```
95+
96+
### 主要方法
97+
98+
* **`set_llm_configs(self, llm_configs: Dict[str, LLMConfig])`**:
99+
* 用于设置一个 LLM 配置组,其中键是配置名称(例如 `"default"``"summarization"`),值是对应的 `LLMConfig` 实例。
100+
* 这个方法通常在 Agent 启动时调用,如 `src/main_agent/graph.py` 中所示。
101+
102+
* **`get_llm(self, config_name: str = "default", **override_params: Any) -> ChatOpenAI`**:
103+
* 根据指定的 `config_name` 获取一个 `ChatOpenAI` LLM 实例。
104+
* 允许通过 `override_params` 动态覆盖配置中的任何参数,例如在特定调用中临时调整 `temperature``max_tokens`
105+
* 如果找不到指定的配置名称,则会抛出 `ValueError`
106+
107+
### 全局实例和初始化
108+
109+
`llm_manager = LLMManager()` 创建了一个全局的 `LLMManager` 实例。
110+
`initialize_llm_manager(llm_configs: Dict[str, LLMConfig])` 函数用于在 Agent 启动时初始化这个全局实例的配置。
111+
112+
这种 LLM 管理机制使得 XieShui Agent 能够:
113+
114+
* **灵活配置**: 轻松定义和切换不同用途的 LLM 配置。
115+
* **集中管理**: 所有 LLM 相关的配置和实例化逻辑都集中在一个地方。
116+
* **动态调整**: 在运行时根据需要覆盖 LLM 参数,以适应不同的任务场景。

0 commit comments

Comments
 (0)