1. Openclaw 调用 deepseek 报 401 与 local proxy failed 的真实场景
你如果在 Openclaw 里把模型切到 deepseek,重启网关后看到401 Unauthorized,或者日志里冒出local proxy failed,大概率不是 Openclaw 本身坏了,而是auth.json里的 endpoint 和鉴权字段没对齐。Openclaw 这类 Agent 网关的鉴权链路比较绕:它先读auth.json决定往哪个 baseUrl 发请求,再用里面的 key 去换 token,最后才把请求转发给模型供应商。任何一环的字段名、路径、协议对不上,都会在网关层直接返回 401,而不是把错误透传给模型。
我试过在 Openclaw 里直接配 deepseek 官方地址,结果openclaw gateway restart之后第一次请求就 401。排查下来发现两个坑:一是auth.json里写的是apiKey,但 Openclaw 某些版本读的是api_key或token;二是baseUrl末尾多了/v1或少写了/v1,导致请求打到了错误的鉴权端点。local proxy failed则是网关本地代理启动失败,通常伴随端口占用或 auth 文件解析异常。
这篇面向的是已经在用 Openclaw、想接 deepseek 但被 401 卡住的人。核心检索词就是 Openclaw 接入 deepseek 的 401 报错排查,以及 auth.json 改到 TaoToken 统一 Key/API 通道。下面会给出可复制的 auth.json 片段、三步验证动作,以及真实报错对照表。你不需要懂 Openclaw 源码,跟着改字段、发一次最小请求就能确认鉴权是否通过。
先说清楚一个前提:Openclaw 的模型供应商配置和 auth.json 是两套东西。前者决定「用哪个模型、走什么协议」,后者决定「用什么身份、往哪个网关发」。很多人只改了openclaw config set models.providers.deepseek,却忘了 auth.json 还指向旧地址,于是 401 反复出现。把这两处对齐,问题基本就解决一半。
2. TaoToken 前置:统一 Key 与 API 通道的接入准备
在动手改 auth.json 之前,先把 TaoToken 这边的通道准备好。TaoToken 的作用是给你一个统一的 API 入口和 Key,Openclaw 只需要认这一个 endpoint,后面换模型、换供应商都不用再动 auth.json 的鉴权字段。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数,配置里写干净的这个就行。
你需要先拿到一个可用的 Key。进入控制台创建 API Key,路径是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,在 API Keys 页面生成。生成后复制那串sk-开头的字符串,后面 auth.json 里的鉴权字段就填它。如果你还没决定用哪个模型,可以先去模型对话页面试一下 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,确认 deepseek 系列能正常返回,再回到 Openclaw 配置。
这里要强调一个概念:TaoToken 是统一通道,不是让你绕过什么。它的价值在于把多家模型的鉴权收敛成一个 Key、一个 Base URL。Openclaw 的 auth.json 里只要写 TaoToken 的地址和 Key,模型 ID 写deepseek-chat或deepseek-reasoner,请求就会由 TaoToken 转发到对应模型。这样你以后换模型,只改models.providers里的 model id,auth.json 不用动,401 的概率大幅下降。
准备阶段还有一件事:确认 Openclaw 的版本和 auth.json 路径。不同版本路径不一样,常见的是~/.openclaw/auth.json或项目目录下的config/auth.json。你可以用openclaw config get看当前生效的配置,或者直接find ~ -name auth.json定位。找到之后先备份,这是第三步验证里「改前备份」的前提。备份命令很简单:cp auth.json auth.json.bak,出问题能一键回滚。
如果你用的是 Claude Code 或 Codex 这类工具,TaoToken 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各客户端的 Base URL 和字段对照。Openclaw 虽然不在列表里,但鉴权字段的命名逻辑是相通的,照着改不会错。长期跑编码 Agent 的话,可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,额度更稳,适合 Openclaw 这种会连续发请求的场景。
3. 可复制配置:把 auth.json 改到 TaoToken 的完整片段
现在进入正题,给出可复制的 auth.json 配置。假设你的 auth.json 原本长这样,指向 deepseek 官方:
{ "providers": { "deepseek": { "baseUrl": "https://api.deepseek.com/v1", "apiKey": "sk-你的deepseek官方key", "api": "openai-completions" } } }这个配置在 Openclaw 里容易触发 401,因为字段名和 endpoint 都可能和网关预期不一致。改成 TaoToken 统一通道后,片段如下:
{ "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "api": "openai-completions", "models": [ { "id": "deepseek-chat", "name": "DeepSeek Chat (V3)" }, { "id": "deepseek-reasoner", "name": "DeepSeek Reasoner (R1)" } ] } } }注意三个关键点。第一,baseUrl写https://taotoken.net/api,不要带/v1,也不要带 UTM 参数,Openclaw 会自己拼路径。第二,apiKey填 TaoToken 控制台生成的sk-Key,不要混用 deepseek 官方 Key。第三,api字段保持openai-completions,这是协议类型,不是模型名。如果你用的 Openclaw 版本读的是api_key而不是apiKey,两个都写上更保险:
{ "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "api_key": "sk-你的TaoTokenKey", "api": "openai-completions", "models": [ { "id": "deepseek-chat", "name": "DeepSeek Chat (V3)" }, { "id": "deepseek-reasoner", "name": "DeepSeek Reasoner (R1)" } ] } } }改完 auth.json 后,还要同步 Openclaw 的模型供应商配置。命令行执行:
openclaw config set models.providers.taotoken '{ "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "api": "openai-completions", "models": [ { "id": "deepseek-chat", "name": "DeepSeek Chat (V3)" }, { "id": "deepseek-reasoner", "name": "DeepSeek Reasoner (R1)" } ] }'然后设置默认模型:
openclaw config set agents.defaults.model.primary "taotoken/deepseek-chat"最后重启网关:
openclaw gateway restart如果你用的是 Codex 的auth.json结构,字段名可能是OPENAI_API_KEY和OPENAI_BASE_URL,对应改成:
{ "OPENAI_API_KEY": "sk-你的TaoTokenKey", "OPENAI_BASE_URL": "https://taotoken.net/api" }Cline MCP 或 CC Switch 的场景,三件套是 Base URL、Key、Model ID,缺一不可。Base URL 用https://taotoken.net/api,Key 用 TaoToken 的sk-,Model ID 用deepseek-chat。这三样对齐,401 基本不会出现。改配置时建议用jq校验 JSON 合法性,避免逗号或引号错误导致解析失败:
jq . auth.json没有报错说明格式正确,有报错就按提示修。这一步很多人跳过,结果local proxy failed其实是 JSON 解析失败引起的,不是网络问题。
4. 三步验证:改前备份、最小请求、状态码确认
配置改完不代表鉴权通过,必须做三步验证。第一步是改前备份,这个在上一节提过,但值得单独强调。执行:
cp ~/.openclaw/auth.json ~/.openclaw/auth.json.bak备份之后,任何改动都能用cp auth.json.bak auth.json回滚。我踩过的坑就是没备份,改错字段后连原来的配置都找不回来,只能重装。备份是成本最低的保险。
第二步是发起一次最小请求。不要一上来就跑完整 Agent 任务,先用 curl 直接打 TaoToken 的接口,确认 Key 和 Base URL 本身可用:
curl -s -o /dev/null -w "%{http_code}" \ https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 5 }'如果返回200,说明 TaoToken 通道和 Key 没问题,问题在 Openclaw 配置。如果返回401,说明 Key 无效或没带上,检查Authorization头。如果返回404,说明路径不对,确认是/api/v1/chat/completions而不是别的。这一步能把「通道问题」和「Openclaw 问题」分开,省很多排查时间。
第三步是用返回状态码确认鉴权通过。在 Openclaw 里发一次最小请求,观察日志:
openclaw gateway logs --follow然后另开终端触发一次对话:
openclaw chat --message "hello" --model taotoken/deepseek-chat日志里如果出现200或正常的流式返回,说明鉴权通过。如果还是401,看日志里具体是哪个字段被拒绝。常见的是 Openclaw 读的字段名和你写的不一致,比如它读token而你写了apiKey。这时候把apiKey、api_key、token三个都写上,重启网关再试。
local proxy failed的验证方式不同,它通常出现在网关启动阶段。执行openclaw gateway restart后如果看到这个错误,先检查端口占用:
lsof -i :你的网关端口有占用就杀掉或换端口。再检查 auth.json 是否能被解析:
python3 -m json.tool auth.json解析失败就是 JSON 格式问题,和鉴权无关。把这两个排除掉,local proxy failed基本能解决。
验证通过后,建议把最小请求的 curl 命令存成一个脚本,以后换 Key 或换模型时先跑一遍,确认通道可用再动 Openclaw 配置。这个习惯能帮你快速定位是通道问题还是客户端问题。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节对照真实报错,给出排查路径。第一个是401 Unauthorized。原因通常有三类:Key 无效、Key 没带上、endpoint 不对。排查顺序是先 curl 直连 TaoToken 确认 Key 可用,再检查 auth.json 里apiKey字段名是否被 Openclaw 识别,最后确认baseUrl是https://taotoken.net/api而不是带/v1或带 UTM 的地址。如果 curl 返回 200 但 Openclaw 返回 401,问题一定在 Openclaw 读取字段的方式上,把apiKey、api_key、token都写上。
第二个是local proxy failed。这个错误和鉴权无关,是网关本地代理启动失败。常见原因是端口被占用、auth.json 解析失败、或网关进程残留。排查命令:
openclaw gateway stop lsof -i :网关端口 python3 -m json.tool auth.json openclaw gateway start先停网关,查端口,验 JSON,再启动。如果 JSON 解析报错,按提示修逗号或引号。如果端口被占用,换端口或杀进程。这个错误解决后,401 可能还在,那是另一个问题,分开处理。
第三个是reading choices相关报错,通常写成error reading choices或cannot read choices。这说明请求发出去了,但返回结构不符合 Openclaw 预期。原因可能是api字段写错,比如写成了openai而不是openai-completions,或者模型 ID 不存在。确认api是openai-completions,模型 ID 是deepseek-chat或deepseek-reasoner。如果用的是 TaoToken 通道,模型 ID 要和 TaoToken 支持的列表一致,不要写 deepseek 官方的别名。
第四个是 OAuth 相关报错。Openclaw 某些版本支持 OAuth 鉴权,如果你在 auth.json 里混用了 OAuth 字段和 API Key 字段,会触发冲突。排查方式是确认 auth.json 里只有一种鉴权方式,要么全用apiKey,要么全用 OAuth 的access_token,不要混写。用 TaoToken 统一 Key 的场景,建议只保留apiKey和api_key,删掉 OAuth 相关字段。
下面用表格对照报错和排查动作:
| 报错 | 可能原因 | 排查动作 |
|---|---|---|
| 401 Unauthorized | Key 无效/字段名不对/endpoint 错 | curl 直连验证,检查 apiKey 字段名,确认 baseUrl |
| local proxy failed | 端口占用/JSON 解析失败/进程残留 | 停网关,查端口,验 JSON,重启 |
| reading choices | api 字段错/模型 ID 不存在 | 确认 api=openai-completions,模型 ID 用 deepseek-chat |
| OAuth 冲突 | 混用 OAuth 和 API Key 字段 | 只保留一种鉴权方式,删掉多余字段 |
排查时建议按顺序来:先 curl 确认通道,再验 JSON 格式,再看 Openclaw 日志字段名,最后查端口。这个顺序能避免在错误的方向上浪费时间。如果所有都试过还是 401,去 TaoToken 的接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 对照字段,或者重新生成一个 Key 排除 Key 本身的问题。
6. 语义一致 CTA:按场景选择接入入口
排查和接入相关的操作,统一走 API Keys 和接入文档。API Keys 在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,生成或重置 Key 都在这里。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各客户端的 Base URL 和字段对照,Openclaw 的 auth.json 字段命名可以参考。
如果你只是想验证模型能不能正常返回,用模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,发一条消息看响应,确认通道可用再回 Openclaw 配置。这个页面适合快速排除 Key 和通道问题。
长期跑编码 Agent、需要稳定额度的场景,看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Openclaw 这类工具会连续发请求,额度稳定比单次便宜更重要。Claude Code 或 Anthropic 相关接入,参考 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,字段逻辑和 Openclaw 相通。
最后给一个实用技巧:把 auth.json 的备份和 curl 验证脚本放在同一个目录,每次改配置先跑脚本。脚本内容就是第 4 节那段 curl,返回 200 再重启 Openclaw。这个习惯能让你在 401 出现时,三分钟内定位是通道问题还是客户端问题,不用反复重启网关试错。