claude-and-codex
解锁 Claude Code 新玩法:接入 ChatGPT,模型自由切换
随着现在claude code封号严重,gpt-5.4的效果也还不错,奥特曼的封禁也没有Claude那么严重,并且GPT现在还有很多低价
- 咸鱼Team拼车-几块钱的拼车号拉上5个小号可以用几天,最近封号有点严重
- 教育版
- Plus直冲
但是我已经习惯了 Claude Code 这一整套 coding workflow,不换工具,直接把底层模型切到 ChatGPT / GPT-5.4,此教程采用CLIProxyAPI方式进行处理,还可以使用Sub2api(比较重,适合中转站部署,我个人单机跑就用CPA了)
Claude Code 原生走的是 Anthropic 协议,所以你需要一个中间层,把它的请求接住,再转发到 OpenAI / Codex 线路上。现在最常见、也最好用的一套方案,就是:
- CLIProxyAPI:本地代理层,负责协议转换、账号托管、统一对外暴露接口
这篇文章不讲空话,直接带你把整条链路跑起来。
测试环境:
- Windows 10/11
- PowerShell
- Claude Code 2.x
基本链路
链路是这样:
- Claude Code 继续按 Anthropic 协议发请求
- CLIProxyAPI 在本地接住请求
- CLIProxyAPI 再把请求转发到 OpenAI / Codex 登录态
- 返回结果,再伪装成 Claude 兼容响应回给 Claude Code
所以真正要配的重点有三个:
CLIProxyAPI跑起来Codex OAuth登录成功ANTHROPIC_BASE_URL指到本地代理

简单介绍一下CPA
CPA主要是指后端代理CLIProxyAPI,基于管理的方便性和实时观测,我这里也引入了CPA-Dashboard 这个前端管理面板是可以不安装的,CPA官方也提供了面板,但是感觉没那么好用
CPA你可以简单把它理解成:
给各种 AI CLI 客户端做一个统一的本地网关。
它能做什么?
- 把不同上游统一成兼容接口
- 托管多种 provider 的登录态
- 给本地客户端一个固定的 Base URL
- 支持账号切换、日志、部分配额查看、可视化管理
这篇文章就是让 Claude Code 继续“以为”自己在请求 Anthropic,实际上底层走的是你已经登录好的 OpenAI / Codex。
开始前,先准备这几样东西
建议你先确认下面这些条件都满足:
- Claude Code 本身已经能正常启动
- 你有一个可用的 OpenAI / Codex 登录态
- PowerShell 能正常执行命令
- 这些端口没有被占用:
8317、1455、5000
这几个端口分别是:
8317:CLIProxyAPI 默认服务端口1455:Codex OAuth 本地回调端口5000:CPA-Dashboard 默认 Web 端口
如果你是在远程服务器上折腾,后面还要考虑端口转发。
5 步把 Claude Code 接入 GPT
第 1 步:下载 CLIProxyAPI,准备配置文件
先去这两个地址:
- 项目仓库:router-for-me/CLIProxyAPI
- 官方文档:help.router-for.me
可以直接在https://github.com/router-for-me/CLIProxyAPI/releases/下载最新版本,注意你的操作系统不要下载错了
下载以后是一个压缩包,进行解压放到你的常用目录,解压以后有下面的文件

将config.example.yaml复制出来改为 config.yaml,先写最小可跑配置,其他内容忽略就可以:
1 | port: 8317 |
这三个字段的作用很简单:
port:本地代理监听端口auth-dir:保存 OAuth 登录态的目录api-keys:本地客户端访问 CLIProxyAPI 时要带的 Keyremote-management控制台登录配置allow-remote默认是false 如果想等界面改为truesecret-key就是对应的密码,管理密钥。若填写明文,启动时会自动哈希后生效。"$2a$10$FwrQR5eyFDz.24Xg4byK5OnfkZ/8lamfnxR1qUKLTpX5FlqjemErK"
这里这个 sk-local-cpa 不是 OpenAI 官方 Key。
它只是你自己给本地代理设的访问口令,后面 Claude Code 会拿这个值去访问 CLIProxyAPI。
第 2 步:启动 CLIProxyAPI 代理服务
windows 源码 go语言构建
还是在 CLIProxyAPI 目录执行:
1 | .\cli-proxy-api.exe --config .\config.yaml |

