Перейти к основному содержанию

Коды ошибок HTTP

КодТип ошибкиОписание
400validation_errorНеверные параметры запроса
401unauthorizedОтсутствует или неверный API-ключ
401token_expiredТокен доступа истёк — обновите его
402insufficient_tokensНедостаточно токенов на балансе
403plan_requiredТребуется более высокий тариф
404not_foundМодель или ресурс не найден
429rate_limit_exceededСлишком много запросов — см. лимиты
500provider_errorОшибка на стороне провайдера AI
503model_unavailableМодель временно недоступна

Формат ошибки

{
  "error": "insufficient_tokens",
  "message": "Not enough tokens. Balance: 2, required: 8.",
  "required": 8,
  "balance": 2
}

401 — Истёкший токен

import requests

def обновить_токен(refresh_token):
    r = requests.post(
        "https://neuralbox.top/api/v2/auth/refresh",
        json={"refresh_token": refresh_token}
    )
    return r.json()["access_token"]

402 — Недостаточно токенов

try:
    r = requests.post(url, headers=headers, json=payload)
    r.raise_for_status()
except requests.HTTPError as e:
    if e.response.status_code == 402:
        data = e.response.json()
        print(f"Нужно {data['required']} токенов, доступно {data['balance']}")
        print("Пополните баланс на neuralbox.top/web/billing")

429 — Превышение лимита

import time

def запрос_с_повтором(payload, api_key, max_retries=3):
    headers = {"Authorization": f"Bearer {api_key}"}
    for attempt in range(max_retries):
        r = requests.post(
            "https://neuralbox.top/api/v2/generate",
            headers=headers, json=payload
        )
        if r.status_code == 429:
            wait = int(r.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait)
            continue
        r.raise_for_status()
        return r.json()
    raise Exception("Превышено число попыток")

500 — Ошибка провайдера

if r.status_code == 500:
    data = r.json()
    # Провайдер недоступен — попробуйте другую модель
    # При ошибке токены не списываются
    fallback_payload = {**payload, "model": "gpt-5"}
    return запрос_с_повтором(fallback_payload, api_key)

Экспоненциальный backoff

import time, random

def запрос_с_backoff(payload, api_key, max_retries=5):
    headers = {"Authorization": f"Bearer {api_key}"}
    retryable = {429, 500, 502, 503, 504}
    
    for attempt in range(max_retries):
        r = requests.post(
            "https://neuralbox.top/api/v2/generate",
            headers=headers, json=payload
        )
        if r.status_code not in retryable:
            return r.json()
        
        wait = (2 ** attempt) + random.uniform(0, 1)
        print(f"Попытка {attempt + 1}/{max_retries}, ожидание {wait:.1f}с")
        time.sleep(wait)
    
    raise Exception(f"Не удалось выполнить запрос после {max_retries} попыток")