它們不是別名。一個會變成 `x-api-key`,另一個會變成 `Authorization: Bearer`——而當兩者同時設定時,你不想使用的那個可能反而生效。針對自訂 base URL 的「我的 key 正確但驗證失敗」回報,大多是這個原因。
錯誤
# Sent as: x-api-key: <value>
export ANTHROPIC_API_KEY="sk-ant-..."
# Sent as: Authorization: Bearer <value>
export ANTHROPIC_AUTH_TOKEN="sk-kn-..."
# Where those headers go:
export ANTHROPIC_BASE_URL="https://api.kunavo.com"原因與解決方法一覽
| 原因 | 解決方法 |
|---|---|
| 閘道需要 bearer token;你設定了 API key 變數 | 大多數 OpenAI 相容閘道會透過 `Authorization: Bearer` 驗證。請將閘道金鑰放入 ANTHROPIC_AUTH_TOKEN。 |
| 兩個變數都已設定,且來自不同供應商 | shell 設定檔中過時的 ANTHROPIC_API_KEY 可能會與 token 一起傳送。取消設定你不使用的那一個。 |
| 已設定 Base URL,但沒有變更憑證 | 指向新的主機不會讓舊供應商的 key 在該處有效。主機變更時,憑證也必須一併變更。 |
| 變數設定在與執行工具不同的 shell 中 | 互動式 shell 中的 export 不會傳到由 GUI 啟動的程序。請在相同環境內驗證。 |
查看環境實際持有的內容
在啟動工具的 shell 中,先檢查兩者再進行任何變更。相當多這類工作階段其實兩者都已設定——通常其中一個來自幾個月前的設定檔修改,沒人記得它。
for v in ANTHROPIC_API_KEY ANTHROPIC_AUTH_TOKEN ANTHROPIC_BASE_URL; do
printf '%-22s %s\n' "$v" "$(printenv "$v" | cut -c1-12)"
done
# Prefixes tell you the provider at a glance:
# sk-ant- Anthropic direct
# sk-kn- Kunavo設定與主機相符的一組,並取消設定另一個
將主機和憑證視為一個整體。針對第三方 base URL,通常是 bearer token 加上 base URL,並明確取消設定直接 API key,避免它被誤讀。
unset ANTHROPIC_API_KEY
export ANTHROPIC_AUTH_TOKEN="sk-kn-..."
export ANTHROPIC_BASE_URL="https://api.kunavo.com"
# On Kunavo, pin served models too: Claude Code's default and its opus and
# sonnet aliases follow Anthropic's newest models, and the sonnet alias asks
# for Sonnet 5.5, which Kunavo does not serve — unpinned, that request 404s.
export ANTHROPIC_MODEL="claude-sonnet-5"
export ANTHROPIC_DEFAULT_OPUS_MODEL="claude-opus-5-5"
export ANTHROPIC_DEFAULT_SONNET_MODEL="claude-sonnet-5"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="claude-haiku-4-5"
claude在網路傳輸上確認,不要只靠想像
如果驗證仍然失敗,先排除環境因素:手動使用你認為會傳送的標頭發出請求。如果這樣得到 200,而工具中仍失敗,表示工具沒有讀取你設定的變數——最常見是使用了不同的 shell,或有設定檔覆寫了它。
curl -s -o /dev/null -w '%{http_code}\n' \
"$ANTHROPIC_BASE_URL/v1/models" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"如果你透過 Kunavo 呼叫
Kunavo 會從 `Authorization: Bearer` 或 `x-api-key` 任一者讀取金鑰,因此決定因素不是標頭。使用 Claude Code 時,能正常運作的組合仍是 ANTHROPIC_AUTH_TOKEN 加上 ANTHROPIC_BASE_URL——token 無需 ANTHROPIC_API_KEY 所需的一次性核准即可生效;而 ANTHROPIC_API_KEY 應取消設定,不要留下舊值,因為過時值是工作階段看似已設定卻仍拒絕連線的最常見原因。同一個 `sk-kn-` 金鑰也能以 OpenAI 格式 bearer token 原封不動地用於 /v1/chat/completions,因此一組憑證即可涵蓋兩種格式。 完整設定方式,包括應使用的模型名稱,請見 我們的 Claude Code 401 指南.
常見問題
如果兩者都已設定,哪一個優先?
不要依賴這個答案——這是不同版本間曾經變更、且各 SDK 也可能不同的優先順序規則。只設定一個並取消另一個;這是唯一能在所有地方維持一致行為的設定方式。
可以直接對 Anthropic 使用 ANTHROPIC_AUTH_TOKEN 嗎?
Anthropic 自己的 API 以 x-api-key 驗證,因此直接使用 Anthropic 金鑰時應放入 ANTHROPIC_API_KEY。token 變數是給需要 bearer 憑證的主機使用的。
SDK 也會使用相同的變數嗎?
Python 與 TypeScript SDK 會讀取 ANTHROPIC_API_KEY 並傳送 x-api-key。如果將 SDK 指向需要 bearer 驗證的閘道,請明確傳入憑證,不要依賴環境變數。