☰
OpenClaw+Ollama+本地模型使用记录:WSL2 下 QQ 机器人接入 TaoToken 统一 Key 的配置与验证
2026/10/7 7:57:57 网站建设 项目流程

1. WSL2 里跑 OpenClaw + Ollama 的真实痛点:Key 分散、端点乱、QQ 机器人老掉线

如果你正在 WSL2 里折腾 OpenClaw 搭配 Ollama 本地模型,还想让它驱动一个 QQ 机器人,那你大概率已经踩过这几个坑:Ollama 的 11434 端口在 WSL 里监听、OpenClaw 的配置文件散落在~/.openclaw/下、QQ 机器人插件装到一半 npm 报错、模型一换就得改一堆 Base URL。更麻烦的是,当你既想用本地 qwen 模型、又想临时切到云端大模型做复杂推理时,Key 和端点会分散在好几个地方,改一次配置重启一次服务,调试成本极高。

这篇记录就是围绕这个场景展开的:在 Windows 11 + WSL2(Ubuntu)环境里,用 OpenClaw 作为 Agent 框架,Ollama 提供本地模型,QQ 机器人作为消息入口,同时把多模型调用的 Key 和端点统一收敛到 TaoToken 的 API 通道上。核心目标只有一个——让「本地模型 + 云端模型」的切换不再靠手改配置文件,而是通过一个统一的 Base URL 和一把 Key 完成。

先说清楚这套组合各自负责什么。Ollama 是本地模型运行时,负责把 qwen 这类模型跑在你的显卡上,WSL2 里通过http://localhost:11434暴露 OpenAI 兼容接口。OpenClaw 是 Agent 编排层,它读取~/.openclaw/下的配置,决定每次对话调用哪个模型、走哪个端点。QQ 机器人是消息通道,用户在 QQ 里发一句话,机器人把消息转给 OpenClaw,OpenClaw 再决定是走本地 Ollama 还是走云端 API。

问题就出在「走云端 API」这一步。OpenClaw 默认的模型配置里,每个 provider 都要单独填 Base URL 和 API Key。你如果同时接了 Ollama、某个云端模型、再加一个备用模型,配置文件里就会出现三套端点、三把 Key。一旦某把 Key 额度用完或者端点变动,你得挨个改。而 TaoToken 的作用,就是把这些云端模型的调用统一到一个入口:一把 Key、一个 Base URL,模型通过 Model ID 区分。这样 OpenClaw 里只需要维护一份云端配置,本地 Ollama 那份保持不动,切换时改 Model ID 就行。

适合谁看:已经在 WSL2 里装好 Ollama、能跑通ollama run的人;想让 QQ 机器人接入本地模型但被 Key 管理搞烦的人;以及想用 OpenClaw 做长期 Agent 任务、需要稳定端点的人。如果你还没装 WSL2,建议先把 Ubuntu 跑起来,后面的步骤才有意义。

2. TaoToken 前置准备:统一 Key 与 API 通道怎么拿、怎么放

在动 OpenClaw 配置之前,先把 TaoToken 这边的准备工作做完。这一步不复杂,但顺序别搞反,否则后面 auth.json 填错会一直报 401。

首先明确 TaoToken 在这套架构里的位置。它提供的是 OpenAI 兼容的 API 通道,也就是说任何支持自定义 Base URL 的客户端,都可以把请求打到 TaoToken 的端点上,由它转发到对应的模型。对 OpenClaw 来说,这意味着你不需要为每个云端模型单独配置 provider,只需要在配置里写一个 provider,Base URL 指向 TaoToken,Model ID 写你要用的模型名即可。

第一步,拿到 API Key。访问 TaoToken 的 API Keys 管理页面(deep link:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite),登录后创建一个新的 Key。建议按用途命名,比如openclaw-wsl2,方便后面排查是哪个客户端在用。创建后立刻复制,页面刷新后就看不到了。

第二步,确认 Base URL。TaoToken 的 API 端点是https://taotoken.net/api,注意这里不带任何路径后缀,OpenClaw 或 OpenAI SDK 会自动拼接/v1/chat/completions这类路径。如果你在配置里看到有人写https://taotoken.net/api/v1,那多半是重复拼接了,会导致 404。

第三步,确认你要用的 Model ID。TaoToken 支持的模型列表可以在模型对话页面(deep link:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite)查看。常见的有 claude 系列、gpt 系列等。记下你打算在 OpenClaw 里用的那个 Model ID,后面 auth.json 和 OpenClaw 配置里都要填一致。

