CC 启动时 API_KEY 与 AUTH_TOKEN 冲突(第三方 API 场景)

适用场景

使用第三方 Anthropic-compatible API(DeepSeek、OpenRouter 等),在 .zshrc 中设置了自己的 API Key:

1
2
export ANTHROPIC_API_KEY="sk-xxx"
export ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"

症状

每次启动 Claude Code 时提示 ANTHROPIC_API_KEYANTHROPIC_AUTH_TOKEN 同时存在,产生冲突或要求选择。

根本原因

Claude Code 启动时会执行以下逻辑:

  1. 检测到环境变量中存在 ANTHROPIC_API_KEY
  2. 自动将 ANTHROPIC_API_KEY 的值复制到 ANTHROPIC_AUTH_TOKEN
  3. 然后检测到两个变量同时存在 → 报冲突

所以即使 .zshrc 里只设置了 ANTHROPIC_API_KEY,CC 启动后 ANTHROPIC_AUTH_TOKEN 会被自动填上相同的值,触发"同时存在"的检测。

为什么之前尝试的方法无效

方法 为什么无效
注释掉 .zshrc 中的 ANTHROPIC_API_KEY CC 已经在首次运行时将 API Key 持久化到了内部存储,之后的启动不再依赖 .zshrc 中的环境变量,而是从持久化存储中读取并自动设置两个变量
/logout /logout 清除的是 OAuth 登录态,跟 API Key 无关。第三方 API 场景根本不存在登录态
source ~/.zshrc 后重启 CC 从持久化存储读取,不是从 shell 环境

真正的解决方案

关键点:CC 首次配置时的那个选择

当 CC 首次运行或检测到新的环境变量时,会弹出类似提示:

“检测到环境变量中有 ANTHROPIC_API_KEY,是否使用?”

  • 选 Yes → CC 将 API Key 持久化到内部存储,之后每次启动自动复制到 AUTH_TOKEN,造成永久冲突
  • 选 No → CC 不在内部持久化 API Key,只用环境变量中的 ANTHROPIC_API_KEY 直连第三方 API,不会自动复制到 AUTH_TOKEN,没有冲突

修复步骤

  1. 清除 CC 内部持久化的 API Key 凭证:

    1
    rm -rf ~/.claude/credentials*
  2. 确保 .zshrc 中保留了 API Key(第三方 API 必须用这个):

    1
    2
    export ANTHROPIC_API_KEY="sk-xxx"
    export ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"
  3. 重启终端,启动 Claude Code

  4. 当 CC 询问"是否使用环境变量中的 ANTHROPIC_API_KEY"时,选择 No

  5. CC 之后就会直接用环境变量中的 ANTHROPIC_API_KEY 认证,不再自动复制到 AUTH_TOKEN,冲突消失

关键教训

  1. CC 的"是否使用环境变量中的 API Key"这个问题,选 Yes = 持久化 + 自动复制 AUTH_TOKEN = 永久冲突。第三方 API 用户应该选 No
  2. 一旦选了 Yes,API Key 被持久化到 ~/.claude/credentials*,之后改 .zshrc 也没用——CC 读取的是内部存储,不是 shell 环境
  3. /logout 对第三方 API 场景毫无意义——没有 OAuth,不存在"登出"
  4. 清除 ~/.claude/credentials* 是重置这个选择的唯一方法

相关环境变量

变量 设置者 说明
ANTHROPIC_API_KEY 用户(.zshrc 第三方 API Key
ANTHROPIC_AUTH_TOKEN CC 自动复制 启动时从 API_KEY 复制而来
ANTHROPIC_BASE_URL 用户(.zshrc 第三方 API 端点