Errors

HTTP статус-коды Zowy API совместимы с практикой OpenAI: 2xx успех, 4xx ошибка клиента, 5xx ошибка сервера или upstream.

Формат тела ошибки

{
  "error": {
    "code": "invalid_api_key",
    "message": "API key is missing or invalid",
    "type": "authentication_error"
  }
}

HTTP коды

КодИмяКогдаЧто делать
200OKУспешный запрос
400Bad RequestНевалидный JSON, отсутствует обязательное поле, неподдерживаемая модельПроверьте тело запроса; error.message содержит детали
401UnauthorizedНет/невалидный/отозванный ключПроверьте формат Bearer zowy_..., перевыпустите ключ при необходимости
402Payment RequiredКлюч валиден, но активного пакета нет / пакет исчерпан / просроченКупите пакет на /pricing
403ForbiddenДоступ к запрошенной модели или функции недоступен для этого ключаПроверьте права ключа в Developer Portal
404Not FoundEndpoint не существуетПроверьте путь, см. Docs
429Too Many RequestsПревышен per-key rate limit (default 60/мин, 1000/час)Снизьте частоту, exponential backoff. Запросите увеличение через info@zowy.ai
500Internal Server ErrorВнутренняя ошибка Zowy proxyПовторите; если сохраняется — напишите на support
502Bad GatewayUpstream-модель вернула невалидный ответRetry с backoff. Попробуйте другую модель
503Service UnavailableUpstream временно недоступенRetry с экспоненциальным backoff
504Gateway TimeoutUpstream не ответил в timeout (300s)Уменьшите max_tokens, попробуйте streaming

WebSocket ошибки

Voice WebSocket посылает error событие и затем закрывает соединение:

{"type": "error", "code": "no_active_package", "message": "..."}
codeКогда
invalid_tokenНевалидный или отозванный API-ключ в query string
no_active_packageНет активного Voice-пакета
voice_not_foundУказанный voice в config не существует
session_limitДостигнут hard-cap 15 минут
upstream_errorОшибка от upstream-модели

Retry и backoff

Безопасно повторять с экспоненциальным backoff: 5xx, 429. Не повторяйте 4xx кроме 429 — это ваша ошибка.

Python
import time, requests
for attempt in range(5):
    r = requests.post(URL, headers=H, json=BODY, timeout=60)
    if r.status_code < 500 and r.status_code != 429:
        break
    time.sleep(2 ** attempt)  # 1, 2, 4, 8, 16 sec