macOS brew构建
1 | brew install cliproxyapi |
使用 Homebrew 安装并通过
brew services运行时,默认配置文件路径是$(brew --prefix)/etc/cliproxyapi.conf(Apple Silicon 常见为/opt/homebrew/etc/cliproxyapi.conf,Intel 常见为/usr/local/etc/cliproxyapi.conf)。 如果你希望继续使用~/.cli-proxy-api/config.yaml作为主配置,可将默认路径软链接到该文件:
1
2
3
4 brew services stop cliproxyapi
mv "$(brew --prefix)/etc/cliproxyapi.conf" "$(brew --prefix)/etc/cliproxyapi.conf.bak"
ln -s ~/.cli-proxy-api/config.yaml "$(brew --prefix)/etc/cliproxyapi.conf"
brew services start cliproxyapi
常用命令
| 命令 | 用途 |
|---|---|
./CLIProxyAPI |
启动代理服务器(默认模式) |
./CLIProxyAPI -config /path/to/config.yaml |
使用自定义配置路径启动 |
./CLIProxyAPI -login |
认证 Google 账户以使用 Gemini |
./CLIProxyAPI -claude-login |
通过 OAuth 认证 Claude |
./CLIProxyAPI -codex-login |
通过 OAuth 认证 Codex |
./CLIProxyAPI -qwen-login |
通过 OAuth 认证 Qwen |
./CLIProxyAPI -tui |
启动终端管理 UI |
./CLIProxyAPI -tui -standalone |
启动带有嵌入式服务器的 TUI |
./CLIProxyAPI -debug -config ./config.yaml |
启用调试日志并指定配置文件启动 |
正常情况下,它会监听:
1 | http://127.0.0.1:8317 |
如果你只是想先确认服务起来了没有,可以在另一个 PowerShell 窗口执行:
1 | curl http://127.0.0.1:8317/ |
只要能拿到页面响应,说明代理基本跑起来了。
这一步建议你不要跳,先确认代理活着,再去接 Claude Code。
你也可以直接在浏览器打开http://127.0.0.1:8317/management.html,进入他的控制台界面,第一次登录会需要你输入密码,密码是配置文件中配置的
页面内容

第 3 步:先完成 OpenAI / Codex 登录
在命令行中进入 CLIProxyAPI 目录,执行:
1 | .\cli-proxy-api.exe --codex-login |
1 | cliproxyapi --codex-login |
如果你不想自动弹浏览器,也可以这样:
1 | .\cli-proxy-api.exe --codex-login --no-browser |
1 | cliproxyapi --codex-login --no-browser |
它会给你一个登录链接,浏览器打开后按提示完成 OAuth。

选择你的GPT账号进行登录,然后进行授权操作,最后会提示你授权成功

这里注意两件事:
Codex OAuth的本地回调端口是1455- 如果你在远程机器上运行 CLIProxyAPI,需要做端口转发,否则登录回调接不回来
登录成功后,认证信息会写入你配置的 auth-dir 目录。
如果这一步没成功,后面所有步骤都不用继续。
界面配置
如果你不想使用命令行,可以在CPA自带的管理界面进行身份认证,这时候你需要提前执行第3步,运行起来CPA 然后访问http://127.0.0.1:8317/management.html

在浏览器中打开对应链接,还是使用你的gpt账号登录,登录成功以后,复制完整 URL 并提交到这里,然后点击提交回调URL完成认证。
认证成功以后可以在配额管理查看自己的账号信息

如果认证失败修改修改cliproxyapi的配置文件config.yaml中的vpn代理urlproxy-url="127.0.0.1:7890"

第 4 步:把 Claude Code 的上游改到本地 CLIProxyAPI
这一段是整篇教程里最关键的一步。
Claude Code 认的是 Anthropic 相关环境变量,所以你要做的不是配 OpenAI 变量,而是让 Anthropic 变量指向本地代理。
修改Claude Code 配置
如果你已经安装了CC Switch 直接在CCS 增加一个供应商即可,也可以修改claude code 的配置文件settings.json

配置对应的模型,注意API格式和认证字段不要选错了

