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 |
| Web | web_search, web_fetch |
| 元工具 | task(子代理), todo(任务列表) |
| MCP | 动态加载 MCP 服务器工具 |
Plugin 工具
OpenCode 的插件系统也可以注册工具:
typescript
interface Plugin {
tools?: Tool[];
hooks?: PluginHooks;
resources?: Resource[];
}三种工具系统对比
| 维度 | Pi | OpenCode | Hermes |
|---|---|---|---|
| 注册方式 | 数组 | Effect Service | Import 自注册 |
| 执行模型 | 单步 execute() | materialize + settle | execute 直接 |
| 权限 | 无 | Permission service | Checkpoint |
| 并发 | 顺序 | Effect fork | 并发/顺序可选 |
| MCP | 无 | 原生 | 原生 |
| 工具分组 | 无 | 类别 | toolsets |
| 守卫 | canExecute | Permission check | check_fn |