第四步,理解「统一 Key」的含义。以前你可能在 OpenClaw 里配了三个 provider,每个都有自己的 Key。现在改成:只保留一个指向 TaoToken 的 provider,Key 用刚才创建的那把,Model ID 按需切换。本地 Ollama 的 provider 保持独立,因为它走的是http://localhost:11434,不经过 TaoToken。这样你的配置里最多两套端点:一套本地、一套云端统一入口。

这里有个容易忽略的点:WSL2 里的网络环境和 Windows 主机是隔离的,但localhost在 WSL2 里默认指向 WSL 自己。所以 Ollama 跑在 WSL 里时,OpenClaw 用http://localhost:11434是通的;但如果你把 Ollama 装在 Windows 主机上,WSL 里就要用主机的 IP。这篇记录默认 Ollama 装在 WSL 里,和 OpenClaw 同环境,省去网络转发的麻烦。

准备工作做完后,你手里应该有三样东西:一把 TaoToken API Key、一个 Base URLhttps://taotoken.net/api、一个确定的 Model ID。接下来进入配置环节。

3. 可复制配置:auth.json、OpenClaw provider 与 Ollama 端点对照

这一节是整篇的核心,所有配置片段都可以直接复制,但路径和字段名要和你本地的实际情况对齐。OpenClaw 的配置目录在 WSL 里是~/.openclaw/,其中auth.json负责存凭证,config.toml或settings.json负责存 provider 和模型路由。不同版本的 OpenClaw 配置文件格式可能略有差异,下面以常见的 auth.json + config 分离结构为例。

先看~/.openclaw/auth.json。这个文件存的是各个 provider 的 API Key,格式是 JSON。你要做的是把 TaoToken 的 Key 加进去,同时保留 Ollama 的本地配置(Ollama 通常不需要 Key,但有些版本要求占位):

{ "providers": { "taotoken": { "api_key": "sk-你的TaoTokenKey", "base_url": "https://taotoken.net/api" }, "ollama": { "api_key": "ollama", "base_url": "http://localhost:11434/v1" } } }

注意 Ollama 的 base_url 后面带了/v1,因为 Ollama 的 OpenAI 兼容接口路径是/v1/chat/completions。而 TaoToken 的 base_url 不带/v1,由客户端自动拼接。这两个不要写混,写混了就是 404 或 401。

接下来是 OpenClaw 的模型路由配置。假设你的配置文件是~/.openclaw/config.toml,那么 provider 和 model 的映射大概长这样:

[providers.taotoken] type = "openai" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" [providers.ollama] type = "openai" base_url = "http://localhost:11434/v1" api_key = "ollama" [models.local_qwen] provider = "ollama" model_id = "qwen3.5:27b" context_window = 32768 [models.cloud_reasoning] provider = "taotoken" model_id = "claude-3-5-sonnet" context_window = 200000 [agent] default_model = "local_qwen" fallback_model = "cloud_reasoning"

这里的关键设计是:本地模型和云端模型各占一个 model 条目,但它们指向不同的 provider。local_qwen走 Ollama,cloud_reasoning走 TaoToken。当你想切换时,只需要改default_model的值,或者用 OpenClaw 的/model指令临时切换,不用动 Key 和 Base URL。

如果你用的是settings.json格式,结构类似,只是语法变成 JSON:

{ "providers": { "taotoken": { "type": "openai", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey" }, "ollama": { "type": "openai", "baseUrl": "http://localhost:11434/v1", "apiKey": "ollama" } }, "models": { "local_qwen": { "provider": "ollama", "modelId": "qwen3.5:27b" }, "cloud_reasoning": { "provider": "taotoken", "modelId": "claude-3-5-sonnet" } }, "agent": { "defaultModel": "local_qwen" } }

配置写完后,建议用openclaw config validate检查一遍语法。如果 OpenClaw 版本没有这个命令,就直接启动服务看日志。启动命令通常是openclaw onboard --install-daemon或者openclaw start,具体看你安装时的提示。

还有一个细节:环境变量。如果你不想把 Key 明文写在 auth.json 里,可以用api_key_env字段引用环境变量。在 WSL 的~/.bashrc里加一行export TAOTOKEN_API_KEY="sk-你的Key",然后source ~/.bashrc。这样 auth.json 里只写变量名,Key 不落盘。对长期运行的机器人来说,这个做法更安全。

配置完成后,你的 OpenClaw 应该能同时看到local_qwen和cloud_reasoning两个模型。下一步就是验证请求是否真的通了。

4. 验证请求与成功结果:QQ 机器人收发消息、模型切换实测

配置写完不代表通了,必须实际发一条消息验证。这一节给出具体的验证动作和预期返回,你照着做就能判断哪一环出了问题。

先验证 Ollama 本地模型是否正常。在 WSL 终端里执行:

curl http://localhost:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3.5:27b", "messages": [{"role": "user", "content": "用一句话介绍你自己"}] }'

预期返回是一个 JSON,choices[0].message.content里有模型生成的文本。如果返回model not found,说明模型名写错了,用ollama list确认实际拉取的模型名。如果返回连接拒绝,说明 Ollama 服务没起来,执行ollama serve或检查 systemd 状态。

再验证 TaoToken 通道是否正常。同样用 curl:

curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "回复 OK 两个字母"}] }'

