Keduanya bukan alias. Yang satu menjadi `x-api-key`, sedangkan yang lain menjadi `Authorization: Bearer` — dan ketika keduanya ditetapkan, variabel yang tidak Anda maksudkan dapat menjadi pemenang. Sebagian besar laporan "kunci saya benar tetapi autentikasi gagal" pada URL dasar khusus disebabkan oleh hal ini.
Error
# 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"Ringkasan penyebab dan perbaikan
| Penyebab | Perbaikan |
|---|---|
| Gateway mengharapkan token bearer; Anda menetapkan variabel kunci API | Sebagian besar gateway yang kompatibel dengan OpenAI melakukan autentikasi melalui `Authorization: Bearer`. Masukkan kunci gateway ke dalam ANTHROPIC_AUTH_TOKEN. |
| Kedua variabel ditetapkan, dari penyedia yang berbeda | ANTHROPIC_API_KEY yang sudah usang dalam profil shell Anda dapat dikirim bersama token. Hapus penetapan variabel yang tidak Anda gunakan. |
| URL dasar ditetapkan, kredensial tidak diubah | Mengarah ke host baru tidak membuat kunci penyedia lama menjadi valid di sana. Kredensial harus berubah mengikuti host. |
| Variabel ditetapkan di shell yang berbeda dari shell yang menjalankan alat | Ekspor di shell interaktif tidak menjangkau proses yang dijalankan melalui GUI. Verifikasi di dalam lingkungan yang sama. |
Lihat apa yang sebenarnya disimpan oleh lingkungan Anda
Periksa keduanya, di shell yang meluncurkan alat, sebelum mengubah apa pun. Sebagian besar sesi ini ternyata menetapkan keduanya — sering kali salah satunya berasal dari perubahan profil berbulan-bulan lalu yang tidak lagi diingat siapa pun.
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- KunavoTetapkan pasangan yang sesuai dengan host Anda, lalu hapus penetapan yang lain
Perlakukan host dan kredensial sebagai satu kesatuan. Untuk URL dasar pihak ketiga, biasanya pasangan tersebut adalah token bearer dan URL dasar, dengan kunci API langsung dihapus penetapannya secara eksplisit agar tidak ikut digunakan.
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"
claudeKonfirmasikan melalui jaringan, bukan asumsi
Jika autentikasi masih gagal, keluarkan lingkungan dari persamaan: kirim permintaan secara manual dengan header yang menurut Anda sedang dikirim. Respons 200 di sini, tetapi kegagalan di alat, berarti alat tersebut tidak membaca variabel yang Anda tetapkan — paling sering karena shell yang berbeda atau file konfigurasi yang menimpanya.
curl -s -o /dev/null -w '%{http_code}\n' \
"$ANTHROPIC_BASE_URL/v1/models" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"Jika Anda melakukan panggilan melalui Kunavo
Kunavo membaca kunci dari `Authorization: Bearer` atau `x-api-key`, jadi header bukanlah faktor penentunya. Dengan Claude Code, pasangan yang berfungsi tetap ANTHROPIC_AUTH_TOKEN dan ANTHROPIC_BASE_URL — token langsung berlaku tanpa persetujuan satu kali yang diperlukan ANTHROPIC_API_KEY — dan ANTHROPIC_API_KEY sebaiknya tidak ditetapkan, bukan dibiarkan tersisa, karena nilai usang di sana adalah penyebab tunggal paling umum sesi tampak telah dikonfigurasi tetapi tetap menolak permintaan. Kunci `sk-kn-` yang sama dapat digunakan tanpa perubahan sebagai token bearer bergaya OpenAI terhadap /v1/chat/completions, sehingga satu kredensial mencakup kedua bentuk tersebut. Penyiapan lengkap, termasuk nama model yang digunakan, tersedia di panduan 401 Claude Code kami.
Pertanyaan umum
Jika keduanya ditetapkan, mana yang menang?
Jangan mengandalkan jawabannya — ini adalah aturan prioritas yang berubah ant versi dan berbeda di berbagai SDK. Tetapkan tepat satu dan hapus penetapan yang lain; hanya konfigurasi ini yang berperilaku sama di mana-mana.
Bisakah saya menggunakan ANTHROPIC_AUTH_TOKEN dengan Anthropic secara langsung?
API milik Anthropic sendiri melakukan autentikasi melalui x-api-key, jadi kunci Anthropic langsung harus dimasukkan ke ANTHROPIC_API_KEY. Variabel token tersedia untuk host yang mengharapkan kredensial bearer.
Apakah SDK menggunakan variabel yang sama?
SDK Python dan TypeScript membaca ANTHROPIC_API_KEY dan mengirim x-api-key. Jika Anda mengarahkan SDK ke gateway yang menggunakan autentikasi bearer, teruskan kredensial secara eksplisit alih-alih mengandalkan lingkungan.
Panduan terkait
- Claude Code “API Error: 401 authentication_error” dengan base URL khusus — semua penyebab
- Claude API 401 authentication_error / invalid x-api-key — semua penyebab
- API kompatibel OpenAI mengembalikan 401/403 — jebakan base_url dan header
- “Organisasi Anda telah menonaktifkan akses langganan Claude untuk Claude Code” — tiga penyebab dan solusi yang berhasil
Detail semantik error lainnya tersedia di referensi error; mendapatkan kunci hanya perlu satu menit melalui pendaftaran dan panduan autentikasi.