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 简单,但不适合复杂多环境切换。

问题包括:

  1. 不方便写逻辑判断;
  2. 不方便检查 Key 是否为空;
  3. 不方便加载 ~/.claude-env
  4. 不方便做调试输出;
  5. 容易和 function 同名冲突;
  6. 不方便做子 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

其中 %1jobs 中显示的任务编号。


十四、安全建议

不要把 API Key 明文贴到聊天、截图、博客、Git 仓库、日志中。

如果 Key 曾经暴露过,建议立即:

  1. 去对应平台删除旧 Key;
  2. 重新生成新 Key;
  3. 更新 ~/.claude-env
  4. 检查 Git 仓库是否提交过 Key;
  5. 检查 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 多环境切换。

posted on 2026-04-18 14:19  滚动的蛋  阅读(639)  评论(0)    收藏  举报

导航