预期返回里choices[0].message.content包含OK。如果返回 401,说明 Key 错了或者没带Bearer前缀。如果返回 404,检查 Base URL 是不是多写了/v1。如果返回model not found,说明 Model ID 不在 TaoToken 的支持列表里,回模型对话页面确认。

两个通道都通了之后,启动 OpenClaw 服务,然后在 QQ 里给机器人发消息。第一次发消息时,OpenClaw 会用default_model指定的模型回复,也就是local_qwen。你可以在 QQ 里发一句「你现在用的是什么模型」,如果 OpenClaw 的 system prompt 里带了模型信息,它会告诉你。更可靠的方式是看 OpenClaw 的日志,日志里会打印每次请求走的 provider 和 model。

切换模型测试:在 QQ 里发送/model cloud_reasoning,然后再发一条需要推理的问题,比如「帮我分析一下这段代码的时间复杂度」。观察日志里 provider 是否变成了taotoken,以及返回速度是否比本地模型慢(云端通常有网络延迟)。如果切换后报错,大概率是 auth.json 里 TaoToken 的 Key 没被正确读取,检查环境变量是否 source 了。

QQ 机器人插件这块,安装时最容易卡在 npm 依赖上。如果你遇到npm install failed,按顺序执行这几条:

sudo apt update sudo apt install -y build-essential python3 sudo apt install -y git gnutls-bin sudo apt update sudo apt install --reinstall ca-certificates sudo update-ca-certificates

这几条的作用是补齐编译工具链和证书,很多 npm 原生模块编译失败都是因为缺 python3 或 build-essential。执行完再重新安装 QQ 机器人插件,成功率会高很多。

验证成功的标志有三个:QQ 里能收到机器人回复、OpenClaw 日志里能看到 provider 切换记录、curl 直接打 TaoToken 端点能返回内容。三个都满足,说明整条链路通了。

5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth 对照

这一节把我在配置过程中遇到的和社区里高频出现的报错集中列一下,每个都给出原因和修法。你遇到报错时可以直接对照。

401 Unauthorized。这是最常见的。原因通常有三个:Key 复制时带了空格、auth.json 里字段名写错(比如把api_key写成apikey)、环境变量没生效。排查方法:先用 curl 直接打 TaoToken 端点,如果 curl 也 401,说明 Key 本身有问题,回 API Keys 页面重新创建一把。如果 curl 通了但 OpenClaw 报 401,说明 OpenClaw 没读到正确的 Key,检查 auth.json 路径是否是~/.openclaw/auth.json,以及环境变量是否在启动 OpenClaw 的同一个 shell 里 source 过。

local proxy failed。这个报错通常出现在 OpenClaw 尝试通过本地代理转发请求时。原因可能是 OpenClaw 配置里开了 proxy 选项,但代理地址不可达。修法:检查 config 里有没有proxy或http_proxy相关字段,如果有,确认代理服务是否在运行。如果你没有用代理,直接删掉这些字段。另外,WSL2 里的localhost和 Windows 主机的localhost不是一回事,如果代理跑在 Windows 上,WSL 里要用主机 IP。

reading choices 报错。完整报错通常是error reading choices: unexpected end of JSON input或类似。这说明 OpenClaw 收到了响应,但响应体不是合法的 JSON。常见原因是 Base URL 写错导致返回了 HTML 错误页,或者模型返回了流式响应但客户端按非流式解析。修法:确认 Base URL 是https://taotoken.net/api而不是带/v1的版本;确认 OpenClaw 的 stream 配置和模型能力匹配。如果用的是 Ollama,确认/v1/chat/completions路径正确。

