OpenClaw 自定义 Provider 一键配置脚本。
功能概览
从兼容 OpenAI 协议的后端 API(如 icompify)获取全部模型,一键注册为 OpenClaw 的 Provider,并将所有模型加入聊天窗口可见列表,同时设置默认模型。
脚本路径:`/home/linuxbrew/skill/init-openclaw-model.sh`
**核心能力:**
-
自动拉取 API 的全部可用模型(兼容 `{data: ...}` 和直接 `...` 格式)
-
一次性写入 Provider 配置(含全部模型,而非仅默认模型)
-
自动注册到聊天窗口 allowlist(`/model` 命令和 model picker 可见)
-
设置全局默认模型
依赖
| 工具 | 用途 | 安装命令 |
|------|------|----------|
| `curl` | 拉取 API 模型列表 | `yum install curl` / `apt install curl` |
| `jq` | JSON 解析与构建 | `yum install jq` / `apt install jq` |
| `openclaw` | 写入配置 | 已安装并可用 |
使用方式
基本运行
```bash
bash /home/linuxbrew/skill/init-openclaw-model.sh
```
完整交互示例
```
═══════════════════════════════════════════════════════
OpenClaw 自定义 Provider 配置脚本
═══════════════════════════════════════════════════════
请输入 API URL 默认: https://api.icompify.com/v1: ← 直接回车使用默认值
请输入 API Key: ← 输入密钥(不显示)
正在从 https://api.icompify.com/v1 获取模型列表...
获取到以下可用模型:
1 kimi-k2.6
2 deepseek-v4-pro
3 deepseek-v4-flash
4 minimax-m3
5 qwen3.5
共 5 个模型
请选择默认模型编号 1-5: 1 ← 选择默认用的模型
默认模型: kimi-k2.6
请输入默认上下文长度 (contextWindow) 默认: 262144: ← 直接回车
请输入默认最大输出长度 (maxTokens) 默认: 65536: ← 直接回车
正在构建 provider 配置(含全部 5 个模型)...
正在写入 OpenClaw...
✓ Provider 配置写入成功。
✓ 模型 allowlist 已注册(5 个)。
✓ 默认模型已设为 icompify/kimi-k2.6。
═══════════════════════════════════════════════════════
配置完成!
═══════════════════════════════════════════════════════
Provider: icompify
Base URL: https://api.icompify.com/v1
模型数量: 5
默认模型: kimi-k2.6
ContextWindow: 262144
MaxTokens: 65536
【Provider 模型数】
5
【Allowlist 注册数】
5
【当前默认模型】
icompify/kimi-k2.6
【可用模型列表】
icompify/kimi-k2.6 text+image 256k default,configured
icompify/deepseek-v4-pro text 1000k configured
...
```
使用其他 API 端点
```bash
bash /home/linuxbrew/skill/init-openclaw-model.sh
自定义 URL:
请输入 API URL 默认: https://api.icompify.com/v1: https://my-api.com/v1
```
配置写入位置
脚本修改 `~/.openclaw/openclaw.json` 的以下路径:
| 配置项 | 说明 |
|--------|------|
| `models.providers.icompify` | Provider 的连接信息、认证密钥、全部模型列表 |
| `agents.defaults.models` | 模型 allowlist(决定 `/model` 命令和 chat picker 可见的模型) |
| `agents.defaults.model.primary` | 默认使用的模型 |
验证配置
```bash
查看已注册的模型列表
openclaw models list | grep icompify
查看开放给 chat 的 allowlist
openclaw config get agents.defaults.models
查看当前默认模型
openclaw config get agents.defaults.model.primary
查看 provider 的详细模型配置
openclaw config get models.providers.icompify
```
常见问题
Q1:脚本运行后聊天窗口还是看不到模型?
**A:** 配置已写入但 Gateway 可能未刷新内部缓存。执行:
```bash
openclaw gateway restart
```
然后刷新浏览器页面即可。
Q2:之前已经有一个 icompify provider,会被覆盖吗?
**A:** 会。脚本在写入 provider 时若检测到已存在,会使用 `--replace` 强制替换(但不影响 `agents.defaults.models` allowlist 中的其他 provider 模型,因为 allowlist 被声明为 `--merge` 合并)。
Q3:允许多个 API Provider 并存吗?
**A:** 可以。修改脚本内的 provider 名称 `icompify` 为其他 ID(如 `custom2`),多次运行即可注册多个 Provider。注意 allowlist 的 `--merge` 会自动保留旧条目。
Q4:如何手动切换到其他模型?
**A:** 在 OpenClaw 聊天窗口发送:
```
/model icompify/deepseek-v4-pro
```
或在 model picker 中点击切换(配置成功后所有模型均会出现在列表中)。
脚本执行的动作
-
调用 `${API_URL}/models` 拉取模型列表
-
将每个模型写入 `models.providers.icompify`(含全部模型,而非仅默认模型)
-
将全部模型注册到 `agents.defaults.models`(允许 chat/model picker 看见并切换)
-
设置 `agents.defaults.model.primary` 为选中的默认模型
待修复 Bug
| # | 问题 | 说明 |
|---|------|------|
| 1 | **所有模型使用相同的上下文长度** | 脚本要求用户输入一个 `contextWindow`,然后**同样值填到所有模型**。不同模型实际上下文窗口差异很大(如 128k vs 1M),应逐个模型独立配置或使用 API 返回的 `context_length` 等字段。 |
| 2 | **所有模型使用相同的 maxTokens** | 脚本要求用户输入一个 `maxTokens`,同样值填到所有模型。大模型和轻量模型的生成能力不同,应区分设置或对接 API 返回的 `max_tokens` 字段。 |
| 3 | **所有模型统一标记 `input: "text", "image"`** | 脚本**盲目给所有模型都开了文本+图片双模态**。实际上有些模型是纯文本模型,根本不支持图片输入。应读取 API 返回的模态信息(如 `capabilities` 或 `input_modality` 字段),或允许按模型手工标记。 |
手动回滚
如需删除脚本添加的配置:
```bash
删除 provider
openclaw config unset models.providers.icompify
删除 allowlist 中 icompify 的模型(需一个个删,或用脚本批量清理)
openclaw config unset agents.defaults.models."icompify/kimi-k2.6"
... 重复其他模型
恢复默认模型(需先改为已存在的其他模型)
openclaw config set agents.defaults.model.primary "anthropic/claude-sonnet-4"
```
安全风险
-
API Key 以 Bearer Token 形式在 `curl` 请求头中传递,脚本**不会**将 Key 打印到终端或日志
-
`openclaw.json` 中的 `apiKey` 以明文存储,文件权限为 `600`。请确保该文件不被未授权用户读取
脚本文件实际内容:
#!/usr/bin/env bash
OpenClaw 自定义 Provider 一键配置脚本(纯 Bash + jq 版)
用法: bash init-openclaw-model.sh
set -e
─── 颜色 ───
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
RED='\033[0;31m'
NC='\033[0m'
echo -e "{CYAN}═══════════════════════════════════════════════════════{NC}"
echo -e "{CYAN} OpenClaw 自定义 Provider 配置脚本{NC}"
echo -e "{CYAN}═══════════════════════════════════════════════════════{NC}"
─── 依赖检查 ───
if ! command -v jq &>/dev/null; then
echo -e "{RED}错误:本脚本依赖 jq,请先安装 jq(如 yum install jq / apt install jq)。{NC}"
exit 1
fi
─── 1. 输入 API URL ───
read -rp "请输入 API URL 默认: https://api.icompify.com/v1: " API_URL
API_URL=${API_URL:-"https://api.icompify.com/v1"}
API_URL="${API_URL%/}"
─── 2. 输入 API Key ───
read -rsp "请输入 API Key: " API_KEY
echo
─── 3. 获取模型列表 ───
echo -e "{YELLOW}正在从 API_URL 获取模型列表...${NC}"
MODELS_JSON=$(curl -sS -f --connect-timeout 15 \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
"${API_URL}/models") || {
echo -e "{RED}错误:无法连接 API 或获取模型列表。{NC}"
echo "请求地址: ${API_URL}/models"
exit 1
}
─── 4. 解析模型列表 ───
MODEL_LIST=(echo "MODELS_JSON" | jq -c '
if type == "object" and .data != null and (.data | type) == "array" then .data
elif type == "array" then .
else \[\]
end
| map(select(type == "object" and (.id // empty) != ""))
| map({id: .id, name: (.name // .id)})
')
TOTAL=(echo "MODEL_LIST" | jq 'length')
if \[ "$TOTAL" -eq 0 ]; then
echo -e "{RED}错误:未从 API 获取到任何模型。{NC}"
echo "API 原始返回前 800 字符:"
echo "${MODELS_JSON:0:800}"
exit 1
fi
─── 5. 显示模型列表 ───
echo -e "{GREEN}获取到以下可用模型:{NC}"
echo
MODEL_IDS=()
MODEL_NAMES=()
for ((i = 0; i < TOTAL; i++)); do
IDX=$((i + 1))
MID=(echo "MODEL_LIST" | jq -r ".$i.id")
MNAME=(echo "MODEL_LIST" | jq -r ".$i.name")
MODEL_IDS+=("$MID")
MODEL_NAMES+=("$MNAME")
printf " %2s %-40s\n" "IDX" "MNAME"
done
echo
echo "共 $TOTAL 个模型"
echo
─── 6. 选择默认模型 ───
default_model_idx=""
while true; do
read -rp "请选择默认模型编号 1-$TOTAL: " default_model_idx
if \[ "$default_model_idx" =\~ \^\[0-9+ \]\] \&\& \[\[ "default_model_idx" -ge 1 ]] && \[ "$default_model_idx" -le "$TOTAL" ]; then
break
fi
echo -e "{RED}无效编号,请重新选择。{NC}"
done
DEFAULT_MODEL="{MODEL_IDS\[((default_model_idx - 1))]}"
echo -e "默认模型: {GREEN}DEFAULT_MODEL${NC}"
─── 7. 输入上下文参数 ───
read -rp "请输入默认上下文长度 (contextWindow) 默认: 262144: " CONTEXT_WINDOW
CONTEXT_WINDOW=${CONTEXT_WINDOW:-262144}
read -rp "请输入默认最大输出长度 (maxTokens) 默认: 65536: " MAX_TOKENS
MAX_TOKENS=${MAX_TOKENS:-65536}
─── 8. 构建完整 provider 配置(含全部模型) ───
echo -e "{YELLOW}正在构建 provider 配置(含全部 TOTAL 个模型)...${NC}"
PROVIDER_JSON=(echo "MODEL_LIST" | jq \
--arg url "$API_URL" \
--arg key "$API_KEY" \
--argjson ctx "$CONTEXT_WINDOW" \
--argjson maxt "$MAX_TOKENS" \
'{
baseUrl: $url,
apiKey: $key,
api: "openai-completions",
models: [
.\[\] | {
id: .id,
name: (.name // .id),
input: "text", "image",
contextWindow: $ctx,
contextTokens: $ctx,
maxTokens: $maxt,
cost: {input: 0, output: 0, cacheRead: 0, cacheWrite: 0}
}
]
}')
─── 9. 构建 allowlist(agents.defaults.models) ───
echo -e "{YELLOW}正在构建模型 allowlist...{NC}"
ALLOWLIST_JSON=(echo "MODEL_LIST" | jq '
.\[ | {
key: ("icompify/" + .id),
value: {alias: .name}
} ] | from_entries
')
─── 10. 写入 OpenClaw 配置 ───
echo -e "{YELLOW}正在写入 OpenClaw...{NC}"
10a. provider
if openclaw config set models.providers.icompify "$PROVIDER_JSON" --strict-json 2>/dev/null; then
echo " ✓ Provider 配置写入成功。"
else
echo -e " {YELLOW}Provider 已存在,使用 --replace 强制替换...{NC}"
openclaw config set models.providers.icompify "$PROVIDER_JSON" --strict-json --replace
echo " ✓ Provider 配置已替换。"
fi
10b. allowlist --- 关键步骤:
把全部模型注册到 agents.defaults.models,否则 /model 和聊天窗口看不到
openclaw config set agents.defaults.models "$ALLOWLIST_JSON" --strict-json --merge
echo " ✓ 模型 allowlist 已注册($TOTAL 个)。"
10c. 设置默认模型
openclaw config set agents.defaults.model.primary "icompify/${DEFAULT_MODEL}"
echo " ✓ 默认模型已设为 icompify/$DEFAULT_MODEL。"
─── 11. 验证 ───
echo
echo -e "{GREEN}═══════════════════════════════════════════════════════{NC}"
echo -e "{GREEN} 配置完成!{NC}"
echo -e "{GREEN}═══════════════════════════════════════════════════════{NC}"
echo
echo -e "Provider: {CYAN}icompify{NC}"
echo -e "Base URL: {CYAN}API_URL${NC}"
echo -e "模型数量: {CYAN}TOTAL${NC}"
echo -e "默认模型: {CYAN}DEFAULT_MODEL${NC}"
echo -e "ContextWindow: {CYAN}CONTEXT_WINDOW${NC}"
echo -e "MaxTokens: {CYAN}MAX_TOKENS${NC}"
echo
验证实际写入
echo "【Provider 模型数】"
openclaw config get models.providers.icompify 2>/dev/null | jq '.models | length' || echo " (获取失败)"
echo "【Allowlist 注册数】"
openclaw config get agents.defaults.models 2>/dev/null | jq 'length' || echo " (获取失败)"
echo "【当前默认模型】"
openclaw config get agents.defaults.model.primary 2>/dev/null || echo " (获取失败)"
echo
echo "【可用模型列表】"
openclaw models list 2>/dev/null | grep icompify | head -20 || echo " (列表为空)"
echo
echo -e "{YELLOW}提示:如聊天窗口 model picker 未立即刷新,可执行:{NC}"
echo -e " {CYAN}openclaw gateway restart{NC}"
echo -e " 或刷新浏览器页面。"