kimik3.io/Ошибки

Ошибки и режимы отказа Kimi K3

Каждое тело ответа ниже получено 2026-07-16 из вызова, который мы сломали специально. Ничто здесь не реконструировано по документации.

Та, что действительно вас подловит, — не из привычного ряда этой таблицы: когда max_completion_tokens слишком мал, чтобы рассуждения успели завершиться, K3 возвращает HTTP 200 с пустым content — и тарифицирует вызов полностью. Это тихий сбой: он выглядит как успех, и именно так чаще всего ломается первая интеграция. Полный разбор →

Замерено на api.moonshot.ai с моделью kimi-k3вот как.

Как устроена ошибка

Ошибки приходят единым объектом error с полями message, type и code:

{
  "error": {
    "message": "API key is missing or invalid",
    "type": "invalid_authentication_error",
    "code": null
  }
}

Не ветвитесь по code. Поле допускает null, и во всех ошибках, которые мы спровоцировали напрямую у Moonshot, его не было вовсе. Всегда заполненным оказывалось поле type — сопоставляйте по нему.

Через шлюз тела ошибок авторизации и «модель не найдена» ниже не совпадут байт в байт. Неверный ключ отбивает собственный слой авторизации шлюза, и до Moonshot запрос не доходит — вы получите его формулировку, а не формулировку Moonshot. Симптомы, причины и способы починки от этого не меняются. Поведенческие находки на этой странице — ловушка с пустым content, параметры без валидации — свойства самой модели и действуют везде, где отдают K3.

{
  "error": {
    "message": "Invalid Authentication",
    "type": "invalid_authentication_error"
  }
}

Ошибки по симптомам

Воспроизведено 2026-07-16 на kimi-k3.
СимптомЧто вы получаете на самом делеПричина и починка
Пустой content,
но счёт выставлен

самый вероятный
HTTP 200
finish_reason: "length"
content: ""
заполненный reasoning_content
Рассуждения съели весь бюджет токенов. Поднимите max_completion_tokens или оставьте значение по умолчанию 131 072. Все шесть прогонов →
401
не авторизован
{"error": {
  "message": "Invalid Authentication",
  "type": "invalid_authentication_error"
}}
Ключ отсутствует, опечатан, отозван — или потерялся префикс Bearer. Проверьте, что шелл действительно экспортировал переменную. Поля code для сопоставления здесь нет.
404
модель не найдена
{"error": {
  "message": "Not found the model kimi-k3-chat
              or Permission denied",
  "type": "resource_not_found_error"
}}
ID — ровно kimi-k3. Обратите внимание: сообщение смешивает «неверное имя» и «нет доступа» — если написание верное, дело в правах или в списке моделей, а не в опечатке. Проверьте, что ваш шлюз отдаёт K3.
400
пустой messages
{"error": {
  "message": "Invalid request: messages
              must not be empty",
  "type": "invalid_request_error"
}}
Массив сообщений отфильтровался в пустоту где-то выше по коду — обычно это баг обрезки истории. Проверяйте перед отправкой.
429
превышен лимит запросов
{"error": {
  "message": "Rate limit exceeded",
  "type": "...",
  "code": null
}}
По задокументированной схеме EvoLink — эту ошибку мы не воспроизводили.
Слишком много запросов или токенов в минуту для вашего тарифа. Отступайте экспоненциально — 1 с, 2 с, 4 с, с джиттером. И сериализуйте собственные всплески: шторм ретраев выглядит как дополнительная нагрузка.
Таймаут /
зависший запрос
Нет ответа десятки секунд Ожидаемо на длинном контексте: мы замерили 52 с на промпте в 498 тыс. токенов. Ставьте клиентские таймауты в минутах, а не секундах, и используйте stream: true.
Нет usage
при стриминге
Стрим завершился, блока usage нет Передайте stream_options: {"include_usage": true}. Без этого вы не видите, сколько потратили — включая токены рассуждений.
Недостаточно
средств
Зависит от провайдера Проверьте личный кабинет. Длинные контексты тратят быстро: один вызов на 498 тыс. токенов — это $1.49 только за вход.

Сбои, которые не возвращают ошибку

Эту категорию стоит усвоить. K3 не валидирует ваши параметры — мы нашли два случая, когда очевидно некорректный запрос возвращает чистый HTTP 200:

Оба вернули HTTP 200 с обычным завершением. 2026-07-16.
Что мы отправилиПочему это должно падатьЧто произошло
reasoning_effort: "low" Задокументирована поддержка только max HTTP 200 — молча принято, без предупреждения
max_completion_tokens: 2000000 Почти вдвое больше контекстного окна в 1 048 576 HTTP 200 — молча принято, без предупреждения

Урок шире этих двух случаев: 200 от K3 не означает, что запрос понят так, как вы задумали. Если вы рассчитываете, что параметр меняет поведение, — проверьте, что поведение действительно изменилось, а не выводите это из отсутствия ошибки. Вместе с ловушкой пустого content правило простое: проверяйте сам ответ, а не код статуса.

Чек-лист перед релизом

  1. model в ответе повторяет kimi-k3 — шлюз ничего молча не подменил.
  2. finish_reason == "stop", а не "length".
  3. content непустой.
  4. usage.total_tokens ненулевой, и вы логируете reasoning_tokens.
  5. Клиентский таймаут в минутах, если работаете с длинным контекстом.
  6. Каждый параметр, на который вы полагаетесь, проверен по наблюдаемому поведению, а не по коду 200.

Готовая проверка для вашего кода — в руководстве по API.

Воспроизведите любой из случаев

Каждый случай отсюда воспроизводится за секунды: нужны curl и ключ. EvoLink отдаёт kimi-k3 через OpenAI-совместимый эндпоинт — 10 бесплатных кредитов, регистрация из любой страны, китайский номер телефона не нужен.

Получить API-ключ EvoLink