Skip to content

OpenCode 实现原理 #135

@Pines-Cheng

Description

@Pines-Cheng

Claude Code 多 Agent 架构和上下文工程的特点:

  1. 多 Agent 架构的关键词:主从两层架构,子 Agent 按需动态创建,Agent 生命周期管理,Agent 事件通信机制,无状态隔离架构,静态工具过滤机制、子 Agent 可并发执行,用户可自定义子 Agent。
  2. 上下文工程关键词:上下文隔离机制,最小必要信息,单向最终报告机制,三层存储架构,上下文窗口分层,Token 预算管理,自动压缩机制,8 段式结构化压缩 Prompt,智能文件(上下文)恢复机制,Token 缓存机制。

开源项目 OpenCode:https://github.com/sst/opencode ,简直就是 Claude Code 的开源实现版。
上面的那些关键词,比如:子 Agent 按需动态创建、无状态隔离架构、子 Agent 并发执行、用户自定义子 Agent、上下文隔离机制、单向最终报告机制等等等,它全部都实现且开源了。

多 Agent 架构核心设计

1. Agent 类型定义

系统定义了三种不同模式的 agent:

  • primary: 主要 agent(如 buildplan
  • subagent: 子 agent(如 general
  • all: 可以在任何模式下使用的 agent

2. 内置 Agent 类型

系统预定义了几个核心 agent:

  • general: 通用 agent,用于复杂问题研究、代码搜索和多步骤任务执行
  • build: 构建相关的主要 agent
  • plan: 规划相关的主要 agent,权限相对受限(编辑和 bash 权限为 "ask")

3. Task Tool 实现机制

核心流程:

  1. Agent 发现: 通过 Agent.list() 获取所有非主要模式的 agent
  2. 动态描述生成: 将可用的 agent 列表动态插入到工具描述中
  3. 会话创建: 为每个子任务创建独立的会话(Session)
  4. 消息传递: 通过 Bus 系统进行实时消息传递和状态更新
  5. 工具配置: 每个 agent 都有自己的工具权限配置

关键实现细节:

// 获取指定类型的 agent
const agent = await Agent.get(params.subagent_type)

// 创建独立会话
const session = await Session.create(ctx.sessionID, params.description + ` (@${agent.name} subagent)`)

// 配置 agent 特定的工具权限
tools: {
  todowrite: false,
  todoread: false, 
  task: false,  // 防止递归调用
  ...agent.tools,  // agent 特定工具
}

4. 权限管理系统

每个 agent 都有细粒度的权限控制:

  • edit: 文件编辑权限
  • bash: 命令执行权限(可按命令模式配置)
  • webfetch: 网络请求权限

5. 消息和状态管理

  • 使用 Bus 系统 进行 agent 间的消息传递
  • 通过 MessageV2.Event.PartUpdated 事件实时更新任务状态
  • 支持任务中止机制

6. 配置化扩展

系统支持通过配置文件动态添加自定义 agent,包括:

  • 自定义模型配置
  • 专用系统提示词
  • 特定工具权限
  • 温度和 top_p 参数调整

架构优势

  1. 模块化: 每个 agent 专注于特定领域的任务
  2. 隔离性: 独立的会话确保任务间不互相干扰
  3. 可扩展性: 支持配置化添加新的 agent 类型
  4. 权限控制: 细粒度的权限管理确保安全性
  5. 实时通信: Bus 系统支持 agent 间的实时状态同步

这种架构实现了一个灵活、安全且可扩展的多 agent 系统,能够根据不同任务类型自动选择和调度合适的专业化 agent。

Sub-issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions