Skip to content

OpenCode 工具系统

核心文件

text
packages/core/src/tool/
├── registry.ts    # ToolRegistry Service
├── tool.ts        # Tool 类型定义
└── ...

ToolRegistry Service

OpenCode 的工具系统基于 Effect Service

typescript
class ToolRegistry extends Service<ToolRegistry>() {
  register(tool: Tool): Effect<void>;
  materialize(name: string, args: unknown): Effect<ToolResult>;
  settle(name: string, result: ToolResult): Effect<void>;
  getSchema(name: string): Effect<ToolSchema>;
  list(): Effect<Tool[]>;
}

关键差异materialize()settle() 两步执行,而不是直接的 execute()

两步执行

LLM 返回 tool_calls

for each call:
  1. ToolRegistry.materialize(name, args)
     → 创建 tool instance,不执行
     → 检查 permission
     → 用户确认(如果需要)
  2. ToolRegistry.settle(name, result)
     → 执行工具
     → 写入事件

这比 Pi 的单步 tool.execute() 更灵活:可以在 materialize 和 settle 之间插入权限检查、用户确认等。

内置工具

OpenCode 的工具分为几类:

类别工具
文件read, write, edit, glob, grep, ls
终端bash, process
浏览器browser_navigate, browser_click, browser_type
Webweb_search, web_fetch
元工具task(子代理), todo(任务列表)
MCP动态加载 MCP 服务器工具

Plugin 工具

OpenCode 的插件系统也可以注册工具:

typescript
interface Plugin {
  tools?: Tool[];
  hooks?: PluginHooks;
  resources?: Resource[];
}

三种工具系统对比

维度PiOpenCodeHermes
注册方式数组Effect ServiceImport 自注册
执行模型单步 execute()materialize + settleexecute 直接
权限Permission serviceCheckpoint
并发顺序Effect fork并发/顺序可选
MCP原生原生
工具分组类别toolsets
守卫canExecutePermission checkcheck_fn

Powered by VitePress