参考 opencode 实现的基础工具,移植到 Python 并集成到框架
设计目标:
vendor/opencode/)vendor/opencode/ # Git submodule(只读参考)
└── packages/opencode/src/tool/ # TypeScript 实现
agent/tools/
├── builtin/ # 基础工具(Python 完整实现)
│ ├── read.py, edit.py, write.py # 文件操作
│ ├── bash.py # 命令执行
│ └── glob.py, grep.py # 文件搜索
│
├── advanced/ # 高级工具(Bun 适配器)
│ ├── webfetch.py # 网页抓取
│ └── lsp.py # LSP 诊断
│
└── adapters/
├── base.py # 适配器基类
├── opencode_bun_adapter.py # Bun 调用适配器
└── opencode-wrapper.ts # TypeScript 桥接
实现策略:
| 工具 | 实现 | 功能 |
|---|---|---|
read_file |
builtin/read.py |
读取文件(文本/图片/PDF),分页支持 |
edit_file |
builtin/edit.py |
文件编辑,9 种智能匹配策略 |
write_file |
builtin/write.py |
文件写入,自动创建目录 |
bash_command |
builtin/bash.py |
命令执行,超时控制 |
glob_files |
builtin/glob.py |
文件模式匹配 |
grep_content |
builtin/grep.py |
内容搜索(ripgrep 优先) |
参考源:vendor/opencode/packages/opencode/src/tool/*.ts
关键实现:
edit_file 的 9 种策略:包含 Levenshtein 算法的 BlockAnchorReplacerbash_command 的环境变量支持grep_content 的 ripgrep fallback| 工具 | 实现 | 调用方式 |
|---|---|---|
webfetch |
advanced/webfetch.py |
Bun → opencode(HTML 转 MD) |
lsp_diagnostics |
advanced/lsp.py |
Bun → opencode(LSP 集成) |
依赖:需要 Bun 运行时
桥接:adapters/opencode-wrapper.ts 通过子进程调用 opencode 工具
实现:agent/tools/adapters/base.py:ToolAdapter
核心方法:
adapt_execute() - 执行工具并转换结果为 ToolResultadapt_schema() - 转换工具 Schemaextract_memory() - 提取长期记忆摘要Bun 适配器:adapters/opencode_bun_adapter.py:OpenCodeBunAdapter
bun run opencode-wrapper.ts <tool> <args># 查看 submodule 状态
git submodule status
# 更新 submodule
cd vendor/opencode
git pull origin main
cd ../..
# 提交更新
git add vendor/opencode
git commit -m "chore: update opencode reference"
查看 opencode 变更:
cd vendor/opencode
git log --oneline --since="1 month ago" -- packages/opencode/src/tool/
评估是否需要同步到 Python 实现
更新 Python 实现:
在 agent/tools/builtin/ 中更新对应工具
更新代码注释中的参考位置
测试验证:
pytest tests/tools/builtin/ -v
from agent.tools.builtin import read_file, edit_file, bash_command
from agent.tools.advanced import webfetch
# 基础工具
result = await read_file(file_path="config.py", limit=100)
result = await edit_file(file_path="config.py", old_string="DEBUG = True", new_string="DEBUG = False")
result = await bash_command(command="git status", timeout=30)
# 高级工具(需要 Bun)
result = await webfetch(url="https://docs.python.org/3/")
工具通过 @tool 装饰器自动注册到 ToolRegistry。
完整示例:examples/tools_complete_demo.py
Git Submodule 原则:
vendor/opencode/ 只读,绝不修改cd vendor/opencode && git pull高内聚原则:
opencode-wrapper.ts 与 opencode_bun_adapter.py 在同一目录(adapters/)性能权衡: