# 多智能体模式：现有代码分析

> 本文档梳理实现多智能体模式需要理解的现有代码，为复制改造提供依据。

---

## 1. 子智能体实现

### 1.1 核心文件

```
modules/sub_agent/
├── __init__.py
├── manager.py          # SubAgentManager
├── task.py             # SubAgentTask
├── toolkit.py          # 工具定义
├── prompts.py          # 提示词
├── state.py            # 状态管理
├── stats.py            # 统计
├── creation.py         # 创建参数
└── tools.py            # 本地工具实现
```

### 1.2 SubAgentManager（manager.py）

- 在主进程内以独立事件循环运行子智能体协程
- `create_sub_agent()` 创建并启动任务
- `wait_for_completion()` 阻塞等待完成
- `terminate_sub_agent()` 强制终止
- `poll_updates()` 检查已完成任务
- `execute_tool_for_sub_agent()` 代理工具执行，复用主进程链路
- `tasks` 字典保存所有任务状态

多智能体模式可继承点：
- 创建 `MultiAgentSubAgentManager`，重写 `create_sub_agent` 以创建 `MultiAgentSubAgentTask`
- 扩展任务记录字段：`role_id`、`display_name`、`pending_messages`、`pending_tool_calls`
- 扩展查询接口：`list_active_sub_agents()`、`get_sub_agent_status()`

### 1.3 SubAgentTask（task.py）

- `_run_loop()`：LLM 主循环，最多 50 轮
- `_call_model()`：流式调用模型
- `_execute_tool()`：通过 manager 执行工具
- `_finalize_task()`：任务结束时保存 output.json、stats.json、conversation.json
- `FINISH_TOOL`：必须调用 finish_task 才结束

多智能体模式改造点：
- 移除 `FINISH_TOOL` 依赖，自然结束输出即任务完成
- 在 `_run_loop` 中每轮模型调用前消费 `pending_messages`
- 捕获 assistant 输出并转发到主智能体对话
- 新增 `ask_master`、`ask_other_agent`、`answer_other_agent` 工具处理
- 维护 `pending_tool_calls`，支持阻塞等待回答

### 1.4 工具定义（toolkit.py）

现有 8 个工具：
- `read_file`
- `write_file`
- `edit_file`
- `run_command`
- `web_search`
- `extract_webpage`
- `search_workspace`
- `read_mediafile`

多智能体模式可复用这些工具定义，新增通信工具。

### 1.5 提示词（prompts.py）

- `build_user_message()`：给子智能体的任务消息
- `build_system_prompt()`：子智能体系统提示词

多智能体模式需要：
- 新的 `build_system_prompt()`，包含团队规则
- 新的 `build_user_message()`，使用统一消息格式
- 角色 prompt 拼接函数

---

## 2. 后台任务通知池机制

### 2.1 核心文件

- `server/chat_flow_task_support.py`
- `server/chat_flow_task_main.py`
- `server/chat_flow_tool_loop.py`

### 2.2 inject_runtime_user_message

位置：`server/chat_flow_task_support.py`

功能：运行期/空闲期统一向对话插入一条 user 消息。

关键参数：
- `web_terminal`：终端实例
- `messages`：当前运行中的消息列表（inline 时用）
- `text`：消息文本
- `source`：消息来源，如 `sub_agent`
- `inline`：True 表示运行期插入，不触发新任务
- `persist`：是否持久化到对话历史

多智能体模式参考点：
- 子智能体输出转发到主智能体时，使用类似机制
- 但消息格式改为统一 XML 格式，不使用 `[系统通知|sub_agent]` 前缀

### 2.3 process_sub_agent_updates

位置：`server/chat_flow_task_support.py`

功能：轮询子智能体完成状态，把结果插入当前对话上下文。

两种模式：
- `inline=True`：运行期间，插入 `messages` 不触发新任务
- `inline=False`：空闲期间，触发后续任务

多智能体模式参考点：
- 子智能体自然输出捕获后，可以 inline 插入主智能体 `messages`
- 子智能体空闲时收到的消息，作为 user 消息触发新任务

### 2.4 _collect_pending_completion_notices

位置：`server/chat_flow_task_main.py`

功能：从子智能体和后台命令两路统一取出所有待通知项，按时间排序，一次性处理。

关键设计：
- 取出时即就地标记 `notified`，防止重复消费
- 返回多条通知时，前 N-1 条作为前置通知，最后一条触发新任务

多智能体模式参考点：
- 每个子智能体维护自己的待处理消息队列
- 消费时批量取出，避免多次触发新任务
- 使用唯一 id 标记已消费

### 2.5 poll_completion_notifications

位置：`server/chat_flow_task_main.py`

功能：统一轮询器，单工作区只 spawn 一个，避免并发冲突。

多智能体模式参考点：
- 多智能体模式也需要一个类似的通知/消息处理循环
- 但消息源更多（Team Leader → Agent、Agent → Agent、Agent → Team Leader）

---

## 3. 主智能体工具调用链路

### 3.1 工具定义

位置：`core/main_terminal_parts/tools_definition/agent_tools.py`

现有主智能体子智能体工具：
- `create_sub_agent`
- `close_sub_agent`
- `terminate_sub_agent`
- `get_sub_agent_status`

