Ошибки
Все коды состояния, которые возвращает шлюз: реальные причины и способы исправления.
При ошибках возвращается 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")
В рабочей среде добавляйте случайный разброс к задержке между попытками. Синхронные повторные попытки множества обработчиков превращают кратковременный сбой в лавину запросов к одному и тому же сервису провайдера.