OAuth 相关报错。如果你在配置 QQ 机器人时看到 OAuth 字样,通常是机器人的鉴权流程没走完。QQ 机器人的创建和绑定需要在 QQ 开放平台完成,把网页提供的指令依次输入终端。如果中途断了,重新走一遍绑定流程。注意 OAuth token 有有效期,过期后需要重新授权。

Ollama 内存不足。报错类似model requires more system memory (19.2 GiB) than is available (18.2 GiB)。这是 WSL2 默认内存分配不够。修法:在 Windows 用户目录下创建.wslconfig文件,写入:

[wsl2] memory=24GB processors=8

然后wsl --shutdown重启 WSL。内存大小根据你主机实际内存调整,建议给 WSL 分配不超过主机内存的 70%。

模型切换后没生效。如果你在 QQ 里发了/model cloud_reasoning但日志里还是走本地模型,检查 OpenClaw 的会话是否持久化了模型选择。有些版本的/model指令只对当前会话生效,新会话会回到 default_model。另外确认cloud_reasoning这个 model 名在 config 里拼写一致,大小写敏感。

QQ 机器人插件安装失败。除了前面提到的 build-essential 和证书问题,还有一个常见原因是 npm 源的问题。可以尝试npm config set registry https://registry.npmmirror.com切换镜像源,再重新安装。如果还是失败,看具体报错是哪个包编译不过,单独装那个包的依赖。

排查的核心思路是分层:先确认 Ollama 本地通、再确认 TaoToken 云端通、最后确认 OpenClaw 能读到配置。每一层都用 curl 或日志验证,不要跳步。

6. 长期跑 Agent 的配置建议与统一 Key 的接入入口

如果你只是临时玩一下,前面的配置够用了。但如果你打算让这个 QQ 机器人长期跑着,做日常的 Agent 任务,有几个地方值得再优化一下。

第一,把 Key 从明文改成环境变量。前面提过api_key_env的用法,长期运行时建议所有云端 Key 都走环境变量,auth.json 里只留变量名。这样即使配置文件被误传,Key 也不会泄露。WSL 里可以把 export 写进~/.bashrc,但注意 OpenClaw 如果以 daemon 方式启动,可能不会加载.bashrc,需要在 systemd service 文件里显式声明Environment=。

第二,给模型切换加个默认回退。OpenClaw 的fallback_model字段可以在主模型不可用时自动切换。比如你默认用本地 qwen,但本地模型因为显存不足挂了,fallback 到 TaoToken 的云端模型,机器人不会直接失联。这个配置在长期运行场景下很实用。

第三,定期检查 TaoToken 的额度。统一 Key 的好处是管理方便,但坏处是一把 Key 挂了所有云端模型都不能用。建议在 TaoToken 控制台设置额度提醒,或者用 API 定期查余额。控制台入口在https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite。

第四,如果你后面要接更多模型,比如想在 QQ 机器人里同时支持代码生成和日常对话,可以按用途拆多个 model 条目,但都指向同一个 TaoToken provider。这样 Key 还是一把,只是 Model ID 不同。OpenClaw 的/model指令可以让你在 QQ 里直接切换,不用重启服务。

第五,关于 Coding Plan。如果你用 OpenClaw 做的是长期编码类 Agent 任务,比如自动改代码、跑测试、提交 PR,那可以考虑 TaoToken 的 Coding Plan(deep link:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite)。它针对高频编码场景做了额度优化,比按量计费更适合长期跑。接入方式和普通 API 一样,Base URL 和 Key 不变,只是计费模式不同。

最后说一个实际经验:WSL2 的休眠和恢复有时会导致 Ollama 服务断掉,表现为 QQ 机器人突然不回消息。可以在 WSL 里加一个简单的健康检查脚本,定时 curl 一下http://localhost:11434/v1/models,不通就重启 Ollama。这个脚本用 cron 或 systemd timer 跑都行,几行 bash 就够。

整套配置的核心思路就是「本地归本地、云端归云端、云端统一入口」。Ollama 负责本地推理,TaoToken 负责云端模型的统一 Key 和端点,OpenClaw 负责路由,QQ 机器人负责消息通道。四者各司其职,切换模型时只改 Model ID,不动 Key 和 Base URL。这样你后面无论加多少模型,配置复杂度都不会线性增长。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询