1. OpenClaw 本地部署后为什么要把模型网关切到 TaoToken
OpenClaw 是一个可以本地跑起来的 AI 网关与多通道机器人框架,它能把你电脑上的 Ollama 本地模型、DeepSeek 云端模型,以及飞书这类聊天通道统一编排到一条链路上。很多开发者第一次跑通 OpenClaw 时,模型来源是混着的:一部分请求走 Ollama 的http://localhost:11434,一部分走 DeepSeek 的https://api.deepseek.com/v1,飞书机器人回调进来之后到底用哪个模型,全靠agents.defaults.model.primary那一行配置决定。问题就出在这里——本地 Ollama 的 7B 模型回答质量有限,DeepSeek 官方 Key 又要单独充值、单独限流,多个 Key 散落在不同配置文件里,换机器就得重新配一遍。
我试过把 OpenClaw 的模型出口统一收敛到一个兼容 OpenAI 协议的网关上,这样 Ollama 继续负责本地兜底,DeepSeek 负责高质量推理,而飞书通道进来的消息只需要认一个 Base URL 和一个 Key。TaoToken 就是这样一个入口:它提供 OpenAI 兼容的/v1/chat/completions接口,你可以在 OpenClaw 的openclaw.json里把 provider 的baseUrl指过去,模型 ID 保持deepseek-chat这类名字不变,OpenClaw 的 agent 层几乎不用改逻辑。
这篇教程面向已经跑通 Ollama 与 DeepSeek 本地推理、想把请求统一走 TaoToken 的开发者。我会给出settings(也就是~/.openclaw/openclaw.json)里 Base URL 与 Key 的可复制改法、飞书机器人回调联调步骤,以及一次对话请求的验证动作与返回结果对照。核心检索词是 OpenClaw 本地使用教程、OpenClaw 配置 TaoToken、飞书机器人回调联调。适合谁:手里有 Mac 或 Linux 开发机、装过 Node 18+、能看懂 JSON 配置、想让本地 Agent 稳定跑起来的同学。
先说清楚边界:TaoToken 在这里扮演的是模型网关角色,不是替代 OpenClaw 本身,也不是替代 Ollama。Ollama 仍然跑在你本机,负责离线兜底;TaoToken 负责把云端模型的鉴权和路由统一掉。这样你飞书里 @ 机器人时,OpenClaw 网关收到事件,按 agent 配置选模型,请求发到 TaoToken 的 API 地址,返回结果再经飞书通道发回群里。整条链路里你只需要维护一个 Key。
2. TaoToken 前置准备:拿 Key、认接口、对齐 OpenClaw 的 provider 结构
在改openclaw.json之前,先把 TaoToken 这边的三样东西准备好:API Key、Base URL、以及你要用的 Model ID。OpenClaw 的 provider 配置是 OpenAI 兼容风格,字段名是baseUrl、apiKey、api、models[],所以只要 TaoToken 的接口路径是/v1/chat/completions,就能直接套进去。
第一步,打开 TaoToken 控制台创建 API Key。地址是 https://taotoken.net/api-keys ,登录后点创建,复制出来的 Key 一般以sk-开头。这个 Key 只显示一次,建议先粘到临时文本里。注意不要把它提交到 Git,后面我们会用chmod 600保护配置文件。
第二步,确认 Base URL。TaoToken 的 API 根地址是 https://taotoken.net/api ,OpenClaw 里填的时候要带上/v1,也就是https://taotoken.net/api/v1。这一点和 DeepSeek 官方写法一致,DeepSeek 是https://api.deepseek.com/v1,所以迁移时只改域名部分,路径不动。
第三步,确认 Model ID。TaoToken 的模型列表可以在模型对话页里看到,地址是 https://taotoken.net/models 。常见的deepseek-chat、deepseek-reasoner都在里面。OpenClaw 的models[].id要和你实际调用的模型名一致,否则网关会返回 model not found。
如果你还没装 OpenClaw,先补一下安装。Node 18 以上环境执行:
npm install -g openclaw openclaw --version初始化配置目录:
openclaw onboard它会生成~/.openclaw/openclaw.json。如果你之前已经配过 DeepSeek 和 Ollama,这个文件里应该已经有models.providers.deepseek和models.providers.ollama两段。我们要做的是新增一个taotokenprovider,或者直接把deepseek那段的baseUrl改掉。推荐新增,保留原来的 DeepSeek 官方配置作为对照,方便排障时切换。
这里有个容易踩的坑:OpenClaw 的api字段决定用哪种请求格式。TaoToken 是 OpenAI 兼容接口,所以api填openai-completions。如果你填成ollama,OpenClaw 会按 Ollama 的/api/chat路径发请求,打到 TaoToken 上就会 404。这个字段在后面的 JSON 片段里我会标出来。
另外,TaoToken 的接入文档在 https://taotoken.net/doc ,里面有完整的请求示例和错误码说明。排障时对照文档比盲猜快得多。Key 管理页和文档页建议都收藏,后面飞书联调出问题时你会反复用到。
3. 可复制配置:把 openclaw.json 的 provider 改到 TaoToken
这一节是全文的核心操作。OpenClaw 的主配置文件在~/.openclaw/openclaw.json,你可以用openclaw config set逐条改,也可以直接编辑 JSON。逐条改适合脚本化,直接编辑适合一次配好多个模型。我两种都给,你挑一种。
先备份,这一步别省:
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak3.1 用命令行逐条写入
openclaw config set models.providers.taotoken.baseUrl "https://taotoken.net/api/v1" openclaw config set models.providers.taotoken.apiKey "sk-你的TaoToken密钥" openclaw config set models.providers.taotoken.api "openai-completions" openclaw config set 'models.providers.taotoken.models[0].id' "deepseek-chat" openclaw config set 'models.providers.taotoken.models[0].name' "DeepSeek Chat via TaoToken" openclaw config set 'models.providers.taotoken.models[1].id' "deepseek-reasoner" openclaw config set 'models.providers.taotoken.models[1].name' "DeepSeek Reasoner via TaoToken" openclaw config set agents.defaults.model.primary "taotoken/deepseek-chat"注意models[0]这种带方括号的路径要用单引号包住,否则 shell 会把方括号当通配符展开,写进去的配置就乱了。这是我在 zsh 下踩过的坑,bash 下同样建议加引号。
3.2 直接编辑 JSON 的完整片段
打开~/.openclaw/openclaw.json,在models.providers下加入taotoken段。下面这段可以直接复制,把 Key 换成你自己的:
{ "models": { "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api/v1", "apiKey": "sk-你的TaoToken密钥", "api": "openai-completions", "models": [ { "id": "deepseek-chat", "name": "DeepSeek Chat via TaoToken" }, { "id": "deepseek-reasoner", "name": "DeepSeek Reasoner via TaoToken" } ] }, "ollama": { "baseUrl": "http://localhost:11434", "api": "ollama", "models": [ { "id": "llama3.2", "name": "Llama 3.2" } ] } } }, "agents": { "defaults": { "model": { "primary": "taotoken/deepseek-chat", "fallback": "ollama/llama3.2" } } } }这里primary指向 TaoToken 的deepseek-chat,fallback指向本地 Ollama 的llama3.2。这样设计的好处是:网络正常时走云端高质量模型,TaoToken 不可达时 OpenClaw 会自动降级到本地 Ollama,飞书机器人不会直接哑掉。fallback字段在 OpenClaw 的 agent 配置里是支持的,写法和primary一样是provider/modelId。
3.3 飞书通道的配置片段
飞书部分同样在openclaw.json里,channels.feishu段。如果你还没建飞书应用,先去飞书开放平台创建企业自建应用,拿到 App ID 和 App Secret。配置如下:
{ "channels": { "feishu": { "enabled": true, "connectionMode": "websocket", "accounts": { "main": { "appId": "cli_你的AppID", "appSecret": "你的AppSecret", "botName": "OpenClaw助手" } }, "dmPolicy": "pairing", "groupPolicy": "allowlist", "groupAllowFrom": ["oc_你的群ID"], "groups": { "oc_你的群ID": { "requireMention": true, "enabled": true } } } } }connectionMode用websocket,也就是飞书的长连接模式,不需要公网 IP,本地开发机直接能收事件。飞书后台的「事件订阅」页面要选「使用长连接接收事件」,并添加im.message.receive_v1事件。权限方面至少开im:message、im:message:send_as_bot、im:chat。
改完配置后验证 JSON 合法性:
openclaw config validate如果输出Config is valid,就可以重启网关了。如果报错,用openclaw doctor --fix尝试自动修复,或者对照报错行号手动改。
4. 验证请求:一次对话的完整动作与返回结果对照
配置写完不代表通了,必须发一次真实请求看返回。验证分三层:先验 TaoToken 接口本身,再验 OpenClaw 网关,最后验飞书通道。
4.1 直接 curl 验 TaoToken
这一步绕过 OpenClaw,确认 Key 和 Base URL 没问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "用一句话说明什么是网关"}], "stream": false }'正常返回是一个 JSON,结构里choices[0].message.content就是模型回答。如果返回401,说明 Key 错了或没带Bearer前缀;如果返回404,多半是 Base URL 少了/v1;如果返回model not found,检查model字段拼写。
4.2 重启网关并查看状态
openclaw gateway restart openclaw gateway status openclaw statusopenclaw status会列出当前 agent 的 primary 模型。你应该看到taotoken/deepseek-chat。如果还显示旧的deepseek/deepseek-chat,说明agents.defaults.model.primary没写对,回去检查 JSON 层级。
4.3 通过 OpenClaw 发一次对话
OpenClaw 自带 Web 界面,默认端口 18789。浏览器打开http://localhost:18789,在对话框里发一句「你好,报一下你当前使用的模型」。返回结果里如果模型标识是deepseek-chat,且回答正常,说明网关链路通了。
你也可以用日志确认请求确实打到了 TaoToken:
openclaw logs --follow在另一个终端发消息,日志里会出现类似provider=taotoken model=deepseek-chat的行。如果看到provider=ollama,说明 fallback 被触发了,回去检查 TaoToken 的连通性。
4.4 飞书通道联调
飞书这边,先在群里 @ 你的机器人发一条消息。第一次会触发配对流程,因为dmPolicy设的是pairing。查看配对请求:
openclaw pairing list feishu拿到配对码后批准:
openclaw pairing approve feishu <配对码>批准后再发一条消息,机器人应该会回复。如果机器人不回复,先看通道状态:
openclaw channels statusfeishu那行应该是connected。如果是disconnected,检查 App ID、App Secret 是否填对,以及飞书后台应用是否已发布版本。长连接模式下,应用必须发布后事件才会推送到你的本地网关。
一次成功的返回对照:你在飞书发「帮我总结一下今天的待办」,OpenClaw 网关收到im.message.receive_v1事件,按 agent 配置选taotoken/deepseek-chat,请求发到https://taotoken.net/api/v1/chat/completions,返回内容经飞书im:message:send_as_bot权限发回群里。日志里能看到完整的事件 ID 和请求耗时。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易撞上的几类报错,我按真实日志逐条对照。
401 Unauthorized。日志里通常是provider=taotoken status=401。原因有三个:Key 复制时带了空格、Key 已过期、请求头没带Bearer。OpenClaw 会自动加Bearer前缀,所以重点查 Key 本身。用 4.1 的 curl 单独验一次,能快速定位是 Key 问题还是 OpenClaw 配置问题。
local proxy failed。这个报错说明 OpenClaw 尝试连baseUrl时连接被拒。常见于你把baseUrl写成了http://localhost:xxxx但本地没有对应服务,或者写成了https://taotoken.net/api少了/v1导致路径不对。检查openclaw config get models.providers.taotoken.baseUrl的输出,确保是https://taotoken.net/api/v1。
reading choices 相关报错。日志里出现cannot read property 'choices' of undefined或reading 'choices',说明返回体不是预期的 OpenAI 格式。多半是api字段填错了,比如填成了ollama,OpenClaw 按 Ollama 格式解析 TaoToken 的返回,自然找不到choices。把api改回openai-completions即可。
OAuth 相关报错。如果你在飞书通道看到OAuth字样,通常是 App Secret 错误或应用未发布。飞书长连接需要应用有已发布版本,草稿态不会推送事件。去飞书开放平台「版本管理与发布」里创建版本并发布。另外appId必须是cli_开头,填成别的格式会直接鉴权失败。
端口占用。openclaw gateway restart报address already in use,说明 18789 被占。执行:
lsof -i :18789 kill -9 <PID> openclaw gateway start配置文件损坏。如果openclaw config validate报 JSON 解析错误,直接用备份恢复:
cp ~/.openclaw/openclaw.json.bak ~/.openclaw/openclaw.json然后重新按第 3 节的片段改。改 JSON 时注意逗号,models.providers下多个 provider 之间要有逗号,最后一个不要有。
权限问题。~/.openclaw/agents/main/agent/auth-profiles.json如果权限过宽,OpenClaw 可能拒绝读取。执行:
chmod 600 ~/.openclaw/agents/main/agent/auth-profiles.json飞书机器人不回复但通道显示 connected。检查groups配置里的群 ID 是否和实际群一致,requireMention为 true 时必须 @ 机器人才触发。另外groupAllowFrom里的群 ID 要和groups的 key 完全一致,差一个字符就不生效。
排障时如果拿不准,直接看 TaoToken 的接入文档 https://taotoken.net/doc ,里面有标准错误码和请求示例。Key 相关问题去 https://taotoken.net/api-keys 重新生成一个再试,比反复猜快。
6. 长期跑 OpenClaw + TaoToken 的稳定用法与 CTA
配置跑通只是开始,长期稳定运行还需要几件事。第一,把网关装成系统服务,避免终端一关就断:
openclaw gateway install openclaw gateway startmacOS 下会生成 LaunchAgent,Linux 下生成 systemd unit。这样开机自启,飞书事件不会因为终端关闭而丢失。
第二,日志用 tmux 常驻监控,方便回溯:
tmux new -s openclaw-logs openclaw logs --follow第三,定期备份配置。openclaw.json里现在有 TaoToken 的 Key 和飞书的 App Secret,备份文件也要chmod 600。
第四,模型选择上,日常对话用deepseek-chat就够,复杂推理切deepseek-reasoner。切换方式是在飞书里发指令,或者改agents.defaults.model.primary后openclaw gateway reload热加载,不用重启。
如果你打算把 OpenClaw 用在长期编码或 Agent 场景,比如让飞书机器人帮你跑代码审查、定时总结仓库变更,可以考虑 TaoToken 的 Coding Plan,地址是 https://taotoken.net/coding-plan 。它适合请求量稳定、需要长期挂着的用法。只是想先验证模型效果,去模型对话页 https://taotoken.net/models 直接试就行。接入过程中遇到鉴权或路径问题,接入文档 https://taotoken.net/doc 里有完整的 Base URL 和请求头说明,对照着改比翻日志快。
最后提醒一句:TaoToken 是模型网关,OpenClaw 是编排框架,Ollama 是本地推理引擎,三者各司其职。把openclaw.json里的 provider 指向 TaoToken 之后,你维护的 Key 从多个变成一个,飞书通道、本地兜底、云端推理都在同一条链路上。改完记得openclaw config validate再openclaw gateway restart,然后按第 4 节发一次真实对话确认返回。