При ошибке Kimi API сначала смотрите на три вещи: HTTP-код состояния, error.type и request_id. Один и тот же 429 может означать перегрузку сервера, ограничение организации или недостаток средств; один и тот же 401 — неверный ключ или смешивание китайского и международного сайтов. Сначала классифицируйте, потом меняйте код.

Ниже разобраны четыре класса — 401, 404, 429 и тайм-ауты: причины, порядок диагностики и готовый код задержек. Модели и цены — на странице тарифов.

Примечание: Moonshot и Kimi — товарные знаки соответствующих правообладателей. Типы ошибок, правила ограничения и поведение интерфейсов могут меняться; примеры отражают распространённую ситуацию на октябрь 2026 года, окончательно действует официальная документация.

1. Быстрая таблица кодов

Код Тип ошибки Частый смысл Что делать
400 invalid_request_error Неверный параметр, слишком длинный контекст, превышен лимит вывода Исправить запрос
400 content_filter Вход или выход нарушил контентную политику Скорректировать промпт
401 invalid_authentication_error Недействительный ключ, несовпадение региона Исправить учётные данные
401 incorrect_api_key_error Ключ отсутствует или неверен Исправить учётные данные
403 permission_denied_error Интерфейс закрыт, IP-белый список, права или баланс Проверить права и баланс
404 resource_not_found_error Неверное имя модели или путь Свериться со списком моделей
429 engine_overloaded_error Перегрузка сервера Задержка и повтор
429 rate_limit_reached_error Превышены параллелизм, RPM, TPM или TPD Снизить скорость или поднять квоту
429 exceeded_current_quota_error Задолженность, недостаток средств, истёк ваучер Пополнить баланс
499 client_closed_request Клиент или прокси закрыл соединение раньше Проверить тайм-ауты и поток
500 server_error Внутренняя ошибка сервера Задержка и повтор
503 server_unavailable Сервис временно недоступен Задержка и повтор
504 Gateway Time-out Долгое ожидание длинного запроса Перейти на потоковый режим

Недостаток средств на разных входах может проявляться как 403 или 429, поэтому ориентируйтесь не только на код, но и на error.type. В журнале фиксируйте время, код, тип ошибки, имя модели и request_id; не записывайте полный ключ и чувствительное содержимое.

2. 401: сначала регион, потом ключ

  1. Не указан ли ключ китайского сайта на международном адресе или наоборот. Аккаунты, балансы и ключи двух сайтов полностью независимы.
  2. Не смешаны ли ключи разных продуктов: открытая платформа, Kimi Code и подписки.
  3. Нет ли в ключе пробелов, переводов строки или лишних кавычек.
  4. Действительно ли загружены переменные окружения — можно вывести только префикс ключа.
  5. Не удалён ли ключ, не ротирован ли он и есть ли у него права на текущий проект.
  6. Правильный ли заголовок Authorization: Bearer <key> и путь /v1/chat/completions.
export MOONSHOT_API_KEY="ваш ключ"

curl "https://api.moonshot.cn/v1/chat/completions" \
  -H "Authorization: Bearer $MOONSHOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kimi-k2.6",
    "max_completion_tokens": 64,
    "messages": [{"role": "user", "content": "Ответь только OK"}]
  }'

Если команда возвращает 200, ключ, регион и имя модели верны. Если 401 сохраняется, проверьте другой заведомо рабочий ключ, чтобы отделить проблему ключа от конфигурации шлюза.

3. 404: чаще всего ошибаются в имени модели и base_url

404 не обязательно означает, что модель снята с поддержки. Четыре частые причины:

  • При использовании OpenAI SDK не задан base_url, запрос ушёл на стандартный адрес OpenAI и вернул отсутствие модели.
  • Опечатка в имени модели или использование версии, к которой у аккаунта нет доступа.
  • Лишний или пропущенный /v1, либо чат-интерфейс указан по другому пути.
  • Разные имена моделей и права на китайском и международном сайтах.

Сначала получите список моделей тем же ключом и проверьте, что доступно аккаунту:

curl "https://api.moonshot.cn/v1/models" \
  -H "Authorization: Bearer $MOONSHOT_API_KEY"

Если модели нет в списке, не угадывайте. Доступность модели определяется фактическим ответом аккаунта и страницей тарифов. Если список возвращается, а чат-интерфейс всё равно даёт 404, проверьте, не пропущен ли /v1 и не склеивает ли клиент base_url с полным путём повторно.

4. 429: три типа и разная обработка

error.type Смысл Можно ли повторять Действие
engine_overloaded_error Перегрузка сервера Да Задержка по Retry-After, снизить параллелизм
rate_limit_reached_error Превышены параллелизм, RPM, TPM или TPD организации Частично Снизить скорость, разделить ключи, повысить уровень
exceeded_current_quota_error Задолженность, недостаток средств, истёкший ваучер Нет Пополнить баланс или проверить счета

