CmdCode 的 API 代理(proxy.php)为 OpenCode Go 和 MiniMax 两大供应商实现了双重保险的密钥轮换机制,确保在限流(429)或密钥过期时服务不中断。
| 保险层 | 机制 | 触发 |
|---|---|---|
| 第一层 · 实时 429 | API 返回 429 时自动尝试组内下一个密钥 | 每条请求实时生效 |
| 第二层 · 每日 7:00 | 系统 crontab + Hermes Cron 双重触发,强制轮换到链中下一个起始位置 | 0 7 * * * |
五个独立 provider(opencode-go 至 opencode-go4)各持一个密钥,组成轮换链:
proxy_all_keys_exhaustedcurrent 索引 +1(0→1→2→3→4→0),起始位后移一位,实现日志均衡单个 provider(minimax)内含 3 个密钥,双重轮换保护:
foreach 3 Key → 429 continue,全部耗尽则兜底返回current 索引 +1,改变哪个 key 优先尝试,避免固定 key 被长期集中调用存储在服务器 /vhost/tmp/provider_rotation.json:
{
"opencode-go": {"current": 0, "rotated_at": "2026-05-20 07:00:00"},
"minimax": {"current": 0, "rotated_at": "2026-05-20 07:00:00"}
}
| 端点 | 功能 | 使用方式 |
|---|---|---|
/rotate_provider | 手动/cron 触发轮换(group=opencode-go|minimax|all) | POST {"_path":"/rotate_provider","group":"all"} |
/rotation_status | 查看当前所有轮换组状态 | POST {"_path":"/rotation_status"} |
| 来源 | 文件/任务 | 调度 |
|---|---|---|
| 系统 crontab | /etc/cron.d/provider-key-rotation | 0 7 * * * |
| Hermes Cron | 每日7点APIKey轮换 (ID: 6f590506005a) | 0 7 * * * |
| 文件 | 改动 |
|---|---|
/cmdcode-solo/config.enc.php | 新增 ROTATION_STATE_FILE + ROTATION_GROUPS 定义 |
/cmdcode-solo/proxy.php | 4 个轮换函数 + 2 个端点 + 主循环展开 + minimax 起点 + memory 函数同步 |
/cmdcode-solo/ui.html | CHAT_PROVIDER 注释更新,前端无需改代码 |
/root/scripts/rotate-provider-keys.sh | 新增 cron 轮换脚本 |
# 查看当前轮换状态
curl -s https://cmdcode.cn/cmdcode-minimax-toolset/proxy.php \
-H 'Content-Type: application/json' \
-d '{"_token":"TOKEN","_path":"/rotation_status"}'
# 手动触发轮换
curl -s https://cmdcode.cn/cmdcode-minimax-toolset/proxy.php \
-H 'Content-Type: application/json' \
-d '{"_token":"TOKEN","_path":"/rotate_provider","group":"opencode-go"}'