228 lines
9.0 KiB
Markdown
228 lines
9.0 KiB
Markdown
# 多智能体模式总体架构
|
||
|
||
> 文档状态:设计草案
|
||
> 适用范围:宿主机模式(host mode),不覆盖 docker/web 模式
|
||
> 隔离原则:与现有对话系统完全隔离,复用底层能力但上层独立
|
||
|
||
---
|
||
|
||
## 1. 设计目标
|
||
|
||
在 Astrion 中引入一个实验性的「多智能体模式」:
|
||
|
||
- 主智能体固定扮演 **Team Leader**,负责任务拆解、调度、协调、回答子智能体提问。
|
||
- 支持预置角色与自定义角色,每个角色可以有多个实例(`RoleName_1`、`RoleName_2`)。
|
||
- 子智能体之间、子智能体与主智能体之间可以双向通信。
|
||
- 所有通信遵循统一的消息格式与路由规则。
|
||
- 与现有单智能体模式完全隔离,不影响现有代码与用户体验。
|
||
|
||
---
|
||
|
||
## 2. 核心设计原则
|
||
|
||
### 2.1 完全隔离
|
||
|
||
- 数据目录隔离:`~/.astrion/astrion/host/mutiagents/`
|
||
- 页面隔离:新页面 `/multiagent/new`
|
||
- 入口隔离:登录页单独按钮「多智能体模式 beta」
|
||
- 代码隔离:所有新增代码放在 `modules/multi_agent/`、`docs/multi_agent_mode/`、`static/src/views/MultiAgentView.vue` 等独立位置
|
||
- 现有文件如需改造,优先复制一份再改,不直接修改
|
||
|
||
### 2.2 能复用则复用
|
||
|
||
- 模型调用:复用 `DeepSeekClient`
|
||
- 工具执行链路:复用 `WebTerminal.handle_tool_call` 的底层执行能力
|
||
- 文件/终端/搜索等工具:复用现有工具实现
|
||
- 对话持久化格式:复用 `ConversationManager` 的存储格式
|
||
- 沙箱/权限机制:复用现有 `evaluate_tool_permission` 与宿主机沙箱
|
||
|
||
### 2.3 子智能体即完整对话
|
||
|
||
每个子智能体是一个独立的、完整的对话上下文:
|
||
|
||
- 有自己的 `messages` 列表
|
||
- 有自己的系统提示词
|
||
- 有自己的工具列表
|
||
- 自然输出 assistant 消息
|
||
- 支持被主智能体/其他子智能体在运行中插入消息引导
|
||
- 任务结束 = 本轮自然停止输出,但上下文保留
|
||
|
||
---
|
||
|
||
## 3. 角色与实例
|
||
|
||
### 3.1 角色(Role)
|
||
|
||
角色由 Markdown + YAML Frontmatter 定义,存储在:
|
||
|
||
```
|
||
~/.astrion/astrion/host/mutiagents/agents/<role_id>.md
|
||
```
|
||
|
||
示例 `ui-operator.md`:
|
||
|
||
```markdown
|
||
---
|
||
id: ui-operator
|
||
name: UI Operator
|
||
description: 负责前端设计、UI 还原、配色方案
|
||
model: qwen3-max
|
||
thinking_mode: fast
|
||
---
|
||
|
||
你是团队的前端设计专家。你擅长:
|
||
- 根据需求设计 UI 界面
|
||
- 制定配色方案
|
||
- 输出设计文档和前端代码
|
||
|
||
工作风格:
|
||
- 先分析需求,再给出设计方案
|
||
- 输出简洁明确的设计说明
|
||
```
|
||
|
||
### 3.2 实例(Agent)
|
||
|
||
- `role_id`:角色类型,如 `ui-operator`
|
||
- `agent_id`:这个角色的第几个实例,从 1 开始
|
||
- 显示名:`{Role Name}_{agent_id}`,如 `UI Operator_1`、`Full-Stack Engineer_1`
|
||
- 同一个 `role_id` 可以有多个实例:UI Operator_1、UI Operator_2
|
||
- 不同 `role_id` 的实例序号独立:Full-Stack Engineer_1 与 UI Operator_1 可以同时存在
|
||
- 主智能体固定显示名为 `Team Leader`,没有 agent_id
|
||
|
||
---
|
||
|
||
## 4. 总体架构图
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 用户(Web 前端) │
|
||
│ /multiagent/new 页面 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ MultiAgentTerminal │
|
||
│ (基于 MainTerminal 复制改造) │
|
||
│ - 工具列表:主工具 + 多智能体专用工具 │
|
||
│ - 子智能体管理器:MultiAgentSubAgentManager │
|
||
│ - 对话存储:指向 mutiagents/conversations/ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌─────────────────┼─────────────────┐
|
||
▼ ▼ ▼
|
||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||
│ Agent 1 │ │ Agent 2 │ │ Agent 3 │
|
||
│UIOperator│ │ Full- │ │ Code │
|
||
│ 1 │ │ Stack │ │ Reviewer │
|
||
│ │ │Engineer1│ │ 1 │
|
||
└──────────┘ └──────────┘ └──────────┘
|
||
│ │ │
|
||
└─────────────────┴─────────────────┘
|
||
│
|
||
▼
|
||
┌───────────────────────────────┐
|
||
│ MessageRouter │
|
||
│ 根据接收方状态决定: │
|
||
│ - inline 插入工具结果后 │
|
||
│ - 空闲时作为 user 消息触发新任务│
|
||
└───────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 主智能体职责
|
||
|
||
主智能体 = Team Leader,其系统提示词中明确:
|
||
|
||
- 除非任务极其简单或明确不需要,否则主动拆解任务并调用子智能体。
|
||
- 为每个子任务选择最合适的角色(role_id)。
|
||
- 子智能体可以向你提问,你必须及时通过 `answer_sub_agent_question` 回答。
|
||
- 子智能体之间可以互相沟通,你负责监督整体进度。
|
||
- 如果子智能体的中间输出需要干预,使用 `send_message_to_sub_agent` 引导。
|
||
|
||
---
|
||
|
||
## 6. 子智能体职责
|
||
|
||
子智能体系统提示词由两部分组成:
|
||
|
||
1. **基础 prompt**:通用团队规则
|
||
2. **自定义 prompt**:角色专属设定
|
||
|
||
基础 prompt 中明确:
|
||
|
||
- 你是智能体集群团队的一员。
|
||
- 不要频繁输出内容,不重要内容会污染主智能体上下文。
|
||
- 只汇报关键步骤。
|
||
- 任务完成后给出详细结论。
|
||
- 需要主智能体决策时,使用 `ask_master`。
|
||
- 需要与其他子智能体沟通时,使用 `ask_other_agent` / `answer_other_agent`。
|
||
- 如果向其他子智能体提问,必须同时直接向主智能体输出汇报。
|
||
|
||
---
|
||
|
||
## 7. 与现有系统的边界
|
||
|
||
| 现有系统 | 多智能体模式处理方式 |
|
||
|---------|---------------------|
|
||
| 现有对话页面 | 不改动,新增 `/multiagent/new` |
|
||
| 现有 `MainTerminal` | 不改动,复制为 `MultiAgentTerminal` |
|
||
| 现有 `SubAgentManager` | 不改动,继承创建 `MultiAgentSubAgentManager` |
|
||
| 现有 `SubAgentTask` | 不改动,继承创建 `MultiAgentSubAgentTask` |
|
||
| 现有 `ConversationManager` | 不改动,多智能体模式用自己的存储目录 |
|
||
| 现有后台通知池机制 | 参考其设计,多智能体模式实现自己的消息路由 |
|
||
| 现有工具执行链路 | 复用 `execute_tool_for_sub_agent` |
|
||
| 现有沙箱/权限 | 复用,不额外限制子智能体工具参数 |
|
||
|
||
---
|
||
|
||
## 8. 入口与数据目录
|
||
|
||
### 8.1 入口
|
||
|
||
登录页面增加按钮:「多智能体模式 beta」。
|
||
|
||
点击后进入 `/multiagent/new` 页面,加载 `MultiAgentTerminal`。
|
||
|
||
### 8.2 数据目录
|
||
|
||
```
|
||
~/.astrion/astrion/host/mutiagents/
|
||
├── agents/ # 角色定义
|
||
├── conversations/ # 多智能体会话
|
||
│ └── <conv_id>/
|
||
│ ├── metadata.json
|
||
│ ├── messages.json # Team Leader 对话
|
||
│ └── agents/
|
||
│ └── <agent_id>/
|
||
│ ├── metadata.json
|
||
│ └── messages.json # 子智能体完整对话记录
|
||
└── state.json # 全局状态
|
||
```
|
||
|
||
子智能体对话记录的保存精度、时机、格式与主智能体对话记录一致。
|
||
|
||
---
|
||
|
||
## 9. 实现顺序(非严格 phase)
|
||
|
||
1. 创建独立目录与数据存储结构
|
||
2. 实现角色配置加载与预置角色
|
||
3. 实现 `MultiAgentSubAgentTask` / `MultiAgentSubAgentManager`
|
||
4. 实现 `MultiAgentTerminal` 与多智能体工具定义
|
||
5. 实现消息路由(inline / idle / 通知池)
|
||
6. 实现前端 `/multiagent/new` 页面
|
||
7. 登录页加入口按钮
|
||
8. 联调测试
|
||
|
||
---
|
||
|
||
## 10. 相关文档
|
||
|
||
- `02_message_protocol.md`:统一消息格式
|
||
- `03_tool_definitions.md`:工具定义
|
||
- `04_message_routing.md`:消息路由机制
|
||
- `05_data_model.md`:数据模型
|
||
- `06_implementation_plan.md`:实现细节
|
||
- `07_existing_code_analysis.md`:现有代码分析
|