08. config.yaml 配置参考
CPA 的所有行为都在 /CLIProxyAPI/config.yaml(容器内路径)配置。这里只挑出真正常用 + 有坑的字段,详细字段以 config.example.yaml 为准。
顶层字段
host: "" # 监听地址;"" = 全部接口;"127.0.0.1" = 仅本机
port: 8317 # API 端口
tls:
enable: false # 启用就需要给 cert/key
cert: ""
key: ""
auth-dir: "~/.cli-proxy-api" # OAuth 凭据存放目录(容器内 ~ = /root)
api-keys:
- "sk-自己定一个长一点的" # 客户端访问 CPA 用这个 key(Authorization: Bearer ...)
debug: false # 详细日志
proxy-url: "" # 上游代理;http/https/socks5
# 例:http://172.18.0.1:7890
# per-key 还能写 "direct" / "none" 强制直连
logging-to-file: false # true = 写文件而不是 stdout
logs-max-total-size-mb: 0 # 日志总大小上限管理面板
remote-management:
allow-remote: false # 是否允许非 localhost 访问管理 API
secret-key: "" # 明文密码(启动时自动 bcrypt)
disable-control-panel: false # true 则 /management.html 直接 abort
panel-github-repository: "https://github.com/router-for-me/Cli-Proxy-API-Management-Center"
# disable-auto-update-panel: false # true 则不自动更新面板大坑:默认会从 GitHub Releases 拉面板,境内出口/共享代理 IP 容易遇到 403 rate limit 或 EOF。处理方法见 06-management-panel.md §3。
路由策略
routing:
strategy: "round-robin" # round-robin / fill-first
session-affinity: false # 同一 session 绑定到同一上游(避免对话上下文跳变)
session-affinity-ttl: "1h"配额
quota-exceeded:
switch-project: true # 配额满了换个 GCP project(Vertex/Gemini)
switch-preview-model: true # 自动降到 preview 模型续命
antigravity-credits: true # Claude 配额耗尽时用 Antigravity 兜底重试
request-retry: 3 # 单凭据重试次数(403/408/5xx)
max-retry-credentials: 0 # 多凭据切换上限;0 = 全部都试
max-retry-interval: 30 # 等待冷却凭据的最大秒数
disable-cooling: false # 关掉冷却调度OAuth 凭据(自动加载,一般不手写)
OAuth 登录写到 auth-dir 下的 *.json 文件,CPA file watcher 自动识别。手动加一份的场景很少。
API Key 类凭据(手写)
适合直接拿到了上游 API key 的场景(不走 OAuth)。
Gemini API Key(AI Studio)
gemini-api-key:
- api-key: "AIzaSy..."
prefix: "test" # 可选:要求客户端用 test/gemini-... 调用
base-url: "https://generativelanguage.googleapis.com"
proxy-url: "socks5://proxy.example.com:1080" # 可选:per-key 代理
models:
- name: "gemini-2.5-flash"
alias: "gemini-flash"
excluded-models:
- "gemini-2.5-pro"
- "*-preview"Codex API Key
codex-api-key:
- api-key: "sk-..."
base-url: "https://api.openai.com/v1"
models:
- name: "gpt-5-codex"
alias: "codex-latest"Claude API Key
claude-api-key:
- api-key: "sk-ant-..."
models:
- name: "claude-3-5-sonnet-20241022"
alias: "claude-sonnet-latest"
cloak: # 让请求看起来像 Claude Code(绕过部分检测)
mode: "auto"
strict-mode: falseOpenAI 兼容(OpenRouter / DeepSeek / 自建 vLLM 等)
openai-compatibility:
- name: "openrouter"
base-url: "https://openrouter.ai/api/v1"
api-key-entries:
- api-key: "sk-or-v1-..."
models:
- name: "moonshotai/kimi-k2:free"
alias: "kimi-k2"Vertex API Key
vertex-api-key:
- api-key: "vk-..."
base-url: "https://example.com/api" # 可选;不填默认走 Google Vertex
models:
- name: "gemini-2.5-pro"
alias: "vertex-pro"模型别名(OAuth 通道)
API key 类已经在自己条目里写 models:,OAuth 通道(Gemini CLI / Codex / Claude Code)则用全局:
oauth-model-alias:
gemini-cli:
- name: "gemini-2.5-pro"
alias: "g2.5p"
fork: true # true = 同时保留原名
codex:
- name: "gpt-5"
alias: "g5"
claude:
- name: "claude-sonnet-4-5-20250929"
alias: "cs4.5"模型排除
oauth-excluded-models:
gemini-cli:
- "gemini-2.5-*"
- "*-preview"
claude:
- "claude-3-5-haiku-20241022"Payload 改写(高级)
让所有 gemini-2.5-pro 请求自动加 thinkingBudget:
payload:
default:
- models:
- name: "gemini-2.5-pro"
protocol: "gemini"
params:
"generationConfig.thinkingConfig.thinkingBudget": 32768
override:
- models:
- name: "gpt-*"
protocol: "codex"
params:
"reasoning.effort": "high"四种规则:
default:缺失才设default-raw:缺失才设,值是裸 JSONoverride:总是覆盖override-raw:总是覆盖,值是裸 JSONfilter:删除指定字段
JSON path 是 sjson 语法。
Amp 集成
ampcode:
upstream-url: "https://ampcode.com"
upstream-api-key: ""
model-mappings:
- from: "claude-opus-4-5-20251101"
to: "gemini-claude-opus-4-5-thinking"客户端伪装(重要)
Claude Code 的部分上游会校验 User-Agent / package version:
claude-header-defaults:
user-agent: "claude-cli/2.1.44 (external, sdk-cli)"
package-version: "0.74.0"
runtime-version: "v24.3.0"
os: "MacOS"
arch: "arm64"
stabilize-device-profile: falseCodex 类似:
codex-header-defaults:
user-agent: "codex_cli_rs/0.114.0 (Mac OS 14.2.0; x86_64) vscode/1.111.0"
beta-features: "multi_agent"这些值需要随官方客户端版本走,太旧会被上游拒绝。CPA 自带兜底逻辑,但偶尔需要手动更新。
热更新
config.yaml 改了不需要 restart 容器:CPA 启动了 file watcher,会自动重新加载(OAuth 凭据增删也是)。但如果改的是端口、TLS 等启动期参数,需要 restart。
下一步:09-troubleshooting.md 常见问题。