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"
}
}
Ошибки по симптомам
| Симптом | Что вы получаете на самом деле | Причина и починка |
|---|---|---|
Пустой content,но счёт выставлен самый вероятный |
HTTP 200finish_reason: "length"content: ""заполненный reasoning_content |
Рассуждения съели весь бюджет токенов. Поднимите max_completion_tokens или оставьте значение по умолчанию 131 072. Все шесть прогонов → |
401не авторизован |
|
Ключ отсутствует, опечатан, отозван — или потерялся префикс Bearer. Проверьте, что шелл действительно экспортировал переменную. Поля code для сопоставления здесь нет. |
404модель не найдена |
|
ID — ровно kimi-k3. Обратите внимание: сообщение смешивает «неверное имя» и «нет доступа» — если написание верное, дело в правах или в списке моделей, а не в опечатке. Проверьте, что ваш шлюз отдаёт K3. |
400пустой messages |
|
Массив сообщений отфильтровался в пустоту где-то выше по коду — обычно это баг обрезки истории. Проверяйте перед отправкой. |
429превышен лимит запросов |
По задокументированной схеме EvoLink — эту ошибку мы не воспроизводили. |
Слишком много запросов или токенов в минуту для вашего тарифа. Отступайте экспоненциально — 1 с, 2 с, 4 с, с джиттером. И сериализуйте собственные всплески: шторм ретраев выглядит как дополнительная нагрузка. |
| Таймаут / зависший запрос |
Нет ответа десятки секунд | Ожидаемо на длинном контексте: мы замерили 52 с на промпте в 498 тыс. токенов. Ставьте клиентские таймауты в минутах, а не секундах, и используйте stream: true. |
Нет usageпри стриминге |
Стрим завершился, блока usage нет | Передайте stream_options: {"include_usage": true}. Без этого вы не видите, сколько потратили — включая токены рассуждений. |
| Недостаточно средств |
Зависит от провайдера | Проверьте личный кабинет. Длинные контексты тратят быстро: один вызов на 498 тыс. токенов — это $1.49 только за вход. |
Сбои, которые не возвращают ошибку
Эту категорию стоит усвоить. K3 не валидирует ваши параметры — мы нашли два случая, когда очевидно некорректный запрос возвращает чистый HTTP 200:
| Что мы отправили | Почему это должно падать | Что произошло |
|---|---|---|
reasoning_effort: "low" |
Задокументирована поддержка только max |
HTTP 200 — молча принято, без предупреждения |
max_completion_tokens: 2000000 |
Почти вдвое больше контекстного окна в 1 048 576 | HTTP 200 — молча принято, без предупреждения |
Урок шире этих двух случаев: 200 от K3 не означает, что запрос понят так, как вы задумали. Если вы рассчитываете, что параметр меняет поведение, — проверьте, что поведение действительно изменилось, а не выводите это из отсутствия ошибки. Вместе с ловушкой пустого content правило простое: проверяйте сам ответ, а не код статуса.
Чек-лист перед релизом
modelв ответе повторяетkimi-k3— шлюз ничего молча не подменил.finish_reason == "stop", а не"length".contentнепустой.usage.total_tokensненулевой, и вы логируетеreasoning_tokens.- Клиентский таймаут в минутах, если работаете с длинным контекстом.
- Каждый параметр, на который вы полагаетесь, проверен по наблюдаемому поведению, а не по коду 200.
Готовая проверка для вашего кода — в руководстве по API.
Воспроизведите любой из случаев
Каждый случай отсюда воспроизводится за секунды: нужны curl и ключ. EvoLink отдаёт kimi-k3 через OpenAI-совместимый эндпоинт — 10 бесплатных кредитов, регистрация из любой страны, китайский номер телефона не нужен.