Перейти к содержанию
Справочник APIKimi · Chat Completions

Kimi · Chat Completions

Запросы к четырём моделям через один OpenAI-совместимый endpoint.

Отправляйте Kimi-запросы на POST https://api.guardrelay.ai/v1/chat/completions с Bearer-ключом gd-….

Основные поля

Список ниже закрытым не является. Незнакомое поле Guard не отклоняет: оно уходит поставщику как есть, и отвечает за него сам Kimi. temperature и top_p Kimi фиксирует у всех четырёх моделей и отвергает любое другое значение, поэтому на Chat Completions и Responses Guard убирает эти два поля из запроса: редакторы, которые всегда шлют temperature, работают без правок. На /v1/messages поля уходят как есть.

ПолеНазначение
modelодин из четырёх точных Kimi API ID; чужой id — 404 model_not_found
messagesнепустая история сообщений
max_tokens или max_completion_tokensмаксимум output-токенов, целое положительное; выходная часть предварительного reserve
streamfalse для обычного ответа, true для SSE
stream_options.include_usageдобавляет отдельный итоговый usage-кадр в stream; других ключей в stream_options нет
temperature, top_pубираются из запроса у всех моделей: Kimi принимает только фиксированные значения
top_kцелое положительное
frequency_penalty, presence_penaltyпринимается только 0
nпринимается только 1
tools, tool_choice, parallel_tool_callsклиентские функции; tool_choice: "required" не принимают kimi-for-coding и kimi-for-coding-highspeed
reasoning_effortлюбое непустое строковое значение и на любой из четырёх моделей. Ваше значение уходит наверх ровно как прислано: Guard его не переводит, своё не подставляет и годное не отклоняет. Сам Kimi документирует три уровня, low, high и max, по умолчанию max
thinkingтолько kimi-for-coding и kimi-for-coding-highspeed, ровно {"type": "enabled", "keep": "all"}
response_format, stop, partialформат ответа, стоп-строки и продолжение начатого ответа
prompt_cache_keyключ кеша промпта, уходит наверх как есть
seed, metadata, prediction, service_tier, store, safety_identifierпроходят проверку формы и уходят наверх без изменений. Живая проба показала, что Kimi принимает их с кодом 200, но действие каждого не выделено; service_tierauto или priority, store — только false
user, logprobs, top_logprobs, logit_bias, modalities, audio, web_search_options, reasoning, verbosityобычные поля OpenAI. Клиентские библиотеки ставят их сами, поэтому Guard их не блокирует и передаёт наверх

Пример

bash
curl https://api.guardrelay.ai/v1/chat/completions \
  -H "Authorization: Bearer $GUARD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kimi-for-coding",
    "messages": [{"role": "user", "content": "Ответь одним словом: готово"}],
    "max_tokens": 64,
    "stream": false
  }'

Текст обычного ответа находится в choices[0].message.content. Фактический usage используется для окончательного списания после ответа.

Файлы в запросе

Документ сначала загружается отдельным запросом POST /v1/files, а затем упоминается в чат-запросе по его file_id. Тело загрузки — multipart/form-data с обязательным полем file и необязательным purpose. Отдельный ключ и отдельная авторизация не нужны: тот же gd-….

Параметр загрузкиЗначение
Метод и адресPOST https://api.guardrelay.ai/v1/files
Телоmultipart/form-data: ровно одна файловая часть в поле file и не больше одного дополнительного поля. Второе поле формы даёт 400 invalid_multipart
purposeuser_data (по умолчанию), file-extract или assistants. Guard возвращает ваше написание, но обрезает пробелы по краям
Форматы.pdf, .txt, .md, .json, .csv, .docx, .xlsx, .pptx
Размер одного файладо 10 МиБ; пустой файл отклоняется
Пределы внутри документаPDF — до 200 страниц. .xlsx — до 200 листов, до 20 000 строк на лист, до 200 000 ячеек на книгу, до 32 768 символов в ячейке. .pptx — до 500 слайдов. .docx и .pptx — до 50 000 блоков. Любой документ — до 1000 разделов
Срок жизни24 часа с момента загрузки, затем файл удаляется автоматически
Квота на ключне больше 20 файлов и до 50 МиБ. Место меряется не исходным файлом, а зашифрованной записью, в которую входят и файл, и извлечённый из него текст. Для .txt, .md, .json, .csv это примерно 3,6 размера файла: 50 МиБ квоты вмещают около 13–14 МиБ таких документов. У сжатых .docx, .xlsx и .pptx кратность выше — архив маленький, а текст внутри него нет
Внутри одного запросадо 20 ссылок на файлы. Общий предел 2 МиБ меряется по готовому JSON-блоку, а не по чистому тексту: в него входят обёртка, поле notice, якоря всех разделов и экранирование. В наших замерах это добавляет к тексту от 5% при десятках разделов до 13% при тысяче, так что своего текста помещается заметно меньше 2 МиБ
bash
curl -X POST https://api.guardrelay.ai/v1/files \
  -H "Authorization: Bearer $GUARD_API_KEY" \
  -F "file=@report.pdf" \
  -F "purpose=user_data"
