1. 为什么私人 AI 助手需要一个统一网关
OpenClaw CN 是一个自托管的多通道 AI 网关,它能把 DeepSeek、Qwen 这类国产大模型接进你日常用的聊天工具里,让 AI 助手真正跑在自己的机器上。适合谁?适合那些想用国产模型搭私人助手、又不想被单一厂商 API Key 绑死的开发者。它的核心价值在于:一个 Gateway 进程统管所有渠道和模型路由,你换模型、加渠道,都只改一处配置。
但实际搭起来,很多人会卡在同一个地方:模型接入层。OpenClaw CN 源码级支持 DeepSeek 和 Qwen,可一旦你想同时挂多个模型、或者在不同 Agent 之间切换供应商,就会面临一堆散落的 Key 和 baseUrl。每个 provider 一套鉴权、一套地址,配置文件越写越长,排查问题时根本不知道请求到底落到了哪个模型上。
我试过把 DeepSeek 和 Qwen 分别写死在两个 Agent 里,结果想临时换个模型做对比测试,得改 JSON、重启 Gateway、再重新配对设备,一来一回十分钟没了。更麻烦的是,当某个 provider 的 Key 额度用完或者接口抖动,整个 Agent 直接报错,没有兜底。
所以这篇要解决的不是"怎么装 OpenClaw CN",而是怎么用 TaoToken 统一 Key 把模型路由层收拢成一条通道。TaoToken 在这里扮演的是统一接入层:你只维护一个 Base URL 和一个 Key,DeepSeek、Qwen 以及后续想加的模型都从这一个口子进。OpenClaw CN 的 Gateway 负责渠道分发和 Agent 循环,TaoToken 负责模型鉴权和路由,两层各司其职。
这样做的直接好处有三个。第一,配置收敛,openclaw.json里不再堆一堆 provider 片段,换模型只改一个 model id。第二,排障路径清晰,请求失败时你先看 Gateway 日志确认消息路由对不对,再看 TaoToken 返回确认模型侧通不通,两段分开定位。第三,多模型切换变成改一行字符串的事,不用动鉴权结构。
下面我会先讲 OpenClaw CN 的 Gateway 和模型路由层到底怎么工作,再给出统一 Key 的完整配置片段,然后走一遍端到端对话验证,最后把几个高频报错逐个拆开。你跟着做,能拿到一个请求经统一通道正确落到目标模型的可复现结果。
2. OpenClaw CN 的 Gateway 与模型路由层拆解
OpenClaw CN 基于 OpenClaw v2026.2.23 做中国社区维护,架构上最值得先搞懂的是 Gateway 的单点控制设计。每台主机只跑一个 Gateway 进程,它是整个系统的唯一真相来源。所有客户端——macOS App、CLI、Web 面板、移动节点——都通过 WebSocket 跟 Gateway 通信,默认绑定127.0.0.1:18789。普通客户端用role: operator,移动设备节点用role: node并声明摄像头、Canvas、定位等能力。
Gateway 内部有五个关键组件。消息路由器负责把不同渠道的入站消息路由到对应 Agent,再把回复分发回各渠道;会话管理器以 JSONL 格式持久化会话记录到~/.openclaw/agents/<agentId>/sessions/,支持多 Agent 隔离;认证与配对基于设备身份,新设备要审批才能接入;命令队列按会话维度串行化 Agent 执行,防止工具和会话冲突。
这里有个设计细节值得单独说:Agent 调用是异步的。客户端发出req:agent后,Gateway 立即返回一个runId,然后通过事件流持续推送推理进度。客户端不会阻塞等待,这对移动端和实时聊天场景很关键。你如果自己写客户端对接,要按事件流的方式处理,别写成同步请求等结果。
模型路由层是这次改造的重点。OpenClaw CN 在源码里内置了 DeepSeek 官方节点,并为国内网络环境优化了连接策略,工具调用也是按 DeepSeek 的 API 规范直接实现,不走兼容层模拟。Qwen 同样作为一级公民集成。但默认情况下,每个 provider 在openclaw.json里是独立配置的,auth.profiles下会有deepseek:default、qwen:default这样的条目,各自带apiKey和baseUrl。
问题就出在这。当你想让多个 Agent 共享同一套模型接入、或者想在不改鉴权结构的前提下切换模型时,这种分散配置会变成负担。更实际的问题是:如果你手上有多个模型供应商的 Key,每个都要单独管理额度、单独处理失效,运维成本随模型数量线性增长。
TaoToken 的接入点就在这一层。它提供一个统一的 OpenAI 兼容接口,Base URL 是https://taotoken.net/api,你用同一个 Key 就能访问 DeepSeek、Qwen 等模型。在 OpenClaw CN 里,你只需要配置一个 provider profile,把baseUrl指向 TaoToken,apiKey填 TaoToken 的 Key,然后在 Agent 的 model 字段里写目标模型的 id。Gateway 的消息路由逻辑完全不变,变的只是模型鉴权从"多对多"变成"一对多"。
这样拆下来,整个链路是:聊天渠道 → Gateway 消息路由器 → Agent 循环 → 模型路由层(TaoToken 统一通道)→ 目标模型。每一段职责清晰,出问题时你能快速定位是哪一段断了。
2.1 Agent 循环与引导文件机制
Agent 循环定义了从收到消息到完成回复的完整流程。每个会话内部严格串行,同一个会话不会同时跑多个 Agent,杜绝了工具调用冲突和历史不一致。这符合聊天应用一问一答的心智模型。
OpenClaw CN 有一套引导文件机制,放在~/.openclaw/workspace/下。AGENTS.md是 Agent 操作指南和记忆,SOUL.md定义人格语气和边界,TOOLS.md是用户维护的工具说明,BOOTSTRAP.md是一次性首次运行仪式完成后自动删除,IDENTITY.md存 Agent 名称和氛围,USER.md是用户简介和偏好称呼。每次新会话开始,Gateway 会把这些文件内容注入系统提示。这就是 OpenClaw 记忆和人格的物理载体,你像编辑文档一样改它们,Agent 行为就跟着变。
技能系统从三个位置加载,优先级从高到低:工作空间技能<workspace>/skills最高,托管/本地技能~/.openclaw/skills通过 ClawHub 安装,内置技能随安装包自带。你自定义的技能放工作空间目录,优先级最高,不会被覆盖。
理解这层之后,统一 Key 的改造就不会动到 Agent 循环和引导文件,只动模型路由层的鉴权配置。这是最小改动面,也是为什么值得先把架构拆清楚再动手。
3. 统一 Key 接入:可复制的 Gateway 配置片段
这一节给可直接复制的配置。先确认你的 OpenClaw CN 已经装好,Node 版本 ≥ 22,pnpm 镜像源配好。如果你还没装,按官方仓库的步骤走一遍,这里不重复安装流程,重点放在模型路由层的配置。
配置文件在~/.openclaw/openclaw.json。改造前,你的auth.profiles里可能长这样:
{ "auth": { "profiles": { "deepseek:default": { "provider": "deepseek", "mode": "api_key", "apiKey": "sk-你的DeepSeek密钥" }, "qwen:default": { "provider": "qwen", "mode": "api_key", "apiKey": "sk-你的Qwen密钥" } } } }改造后,收敛成一个 TaoToken profile:
{ "auth": { "profiles": { "taotoken:default": { "provider": "openai-compatible", "mode": "api_key", "apiKey": "你的TaoToken密钥", "baseUrl": "https://taotoken.net/api" } } }, "agents": { "defaults": { "model": { "primary": "deepseek/deepseek-chat" } } } }这里三个字段要写全,缺一不可。baseUrl是https://taotoken.net/api,注意不要加多余的路径后缀。apiKey填你在 TaoToken 控制台生成的 Key。provider用openai-compatible,因为 TaoToken 提供的是 OpenAI 兼容接口,OpenClaw CN 按这个协议对接即可。
模型 id 的写法是供应商/模型名。DeepSeek 的对话模型用deepseek/deepseek-chat,推理模型用deepseek/deepseek-reasoner。Qwen 的模型 id 按你实际要用的填,比如qwen/qwen-plus或qwen/qwen-max。切换模型时只改primary这一行字符串,鉴权结构不动。
如果你想让不同 Agent 用不同模型,在agents下按 agentId 分别配:
{ "agents": { "defaults": { "model": { "primary": "deepseek/deepseek-chat" } }, "coding-agent": { "model": { "primary": "qwen/qwen-max" } } } }这样coding-agent走 Qwen,其他 Agent 走 DeepSeek,但两者共用同一个 TaoToken profile。Key 只维护一份,额度统一在 TaoToken 侧看。
配置改完,重启 Gateway:
pnpm openclaw gateway看到Gateway listening on ws://127.0.0.1:18789说明启动成功。如果你之前已经配对过设备,不用重新配对,配置热加载会生效;如果没生效,重启一次客户端连接即可。
注意:
baseUrl不要写成带/v1或其他后缀的形式,OpenClaw CN 的 openai-compatible provider 会按标准路径拼接。写错会导致 404 或路径重复。
3.1 环境变量方式(可选)
如果你不想把 Key 明文写在 JSON 里,可以用环境变量。在启动 Gateway 前导出:
export TAOTOKEN_API_KEY="你的TaoToken密钥"然后配置里引用:
{ "auth": { "profiles": { "taotoken:default": { "provider": "openai-compatible", "mode": "api_key", "apiKeyEnv": "TAOTOKEN_API_KEY", "baseUrl": "https://taotoken.net/api" } } } }apiKeyEnv字段告诉 OpenClaw CN 从环境变量读 Key。这样配置文件可以进版本管理,Key 不进仓库。适合团队协作或者你有多台机器要同步配置的场景。
4. 端到端验证:确认请求落到目标模型
配置写完不算完,得验证请求真的经统一通道落到了目标模型。这一步分两段看:先确认 Gateway 侧消息路由正常,再确认 TaoToken 侧模型返回正常。
启动 Gateway 后,打开 Web 控制面板http://127.0.0.1:18789/,在对话框里发一条测试消息。为了能明确区分模型,建议用只有特定模型才知道的提问方式,或者直接问"你是什么模型"。不过更可靠的方式是看 Gateway 日志和 TaoToken 侧的请求记录。
先看 Gateway 日志。启动时加详细日志级别:
pnpm openclaw gateway --log-level debug发消息后,日志里会依次出现:收到入站消息、路由到 default Agent、Agent 循环开始、模型请求发出、收到模型响应、回复分发。你要确认"模型请求发出"这一段的 provider 是taotoken:default,model 是你配的deepseek/deepseek-chat。如果这里显示的还是旧的 provider 名,说明配置没加载,重启 Gateway。
再看 TaoToken 侧。登录控制台,在请求记录里应该能看到刚才那条请求,模型字段显示deepseek-chat,状态 200。如果 TaoToken 侧没有记录,说明请求根本没发到统一通道,问题在 OpenClaw CN 的 provider 配置;如果有记录但报错,问题在模型侧或 Key 权限。
用 curl 单独验证 TaoToken 通道是否通,这一步能排除 OpenClaw CN 的干扰:
curl -X POST https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer 你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "回复OK两个字母"}] }'返回里choices[0].message.content应该是OK。这一步通了,说明 Key 和通道没问题,剩下就是 OpenClaw CN 配置的事。
然后切换模型再验一次。把openclaw.json里的primary改成qwen/qwen-max,重启 Gateway,再发一条消息。TaoToken 控制台的请求记录里模型字段应该变成qwen-max。两次请求都走同一个 Key、同一个 Base URL,只有 model 字段不同。这就是统一 Key 多模型切换的完整验证。
如果你要验证 Agent 级别的模型隔离,给coding-agent发消息,确认它走的是 Qwen,而 default Agent 走 DeepSeek。在 Gateway 日志里能看到不同 agentId 对应的 model 字段不同。
提示:验证阶段建议把
--log-level debug开着,确认无误后再调回默认级别,避免日志过多影响性能。
4.1 一次完整的对话验证记录
我实测下来,从发消息到收到回复,Gateway 日志的关键行是这样的顺序:inbound message received→routing to agent: default→agent loop started→model request: provider=taotoken:default model=deepseek/deepseek-chat→model response received→reply dispatched。这六行齐了,说明整条链路通了。
如果卡在model request之后没有model response,去 TaoToken 控制台看请求记录。有记录但报 401,是 Key 问题;有记录但报 404,是模型 id 写错;没记录,是 OpenClaw CN 的 baseUrl 或 provider 配置问题。
5. 高频报错排查:401、local proxy failed、reading choices
这一节把几个真实会撞上的报错逐个拆开。每个报错我都给出定位路径和修复动作,你对照自己的日志找。
401 Unauthorized。这个最直接,Key 不对或没带上。先确认openclaw.json里apiKey字段填的是 TaoToken 的 Key,不是 DeepSeek 或 Qwen 的原始 Key。如果你用了apiKeyEnv,确认环境变量在启动 Gateway 的同一个 shell 里导出过。用上一节的 curl 单独测一次,curl 通而 OpenClaw CN 不通,说明是配置读取问题,检查 JSON 格式有没有语法错误,比如多了逗号或少了引号。JSON 语法错会导致整个 profile 加载失败,Gateway 日志里会有 parse error。
local proxy failed。这个报错通常出现在 Gateway 尝试连接模型端点时。先确认baseUrl是https://taotoken.net/api,没有多余后缀。然后确认你的机器能正常访问这个地址,用 curl 测一下连通性。如果 curl 也失败,检查本机网络和 DNS。如果 curl 通但 OpenClaw CN 报这个错,检查是不是配了额外的代理环境变量,比如HTTP_PROXY或HTTPS_PROXY,这些会干扰 OpenClaw CN 的出站请求。清掉这些环境变量再重启 Gateway。
reading choices 相关报错。典型形式是cannot read property 'choices' of undefined或reading 'choices'。这说明模型返回的响应结构不符合预期,OpenClaw CN 按 OpenAI 格式去取choices数组,但拿到的响应里没有这个字段。原因通常是模型 id 写错,TaoToken 返回了一个错误对象而不是正常的 chat completion 响应。去 TaoToken 控制台看那条请求的实际返回,如果返回里有error字段,按错误信息修模型 id。另一个可能是provider字段没写openai-compatible,导致 OpenClaw CN 用了错误的响应解析逻辑。
OAuth 相关报错。如果你在配置里误用了 OAuth 模式,会看到 token 获取失败之类的报错。TaoToken 走的是 API Key 模式,mode字段必须是api_key,不要写成oauth。检查auth.profiles下对应条目的mode值。
模型切换后不生效。改了primary但请求还是走旧模型。先确认 Gateway 重启了,配置是启动时加载的。然后确认改的是正确的 agent 配置块,agents.defaults.model.primary是默认 Agent,如果你给特定 agentId 配了覆盖,那个 Agent 会走自己的配置。最后看 Gateway 日志里model request那行的 model 字段,以日志为准。
Key 额度或权限问题。TaoToken 返回 403 或额度不足的提示。登录控制台确认 Key 状态和额度,确认这个 Key 有权限访问你请求的模型。有些 Key 可能只开了部分模型权限,请求未授权的模型会报错。
排查顺序建议固定成:先 curl 测 TaoToken 通道,再查 OpenClaw CN 配置 JSON 语法,再看 Gateway debug 日志的 model request 行,最后看 TaoToken 控制台请求记录。这个顺序能覆盖九成以上的问题,不用来回猜。
6. 把统一通道用起来:从验证到日常
配置和验证都过了之后,日常使用就是维护一份 Key 和一行 model id。想加新模型,先在 TaoToken 侧确认该模型可用,然后在openclaw.json里改primary字符串,重启 Gateway。不用新增 provider,不用管理多套鉴权。
如果你要长期跑编码类 Agent,建议把coding-agent单独配一个模型,比如 Qwen 的长上下文版本,default Agent 用 DeepSeek 的对话模型。两者共用 TaoToken profile,额度在控制台统一看。这样既做了模型隔离,又没增加 Key 管理成本。
接入文档和 API Key 管理在 TaoToken 控制台,模型对话调试可以用模型对话页面单独测模型可用性,长期编码和 Agent 场景可以看 Coding Plan。这几个入口按你的实际阶段选,排障和接入阶段先看 API Keys 和接入文档,验证模型阶段用模型对话,长期编码再上 Coding Plan。
最后留一个实用习惯:每次改完openclaw.json,先跑一次 curl 验证 TaoToken 通道,再重启 Gateway 看 debug 日志的 model request 行。两步确认,比直接发消息试错快得多。