
1. 为什么要在 Docker 里跑 OpenClaw 并接本地模型OpenClaw 是一个可以自托管的 AI Agent 网关它本身不产出模型能力而是把「模型提供方」和「Agent 工作区」串起来。你在 Docker 里跑它最大的好处是环境隔离Node 版本、依赖、工作区目录都封在容器里宿主机不用装一堆运行时。而调用本地模型vLLM、llama.cpp、Ollama 这类提供 OpenAI 兼容接口的服务意味着推理不出内网数据留在自己机器上。但真正卡住大多数人的不是「怎么把容器拉起来」而是 Key 和 API 通道怎么配。本地模型服务通常没有鉴权或者只有一个随便填的占位 Key而 OpenClaw 的配置里又有apiKey、gateway.auth.token、baseUrl好几个看起来都像「密钥」的字段填错一个就是 401 或连接超时。这篇就围绕 OpenClaw Docker 部署调用本地模型这条链路把config.toml与settings.json的可复制骨架给出来同时说明 TaoToken 统一 Key / API 通道应该接在哪个位置最后附上容器内验证请求和日志排查动作目标是一次跑通。适合谁看已经装好 Docker、手上有一台跑着 OpenAI 兼容接口的本地模型服务、想让 OpenClaw 通过统一通道调用它的人。如果你还没有本地模型服务也可以先用 TaoToken 的模型对话通道验证配置骨架是否正确再切回本地地址。2. TaoToken 前置统一 Key 与 API 通道的接入位置先说清楚一个概念区分这是后面不踩坑的关键。OpenClaw 配置里有两类「Key」一类是模型提供方的 Key也就是models.providers.*.apiKey它是 OpenClaw 去请求模型服务时带的凭证。本地模型服务如果没开鉴权这里填任意字符串都能过如果开了鉴权就得填真实 Key。另一类是网关自身的登录 token也就是gateway.auth.token它是你打开 Web 控制台时输入的密码跟模型请求无关。TaoToken 在这里扮演的是「统一 Key / API 通道」的角色。它的价值在于当你同时要接本地模型和云端模型时不用为每个提供方维护一套地址和 Key而是把 OpenAI 兼容的请求统一走一个入口。TaoToken 的 API 地址是https://taotoken.net/api兼容 OpenAI 的/v1/chat/completions形态所以你可以在 OpenClaw 里把它当成一个 provider 来配baseUrl指向它apiKey填你在控制台生成的 Key。具体接入位置有两个第一个位置是models.providers里新增一个 provider比如叫taotokenbaseUrl写https://taotoken.net/api/v1apiKey写你的 TaoToken Keyapi写openai-completions。这样 OpenClaw 就能通过统一通道调用模型。第二个位置是当你想让本地模型和云端模型共存时用agents.defaults.model.primary指定默认走哪个其他作为备选。TaoToken 的 Key 在控制台的 API Keys 页面生成接入文档里有完整的请求示例。需要生成 Key 的话可以从这里进API Keys 页面在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。如果你只是想先验证模型通道通不通不急着配 OpenClaw可以直接用模型对话页面发一条消息试试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。注意本地模型服务的baseUrl必须是容器内能访问到的地址。如果你在宿主机上跑模型服务容器里写127.0.0.1是访问不到的得用宿主机在 Docker 网络里的 IP或者用host.docker.internalLinux 下需要额外加--add-host。3. 可复制配置config.toml 与 settings.json 骨架OpenClaw 的配置目录默认挂载在~/.openclaw容器内路径是/home/node/.openclaw。下面给两份骨架一份是 JSON 形态的openclaw.jsonOpenClaw 主配置一份是config.toml形态用于需要 TOML 的场景比如某些 Agent 工作区或工具链读取你可以按实际版本取用。先建目录mkdir -p ~/.openclaw3.1 openclaw.json 骨架本地模型 TaoToken 双通道{ models: { providers: { local-vllm: { baseUrl: http://192.168.12.99:8000/v1, apiKey: local-placeholder, api: openai-completions, models: [ { id: zai-org/GLM-4.7-Flash, name: GLM-4.7 Flash (local vLLM), contextWindow: 32768, maxTokens: 4096 } ] }, taotoken: { baseUrl: https://taotoken.net/api/v1, apiKey: sk-你的TaoTokenKey, api: openai-completions, models: [ { id: claude-sonnet-4-5, name: Claude Sonnet via TaoToken, contextWindow: 200000, maxTokens: 8192 } ] } } }, agents: { defaults: { model: { primary: local-vllm/zai-org/GLM-4.7-Flash, fallback: [taotoken/claude-sonnet-4-5] }, workspace: /home/node/.openclaw/workspace } }, gateway: { bind: lan, mode: local, port: 18789, auth: { mode: token, token: 换成你自己的随机长串token }, controlUi: { allowInsecureAuth: true, dangerouslyDisableDeviceAuth: true } } }几个字段的对应关系用表格说清楚字段作用本地模型怎么填TaoToken 怎么填baseUrl模型服务根地址容器内可达的IP:端口/v1https://taotoken.net/api/v1apiKey请求模型时的凭证无鉴权填占位串控制台生成的 Keyapi接口协议openai-completionsopenai-completionsmodels[].id模型 ID与本地服务实际 ID 一致与 TaoToken 支持的模型名一致primary默认模型provider/id格式同上gateway.auth.token控制台登录密码自定义随机长串同左与模型 Key 无关3.2 config.toml 骨架工具链读取用有些 Agent 工作区或外部工具会读 TOML 格式的配置骨架如下[gateway] bind lan mode local port 18789 [gateway.auth] mode token token 换成你自己的随机长串token [models.providers.local-vllm] baseUrl http://192.168.12.99:8000/v1 apiKey local-placeholder api openai-completions [[models.providers.local-vllm.models]] id zai-org/GLM-4.7-Flash name GLM-4.7 Flash (local vLLM) contextWindow 32768 maxTokens 4096 [models.providers.taotoken] baseUrl https://taotoken.net/api/v1 apiKey sk-你的TaoTokenKey api openai-completions [[models.providers.taotoken.models]] id claude-sonnet-4-5 name Claude Sonnet via TaoToken contextWindow 200000 maxTokens 8192 [agents.defaults.model] primary local-vllm/zai-org/GLM-4.7-Flash fallback [taotoken/claude-sonnet-4-5] [agents.defaults] workspace /home/node/.openclaw/workspace3.3 settings.json 骨架控制台侧偏好如果你用的是带控制台偏好的版本settings.json一般放在工作区目录下用来记录界面和会话偏好{ ui: { theme: dark, language: zh-CN }, session: { defaultProvider: local-vllm, defaultModel: zai-org/GLM-4.7-Flash, stream: true }, network: { timeoutMs: 120000, retry: 2 } }defaultProvider和defaultModel要和openclaw.json里的 provider 名、模型 ID 对齐否则控制台发消息时会提示找不到模型。4. 启动容器与验证请求配置写好后拉镜像并启动docker pull ghcr.io/openclaw/openclaw:latest docker run -d \ --name openclaw \ --restart unless-stopped \ -p 18789:18789 \ -v ~/.openclaw:/home/node/.openclaw \ ghcr.io/openclaw/openclaw:latest如果你的本地模型服务跑在宿主机上Linux 环境建议加一行 host 映射让容器能通过host.docker.internal访问宿主机docker run -d \ --name openclaw \ --restart unless-stopped \ --add-hosthost.docker.internal:host-gateway \ -p 18789:18789 \ -v ~/.openclaw:/home/node/.openclaw \ ghcr.io/openclaw/openclaw:latest启动后先看日志docker logs -f openclaw日志里出现监听端口和 gateway 就绪的信息说明容器起来了。接下来做两步验证。第一步在容器内直接请求本地模型确认网络通docker exec -it openclaw sh -c curl -s -X POST http://192.168.12.99:8000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer local-placeholder \ -d {\model\:\zai-org/GLM-4.7-Flash\,\messages\:[{\role\:\user\,\content\:\ping\}]} 如果返回里有choices字段和模型输出说明容器到本地模型的链路是通的。如果这里就失败问题在 Docker 网络或本地服务监听地址跟 OpenClaw 配置无关。第二步在容器内请求 TaoToken 通道确认统一 Key 生效docker exec -it openclaw sh -c curl -s -X POST https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的TaoTokenKey \ -d {\model\:\claude-sonnet-4-5\,\messages\:[{\role\:\user\,\content\:\ping\}]} 返回正常就说明 TaoToken 的 Key 和通道没问题。这一步能过OpenClaw 里配的taotokenprovider 基本也能过。第三步打开浏览器访问http://宿主机IP:18789输入gateway.auth.token里那串自定义 token进控制台发一条消息。请求会按primary指定的 provider 发出去。如果默认走本地模型你会在本地模型服务的日志里看到对应的请求记录。5. 本篇常见错排查5.1 EACCES: permission denied日志里出现EACCES: permission denied通常是容器内进程UID 1000写工作区目录时权限不够。宿主机上执行sudo chown -R 1000:1000 ~/.openclaw sudo chmod -R 755 ~/.openclaw docker restart openclaw5.2 401 Unauthorized分两种情况。如果报错来自本地模型服务检查models.providers.local-vllm.apiKey是否和服务端要求一致本地服务没开鉴权时有些实现仍然要求 Authorization 头存在填占位串即可。如果报错来自 TaoToken 通道检查 Key 是否复制完整、有没有多余空格以及baseUrl是不是https://taotoken.net/api/v1。5.3 connection refused / timeout容器内访问不到本地模型九成是地址问题。127.0.0.1在容器里指向容器自己不是宿主机。改用宿主机内网 IP或者用host.docker.internal并确认启动时加了--add-host。另外确认本地模型服务监听的是0.0.0.0而不是127.0.0.1否则外部访问不进来。5.4 模型 ID 不匹配控制台发消息提示找不到模型检查agents.defaults.model.primary的格式是不是provider名/模型id以及models[].id是否和本地服务实际暴露的 ID 完全一致。本地 vLLM 的模型 ID 通常带组织前缀比如zai-org/GLM-4.7-Flash少一段就对不上。5.5 改了配置不生效OpenClaw 读取的是挂载进容器的配置文件改完宿主机上的~/.openclaw/openclaw.json后需要重启容器docker restart openclaw如果重启后还是旧配置检查挂载路径有没有写错以及 JSON 有没有语法错误可以用python -m json.tool ~/.openclaw/openclaw.json校验。5.6 控制台登录不上gateway.auth.token是你自己设的不是模型 Key。如果忘了直接改配置文件里的这串值再重启容器。allowInsecureAuth和dangerouslyDisableDeviceAuth只在本地内网环境开别暴露到公网。6. 长期编码与 Agent 场景的通道选择如果你只是偶尔验证一下本地模型调用上面这套配置就够了。但如果你打算把 OpenClaw 当成日常编码助手或 Agent 网关长期跑模型通道的稳定性就变得重要——本地模型可能因为显存、重启、版本升级而短暂不可用这时候有个统一通道做 fallback 会省心很多。TaoToken 的 Coding Plan 就是为这种长期编码 / Agent 场景准备的它把模型调用统一到一个 Key 下OpenClaw 里只需要维护一个 provider 配置。入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。控制台可以管理 Key 和用量https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite。如果你用的是 Claude Code 这类工具链Anthropic 兼容通道的说明在https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite配置思路和上面 OpenClaw 的 provider 骨架是一致的baseUrl指向统一入口apiKey填统一 Key模型 ID 按文档填。回到 OpenClaw 本身我自己的做法是把本地模型设成primary处理日常轻量任务把 TaoToken 通道设成fallback兜底。这样本地服务重启时Agent 不会直接报错中断而是自动切到统一通道继续跑。配置骨架就是第 3 节里那份把fallback数组填上对应的provider/id即可。改完记得docker restart openclaw然后用第 4 节的容器内 curl 再验一遍两条通道确认都通再交给日常使用。