Отправляйте 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 |
stream | false для обычного ответа, 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_tier — auto или priority, store — только false |
user, logprobs, top_logprobs, logit_bias, modalities, audio, web_search_options, reasoning, verbosity | обычные поля OpenAI. Клиентские библиотеки ставят их сами, поэтому Guard их не блокирует и передаёт наверх |
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 |
purpose | user_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 МиБ |
curl -X POST https://api.guardrelay.ai/v1/files \
-H "Authorization: Bearer $GUARD_API_KEY" \
-F "file=@report.pdf" \
-F "purpose=user_data"{
"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.
{
"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} |
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"}'{
"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 может оказаться меньше строк, чем нашлось.
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"}'{
"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 |