Ошибки

Все коды состояния, которые возвращает шлюз: реальные причины и способы исправления.

При ошибках возвращается JSON с type и понятным человеку message. Коды состояния соответствуют соглашениям Anthropic и OpenAI.

{"type": "error", "error": {"type": "authentication_error", "message": "invalid api key"}}

Коды состояния

КодЗначениеНаиболее частая причина на практикеРешение
400Некорректный запросОтсутствует max_tokens в Messages или некорректно сформирован messages массивПроверьте тело запроса по Messages
401Не выполнена аутентификацияКлюч отправлен в заголовке, не соответствующем форматуx-api-key для Messages, Bearer для Chat Completions
402Требуется оплатаБаланс исчерпан или срок действия тарифа истёкПополнить баланс или купите тариф
403Доступ запрещёнКлюч отозван или модель не включена для аккаунтаСоздайте новый ключ; проверьте /v1/models
404Не найденоОшибка в базовом URL — обычно дублируется или отсутствует /v1См. Базовые URL
429Превышен лимит запросовСлишком много одновременных запросовУвеличивайте задержку между попытками экспоненциально; см. Ограничения частоты запросов
500Ошибка шлюзаНепредвиденный внутренний сбойПовторите запрос один раз; если ошибка сохраняется, обратитесь в поддержку, указав идентификатор запроса
529Сервис провайдера перегруженОграничение мощности провайдера, а не вашего аккаунтаПовторите запрос с увеличенной задержкой — обычно проблема исчезает за несколько секунд

Типы ошибок

типЗначение
invalid_request_errorТело запроса сформировано некорректно или отсутствует обязательное поле
authentication_errorКлюч отсутствует, имеет некорректный формат или отозван
permission_errorКлюч действителен, но не имеет доступа к этой модели
not_found_errorНеизвестный путь или идентификатор модели
rate_limit_errorЗапросы ограничены
api_errorВнутренний сбой
overloaded_errorМощности сервиса провайдера исчерпаны

Правильное повторение запросов

Повторная попытка 429, 500, 502, 503 и 529. Никогда не повторяйте вслепую 400, 401, 402 или 403 — тот же запрос завершится той же ошибкой, а за частично сгенерированные ответы вы можете заплатить дважды.

import time, httpx

def call(body, key, tries=4):
    for i in range(tries):
        r = httpx.post(class="s">"https://aiprimetech.io/v1/messages", json=body, timeout=120,
                       headers={class="s">"x-api-key": key,
                                class="s">"anthropic-version": class="s">"2023-06-01"})
        if r.status_code in (429, 500, 502, 503, 529):
            time.sleep(2 ** i)          class=class="s">"c"># 1s, 2s, 4s, 8s
            continue
        r.raise_for_status()
        return r.json()
    raise RuntimeError(class="s">"upstream unavailable after retries")
В рабочей среде добавляйте случайный разброс к задержке между попытками. Синхронные повторные попытки множества обработчиков превращают кратковременный сбой в лавину запросов к одному и тому же сервису провайдера.