agent-Specialization/docs/multi_agent_mode/07_existing_code_analysis.md

9.5 KiB
Raw Blame History

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

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


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 SubAgentManagermanager.py

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

多智能体模式可继承点:

  • 创建 MultiAgentSubAgentManager,重写 create_sub_agent 以创建 MultiAgentSubAgentTask
  • 扩展任务记录字段:role_iddisplay_namepending_messagespending_tool_calls
  • 扩展查询接口:list_active_sub_agents()get_sub_agent_status()

1.3 SubAgentTasktask.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_masterask_other_agentanswer_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
  • inlineTrue 表示运行期插入,不触发新任务
  • 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.pyhandle_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 可继承 WebTerminalMainTerminal
  • 保留广播能力

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.pycreate_conversationsave_conversationload_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.pyinject_runtime_user_message 发送 user_message 事件
  • 前端 messaging.ts 处理 user_message 事件
  • 根据 message_sourcevisibilitystarts_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 需要设置合理超时,避免永久阻塞。