1. openclaw 接本地 lm_studio 的 glm-4.7-flash 到底卡在哪
openclaw 是一个把本地模型和远端模型统一编排的 Agent 框架,它本身不训练模型,只负责把请求按 provider 分发出去。lm_studio 则是本地跑推理的桌面服务,默认监听http://127.0.0.1:1234/v1,加载zai-org/glm-4.7-flash之后就能用 OpenAI 兼容协议对话。问题出在两者对接之后:你本地跑得好好的,一旦想切到远端通道,Key 就散落在 openclaw 配置、lm_studio 设置、环境变量三个地方,改一次要翻半天。
我遇到的具体场景是这样的:openclaw 的models段里写死了lmstudio这个 provider,baseUrl指向局域网里的http://192.168.56.1:1234/v1,模型 id 是zai-org/glm-4.7-flash。这套配置在纯本地时没问题,但一旦你想让同一个模型走远端通道,就得复制一份 provider,再手动改baseUrl和apiKey。更麻烦的是agents.defaults.model.primary里写的是lmstudio/zai-org/glm-4.7-flash,fallback 又指向zai/glm-4.7,切换时容易漏改一处导致请求打到错误端点。
这篇要解决的核心就一件事:把 openclaw 的请求 endpoint 统一改到 TaoToken 通道,让本地 lm_studio 和远端共用一套 Key 管理逻辑。适合已经在本地跑通 glm-4.7-flash、想加一层远端兜底或统一出口的开发者。下面从配置片段开始,一步步给出可复制的写法,最后用 curl 验证通道是否真的生效。
2. 前置准备:TaoToken 通道与 openclaw 的 provider 关系
在动手改配置之前,先把 TaoToken 在 openclaw 里的角色说清楚。openclaw 的 provider 本质是一个 OpenAI 兼容的 endpoint 描述,包含baseUrl、api、apiKey、models四个关键字段。TaoToken 提供的就是这样一个兼容 endpoint,你把它当成一个"远端 provider"填进去即可,不需要改 openclaw 的源码,也不需要动 lm_studio 的推理逻辑。
TaoToken 的 API 地址是https://taotoken.net/api,注意这里不带任何查询参数,直接作为baseUrl使用。Key 在控制台的 API Keys 页面生成,格式是一串以sk-开头的字符串。模型 id 沿用zai-org/glm-4.7-flash,这样 openclaw 里agents.defaults.model.primary不用改,只改 provider 的baseUrl和apiKey就能完成切换。
这里有个容易踩的坑:很多人以为要把 lm_studio 的baseUrl也改成 TaoToken,其实不用。lm_studio 继续跑本地推理,openclaw 只是多了一个 provider 指向 TaoToken。真正要统一的是 openclaw 这一层的 endpoint,lm_studio 保持原样即可。这样本地和远端就是两个并列的 provider,通过primary和fallbacks决定优先级。
如果你还没生成 Key,先去控制台建一个,然后到接入文档确认一下 OpenAI 兼容协议的路径是/v1/chat/completions。TaoToken 的 endpoint 拼出来就是https://taotoken.net/api/v1/chat/completions,这个完整地址在后面的 curl 验证里会用到。模型 id 建议先用zai-org/glm-4.7-flash试,确认通道通了再换其他模型。
3. 可复制配置:openclaw 的 models 与 agents 片段
下面这份配置是实测能跑通的版本,直接替换你 openclaw 配置文件里对应的models和agents段即可。核心改动是在providers里新增一个taotokenprovider,baseUrl指向https://taotoken.net/api,api保持openai-completions,apiKey填你控制台生成的 Key。原来的lmstudioprovider 保留不动,这样本地和远端可以随时切换。
{ "models": { "mode": "merge", "providers": { "lmstudio": { "baseUrl": "http://192.168.56.1:1234/v1", "api": "openai-completions", "models": [ { "id": "zai-org/glm-4.7-flash", "name": "zai-org/glm-4.7-flash", "reasoning": false, "input": ["text"], "cost": { "input": 15, "output": 60, "cacheRead": 2, "cacheWrite": 10 }, "contextWindow": 200000, "maxTokens": 8192 } ] }, "taotoken": { "baseUrl": "https://taotoken.net/api", "api": "openai-completions", "apiKey": "sk-你的TaoToken密钥", "models": [ { "id": "zai-org/glm-4.7-flash", "name": "zai-org/glm-4.7-flash", "reasoning": false, "input": ["text"], "contextWindow": 200000, "maxTokens": 8192 } ] } } }, "agents": { "defaults": { "model": { "primary": "taotoken/zai-org/glm-4.7-flash", "fallbacks": ["lmstudio/zai-org/glm-4.7-flash"] }, "models": { "taotoken/zai-org/glm-4.7-flash": { "alias": "GLM-Remote" }, "lmstudio/zai-org/glm-4.7-flash": { "alias": "GLM-Local" } }, "workspace": "C:\\Users\\Administrator\\clawd", "compaction": { "mode": "safeguard" }, "maxConcurrent": 4, "subagents": { "maxConcurrent": 8 } } } }几个关键点解释一下。primary改成taotoken/zai-org/glm-4.7-flash,意思是默认走 TaoToken 通道;fallbacks保留本地 lm_studio,这样远端不通时自动回落到本地,不会直接报错。models里的 alias 只是显示名,不影响路由,但建议写清楚,方便在日志里区分请求打到了哪个 provider。
如果你用的是 TOML 格式的配置,等价写法如下,字段名和 JSON 一致,只是语法不同:
[models] mode = "merge" [models.providers.lmstudio] baseUrl = "http://192.168.56.1:1234/v1" api = "openai-completions" [[models.providers.lmstudio.models]] id = "zai-org/glm-4.7-flash" name = "zai-org/glm-4.7-flash" reasoning = false input = ["text"] contextWindow = 200000 maxTokens = 8192 [models.providers.taotoken] baseUrl = "https://taotoken.net/api" api = "openai-completions" apiKey = "sk-你的TaoToken密钥" [[models.providers.taotoken.models]] id = "zai-org/glm-4.7-flash" name = "zai-org/glm-4.7-flash" reasoning = false input = ["text"] contextWindow = 200000 maxTokens = 8192 [agents.defaults.model] primary = "taotoken/zai-org/glm-4.7-flash" fallbacks = ["lmstudio/zai-org/glm-4.7-flash"]注意apiKey不要硬编码在版本控制里,生产环境建议用环境变量注入,openclaw 支持${TAOTOKEN_API_KEY}这种占位符写法。改完配置后重启 openclaw,让它重新加载 provider 列表。如果重启后primary还是指向旧的lmstudio,检查一下是不是有多个配置文件,openclaw 会按优先级合并,mode: merge下后加载的会覆盖前面的。
4. 验证请求:用 curl 确认 TaoToken 通道真的生效
配置改完不代表通道就通了,必须用一次真实请求验证。最直接的办法是绕过 openclaw,直接用 curl 打 TaoToken 的 endpoint,确认 Key 和模型 id 都对。命令如下:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -d '{ "model": "zai-org/glm-4.7-flash", "messages": [ { "role": "user", "content": "用一句话说明你是什么模型" } ], "max_tokens": 128 }'正常返回是一个 JSON,choices[0].message.content里会有模型回复,model字段回显zai-org/glm-4.7-flash。如果返回401,说明 Key 错了或没带Bearer前缀;如果返回404,多半是baseUrl拼错了,注意是https://taotoken.net/api后面接/v1/chat/completions,不要漏掉/api。
curl 通了之后,再回到 openclaw 里发一条消息,观察日志里 provider 的名字。如果日志显示taotoken/zai-org/glm-4.7-flash,说明路由生效;如果还是lmstudio,检查primary字段有没有改对。你也可以临时把primary改回lmstudio,对比两次请求的延迟和返回,确认两条通道都能用。
实测下来,TaoToken 通道的首次响应会比本地 lm_studio 慢一点,因为要走网络,但后续请求稳定。如果你只是本地开发,可以把primary设成本地,fallbacks设成 TaoToken,这样本地挂了才走远端,省流量。反过来,如果本地机器性能不够,就把primary设成 TaoToken,本地只做兜底。
5. 常见报错排查:401、local proxy failed 与 reading choices
对接过程中最容易碰到四类报错,逐个说清楚原因和改法。
第一类是401 Unauthorized。返回体里通常带invalid_api_key或missing authorization。原因就两个:Key 写错,或者请求头没带Bearer。检查 openclaw 配置里apiKey字段是不是完整的sk-开头字符串,有没有多余空格。如果是环境变量注入,确认变量名拼写和 shell 里echo $TAOTOKEN_API_KEY的输出一致。
第二类是local proxy failed或connection refused。这通常发生在primary指向本地 lm_studio,但 lm_studio 没启动,或者baseUrl里的 IP 变了。lm_studio 默认监听127.0.0.1:1234,如果你在配置里写了192.168.56.1:1234,要确认这个网卡地址在当前机器上存在。用curl http://192.168.56.1:1234/v1/models测一下,能列出模型列表才说明本地服务正常。
第三类是reading choices或unexpected end of JSON input。这是响应体解析失败,常见于 endpoint 返回了非 JSON 内容,比如 HTML 错误页。原因多半是baseUrl少写了/v1,或者 TaoToken 的地址写成了https://taotoken.net而漏了/api。正确写法是https://taotoken.net/api,openclaw 会自动补/v1/chat/completions。如果你手动拼完整地址,就是https://taotoken.net/api/v1/chat/completions。
第四类是 OAuth 相关的报错,比如OAuth token expired或refresh token failed。这类一般出现在你用 Claude Code 或 Codex 的 OAuth 流程时,和 TaoToken 的 API Key 是两套体系。如果你在 openclaw 里同时配了 OAuth provider 和 API Key provider,确认primary指向的是 API Key 那个,别混用。Codex 的auth.json里存的是 OAuth 凭证,和apiKey字段不冲突,但路由时要选对 provider。
排查顺序建议从 curl 开始:先确认 TaoToken 通道单独能通,再确认 lm_studio 单独能通,最后看 openclaw 的路由配置。这样能把问题定位到具体一层,不用在三个配置之间来回猜。
6. 统一出口之后:Key 管理与切换的实际收益
把 endpoint 统一到 TaoToken 之后,最直接的收益是 Key 只在一个地方管。以前本地 lm_studio 不需要 Key,远端要 Key,切换时得改配置;现在两个 provider 都在 openclaw 的models.providers里,Key 只出现在taotoken那一段,本地那段完全不用动。你要换 Key,只改一处;要加新模型,只在taotoken.models里加一条。
另一个收益是 fallback 变得可靠。primary和fallbacks都是 openclaw 原生支持的字段,不需要自己写重试逻辑。远端超时自动回落本地,本地没启动自动走远端,两边都挂才会报错。这种编排在纯本地或纯远端时都用不上,只有统一出口之后才有意义。
如果你后续要接 Claude Code 或 Cline 这类工具,思路是一样的:把它们的 Base URL 指向https://taotoken.net/api,Key 用同一个,Model ID 填zai-org/glm-4.7-flash。三件套(Base URL + Key + Model ID)对齐之后,所有工具共用一套凭证,不用每个工具单独配。需要长期跑编码任务或 Agent 的,可以到 Coding Plan 看一下额度方案;只是想验证模型对话的,直接用模型对话页面试就行。Key 在 API Keys 页面生成,接入细节看接入文档,地址都在上面。