Max Team — 技术方案

多 Agent 协作系统技术设计方案(评审版)
v0.1 Go + Claude API 2026-05-21

01背景与目标

要解决什么问题

日常开发中,一个完整任务往往涉及多个环节:理解需求、设计方案、写代码、跑测试、查日志。这些环节需要不同的专业能力和工具权限。单一 AI 助手要么权限过大(安全风险),要么能力面太广(每个方向都不够深)。

目标

02核心概念

理解整个系统只需要抓住 5 个概念:

Agent(角色)

一个拥有特定身份、工具集和 LLM 后端的自治单元。每个 Agent 有自己的 system prompt 定义人设,有自己的工具白名单定义能力边界。

Task(任务)

一件需要完成的具体工作。有明确的负责人(哪个 Agent)、输入(描述 + 上游产出物)、输出(结果 + 产出物)。多个 Task 通过依赖关系组成 DAG。

Artifact(产出物)

Task 完成后的交付物。比如 Ada 产出 design_doc,Leo 产出 code_diff,Ray 产出 test_report。上游的 Artifact 自动注入下游 Task 的上下文。

Tool(工具)

Agent 可以使用的能力。分为内置工具(读写文件、执行命令)和 MCP 工具(gitnexus、cooper 等外部服务)。工具白名单 = 权限边界

Skill(技能)

由 Prompt 模板 + 工具子集 + I/O 契约组成的可复用工作流。比如"代码审查"skill 封装了 diff → 读文件 → 分析 → 输出报告的完整流程。Agent 激活 skill 后,按 skill 的专用 prompt 和工具集执行,产出结构化结果。

Approval Gate(审批门控)

暂停执行、等待用户确认的检查点。出现在两个时机:执行前的方案确认、执行中的危险操作确认。确保人始终掌握最终决策权。

03系统全景

You 自然语言对话 Max — 私人助理 "你只需要跟我说,我来安排团队" 理解需求 拆解任务 方案确认 进度汇报 Claude Sonnet · 无文件操作权限 审批门控 任务调度器 + 消息总线 DAG 拓扑排序 · 并行派发 · 自动注入上游产出物 Leo — 码农 写代码 · 改 Bug · 重构 读写文件 · Shell(受限) · Git MCP: gitnexus Claude Opus Ada — 架构师 方案设计 · 架构评审 只读文件 · 代码搜索 MCP: gitnexus + cooper Claude Opus Ray — 测试 写测试 · 跑测试 · 覆盖率 写文件(仅 *_test.go) go test · 覆盖率报告 Claude Sonnet Sam — 运维 日志查询 · 监控排查 查日志 · 查指标 MCP: grafana Claude Haiku Skill 层(可复用工作流:Prompt 模板 + 工具子集 + I/O 契约) code_review bug_triage test_analysis 自定义 skill... 基础设施层(非 Agent 工具,Go 代码直接调用) 审计日志 LLM Router MCP 连接管理 配置加载

整个系统可以用一句话概括:用户只和 Max 对话,Max 把活拆给专人干,干完了汇总给你

04关键设计决策

决策 1:为什么星型拓扑,不让 Worker 直接通信?

决策:所有 Worker 只和 Max 通信,不互相对话。

考虑过的替代方案:Mesh 网络(Worker 之间自由通信)

选择星型的原因
  • 信息可控:Max 作为中心节点,可以裁剪上下文——Ray 不需要知道 Ada 推导方案的完整过程,只需要拿到最终的接口定义
  • 易审计:所有信息都经过 Max,一个地方就能看到完整的协作过程
  • 避免混乱:N 个 Agent 互相对话会产生 N*(N-1) 条通信链路,信息容易发散
代价:Max 是瓶颈。如果 Max 挂了或响应慢,整个团队停摆。
缓解:Max 用轻量模型(Sonnet),只做调度不做重活。

决策 2:为什么用 DAG 而不是简单队列?

决策:任务按 DAG(有向无环图)组织,不是线性队列。

