One API 与 OpenClaw 模型配置同步:从手动踩坑到一键脚本的完整记录
起因
我的 VPS 上跑着两个关键服务:
- One API:LLM 网关,管理多个 NVIDIA、Ollama、Groq 渠道,给 n8n 工作流和 OpenClaw 提供模型调用
- OpenClaw:AI Agent 平台,通过 One API 调用各种模型
NVIDIA 会定期更新模型,比如:
minimax-m3被废弃 → 迁移到kimi-k3glm-5.2升级 →glm-5.3- 多个
deepseek版本 → 统一到deepseek-v4.1-flash
每次模型更新,One API 和 OpenClaw 两边都要改,而且改的位置不止一处。手动操作反复踩坑,最终形成了一套可靠的脚本。
需要同步的位置
一次完整的模型迁移,涉及以下所有位置:
One API 侧(SQLite 数据库)
| 位置 | 说明 |
|---|---|
channels.models | 模型 ID(核心) |
channels.name | 渠道名称(容易遗漏) |
channels.model_mapping | 模型重定向(JSON) |
abilities.model | 权限表 |
OpenClaw 侧
| 位置 | 说明 |
|---|---|
openclaw.json → models.providers.one-api.models[] | provider 定义 |
openclaw.json → agents.defaults.models | allowlist |
openclaw.json → agents.defaults.models[].alias | 别名 |
openclaw.json → agents.defaults.model.primary | 默认模型 |
openclaw.json → agents.defaults.model.fallbacks[] | 回退链 |
openclaw.json → agents.entries.*.model | 各 Agent 的模型 |
agents/*/agent/models.json | 6 个 Agent 各自的 provider 定义 |
任何一处遗漏,都会导致模型不可用或显示不一致。
踩坑记录
坑 1:只改 models,忘了改 name
第一次迁移 minimax-m3 → kimi-k3 时,我只改了 channels.models,结果 One API 渠道列表里显示的还是旧名字:
text
id name models 18 Nvidia-minimaxai/minimax-m3 moonshotai/kimi-k3 ← 名字和模型不一致
教训:channels.name 必须一起改。
坑 2:JSON 解析导致遗漏
用 Python 解析 openclaw.json 再逐键替换,结果漏掉了 fallbacks 和 primary:
text
⚠️ 残存: 2 件 49: "one-api/minimaxai/minimax-m3", 58: "primary": "one-api/minimaxai/minimax-m3"
原因:JSON 结构复杂,primary 和 fallbacks 不在我以为的层级。
坑 3:模型重定向没改
One API 的「模型重定向」(model_mapping)是 JSON 字符串:
json
{"glm-5.2": "z-ai/glm-5.2"}
只改 models 不改这里,客户端请求 glm-5.2 时会被重定向到已废弃的 z-ai/glm-5.2。
最终方案:sed 全文替换
关键领悟:openclaw.json 只是文本文件,不需要 JSON 解析。
bash
sed -i 's|one-api/minimaxai/minimax-m3|one-api/moonshotai/kimi-k3|g' /root/.openclaw/openclaw.json sed -i 's|minimaxai/minimax-m3|moonshotai/kimi-k3|g' /root/.openclaw/openclaw.json sed -i 's|minimax3|kimi-k3|g' /root/.openclaw/openclaw.json
无论 key 在哪个层级,都能替换。不会遗漏。
通用脚本:rename-model-full.sh
最终形成的脚本,涵盖所有位置:
bash
#!/bin/bash
# 使用方法:
# bash /root/rename-model-full.sh <OLD_MODEL_ID> <NEW_MODEL_ID> <NEW_DISPLAY_NAME>
# 例:
# bash /root/rename-model-full.sh "z-ai/glm-5.3" "z-ai/glm-5.4" "glm-5.4"
OLD_ID="$1"
NEW_ID="$2"
NEW_NAME="$3"
OLD_KEY=$(echo "$OLD_ID" | sed 's|.*/||')
NEW_KEY=$(echo "$NEW_ID" | sed 's|.*/||')
DB_FILE="/home/user/one-api/one-api.db"
CONFIG_FILE="/root/.openclaw/openclaw.json"
# 1. バックアップ
BACKUP_DIR="/root/model-full-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
cp "$DB_FILE" "$BACKUP_DIR/one-api.db.backup"
cp "$CONFIG_FILE" "$BACKUP_DIR/openclaw.json.backup"
# 2. One API DB の完全置換
sqlite3 "$DB_FILE" "UPDATE channels SET models = REPLACE(models, '${OLD_ID}', '${NEW_ID}') WHERE models LIKE '%${OLD_ID}%';"
sqlite3 "$DB_FILE" "UPDATE channels SET models = REPLACE(models, '${OLD_KEY}', '${NEW_KEY}') WHERE models LIKE '%${OLD_KEY}%';"
sqlite3 "$DB_FILE" "UPDATE channels SET name = REPLACE(name, '${OLD_KEY}', '${NEW_KEY}') WHERE name LIKE '%${OLD_KEY}%';"
sqlite3 "$DB_FILE" "UPDATE channels SET model_mapping = REPLACE(model_mapping, '${OLD_KEY}', '${NEW_KEY}') WHERE model_mapping LIKE '%${OLD_KEY}%';"
# 3. OpenClaw JSON を sed で全文置換
sed -i "s|${OLD_ID}|${NEW_ID}|g" "$CONFIG_FILE"
sed -i "s|${OLD_KEY}|${NEW_KEY}|g" "$CONFIG_FILE"
# 4. 各 Agent の models.json
for agent in main coder designer researcher creative publisher; do
f="/root/.openclaw/agents/${agent}/agent/models.json"
[ -f "$f" ] && sed -i "s|${OLD_KEY}|${NEW_KEY}|g" "$f"
done
# 5. サービス再起動
docker restart one-api
systemctl --user restart openclaw-gateway
# 6. 検証
echo "=== 残存チェック ==="
grep -c "$OLD_KEY" "$CONFIG_FILE"
sqlite3 "$DB_FILE" "SELECT COUNT(*) FROM channels WHERE models LIKE '%${OLD_KEY}%' OR name LIKE '%${OLD_KEY}%';"
使用方法
例 1:glm-5.3 → glm-5.4
bash
bash /root/rename-model-full.sh "z-ai/glm-5.3" "z-ai/glm-5.4" "glm-5.4"
例 2:kimi-k3 → kimi-k4
bash
bash /root/rename-model-full.sh "moonshotai/kimi-k3" "moonshotai/kimi-k4" "kimi-k4"
例 3:deepseek 统一
bash
bash /root/rename-model-full.sh "deepseek-ai/deepseek-v4-flash-0731" "deepseek-ai/deepseek-v4.1-flash" "deepseek-v4.1-flash" bash /root/rename-model-full.sh "deepseek-ai/deepseek-v4-pro" "deepseek-ai/deepseek-v4.1-flash" "deepseek-v4.1-flash"
验证步骤
迁移后,用以下命令验证:
1. One API 渠道
bash
DB_FILE="/home/user/one-api/one-api.db" sqlite3 -header -column "$DB_FILE" "SELECT id, name, models FROM channels WHERE models LIKE '%新模型%' OR name LIKE '%新模型%';"
2. One API 公开模型
bash
API_KEY=$(sqlite3 "$DB_FILE" "SELECT key FROM tokens WHERE status=1 LIMIT 1;") curl -s http://127.0.0.1:3000/v1/models -H "Authorization: Bearer $API_KEY" | python3 -m json.tool
3. OpenClaw 状态
bash
openclaw models status | grep -E "^Default|^Fallbacks|^Aliases" openclaw models list
4. 残存チェック
bash
grep -c "旧模型" /root/.openclaw/openclaw.json sqlite3 "$DB_FILE" "SELECT COUNT(*) FROM channels WHERE models LIKE '%旧模型%' OR name LIKE '%旧模型%';"
注意事项
1. One API 容器重启
修改 DB 后必须重启容器:
bash
docker restart one-api
2. OpenClaw Gateway 重启
修改 openclaw.json 后必须重启:
bash
systemctl --user restart openclaw-gateway sleep 30
3. 显示缓存
OpenClaw 的 models list 有时显示旧缓存,但实际调用已使用新模型。验证以 openclaw.json 的内容为准。
4. NVIDIA 模型延迟
NVIDIA API 有时响应较慢(几十秒),不要在脚本里做同步测试。迁移脚本只负责配置替换,验证单独手动执行。
当前模型清单(示例)
| 模型 ID | One API 渠道数 | OpenClaw |
|---|---|---|
z-ai/glm-5.3 | 14 | ✅ |
moonshotai/kimi-k3 | 21 | ✅ |
deepseek-ai/deepseek-v4.1-flash | 8 | ✅ |
mistralai/mistral-nemotron | 1 | ✅ |
nvidia/nemotron-3-ultra-550b-a55b | 1 | ✅ |
一句话总结
模型迁移不是改一个字段,而是要同步 One API 的 4 处和 OpenClaw 的 7 处。用 sed 全文替换代替 JSON 解析,用统一脚本代替手动操作,才能真正可靠。
