Claude Code 多环境模型配置实践:解决 ANTHROPIC_AUTH_TOKEN 与 ANTHROPIC_API_KEY 冲突
Claude Code 多环境模型配置实践:LingyaAI、智谱 GLM 与官方账号共存
一、背景
在一台 Mac 电脑上使用 Claude Code 时,经常会遇到多环境切换需求:
- 默认使用 LingyaAI 中转;
- 需要时切换到智谱 GLM Coding;
- 有时还要使用 Claude 官方账号登录;
- 不希望不同平台的 API Key、Token、Base URL 互相污染;
- 不希望每次手动 export 环境变量;
- 不希望 API Key 长期暴露在当前终端环境里。
一开始可能会在 ~/.zshrc 中直接写 alias:
alias claude='env -u ANTHROPIC_AUTH_TOKEN ANTHROPIC_API_KEY="xxx" ANTHROPIC_BASE_URL="https://api.xxx.com" /Users/yd/.nvm/versions/node/v24.15.0/bin/claude'
alias claude-zp='env -u ANTHROPIC_AUTH_TOKEN ANTHROPIC_API_KEY="xxx" ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4" /Users/yd/.nvm/versions/node/v24.15.0/bin/claude'
这种写法表面上可以切换环境,但实际使用中容易出现认证冲突、模型不兼容、alias 与 function 冲突、Claude Code 本地 settings 二次注入等问题。
最终成功方案是:
~/.zshrc 定义多环境启动函数
~/.claude-env 单独保存不同平台的 Key
~/.claude/settings.json 保持干净,不放认证变量
最终命令效果:
claude # 默认走 LingyaAI
claude-ly # LingyaAI 中转
claude-zp # 智谱 GLM Coding
claude-official # Claude 官方账号登录
二、遇到的核心问题
1. 认证冲突
Claude Code 报错:
Auth conflict: Both a token (ANTHROPIC_AUTH_TOKEN) and an API key (ANTHROPIC_API_KEY) are set.
原因是同时存在:
ANTHROPIC_AUTH_TOKEN
ANTHROPIC_API_KEY
这两个变量不能同时存在。
| 变量 | 含义 |
|---|---|
ANTHROPIC_API_KEY |
API Key 认证方式 |
ANTHROPIC_AUTH_TOKEN |
Bearer Token / Auth Token 认证方式 |
ANTHROPIC_BASE_URL |
Claude 兼容接口地址 |
原则:
使用 ANTHROPIC_API_KEY 时,不要设置 ANTHROPIC_AUTH_TOKEN。
使用 ANTHROPIC_AUTH_TOKEN 时,不要设置 ANTHROPIC_API_KEY。
2. 当前 shell 明明没有 AUTH_TOKEN,为什么还冲突?
执行:
env | grep -E 'ANTHROPIC|CLAUDE'
如果当前 shell 中没有 ANTHROPIC_AUTH_TOKEN,但 Claude Code 进入后仍然冲突,说明问题可能来自 Claude Code 自己的配置文件:
~/.claude/settings.json
曾经出现过这样的配置:
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-xxx",
"ANTHROPIC_BASE_URL": "https://api.lingyaai.cn"
}
}
这会导致:
~/.zshrc 已经清理了 AUTH_TOKEN
↓
启动 Claude Code
↓
Claude Code 又从 ~/.claude/settings.json 注入 AUTH_TOKEN
↓
同时又通过启动函数注入 API_KEY
↓
认证冲突
所以最终要把 ~/.claude/settings.json 改成:
{
"env": {}
}
3. LingyaAI 可以,智谱不行
认证问题解决后,LingyaAI 可以正常使用,但智谱报错:
There's an issue with the selected model (claude-sonnet-4-6[1m]).
It may not exist or you may not have access to it.
Run /model to pick a different model.
或者:
There's an issue with the selected model (glm-5.1).
It may not exist or you may not have access to it.
Run /model to pick a different model.
原因是:智谱 Claude Code 接入方式和普通 Claude API 中转不同。
一开始错误地把智谱也按 LingyaAI 的方式配置:
export ANTHROPIC_API_KEY="$ZHIPU_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4"
export ANTHROPIC_MODEL="glm-5.1"
这个配置不适合 Claude Code 的智谱接入。
最终成功配置是:
export ANTHROPIC_AUTH_TOKEN="$ZHIPU_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/anthropic"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-4.5-air"
export ANTHROPIC_DEFAULT_SONNET_MODEL="glm-4.7"
export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-5.1"
关键点:
智谱用 ANTHROPIC_AUTH_TOKEN,不用 ANTHROPIC_API_KEY。
智谱 Base URL 用 /api/anthropic,不用 /api/coding/paas/v4。
智谱不要强行设置 ANTHROPIC_MODEL="glm-5.1"。
智谱通过 ANTHROPIC_DEFAULT_*_MODEL 做模型映射。
三、最终文件结构
最终需要维护三个位置:
~/.zshrc
~/.claude-env
~/.claude/settings.json
职责如下:
| 文件 | 作用 |
|---|---|
~/.zshrc |
定义命令、函数、PATH、Claude Code 启动逻辑 |
~/.claude-env |
保存 LingyaAI、智谱的 Key |
~/.claude/settings.json |
Claude Code 自己的配置,保持干净,不放认证变量 |
四、创建 Key 文件:~/.claude-env
创建文件:
nano ~/.claude-env
内容如下:
export LINGYA_CLAUDE_KEY="你的_lingyaai_key"
export ZHIPU_CLAUDE_KEY="你的_智谱_key"
保存:
Ctrl + O
回车
Ctrl + X
设置权限:
chmod 600 ~/.claude-env
检查:
ls -la ~/.claude-env
理想输出类似:
-rw------- 1 yd staff ... /Users/yd/.claude-env
注意:不要直接执行这个文件。
错误用法:
~/.claude-env
正确用法是由 ~/.zshrc 中的函数在子 shell 里加载:
source "$HOME/.claude-env"
五、完整 ~/.zshrc
先备份旧配置:
cp ~/.zshrc ~/.zshrc.bak
打开:
nano ~/.zshrc
完整替换为下面内容:
# ================================================================
# ~/.zshrc
# macOS zsh 配置
# Windsurf + NVM + Node + Claude Code 多环境隔离版
#
# 环境:
# claude -> 默认 LingyaAI
# claude-ly -> LingyaAI 中转
# claude-zp -> 智谱 GLM Coding
# claude-official -> Claude 官方账号登录
#
# 设计原则:
# 1. 不在 ~/.zshrc 里直接写 API Key
# 2. API Key 单独放在 ~/.claude-env
# 3. Key 只在子 shell 中临时加载
# 4. 每次启动前清理冲突环境变量
# 5. ~/.claude/settings.json 不再放认证变量
# ================================================================
# ================================================================
# 1. Windsurf PATH
# ================================================================
export PATH="/Users/yd/.codeium/windsurf/bin:$PATH"
# ================================================================
# 2. NVM / Node.js
# ================================================================
export NVM_DIR="$HOME/.nvm"
if [ -s "$NVM_DIR/nvm.sh" ]; then
. "$NVM_DIR/nvm.sh"
fi
if [ -s "$NVM_DIR/bash_completion" ]; then
. "$NVM_DIR/bash_completion"
fi
export PATH="$PATH:/Users/yd/.nvm/versions/node/v24.15.0/bin"
# ================================================================
# 3. Claude Code Binary
# ================================================================
export CLAUDE_BIN="/Users/yd/.nvm/versions/node/v24.15.0/bin/claude"
# ================================================================
# 4. 清理旧 alias
# 避免 zsh 报:
# defining function based on alias `claude'
# ================================================================
unalias claude 2>/dev/null
unalias claude-ly 2>/dev/null
unalias claude-zp 2>/dev/null
unalias claude-official 2>/dev/null
# ================================================================
# 5. Claude 环境变量清理函数
# ================================================================
claude-clean-env() {
# Anthropic / Claude 认证相关
unset ANTHROPIC_AUTH_TOKEN
unset ANTHROPIC_API_KEY
unset ANTHROPIC_BASE_URL
# 模型相关
unset ANTHROPIC_MODEL
unset ANTHROPIC_SMALL_FAST_MODEL
unset ANTHROPIC_DEFAULT_MODEL
unset ANTHROPIC_DEFAULT_HAIKU_MODEL
unset ANTHROPIC_DEFAULT_SONNET_MODEL
unset ANTHROPIC_DEFAULT_OPUS_MODEL
unset ANTHROPIC_DEFAULT_SMALL_FAST_MODEL
unset ANTHROPIC_DEFAULT_3_5_HAIKU_MODEL
# Bedrock / Vertex 相关
unset CLAUDE_CODE_USE_BEDROCK
unset CLAUDE_CODE_USE_VERTEX
unset ANTHROPIC_BEDROCK_BASE_URL
unset CLAUDE_CODE_SKIP_BEDROCK_AUTH
# 兼容参数
unset API_TIMEOUT_MS
unset CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC
# 本地 key 变量
unset LINGYA_CLAUDE_KEY
unset ZHIPU_CLAUDE_KEY
}
# ================================================================
# 6. 加载 ~/.claude-env
# 注意:不要在主 shell 直接 source ~/.claude-env
# 只在子 shell 中调用这个函数
# ================================================================
claude-load-keys() {
if [ -f "$HOME/.claude-env" ]; then
source "$HOME/.claude-env"
else
echo "未找到 $HOME/.claude-env"
echo
echo "请先创建该文件:"
echo "nano ~/.claude-env"
echo
echo "内容示例:"
echo 'export LINGYA_CLAUDE_KEY="你的_lingyaai_key"'
echo 'export ZHIPU_CLAUDE_KEY="你的_智谱_key"'
return 1
fi
}
# ================================================================
# 7. LingyaAI 中转版
#
# 使用方式:
# claude-ly
#
# 说明:
# LingyaAI 这里使用 ANTHROPIC_API_KEY。
# ================================================================
claude-ly() {
(
claude-clean-env
claude-load-keys || exit 1
if [ -z "$LINGYA_CLAUDE_KEY" ]; then
echo "LINGYA_CLAUDE_KEY 为空,请检查 ~/.claude-env"
exit 1
fi
export ANTHROPIC_API_KEY="$LINGYA_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://api.lingyaai.cn"
# 如 LingyaAI 后台要求固定模型,可在这里开启。
# 不确定时建议先不要固定,让 Claude Code 自己选择。
#
# export ANTHROPIC_MODEL="claude-sonnet-4-5"
exec "$CLAUDE_BIN" "$@"
)
}
# ================================================================
# 8. 智谱 GLM Coding 版
#
# 使用方式:
# claude-zp
#
# 关键点:
# 1. 智谱 Claude Code 接入使用 ANTHROPIC_AUTH_TOKEN
# 2. Base URL 使用 https://open.bigmodel.cn/api/anthropic
# 3. 不要设置 ANTHROPIC_API_KEY
# 4. 不要设置 ANTHROPIC_MODEL="glm-5.1"
# 5. 使用默认模型映射变量
# ================================================================
claude-zp() {
(
claude-clean-env
claude-load-keys || exit 1
if [ -z "$ZHIPU_CLAUDE_KEY" ]; then
echo "ZHIPU_CLAUDE_KEY 为空,请检查 ~/.claude-env"
exit 1
fi
# 智谱 Claude Code 接入:使用 AUTH_TOKEN,不使用 API_KEY
export ANTHROPIC_AUTH_TOKEN="$ZHIPU_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/anthropic"
# 智谱 GLM 模型映射
# Claude Code 界面里可能仍显示 Claude 模型名,这是正常的;
# 请求会由智谱服务端映射到 GLM 模型。
export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-4.5-air"
export ANTHROPIC_DEFAULT_SONNET_MODEL="glm-4.7"
export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-5.1"
# 智谱推荐兼容参数
export API_TIMEOUT_MS="3000000"
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC="1"
exec "$CLAUDE_BIN" "$@"
)
}
# ================================================================
# 9. Claude 官方账号登录版
#
# 使用方式:
# claude-official
#
# 说明:
# 不注入 ANTHROPIC_API_KEY
# 不注入 ANTHROPIC_AUTH_TOKEN
# 不注入 ANTHROPIC_BASE_URL
# ================================================================
claude-official() {
(
claude-clean-env
exec "$CLAUDE_BIN" "$@"
)
}
# ================================================================
# 10. 默认 claude 命令
#
# 当前默认:
# claude -> claude-ly
# ================================================================
claude() {
claude-ly "$@"
}
# ================================================================
# 11. 调试命令
#
# 使用方式:
# claude-env-check
# ================================================================
claude-env-check() {
echo "----- Claude Binary -----"
echo "$CLAUDE_BIN"
echo
echo "----- Claude Binary Exists -----"
if [ -x "$CLAUDE_BIN" ]; then
echo "OK: $CLAUDE_BIN"
else
echo "ERROR: $CLAUDE_BIN 不存在或不可执行"
fi
echo
echo "----- Type Claude -----"
type claude
echo
echo "----- Type Claude-LY -----"
type claude-ly
echo
echo "----- Type Claude-ZP -----"
type claude-zp
echo
echo "----- Type Claude-Official -----"
type claude-official
echo
echo "----- Current Shell Env -----"
env | grep -E 'ANTHROPIC|CLAUDE|LINGYA|ZHIPU|API_TIMEOUT' || echo "No Claude related env found in current shell"
echo
echo "----- Key File -----"
if [ -f "$HOME/.claude-env" ]; then
ls -la "$HOME/.claude-env"
else
echo "$HOME/.claude-env not found"
fi
echo
echo "----- Claude Settings -----"
if [ -f "$HOME/.claude/settings.json" ]; then
cat "$HOME/.claude/settings.json"
else
echo "$HOME/.claude/settings.json not found"
fi
}
# ================================================================
# 12. 清理当前 shell 的 Claude 相关环境变量
#
# 使用方式:
# claude-reset-env
# ================================================================
claude-reset-env() {
claude-clean-env
echo "Claude related environment variables have been cleared."
}
# ================================================================
# End of ~/.zshrc
# ================================================================
保存后执行:
source ~/.zshrc
六、清理 ~/.claude/settings.json
这个文件不要再放:
ANTHROPIC_AUTH_TOKEN
ANTHROPIC_API_KEY
ANTHROPIC_BASE_URL
ANTHROPIC_MODEL
直接重置:
mkdir -p ~/.claude
cp ~/.claude/settings.json ~/.claude/settings.json.bak 2>/dev/null
cat > ~/.claude/settings.json <<'SETTINGS_JSON_EOF'
{
"env": {}
}
SETTINGS_JSON_EOF
检查:
cat ~/.claude/settings.json
理想输出:
{
"env": {}
}
七、验证配置
重新加载:
source ~/.zshrc
检查命令类型:
type claude
type claude-ly
type claude-zp
type claude-official
正确输出类似:
claude is a shell function from /Users/yd/.zshrc
claude-ly is a shell function from /Users/yd/.zshrc
claude-zp is a shell function from /Users/yd/.zshrc
claude-official is a shell function from /Users/yd/.zshrc
检查当前 shell 环境:
env | grep -E 'ANTHROPIC|CLAUDE|LINGYA|ZHIPU'
理想情况下只看到:
CLAUDE_BIN=/Users/yd/.nvm/versions/node/v24.15.0/bin/claude
不应该看到:
ANTHROPIC_AUTH_TOKEN=...
ANTHROPIC_API_KEY=...
ANTHROPIC_BASE_URL=...
LINGYA_CLAUDE_KEY=...
ZHIPU_CLAUDE_KEY=...
因为 Key 只应该在 Claude Code 子进程里临时存在。
八、最终使用方式
默认 LingyaAI:
claude
LingyaAI:
claude-ly
智谱 GLM Coding:
claude-zp
Claude 官方账号:
claude-official
调试:
claude-env-check
清理当前 shell:
claude-reset-env
九、zsh 命令查找原理
当输入:
claude
zsh 不是直接去某个目录找文件,而是按顺序解析命令。
大体顺序是:
alias -> function -> builtin -> PATH 中的可执行文件
执行:
type claude
如果看到:
claude is a shell function from /Users/yd/.zshrc
说明当前 claude 是 ~/.zshrc 中定义的函数。
当前配置中:
claude() {
claude-ly "$@"
}
所以输入 claude 实际会进入 claude-ly。
而 claude-ly 最后执行:
exec "$CLAUDE_BIN" "$@"
其中:
$CLAUDE_BIN
等于:
/Users/yd/.nvm/versions/node/v24.15.0/bin/claude
也就是 Claude Code 的真实可执行文件。
十、为什么要用子 shell?
函数中使用了括号:
claude-ly() {
(
claude-clean-env
claude-load-keys
export ANTHROPIC_API_KEY="$LINGYA_CLAUDE_KEY"
exec "$CLAUDE_BIN" "$@"
)
}
这里的:
(
...
)
表示子 shell。
好处是:
子 shell 中设置的环境变量,只影响 Claude Code 进程,不污染外部终端。
例如执行:
claude-ly
子 shell 里会设置:
ANTHROPIC_API_KEY=xxx
ANTHROPIC_BASE_URL=https://api.lingyaai.cn
但退出 Claude Code 后,外部终端不会保留这些变量。
这就是多环境隔离的关键。
十一、为什么不用 alias?
alias 简单,但不适合复杂多环境切换。
问题包括:
- 不方便写逻辑判断;
- 不方便检查 Key 是否为空;
- 不方便加载
~/.claude-env; - 不方便做调试输出;
- 容易和 function 同名冲突;
- 不方便做子 shell 隔离。
例如如果已经有:
alias claude='...'
又定义:
claude() {
...
}
zsh 可能报:
defining function based on alias `claude'
parse error near `()'
所以最终配置中先执行:
unalias claude 2>/dev/null
unalias claude-ly 2>/dev/null
unalias claude-zp 2>/dev/null
unalias claude-official 2>/dev/null
防止旧 alias 干扰函数定义。
十二、LingyaAI 与智谱的关键差异
| 环境 | 认证变量 | Base URL | 模型配置 |
|---|---|---|---|
| LingyaAI | ANTHROPIC_API_KEY |
https://api.lingyaai.cn |
可不固定模型,或使用 Claude 模型名 |
| 智谱 GLM Coding | ANTHROPIC_AUTH_TOKEN |
https://open.bigmodel.cn/api/anthropic |
使用 ANTHROPIC_DEFAULT_*_MODEL 映射 |
| 官方 Claude | 不注入 Key / Token | 不注入 Base URL | 使用官方登录态 |
智谱不能这样配:
export ANTHROPIC_API_KEY="$ZHIPU_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4"
export ANTHROPIC_MODEL="glm-5.1"
正确配置是:
export ANTHROPIC_AUTH_TOKEN="$ZHIPU_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/anthropic"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-4.5-air"
export ANTHROPIC_DEFAULT_SONNET_MODEL="glm-4.7"
export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-5.1"
十三、常见问题排查
1. 修改 .zshrc 后没有生效
执行:
source ~/.zshrc
或者重新打开终端。
2. claude 仍然是 alias
检查:
type claude
如果输出:
claude is an alias for ...
查找旧 alias:
grep -n "alias claude" ~/.zshrc
删除或注释掉:
# alias claude='...'
# alias claude-zp='...'
然后:
source ~/.zshrc
3. 出现 defining function based on alias
报错:
defining function based on alias `claude'
parse error near `()'
说明 alias 和 function 同名。
解决:在定义函数前加入:
unalias claude 2>/dev/null
unalias claude-ly 2>/dev/null
unalias claude-zp 2>/dev/null
unalias claude-official 2>/dev/null
4. 当前 shell 里仍然看到 Key
检查:
env | grep -E 'ANTHROPIC|CLAUDE|LINGYA|ZHIPU'
如果看到:
LINGYA_CLAUDE_KEY=...
ZHIPU_CLAUDE_KEY=...
说明你可能在 ~/.zshrc 里直接写了:
source ~/.claude-env
不推荐这样做。
应该只在子 shell 函数中执行:
claude-load-keys
5. Claude Code 仍然报 Auth conflict
检查:
cat ~/.claude/settings.json
如果看到:
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "xxx"
}
}
或:
{
"env": {
"ANTHROPIC_API_KEY": "xxx"
}
}
改成:
{
"env": {}
}
6. 智谱提示模型不存在
错误:
There's an issue with the selected model (glm-5.1).
It may not exist or you may not have access to it.
不要设置:
export ANTHROPIC_MODEL="glm-5.1"
改用:
export ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-4.5-air"
export ANTHROPIC_DEFAULT_SONNET_MODEL="glm-4.7"
export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-5.1"
并确保智谱使用:
export ANTHROPIC_AUTH_TOKEN="$ZHIPU_CLAUDE_KEY"
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/anthropic"
7. 不小心按了 Ctrl + Z
Claude Code 提示:
Note: ctrl + z now suspends Claude Code, ctrl + _ undoes input.
如果按了 Ctrl + Z,程序不是退出,而是挂起。
查看挂起任务:
jobs
恢复前台:
fg
杀掉挂起任务:
kill %1
其中 %1 是 jobs 中显示的任务编号。
十四、安全建议
不要把 API Key 明文贴到聊天、截图、博客、Git 仓库、日志中。
如果 Key 曾经暴露过,建议立即:
- 去对应平台删除旧 Key;
- 重新生成新 Key;
- 更新
~/.claude-env; - 检查 Git 仓库是否提交过 Key;
- 检查 shell 历史记录中是否有 Key。
检查历史记录:
history | grep -E 'ANTHROPIC|CLAUDE|sk-|ZHIPU|LINGYA'
zsh 历史文件通常是:
~/.zsh_history
十五、最终总结
这次成功配置的核心是:
1. 用 ~/.zshrc 定义多环境函数。
2. 用 ~/.claude-env 单独保存 Key。
3. 用子 shell 临时加载 Key,避免污染当前终端。
4. LingyaAI 使用 ANTHROPIC_API_KEY。
5. 智谱使用 ANTHROPIC_AUTH_TOKEN。
6. 智谱 Base URL 使用 https://open.bigmodel.cn/api/anthropic。
7. 智谱不要设置 ANTHROPIC_MODEL="glm-5.1"。
8. 智谱使用 ANTHROPIC_DEFAULT_*_MODEL 做模型映射。
9. ~/.claude/settings.json 保持 { "env": {} }。
10. 官方 Claude 使用 claude-official,不注入任何 Key 或 Base URL。
最终可用命令:
claude # 默认 LingyaAI
claude-ly # LingyaAI
claude-zp # 智谱 GLM Coding
claude-official # Claude 官方账号
一句话总结:
Shell 层用函数做入口,Key 文件只在子 shell 中加载,Claude settings 保持干净,不同服务按各自认证方式配置,才能稳定实现 Claude Code 多环境切换。
浙公网安备 33010602011771号