1. 为什么要在 ClawBot 里统一模型入口
ClawBot 是一个自托管的 Claude Code 增强版本,你可以把它理解成「跑在自己机器上的 AI 助手网关」:它对外提供 Web UI、终端界面和 Telegram Bot 三种交互方式,对内则要调用 Claude 系列模型完成推理。问题恰恰出在「对内」这一层——Claude Code CLI 需要一份 Anthropic 风格的凭证,Telegram Bot 走的是网关自己的模型配置,Web UI 又可能读取另一份环境变量。三套入口各自维护 Key,改一次模型要动三个地方,排查一次 401 要翻三份日志。
我试过把同一个 Key 分别塞进~/.claude/settings.json、~/.clawbot/clawbot.json和 shell 的ANTHROPIC_API_KEY,结果 Telegram Bot 能回消息、Claude Code 却报fetch failed,因为两者的 base URL 指向了不同域名。这类「配置漂移」在自托管场景里非常常见,尤其是你同时用 Claude Code 做本地编码、又想让 Telegram Bot 在手机上接活的时候。
TaoToken 在这里的角色是「统一 Key + 统一 API 通道」:你只申请一个 Key,把它同时写进 ClawBot 的config.toml(网关侧)和 Claude Code 的settings.json(CLI 侧),两边都指向同一个 API 地址。这样模型切换、额度查看、故障排查都收敛到一个入口,不用再猜是哪份配置没生效。这篇手册就围绕这个骨架展开,给出可直接复制的配置片段,并演示启动 Web UI 后验证 Bot 消息回传与 Claude Code 请求链路的完整动作。适合已经装好 ClawBot、正在被多份 Key 配置困扰的自托管用户。
2. TaoToken 前置准备:拿 Key 与确认通道
在动配置文件之前,先把「钥匙」和「门牌号」确定下来。TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册登录后进入控制台创建 API Key。API 的基础地址是 https://taotoken.net/api ,注意这个地址不带任何查询参数,配置里直接写它即可。
创建 Key 的路径在控制台的 API Keys 页面,建议按用途命名,比如clawbot-gateway和claude-code-local,方便日后按项目吊销。Key 只在创建时完整显示一次,复制后先存到密码管理器,不要直接贴在聊天记录里。
关于模型名,TaoToken 的通道兼容 Anthropic Messages 格式,所以你在 ClawBot 和 Claude Code 里填的模型标识要跟通道支持的名称对齐。常见写法是claude-sonnet-4-5这类,具体以控制台「模型对话」页面列出的可用模型为准。你可以先在模型对话里发一条测试消息,确认 Key 和模型名匹配,再去改本地配置——这一步能省掉后面一半的排障时间。
需要提醒的是,ClawBot 的 agents 具备执行命令、读写文件的能力,接入任何外部 API 通道前都要清楚它的权限边界。TaoToken 只是提供模型调用入口,不改变 ClawBot 本身的 agent 行为,所以安全审计仍然要做,后面第 5 节会给命令。
3. 可复制配置骨架:config.toml 与 settings.json
这一节是全文的核心。ClawBot 网关侧读的是~/.clawbot/clawbot.json(部分版本用config.toml,字段名一致),Claude Code CLI 侧读的是~/.claude/settings.json。两份配置里的 base URL 和 Key 必须指向同一个 TaoToken 通道,否则就会出现「Bot 能回、CLI 报错」的割裂现象。
先看 ClawBot 网关侧的配置骨架。下面这段可以直接粘进~/.clawbot/clawbot.json,把sk-你的TaoToken密钥替换成真实 Key:
{ "models": { "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken密钥", "api": "anthropic-messages", "models": ["claude-sonnet-4-5"] } }, "default": "taotoken/claude-sonnet-4-5" }, "channels": { "telegram": { "enabled": true, "token": "你的TelegramBotToken" } } }几个字段的含义需要说清楚。api固定写anthropic-messages,因为 TaoToken 通道走的是 Anthropic Messages 协议;models是数组,可以放多个模型名,default用provider/model的形式指定默认模型。channels.telegram.token是你在 Telegram 里找 @BotFather 申请到的 Bot Token,跟 TaoToken 的 Key 是两回事,别混。
再看 Claude Code CLI 侧的~/.claude/settings.json。这份配置让本地claude命令也走同一个通道:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoToken密钥", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }如果你更习惯用 shell 环境变量而不是 settings.json,可以在~/.zshrc或~/.bashrc里写:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的TaoToken密钥" export ANTHROPIC_MODEL="claude-sonnet-4-5"两种方式选一种即可,同时写会以 settings.json 优先。改完配置后重启网关:
clawbot gateway restart clawbot channels status正常输出里应该能看到Gateway reachable、Telegram default: enabled, configured, running,以及 Web UI 的本地地址。如果 Telegram 那行显示stopped,先别急着怀疑 Key,多半是 Bot Token 写错或网络到 Telegram 的连通性问题。
4. 验证请求链路:Web UI、Bot 回传与 Claude Code
配置写完不等于通了,要分三层验证:Web UI 能不能打开、Telegram Bot 能不能回消息、Claude Code 能不能出结果。这三层分别对应网关、通道、CLI,任何一层断了都能定位到具体环节。
第一层,启动并访问 Web UI。执行clawbot dashboard或直接浏览器打开http://127.0.0.1:18789/,带 Token 的地址形如http://127.0.0.1:18789/?token=你的token。页面能加载出聊天界面,说明网关进程和 Web 服务正常。在输入框发一句「你好」,如果模型返回内容,说明网关到 TaoToken 的模型调用链路是通的——这一层通了,Telegram Bot 大概率也能通,因为两者共用models.providers配置。
第二层,验证 Telegram Bot 回传。在 Telegram 里找到你创建的 Bot,发送/start或任意消息。正常情况 Bot 会在几秒内回复。如果没反应,按顺序查:clawbot channels status看 Telegram 是否 running;tail -f ~/.clawbot/logs/gateway.log看有没有收到 update;确认 Bot Token 没有多余空格。Bot 能回消息,说明「Telegram → 网关 → TaoToken → 模型 → 回传」整条链路闭合。
第三层,验证 Claude Code CLI。新开一个终端,进入任意项目目录,执行:
claude -p "用一句话说明这个目录的用途"如果返回模型输出,说明settings.json里的 base URL 和 Key 生效了。这一步最容易踩的坑是 shell 里残留了旧的ANTHROPIC_API_KEY,导致 settings.json 被覆盖。用env | grep ANTHROPIC确认当前环境变量,有冲突就unset掉再试。
三层都通过后,你可以做一个交叉验证:在 Claude Code 里让它读一个文件并总结,同时在 Telegram Bot 里问同一个文件的内容,两边应该都能拿到结果,且日志里能看到请求都打到了taotoken.net/api。这就证明「统一 Key」的目标达成了。
5. 本篇常见错排查
即使按上面的骨架配,也可能遇到几类典型报错。下面按现象归类,给出定位命令和修法。
现象一:Web UI 打不开,提示连接失败。先确认进程在跑:ps aux | grep clawbot-gateway。再看端口有没有被占:lsof -i :18789。如果端口被别的程序占了,改clawbot.json里的gateway.port再重启。最后看错误日志:tail -50 ~/.clawbot/logs/gateway.err.log,里面通常会直接写明是配置解析失败还是端口绑定失败。
现象二:报TypeError: fetch failed。这是模型请求发不出去,八成是 base URL 写错或网络到 TaoToken 不通。先用 curl 直接测通道:
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: sk-你的TaoToken密钥" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{"model":"claude-sonnet-4-5","max_tokens":50,"messages":[{"role":"user","content":"hi"}]}'如果 curl 能返回内容而 ClawBot 报 fetch failed,说明是 ClawBot 读到的配置跟你以为的不一样。用cat ~/.clawbot/clawbot.json | jq '.models.providers'确认实际生效的 baseUrl 和 apiKey,注意有没有拼写错误或多余斜杠。
现象三:Telegram Bot 无响应。先clawbot channels status看状态,如果是disabled,检查channels.telegram.enabled是否为 true。如果是configured, stopped,看日志里有没有401 Unauthorized——那通常是 Bot Token 错了,跟 TaoToken 的 Key 无关。还有一种情况是 Bot 收到了消息但模型调用失败,这时日志里会有 TaoToken 返回的错误码,按错误码去控制台核对 Key 状态和额度。
现象四:Claude Code 报认证失败但 Bot 正常。这说明网关侧配置没问题,问题在 CLI 侧。检查~/.claude/settings.json的 JSON 格式是否合法(多一个逗号就会静默失效),用cat ~/.claude/settings.json | jq '.'验证。再确认没有 shell 环境变量覆盖,必要时在 settings.json 里显式写全三个变量。
现象五:日志里模型名不识别。如果你填的模型名不在 TaoToken 通道支持列表里,会返回模型不存在。去控制台的模型对话页面确认可用模型名,改clawbot.json的models数组和default字段,重启网关。
排查时养成一个习惯:先看日志再改配置。tail -f ~/.clawbot/logs/gateway.log挂着,复现一次操作,日志里基本会直接告诉你哪一层断了。
6. 把 Key 收敛到一个入口之后
配置骨架跑通之后,日常维护会轻松很多。模型要换,只改clawbot.json的default和settings.json的ANTHROPIC_MODEL两处,Key 不用动;额度要查,去 TaoToken 控制台看一个账号即可;出问题要排查,先 curl 测通道,再分层看 Web UI、Bot、CLI,定位路径是固定的。
如果你后续要把 ClawBot 接到更多入口,比如长期跑编码任务或做 Agent 编排,可以了解下 Coding Plan 这类按周期计费的方案,适合高频调用场景;只是偶尔验证模型效果的话,模型对话页面就够用。接入文档里有各语言 SDK 的示例,需要把 TaoToken 嵌进自己脚本时可以参考。
最后留一个实用习惯:把~/.clawbot/clawbot.json和~/.claude/settings.json里的 Key 用环境变量引用而不是硬编码,比如"apiKey": "${TAOTOKEN_API_KEY}",这样配置文件可以进版本库而不会泄露凭证。改完记得clawbot gateway restart,然后按第 4 节的三层验证再走一遍,确认链路没断。