参考的配置如下,如果你没有CC Switch 直接修改配置文件settings.json ,一般在C盘你的用户目录的.claude(Windows)
1 | { |
ANTHROPIC_AUTH_TOKEN是你自己的配置文件中配置的api-keys不是secret-keys,不要写错了
附上目前支持的模型(Plus订阅 20260329)

第 5 步:验证
直接打开你的Claude Code (如果已经存在则需要重新打开)
比如直接问一句:
1 | 请先不要改代码,只告诉我你当前使用的模型路由和 reasoning effort。 |

到这里你的Claude Code 就可以使用GPT的最新模型了
注意事项
- CLIProxyAPI 后台运行不要关闭
- 代理软件不要关闭,否则没有办法请求OpenAI
- GPT需要有额度
如果你想类似于中转站的用法,可以自己从远程服务器进行部署,不用每次自己本机启动对应的应用
服务器部署建议使用docker部署或者官方提供的一键部署脚本
Linux 一键部署 curl -fsSL https://raw.githubusercontent.com/brokechubb/cliproxyapi-installer/refs/heads/master/cliproxyapi-installer | bash
Docker 部署 docker run --rm -p 8317:8317 -v /path/to/your/config.yaml:/CLIProxyAPI/config.yaml -v /path/to/your/auth-dir:/root/.cli-proxy-api eceasy/cli-proxy-api:latest
最新资讯,关注公众号【AI早班车】
- 官方使用文档地址:https://help.router-for.me/cn/
- CLIProxyAPI 项目:https://github.com/router-for-me/CLIProxyAPI
配置文件的中文对应说明
1 | # 服务器绑定主机/接口,默认空字符串同时绑定 IPv4/IPv6。 |
claude指令
| 命令 | 解释 | 使用场景 |
|---|---|---|
| /clear | 清空上下文 | 需要重新开始,感觉AI无法解决问题了 |
| /compact | 压缩对话 | 重开对话,但是不要丢掉之前的记忆 |
| /cost | 花费 | max不需要看,API用户可以看到 |
| /logout /login | 登出 登陆 | 切换账号 |
| /model | 切换模型 | 200刀可以使用opus模型,100刀没有选择 |
| /status | 状态 | 查看当前claude code的状态 |
| /doctor | 检测 | 检测claude code安装状态 |
| shift+tab | 模式切换 | ⏵⏵accept edits on ⏸ plan mode on 正常模式 |
Yolo模式:权限放开
claude --dangerously-skip-permissions进入Yolo模式,此时claude拥有更高权限,shfit+tab调整模式,灵活切换权限细粒度。
CLAUDE.md: 全局记忆核心
- 建初始CLAUDE.md
- 对话长度接近溢出时运行
/compact续命 - 达到里程碑时要求Claude Code根据进度更新CLAUDE.md
- 循环整个过程直到结束
CLAUDE.md是一个持续发挥作用的全局变量。
CLAUDE.md注意事项: - 文件不要太长,CC默认会读这个文件
- 会话为省事,说CLAUDE.md时CC也可以懂
- 官方的’#'进文档据GPT说有个bug不稳定
- 文件里适合放提醒事项
会话管理:避免失控,高效推进
1. 随时暂停与回滚
ESC暂停当前操作,思路跑偏、跑的慢- 按
ESC两次可回退到历史对话节点(注意无redo功能,回退前确认) - 代码不满意?直说“会滚到上次代码”,Claude会自动恢复之前版本
2. 应对历史溢出
当会话提示"Context left until auto-compact: 3%",说明历史记录快满了。此时会自动触发压缩(约150秒),也可手动用/compact命令续命,避免对话中断。
3. 恢复与查看历史
- 用
claude -c直接进入上次对话 - 用
claude -r选择历史会话恢复,适合中途退出后继续工作
资源监控与批量任务:把控节奏不浪费
- 实时监控token用量
想知道每天/每小时消耗多少资源?运行npx ccusage@latest查看按天用量,或npx ccusage blocks --live实时监控消耗速度。若速度过快,可手动处理git commit等token的操作,避免超额。 - 批量任务高效处理
需要执行几十个重复任务用脚本式用法:
- 把任务按行写入
TASK.md(一行一个任务) - 运行命令:
cat TASK.md | while IFS= read -r line; do echo $line; claude -p "$line" --debug; done可加timeout防止单个任务卡死,同时用--allowedTools "Edit"限制权限,避免意外操作。注意不要并发执行,否则可能触发限额封禁。
Claude Desktop配置CLIPROXYAPI
下面给你一套 macOS(Apple Silicon M3)+ Nginx + CLIProxyAPI + Claude Desktop 的完整可用方案。
目标:
1 | Claude Desktop ↓ HTTPShttps://claude.local ↓ Nginxhttp://127.0.0.1:8317 ↓CLIProxyAPI |
这是目前在 macOS 上最稳定的本地方案。
一、整体思路
Claude Desktop 不接受:
1 | http://127.0.0.1:8317 |
它要求:
- HTTPS
- 有效证书
- Anthropic Messages API 格式
所以:
1 | CLIProxyAPI (HTTP)→ Nginx HTTPS→ Claude Desktop |
二、安装 Homebrew(如果没装)
终端:
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
M3 芯片默认路径:
1 | /opt/homebrew |
验证:
1 | brew -v |
三、安装 Nginx
1 | brew install nginx |
启动:
1 | brew services start nginx |
验证:
1 | curl http://127.0.0.1:8080 |
如果看到:
1 | Welcome to nginx! |
说明成功。
四、安装 mkcert(本地 HTTPS 证书)
macOS 本地 HTTPS 最稳方案。mkcert 是一个用于生成本地受信任 SSL/TLS 证书的开源工具,由 Filippo Valsorda 开发,支持跨平台(Windows、macOS、Linux)。Firefox 不使用系统根证书存储,而是使用自己的 NSS 证书数据库,nss是由 Mozilla 开发的一套安全库,广泛用于 Firefox 浏览器和其他应用中处理 SSL/TLS 加密。
安装:
1 | brew install mkcertbrew install nss |
初始化本地 CA:
1 | mkcert -install |
你会看到:
1 | The local CA is now installed in the system trust store! |
五、创建本地域名
编辑 hosts:
1 | sudo nano /etc/hosts |
添加:
1 | 127.0.0.1 claude.local |
保存:
1 | Control + OEnterControl + X |
测试:
1 | ping claude.local |
应该解析:
1 | 127.0.0.1 |
六、生成 HTTPS 证书
创建目录:
1 | mkdir -p ~/nginx-certscd ~/nginx-certs |
生成:
1 | mkcert claude.local |
得到:
1 | claude.local.pemclaude.local-key.pem |
七、配置 Nginx
Homebrew Nginx 配置目录:
1 | /opt/homebrew/etc/nginx/ |
编辑:
1 | nano /opt/homebrew/etc/nginx/nginx.conf |
删除原来的 server 部分。
加入:
1 | events {}http { server { listen 443 ssl; server_name claude.local; ssl_certificate /Users/你的用户名/nginx-certs/claude.local.pem; ssl_certificate_key /Users/你的用户名/nginx-certs/claude.local-key.pem; location / { proxy_pass http://127.0.0.1:8317; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_buffering off; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }} |
⚠️ 替换:
1 | 你的用户名 |
例如:
1 | /Users/chauchyliu/nginx-certs/ |
八、检查 Nginx 配置
1 | nginx -t |
如果看到:
1 | syntax is oktest is successful |
重启:
1 | brew services restart nginx |
九、测试 HTTPS
浏览器打开:
1 | https://claude.local |
应该:
- 没有证书错误
- 能看到 CLIProxyAPI 返回
或者:
1 | curl https://claude.local/v1/models |
如果是自签本地证书但已 trust,不需要 -k。
十、启动 CLIProxyAPI
例如:
1 | cliproxyapi |
或者:
1 | python main.py |
确认:
1 | curl http://127.0.0.1:8317/v1/models |
正常返回模型列表。
十一、配置 Claude Desktop
开启开发模式:
1 | Help→ Troubleshooting→ Enable Developer Mode |
重启 Claude Desktop。
然后:
1 | Developer→ Configure Third-Party Inference |
填写:
| 项目 | 内容 |
|---|---|
| Gateway URL | https://claude.local |
| API Key | CLIProxyAPI key |
| Auth Scheme | Bearer |
⚠️ 注意:
不要写:
1 | https://claude.local/v1 |
只写:
1 | https://claude.local |
十二、验证是否成功
Claude Desktop 输入:
1 | 你好,请告诉我你当前的模型名称 |
如果走通:
- 会由 CLIProxyAPI 转发
- Claude Desktop 不再使用官方 API
十三、排错(macOS 最常见)
1. 443 被占用
查看:
1 | sudo lsof -i :443 |
如果是 AirPlay:
1 | 系统设置→ 通用→ AirDrop 与接力→ 关闭 AirPlay Receiver |
2. nginx: permission denied
macOS 有时限制 443。
解决:
1 | sudo brew services restart nginx |
或者改成:
1 | listen 8443 ssl; |
然后:
1 | https://claude.local:8443 |
3. Claude Desktop 不信任证书
重新:
1 | mkcert -install |
然后重启 Claude Desktop。
4. Claude Desktop 仍报 API 错误
先测试:
1 | curl https://claude.local/v1/messages \ -H "Authorization: Bearer sk-xxx" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model":"claude-sonnet-4-5", "max_tokens":100, "messages":[{"role":"user","content":"hi"}] }' |
如果 curl 不通:
不是 Claude Desktop 的问题。
十四、推荐的最终结构(最稳)
推荐:
1 | Claude Desktop ↓Nginx HTTPS ↓CLIProxyAPI ↓Claude Code OAuth |
这是目前 macOS M 系列最稳定的本地 Gateway 方案。
不使用系统nginx
可以,macOS 上非常推荐你使用“用户级 Nginx”,不要用:
1 | brew services start nginx |
因为:
- 会注册系统 LaunchAgent
- 容易遇到 443 权限
- 会和系统 AirPlay 冲突
- 配置目录容易混乱
- Claude Desktop 调试不方便
推荐方式:
1 | 用户目录运行 nginx→ 非 root→ 自定义配置→ 自定义端口→ 完全独立 |
这是 M3/macOS 上最干净的方案。
一、推荐目录结构
建议:
1 | ~/workspace/nginx/├── conf/│ └── nginx.conf├── logs/├── certs/└── run/ |
创建:
1 | mkdir -p ~/workspace/nginx/{conf,logs,certs,run} |
四、创建用户自己的 nginx.conf
创建:
1 | nano ~/workspace/nginx/conf/nginx.conf |
完整内容:
1 | worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; access_log /Users/你的用户名/workspace/nginx/logs/access.log; error_log /Users/你的用户名/workspace/nginx/logs/error.log; server { listen 8443 ssl; server_name claude.local; ssl_certificate /Users/你的用户名/workspace/nginx/certs/claude.local.pem; ssl_certificate_key /Users/你的用户名/workspace/nginx/certs/claude.local-key.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://127.0.0.1:8317; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_buffering off; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }} |
⚠️ 替换:
1 | 你的用户名 |
例如:
1 | /Users/chauchyliu/ |
五、解决 mime.types 问题
Homebrew nginx 的 mime.types 在:
1 | /opt/homebrew/etc/nginx/mime.types |
所以修改:
1 | include mime.types; |
改成:
1 | include /opt/homebrew/etc/nginx/mime.types; |
最终:
1 | include /opt/homebrew/etc/nginx/mime.types; |
六、启动用户自己的 nginx
不要用 system service。
直接:
1 | /opt/homebrew/bin/nginx \ -p ~/workspace/nginx \ -c conf/nginx.conf |
参数解释:
| 参数 | 作用 |
|---|---|
| -p | nginx 工作目录 |
| -c | 指定配置 |
七、验证 nginx
查看:
1 | ps aux | grep nginx |
测试:
1 | curl https://claude.local:8443/v1/models |
如果证书已经 trust:
- 不需要
-k
应该返回 CLIProxyAPI 模型列表。
八、Claude Desktop 配置
填写:
1 | Gateway URL:https://claude.local:8443 |
⚠️ 注意:
因为我们不是 443:
必须写端口。
九、停止 nginx
1 | /opt/homebrew/bin/nginx \ -p ~/workspace/nginx \ -c conf/nginx.conf \ -s stop |
十、重载配置
修改配置后:
1 | /opt/homebrew/bin/nginx \ -p ~/workspace/nginx \ -c conf/nginx.conf \ -s reload |
十一、查看日志
访问日志:
1 | tail -f ~/workspace/nginx/logs/access.log |
错误日志:
1 | tail -f ~/workspace/nginx/logs/error.log |
Claude Desktop 连不上时非常有用。
十二、推荐的最终结构(M3 最稳)
推荐:
1 | Claude Desktop ↓ HTTPS :8443用户级 nginx ↓ HTTPCLIProxyAPI :8317 ↓Claude Code OAuth |
优点:
- 不需要 root
- 不污染系统 nginx
- 不占用 443
- 不和 AirPlay 冲突
- 可以多个代理共存
- Claude Desktop 最稳定
- macOS M3 最推荐方案
这是现在 Apple Silicon 上最干净的本地反代结构。
curl https://claude.local:8443/v1/models ─╯ curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to claude.local:8443
已思考若干秒
这个错误通常表示:8443 端口有进程在监听,但它没有正常提供 TLS/HTTPS,或者 Nginx 没有按 SSL 配置启动。
按下面顺序排查。
1. 先看 8443 到底是谁在监听
1 | lsof -nP -iTCP:8443 -sTCP:LISTEN |
如果不是 nginx,先停掉那个进程。
2. 检查 Nginx 配置是否真的启用了 ssl
执行:
1 | /opt/homebrew/bin/nginx \ -p ~/workspace/nginx \ -c conf/nginx.conf \ -t |
如果报错,把错误贴出来。
你的 server 必须类似这样:
1 | server { listen 8443 ssl; server_name claude.local; ssl_certificate /Users/你的用户名/workspace/nginx/certs/claude.local.pem; ssl_certificate_key /Users/你的用户名/workspace/nginx/certs/claude.local-key.pem; location / { proxy_pass http://127.0.0.1:8317; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; proxy_buffering off; }} |
重点是这一行必须有 ssl:
1 | listen 8443 ssl; |
3. 重启用户级 Nginx
1 | /opt/homebrew/bin/nginx \ -p ~/workspace/nginx \ -c conf/nginx.conf \ -s stop |
如果提示没有运行,没关系。
重新启动:
1 | /opt/homebrew/bin/nginx \ -p ~/workspace/nginx \ -c conf/nginx.conf |
4. 看错误日志
1 | cat ~/workspace/nginx/logs/error.log |
如果有类似:
1 | cannot load certificatepermission deniedBIO_new_file failed |
说明证书路径或权限不对。
5. 先用 OpenSSL 测 TLS
1 | openssl s_client -connect claude.local:8443 -servername claude.local |
正常的话会看到证书信息。
如果还是立刻断开,说明 Nginx 没有正确提供 HTTPS。
6. 确认 CLIProxyAPI 本身正常
1 | curl http://127.0.0.1:8317/v1/models |
如果这个也不通,先启动 CLIProxyAPI。
7. 最常见修复版 nginx.conf
把你的配置先替换成这个,记得改用户名:
1 | worker_processes 1;events { worker_connections 1024;}http { include /opt/homebrew/etc/nginx/mime.types; default_type application/octet-stream; access_log /Users/你的用户名/workspace/nginx/logs/access.log; error_log /Users/你的用户名/workspace/nginx/logs/error.log debug; server { listen 8443 ssl; server_name claude.local; ssl_certificate /Users/你的用户名/workspace/nginx/certs/claude.local.pem; ssl_certificate_key /Users/你的用户名/workspace/nginx/certs/claude.local-key.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://127.0.0.1:8317; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_buffering off; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }} |
然后:
1 | /opt/homebrew/bin/nginx -p ~/workspace/nginx -c conf/nginx.conf -t/opt/homebrew/bin/nginx -p ~/workspace/nginx -c conf/nginx.conf -s stop/opt/homebrew/bin/nginx -p ~/workspace/nginx -c conf/nginx.confcurl -v https://claude.local:8443/v1/models |
最可能的问题是:listen 8443; 少了 ssl,或者 Nginx 实际加载的不是你改的那个配置文件。
curl -vk https://claude.local:8443/v1/models \ -H “Authorization: Bearer sk-local-cpa” * Uses proxy env variable https_proxy == ‘http://127.0.0.1:7890’ * Trying 127.0.0.1:7890… * Connected to 127.0.0.1 (127.0.0.1) port 7890 * CONNECT tunnel: HTTP/1.1 negotiated * allocate connect buffer * Establish HTTP proxy tunnel to claude.local:8443 > CONNECT claude.local:8443 HTTP/1.1 > Host: claude.local:8443 > User-Agent: curl/8.5.0 > Proxy-Connection: Keep-Alive > < HTTP/1.1 200 Connection established < * CONNECT phase completed * CONNECT tunnel established, response 200 * ALPN: curl offers h2,http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to claude.local:8443 * Closing connection curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to claude.local:8443
问题找到了:你的 curl 走了代理。
关键日志:
1 | Uses proxy env variable https_proxy == 'http://127.0.0.1:7890'CONNECT claude.local:8443 |
它没有直连本机 Nginx,而是先走了 127.0.0.1:7890 代理,所以 TLS 被代理干扰了。
直接绕过代理测试
执行:
1 | curl --noproxy '*' -vk https://claude.local:8443/v1/models \ -H "Authorization: Bearer sk-local-cpa" |
或者:
1 | NO_PROXY=claude.local,127.0.0.1,localhost curl -vk https://claude.local:8443/v1/models \ -H "Authorization: Bearer sk-local-cpa" |
永久修复
在你的 shell 配置里加入:
1 | export NO_PROXY="localhost,127.0.0.1,::1,claude.local"export no_proxy="localhost,127.0.0.1,::1,claude.local" |
如果你用 zsh:
1 | nano ~/.zshrc |
加入后:
1 | source ~/.zshrc |
再测试
1 | curl --noproxy '*' -vk https://claude.local:8443/v1/models \ -H "Authorization: Bearer sk-local-cpa" |
这次应该会直接连:
1 | Trying 127.0.0.1:8443 |
而不是:
1 | Trying 127.0.0.1:7890 |
我需要用代理怎么半
你这种场景应该:
1 | 外网请求走代理本地 localhost / claude.local 不走代理 |
这是标准做法。
你不能让:
1 | https://claude.local:8443 |
也走 Clash/Surge/V2Ray 代理,否则:
- CONNECT tunnel
- 自签 TLS
- 本地域名
- mkcert CA
会全部冲突。
正确方案:配置 NO_PROXY
保留:
1 | https_proxy=http://127.0.0.1:7890 |
同时增加:
1 | export NO_PROXY="localhost,127.0.0.1,::1,claude.local"export no_proxy="localhost,127.0.0.1,::1,claude.local" |
macOS(zsh)永久配置
编辑:
1 | nano ~/.zshrc |
加入:
1 | export https_proxy=http://127.0.0.1:7890export http_proxy=http://127.0.0.1:7890export NO_PROXY="localhost,127.0.0.1,::1,claude.local"export no_proxy="localhost,127.0.0.1,::1,claude.local" |
生效:
1 | source ~/.zshrc |
验证是否成功
执行:
1 | env | grep -i proxy |
应该看到:
1 | https_proxy=http://127.0.0.1:7890NO_PROXY=localhost,127.0.0.1,::1,claude.local |
再测试
1 | curl -vk https://claude.local:8443/v1/models \ -H "Authorization: Bearer sk-local-cpa" |
这次应该:
1 | Trying 127.0.0.1:8443 |
而不是:
1 | Trying 127.0.0.1:7890 |
如果你用 Clash Verge / Mihomo / Surge
更推荐:
在代理软件里增加直连规则
例如 Clash:
1 | rules: - DOMAIN,claude.local,DIRECT - DOMAIN-SUFFIX,local,DIRECT - IP-CIDR,127.0.0.0/8,DIRECT |
或者 Surge:
1 | [Rule]DOMAIN,claude.local,DIRECTIP-CIDR,127.0.0.0/8,DIRECT |
这是最稳的。
为什么必须这样
因为:
1 | claude.local → 本机 nginx → 本机 CLIProxyAPI |
本来是:
1 | 本机回环通信 |
你现在却:
1 | 先发给代理代理再 CONNECT 回本机 |
TLS 会非常容易炸。
Claude Desktop 后续也一样
Claude Desktop 本身:
- 可以继续全局走代理
- 但
claude.local必须 DIRECT
否则:
1 | Third-Party Gateway |
也会 TLS 握手失败。
如果你用 Clash Verge / Mihomo
打开配置 YAML。
增加规则:
1 | rules: |
放在:
1 | MATCH |
之前。
例如:
1 | rules: |
然后:
1 | Reload Profile |
最推荐结构(你现在应该这样)
1 | Claude Desktop ↓(系统代理)Clash/Surge ↓ rulesclaude.local → DIRECT其它域名 → Proxy |
这样:
1 | Claude Desktop → claude.local |
会:
1 | 直连本机 nginx |
而:
1 | Claude 官方服务GitHubOAuth |
继续走代理。
这是目前 macOS 上最稳的方式。
Your provider setup needs a fix Some required fields are missing or malformed. Open Setup to finish configuring it. Details message: Invalid custom3p enterprise config: inferenceModels: configured model “gpt-5.5” is not an Anthropic model. Gateway deployments require an Anthropic model from the provider catalog — expected a gateway model route referencing an Anthropic model (e.g. claude-sonnet-4-5, anthropic/claude-*). Name routes to match the underlying model. failingField: inferenceModels checkedAt: 2026-05-12T09:08:09.815Z
这个报错说明:Claude Desktop Gateway 只能配置 Anthropic 模型名,不能填:
1 | gpt-5.5 |
它要求模型名像:
1 | claude-sonnet-4-5anthropic/claude-* |
所以你要做的是:把 CLIProxyAPI 里的路由名伪装成 Anthropic 模型名。
你应该在 Claude Desktop 填
不要填:
1 | gpt-5.5 |
改成:
1 | claude-sonnet-4-5 |
或:
1 | anthropic/claude-sonnet-4-5 |
但 CLIProxyAPI 也必须认识这个名字
你现在 CLIProxyAPI 报过:
1 | unknown provider for model claude-gpt5.5 |
所以需要在 CLIProxyAPI 配置里加模型别名,例如:
1 | model_aliases: claude-sonnet-4-5: gpt-5.5 |
或者类似格式,取决于 CLIProxyAPI 的配置项名称。
核心目标是:
1 | Claude Desktop 发送:claude-sonnet-4-5CLIProxyAPI 内部转到:gpt-5.5 |
最终链路
1 | Claude Desktop model: claude-sonnet-4-5 ↓Nginx ↓CLIProxyAPI alias claude-sonnet-4-5 → gpt-5.5 |
先临时测试
你可以直接 curl:
1 | curl --noproxy '*' -k https://claude.local:8443/v1/messages \ -H "Authorization: Bearer sk-local-cpa" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 100, "messages": [ {"role": "user", "content": "hi"} ] }' |
如果还是:
1 | unknown provider for model claude-sonnet-4-5 |
就说明 CLIProxyAPI 没有这个别名,需要加 alias。
重点结论
Claude Desktop 这一层:
1 | 必须填 Anthropic 风格模型名 |
CLIProxyAPI 这一层:
1 | 必须把这个 Anthropic 风格模型名映射到真实后端模型 |
否则 Claude Desktop 配置检查永远不会通过。
我想用下面的api-key, 这个key和其他key的区别是什么,claude会调哪一个 api-keys: #本地客户端访问 CLIProxyAPI 时要带的 Key - “sk-local-cpa”
你这里的:
1 | api-keys: |
不是上游模型厂商的 Key。
它只是:
1 | CLIProxyAPI 自己的本地鉴权 Key |
也就是:
1 | 谁可以访问你的 CLIProxyAPI |
它的作用
当你请求:
1 | http://127.0.0.1:8317 |
或者:
1 | https://claude.local:8443 |
时必须带:
1 | Authorization: Bearer sk-local-cpa |
否则:
1 | {"error":"Missing API key"} |
它和真正模型 Key 的区别
你配置里通常会同时存在:
1. 本地访问 Key(你现在这个)
1 | api-keys: |
作用:
1 | 保护 CLIProxyAPI |
客户端:
- Claude Desktop
- curl
- OpenWebUI
- Cherry Studio
访问时用它。
2. 上游 Provider Key(真正花钱的)
例如:
1 | openai-api-key: |
或者:
1 | anthropic-api-key: |
或者:
1 | openrouter-api-key: |
作用:
1 | CLIProxyAPI 调 OpenAI / Anthropic / Gemini 时使用 |
真正扣费的是这些。
Claude Desktop 实际会调哪一个
Claude Desktop:
1 | 只知道 sk-local-cpa |
流程:
1 | Claude Desktop ↓ Authorization: Bearer sk-local-cpaCLIProxyAPI ↓ 根据 model alias选择 provider ↓使用真正 provider api-key |
例如:
1 | openai-api-key: |
那么:
1 | Claude Desktop model=claude-sonnet-4-5 key=sk-local-cpa |
CLIProxyAPI 会:
1 | 自动转成:OpenAImodel=gpt-5.5 key=sk-openai-real |
你可以理解成
sk-local-cpa
是:
1 | 你家大门钥匙 |
sk-openai-real
是:
1 | CLIProxyAPI 去 OpenAI 付款的银行卡 |
Claude Desktop 不会直接接触真正 OpenAI Key
它永远只看到:
1 | sk-local-cpa |
这也是 CLIProxyAPI 的核心价值:
1 | 统一代理统一鉴权统一路由隐藏真实 provider key |
最终完整结构
1 | Claude Desktop |
你的最终目标配置
你应该:
Claude Desktop
填:
1 | API Key: |
CLIProxyAPI
配置:
1 | api-keys: |
这样就完整打通了。
我想使用OAuth 登录以订阅的方式请求供应商而不是通过供应商的api-key访问模型,我应该如何配置使claude多个模型匹配订阅的多个模型
我会基于你上传的 CLIProxyAPI 配置结构来讲:本地访问 Key、OAuth/订阅凭据、模型 alias 三者怎么配合,以及 Claude Desktop 最终会命中哪个订阅模型。
已思考 11s
可以。你这个配置文档里对应的是 OAuth 模型别名,不是 api-key 模型别名。
关键段落是:
1 | oauth-model-alias: |
你要用订阅/OAuth,不用供应商 API key
那就不要配:
1 | openai-api-key: |
而是用已经 OAuth 登录保存到:
1 | auth-dir: "~/.cli-proxy-api" |
里的登录态。
api-keys 仍然要保留:
1 | api-keys: |
它只是 Claude Desktop 访问你本地 CLIProxyAPI 的口令,不是供应商 key。
多个 Claude 模型 alias 到订阅模型
例如你想让 Claude Desktop 看到 Anthropic 风格模型名:
1 | claude-sonnet-4-5 |
但实际走 Codex OAuth 订阅里的多个 GPT 模型,可以这样:
1 | oauth-model-alias: |
含义:
1 | Claude Desktop 请求 claude-sonnet-4-5 → CLIProxyAPI 实际路由到 codex OAuth 的 gpt-5 |
如果你是 Claude OAuth 订阅
那写在 claude: 下:
1 | oauth-model-alias: |
如果你是 Gemini CLI / AI Studio OAuth
1 | oauth-model-alias: |
配完后重启 CLIProxyAPI
1 | pkill -f cli-proxy-api |
然后重新启动。
验证:
1 | curl --noproxy '*' http://127.0.0.1:8317/v1/models \ -H "Authorization: Bearer sk-local-cpa" |
你应该能看到:
1 | claude-sonnet-4-5 |
最后 Claude Desktop 里填:
1 | Gateway URL: https://claude.local:8443 |
不要再填 gpt-5.5。

