1. 为什么自定义 Provider 总是配一半就卡住OpenClaw 支持接入兼容 OpenAI 协议的自建 Model Provider这件事本身不复杂真正让人头疼的是配置的碎片化Provider 连接信息写在一处模型 allowlist 写在另一处默认模型又是第三个字段。手动改settings.json或openclaw.json时只要漏掉 allowlist聊天窗口的/model命令和 model picker 就看不到任何模型你会以为接入失败了其实只是没注册。这篇面向已经用 OpenClaw 接过自建 Provider 的开发者聚焦一件事把一键配置脚本真正跑通。我会给出可复制的settings.json骨架、Provider 字段映射关系、最小验证动作启动加载、请求回显、日志确认以及几个高频报错的排查路径。目标是一次跑通而不是反复重启试错。如果你还没有可用的兼容 OpenAI 协议后端可以先用 TaoToken 的 API 作为练手端点它的接口形态和自建 Provider 一致方便你先验证脚本逻辑再换成自己的地址。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。核心检索词先明确OpenClaw 自定义 Model Provider 一键配置脚本本质是用 Bash jq 拉取/models列表然后一次性写入 Provider、allowlist、默认模型三处配置。适合谁适合已经装好 OpenClaw、手里有一个兼容 OpenAI 协议端点、但不想每次手动改 JSON 的开发者。2. TaoToken 作为前置练手端点在动脚本之前先确认你的端点能正常返回模型列表。这一步用 curl 就能验证不需要 OpenClaw 参与。我习惯先拿 TaoToken 试因为它的/models返回结构是标准的{data: [...]}和大多数自建 Provider 一致。先准备 API Key。进入控制台创建密钥地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 密钥管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建后复制出来后面脚本会用到。验证端点连通性export TT_KEY你的API Key curl -sS -f --connect-timeout 15 \ -H Authorization: Bearer $TT_KEY \ -H Content-Type: application/json \ https://taotoken.net/api/v1/models | jq .data | length如果返回一个数字说明端点、鉴权、模型列表三件事都通了。如果报 401检查 Key 是否复制完整如果报连接超时检查网络出口是否允许访问该域名。这一步过了再进脚本环节能省掉一半排障时间。想先在对话界面确认模型可用可以打开模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 手动发一条消息看回显。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 字段说明和错误码都在里面。3. settings.json 可复制骨架与字段映射OpenClaw 的配置实际落在~/.openclaw/openclaw.json但很多同学习惯叫它settings.json这里统一按实际路径讲。脚本会改三个位置先把骨架贴出来你对照自己的文件看差异。{ models: { providers: { icompify: { baseUrl: https://taotoken.net/api/v1, apiKey: sk-xxxxxxxx, api: openai-completions, models: [ { id: kimi-k2.6, name: kimi-k2.6, input: [text, image], contextWindow: 262144, contextTokens: 262144, maxTokens: 65536, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 } } ] } } }, agents: { defaults: { models: { icompify/kimi-k2.6: { alias: kimi-k2.6 } }, model: { primary: icompify/kimi-k2.6 } } } }字段映射关系是排障的关键逐条对照配置路径作用漏配后果models.providers.id.baseUrlProvider 请求基址请求 404 或连不上models.providers.id.apiKeyBearer 鉴权401 未授权models.providers.id.api协议类型固定openai-completions请求体格式不匹配models.providers.id.models[]该 Provider 下全部模型模型列表为空agents.defaults.models聊天窗口可见的 allowlist/model和 picker 看不到模型agents.defaults.model.primary全局默认模型启动后无默认模型可用最容易踩的坑是Provider 里写了 5 个模型但 allowlist 只注册了 1 个结果聊天窗口只显示 1 个。脚本里 allowlist 用--merge合并就是为了避免覆盖其他 Provider 的条目。注意apiKey在openclaw.json里是明文存储文件权限建议保持600。脚本不会把 Key 打印到终端但你自己cat文件时要注意别贴到公开场合。4. 一键配置脚本落地与执行脚本路径按你的习惯放示例用/home/linuxbrew/skill/init-openclaw-model.sh。依赖只有三个curl拉模型列表、jq解析构建 JSON、openclaw写配置。缺jq脚本会直接报错退出先装# Debian/Ubuntu apt install -y curl jq # RHEL/CentOS yum install -y curl jq脚本核心逻辑分四步拉取${API_URL}/models、解析模型列表、构建 Provider 配置含全部模型、写入三处配置。执行方式bash /home/linuxbrew/skill/init-openclaw-model.sh交互过程会依次问你 API URL、API Key、默认模型编号、contextWindow、maxTokens。URL 直接回车用默认值Key 输入时不显示。跑完后终端会打印 Provider 模型数、allowlist 注册数、当前默认模型和可用模型列表。写入动作对应三条命令理解它们比记脚本更重要# 1. 写 Provider已存在则 --replace openclaw config set models.providers.icompify $PROVIDER_JSON --strict-json --replace # 2. 注册 allowlist--merge 保留其他 Provider 条目 openclaw config set agents.defaults.models $ALLOWLIST_JSON --strict-json --merge # 3. 设默认模型 openclaw config set agents.defaults.model.primary icompify/kimi-k2.6--strict-json保证传入的是合法 JSON 而非字符串--merge保证多 Provider 并存时不互相覆盖。这两点如果手动改文件很容易忽略。5. 最小验证启动加载、请求回显、日志确认配置写完不等于生效必须做三步验证。第一步查配置是否落盘openclaw models list | grep icompify openclaw config get agents.defaults.models openclaw config get agents.defaults.model.primary openclaw config get models.providers.icompify | jq .models | length四条命令分别确认模型列表里有 icompify、allowlist 已注册、默认模型正确、Provider 下模型数量对得上。数量对不上说明脚本解析阶段就丢了模型。第二步重启 Gateway 刷新缓存然后在聊天窗口发一条消息看回显openclaw gateway restart重启后打开聊天窗口发送/model icompify/kimi-k2.6切换再发一句「你好」看是否有正常回复。有回显说明请求链路通了。第三步看日志确认请求真的打到了你的 Provideropenclaw logs --tail 100 | grep -i icompify\|provider\|401\|404日志里能看到请求 URL 和状态码。如果状态码是 200 但聊天窗口没回复多半是响应体格式不匹配如果是 401回去查 Key如果是 404查 baseUrl 是否多了或少了/v1。6. 本篇常见报错排查报错一脚本跑完聊天窗口还是看不到模型。配置已写入但 Gateway 缓存未刷新。执行openclaw gateway restart然后刷新浏览器页面。如果还不行用openclaw config get agents.defaults.models确认 allowlist 里确实有icompify/前缀的条目。报错二jq: command not found。脚本依赖 jq按第 4 节的命令装好再跑。这是最高频的新手卡点。报错三无法连接 API 或获取模型列表。先用第 2 节的 curl 命令单独验证端点。常见原因是 baseUrl 结尾多了斜杠导致拼成//models脚本里已经用${API_URL%/}去掉了尾部斜杠但如果你手动改过配置检查一下。报错四Provider 已存在被覆盖。脚本检测到同名 Provider 会用--replace强制替换这是预期行为。allowlist 用--merge不会丢其他 Provider 的模型。如果你想并存多个 Provider把脚本里的icompify改成custom2再跑一次。报错五所有模型上下文长度一样。这是脚本已知的待修复点它让你输入一个contextWindow然后填给所有模型。不同模型实际窗口差异很大128k vs 1M建议跑完脚本后手动按模型修正或改用 API 返回的context_length字段。同理maxTokens和input模态也是统一填的纯文本模型被标了[text,image]需要手工改回[text]。报错六想回滚。删除 Provider 用openclaw config unset models.providers.icompifyallowlist 里的条目需要逐个 unset默认模型改回其他已存在的 Provider 即可。长期跑编码任务或 Agent 场景建议用 Coding Plan 固定额度入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Claude Code 相关接入参考 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里的 Anthropic 兼容说明。密钥和接入文档分别走 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 和 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 模型对话验证走 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。