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

Documentation Index

Fetch the complete documentation index at: https://docs.elumenta.ru/llms.txt

Use this file to discover all available pages before exploring further.

Коды ошибок 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
}

Статусы генерации

При синхронных запросах генерации возможны следующие статусы:
  • completed — генерация успешно завершена
  • failed — произошла ошибка генерации

Обработка ошибок генерации

r = requests.post(url, headers=headers, json=payload)
response = r.json()

if response["status"] == "failed":
    error_msg = response.get("error", "Ошибка генерации")
    
    # Обработка специфичных типов ошибок
    if "503" in error_msg or "overloaded" in error_msg.lower():
        print("Модель временно перегружена, попробуйте через несколько минут")
    elif "timeout" in error_msg.lower():
        print("Генерация заняла слишком много времени")
    elif "moderation" in error_msg.lower() or "safety" in error_msg.lower():
        print("Запрос отклонён модерацией")
    else:
        print(f"Генерация не удалась: {error_msg}")
        
elif response["status"] == "completed" and response.get("result_url"):
    print(f"Результат готов: {response['result_url']}")

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

import requests

def обновить_токен(refresh_token):
    r = requests.post(
        "https://elumenta.ru/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("Пополните баланс на elumenta.ru/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://elumenta.ru/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)

503 — Модель перегружена

if r.status_code == 503:
    # Модель временно недоступна из-за высокой нагрузки
    print("Модель перегружена, попробуйте через несколько минут")
    # Или переключитесь на альтернативную модель
    fallback_models = ["gpt-4", "claude-3-5-sonnet", "gemini-2-5-pro"]
    for model in fallback_models:
        if model != payload["model"]:
            fallback_payload = {**payload, "model": model}
            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://elumenta.ru/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} попыток")