1. 为什么 Claude Code 接 Azure OpenAI 总在 Base URL 上翻车
Claude Code 默认只认 Anthropic 官方的 Messages API 协议,而 Azure OpenAI 走的是 OpenAI 兼容协议,两边的请求体、鉴权头、路径结构都不一样。你直接把ANTHROPIC_BASE_URL指向 Azure 的 endpoint,Claude Code 发出去的/v1/messages请求会直接撞上 404,因为 Azure 那边根本没有这个路由。claude-bridge 的作用就是在本地起一个轻量代理,把 Claude Code 的 Anthropic 格式请求翻译成 Azure OpenAI 能听懂的格式,再把响应翻译回来。
这个链路适合谁:手头已经有 Azure OpenAI 资源、部署了 gpt-4o,但不想再单独维护一套 Anthropic Key 的 Node.js 开发者。尤其是团队里多个项目共用同一个 Azure 资源,Key 和 endpoint 散落在各个.env里,改一次配置要翻五个仓库。用 TaoToken 统一 Key 之后,你只需要在 claude-bridge 启动参数里填一次 endpoint 和 Key,Claude Code 侧只认本地代理地址,模型名和部署名的映射关系全部收敛到一处。
我试过最典型的翻车场景是这样的:Azure 门户里复制的 endpoint 是https://xxx.openai.azure.com/,你直接拿这个去填 claude-bridge 的-u参数,启动日志显示代理跑起来了,但 Claude Code 一发请求就报404 Resource not found。原因就是少了/openai/v1这段路径。Azure 的 OpenAI 兼容接口完整路径是https://{resource}.openai.azure.com/openai/v1,而 claude-bridge 需要的是这个完整前缀,不是门户首页那个裸域名。
另一个高频问题是模型名和部署名对不上。Azure OpenAI Studio 里创建部署时,你可以给 gpt-4o 起任意部署名,比如my-gpt4o-prod。claude-bridge 的-m参数填的必须是这个部署名,不是gpt-4o这个模型 ID。很多人习惯性填gpt-4o,结果 Azure 返回DeploymentNotFound。这个坑在本地开发环境尤其隐蔽,因为你在 Azure 门户里看到模型那一栏写着 gpt-4o,很容易以为参数就该填这个。
TaoToken 在这里的角色是统一 Key 管理。你不需要把 Azure 的原始 Key 硬编码到每个项目的启动脚本里,而是通过 TaoToken 生成一个统一 Key,在 claude-bridge 启动时通过环境变量注入。这样即使 Azure 那边轮换了 Key,你只需要在 TaoToken 控制台更新一次,所有走这个统一 Key 的 claude-bridge 实例都不用改配置。对于 Node.js 项目来说,这意味着你的package.json脚本、Dockerfile、CI 配置里都不再出现明文 Azure Key。
2. TaoToken 统一 Key 与 claude-bridge 的前置准备
在跑通链路之前,你需要把三样东西准备好:Node.js 环境、claude-bridge 代理、以及 TaoToken 统一 Key。这三者的关系是:claude-bridge 负责协议转换,TaoToken 负责 Key 的统一分发和 endpoint 收敛,Node.js 是运行环境。
先确认 Node.js 版本。claude-bridge 依赖 Node 18 以上的 fetch API,低于这个版本会在启动时报fetch is not defined。用node -v检查,如果低于 18,建议用 nvm 切一个 LTS 版本。Windows 用户如果遇到npx执行权限问题,用管理员权限打开 PowerShell 再跑。
node -v # 期望输出 v18.x 或更高接下来安装 Claude Code 和 claude-bridge。Claude Code 是全局 CLI,claude-bridge 用 npx 按需拉取即可,不需要全局安装。国内网络环境下 npm 官方源可能超时,建议切到 npmmirror。
npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com claude --versionclaude-bridge 首次运行会自动下载,输入y确认即可。如果你在 CI 环境里跑,可以用npx -y claude-bridge@latest跳过交互确认。
TaoToken 统一 Key 的获取路径:登录控制台后进入 API Keys 页面,创建一个新 Key,权限范围勾选模型调用。这个 Key 的格式和 Azure 原始 Key 不同,它是 TaoToken 侧生成的统一凭证。你需要在 claude-bridge 启动时把 Azure 的 endpoint 和这个统一 Key 一起传进去。TaoToken 的 API 入口是https://taotoken.net/api,控制台里可以查看当前 Key 的余额和调用日志。
这里有一个关键点:claude-bridge 的-k参数填的是 TaoToken 统一 Key,不是 Azure 原始 Key。TaoToken 在中间做了一层转发和鉴权,你的 Azure 原始 Key 不需要暴露在本地脚本里。如果你之前已经在 Azure 门户里配好了 gpt-4o 部署,只需要在 TaoToken 控制台把 Azure 资源绑定上去,拿到统一 Key 就能用。
环境变量建议提前写好,避免每次启动都手敲一长串参数。在项目根目录建一个.env.claude-bridge文件,内容如下:
AZURE_ENDPOINT=https://your-resource.openai.azure.com/openai/v1 TAOTOKEN_KEY=sk-你的统一Key AZURE_DEPLOYMENT=gpt-4o然后在启动脚本里 source 这个文件。注意.env.claude-bridge要加进.gitignore,不要提交到仓库。如果你用 Docker,把这些变量通过--env-file注入,不要写死在 Dockerfile 里。
3. 可复制的 claude-bridge 配置片段与 Node.js 启动脚本
这一节给出完整的可复制配置。claude-bridge 支持命令行参数和配置文件两种方式,我推荐用配置文件,因为参数多了之后命令行会很长,而且容易在复制粘贴时漏掉反斜杠。
先看命令行方式,适合快速验证:
npx claude-bridge@latest \ -u https://your-resource.openai.azure.com/openai/v1 \ -k sk-你的TaoToken统一Key \ -m gpt-4o \ --port 8000启动成功后你会看到类似输出:
Claude Bridge v1.x.x Server running at: http://localhost:8000 Target API: https://your-resource.openai.azure.com/openai/v1 Model: gpt-4o然后是配置文件方式。在项目根目录创建claude-bridge.config.json:
{ "upstream": { "baseUrl": "https://your-resource.openai.azure.com/openai/v1", "apiKey": "sk-你的TaoToken统一Key", "model": "gpt-4o", "apiVersion": "2024-08-01-preview" }, "server": { "port": 8000, "host": "127.0.0.1" }, "options": { "streaming": true, "maxTokens": 8192, "timeout": 120000 } }用配置文件启动:
npx claude-bridge@latest --config ./claude-bridge.config.jsonapiVersion这个字段容易被忽略。Azure OpenAI 的 REST API 需要显式指定api-version查询参数,不同版本对 gpt-4o 的支持程度不一样。2024-08-01-preview是实测下来对 gpt-4o 工具调用和流式响应支持比较完整的版本。如果你用的是更早的2024-02-15-preview,可能会遇到 function calling 参数被忽略的问题。
Node.js 项目里集成的话,可以在package.json的 scripts 里加一条:
{ "scripts": { "bridge": "claude-bridge --config ./claude-bridge.config.json", "claude": "ANTHROPIC_BASE_URL=http://127.0.0.1:8000 ANTHROPIC_AUTH_TOKEN=dummy claude" } }注意ANTHROPIC_AUTH_TOKEN填dummy就行,因为真正的鉴权在 claude-bridge 到 TaoToken 那一层已经做了。Claude Code 只认本地代理,它发过来的请求头里的 token 会被 claude-bridge 替换成 TaoToken 统一 Key。
如果你在 Windows 上跑,环境变量设置方式不同,用set或者 PowerShell 的$env::
$env:ANTHROPIC_BASE_URL="http://127.0.0.1:8000" $env:ANTHROPIC_AUTH_TOKEN="dummy" claude还有一个细节:claude-bridge 默认监听127.0.0.1,如果你在 Docker 容器里跑 Claude Code,需要把 host 改成0.0.0.0,并且把端口映射出来。但生产环境不建议暴露到公网,本地开发用127.0.0.1最安全。
4. 用 curl 验证 gpt-4o 是否正常返回
代理跑起来之后,不要急着开 Claude Code,先用 curl 直接打 claude-bridge 的本地端口,确认请求能穿透到 Azure 并拿到 gpt-4o 的响应。这一步能帮你把协议转换层和上游鉴权层的问题分开定位。
claude-bridge 暴露的是 Anthropic Messages API 格式的接口,所以 curl 请求体要按 Anthropic 的格式写:
curl -s http://127.0.0.1:8000/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: dummy" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "gpt-4o", "max_tokens": 128, "messages": [ {"role": "user", "content": "用一句话说明你是什么模型"} ] }'正常返回应该是一个 JSON,结构里包含content数组,里面有一项type为text,text字段是 gpt-4o 的回复。如果返回里出现choices字段,说明 claude-bridge 没有做响应格式转换,你大概率是直接打到了 Azure 的 OpenAI 兼容端点,而不是 claude-bridge 的本地端口。检查一下 curl 的 URL 是不是127.0.0.1:8000。
如果返回 401,先看 claude-bridge 的启动日志里有没有打印出上游请求的鉴权头。TaoToken 统一 Key 如果填错,claude-bridge 会在转发时收到 401,然后把错误透传回来。这时候去 TaoToken 控制台确认 Key 是否启用、余额是否充足。
如果返回 404 且错误信息是Resource not found,回到第 1 节说的路径问题,检查baseUrl是否包含/openai/v1。如果返回DeploymentNotFound,检查model字段填的是不是 Azure 里的部署名。
流式响应验证可以用-N参数关掉 curl 的缓冲:
curl -N -s http://127.0.0.1:8000/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: dummy" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "gpt-4o", "max_tokens": 256, "stream": true, "messages": [ {"role": "user", "content": "数到五"} ] }'你会看到 SSE 格式的data:行逐条输出,每条包含一个 delta。如果流式请求卡住不动,检查 claude-bridge 配置里的streaming是否为true,以及 Azure 部署的 gpt-4o 是否支持流式。gpt-4o 默认支持,但如果你在 Azure 门户里把部署的Streaming选项关掉了,就会一直挂起直到超时。
curl 验证通过之后,再启动 Claude Code:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8000 export ANTHROPIC_AUTH_TOKEN=dummy claude进入 Claude Code 后输入/model确认当前模型显示为 gpt-4o。然后随便问一个问题,观察 claude-bridge 终端里是否打印出POST /v1/messages的日志。如果 Claude Code 界面正常返回内容,说明整条链路通了。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错信息来对照排查。你遇到的大部分问题都能归到下面几类。
401 Unauthorized。claude-bridge 日志里会显示上游返回 401。先确认 TaoToken 统一 Key 是否复制完整,有没有多余空格。然后确认这个 Key 在 TaoToken 控制台里的状态是启用。如果 Key 没问题,检查 Azure 资源那边是否把 TaoToken 的调用来源加进了允许列表。有些 Azure 订阅默认限制外部调用,需要在资源的安全配置里放行。
local proxy failed / ECONNREFUSED。Claude Code 报这个错,说明它连不上ANTHROPIC_BASE_URL指定的地址。检查 claude-bridge 是否还在运行,端口是否被占用。用lsof -i :8000或netstat -ano | findstr 8000看端口状态。如果 claude-bridge 崩了,看它的日志最后几行,通常是上游超时或者配置解析失败导致进程退出。
reading choices 相关报错。这个错误通常出现在 claude-bridge 尝试解析 Azure 返回的响应时。如果 Azure 返回的是 OpenAI 格式的choices数组,但 claude-bridge 期望的是 Anthropic 的content数组,说明协议转换没生效。检查 claude-bridge 版本是否过旧,用npx claude-bridge@latest强制拉最新版。另外确认baseUrl没有多写或少写路径段,/openai/v1和/openai/deployments/xxx是两种不同的调用方式,claude-bridge 用的是前者。
OAuth 相关报错。Claude Code 启动时如果检测到ANTHROPIC_AUTH_TOKEN为空,会尝试走 OAuth 流程,弹出浏览器登录。在纯 API 模式下你不需要 OAuth,确保ANTHROPIC_AUTH_TOKEN设成了dummy或任意非空字符串。如果 Claude Code 仍然尝试 OAuth,检查是否有残留的~/.claude/settings.json里的oauth配置,把它删掉或者把ANTHROPIC_AUTH_TOKEN写进 settings 文件。
max_tokens 参数不兼容。如果你在 Azure 上部署的是较新的模型,可能会遇到Unsupported parameter: 'max_tokens'。gpt-4o 对max_tokens是兼容的,但如果你切到了其他模型,需要在 claude-bridge 配置里把maxTokens映射到max_completion_tokens。claude-bridge 的options.maxTokens字段会自动处理这个映射,前提是你用的版本支持。
CC Switch / Cline MCP / Codex auth.json 三件套。如果你同时用多个客户端,确保每个客户端的 Base URL、Key、Model ID 三件套都指向 claude-bridge 的本地地址。CC Switch 里配置 Claude Code 时,Base URL 填http://127.0.0.1:8000,Key 填dummy,Model ID 填gpt-4o。Cline 的 MCP 配置里如果直连 Azure,会绕过 claude-bridge,导致协议不匹配。Codex 的auth.json里如果写了 Azure 原始 Key,也会和 TaoToken 统一 Key 冲突。统一原则:所有客户端只认本地代理,上游鉴权全部交给 claude-bridge 和 TaoToken。
排查顺序建议:先 curl 本地端口,确认 claude-bridge 本身能通;再 curl 上游 Azure 端点,确认 TaoToken 转发正常;最后开 Claude Code。这样能把问题范围一步步缩小。
6. 把统一 Key 固化到 Node.js 工程里的实用做法
链路跑通之后,下一步是把它固化到工程里,避免每次手动敲命令。Node.js 项目里最直接的方式是用concurrently把 claude-bridge 和 Claude Code 一起拉起来。
npm install -D concurrently然后在package.json里加:
{ "scripts": { "dev:claude": "concurrently \"npx claude-bridge@latest --config ./claude-bridge.config.json\" \"wait-on http://127.0.0.1:8000 && ANTHROPIC_BASE_URL=http://127.0.0.1:8000 ANTHROPIC_AUTH_TOKEN=dummy claude\"" } }wait-on确保 claude-bridge 先起来再启动 Claude Code,避免 Claude Code 启动时连不上代理直接报错。
如果你在 CI 里跑自动化测试,需要 claude-bridge 后台运行,可以用nohup或者 pm2。pm2 的配置:
{ "apps": [ { "name": "claude-bridge", "script": "npx", "args": "claude-bridge@latest --config ./claude-bridge.config.json", "env": { "TAOTOKEN_KEY": "sk-你的统一Key" } } ] }这样 TaoToken 统一 Key 通过环境变量注入,不落在配置文件里。pm2 的日志会记录每次请求的上游状态码,方便排查。
对于团队协作场景,建议把claude-bridge.config.json里的apiKey字段留空,启动时用环境变量覆盖。claude-bridge 支持CLAUDE_BRIDGE_API_KEY环境变量,优先级高于配置文件。这样配置文件可以提交到仓库,Key 通过 TaoToken 控制台分发给每个开发者,离职时在控制台吊销即可。
最后提醒一点:claude-bridge 的本地端口不要暴露到公网。如果你在云服务器上跑,用防火墙规则限制只允许本机访问,或者通过 SSH 隧道转发。TaoToken 统一 Key 虽然做了权限收敛,但本地代理如果被外部访问,等于把 Azure 资源的调用能力开放出去了。
整套流程实测下来,从零到跑通大概需要十五分钟,其中大部分时间花在 Azure 门户里确认部署名和 endpoint 格式上。一旦配置固化,后续切换模型或者轮换 Key 都只需要改一个地方。