1. 极空间 NAS 上 OpenClaw 对接 Ollama 的真实困境
先说结论:极空间 NAS 上用 Docker 跑 Ollama,再让 OpenClaw 走本地大模型,这条路是通的,但坑集中在两个地方——服务发现和鉴权配置。我前后折腾了三个晚上,把能踩的坑基本踩了一遍,这篇记录就是给同样想在 NAS 上"养虾"又不想烧云端 token 的朋友一个可复制的路径。
极空间的应用商店里其实已经集成了 Ollama 和 OpenClaw,但商店版本的 OpenClaw 对 Ollama 的原生支持不够友好,我试过直接在openclaw.json里手写模型地址,容器起不来,日志里也没给出明确原因。所以最终方案是:Ollama 用商店版(省事,版本也够新),OpenClaw 用 Docker 部署官方最新镜像,两者通过 NAS 内网地址通信。
这里有个关键认知:NAS 上的 Ollama 容器和 OpenClaw 容器虽然都在同一台机器上,但它们默认不在同一个 Docker 网络里,容器名互相解析不了。所以 Base URL 不能写http://ollama:11434,必须写 NAS 的局域网 IP 加映射端口。这一点如果没意识到,会一直卡在连接超时上。
另一个容易被忽略的是鉴权。Ollama 默认不校验 API Key,但 OpenClaw 的配置向导里会要求填一个 Key,随便填一个非空字符串即可,留空反而可能触发校验失败。这个细节官方文档没写,是我对着报错日志试出来的。
适合谁看:手里有极空间 Z423 或同级别 NAS(至少 16GB 内存、能跑 7B 量化模型)、已经装好 Docker、想让 OpenClaw 在本地模型和云端模型之间灵活切换的人。如果你只是想体验一下,不想折腾 Docker 网络,那商店版凑合用也行,但功能会受限。
2. TaoToken 前置准备:让 OpenClaw 的模型调用有统一出口
在正式配置之前,需要先把 TaoToken 这一层准备好。它的作用不是替代 Ollama,而是给 OpenClaw 提供一个统一的模型接入层——本地模型走 Ollama,云端模型走 TaoToken,两边在 OpenClaw 里用同一套配置格式管理,切换的时候不用改底层代码。
我试过直接在 OpenClaw 里硬编码 Ollama 地址,能用,但一旦想加云端模型做兜底,配置就会变得很乱。TaoToken 的价值在于把"模型来源"抽象成 Base URL + Key + Model ID 三件套,本地和云端只是这三件套的值不同。
具体操作:先到 TaoToken 官网注册账号,然后进控制台创建 API Key。这个 Key 在后续配置 OpenClaw 的云端模型时会用到。如果你只打算用本地 Ollama,这一步可以跳过,但建议还是备着,因为 OpenClaw 的某些 Agent 功能在本地模型上跑不动,需要云端模型兜底。
TaoToken 的 API 地址是https://taotoken.net/api,这个地址在 OpenClaw 的配置里会作为云端模型的 Base URL。注意不要加多余的路径,OpenClaw 会自己拼接/v1/chat/completions这类端点。
模型 ID 方面,TaoToken 支持主流云端模型,具体列表可以在控制台查看。我常用的是 Claude 系列做复杂推理,本地 Ollama 跑 qwen2.5:7b 做日常对话,两者在 OpenClaw 里通过model命令切换。
这里要提醒一点:TaoToken 的 Key 不要写进 OpenClaw 的公开配置文件里,尤其是如果你把 NAS 的 Web UI 暴露在公网。建议用环境变量或者 OpenClaw 的密钥管理功能。我自己的做法是在 Docker Compose 里通过env_file注入,配置文件里只写变量名。
另外,TaoToken 的 Coding Plan 适合长期跑 Agent 任务的场景,如果你打算让 OpenClaw 做代码生成或者自动化流程,可以考虑。普通对话用按量计费就够了。
3. 可复制配置:Docker Compose 与 OpenClaw 模型设置
这一节是核心,直接给可复制的配置片段。先确认你的 Ollama 容器已经在运行,并且端口映射到了 NAS 宿主机。极空间商店版 Ollama 默认端口是 11434,但如果你改过,以实际为准。
在极空间的 Docker 管理里,找到 Ollama 容器,确认它的端口映射。然后在 OpenClaw 的 Docker Compose 文件里,确保两个容器在同一个自定义网络下,或者直接用 NAS 的局域网 IP 通信。我推荐后者,简单直接。
OpenClaw 的 Docker Compose 片段如下,注意替换NAS_IP和OLLAMA_PORT:
version: "3.8" services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "3000:3000" environment: - OPENCLAW_GATEWAY_MODE=local - TAOTOKEN_API_KEY=${TAOTOKEN_API_KEY} volumes: - ./openclaw-data:/home/node/.openclaw extra_hosts: - "host.docker.internal:host-gateway"extra_hosts这一行是关键,它让容器内可以通过host.docker.internal访问宿主机,也就是 NAS 本身。这样 Ollama 的 Base URL 就可以写成http://host.docker.internal:11434/v1,不用硬编码 IP,换网络环境也不用改。
如果你更习惯用 IP,把host.docker.internal换成 NAS 的局域网 IP 即可,比如http://192.168.1.100:11434/v1。注意末尾的/v1不能少,Ollama 的 OpenAI 兼容接口就在这个路径下。
接下来是 OpenClaw 的模型配置。进入 OpenClaw 容器终端,执行:
su node stty rows 40 cols 120 openclaw configure向导会依次问几个问题。网关位置选Local。配置项选Model。模型提供商选Ollama。然后:
- Ollama Base URL:
http://host.docker.internal:11434/v1 - Ollama mode:
Local - Models in/model picker:选
ollama-local/qwen2.5:7b
配置完成后选Continue,然后执行openclaw gateway restart。
如果你还想加 TaoToken 的云端模型作为兜底,在同一个配置向导里选Custom或OpenAI Compatible,填:
- Base URL:
https://taotoken.net/api - API Key:你的 TaoToken Key
- Model ID:比如
claude-3-5-sonnet(以控制台实际为准)
这样 OpenClaw 里就有两个模型可选,用model命令切换。
4. 验证请求:curl 检查模型列表与对话连通性
配置完别急着在 Web UI 里试,先用 curl 确认 Ollama 的接口是通的。在 NAS 的 SSH 终端里执行:
curl http://localhost:11434/v1/models如果返回 JSON 列表,包含qwen2.5:7b和llama3:latest,说明 Ollama 的 OpenAI 兼容接口正常。如果返回 404,检查端口和/v1路径。
然后测试对话接口:
curl http://localhost:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:7b", "messages": [{"role": "user", "content": "你好,用一句话介绍你自己"}], "stream": false }'正常会返回一个 JSON,choices[0].message.content里就是模型的回答。如果返回model not found,说明模型名写错了,用ollama list确认实际名称。
接下来验证 OpenClaw 容器内能否访问到 Ollama。进入 OpenClaw 容器终端:
docker exec -it openclaw bash curl http://host.docker.internal:11434/v1/models如果这一步不通,说明extra_hosts没生效,或者 NAS 的防火墙拦了。极空间的 Docker 网络有时候会有隔离,检查一下容器是否在同一个 bridge 网络下。
最后在 OpenClaw 的 Web UI 里发一条消息,观察响应。如果模型显示为ollama-local/qwen2.5:7b,但回答内容明显是云端模型的风格,说明配置没生效,需要重新跑openclaw configure并确认保存。
实测下来,qwen2.5:7b 在极空间 Z423 上的直连速度大约 4.7 tokens/s,通过 OpenClaw 会降到 2-3 tokens/s,因为多了一层代理开销。简单问答可以接受,复杂任务建议切云端模型。
5. 本篇常见错排查:401、local proxy failed 与 reading choices
这一节列几个我实际遇到的报错和解决方式。
报错一:401 Unauthorized
如果你在 OpenClaw 里配了 TaoToken 的云端模型,但 Key 填错或者过期,会返回 401。检查TAOTOKEN_API_KEY环境变量是否注入成功,在容器内执行echo $TAOTOKEN_API_KEY确认。如果为空,检查 Docker Compose 的env_file路径。
报错二:local proxy failed
这个报错通常出现在 OpenClaw 尝试连接 Ollama 但网络不通的时候。先确认host.docker.internal能否解析,在容器内执行ping host.docker.internal。如果不通,把 Base URL 换成 NAS 的局域网 IP。另外检查 Ollama 容器是否在运行,端口是否被占用。
报错三:reading choices 时出错
这个报错说明请求发出去了,但返回的 JSON 结构不符合 OpenClaw 的预期。常见原因是 Ollama 的版本太旧,OpenAI 兼容接口的返回格式有差异。极空间商店版 Ollama 是 0.18.3,支持得比较好。如果你是自己拉的旧版镜像,建议升级。
报错四:OAuth 相关错误
如果你在 OpenClaw 里配置了需要 OAuth 的云端模型,但没完成授权流程,会卡在这里。TaoToken 的 API Key 模式不需要 OAuth,直接填 Key 即可。如果用的是其他需要 OAuth 的服务,按提示完成授权。
报错五:模型切换后不生效
OpenClaw 的模型配置有时候会缓存,改完配置后必须执行openclaw gateway restart。如果还不生效,检查openclaw.json里是否有多个模型配置冲突。建议在配置向导里操作,不要手改文件。
另外,如果你在 OpenClaw 里同时配了 Ollama 和 TaoToken,切换模型用model ollama-local/qwen2.5:7b或model claude-3-5-sonnet。切换后发一条测试消息确认。
6. 长期使用建议与 CTA
本地模型跑日常对话,云端模型做复杂任务,这个组合在 NAS 上是最实用的。Ollama 的 qwen2.5:7b 中文能力够用,但推理深度有限,遇到需要多步思考的问题,切到 TaoToken 的云端模型会顺畅很多。
如果你打算长期跑 Agent 任务,比如让 OpenClaw 自动处理文件或者定时执行脚本,建议用 TaoToken 的 Coding Plan,额度更划算。API Key 在控制台创建,接入文档里有详细的 Base URL 和 Model ID 说明。
模型对话功能可以在 TaoToken 的模型对话页面直接测试,确认 Key 和模型 ID 没问题再写进 OpenClaw 配置。这样排错的时候能快速定位是 TaoToken 侧的问题还是 OpenClaw 侧的问题。
最后提醒一点:NAS 的散热和功耗要考虑。Ollama 跑推理时 CPU 占用会飙升,极空间 Z423 的散热还行,但长时间高负载建议加个风扇。如果只是偶尔用,问题不大。