OpenAI insufficient_quota i credit_balance_exhausted: dlaczego ponawianie próby nie pomoże

Interfejs API OpenAI zwraca 429 typ insufficient_quota błędu, gdy na Twoim koncie zabrakło środków lub przekroczyło ono limit wydatków lub użycia. Jest to ten sam kod statusu co limit liczby żądań, ale oczekiwanie kilku sekund nie rozwiąże problemu. Dostęp powraca dopiero, gdy ktoś doda środki, podniesie limit lub miesięczny okres się odnowi. OpenAI mówi, że ponawianie prób po błędach rozliczeń, wydatków lub limitu nie spowoduje przywrócenia dostępu do interfejsu API i należy sprawdzić error.code, aby znaleźć określoną przyczynę. Aby uzyskać więcej informacji, zobacz Kody błędów.

Jak wyglądają błędy limitu OpenAI

Każdy z tych błędów zwraca wartość 429. error.type może wciąż być insufficient_quota, więc sprawdź error.code, aby dowiedzieć się, który z nich otrzymałeś.

error.code Co to znaczy Jak odzyskać dostęp
credit_balance_exhausted Twoja organizacja nie ma już żadnych przedpłaconych środków. Dodaj kredyty.
organization_spend_limit_exceeded Twoja organizacja osiągnęła miesięczny limit wydatków we wszystkich projektach. Podnieś lub usuń limit lub poczekaj na miesięczne zresetowanie.
project_spend_limit_exceeded Projekt osiągnął miesięczny limit wydatków. Inne projekty nadal działają. Podnieś lub usuń limit projektu lub poczekaj na miesięczne zresetowanie.
organization_usage_limit_exceeded Twoja organizacja osiągnęła miesięczny limit użycia przypisany jej przez OpenAI. Jest on oddzielony od ustawionych limitów wydatków. Zażądaj wyższego zatwierdzonego limitu lub skontaktuj się z pomocą techniczną platformy OpenAI.

Porównaj je z błędami „Osiągnięto limit żądań”, na przykład rate_limit_exceeded i slow_down. Są one tymczasowe, a ponowienie próby po krótkim oczekiwaniu zwykle działa. Aby uzyskać więcej informacji, zobacz OpenAI 'Rate limit reached' errors.

Jak obsługiwać błędy limitu OpenAI

  1. Odczytaj error.code, a nie tylko stan. Samo 429 nie mówi, czy ponowić próbę. Potraktuj 4 kody w tabeli jako "stop" i kody limitu szybkości jako "czekaj i ponów próbę".
  2. Przestań ponawiać próbę. Nie wysyłaj ponownie żądania i nie pozwól, aby pętla ponawiania prób nadal wywoływała interfejs API. Dopóki ktoś nie rozwiąże problemu z rozliczeniami, każde żądanie zakończy się niepowodzeniem w taki sam sposób.
  3. Wstrzymaj wywołania, które mogłyby zakończyć się niepowodzeniem. Jeden błąd limitu przydziału oznacza, że kolejne żądania z tej samej organizacji lub projektu również kończą się niepowodzeniem. Pomiń je zamiast wysyłać każdy z nich i czekać na komunikat o błędzie.
  4. Poinformuj użytkownika. Wyjaśnij, że funkcja sztucznej inteligencji jest obecnie niedostępna i zachowaj działanie pozostałej części aplikacji.
  5. Ustaw alert. Zarejestruj kod z wysokim poziomem ważności lub powiadom osobę odpowiedzialną za rozliczenia. Poprawka znajduje się poza kodem, więc ktoś musi wiedzieć.

Zestaw OpenAI Python SDK domyślnie ponawia odpowiedzi 429 2 razy. Niezależnie od tego, ilekroć ponawia próby, Twój kod ostatecznie otrzyma RateLimitError z kodem rozliczeniowym i na tym należy poprzestać:

import logging

import openai
from openai import OpenAI

client = OpenAI()
logger = logging.getLogger(__name__)

BILLING_CODES = {
    "credit_balance_exhausted",
    "organization_spend_limit_exceeded",
    "project_spend_limit_exceeded",
    "organization_usage_limit_exceeded",
}
billing_error: str | None = None


def ask(prompt: str) -> str:
    global billing_error
    if billing_error:
        raise RuntimeError("AI features are paused until billing is fixed.")
    try:
        response = client.responses.create(model="gpt-4.1", input=prompt)
        return response.output_text
    except openai.RateLimitError as error:
        if error.code in BILLING_CODES:
            billing_error = error.code
            logger.critical("OpenAI billing error: %s", error.code)
        raise

Flaga pozostaje ustawiona do momentu ponownego uruchomienia aplikacji. Wyczyść go w inny sposób, jeśli aplikacja działa przez długi czas, na przykład za pomocą akcji administratora, gdy ktoś naprawi rozliczenia.

Jak przetestować, czy aplikacja obsługuje błędy limitu wykorzystania OpenAI

Podczas opracowywania rzadko występuje błąd limitu przydziału. Twoje konto testowe ma dostępne środki, a wykorzystanie jest niskie. Dlatego sposób testowania obsługi limitów przydziału decyduje, czy znajdziesz usterki, zanim zrobią to Twoi użytkownicy.

Approach Co znajdziesz Co przegapiłeś
Poczekaj na produkcję Rzeczywiste awarie Wszystko działa, dopóki użytkownik na nią nie kliknie, a funkcja sztucznej inteligencji pozostaje niedostępna, dopóki ktoś tego nie zauważy
Zamockuj interfejs API w testach lub pozwól agentowi programistycznemu napisać mock Czy gałąź stop jest uruchamiana Rzeczywista treść błędu i kody OpenAI oraz zasady ponawiania prób zestawu SDK. Aplikacja wymaga również przełącznika tylko do testów, aby połączyć się z mockiem.
Wykorzystaj swoje rzeczywiste środki lub ustaw mały limit wydatków Faktyczne zachowanie Kosztuje to pieniądze i blokuje każdą inną aplikację, która współdzieli organizację lub projekt
Przechwytuj rzeczywisty ruch aplikacji i zwracaj błędy przekroczenia limitu na żądanie Rzeczywiste adresy URL, prawdziwy zestaw SDK i zasady ponawiania prób oraz własny format błędu OpenAI Nic się nie zmienia w aplikacji, więc nie testuje twojego kodu w izolacji. Zachowaj testy jednostkowe do tego.

Wypróbuj ją w swojej aplikacji

Dev Proxy przechwytuje żądania aplikacji do api.openai.com i zwraca błędy OpenAI, podczas gdy aplikacja nadal wywołuje rzeczywiste adresy URL. Ustawienie wstępne openai-throttling miesza błąd credit_balance_exhausted z błędami limitu szybkości żądań. Zwraca wartość 429 z typem insufficient_quota i bez Retry-After nagłówka, aby sprawdzić, czy aplikacja zatrzymuje się zamiast ponawiać próbę.

Pobierz preset i uruchom Dev Proxy za jego pomocą:

devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

Aby przetestować tylko błędy limitu przydziału, edytuj plik ustawień wstępnych openai-errors.json i zachowaj tylko odpowiedź credit_balance_exhausted. Aby przetestować kody limitów wydatków i użycia, dodaj odpowiedzi o tym samym kształcie i z innym code.

Następnie uruchom aplikację jak zwykle i obserwuj, co robi. Aby zainstalować Dev Proxy, zobacz Set up Dev Proxy.

Następne kroki

Informacje dodatkowe