外部编码工具
CountBot 可以把外部编码 CLI 接进系统,作为一个可配置的编码执行层。它的定位不是替代主模型,而是在需要时承接编码、调试 、重构、命令执行这类工作,或者直接作为某个 IM 渠道账号的默认目标。
为什么要单独一章
外部编码工具不是普通“第三方集成”,它同时影响三件事:
- Web 与 IM 中的编码任务怎么执行
- 渠道账号默认路由如何工作
- 当前聊天如何在
ai与direct间切换
所以这块最好单独看,而不是混在渠道配置里一笔带过。
支持什么类型的工具
适合接入的通常是可通过命令行启动的编码工具,例如:
- Claude Code
- Codex CLI
- OpenCode
- 其他本地 CLI 编码代理
配置文件
配置存储在 workspace/external_coding_tools.json:
{
"version": 1,
"profiles": [
{
"name": "claude",
"aliases": ["claude-code"],
"type": "cli",
"enabled": false,
"command": "claude",
"args": ["-p", "{prompt}"],
"working_dir": "",
"inherit_env": ["ANTHROPIC_API_KEY"],
"session_mode": "native",
"history_message_count": 10,
"timeout": 900
},
{
"name": "codex",
"aliases": ["openai-codex"],
"type": "cli",
"enabled": false,
"command": "codex",
"args": ["exec", "--skip-git-repo-check", "--cd", "{working_dir}", "-"],
"working_dir": "",
"stdin_template": "{prompt}",
"inherit_env": ["OPENAI_API_KEY"],
"session_mode": "history",
"history_message_count": 10,
"timeout": 900
},
{
"name": "opencode",
"aliases": ["open-code"],
"type": "cli",
"enabled": false,
"command": "opencode",
"args": ["run", "{prompt}"],
"working_dir": "",
"inherit_env": ["OPENAI_API_KEY", "ANTHROPIC_API_KEY"],
"session_mode": "history",
"history_message_count": 10,
"timeout": 900
}
]
}
默认创建 3 个 profile,全部默认禁用。需要手动启用并配置 API Key。
Profile 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | Profile 名称,必须唯一 |
aliases | string[] | 别名列表 |
type | string | 适配器类型,当前仅支持 cli |
enabled | bool | 是否启用 |
command | string | 启动命令 |
args | string[] | 参数列表,支持 {prompt}、{working_dir} 占位符 |
stdin_template | string | 标准输入模板,支持 {prompt} 占位符 |
working_dir | string | 工作目录 |
env | object | 自定义环境变量 |
inherit_env | string[] | 从父进程继承的环境变量名列表 |
session_mode | string | 会话模式:stateless、history、native |
history_message_count | int | 携带的历史消息条数(1-50) |
timeout | int | 超时秒数 |
success_exit_codes | int[] | 成功退出码列表,默认 [0] |
会话模式
session_mode 决定携带多少历史消息给外部编码工具:
| 模式 | 行为 |
|---|---|
stateless | 只发当前任务,不带历史 |
history | 携带最近 history_message_count 条历史消息 |
native | 使用工具自身的会话能力(如 Claude Code 的内置会话) |
注意事项
claudeprofile 默认session_mode: "native",适合与 Claude Code 交互codex和opencode默认session_mode: "history"native模式需要外部工具本身支持会话保持,否则可能行为不一致- 默认
history_message_count为 10,范围 1-50
与渠道默认路由的关系
每个 IM 渠道账号都可以保存两项高级设置:
- 默认路由模式
routing_mode - 默认外部编码工具
external_coding_profile
routing_mode=ai
普通消息先进 CountBot 主 Agent,再由主模型决定是否调用外部编码工具。
routing_mode=direct
普通消息直接转发给当前账号绑定的外部编码工具,适合持续编码场景。
如果渠道账号配置成 direct 却没有绑定 external_coding_profile,后端会直接拒绝这份渠道配置。
与 IM 命令的关系
IM 聊天里支持临时切换:
/route ai/route direct/route default/coder <profile>/coder default
这几个命令只影响当前聊天,不会修改后台保存的默认值。
详细见 IM 命令。
当前可用 API
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/settings/external-coding-tools | 获取外部编码工具配置 |
PUT | /api/settings/external-coding-tools | 保存外部编码工具配置 |
POST | /api/settings/external-coding-tools/check | 检查某个 profile 是否可用 |
推荐接入顺序
- 先新增一个 profile。
- 填写命令、参数、工作目录和环境变量。
- 先用检查接口验证 profile 本身可运行。
- 再把它绑定到某个 IM 渠道账号。
- 最后再通过
/route和/coder在真实聊天里验证行为。
排查思路
页面看起来已启用,但聊天里没有生效
优先检查:
- 该 profile 是否真正启用
- 渠道账号默认
external_coding_profile是否指向它 - 当前聊天是否被
/coder default或/route default恢复成了后台默认值
为什么某个工具“默认开启”
通常不是系统自动乱开,而是以下之一:
- 该渠道账号高级设置本来就保存了默认 profile
- 当前聊天之前执行过
/coder <profile> - 当前聊天路由是
direct
为什么会话模式和预期不同
重点检查:
- profile 配置的是不是
native - 当前工具是否真的支持
native - 不支持时是否被运行时自动回退为
history