
1. 从 Ollama 本地直连到统一通道OpenClaw 配置改造的起点OpenClaw 是一个可自托管的 AI 网关与对话工作台它能对接 OpenAI 兼容接口、本地推理服务以及多家云端模型。Ollama 则是本地跑开源模型的常用工具一条ollama run就能把模型拉起来。很多人第一次把 OpenClaw 和 Ollama 接起来时图省事直接在配置里写死http://127.0.0.1:11434/v1本地跑得挺顺。可一旦你想同时用云端模型、想给团队里几个人分配不同的 Key、想让容器里的 OpenClaw 也能访问模型这套「本地直连」的写法就开始处处别扭。这篇内容聚焦一个具体动作修改 OpenClaw 对接 Ollama 的配置把模型地址、API Key、Base URL 从「本地写死」切换成「统一通道管理」。适合已经在用 OpenClaw、本地装过 Ollama、并且希望把多模型调用收敛到一套 Key 和一套 API 通道下的读者。我会给出可直接复制的docker-compose.yml、openclaw.json片段也会给出验证请求和真实会撞上的报错排查。核心检索词就是 OpenClaw 对接 Ollama 配置修改以及通过统一 Key 通道管理多模型调用。先说清楚为什么要改。Ollama 默认监听11434它的 OpenAI 兼容层路径是/v1本地调用不需要真实密钥随便填个ollama就能过。问题在于三点第一Docker 容器里的127.0.0.1指向容器自己不是宿主机所以容器部署必须换成host.docker.internal或局域网 IP第二本地模型名必须和ollama list完全一致差一个字符就报模型不存在第三当你同时想调云端模型时每个供应商一套 Base URL、一套 Key配置会迅速膨胀。统一通道的价值就在于Base URL 只写一个Key 只配一个模型 ID 用命名空间区分切换模型只改一个字符串。我试过把本地 Ollama 和云端模型混在同一个 OpenClaw 实例里跑最直接的感受是——配置文件的models.providers一旦超过两个供应商维护成本就上来了。所以下面会分两条线讲一条是保留 Ollama 本地直连的最小改动另一条是切换到统一通道后的写法。你可以先按本地直连跑通再决定要不要收敛到统一通道。2. TaoToken 前置准备统一 Key 与 API 通道是什么在动手改配置之前先把「统一通道」这件事讲明白。TaoToken 提供的是一个 OpenAI 兼容的 API 入口你可以把它理解成一个「模型调用的统一收银台」不管背后是哪个模型OpenClaw 这边只需要认一个 Base URL 和一个 API Key。这样做的好处是OpenClaw 的配置里不再散落多套凭证模型切换、额度查看、Key 轮换都在一个地方完成。你需要准备的东西不多一个可用的 API Key以及确认要用的模型 ID。API 入口是https://taotoken.net/api注意这个地址不带任何查询参数配置里就写这个。Key 的获取和查看在控制台的 API Keys 页面完成地址是https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。如果你还没决定用哪个模型可以先去模型对话页面实际发几条消息感受一下地址是https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。这里要强调一个容易混淆的点Ollama 本地直连时LLM_API_KEY填ollama只是占位服务端根本不校验但切换到统一通道后Key 是真实凭证填错会直接返回 401。所以配置改造时Key 这一项必须换成真实值不能沿用ollama这种占位字符串。另一个点是 Base URL 的路径Ollama 的兼容层是http://127.0.0.1:11434/v1而统一通道是https://taotoken.net/api两者结尾不同不要想当然地在后面补/v1具体以文档为准接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。如果你打算长期用 OpenClaw 做编码或 Agent 类任务可以考虑 Coding Plan它更适合高频、长时间的模型调用场景入口是https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。前置准备做到这里就够了一个 Key、一个 Base URL、一个模型 ID。接下来进入配置改造。3. 可复制配置docker-compose 与 openclaw.json 改造这一节是全文的操作核心分 Docker 部署和本地二进制安装两种场景。先讲 Docker因为这是最常见也最容易踩坑的部署方式。3.1 Docker 部署改 environment 段找到你之前的docker-compose.yml定位到environment部分。如果你还在用 Ollama 本地直连写法大致是这样environment: - TZAsia/Shanghai - LLM_PROVIDERopenai - LLM_BASE_URLhttp://host.docker.internal:11434/v1 - LLM_API_KEYollama - LLM_MODELdeepseek-coder:6.7b这里host.docker.internal是容器访问宿主机的固定地址Windows 和 Mac 的 Docker Desktop 自带这个解析Linux 需要额外在docker-compose.yml里加extra_hosts。LLM_API_KEY填ollama只是占位本地不校验。LLM_MODEL必须和ollama list里的名字完全一致。切换到统一通道后把这段改成environment: - TZAsia/Shanghai - LLM_PROVIDERopenai - LLM_BASE_URLhttps://taotoken.net/api - LLM_API_KEYsk-你的真实Key - LLM_MODEL你的模型ID改完重启容器docker-compose down docker-compose up -d注意LLM_BASE_URL结尾不要画蛇添足加/v1以接入文档为准。LLM_MODEL换成你在控制台确认过的模型 ID。3.2 本地二进制安装改 openclaw.json默认配置文件路径Linux/Mac 是~/.openclaw/openclaw.jsonWindows 是C:\Users\你的用户名\.openclaw\openclaw.json。改之前先备份cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak找到models.providers部分。Ollama 本地直连的写法是{ models: { providers: { ollama: { baseUrl: http://127.0.0.1:11434/v1, apiKey: ollama-local, api: openai-completions, models: [ { id: deepseek-coder:6.7b, name: DeepSeek Coder 6.7B } ] } }, defaultModel: ollama/deepseek-coder:6.7b } }切换到统一通道把 provider 换成统一入口{ models: { providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的真实Key, api: openai-completions, models: [ { id: 你的模型ID, name: 统一通道模型 } ] } }, defaultModel: taotoken/你的模型ID } }defaultModel的格式是provider名/模型IDprovider 名要和上面providers里的键一致。改完重启openclaw gateway restart3.3 UI 界面快速配置不想改文件的话浏览器打开http://localhost:8000或你的网关地址右上角设置 → 模型配置 → 添加。地址填https://taotoken.net/apiKey 填真实值模型名填你的模型 ID点测试连接成功后保存。UI 配置和文件配置本质是同一份数据改完文件刷新页面也能看到。4. 验证请求与成功结果确认通道真的通了配置改完不代表通了必须做连通性验证。分两步先确认模型侧可用再确认 OpenClaw 侧能拿到回复。第一步如果你还保留着 Ollama 本地服务先确认它本身是活的ollama list ollama run deepseek-coder:6.7b能进交互界面就说明本地模型没问题。但切换到统一通道后OpenClaw 不再依赖本地 Ollama这一步只是排除「本地服务挂了」这种干扰项。第二步直接用 curl 打统一通道确认 Key 和 Base URL 正确curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer sk-你的真实Key \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role: user, content: 你好}] }返回里能看到choices数组和message.content就说明通道是通的。如果这里就报 401问题在 Key报模型不存在问题在模型 ID。第三步回到 OpenClaw 里发一句「你好」。能正常回复就是对接成功。如果 OpenClaw 报错但 curl 正常问题多半在 OpenClaw 的配置解析上重点检查baseUrl结尾、defaultModel的 provider 前缀、以及 JSON 是否有语法错误。一个实用的排查技巧把 OpenClaw 的日志级别调高重启后看它实际请求的 URL 是什么。很多时候配置里写的是https://taotoken.net/api但代码里又拼了一层/v1导致 404。日志里能看到真实请求路径比猜快得多。5. 常见报错排查401、local proxy failed、reading choices这一节按真实会撞上的报错来对照。每个报错我都给出触发原因和修法。401 Unauthorized最常见。原因有三种——Key 填的是ollama这种占位符没换Key 复制时带了空格或换行Key 已失效。修法是重新从控制台复制注意不要带首尾空白。Docker 部署时environment里的值不要加引号包裹多余字符。local proxy failed / connection refused这个报错在 Docker 部署里高发。原因是容器里的127.0.0.1指向容器自身不是宿主机。如果你还在用 Ollama 本地直连把LLM_BASE_URL换成http://host.docker.internal:11434/v1Linux 上还要在 compose 里加extra_hosts: - host.docker.internal:host-gateway如果已经切到统一通道这个报错说明网络出口有问题检查容器能否访问外网。reading choices / choices 字段为空这个报错通常意味着请求发出去了但返回体结构不对。原因可能是 Base URL 多拼了/v1导致打到了错误路径或者模型 ID 写错导致服务端返回了错误对象。先用第 4 节的 curl 确认返回结构再回头核对配置。OAuth / 认证相关报错如果你在 OpenClaw 里同时配了需要 OAuth 的供应商注意统一通道用的是 Bearer Key不要混用 OAuth 流程。配置里api字段保持openai-completions即可。模型名不匹配Ollama 本地直连时模型名必须和ollama list完全一致deepseek-coder:6.7b和deepseek-coder:6.7B是两个不同的字符串。切到统一通道后模型 ID 以控制台或文档为准不要沿用本地名字。排查顺序建议固定下来先 curl 打通道 → 再查 OpenClaw 日志里的真实请求 URL → 最后核对配置文件语法。这个顺序能覆盖九成以上的问题。6. 把多模型调用收敛到一套 Key长期维护建议配置改通只是第一步真正省心的是后续维护。如果你只用一个模型本地直连和统一通道差别不大但当你开始同时用多个模型、或者团队里多人共用一套 OpenClaw 时统一通道的优势就出来了。第一Key 轮换只改一处。本地直连时每个供应商一套凭证轮换要改多个文件统一通道只有一个 Key改完重启即可。第二模型切换只改defaultModel一个字符串不用动 Base URL。第三额度查看集中在一个控制台不用分别登录各家后台。如果你打算把 OpenClaw 用在长期编码或 Agent 任务上建议把模型 ID 和 Key 通过环境变量注入而不是硬编码在openclaw.json里。这样配置文件可以进版本库凭证留在环境变量里安全性和可维护性都更好。Docker 部署天然支持这种写法本地安装也可以用.env文件配合。最后给一个实用技巧改配置前永远先备份openclaw.json.bak这个习惯能救你很多次。改完先用 curl 验证通道再重启 OpenClaw最后在界面里发消息确认。三步都过了再去做其他改动。需要查看 Key 或接入细节时控制台和文档这两个入口随时可用API Keys 在https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。