只靠环境变量把 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 验证凭证,最后才去启动客户端,排查路径会短很多。