One API 与 OpenClaw 模型配置同步:从手动踩坑到一键脚本的完整记录

起因

我的 VPS 上跑着两个关键服务:

  • One API:LLM 网关,管理多个 NVIDIA、Ollama、Groq 渠道,给 n8n 工作流和 OpenClaw 提供模型调用
  • OpenClaw:AI Agent 平台,通过 One API 调用各种模型

NVIDIA 会定期更新模型,比如:

  • minimax-m3 被废弃 → 迁移到 kimi-k3
  • glm-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.modelsallowlist
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.json6 个 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 有时响应较慢(几十秒),不要在脚本里做同步测试。迁移脚本只负责配置替换,验证单独手动执行。


当前模型清单(示例)

模型 IDOne API 渠道数OpenClaw
z-ai/glm-5.314✅
moonshotai/kimi-k321✅
deepseek-ai/deepseek-v4.1-flash8✅
mistralai/mistral-nemotron1✅
nvidia/nemotron-3-ultra-550b-a55b1✅

一句话总结

模型迁移不是改一个字段,而是要同步 One API 的 4 处和 OpenClaw 的 7 处。用 sed 全文替换代替 JSON 解析,用统一脚本代替手动操作,才能真正可靠。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注