:config.toml 骨架与连通性验证)
1. 为什么本地 vLLM 接 OpenClaw 总在 400 上翻车如果你已经在本地把 vLLM 跑起来了/v1/chat/completions用 curl 测普通对话也正常但一接进 OpenClaw 就报 400那这篇就是写给你的。OpenClaw 调用本地模型vLLM这件事卡点通常不在网络也不在 Key而在两个地方一是config.toml里 provider 的api类型和base_url写错二是 vLLM 启动时没开自动工具调用导致 OpenClaw 发过来的带tools字段的请求被服务端直接拒掉。我自己踩过的坑是普通聊天一路绿灯只要 OpenClaw 触发工具调用就 400access log 里只有一行strict/store ignored看着像警告其实是噪音真正的错误藏在响应体的message字段里。所以这篇不铺概念直接给你一份可复制的config.toml骨架再配三步验证启动 vLLM、填配置、发一次对话请求确认连通。适合已经有本地推理环境、想让 OpenClaw 走本地模型的开发者。文中会提到一次 TaoToken 作为统一 Key/API 通道的用法方便你在本地模型之外保留一条云端回退路径。2. 前置准备vLLM 服务与 OpenClaw 的对接关系先把两边的角色理清楚。vLLM 负责把本地权重比如 Qwen3-8B暴露成 OpenAI 兼容接口OpenClaw 则通过config.toml声明一个 provider指向这个接口。OpenClaw 不关心你本地怎么加载模型它只认base_url、model、api_key这三个字段以及api类型是不是openai-completions。这里有个容易忽略的点OpenClaw 在对话时可能带上tools和tool_choiceauto这是它做工具调用的正常行为。如果 vLLM 侧没开自动工具调用这个请求形态就和当前服务能力不匹配返回 400。所以配置分两半vLLM 启动参数要对OpenClaw 的config.toml也要对。如果你希望本地模型之外还有一条稳定的云端通道做回退可以在 TaoToken 上拿一个统一 Key官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 它的 API 地址是 https://taotoken.net/api 后面在config.toml里作为 fallback provider 填进去即可。本地优先、云端兜底这个组合在实测里比较省心。3. 可复制的 config.toml 骨架下面这份骨架你可以直接改。关键字段我都标了占位替换成你自己的值就行。注意base_url一定要带/v1api必须是openai-completionsmodel要和 vLLM 启动时的--served-model-name对齐。# OpenClaw 本地 vLLM provider 配置骨架 [models] mode merge [models.providers.vllm] base_url http://127.0.0.1:18000/v1 api_key VLLM_API_KEY api openai-completions [[models.providers.vllm.models]] id Qwen3-8B name Qwen3-8B reasoning false input [text] context_window 32768 max_tokens 8192 # 可选云端回退 provider走 TaoToken 统一通道 [models.providers.taotoken] base_url https://taotoken.net/api api_key TAOTOKEN_API_KEY api openai-completions [[models.providers.taotoken.models]] id claude-sonnet name claude-sonnet reasoning true input [text] context_window 200000 max_tokens 8192 [agents.defaults.model] primary vllm/Qwen3-8B fallback taotoken/claude-sonnet几个字段的取值逻辑说明一下。context_window必须写模型真实上下文Qwen3-8B 常见是 32768别照抄 128000虚高会直接触发context length exceeded。api_key如果本地 vLLM 没开鉴权随便填一个非空字符串即可但不能留空。primary用provider/model的格式fallback同理。如果你暂时不需要云端回退把taotoken那两段删掉只留primary也能跑。注意base_url里的 IP 和端口要和你 vLLM 实际监听的一致。用127.0.0.1还是局域网 IP取决于 OpenClaw 和 vLLM 是否在同一台机器。4. 三步验证从启动服务到确认连通4.1 第一步启动 vLLM 并开启自动工具调用启动命令里最关键的是--enable-auto-tool-choice和--tool-call-parser hermes这两个参数。少了它们OpenClaw 的工具调用请求就会 400。python3 -m vllm.entrypoints.openai.api_server \ --model /application/Qwen3-8B \ --served-model-name Qwen3-8B \ --host 0.0.0.0 \ --port 18000 \ --chat-template /application/qwen3_nonthinking.jinja \ --enable-auto-tool-choice \ --tool-call-parser hermes \ --gpu-memory-utilization 0.6 \ --max-num-batched-tokens 4096 \ --dtype float16启动后看到Uvicorn running on http://0.0.0.0:18000就说明服务起来了。--served-model-name的值要和config.toml里的id完全一致这里统一用Qwen3-8B。4.2 第二步填写配置并重启网关把第 3 节的config.toml放到 OpenClaw 的配置目录替换掉占位值。然后重启网关让配置生效openclaw gateway restart重启后可以用openclaw configure进交互界面确认一下选择 Local (this machine) - Model - vLLM检查 base URL、API key、model 三项是否和文件里一致。这一步是排查配置是否被正确加载的最快方式。4.3 第三步发一次对话请求确认连通先用 curl 直接打 vLLM确认服务本身没问题curl http://127.0.0.1:18000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer VLLM_API_KEY \ -d { model: Qwen3-8B, messages: [{role: user, content: 你好只回复OK}], max_tokens: 16 }返回里带content: OK就说明 vLLM 侧通了。再测一次带工具的请求验证自动工具调用是否生效curl http://127.0.0.1:18000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer VLLM_API_KEY \ -d { model: Qwen3-8B, messages: [{role: user, content: 北京现在多少度请调用工具}], tools: [{ type: function, function: { name: get_weather, description: 获取天气, parameters: { type: object, properties: {city: {type: string}}, required: [city] } } }], tool_choice: auto, max_tokens: 128 }如果这次返回里出现tool_calls字段说明工具调用链路是通的。最后在 OpenClaw 里发一条普通消息能正常回复就代表整条链路打通了。5. 本篇常见报错排查400 且日志只有 strict/store ignored这个 ignored 是噪音真正原因多半是 vLLM 没开自动工具调用。补上--enable-auto-tool-choice和--tool-call-parser hermes然后去看响应体的message字段别只盯 access log。普通 chat 成功tool 请求失败同样是自动工具调用没启用或者 chat template 不支持工具格式。优先检查启动参数和模板文件。context length exceeded 或 max_tokens 非法config.toml里的context_window和模型真实窗口不一致。改成 32768并适当缩短历史对话。model not found请求里的 model 名和--served-model-name没对齐。确认两边都是Qwen3-8B。连接被拒base_url的 IP 或端口写错或者 vLLM 没监听0.0.0.0。用curl先确认服务可达。提示把 vLLM 启动命令固化到 systemd 或 supervisor避免重启后漏掉工具调用参数。API Key 建议走环境变量不要明文写进配置文件。6. 后续接入与 Key 管理本地 vLLM 跑通之后如果你想让 OpenClaw 在本地模型不可用时自动切到云端或者需要统一管理多个模型的 Key可以在 TaoToken 控制台创建 API Key然后按第 3 节的taotokenprovider 填进config.toml。API Key 管理入口在 https://taotoken.net/console 接入文档在 https://taotoken.net/doc 模型对话调试可以用 https://taotoken.net/models 。长期跑编码类 Agent 任务的话Coding Plan 会更合适入口是 https://taotoken.net/coding-plan 。配置这件事最省时间的做法是先用 curl 把 vLLM 单独测通再动 OpenClaw 的配置。这样出问题时你能立刻判断是服务端还是客户端不用两头猜。