Der eigentliche Zweck OpenAI-kompatibler APIs ist, dass das SDK einfach funktioniert — wenn es also 401 liefert, liegt der Fehler fast immer in den zwei geänderten Zeilen: base_url und api_key. Hier sind die Fehlerbilder in der Reihenfolge, in der sie tatsächlich auftreten.
Der Fehler
{
"error": {
"type": "invalid_api_key",
"message": "Invalid or missing API key.",
"code": "invalid_api_key"
}
}Ursachen und Lösungen im Überblick
| Ursache | Lösung |
|---|---|
| base_url ohne Suffix /v1 (oder mit doppeltem Suffix) | Die meisten Gateways erwarten exakt https://host/v1 — das SDK hängt /chat/completions selbst an. |
| Schlüssel von einem anderen Host | sk-…-Schlüssel authentifizieren nur gegenüber dem Dienst, der sie ausgestellt hat; prüfen Sie Präfix ↔ Host. |
| Unternehmensproxy / WAF entfernt den Authorization-Header | Testen Sie aus einem sauberen Netzwerk und konfigurieren Sie den Proxy so, dass Authorization weitergeleitet wird. |
| Die Umgebungsvariable OPENAI_API_KEY überschreibt Ihren expliziten Schlüssel | Das SDK liest standardmäßig Umgebungsvariablen — in manchen Setups gewinnt eine veraltete Variable unbemerkt; übergeben Sie api_key explizit. |
Prüfen Sie die genaue URL, die das SDK aufruft
Geben Sie client.base_url aus und rufen Sie GET /v1/models auf — den günstigsten authentifizierten Endpunkt. Wenn /models funktioniert, ist die Authentifizierung in Ordnung und der Fehler liegt an anderer Stelle:
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])Rufen Sie denselben Host mit Curl auf, um das SDK auszuschließen
Wenn Curl mit Authorization: Bearer funktioniert und das SDK nicht, vergleichen Sie die tatsächliche SDK-Anfrage (setzen Sie OPENAI_LOG=debug) — in neun von zehn Fällen hat ein Proxy oder eine Umgebungsvariable etwas umgeschrieben.
Wenn Sie Kunavo verwenden
Kunavos Endpunkt hat unter https://api.kunavo.com/v1 strikt die Form von OpenAI und verwendet Bearer-Authentifizierung; GET /v1/models dient als Authentifizierungstest. Wenn Ihr Code gegen api.openai.com läuft, ist das Ändern von base_url zu Kunavo die einzige Änderung — dasselbe SDK, dasselbe Wire-Format, ein Schlüssel für Claude, GPT und Medienmodelle.
Häufig gestellte Fragen
401 oder 403 bei einem Gateway — worin besteht der Unterschied?
401 = Die Zugangsdaten selbst wurden nicht akzeptiert (fehlender oder ungültiger Schlüssel). 403 = Der Schlüssel ist gültig, darf diese Aktion aber nicht ausführen (deaktivierter Schlüssel, gesperrtes Konto, Modell nicht erlaubt). Lesen Sie den Fehlertext — kompatible APIs geben den Grund in error.message an.
Warum funktioniert mein Code lokal, liefert aber in CI 401?
CI ist eine andere Umgebung: Das Secret fehlt, gehört zu einem anderen Dienst oder ein Proxy entfernt den Header. Protokollieren Sie repr(key[:12]) und base_url innerhalb von CI, um zu sehen, was tatsächlich gesendet wird.
Verwandte Anleitungen
Weitere Informationen zur Fehlersemantik finden Sie unter Fehlerreferenz; einen Schlüssel erhalten Sie in einer Minute über Registrierung und die Authentifizierungsanleitung.