json
{
  "id": "file_0Xk9…",
  "object": "file",
  "bytes": 184320,
  "created_at": 1756200000,
  "expires_at": 1756286400,
  "filename": "report.pdf",
  "purpose": "user_data",
  "content_type": "application/pdf"
}

created_at и expires_at — секунды Unix. Разница между ними и есть срок жизни файла: после expires_at любой запрос по этому file_id отвечает 404 file_not_found.

В чат-запросе файл упоминается блоком input_file внутри массива content сообщения с ролью user. Вопрос к документу кладётся соседним блоком text.

json
{
  "model": "k3",
  "max_tokens": 512,
  "messages": [
    {
      "role": "user",
      "content": [
        {"type": "input_file", "file_id": "file_0Xk9…"},
        {"type": "text", "text": "Кратко перескажи документ."}
      ]
    }
  ]
}

Guard извлекает текст документа при загрузке и подставляет его вместо блока input_file — на том месте, где вы его написали, и только внутри сообщения пользователя. На место блока встаёт обычный текстовый блок с объектом guard_translated_document: file_id, filename, content_type и список sections, где у каждого раздела есть text и якорь anchor вида file_0Xk9…#page=3, #slide=2, #sheet=1&part=1 или #section=4. Для модели это данные пользователя, а не системная инструкция; попросите её ссылаться на якоря, если нужны ссылки на страницы. Отдельного поля с цитатами в ответе нет. Запрос без input_file уходит наверх без изменений и файлового хранилища не касается.

Операция с файломЗапрос
Список файлов ключаGET /v1/files{"object": "list", "data": [...]}
Метаданные одного файлаGET /v1/files/{file_id}
Скачать исходный файлGET /v1/files/{file_id}/content — отдаёт байты как вложение
Удалить сразуDELETE /v1/files/{file_id}{"id": "file_0Xk9…", "object": "file", "deleted": true}

Управляемый поиск и загрузка страницы

Два вспомогательных endpoint'а достают текст из веба, чтобы вы сами положили его в свой следующий чат-запрос. Модель они не вызывают, model не принимают, stream не поддерживают и работают тем же ключом gd-….

EndpointТело запросаОтвет
POST /v1/kimi/searchровно одно поле — {"query": "строка"}{"object": "list", "data": [...]}, до 20 результатов
POST /v1/kimi/fetchровно одно поле — {"url": "https://…"}{"content": "…", "content_type": "text/markdown; charset=utf-8", "truncated": false}
bash
curl -X POST https://api.guardrelay.ai/v1/kimi/search \
  -H "Authorization: Bearer $GUARD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "выпуск python 3.14"}'
json
{
  "object": "list",
  "data": [
    {
      "url": "https://example.org/post",
      "title": "Заголовок страницы",
      "snippet": "Короткая выдержка…",
      "date": "2026-08-20",
      "site_name": "example.org"
    }
  ]
}

В результате поиска гарантирован только url; title, snippet, date и site_name появляются, когда они пришли и прошли проверку длины. Результат без пригодного url из списка выбрасывается, поэтому в data может оказаться меньше строк, чем нашлось.

bash
curl -X POST https://api.guardrelay.ai/v1/kimi/fetch \
  -H "Authorization: Bearer $GUARD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.org/post"}'
json
{
  "content": "# Заголовок\n\nТекст страницы в Markdown…",
  "content_type": "text/markdown; charset=utf-8",
  "truncated": false
}
ОграничениеЗначение
queryнепустая строка после обрезки пробелов, до 4096 символов и до 16 384 байт UTF-8
urlтолько http/https, до 2048 символов, без пробелов, без логина и пароля, без якоря #, порт только 80 или 443
Адрес назначениятолько публичное доменное имя, и в нём обязана быть точка. Отклоняются имя без точки (localhost, metadata, любое короткое имя хоста), metadata.google.internal, суффиксы .home, .internal, .lan, .local и .localhost, литеральный IP-адрес и любое имя, которое разрешается в непубличный адрес
Размер страницыдо 2 МиБ ответа. Более крупную страницу обрывает транспорт, и приходит 503 managed_service_unavailable с Retry-After: 1. Заголовок обещает повтор, но эта страница меньше не станет — нужен другой адрес
Тело запросаровно одно ожидаемое поле. Лишнее поле, чужое имя поля и нерабочий JSON — все три дают 400 invalid_managed_service_request

Разделы документации

На этой странице