Pi 工具系统
工具定义
Pi 的工具接口非常简明:
typescript
interface Tool {
name: string;
description: string;
parameters: JSONSchema;
execute(args: Record<string, unknown>): Promise<ToolResult>;
canExecute?(context: ToolContext): boolean;
}内置工具
Pi 的 coding agent 核心工具:
| 工具 | 作用 |
|---|---|
bash | 执行 shell 命令 |
read_file | 读取文件(带行号) |
write_file | 写入文件 |
edit_file | 精确字符串替换编辑 |
grep | 搜索文件内容 |
glob | 按 glob 查找文件 |
ls | 列出目录 |
task | 子任务(delegate) |
web_search | 网络搜索 |
web_fetch | 获取网页 |
memory | 读写记忆 |
工具注册
工具在 coding-agent/src/core/tools/index.ts 集中注册:
typescript
export function getTools(): Tool[] {
return [
bashTool,
readFileTool,
writeFileTool,
editFileTool,
grepTool,
globTool,
lsTool,
taskTool,
webSearchTool,
webFetchTool,
memoryTool,
];
}比 Hermes 简单很多:没有 toolset 概念,没有 registry 单例,没有 check_fn 守卫——就是纯数组。
Extension 扩展
Pi 的工具扩展通过 Extension API 实现,不是插件系统:
typescript
interface Extension {
name: string;
tools?: Tool[];
resources?: Resource[];
hooks?: {
preToolCall?: (call: ToolCall) => Promise<void>;
postToolCall?: (result: ToolResult) => Promise<ToolResult>;
onUserMessage?: (msg: string) => Promise<string>;
};
}Extension 在 AgentSessionRuntime 创建时注入,比 Hermes 的 plugin hooks 更轻量。
与 Hermes 对比
| 维度 | Pi | Hermes |
|---|---|---|
| Tool 定义 | interface Tool | registry + schema + handler + check_fn |
| 注册方式 | 集中数组 + 硬编码 | 分散文件 + import 时自注册 |
| 分组 | 无 | toolsets(web/file/terminal/...) |
| 守卫 | canExecute | check_fn(服务门控) |
| 扩展 | Extension API | Plugin hooks(pre/post_tool_call 等) |
| 并发执行 | 顺序 | 并发/顺序可选 |