Quay lại hướng dẫn
Khắc phục sự cố·30 tháng 8, 2026·Đọc 6 phút

ANTHROPIC_AUTH_TOKEN so với ANTHROPIC_API_KEY — Claude Code thực sự đọc biến nào

Đây không phải là các tên thay thế. Một biến trở thành `x-api-key`, biến còn lại trở thành `Authorization: Bearer` — và khi cả hai đều được thiết lập, biến bạn không định dùng có thể được ưu tiên. Phần lớn các báo cáo kiểu “key của tôi đúng nhưng xác thực thất bại” với base URL tùy chỉnh đều xuất phát từ điều này.

Được xem xét lần cuối vào .

Đây không phải là các tên thay thế. Một biến trở thành `x-api-key`, biến còn lại trở thành `Authorization: Bearer` — và khi cả hai đều được thiết lập, biến bạn không định dùng có thể được ưu tiên. Phần lớn các báo cáo kiểu “key của tôi đúng nhưng xác thực thất bại” với base URL tùy chỉnh đều xuất phát từ điều này.

Lỗi

hai biến
# 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"

Tổng quan nguyên nhân và cách khắc phục

Nguyên nhânCách khắc phục
Gateway yêu cầu bearer token; bạn đã thiết lập biến API keyHầu hết gateway tương thích với OpenAI xác thực bằng `Authorization: Bearer`. Đặt key của gateway vào ANTHROPIC_AUTH_TOKEN.
Cả hai biến đều được thiết lập, từ các nhà cung cấp khác nhauMột ANTHROPIC_API_KEY cũ trong cấu hình shell có thể được gửi cùng token. Hãy bỏ thiết lập biến bạn không sử dụng.
Đã thiết lập Base URL nhưng chưa thay đổi thông tin xác thựcTrỏ tới một máy chủ mới không khiến key của nhà cung cấp cũ trở nên hợp lệ ở đó. Thông tin xác thực phải thay đổi cùng máy chủ.
Biến được thiết lập trong shell khác với shell chạy công cụMột export trong shell tương tác sẽ không đến được tiến trình khởi chạy từ GUI. Hãy xác minh trong cùng một môi trường.

Xem môi trường của bạn thực sự đang giữ gì

Kiểm tra cả hai biến trong shell khởi chạy công cụ trước khi thay đổi bất cứ điều gì. Một tỷ lệ đáng ngạc nhiên các phiên này có cả hai biến — thường một biến đến từ chỉnh sửa cấu hình cách đây nhiều tháng mà không ai còn nhớ.

inspect-env.sh
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

Thiết lập cặp biến phù hợp với máy chủ và bỏ thiết lập biến còn lại

Hãy coi máy chủ và thông tin xác thực là một đơn vị. Với base URL của bên thứ ba, thông thường đó là bearer token cùng base URL, đồng thời bỏ thiết lập rõ ràng API key trực tiếp để nó không bị tự động sử dụng.

third-party.sh
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

Xác nhận trên đường truyền, không chỉ trong suy nghĩ

Nếu xác thực vẫn thất bại, hãy loại môi trường khỏi phạm vi nghi vấn: tự gửi yêu cầu bằng header mà bạn cho rằng đang được gửi. Nếu ở đây trả về 200 nhưng công cụ vẫn thất bại, nghĩa là công cụ không đọc biến bạn đã thiết lập — thường nhất là do shell khác hoặc tệp cấu hình ghi đè.

verify.sh
curl -s -o /dev/null -w '%{http_code}\n' \
  "$ANTHROPIC_BASE_URL/v1/models" \
  -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"

Nếu bạn gọi qua Kunavo

Kunavo đọc key từ cả `Authorization: Bearer` lẫn `x-api-key`, nên header không phải yếu tố quyết định. Với Claude Code, cặp hoạt động vẫn là ANTHROPIC_AUTH_TOKEN cộng với ANTHROPIC_BASE_URL — token có hiệu lực mà không cần phê duyệt một lần như ANTHROPIC_API_KEY — và nên bỏ thiết lập ANTHROPIC_API_KEY thay vì để sót, vì giá trị cũ ở đó là nguyên nhân phổ biến nhất khiến một phiên trông như đã cấu hình nhưng vẫn từ chối. Cùng một key `sk-kn-` hoạt động nguyên trạng như bearer token kiểu OpenAI khi gọi /v1/chat/completions, nên một thông tin xác thực dùng được cho cả hai dạng. Toàn bộ cấu hình, bao gồm cả tên model cần dùng, nằm trong hướng dẫn Claude Code 401 của chúng tôi.

Câu hỏi thường gặp

Nếu cả hai biến đều được thiết lập thì biến nào được ưu tiên?

Đừng dựa vào câu trả lời — đây là quy tắc ưu tiên đã thay đổi giữa các phiên bản và khác nhau giữa các SDK. Hãy thiết lập chính xác một biến và bỏ thiết lập biến còn lại; đó là cấu hình duy nhất hoạt động nhất quán ở mọi nơi.

Tôi có thể dùng ANTHROPIC_AUTH_TOKEN trực tiếp với Anthropic không?

API riêng của Anthropic xác thực bằng x-api-key, vì vậy key Anthropic trực tiếp phải được đặt vào ANTHROPIC_API_KEY. Biến token tồn tại cho các máy chủ yêu cầu thông tin xác thực dạng bearer.

SDK có dùng cùng các biến này không?

Các SDK Python và TypeScript đọc ANTHROPIC_API_KEY và gửi x-api-key. Nếu trỏ SDK tới gateway xác thực bằng bearer, hãy truyền thông tin xác thực một cách rõ ràng thay vì dựa vào môi trường.

Hướng dẫn liên quan

Thông tin chi tiết hơn về ý nghĩa lỗi có trong tài liệu tham chiếu lỗi; bạn chỉ mất một phút để lấy khóa qua đăng ký và hướng dẫn xác thực.