# 工具适配器 > 参考 opencode 实现的基础工具,移植到 Python 并集成到框架 --- ## ⚠️ 第三方工具接入规范 **工具分类原则**: | 类型 | 实现方式 | 目录结构 | 示例 | |------|---------|---------|------| | **高频&简单工具** | Python 原生实现 | `agent/tools/builtin/` | read_file, edit_file, bash_command | | **复杂&低频工具** | 第三方仓库 + 适配器 | `vendor/` + `agent/tools/adapters/` + `agent/tools/advanced/` | webfetch, lsp_diagnostics | | **CLI 命令行工具** | pip 安装到虚拟环境 | `requirements.txt` + `bash_command` 调用 | browser-use | **接入流程**: 1. **简单工具**:直接在 `builtin/` 实现 - 参考第三方设计(如 opencode) - Python 完整实现 - 通过 `@tool` 装饰器注册 2. **复杂工具**:通过适配器调用 - 第三方仓库 → `vendor/`(Git Submodule,只读) - 适配器/桥接 → `agent/tools/adapters/` - 工具注册 → `agent/tools/advanced/` 3. **CLI 工具**:通过 bash_command 调用 - 添加到 `requirements.txt` - pip 安装到项目虚拟环境 - 通过 `bash_command` 工具调用 CLI - 在 `skills/` 中提供使用指导 **设计目标**: - 参考 opencode 的成熟工具设计(Git Submodule: `vendor/opencode/`) - Python 实现:基础工具(builtin/)完整复刻,高级工具(advanced/)通过 Bun 调用 - 保持解耦,便于独立维护和更新 --- ## 架构设计 ``` 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 桥接 ``` **实现策略**: - 基础工具(高频):Python 完整实现(~1-5ms,零依赖) - 高级工具(低频复杂):通过 Bun 调用 opencode(~50-100ms,功能完整) --- ## 工具清单 ### 基础工具(Python 实现) | 工具 | 实现 | 功能 | |------|------|------| | `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 优先) | | `skill` | `builtin/skill.py` | 加载技能文档 | | `list_skills` | `builtin/skill.py` | 列出可用技能 | **参考源**:`vendor/opencode/packages/opencode/src/tool/*.ts` **关键实现**: - `edit_file` 的 9 种策略:包含 Levenshtein 算法的 BlockAnchorReplacer - `bash_command` 的环境变量支持 - `grep_content` 的 ripgrep fallback ### 高级工具(Bun 适配器) | 工具 | 实现 | 调用方式 | |------|------|----------| | `webfetch` | `advanced/webfetch.py` | Bun → opencode(HTML 转 MD)| | `lsp_diagnostics` | `advanced/lsp.py` | Bun → opencode(LSP 集成)| **依赖**:需要 [Bun](https://bun.sh/) 运行时 **桥接**:`adapters/opencode-wrapper.ts` 通过子进程调用 opencode 工具 ### CLI 工具(pip 安装) | 工具 | 安装方式 | 调用方式 | |------|---------|----------| | `browser-use` | `pip install browser-use` | `bash_command` 调用 CLI | **依赖检查**:自动检测并提示缺失的依赖 ```python # 1. 加载 skill 时自动检查(会提示缺失的依赖) await skill(skill_name="browser-use") # 输出包含:⚠️ Setup Required - pip install browser-use / uvx browser-use install # 2. 手动检查依赖(使用 skill 自带的配置工具) from agent.skills.browser_use import check_browser_use await check_browser_use() # 返回详细的依赖状态 # 3. 自动安装 Chromium(可选,需要下载 200-300MB) from agent.skills.browser_use import install_browser_use_chromium await install_browser_use_chromium() ``` **使用示例**: ```python # Agent 加载使用指南 await skill(skill_name="browser-use") # 通过 bash_command 调用 CLI await bash_command(command="browser-use open https://example.com") await bash_command(command="browser-use state") await bash_command(command="browser-use click 5") ``` **Skill 文档**:`agent/skills/browser_use/browser-use.md` 提供完整的 CLI 使用指南 --- ## 适配器接口 **实现**:`agent/tools/adapters/base.py:ToolAdapter` 核心方法: - `adapt_execute()` - 执行工具并转换结果为 `ToolResult` - `adapt_schema()` - 转换工具 Schema - `extract_memory()` - 提取长期记忆摘要 **Bun 适配器**:`adapters/opencode_bun_adapter.py:OpenCodeBunAdapter` - 通过子进程调用 `bun run opencode-wrapper.ts ` - 30 秒超时 - JSON 结果解析 --- ## 更新 opencode 参考 ### 检查更新 ```bash # 查看 submodule 状态 git submodule status # 更新 submodule cd vendor/opencode git pull origin main cd ../.. # 提交更新 git add vendor/opencode git commit -m "chore: update opencode reference" ``` ### 同步改进 1. **查看 opencode 变更**: ```bash cd vendor/opencode git log --oneline --since="1 month ago" -- packages/opencode/src/tool/ ``` 2. **对比实现差异**: - 查看 opencode 的具体改动 - 评估是否需要同步到 Python 实现 3. **更新 Python 实现**: - 在 `agent/tools/builtin/` 中更新对应工具 - 更新代码注释中的参考位置 4. **测试验证**: ```bash pytest tests/tools/builtin/ -v ``` --- ## 使用示例 ```python 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/`) - Wrapper 是适配器的一部分,不是独立脚本 **性能权衡**: - 基础工具(高频):Python 实现避免子进程开销 - 高级工具(低频):Bun 适配器避免重复实现复杂逻辑