1. Claude Code 启动报 Auth conflict 到底卡在哪
你打开终端敲下claude,本来想让它读代码、改 bug,结果第一行就甩给你一句:
‼ Auth conflict: Both a token (ANTHROPIC_AUTH_TOKEN) and an API key (ANTHROPIC_API_KEY) are set.然后 Claude Code 直接退出,连交互界面都进不去。这个报错在 Windows、macOS、Linux 上都会出现,本质跟系统无关,是鉴权来源打架。
先说清楚这两个变量分别是什么。ANTHROPIC_API_KEY是 Anthropic 官方 SDK 体系里的标准 API Key,格式一般是sk-ant-开头;ANTHROPIC_AUTH_TOKEN是走 Bearer Token 鉴权时用的变量,很多第三方兼容端点、企业网关、代理层会要求用它。Claude Code 在启动时会同时读取这两个环境变量,只要它发现两个都有值,就无法判断你到底想用哪套鉴权,于是直接报 Auth conflict 拒绝启动。
为什么会出现两个同时存在?常见有三种来源。第一种是你之前配过一套,后来换了另一套,但旧的环境变量没清掉,比如在.zshrc里写过export ANTHROPIC_AUTH_TOKEN=...,后来又在系统环境变量里加了ANTHROPIC_API_KEY。第二种是你在~/.claude/settings.json里写了env段,同时 shell 里又 export 了另一个,两边叠加。第三种是某些 IDE 插件、终端工具、或者别的 AI 工具在启动时注入了自己的变量,你以为没设,其实被悄悄塞进去了。
这个报错最坑的地方在于:它不会告诉你哪个变量是从哪来的。你echo $ANTHROPIC_API_KEY看到有值,echo $ANTHROPIC_AUTH_TOKEN也有值,但不知道谁先谁后、谁覆盖谁。所以排查的核心思路是先定位来源,再决定保留哪一个,最后统一到一条通道。
我实测下来,最省事的做法不是二选一保留,而是把 endpoint 和鉴权都收敛到同一个 Key 通道,也就是统一走 TaoToken 的 API 地址和一把 Key。这样环境里只需要存在一个鉴权变量,冲突从根上消失。下面几节我会先讲怎么把环境变量清干净,再给可复制的 settings 配置,最后用一条命令验证冲突没了。
适合谁看:正在用 Claude Code 做日常编码、之前折腾过多套模型接入、环境变量改来改去已经记不清的开发者。如果你是从没配过的新手,也可以直接照第三节的配置一次到位,跳过清理步骤。
2. 把鉴权统一到 TaoToken 的前置准备
在动手清环境变量之前,先把目标通道准备好,否则你清完发现没 Key 可用,还得再折腾一遍。这一节做的事情就是:拿到一把 TaoToken 的 Key,确认 Base URL,然后明确 Claude Code 里三个必须对齐的东西——Base URL、Key、Model ID。
先访问官网注册并进入控制台:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。登录后在控制台里创建 API Key,入口在 API Keys 页面:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建出来的 Key 一般是一串长字符,复制下来先存到安全的地方,后面配置要用。
Base URL 用这个:https://taotoken.net/api。注意这里不带任何查询参数,就是干净的 API 根地址。Claude Code 走的是 Anthropic 兼容协议,所以它期望的 endpoint 是https://taotoken.net/api这个根,后面由客户端自己拼/v1/messages之类的路径。
Model ID 这块要特别注意。Claude Code 默认会请求claude-sonnet-4-5这类模型名,你在 TaoToken 控制台里要确认你用的 Key 有对应模型的权限。如果你不确定用哪个,可以在模型对话页面先试一下:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。在对话界面里选一个模型发一句话,能正常返回就说明这个 Model ID 可用,把它记下来填进配置。
三个东西对齐之后,你的目标状态是:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不带 UTM,不带尾斜杠 |
| API Key | 控制台创建的那串 | 只保留一个鉴权变量 |
| Model ID | 如claude-sonnet-4-5 | 以控制台可用为准 |
这里有个关键决策:Claude Code 到底认哪个变量?它同时支持ANTHROPIC_API_KEY和ANTHROPIC_AUTH_TOKEN,但不允许两个同时存在。所以你要做的是只保留一个。我的建议是保留ANTHROPIC_AUTH_TOKEN,因为 TaoToken 这类兼容端点用 Bearer Token 更通用,而且 Claude Code 在读取ANTHROPIC_AUTH_TOKEN时会自动加上Authorization: Bearer头。当然你保留ANTHROPIC_API_KEY也能跑,关键是只能有一个。
如果你还想用 Coding Plan 做长期编码或 Agent 任务,可以在控制台看一下套餐:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。这个跟当前排障不冲突,先把冲突解决,再考虑套餐。
前置准备做完,你手里应该有三样东西:一把 Key、一个 Base URL、一个确认可用的 Model ID。接下来进入清理和配置环节。
3. 清理环境变量并写入 settings 配置
这一节是全文最核心的可复制部分。分两步:先把散落的环境变量清掉,再把配置写进 Claude Code 的 settings 文件。
3.1 定位并清理冲突的环境变量
先看当前环境里到底有哪些相关变量。在终端里执行:
env | grep -i anthropic你会看到类似输出:
ANTHROPIC_API_KEY=sk-ant-xxxx ANTHROPIC_AUTH_TOKEN=xxxx ANTHROPIC_BASE_URL=https://some-old-endpoint三个都可能有。接下来要判断它们从哪来。Linux/macOS 下检查这几个文件:
grep -rn "ANTHROPIC" ~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile 2>/dev/nullWindows PowerShell 下检查用户级和系统级环境变量:
[Environment]::GetEnvironmentVariable("ANTHROPIC_API_KEY", "User") [Environment]::GetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "User") [Environment]::GetEnvironmentVariable("ANTHROPIC_API_KEY", "Machine") [Environment]::GetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "Machine")找到来源后,把不需要的那个删掉。Linux/macOS 直接编辑对应 rc 文件,删掉或注释掉export ANTHROPIC_API_KEY=...那一行。Windows 用命令删:
[Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", $null, "User")删完记得重开终端,因为环境变量是进程启动时读取的,当前会话里还残留着旧值。重开后再次env | grep -i anthropic,确认只剩你要保留的那一个。
3.2 写入 Claude Code settings 配置
Claude Code 的配置文件默认在用户目录下的.claude文件夹里。Windows 是C:\Users\你的用户名\.claude\settings.json,macOS/Linux 是~/.claude/settings.json。如果文件不存在就新建一个。
把下面这段 JSON 复制进去,注意把 Key 换成你自己的:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "你的TaoToken Key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }这段配置做了三件事:把 Base URL 指向 TaoToken,把鉴权统一用ANTHROPIC_AUTH_TOKEN,把默认模型固定下来。注意这里没有ANTHROPIC_API_KEY,这是故意的——settings 里只保留一个鉴权变量,shell 里也不要有另一个,冲突就不会出现。
如果你更习惯用ANTHROPIC_API_KEY,那就把上面 JSON 里的ANTHROPIC_AUTH_TOKEN换成ANTHROPIC_API_KEY,值不变。两种写法二选一,不要都写。
注意:settings.json 里的
env段会在 Claude Code 启动时注入到进程环境里。如果你 shell 里也 export 了同名变量,settings 的值通常会覆盖 shell 的值,但两个不同名的鉴权变量同时存在时,冲突依然会触发。所以 shell 和 settings 要协同,别一边留一个。
改完保存,重开终端。这一步做完,环境里应该只有一个鉴权变量,且 Base URL 指向 TaoToken。
3.3 如果你用 CC Switch 或 Cline MCP
有些同学用 CC Switch 管理多套 Claude Code 配置,或者用 Cline 的 MCP 接 Claude Code。这类工具会在自己的配置里写 Base URL、Key、Model ID 三件套。以 CC Switch 为例,它的配置里同样要保证只有一套鉴权:
{ "name": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKey": "你的TaoToken Key", "model": "claude-sonnet-4-5" }Cline MCP 的配置类似,在 MCP server 的 env 段里写:
{ "mcpServers": { "claude-code": { "command": "claude", "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "你的TaoToken Key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } } } }Codex 的auth.json则是另一套格式,如果你同时用 Codex,注意它的鉴权字段跟 Claude Code 不共享,别把两边的 Key 混着填。核心原则不变:每个工具内部只保留一个鉴权来源,且都指向 TaoToken 的 Base URL。
4. 验证请求:一条命令确认冲突消失
配置写完,怎么确认真的好了?不要直接开 Claude Code 交互界面,先用一条命令做最小验证。
在终端里执行:
claude -p "reply with ok"-p是 print 模式,发一条消息就退出,不进入交互界面。如果配置正确,你会看到类似输出:
ok没有 Auth conflict,没有 401,没有连接错误。这一条命令同时验证了三件事:环境变量没冲突、Base URL 可达、Key 有效。
如果你想更直接地验证 API 层,可以用 curl 打一发:
curl https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer 你的TaoToken Key" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 32, "messages": [{"role": "user", "content": "say ok"}] }'正常返回是一段 JSON,里面有content字段。如果返回 401,说明 Key 不对;如果返回 404,说明 Base URL 或路径拼错了;如果返回模型不存在,说明 Model ID 写错了。这三种错误跟 Auth conflict 是不同层面的问题,分开排查。
再回到 Claude Code 本身,确认环境里只剩一个鉴权变量:
env | grep -i anthropic理想输出只有两到三行:
ANTHROPIC_BASE_URL=https://taotoken.net/api ANTHROPIC_AUTH_TOKEN=你的Key ANTHROPIC_MODEL=claude-sonnet-4-5只要ANTHROPIC_API_KEY不在列表里,冲突就不可能再触发。这时候你再正常启动claude,交互界面应该能顺利打开,输入问题能正常返回。
我试过在 Windows 上先删了系统级变量但忘了删用户级,结果重开终端还是报冲突,后来用 PowerShell 把两个级别都查了一遍才清干净。所以验证时一定要env | grep确认,别凭记忆。
5. 本篇常见报错排查对照
这一节把你会遇到的真实报错列出来,对照着查。
报错一:Auth conflict 依然出现
‼ Auth conflict: Both a token (ANTHROPIC_AUTH_TOKEN) and an API key (ANTHROPIC_API_KEY) are set.说明还有一处没清干净。按顺序查:shell rc 文件、系统环境变量(User 和 Machine 两级)、settings.json 的 env 段、CC Switch/Cline 的配置。任何一处同时出现两个变量名都会触发。用env | grep -i anthropic看当前进程实际读到的值,这是最终真相。
报错二:401 Unauthorized
API Error: 401 - {"error":{"type":"authentication_error"}}Key 无效或没带上。检查 settings.json 里的 Key 有没有多余空格、引号是否配对、Base URL 是不是https://taotoken.net/api。如果你用的是ANTHROPIC_AUTH_TOKEN,确认 Claude Code 版本支持 Bearer 鉴权;老版本可能只认ANTHROPIC_API_KEY,那就换成后者。
报错三:local proxy failed / connection refused
Error: local proxy failed to connect这通常不是鉴权问题,而是 Base URL 写错或网络不通。确认 URL 是https://taotoken.net/api,不要写成https://taotoken.net/api/v1(路径会重复),也不要在末尾加斜杠。用第 4 节的 curl 命令单独测一下连通性。
报错四:reading choices / unexpected response
Error: reading choices: unexpected end of JSON input这种多半是端点返回了非预期格式,常见于 Base URL 指向了不兼容的地址。Claude Code 走 Anthropic 协议,不是 OpenAI 的/v1/chat/completions。确认你用的是https://taotoken.net/api这个 Anthropic 兼容根地址。
报错五:OAuth 相关错误
OAuth error: invalid_grant如果你之前登录过 Anthropic 官方账号,本地可能残留 OAuth 凭据,跟环境变量鉴权打架。检查~/.claude下有没有credentials.json之类的文件,必要时备份后移除,让它走纯 Key 鉴权。
报错六:模型不存在
model: claude-sonnet-4-5 not foundModel ID 写错或你的 Key 没有该模型权限。去模型对话页面确认可用模型:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。把确认可用的 Model ID 填回 settings.json。
排查顺序建议固定为:先env | grep看变量,再 curl 测端点,最后看 Claude Code 报错。这样能快速定位是鉴权层、网络层还是模型层的问题。
6. 把 Key 通道固定下来,后续少折腾
冲突解决之后,建议做两件收尾的事,避免下次换模型或换工具时又踩坑。
第一,把 settings.json 当成唯一配置源。以后要改 Base URL 或 Model ID,只改这个文件,不要在 shell 里再 export 同名变量。shell 里保持干净,env | grep -i anthropic只应该看到 settings 注入的那几个。这样无论你开多少个终端、用哪个 IDE,行为都一致。
第二,如果你要在多个工具之间切换(Claude Code、Cline、Codex),每个工具内部都按「Base URL + Key + Model ID」三件套对齐到 TaoToken,但不要跨工具共享鉴权变量名。Claude Code 用ANTHROPIC_AUTH_TOKEN,Codex 用它自己的auth.json字段,各管各的。这样即使某个工具配置出错,也不会污染另一个。
需要长期跑编码任务或 Agent 的,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。日常接入和排障文档在:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Key 管理在:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后留一个实用习惯:每次改完配置,先跑claude -p "reply with ok",看到ok再进交互界面。这一条命令花两秒,能帮你省掉在交互界面里反复退出的时间。冲突这类问题,本质是配置来源太多,收敛到一条通道就再也不会遇到。