多智能体模式需要移除这些，新增自己的工具定义。

### 3.2 工具执行

位置：`core/main_terminal_parts/tools_execution.py` 中 `handle_tool_call`

- 参数预检查
- 权限检查
- 根据 tool_name 分发到具体处理函数
- 返回 JSON 字符串

多智能体模式参考点：
- `MultiAgentTerminal.handle_tool_call` 中增加多智能体工具的分支
- 子智能体工具处理函数放在 `modules/multi_agent/tools/tool_handlers.py`

### 3.3 WebTerminal 广播

位置：`core/web_terminal.py`

- `handle_tool_call()` 覆盖父类，广播 `tool_execution_start` / `tool_status` / `tool_execution_complete`
- `broadcast()` 发送 WebSocket 事件

多智能体模式参考点：
- `MultiAgentTerminal` 可继承 `WebTerminal` 或 `MainTerminal`
- 保留广播能力

---

## 4. 对话上下文管理

### 4.1 ContextManager

位置：`utils/context_manager/`

- `ConversationMixin.start_new_conversation()`：创建新对话
- `ConversationMixin.load_conversation_by_id()`：加载对话
- `ConversationMixin.save_current_conversation()`：保存当前对话

多智能体模式参考点：
- 创建 `MultiAgentContextManager` 或直接用 `MultiAgentConversationStore`
- 保存格式与现有 `messages.json` 一致

### 4.2 ConversationManager

位置：`utils/conversation_manager/`

- `crud_mixin.py`：`create_conversation`、`save_conversation`、`load_conversation`
- `path_mixin.py`：文件路径管理
- `index_mixin.py`：索引管理

多智能体模式参考点：
- 复制 `ConversationManager` 的实现到 `MultiAgentConversationStore`
- 修改数据目录为 `~/.astrion/astrion/host/mutiagents/conversations/`

---

## 5. Skill 归档机制

### 5.1 核心文件

`modules/skills_manager.py`

### 5.2 关键函数

- `validate_skill_directory()`：验证 skill 目录
- `archive_skill_directory()`：移动 skill 到归档目录
- `_parse_frontmatter()`：解析 YAML Frontmatter
- `_scan_skills_catalog()`：扫描 skill 目录

多智能体模式参考点：
- 角色配置使用类似的 Frontmatter 格式
- 角色归档目录：`~/.astrion/astrion/host/mutiagents/agents/`
- 可以复制 `_parse_frontmatter`、`_scan_skills_catalog` 的实现到 `agent_store.py`

---

## 6. 前端消息渲染

### 6.1 现有机制

- `server/chat_flow_task_support.py` 中 `inject_runtime_user_message` 发送 `user_message` 事件
- 前端 `messaging.ts` 处理 `user_message` 事件
- 根据 `message_source`、`visibility`、`starts_work` 等 metadata 渲染

### 6.2 多智能体模式改造点

- 多智能体消息也发送 `user_message` 事件
- 前端根据消息内容中的 XML 解析出角色、类型、内容
- 渲染为特殊气泡，不显示 XML 标签

---

## 7. 关键接口总结

| 能力 | 现有实现位置 | 多智能体模式实现位置 |
|------|------------|-------------------|
| 子智能体创建/管理 | `modules/sub_agent/manager.py` | `modules/multi_agent/sub_agent_manager.py` |
| 子智能体运行循环 | `modules/sub_agent/task.py` | `modules/multi_agent/sub_agent_task.py` |
| 子智能体工具 | `modules/sub_agent/toolkit.py` | `modules/multi_agent/tools/agent_tools.py` |
| 子智能体提示词 | `modules/sub_agent/prompts.py` | `modules/multi_agent/prompts.py` |
| 主智能体工具定义 | `core/main_terminal_parts/tools_definition/agent_tools.py` | `modules/multi_agent/tools/master_tools.py` |
| 主智能体工具执行 | `core/main_terminal_parts/tools_execution.py` | `modules/multi_agent/terminal.py` |
| 运行时消息注入 | `server/chat_flow_task_support.py` | `modules/multi_agent/message_router.py` |
| 通知池轮询 | `server/chat_flow_task_main.py` | `modules/multi_agent/message_router.py` |
| 对话存储 | `utils/conversation_manager/` | `modules/multi_agent/conversation_store.py` |
| 角色归档 | `modules/skills_manager.py` | `modules/multi_agent/agent_store.py` |
| 前端页面 | `static/src/views/ChatView.vue` | `static/src/views/MultiAgentView.vue` |

---

## 8. 实现注意事项

1. **不要修改现有文件**：所有改造在 `modules/multi_agent/` 中完成，通过继承或复制实现。
2. **状态同步**：子智能体状态变更时需要同步更新 `metadata.json`。
3. **消息不丢失**：待处理消息队列需要持久化。
4. **上下文隔离**：每个子智能体独立 messages，不要互相污染。
5. **模型工具列表**：每轮模型调用前需要重新构造工具列表，确保多智能体通信工具可用。
6. **自然结束检测**：子智能体某轮没有工具调用且 assistant 输出为空时，认为本轮结束。
7. **阻塞问答超时**：`ask_master` / `ask_other_agent` 需要设置合理超时，避免永久阻塞。
