claude-code-proxy-env-setup · ZH · 2026-11-05

只靠环境变量把 Claude Code 指向聚合站:ANTHROPIC_BASE_URL、鉴权 token 与它们的生效顺序

本文拆解 Claude Code 读取的 ANTHROPIC_BASE_URL 与鉴权相关环境变量,说明当多个 key 同时存在时的优先级规则,并给出验证当前会话实际请求端点的实操方法,帮助你在不修改配置文件的前提下把 Claude Code 安全地指向聚合站。

为什么用环境变量而不是改配置

Claude Code 的模型端点由环境变量决定,这对接入聚合站很方便:你可以在不动全局配置文件的情况下,只为某个终端会话指定聚合站的 Base URL 和 key,关闭终端就恢复默认。

代价是环境变量的来源很多——shell 配置文件、.env、IDE 启动参数、CI 变量——它们叠加后的最终值不一定是你以为的那个。所以真正要搞清楚的是两件事:变量叫什么,以及多个来源冲突时谁赢。

Claude Code 实际关心的变量

与端点接入相关的核心是两个:

  • ANTHROPICBASEURL:请求的根地址。设置后 Claude Code 会把 API 请求发到这个地址,而不是官方端点。
  • ANTHROPICAUTHTOKEN:随请求发送的鉴权凭证,适合存放聚合站签发的 API key。

此外还有 ANTHROPICAPIKEY,它承载的是 Anthropic 官方风格的 key。两者在语义上都属于“鉴权凭证”,但来源和用法不同,混用时需要清楚 Claude Code 会取哪一个。

实际使用中还需要注意:

  • Base URL 一般写站点根地址,不要手工拼 /v1 之类的路径,让它自己补全更稳妥。
  • token 里不要带多余的空格或引号,复制粘贴时最容易在这里出错。
  • 如果通过 .env 文件注入,确认该文件确实被当前 shell 加载,而不是只躺在目录里。

多个 key 同时存在时谁优先

典型场景:你的机器上早就配置了官方 ANTHROPICAPIKEY(比如写在 ~/.zshrc 里),现在又想跑聚合站。此时两个变量都在环境里,需要判断实际生效的是哪个。

判断思路是看变量类型而不是看设置顺序:

  • 专门用于第三方端点的鉴权变量(ANTHROPICAUTHTOKEN)通常优先于通用 API key 变量被采用,因为它表达的是更明确的意图。
  • 如果只设置了 ANTHROPICAPIKEY 而没有设置 ANTHROPICAUTHTOKEN,那么请求会带着官方 key 发往你设置的 Base URL——这在聚合站上通常会被拒绝,因为聚合站不认识官方 key。
  • 如果两个都没设,Claude Code 会回落到它自己的默认登录/凭证机制。

因此最省心的做法是:在同一个会话里只保留一个鉴权变量。想切到聚合站,就显式 export ANTHROPICAUTHTOKEN=...,并且临时 unset ANTHROPICAPIKEY;想回到官方,反过来操作。不要让两个变量长期共存于同一个 shell 配置里,否则每次都要靠记忆推断优先级。

另一个常被忽略的点是 Base URL 的覆盖:如果 shell 配置里已经有一个 ANTHROPICBASEURL,你在命令行再 export 一次会覆盖它(同一 shell 内后设置的赢),但新开一个终端又会回到配置文件里的值。这就是“昨天还能用,今天又不行了”的常见来源。

怎么验证本次会话打到了哪个端点

不要凭感觉判断,用下面几种方式实际确认。

先看变量本身。

env | grep -i anthropic

这条命令列出当前 shell 里所有相关变量及其值。重点确认三件事:Base URL 是不是聚合站地址、鉴权变量是哪一个、值有没有被截断或带引号。

看变量来自哪里。

如果发现有意外值,追一下来源:

grep -rn ANTHROPIC ~/.zshrc ~/.bashrc ~/.profile 2>/dev/null

把项目目录里的 .env 也检查一遍。很多冲突来自“以为没设,其实某个配置文件里设了”。

用一个最小请求验证链路。

Claude Code 本身不会打印每次请求的目标地址,所以更可靠的办法是单独发一个请求,确认这个 Base URL + token 组合能通:

curl -sS "$ANTHROPIC_BASE_URL/v1/models" \
  -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"

能正常返回模型列表,说明地址与凭证匹配;返回鉴权错误,多半是 token 类型不对(比如把官方 key 塞进了聚合站的请求);连不上,则是 Base URL 写错或网络问题。这个检查把“客户端行为”和“凭证是否有效”分开,排错时能省很多时间。

在会话内做一次真实提问。

变量确认无误后,启动 Claude Code 问一个简单问题。如果请求被拒,错误信息通常会指出是鉴权失败还是端点不可达,据此回到上一步定位。

一种稳妥的隔离写法

如果你经常在官方和聚合站之间切换,建议不要依赖全局配置,而是把变量放进一个只在当前终端生效的脚本里:

export ANTHROPIC_BASE_URL="https://你的聚合站地址"
export ANTHROPIC_AUTH_TOKEN="你的聚合站key"
unset ANTHROPIC_API_KEY

每次需要时 source 它,用完关掉终端。这样官方的 key 不会被误发到第三方端点,聚合站的 key 也不会泄漏进全局环境,两个环境的边界是清晰的。

在聚合站的使用模式上还有一点值得知道:你用同一个 key 可以调用 Claude、GPT、DeepSeek、Qwen、GLM、Kimi 等多个模型,切换模型通常只需改请求里的模型名,不需要换端点或换 key。这也是把 Base URL 统一指向聚合站的价值所在——一份凭证,多个模型。

小结

环境变量接入的关键不是记住某条命令,而是建立“变量来源 → 最终值 → 实际请求”的检查习惯。多数接入失败都不是聚合站的问题,而是本地残留了一个你没意识到的变量。先用 env | grep 看清现状,再用 curl 验证凭证,最后才去启动客户端,排查路径会短很多。