原因:真实工作场景中,任务之间有复杂的依赖关系和并行机会:
  • Bug 排查:Ops 查日志 和 Ada 看代码 可以并行
  • 新功能:必须 Ada 先设计 → Leo 再实现 → Ray 最后测试(串行
  • 重构:Leo 改模块A、B、C 可以并行,最后 Ray 做集成测试
队列做不到这种灵活性。DAG 让调度器自动识别哪些任务可以并行,哪些必须等待。

决策 3:为什么工具即权限,而不是单独的权限系统?

决策:Agent 的能力边界完全由其工具白名单决定,没有额外的权限层。

原因
  • 简单有效:LLM 只能调用注册给它的工具,没有 write_file 就不可能写文件,从架构上杜绝越权
  • 无绕过风险:不像传统 RBAC 可能被绕过,工具不存在就是不存在
  • 易配置:在 YAML 里增减工具名即可调整权限
补充约束:部分工具自带细粒度控制(如 shell 命令白名单、文件写入路径限制)。

决策 4:为什么不同 Agent 用不同模型?

决策:按任务复杂度匹配模型——Opus 给重活,Haiku 给轻活。

Agent模型理由
MaxSonnet调度逻辑不复杂,但需要稳定可靠
LeoOpus写代码是最复杂的任务,需要最强推理
AdaOpus架构设计需要深度分析和全局视野
RaySonnet写测试相对模式化,Sonnet 够用
SamHaiku日志查询是结构化操作,不需要强推理
效果:成本和质量的平衡。不是所有场景都需要最强模型。

决策 5:为什么引入 Skill 层?

决策:在 Tool 之上增加 Skill 层——可复用的工作流模板,由 Prompt 模板 + 工具子集 + I/O 契约组成。

考虑过的替代方案
  • 纯 Tool 编排:完全靠 Agent 的 system prompt 驱动 LLM 自行组合 tool 调用。简单但不稳定——同一类任务每次执行路径可能不同,质量波动大。
  • 硬编码工作流:在 Go 代码中写死步骤(step1 → step2 → step3)。确定性高但完全不灵活,加新流程就得改代码。
Skill 的设计
  • Prompt 模板:针对特定任务的专用 prompt(如代码审查的关注点、输出格式),比通用 system prompt 产出质量更高
  • 工具子集:Skill 声明它需要哪些 tool,Agent 必须拥有这些 tool 才能激活该 skill
  • I/O 契约:明确输入参数和输出结构,让上下游 skill/task 可以可靠对接
  • YAML 定义:新增 skill 只需写配置,不改 Go 代码
例子
skills:
  - name: code_review
    description: "审查代码变更,输出结构化审查报告"
    prompt: |
      你是一个严格的代码审查者。检查以下变更:
      - 逻辑正确性
      - 边界条件
      - 安全隐患(注入、未校验输入)
      - 代码风格一致性
      输出 JSON 格式的审查报告。
    required_tools: [read_file, git_diff, search_code]
    input:
      - name: diff
        type: string
        description: "待审查的代码变更"
    output:
      type: review_report
      fields: [issues, summary, verdict]
代价:多一层抽象,增加理解成本。
缓解:Skill 是可选的——简单任务可以直接用 tool,只有重复出现的工作流才值得封装为 skill。

决策 6:Tool 与基础设施的分层

决策:系统中的 I/O 分为两层——Tool 层(LLM 可控)和 基础设施层(Go 代码直接调用)。

为什么
  • Tool 是暴露给 LLM 的能力,受白名单控制——这是权限边界
  • 基础设施(审计日志、消息总线、MCP 连接)是程序自身的运行支撑——不受 Tool 权限约束
例子:Max 没有 write_file 工具(LLM 无法写任意文件),但 Max 的 Go 代码可以通过 Audit Logger 写日志。
这不是漏洞,而是设计:权限控制的是 LLM 的决策能力,不是宿主程序的运行能力。

05数据流与状态流转

5.1 任务状态机

Created Planned Approved Dispatched Running Done Failed 重试(max 2 次) Max 拆解 纳入 DAG 用户确认 派发给 Agent Agent 执行中

5.2 Artifact 流转

上游任务的产出物自动注入下游任务的上下文,形成信息链:

Ada: 设计 产出: design_doc (接口定义 + 数据模型) 注入 Leo: 写代码 输入: design_doc 产出: code_diff 注入 Ray: 测试 输入: code_diff 产出: test_report 汇总 Max: 汇总 输出给用户

06模块交互流程

场景:用户提出一个新功能需求

You Max 调度器 Ada Leo 1. "加个批量导入" 2. LLM 分析需求 拆解为 3 个 Task 3. 提交 DAG 4. "以下是执行方案,确认?" 5. "OK 执行吧" 6. 派发 T1 给 Ada 7. Ada 设计方案 读代码 + 分析 8. 完成,返回 design_doc 9. 派发 T2 给 Leo(附带 design_doc) 10. Leo 写代码 读写文件 + 测试 11. 完成,返回 code_diff 12. 所有任务完成 13. "已完成,以下是汇总..."

注:为简化图示,省略了 Ray(测试)环节。实际流程中 Leo 完成后会触发 Ray 测试,测试通过后再汇总。

07安全模型

安全设计围绕三道防线:

第一道:工具白名单

每个 Agent 只能调用配置中声明的工具。LLM 想调用未注册的工具会被 Runtime 直接拒绝。

  • Ada 没有 write_file → 不可能修改代码
  • Sam 没有 read_file → 不可能看源码
  • Max 没有任何文件/shell 工具

第二道:工具内部约束

工具本身还有细粒度控制:

  • Shell 命令白名单:只允许 go build、go test、git diff 等
  • 文件路径沙箱:不能访问项目目录之外
  • 写入黑名单:.env、credentials 等敏感文件禁止写入
  • Ray 写入白名单:只能写 *_test.go

第三道:审批门控

即使 Agent 有权限,以下操作仍需用户确认:

  • 执行前的整体方案
  • git push / 部署操作
  • 任务失败后的处理决策

08可扩展性设计

加一个新 Agent 需要什么?

只需要在 agents.yaml 中添加一段配置:

  - name: doc           # 名字
    role: doc_writer    # 角色
    model: claude-sonnet-4-6
    system_prompt: |    # 人设
      你是 Doc,一个技术文档工程师...
    tools:              # 工具白名单
      - read_file
      - write_file
    constraints:        # 约束
      write_patterns: ["*.md"]
      timeout: 120s

不需要改任何 Go 代码。框架自动根据配置创建 Agent 实例、注册工具、接入消息总线。

加一个新 Skill 需要什么?

skills.yaml 中添加一段配置:

  - name: bug_triage
    description: "Bug 分诊:定位根因并输出修复建议"
    prompt: |
      分析以下 Bug 报告,结合代码和日志:
      1. 复现路径
      2. 根因定位
      3. 修复建议(含代码片段)
      输出结构化 JSON。
    required_tools: [read_file, search_code, query_log]
    input:
      - name: bug_description
        type: string
      - name: error_log
        type: string
        optional: true
    output:
      type: triage_report
      fields: [root_cause, fix_suggestion, severity]
    timeout: 180s

框架自动完成:验证 Agent 是否具备所需 tool → 注入 skill prompt → 执行 → 校验输出结构。Agent 不满足 required_tools 时,该 skill 不可用。

加一个新工具需要什么?

  1. 实现 Tool 接口(Name / Description / Parameters / Execute)
  2. 在 Registry 中注册
  3. 在需要的 Agent 配置中添加工具名

接入新的外部服务(MCP)

只需在 Agent 配置的 mcp_servers 中添加 MCP Server 定义。框架自动启动进程、完成握手、发现工具。

09风险与 Trade-off

风险影响缓解措施
Max 是单点瓶颈
所有通信经过 Max
Max 响应慢时整个团队停摆 Max 用 Sonnet(快+稳);只做调度不做重活;未来可加副手
LLM 幻觉导致错误操作
比如 Leo 写了错误代码
代码质量问题 Ray 自动跑测试兜底;危险操作有审批门控;shell 命令白名单
上下文窗口溢出
复杂任务需要大量上下文
Agent 丢失关键信息 Max 负责裁剪上下文——只传递 Artifact,不传递完整对话历史
任务拆解质量
Max 拆解不准确
后续执行方向偏差 方案确认环节由用户把关;Max 用结构化 prompt 引导输出
成本控制
多 Agent 意味着多次 LLM 调用
API 费用高于单 Agent 审计日志记录 token 用量;Haiku 用于轻量任务;未来加缓存
MCP Server 不稳定
外部进程崩溃
Agent 失去部分工具 自动重连 + 降级(移除不可用工具,继续执行)

10分阶段落地计划

Phase 1 — MVP(2 周)

跑通核心链路:用户 → Max → Leo → 用户

  • Runtime + MessageBus + Scheduler
  • Max(调度)+ Leo(写代码)
  • 基础工具:read/write_file + run_shell + git
  • CLI 交互
  • Approval Gate(方案确认)

交付标准:能对 Max 说"给 XX 加个功能",Leo 自动写代码。

Phase 2 — 完善(3 周)

补齐团队成员、外部集成和 Skill 层

  • Ada(架构师)+ Ray(测试)+ Sam(运维)
  • MCP 集成(gitnexus / cooper / grafana)
  • Skill 引擎:YAML 加载、prompt 注入、I/O 校验
  • 内置 Skill:code_review / bug_triage / test_coverage_analysis
  • 审计日志
  • DAG 可视化(终端输出)
  • 任务重试与错误恢复

Phase 3 — 增强(持续)

  • Web UI
  • 多项目支持
  • Agent 记忆(跨会话持久化)
  • 自定义 Agent(纯 YAML 配置)
  • 成本监控仪表盘
  • 对话历史回放

未来可能

  • 多模型支持(Gemini、GPT 混用)
  • Agent 自学习(从历史任务中提取经验)
  • 团队模板(预设不同场景的团队组合)
  • 协作看板(类 Trello 的可视化管理)