Перейти к содержимому

Обработка ошибок

При сбое запроса Claudexia возвращает ответ об ошибке с подробностями. Формат зависит от используемого эндпоинта.

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

Ошибки от /v1/messages:

json
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "max_tokens: Field required"
  }
}

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

Ошибки от /v1/chat/completions:

json
{
  "error": {
    "message": "Invalid API key provided.",
    "type": "authentication_error",
    "code": "invalid_api_key"
  }
}

Распространённые коды ошибок

HTTP-статусТип ошибкиОписание
400invalid_request_errorТело запроса некорректно или отсутствуют обязательные поля (например, max_tokens, messages).
401authentication_errorНеверный или отсутствующий API-ключ. Убедитесь, что ключ начинается с sk_cdx_.
403permission_errorЗапрошенная модель недоступна на вашем тарифе, или ваш IP-адрес заблокирован.
429rate_limit_errorПревышен лимит запросов. Подождите и повторите после времени, указанного в заголовке Retry-After.
500api_errorВнутренняя ошибка сервера. Это ошибка на нашей стороне — повторите запрос или обратитесь в поддержку.
529overloaded_errorAPI временно перегружен. Повторите с экспоненциальной задержкой.

Стратегия повторов

Мы рекомендуем следующий подход к повторам:

  • 429 и 529 — повторяйте с экспоненциальной задержкой от 1 секунды: 1с, 2с, 4с, 8с, максимум 60с. Учитывайте заголовок Retry-After.
  • 500 — повторите до 3 раз с задержкой 1 секунду. Если ошибка сохраняется, скорее всего это временная проблема.
  • 400, 401, 403 — не повторяйте. Исправьте запрос или проверьте API-ключ и разрешения.
python
import time
import requests

def call_api(payload, max_retries=3):
    for attempt in range(max_retries):
        response = requests.post(
            "https://api.claudexia.tech/v1/messages",
            headers={
                "x-api-key": "sk_cdx_YOUR_KEY",
                "anthropic-version": "2023-06-01",
                "Content-Type": "application/json",
            },
            json=payload,
        )
        if response.status_code == 200:
            return response.json()
        if response.status_code in (429, 529):
            wait = int(response.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait)
            continue
        if response.status_code >= 500:
            time.sleep(1)
            continue
        # 4xx client errors — don't retry
        response.raise_for_status()
    raise Exception("Max retries exceeded")