1. 先搞清楚 openclaw、QQBOT、LMSTUDIO 三者在配置文件里的关系
openclaw 是一个把本地模型、云端模型、聊天渠道串起来的 Agent 运行框架,QQBOT 是它的一个渠道插件,LMSTUDIO 则是跑在你自己机器上的本地推理服务。很多人第一次配的时候会把三者混在一起写,结果启动后要么 QQBOT 不回消息,要么 LMSTUDIO 明明开着却报连接超时。核心原因就一个:渠道、模型、网关这三块在 config.toml 里是分开的,各管各的。
这篇聚焦的是配置文件怎么组织。我会给你一份可以直接抄的 config.toml 骨架,把 QQBOT 渠道、LMSTUDIO 本地模型、以及通过 TaoToken 统一 Key 走 API 通道这三件事拆开讲清楚,最后给一套启动后的连通性验证动作。适合已经在本地跑起 LMSTUDIO、手里有 QQBOT 应用凭证、想让 openclaw 同时吃本地模型和云端模型的人。
先说结论性的结构:channels.qqbot负责消息进出,models.providers负责模型来源,gateway负责本地控制面,plugins负责插件装载。TaoToken 在这里的角色是统一 Key 和 API 通道——你不需要给每个云端模型单独配一套鉴权,用一个 Key 走同一个 baseUrl 就能切换模型。官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。
2. TaoToken 前置:统一 Key 与 API 通道准备
在写 config.toml 之前,先把 TaoToken 这边的两样东西拿到手:API Key和baseUrl。API Key 在控制台的 API Keys 页面创建,地址是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。创建时给它起个能认出来的名字,比如openclaw-qqbot,方便后面在多个项目里区分。
baseUrl 统一用https://taotoken.net/api,注意这个地址后面不加 UTM 参数,它是给程序调用的,加了反而可能被当成非法路径。协议上它兼容 OpenAI 的chat/completions格式,所以 openclaw 里 provider 的api字段填openai-completions就能对接。
这里有个容易踩的点:TaoToken 的 Key 是统一 Key,意味着你配一个 provider 就能在里面挂多个模型 id,不用为每个模型建一个 provider。这跟 LMSTUDIO 那种本地单模型服务的思路不一样,后面配置里会体现出来。
注意:API Key 属于敏感凭证,不要写进会提交到公开仓库的文件里。本地调试可以用环境变量注入,或者至少把 config.toml 加进 .gitignore。
如果你还想在写配置前先确认某个模型 id 能不能调通,可以直接在模型对话页面手动发一条消息试试,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。确认能出结果了,再往 config.toml 里写,能省掉一轮排查。
3. 可复制的 config.toml 骨架
下面这份骨架把 QQBOT 渠道、LMSTUDIO 本地 provider、TaoToken 云端 provider 三块都放进去了。字段名和层级按 openclaw 的约定来,你可以直接复制后改成本机的值。
# openclaw config.toml 骨架 # 本地 LMSTUDIO + TaoToken 统一 Key + QQBOT 渠道 [meta] lastTouchedVersion = "2026.4.1" [auth] # TaoToken 统一 Key 走环境变量注入,避免明文落盘 # 在启动前 export TAOTOKEN_API_KEY=sk-xxxx defaultProfile = "taotoken:default" [auth.profiles."taotoken:default"] provider = "taotoken" mode = "api_key" apiKeyEnv = "TAOTOKEN_API_KEY" [models] mode = "merge" # ---- 本地 LMSTUDIO ---- [models.providers.local-model] baseUrl = "http://127.0.0.1:1234/v1" apiKey = "lmstudio" api = "openai-completions" [[models.providers.local-model.models]] id = "gemma-4-e4b" name = "gemma-4-e4b" api = "openai-completions" reasoning = false input = ["text"] contextWindow = 131072 maxTokens = 10000 [models.providers.local-model.models.cost] input = 0 output = 0 cacheRead = 0 cacheWrite = 0 # ---- TaoToken 云端统一通道 ---- [models.providers.taotoken] baseUrl = "https://taotoken.net/api" apiKeyEnv = "TAOTOKEN_API_KEY" api = "openai-completions" [[models.providers.taotoken.models]] id = "claude-sonnet-4-5" name = "claude-sonnet-4-5" api = "openai-completions" reasoning = true input = ["text"] contextWindow = 200000 maxTokens = 8192 [agents.defaults] workspace = "C:\\Users\\Administrator\\.openclaw\\workspace" [agents.defaults.model] primary = "local-model/gemma-4-e4b" [agents.defaults.models."local-model/gemma-4-e4b"] alias = "Local LLM" [agents.defaults.models."taotoken/claude-sonnet-4-5"] alias = "Cloud LLM" [agents.defaults.compaction] mode = "safeguard" [tools] profile = "coding" [tools.web.search] enabled = true provider = "kimi" [commands] native = "auto" nativeSkills = "auto" restart = true ownerDisplay = "raw" [session] dmScope = "per-channel-peer" # ---- QQBOT 渠道 ---- [channels.qqbot] enabled = true appId = "你的AppID" clientSecret = "你的ClientSecret" markdownSupport = true allowFrom = ["*"] [gateway] port = 18789 mode = "local" bind = "loopback" [gateway.auth] mode = "token" token = "换成你自己的随机串" [gateway.tailscale] mode = "off" resetOnExit = false [gateway.nodes] denyCommands = [ "camera.snap", "camera.clip", "screen.record", "contacts.add", "calendar.add", "reminders.add", "sms.send" ] [plugins.entries.qqbot] enabled = false [plugins.entries.openclaw-qqbot] enabled = true [plugins.installs.openclaw-qqbot] source = "npm" spec = "@tencent-connect/openclaw-qqbot" version = "1.6.7"几个关键点解释一下。models.mode = "merge"表示本地和云端 provider 合并进同一个模型池,agent 可以按provider/model的形式引用。auth.profiles里用apiKeyEnv而不是直接写apiKey,是为了让 TaoToken 的 Key 从环境变量读,避免明文。QQBOT 那块plugins.entries.qqbot.enabled = false同时openclaw-qqbot.enabled = true,是因为旧的内置 qqbot 入口和新插件会冲突,只留插件那个。
LMSTUDIO 的 baseUrl 我写的是http://127.0.0.1:1234/v1,这是 LMSTUDIO 默认端口。如果你改过端口,去 LMSTUDIO 的 Developer 面板看实际值。注意别写成局域网 IP 又忘了开监听,本地回环最稳。
4. 启动与连通性验证
配置写完,先别急着开 QQBOT。分三步验证,每步都能独立定位问题。
第一步,验证 LMSTUDIO 本身活着。在浏览器或 curl 里打它的模型列表接口:
curl http://127.0.0.1:1234/v1/models正常会返回一个 JSON,里面能看到你加载的模型 id,比如gemma-4-e4b。如果这里就报连接拒绝,说明 LMSTUDIO 没启动或者端口不对,跟 openclaw 无关,先把这步弄通。
第二步,验证 TaoToken 通道。用你的 Key 发一条最小请求:
curl https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "ping"}] }'返回里有choices字段就说明 Key 和通道都正常。如果返回 401,检查环境变量有没有 export 成功;返回 404 一般是模型 id 写错了,去模型对话页面核对一下。
第三步,启动 openclaw 并看网关状态。启动前确认环境变量已注入:
export TAOTOKEN_API_KEY=sk-你的key openclaw gateway start然后用网关的 token 查健康状态:
curl http://127.0.0.1:18789/health \ -H "Authorization: Bearer 你的gateway token"返回ok或类似状态就说明网关起来了。接着看 QQBOT 插件有没有连上,日志里会打印渠道注册信息。这时候去 QQ 里给机器人发一条消息,如果 agent 用的是local-model/gemma-4-e4b,回复会走本地 LMSTUDIO;把 primary 改成taotoken/claude-sonnet-4-5重启,回复就走云端通道。
实测下来,最容易卡住的是 QQBOT 的 appId 和 clientSecret 填错,表现是网关起来了但渠道一直重连。这时候看 openclaw 的日志,会明确提示鉴权失败,对着 QQ 开放平台的凭证重新复制一遍就行。
5. 本篇常见错排查
报错一:provider not found: taotoken。说明models.providers.taotoken这段没被解析到,常见原因是 TOML 层级写错,比如把[models.providers.taotoken]写成了[models.provider.taotoken]。TOML 对表名很敏感,少个 s 就找不到。
报错二:LMSTUDIO 返回model not found。config 里的模型 id 必须和 LMSTUDIO 实际加载的 id 完全一致,大小写也要对。你可以在 LMSTUDIO 界面复制模型名,别手打。
报错三:QQBOT 渠道 enabled 但收不到消息。先确认plugins.entries.openclaw-qqbot.enabled = true,再确认channels.qqbot.allowFrom没有把你的账号挡掉。["*"]是放行所有,调试阶段先用这个。
报错四:TaoToken 请求 401。九成是环境变量没生效。apiKeyEnv读的是进程启动时的环境变量,如果你在另一个终端 export 的,当前终端看不到。用echo $TAOTOKEN_API_KEY确认一下再启动。
报错五:网关端口被占。gateway.port默认 18789,如果被别的进程占了,启动会失败。换个端口,同时记得改验证命令里的端口号。
提示:排查时把 openclaw 日志级别调高,渠道和 provider 的初始化信息都会打出来,比猜快得多。
6. 后续怎么扩展这套配置
这套骨架跑通之后,扩展方向很直接。想加云端模型,就在models.providers.taotoken.models数组里追加一个[[...]]块,换个 id 就行,Key 和 baseUrl 不用动,这就是统一 Key 的好处。想加第二个本地模型,在 LMSTUDIO 里加载后同样往local-model.models里加一项。
如果你打算长期跑编码类 Agent,或者要让 QQBOT 承担比较重的任务,建议了解一下 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,它在长会话和工具调用场景下的配额更合适。接入细节和字段说明可以对照接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 核对,文档里对 provider 字段有完整列表。
最后留一个我自己的习惯:每次改完 config.toml,先跑一遍openclaw config validate(如果你的版本支持),再启动网关。配置文件这种一次性写对很难,验证命令能帮你把语法错误挡在启动之前,比启动后看一堆报错省事。