架構概念
OpenClaw
↓ (所有請求統一走 http://localhost:8317/v1)
CLIProxyAPIPlus (統一代理)
├─ Codex OAuth (ChatGPT 5.4 訂閱) ← 主力
├─ OpenRouter API (Kimi K2.5) ← Fallback
└─ 自動輪換 + retry + cooldown
CLIProxyAPI 把 Gemini CLI、Antigravity、ChatGPT Codex、Claude Code、Qwen Code 等 CLI 工具封裝成 OpenAI/Gemini/Claude 相容的 API 服務,對 OpenClaw 來說就是一個統一的 API endpoint。
步驟一:安裝 CLIProxyAPIPlus(Docker)
# 建立目錄
mkdir -p ~/cli-proxy && cd ~/cli-proxy
# 建立 docker-compose.yml
cat > docker-compose.yml << 'EOF'
services:
cli-proxy-api:
image: eceasy/cli-proxy-api-plus:latest
container_name: cli-proxy-api-plus
ports:
- "8317:8317"
volumes:
- ./config.yaml:/CLIProxyAPI/config.yaml
- ./auths:/root/.cli-proxy-api
- ./logs:/CLIProxyAPI/logs
restart: unless-stopped
EOF
# 下載範例 config
curl -o config.yaml https://raw.githubusercontent.com/router-for-me/CLIProxyAPIPlus/main/config.example.yaml
# 啟動
docker compose pull && docker compose up -d
步驟二:OpenAI Codex OAuth 登入
CLIProxyAPIPlus 需要先完成 Codex OAuth 認證,取得 token 存入 auths/ 目錄:
# 進入容器執行 OAuth 登入
docker exec -it cli-proxy-api-plus ./cli-proxy-api --login-openai
# 或者如果是本地安裝(非 Docker)
./cli-proxy-api --login-openai
這會開啟瀏覽器進行 ChatGPT OAuth 授權。如果是 headless 伺服器,加 --no-browser 會印出 URL 讓你在本地瀏覽器打開。
認證完成後 token 會自動存入 ~/.cli-proxy-api/ (容器內對應 ./auths/)。CLIProxyAPIPlus 內建 background token refresh,會在 token 過期前 10 分鐘自動更新。
步驟三:撰寫完整 config.yaml
這是核心設定,實現「ChatGPT 5.4 為主 → 限速時自動切到 OpenRouter Kimi K2.5」:
# === 基礎設定 ===
host: "127.0.0.1" # 只綁定 localhost(安全)
port: 8317
# 認證目錄(Docker 掛載路徑)
auth-dir: "~/.cli-proxy-api"
# 你自訂的 API key(OpenClaw 連進來用的)
api-keys:
- "your-openclaw-proxy-key-here"
# === 除錯和日誌 ===
debug: false
logging-to-file: true
logs-max-total-size-mb: 100
# === 重試和容錯 ===
# 收到 403/408/500/502/503/504 時自動 retry
request-retry: 3
max-retry-interval: 30
# Quota 用完時自動切換
quota-exceeded:
switch-project: true
switch-preview-model: true
# 路由策略:round-robin 或 fill-first
# fill-first = 先用完第一個 credential 才輪到下一個(適合「主+備」模式)
routing:
strategy: "fill-first"
# === Codex OAuth(主力 - ChatGPT 5.4 訂閱)===
# OAuth token 由 --login-openai 自動產生,存在 auth-dir 中
# 不需要在這裡手動設定 codex-api-key
# CLIProxyAPI 會自動讀取 auth-dir 下的 Codex OAuth token
# 如果你有額外的 Codex API Key(付費),也可以加上去作為另一層備用:
# codex-api-key:
# - api-key: "sk-your-codex-api-key"
# models:
# - name: "gpt-5.4-codex"
# alias: "chatgpt-5.4"
# === OpenRouter(Fallback - Kimi K2.5)===
openai-compatibility:
- name: "openrouter"
base-url: "https://openrouter.ai/api/v1"
api-key-entries:
- api-key: "sk-or-v1-your-openrouter-key-here"
models:
- name: "moonshotai/kimi-k2.5"
alias: "kimi-k2.5"
# 你也可以加更多 OpenRouter 模型作為額外 fallback
- name: "deepseek/deepseek-v3.2"
alias: "deepseek-v3.2"
- name: "minimax/MiniMax-M2.5"
alias: "minimax-m2.5"
# === Model Alias(統一模型名稱)===
# 讓 OpenClaw 可以用統一的名稱請求
oauth-model-alias:
codex:
- name: "gpt-5.4-codex"
alias: "chatgpt-default"
步驟四:驗證 Proxy 運作
# 重啟容器載入新 config
cd ~/cli-proxy && docker compose restart
# 測試 Codex(ChatGPT 5.4)
curl http://localhost:8317/v1/chat/completions \
-H "Authorization: Bearer your-openclaw-proxy-key-here" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.4-codex",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}'
# 測試 OpenRouter(Kimi K2.5)
curl http://localhost:8317/v1/chat/completions \
-H "Authorization: Bearer your-openclaw-proxy-key-here" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k2.5",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}'
# 列出所有可用模型
curl http://localhost:8317/v1/models \
-H "Authorization: Bearer your-openclaw-proxy-key-here"
步驟五:設定 OpenClaw 連接 CLIProxyAPIPlus
在 OpenClaw 的 openclaw.json5 中,把 CLIProxyAPIPlus 當作一個 OpenAI-compatible provider:
{
"env": {
"CLIPROXY_API_KEY": "your-openclaw-proxy-key-here"
},
"models": {
"providers": {
// CLIProxyAPIPlus 作為自訂 provider
"cliproxy": {
"apiKey": "$CLIPROXY_API_KEY",
"baseUrl": "http://localhost:8317/v1",
"api": "openai-completions"
}
}
},
"agents": {
"defaults": {
"model": {
// 主力:透過 proxy 用 ChatGPT 5.4
"primary": "cliproxy/gpt-5.4-codex",
"fallbacks": [
// Fallback 1:透過同一個 proxy 用 Kimi K2.5
"cliproxy/kimi-k2.5",
// Fallback 2:DeepSeek(也透過 proxy)
"cliproxy/deepseek-v3.2"
]
}
}
}
}
但更推薦的做法是讓 CLIProxyAPIPlus 內部處理 fallback(它有更細緻的 retry 和 cooldown),然後 OpenClaw 也設自己的 fallback 作為雙保險:
{
"env": {
"CLIPROXY_API_KEY": "your-openclaw-proxy-key-here",
"OPENROUTER_API_KEY": "sk-or-v1-your-key"
},
"models": {
"providers": {
"cliproxy": {
"apiKey": "$CLIPROXY_API_KEY",
"baseUrl": "http://localhost:8317/v1",
"api": "openai-completions"
}
}
},
"agents": {
"defaults": {
"model": {
// Layer 1: CLIProxyAPIPlus 統一入口
// (內部已經有 Codex OAuth → OpenRouter 的 fallback)
"primary": "cliproxy/gpt-5.4-codex",
"fallbacks": [
// Layer 2: 如果 proxy 整個掛了,直連 OpenRouter
"openrouter/moonshotai/kimi-k2.5",
"openrouter/deepseek/deepseek-v3.2"
]
}
}
}
}
自動 Fallback 如何運作
CLIProxyAPIPlus 的 fallback 機制和 OpenClaw 的是獨立的兩層:
CLIProxyAPIPlus 層(透明 fallback):
- 收到 403/408/500/502/503/504 時自動 retry(預設 3 次)
- Quota 用完自動切換 project 或 preview model
routing.strategy: "fill-first"確保先用 Codex OAuth,用完才切到 OpenRouter- 內建 cooldown management,被 rate limit 的 credential 會智慧冷卻
OpenClaw 層(model-level fallback):
- 如果 CLIProxyAPIPlus 整體返回錯誤,OpenClaw 自己的 fallback chain 接手
- 可以直連 OpenRouter 作為最後防線
進階:多帳號 + prefix 隔離
如果你有多個 ChatGPT 帳號(例如一個 Plus 一個 Pro),可以用 prefix 隔離:
# config.yaml 中多帳號設定
codex-api-key:
- api-key: "sk-account1-key"
prefix: "main"
- api-key: "sk-account2-key"
prefix: "backup"
openai-compatibility:
- name: "openrouter"
prefix: "or"
base-url: "https://openrouter.ai/api/v1"
api-key-entries:
- api-key: "sk-or-v1-your-key"
models:
- name: "moonshotai/kimi-k2.5"
alias: "kimi-k2.5"
加了 prefix 後,client 需要用 main/gpt-5.4-codex 或 or/kimi-k2.5 來指定走哪組 credential。不加 prefix 的請求會按 routing strategy 自動分配。
管理面板(Web UI)
CLIProxyAPIPlus 6.0.19+ 內建 Web 管理面板:
http://localhost:8317/management.html
面板支援 OAuth 登入管理、模型 alias 設定、credential 上傳下載、即時 quota 追蹤、以及 request logging。需要先在 config 裡設定 management key:
remote-management:
allow-remote: false
secret-key: "your-management-secret"
安全提醒
幾個在 Mac Mini M4 上跑時要特別注意的:
- 一定綁 localhost —
host: "127.0.0.1",不要開放到外網 - API key 用強隨機字串 —
openssl rand -hex 24產生 - Docker volume 權限 —
chmod 700 ./auths - 定期檢查 token — OAuth token 雖然自動 refresh,但偶爾會失敗。設個 cron 跑
curl http://localhost:8317/v1/models確認服務正常
這個架構讓你在 OpenClaw 端只需要管一個 endpoint (localhost:8317),所有 provider 切換、token refresh、rate limit cooldown 都由 CLIProxyAPIPlus 在背後處理。