Setting up OpenAI Oauth and Openrouter in CLIProxyAPIPlus for OpenClaw

架構概念

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-codexor/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 上跑時要特別注意的:

  1. 一定綁 localhosthost: "127.0.0.1",不要開放到外網
  2. API key 用強隨機字串openssl rand -hex 24 產生
  3. Docker volume 權限chmod 700 ./auths
  4. 定期檢查 token — OAuth token 雖然自動 refresh,但偶爾會失敗。設個 cron 跑 curl http://localhost:8317/v1/models 確認服務正常

這個架構讓你在 OpenClaw 端只需要管一個 endpoint (localhost:8317),所有 provider 切換、token refresh、rate limit cooldown 都由 CLIProxyAPIPlus 在背後處理。

這是一個非常具備野心且架構完善的專案!在 Mac Mini M4 (16GB) 上運行 CLI 工具、API 代理與輕量級多智能體架構是非常游刃有餘的。

以下是為你量身打造的完整教學、 Claude Code 專用的 Prompt,以及多智能體經濟路由的最佳實踐。


一、 環境與基礎架構準備 (Mac Mini M4)

在呼叫 Claude Code 幫你寫程式之前,我們需要先準備好基礎環境與 API 代理伺服器。

1. 安裝必要工具
確保你的 Mac 已經安裝了 Homebrew、Node.js (Claude Code 通常需要 Node 環境) 與 Python 3.10+。

# 安裝 Node.js 與 Python
brew install node python

# 全局安裝 Claude Code (假設你已經有 Anthropic 授權)
npm install -g @anthropic-ai/claude-code

2. 部署 CLIProxyAPIPlus
我們將使用你指定的專案來建立一個支援 OAuth 與自動備援 (Fallback) 的 API 代理。

# 複製專案
git clone https://github.com/router-for-me/CLIProxyAPIPlus.git
cd CLIProxyAPIPlus

# 切換到 main 分支並安裝依賴 (依據該專案通常的 Python 設定)
pip install -r requirements.txt

3. 設定代理與自動切換 (ChatGPT 5.4 → Kimi k2.5)
CLIProxyAPIPlus 目錄下建立或修改設定檔(例如 .envconfig.json,請依照該 repo 的實際設定檔格式調整),設定主要與備援邏輯:

# .env 範例設定
PORT=8080

# Primary: OpenAI ChatGPT 5.4 (透過 OAuth)
OPENAI_AUTH_MODE=oauth
OPENAI_DEFAULT_MODEL=chatgpt-5.4

# Fallback: OpenRouter Kimi k2.5
ENABLE_FALLBACK=true
OPENROUTER_API_KEY=your_openrouter_api_key
FALLBACK_MODEL=openrouter/kimi-k2.5

# 觸發 Fallback 的條件 (如 429 Too Many Requests)
FALLBACK_ON_STATUS=429,500,502

啟動代理伺服器:

python main.py

(代理伺服器現在將會在 http://localhost:8080 運行。)


二、 讓 Claude Code 幫你打造 OpenClaw (專用 Prompt)

現在,在一個全新的目錄中打開終端機,啟動 Claude Code,然後將以下這段 Prompt 貼給它。這段提示詞經過特殊設計,能讓 Claude Code 清楚了解你的架構需求並自動生成程式碼。

:backhand_index_pointing_down: 請複製以下 Prompt 貼給 Claude Code :backhand_index_pointing_down:

你現在是一個資深的 AI 系統架構師與 Python 後端開發專家。請幫我從零開始建立一個名為「OpenClaw」的多智能體 (Multi-Agent) 系統。

【環境與硬體限制】
- 運行環境:macOS (Apple Silicon M4, 16GB RAM)
- 語言框架:Python 3.10+ (請使用 asyncio 進行非同步開發以提升效能)

【API 基礎架構需求】
我已經在本地端運行了一個 API 代理伺服器 (CLIProxyAPIPlus),位址在 `http://localhost:8080/v1`。
這個代理已經配置好了自動切換機制(當預設的 ChatGPT 5.4 達到速率限制時,會自動切換到 OpenRouter 的 Kimi k2.5)。
因此,OpenClaw 系統的底層 LLM 客戶端,必須:
1. 使用官方的 `openai` Python 套件。
2. 將 `base_url` 強制設定為 `http://localhost:8080/v1`。
3. 不需要處理底層的 API Key 與 Fallback 邏輯(代理層已處理),只需傳遞一般的假 Key (如 "sk-proxy") 即可。

【OpenClaw 系統架構要求】
請幫我建立以下目錄結構與核心程式碼:
1. `core/llm_client.py`:封裝 OpenAI 客戶端,連接到本地代理。
2. `agents/base_agent.py`:定義智能體的基礎類別,包含系統提示詞設定、對話歷史管理與 Token 計算基礎。
3. `agents/router_agent.py`:路由智能體。負責分析使用者的任務,並決定要派發給哪個具體的任務智能體,並決定該任務應使用的模型參數(例如要求使用較低成本的模型或高智商模型)。
4. `agents/worker_agents.py`:實作至少兩個具體智能體:
   - `ResearchAgent`:負責資料搜集與分析。
   - `CoderAgent`:負責程式碼編寫與審查。
5. `main.py`:系統進入點,展示如何實例化這些智能體並完成一個協作任務。

【程式碼撰寫規範】
- 包含完整的繁體中文註解。
- 實作完善的 Error Handling 與重試機制。
- 請直接開始建立檔案並撰寫程式碼,無需詢問我即可執行檔案寫入操作。


三、 多智能體模型路由與節省 Token 最佳實踐

在多智能體系統中,要達到「最經濟的 Token 使用」,核心概念是任務分級 (Task Routing)上下文壓縮 (Context Compression)

以下是 OpenClaw 可以採用的最佳實踐:

1. 建立「大腦-手腳 (Brain-Worker)」架構

  • 大腦 (Router/Manager Agent): 負責解析任務與規劃步驟。這個 Agent 需要最強的邏輯能力,因此呼叫 ChatGPT 5.4
  • 手腳 (Worker Agents): 負責執行單一、明確的指令(例如:從這段文字中萃取出 JSON 格式、將這段 Python 翻譯成 JavaScript)。這些任務不需要頂級模型,可以透過 API 參數要求代理伺服器使用較便宜、速度更快的模型 (例如 Kimi k2.5 甚至更輕量的模型) 來處理。

2. 上下文壓縮 (Context Compression)

多智能體最大的花費在於「智能體互相傳遞對話紀錄」。

  • 錯誤做法: 將 Agent A 的 10 輪對話完整傳給 Agent B。
  • 最佳實踐: 讓 Agent A 在結束任務前,生成一段「最終摘要 (Final State/Summary)」,只將這個精煉後的摘要最終產出結果傳遞給下一個 Agent。

3. 動態 System Prompt 裁剪

  • 根據當前任務的需要,動態增刪 System Prompt。如果目前的子任務不需要寫程式,就不要把「你是一個頂級工程師,請注意代碼規範…」這類佔用 Token 的設定放進去。

4. 利用代理層 (Proxy) 進行快取 (Caching)

CLIProxyAPIPlus 等代理層通常可以實作 Cache 功能。如果不同的 Agent 詢問了完全相同的問題(或相同的 Context),代理層可以直接回傳先前的結果,完全不消耗任何 API Token。