Fehler und Limits
GetVibe API-Fehlercodes: 401 (Schlüssel), 402 (Guthaben), 403 (IP), 429 (Ratenlimit). So behandeln Sie Fehler und wiederholen Anfragen mit exponentiellem Backoff.
Von GetVibe auf /v1/* erzeugte Fehler enthalten einen JSON-Umschlag mit error.message, error.type und error.code. Verlassen Sie sich weder auf den Nachrichtentext noch auf Header von Drittanbieterdiensten als verbindliche Schnittstelle.
Fehlerformat
{
"error": {
"message": "insufficient balance",
"type": "insufficient_quota",
"code": 402,
"request_id": "8d4b6b3a-..."
}
}Antwortcodes
| Parameter | Typ | Beschreibung |
|---|---|---|
401 | authentication_error / 401 | Fehlender oder fehlerhafter Schlüssel, oder der Schlüssel ist deaktiviert. Wiederholen Sie den Versuch erst, wenn die Zugangsdaten korrigiert wurden. |
402 | insufficient_quota / 402 | Kein verfügbares Guthaben oder Limit – Warten behebt das Problem nicht. Ein 402 enthält niemals Retry-After und sollte nicht wiederholt werden: Laden Sie Guthaben auf oder warten Sie, bis das Abonnementfenster zurückgesetzt wird. |
403 | permission_error or policy type / 403 | IP, Modell oder Richtlinie lässt die Anfrage nicht zu. Wiederholen Sie die Anfrage nicht, ohne die Anfrage oder die Einstellungen zu ändern. |
429 | rate_limit_exceeded, inflight_client_cap or rate_limit_error / 429 | Ihr Rate-Limit, Ihr Parallelitätslimit, eine von Ihren eigenen parallelen Anfragen vorübergehend gehaltene Guthabenreservierung (Ursache reserved_in_flight) oder ein Anbieterlimit. Wiederholen Sie die Anfrage erst nach Retry-After; ein 429 bedeutet niemals, dass Ihr Guthaben aufgebraucht ist. |
410 | media_endpoint_retired / media_endpoint_retired | Nur /v1/images/edits, /v1/video/generations und /v1/videos (eingestellt). Wiederholen Sie den Versuch nicht; wechseln Sie zu /api/media/generate. /v1/images/generations wird bereitgestellt. |
413 | invalid_request_error / 413 | Nur Files API: Die Datei überschreitet 50 MiB. Verkleinern Sie die Datei und erstellen Sie anschließend eine neue Anfrage. |
503 | overloaded / 503 | Globale Überlastung der Edge-Infrastruktur. Wiederholen Sie den Versuch nach Retry-After: 2. Andere 503-Fehler können möglicherweise nicht wiederholt werden, ohne das Modell oder die Anfrage zu ändern. |
Anfragefehler (400, 413, 422): Codes und Lösungen
Jeder Anfragefehler enthält einen stabilen error.code aus der folgenden Tabelle, error.param mit dem betreffenden Feld (null, wenn das Modell keines genannt hat) sowie einen Link zur passenden Zeile am Ende von error.message — Codex und andere CLIs zeigen nur die Nachricht an, daher wird der Link dorthin übertragen.
| error.code | error.param | Was zu tun ist |
|---|---|---|
unsupported_parameter | Feldname | Das ausgewählte Modell oder der Kanal akzeptiert diesen Parameter nicht. Entfernen Sie ihn aus der Anfrage (in Codex/IDEs aus der Konfiguration) und versuchen Sie es erneut. |
invalid_parameter_value | Feldname | Der Parameter ist vorhanden, aber sein Wert ist für dieses Modell nicht zulässig: zum Beispiel temperature ungleich 1 bei aktiviertem Reasoning, max_tokens über dem Maximum oder effort "none", wenn sich Reasoning nicht deaktivieren lässt. Korrigieren Sie den Wert wie in der Nachricht angegeben. |
missing_parameter | Feldname | Ein erforderliches Feld fehlt oder ist leer. Fügen Sie es hinzu. |
invalid_tool_schema | tools[].function.* | Eine Tooldefinition wurde abgelehnt: Namen dürfen nur lateinische Buchstaben, Ziffern, "_" und "-" enthalten; Parameter müssen ein JSON Schema sein, dessen Wurzel den Typ "object" hat. Oder wählen Sie eine andere Variante des Modells. |
tool_choice_unsupported | tool_choice | Das Modell unterstützt keine erzwungene Toolauswahl. Senden Sie tool_choice "auto" oder "none". |
invalid_tool_history | messages / input | Der Verlauf enthält einen Toolaufruf ohne Ergebnis. Fügen Sie das Ergebnis mit derselben id hinzu oder entfernen Sie beim Kürzen des Verlaufs den Aufruf zusammen mit seinem Ergebnis. |
invalid_image | — | Das Bild konnte nicht gelesen werden. Senden Sie eine vollständige PNG-, JPEG-, WebP- oder GIF-Datei (BMP, TIFF, AVIF und SVG werden nicht akzeptiert). |
unsupported_input_modality | — | Das Modell akzeptiert diese Art von Anhang nicht (PDF, Audio, Video, Bilder). Entfernen Sie ihn oder wählen Sie ein Modell, dessen Katalogeintrag diese Eingabe auflistet. |
conversation_state_unreadable | — | Das Reasoning im Verlauf wurde von einem anderen Kanal erstellt. Die Anfrage ist gültig. Versuchen Sie es erneut. Wenn der Fehler wiederholt auftritt, beginnen Sie eine neue Unterhaltung. |
invalid_json | — | Der Anfrage-Body ist kein JSON oder wurde abgeschnitten. Beginnen Sie bei sehr langen Unterhaltungen mit Bildern eine neue Unterhaltung oder komprimieren Sie den Verlauf. |
request_too_large | — | Die Anfrage ist zu groß. Reduzieren Sie die Anhänge oder den Verlauf. |
request_rejected_by_channel | — | Der Modellkanal hat die Anfrage abgelehnt, ohne einen Grund zu nennen; die Anfrage selbst ist höchstwahrscheinlich gültig. Versuchen Sie es erneut. Wenn die Ablehnung wiederholt auftritt, wählen Sie eine andere Variante des Modells (das Suffix nach dem Doppelpunkt) oder das Modell ohne Suffix. Wenn das nicht hilft, wenden Sie sich mit der request_id an den Support. |
model_not_available_on_route | — | Die Route ist für dieses Modell nicht eingerichtet. Wählen Sie ein anderes Modell oder eine andere Variante. |
context_length_exceeded | messages / input / prompt | Die Anfrage passt nicht in das Kontextfenster. Komprimieren Sie den Verlauf (in Codex: /compact) oder wählen Sie ein Modell mit einem größeren Fenster. |
content_moderation | — | Die Anfrage oder die Antwort wurde durch den Inhaltsfilter des Anbieters blockiert. Formulieren Sie sie um oder wählen Sie ein anderes Modell. |
invalid_request | — | Die Ursache wurde nicht erkannt. Prüfen Sie die Anfrage anhand der API-Referenz. Wenn sie korrekt ist, wenden Sie sich mit der request_id aus der Antwort an den Support. |
Antwort-Header
| Parameter | Typ | Beschreibung |
|---|---|---|
x-pv-cost-rub | string | Bestmögliche Schätzung der Rubelkosten. In Streams ist x-pv-cost-rub verfügbar, wenn die Eingangsschätzung bekannt ist; pv_cost_rub im abschließenden Nutzungsereignis erfordert x-pv-cost: 1. Der Nutzungsverlauf enthält die tatsächliche Abbuchung. |
x-pv-generation-id | string | ID des Nutzungsverlaufsdatensatzes (GET /v1/generations/{id}). Wird nur für nicht gestreamte Chat-/Completions-Anfragen zurückgegeben. |
x-pv-dropped-params | string | Kommagetrennte Anforderungsparameter, die von der ausgewählten Route nicht akzeptiert und daher nicht an das Modell gesendet wurden (zum Beispiel temperature,top_p). Wird nur angezeigt, wenn tatsächlich Parameter zurückgehalten wurden, sowohl bei Antworten als auch bei Fehlern. Wir verwerfen niemals stillschweigend Parameter: Fehlt der Header, wurde alles, was Sie gesendet haben, unverändert an das Modell weitergeleitet. |
Retry-After | integer | Anzahl der zu wartenden Sekunden. Der Edge setzt diesen Wert bei 429-Rate-Limit, 429-Konkurrenz (5), 503-globaler Überlastung (2) und einigen vorübergehenden 402-Fehlern. Er wird nicht für jedes 429/503 vorausgesetzt. |
Fehler vor und nach Beginn der Antwort
Ein langsamer Stream (stream: true) erhält nach 5 Sekunden ohne Aktivität 200- und : pv-keepalive-Kommentare, damit die Verbindung nicht inaktiv wirkt; eine lange Nicht-Stream-Anfrage erhält nach ihrem ersten Token 200 und Whitespace. Ab diesem Zeitpunkt kann sich der Status nicht mehr ändern, und im Body trifft ein Fehler ein. Wenn Ihr Client bei einem HTTP-Fehler auf einen anderen Anbieter ausweicht, senden Sie x-pv-honest-errors: 1 (oder bitten Sie den Support, dies für das Konto zu aktivieren): Dann gibt es keinen Keepalive und kein vorzeitiges 200 vor dem ersten Antwort-Byte, und jeder Fehler ist ein gewöhnlicher HTTP-Status mit einem JSON-Body. Der Nachteil ist ein stiller Socket bis zum ersten Token; Ihr Header-Timeout muss diesen Zeitraum abdecken.
Ein Fehler, nachdem die Antwort begonnen hat, ist ein einzelnes abschließendes Ereignis: für Chat event: error mit {"error":{message,type,code,status},"choices":[{"finish_reason":"error"}]}, gefolgt von data: [DONE]; für /v1/responses event: response.failed mit demselben error; für /v1/messages mit Anthropics event: error. code ist die maschinenlesbare Ursache und status ist der HTTP-Status, den der Fehler vor Beginn der Antwort gehabt hätte.
stream: true) wird x-pv-generation-id nicht zurückgegeben, da die Abrechnung erst nach Ende des Streams abgeschlossen wird. Überprüfen Sie den Anfrageverlauf über GET /v1/generations.Raten- und Parallelitätslimits
Beide Limits hängen vom aktuellen Kontoguthaben ab und gelten gemeinsam für alle API-Schlüssel des Kontos. Der Tarif wird automatisch neu berechnet: Wenn Sie Ihr Guthaben aufladen, steigt das Limit; fällt das Guthaben unter einen Schwellenwert, wird der Tarif herabgestuft. Es gibt kein Limit für Tokens pro Minute (TPM).
| Guthaben ab | Anfragen pro Minute (RPM) | Gleichzeitige Anfragen |
|---|---|---|
| 0 $ | 300 | 10 |
| 1 $ | 1 100 | 50 |
| 2 $ | 6 600 | 300 |
| 4 $ | 19 800 | 900 |
| 12 $ | 44 000 | 2 000 |
| Parameter | Typ | Beschreibung |
|---|---|---|
429 rate_limit_exceeded | RPM | Das Konto hat in den letzten 60 Sekunden (einem gleitenden Zeitfenster) so viele Anfragen gesendet, wie sein Tarif zulässt. Retry-After gibt die Anzahl der Sekunden an, bis im Zeitfenster wieder ein Platz frei wird (mindestens 1); x-ratelimit-limit-requests gibt Ihre aktuellen RPM an. Body: error.cause = key_rate_limited, error.details = { enforced_by: "getvibe", limit, unit: "requests_per_minute", retry_after_seconds }. |
429 inflight_client_cap | concurrency | Es laufen bereits so viele Anfragen, wie der Tarif zulässt. Eine Anfrage belegt ihren Platz bis zu ihrem Abschluss; ein Stream belegt ihn bis zu seinem letzten Ereignis. Retry-After: 5. Body: error.cause = account_concurrency_limited, error.details = { enforced_by: "getvibe", limit, unit: "parallel_requests", retry_after_seconds: 5 }. |
Personal limit | RPM | Wenn für das Konto ein individuelles Anfragelimit festgelegt ist, kann dieses die RPM des Tarifs nur senken, niemals erhöhen. |
503 overloaded | service | Nicht Ihr Limit, sondern eine Schutzmaßnahme für den Dienst: Retry-After: 2 steht für die globale Obergrenze über alle Konten hinweg, Retry-After: 1 bedeutet, dass ein Server ausgelastet ist. Versuchen Sie es nach der Wartezeit erneut. |
429 from a provider | upstream | error.cause = supplier_rate_limited bedeutet, dass der Modellanbieter die Anfrage gedrosselt hat und Ihr eigenes Limit nicht ausgeschöpft ist; channel_rate_limited steht für die gemeinsam genutzte Obergrenze eines Anbieterkanals (Retry-After: 10, es wurde nichts gesendet). |
Anfragen werden erneut versucht
Verwenden Sie bei einer wiederholbaren Antwort zuerst Retry-After, sofern vorhanden. Ohne diesen Header dürfen Sie 429 oder 503 nicht automatisch als wiederholbar behandeln: Prüfen Sie den HTTP-Status und den öffentlichen error.type, beheben Sie die nicht wiederholbare Ursache und verwenden Sie begrenztes Backoff nur bei einem vorübergehenden Fehler.
import time, requests
def call_with_retry(url, headers, payload, max_retries=5):
for attempt in range(max_retries):
r = requests.post(url, headers=headers, json=payload)
if r.status_code == 429:
# honor Retry-After, otherwise exponential backoff
wait = int(r.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
return r
return r