OpenAI uyumlu API'lerin amacı SDK'nın doğrudan çalışmasıdır; dolayısıyla 401 aldığınızda hata neredeyse her zaman değiştirdiğiniz iki satırdadır: base_url ve api_key. İşte gerçekten oluşma sırasına göre hata türleri.
Hata
{
"error": {
"type": "invalid_api_key",
"message": "Invalid or missing API key.",
"code": "invalid_api_key"
}
}Nedenler ve çözümler özeti
| Neden | Çözüm |
|---|---|
| base_url içinde /v1 son eki eksik (veya iki kez eklenmiş) | Çoğu ağ geçidi tam olarak https://host/v1 ister; SDK /chat/completions bölümünü kendisi ekler. |
| Farklı bir ana bilgisayardan alınmış anahtar | sk-… anahtarları yalnızca onları oluşturan hizmette kimlik doğrular; ön ek ↔ ana bilgisayar eşleşmesini kontrol edin. |
| Kurumsal proxy / WAF Authorization başlığını kaldırıyor | Temiz bir ağdan test edin; proxy'yi Authorization'ı geçirecek şekilde yapılandırın. |
| OPENAI_API_KEY ortam değişkeni açıkça verdiğiniz anahtarın üzerine yazıyor | SDK varsayılan olarak ortam değişkenini okur; bazı kurulumlarda eski bir ortam değişkeni sessizce öncelik kazanır. api_key'i açıkça geçirin. |
SDK'nın vurduğu tam URL'yi doğrulayın
client.base_url değerini yazdırın ve kimlik doğrulamalı en ucuz uç nokta olan GET /v1/models'i çağırın. /models çalışıyorsa kimlik doğrulama düzgündür ve hata başka yerdedir:
from openai import OpenAI
client = OpenAI(
base_url="https://api.kunavo.com/v1", # exactly one /v1
api_key="sk-kn-...", # explicit beats env vars
)
print(client.base_url)
print([m.id for m in client.models.list().data][:5])SDK'yı elemek için aynı ana bilgisayarı curl ile çağırın
Authorization: Bearer ile curl çalışıyor, SDK çalışmıyorsa SDK'nın gerçek isteğini karşılaştırın (OPENAI_LOG=debug ayarlayın); on vakadan dokuzunda bir proxy veya ortam değişkeni bir şeyi yeniden yazmıştır.
Kunavo üzerinden çağrı yapıyorsanız
Kunavo'nun uç noktası https://api.kunavo.com/v1 adresinde katı biçimde OpenAI şekillidir ve GET /v1/models kimlik doğrulama için duman testidir. Kodunuz api.openai.com üzerinde çalışıyorsa base_url'yi Kunavo'ya yönlendirmek tek değişikliktir; aynı SDK, aynı wire biçimi ve Claude, GPT ve medya modelleri için tek anahtar.
Sık sorulan sorular
Bir ağ geçidinde 401 ile 403 arasındaki fark nedir?
401 = kimlik bilgisi kabul edilmemiştir (anahtar eksik/geçersiz). 403 = anahtar geçerlidir ancak bu işlemi yapmasına izin verilmez (devre dışı anahtar, askıya alınmış hesap, izin verilmeyen model). Hata gövdesini okuyun; uyumlu API'ler nedeni error.message içinde verir.
Kodum yerelde çalışıyor da CI'da neden 401 alıyor?
CI farklı bir ortamdır: secret ayarlanmamış, farklı bir servis için ayarlanmış veya bir proxy başlığı kaldırıyor olabilir. Gerçekte ne gönderildiğini görmek için CI içinden repr(key[:12]) ve base_url değerlerini loglayın.
İlgili kılavuzlar
Hata anlamlarına ilişkin daha fazla bilgi hata referansı bölümünde; anahtar almak kayıt ve kimlik doğrulama kılavuzu üzerinden bir dakika sürer.