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