При превышении TPD обычно остаётся ждать следующего дня или повышать квоту; повторять бессмысленно. Прерванные запросом 429 обычно не тарифицируются, но успешный повтор тарифицируется как обычный; не повторяйте бесконечно из страха расходов и не считайте, что 429 уже списал средства. OpenAI SDK по умолчанию повторяет автоматически и может превратить один 429 в несколько запросов; в продакшене явно задайте max_retries=0 и используйте собственную логику задержки.

import random
import time
from openai import OpenAI, RateLimitError

client = OpenAI(
    api_key="ваш ключ",
    base_url="https://api.moonshot.cn/v1",
    max_retries=0,
)

def ask(prompt: str, retries: int = 4) -> str:
    for attempt in range(retries):
        try:
            resp = client.chat.completions.create(
                model="kimi-k2.6",
                messages=[{"role": "user", "content": prompt}],
                max_completion_tokens=1024,
            )
            return resp.choices[0].message.content
        except RateLimitError as exc:
            body = exc.body or {}
            etype = (body.get("error") or {}).get("type", "")
            if etype == "exceeded_current_quota_error":
                raise RuntimeError("Недостаточно средств или квоты, пополните баланс")
            wait = min(2 ** attempt, 20) + random.random()
            print(etype, "ожидание", round(wait, 1), "с")
            time.sleep(wait)
    raise RuntimeError("Попытки исчерпаны")

Повторы подходят только для временных ошибок. Если операция уже могла дать побочный эффект, проверьте состояние по идемпотентному ключу или запросу статуса, прежде чем отправлять повторно.

5. Тайм-ауты и 504

Длинная генерация, анализ больших документов и кодовые агенты чаще всего сталкиваются с тайм-аутами. Порядок действий:

  1. Переведите непотоковый режим в stream=True, чтобы соединение постоянно получало данные.
  2. Задайте разумные тайм-ауты соединения и чтения, не полагайтесь на значения SDK по умолчанию.
  3. Проверьте, не обрывают ли соединение корпоративный прокси, шлюз и локальные маршрутизаторы; это может проявляться как 499.
  4. Ограничивайте длину одного вывода через max_completion_tokens, сверхдлинные задачи делите на части.
  5. Записывайте request ID и длительность каждого тайм-аута, чтобы отличить медленную модель, сеть и шлюз.
stream = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[{"role": "user", "content": "Составь чек-лист развёртывания"}],
    max_completion_tokens=2048,
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

Потоковый режим не снижает цену токена, но заметно сокращает потери от «ожидания тайм-аута и повтора». Тайм-аут соединения можно сделать короче, тайм-аут чтения — по максимальному времени генерации; для потока не используйте тайм-аут чтения непотокового режима, иначе клиент оборвёт нормальную генерацию.

6. Таблица порядка диагностики

  1. Зафиксируйте код состояния, error.type, request_id, имя модели и время.
  2. Для 401 и 403 проверьте регион, ключ, продукт, права и баланс.
  3. Для 404 проверьте base_url, имя модели и права аккаунта, сверьтесь со списком моделей.
  4. Для 400 проверьте длину контекста, лимит вывода, формат файла и контентную безопасность.
  5. Для 429 разделите по error.type на перегрузку, ограничение и задолженность.
  6. Для 499 и 504 проверьте поток, тайм-ауты, прокси и поддержание соединения.
  7. Для 500 и 503 используйте задержку и повтор; при постоянном повторении передайте поставщику request_id.
  8. После каждого сбоя дополняйте мониторинг и оповещения, не ждите отзывов пользователей.

Частые вопросы

Чем 429 отличается от 503?

429 может означать как перегрузку сервера, так и исчерпание квоты или баланса аккаунта; сначала смотрите error.type. 503 означает временную недоступность сервиса и обычно решается задержкой и повтором. Общее правило — не повторять с фиксированным интервалом.

Что делать, если после пополнения всё равно 401?

Убедитесь, что пополнение и ключ относятся к одному региону и одному продукту. Проверьте новый созданный ключ, чтобы исключить удаление старого ключа или кэш переменных окружения.

Какая ошибка будет при слишком длинном контексте?

Обычно 400 invalid_request_error с сообщением о слишком длинном входном токене. Сократите вход, обрежьте историю или перейдите на модель с большим контекстом.

Стоит ли включать автоматические повторы SDK?

Можно, но с верхним пределом. Автоматические повторы могут усилить 429; в продакшене лучше отключить их и реализовать экспоненциальную задержку и оповещения по типам ошибок самостоятельно.

Как отличить ошибку шлюза от ошибки официального API?

Отправьте один и тот же запрос напрямую и через шлюз, сравните код состояния, error.type и request_id. Так быстрее понять, где проблема: upstream, сеть, ключ или конфигурация шлюза.

Что дальше

Создайте тестовый ключ в ZSQH AI Gateway, отработайте по одному разу 401, 404, 429 и тайм-аут, затем подключите производственный мониторинг. Доступность моделей и цены — на странице тарифов.

Читайте также: