Для AI-агентов: markdown этой страницы — /docs-content/ai/chat.md индекс документации — /llms.txt

Чат-комплишены

Генерация ответа модели через единый OpenAI-совместимый эндпоинт. Поддерживает синхронный режим, потоковую передачу через Server-Sent Events, вызов функций, гарантированный JSON-ответ и работу с изображениями.

Скоуп: vibe:ai

Создать чат-комплишен

Ответ приходит в сыром OpenAI-формате.

Обёртки {success, data}, которая используется в остальных эндпоинтах Вайбкод — /v1/deals, /v1/tasks и других, — здесь нет.

Так сделано для совместимости с OpenAI SDK. Если у вас единый клиент с проверкой if (!response.success), добавьте для AI Router исключение.

POST /v1/chat/completions

Генерирует ответ AI-модели на массив сообщений. Формат запроса и ответа совместим с POST /v1/chat/completions из OpenAI API.

Возможности эндпоинта вынесены на отдельные страницы: потоковая передача, гарантированный JSON-ответ, вызов функций, анализ изображений и лимиты запросов.

Поля запроса (body)

Поле Тип Обяз. По умолч. Описание
model string нет auto ID модели или алиас. См. секцию «Алиасы» ниже. Если поле не передано или равно auto — запрос выполняется на модели портала по умолчанию. Список доступных моделей — GET /v1/models
messages array да Массив сообщений диалога. Минимум 1, максимум 256
messages[].role string да Роль: system, user, assistant, tool
messages[].content string | array | null да Текст сообщения. Максимум 500 000 символов в одном сообщении или 64 элемента в массиве content. Для запросов с изображениями — массив с type: "text" и type: "image_url". У assistant с tool_calls может быть null
messages[].name string нет Имя отправителя (мультиагентные сценарии)
messages[].tool_calls array нет Вызовы функций от ассистента — присутствуют в ответе модели при finish_reason: "tool_calls"
messages[].tool_call_id string нет ID вызова функции — обязателен в сообщении с role: "tool"
temperature number нет по модели Температура генерации, диапазон 0..2. Меньше — точнее и детерминированнее, больше — креативнее
max_tokens number нет по модели Максимум токенов в ответе
top_p number нет Nucleus sampling, диапазон 0..1
stop string | array нет Стоп-последовательности (до 4 штук, каждая до 64 символов)
stream boolean нет false Если true — ответ приходит потоком Server-Sent Events
response_format object нет Управление форматом ответа: {"type": "text"} — значение по умолчанию, {"type": "json_object"} — корректный JSON, {"type": "json_schema", "json_schema": {...}} — строгая JSON Schema, требует поддержки моделью
tools array нет Определения функций, которые модель может вызвать
tool_choice string | object нет auto (модель решает сама), none (запретить вызовы) или {"type": "function", "function": {"name": "..."}} (форсировать конкретную)

Алиасы моделей

Поле model принимает три значения, которые разрешаются в модель портала по умолчанию — сейчас это bitrix/bitrixgpt-5.5: auto, bitrix/free или пустая строка.

Модели bitrix/bitrixgpt-5 и bitrix/bitrixgpt-5-vl помечены как устаревшие и работают до 31 июля 2026 года. После этой даты запросы к ним прозрачно перенаправляются на bitrix/bitrixgpt-5.5 с заголовком X-Model-Replacement — подробнее в жизненном цикле моделей.

Кроме того, частичный modelId сопоставляется с каталогом по подстроке: если передан gpt-4o-mini, будет найдена доступная вашему ключу модель, в идентификаторе которой эта подстрока встречается.

Примеры

curl — личный ключ

Terminal
curl -X POST https://vibecode.bitrix24.tech/v1/chat/completions \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bitrix/bitrixgpt-5.5",
    "messages": [
      {"role": "system", "content": "Ты эксперт по продажам. Классифицируй лидов по качеству."},
      {"role": "user", "content": "ООО Вектор, 50 пользователей, бюджет 500 тысяч в месяц."}
    ],
    "temperature": 0.3,
    "max_tokens": 300
  }'

curl — OAuth-приложение

Terminal
curl -X POST https://vibecode.bitrix24.tech/v1/chat/completions \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bitrix/bitrixgpt-5.5",
    "messages": [
      {"role": "system", "content": "Ты эксперт по продажам. Классифицируй лидов по качеству."},
      {"role": "user", "content": "ООО Вектор, 50 пользователей, бюджет 500 тысяч в месяц."}
    ],
    "temperature": 0.3,
    "max_tokens": 300
  }'

JavaScript — личный ключ

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/chat/completions', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'bitrix/bitrixgpt-5.5',
    messages: [
      { role: 'system', content: 'Ты эксперт по продажам. Классифицируй лидов по качеству.' },
      { role: 'user', content: 'ООО Вектор, 50 пользователей, бюджет 500 тысяч в месяц.' },
    ],
    temperature: 0.3,
    max_tokens: 300,
  }),
})

const data = await res.json()
console.log(data.choices[0].message.content)
console.log('Токены:', data.usage.total_tokens)

JavaScript — OAuth-приложение

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/chat/completions', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'bitrix/bitrixgpt-5.5',
    messages: [
      { role: 'system', content: 'Ты эксперт по продажам. Классифицируй лидов по качеству.' },
      { role: 'user', content: 'ООО Вектор, 50 пользователей, бюджет 500 тысяч в месяц.' },
    ],
    temperature: 0.3,
    max_tokens: 300,
  }),
})

const data = await res.json()
console.log(data.choices[0].message.content)

Поля ответа

Поле Тип Описание
id string Уникальный ID комплишена для отслеживания
object string Всегда chat.completion для синхронного ответа
created number Unix-timestamp создания комплишена
model string Фактически использованная модель (может отличаться от model запроса при автоматическом переключении на резервную модель или DISABLED-перенаправлении)
choices array Варианты ответа модели. Без параметра n в массиве один элемент
choices[].index number Порядковый номер варианта
choices[].finish_reason string Причина завершения: stop, length, tool_calls, content_filter
choices[].message object Сгенерированное сообщение
choices[].message.role string Всегда assistant
choices[].message.content string | null Текст ответа. null при finish_reason: "tool_calls" — содержимое в tool_calls
choices[].message.tool_calls array Список вызовов функций (если модель решила их вызвать)
warnings array Предупреждения о том, что платформа изменила в запросе или что стоит учесть в ответе. У каждого элемента есть минимум code и message, у отдельных предупреждений — дополнительные поля. Известные коды: MAX_TOKENS_RAISED, COWORK_QUOTA_FALLBACK (несёт также tier, nextTier, resetAt), THINKING_TRUNCATED. Поле отсутствует, когда предупреждений нет
usage.prompt_tokens number Токены входа
usage.completion_tokens number Токены ответа
usage.total_tokens number Сумма токенов в запросе и ответе

Пример ответа

JSON
{
  "id": "chatcmpl-a1a73c6eb3f180fd",
  "object": "chat.completion",
  "created": 1777289339,
  "model": "bitrix/bitrixgpt-5.5",
  "choices": [
    {
      "index": 0,
      "finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": "Качество: ВЫСОКОЕ\n\nОбоснование:\n- Юридическое лицо (ООО) — B2B-клиент\n- Бюджет 500 тысяч в месяц — выше среднего\n- Конкретный объём (50 пользователей) — осознанная потребность\n\nРекомендация: назначить звонок в течение 24 часов."
      }
    }
  ],
  "usage": {
    "prompt_tokens": 42,
    "completion_tokens": 85,
    "total_tokens": 127
  }
}

Пример ответа при ошибке

404 ai_model_not_found — модель не найдена или у ключа нет доступа к ней:

JSON
{
  "error": {
    "message": "Model \"anthropic/claude-imaginary-x\" not found or disabled.",
    "type": "invalid_request_error",
    "code": "ai_model_not_found"
  }
}

Ошибки

HTTP Код Описание
400 invalid_request Пустой массив messages, неверная роль, нарушение схемы
400 invalid_image_payload Некорректный image_url — сообщение содержит номер элемента content и причину. См. анализ изображений
400 no_default_model У портала нет ни одной доступной для вызова модели
402 ai_credentials_not_configured Для модели нет учётных данных провайдера — подключите BYOK
402 insufficient_balance Недостаточно средств для платной модели
402 ai_quota_exhausted Месячная AI-квота портала исчерпана. Поле reason уточняет причину
402 cowork_quota_exhausted Исчерпано одно из окон квоты подписки Cowork/Code. Тело несёт window (5h/week/month), resetAt и nextTier, заголовок Retry-After — число секунд до сброса окна
403 scope_missing API-ключу не хватает скоупа vibe:ai
404 ai_model_not_found Модель не найдена или отключена
422 structured_output_truncated Запрос с response_format не дал полного JSON: генерация оборвана по finish_reason: "length" либо поле content пустое при любой причине завершения и без tool_calls. В режиме json_object есть исключение — готовый JSON, попавший в служебный канал reasoning_content, восстанавливается, и ответ остаётся 200. Подробнее — гарантированный JSON-ответ
429 rate_limit_exceeded Превышен лимит запросов. Заголовок X-RateLimit-Scope указывает уровень — per-key или per-user
429 ai_congested Пул AI-кластера перегружен. Запрос не выполнялся, списания нет, повторите его по заголовку Retry-After. Ответ несёт заголовок X-AI-Admission: shed, а не X-RateLimit-Scope
429 ai_pacing_limited Превышено суточное или недельное окно равномерного расходования квоты. Это не исчерпание квоты — повторите запрос по заголовку Retry-After. Подробнее — «Равномерное расходование»
429 ai_provider_cooldown Кластер моделей временно недоступен, и платформа держит паузу, чтобы повторы его не добивали. Запрос не выполнялся, списания нет — повторите его через число секунд из Retry-After. Заголовков X-RateLimit-Scope и X-AI-Admission у этого ответа нет
400 ai_provider_rejected Модель отклонила сам запрос (например неподдерживаемый параметр). Повторять его без изменений бесполезно. Возвращается, когда провайдер ответил 400 или 422
502 ai_provider_unavailable Внешний провайдер вернул ошибку (401/403/5xx) или недоступен
503 model_unavailable Модель отключена, и преемник для неё не назначен. См. жизненный цикл моделей
503 pool_exhausted Платформа временно перегружена. Повторите запрос через число секунд из Retry-After — это 3-7 секунд со случайным разбросом

Полный список общих ошибок API — Ошибки.

Известные особенности

Автоматическое переключение на резервную модель при сбое провайдера. Если у платной модели произошла ошибка 5xx или таймаут, синхронный запрос повторяется с моделью по умолчанию. В ответе появляется заголовок X-Model-Fallback: <исходный modelId>. В потоковом режиме такого переключения нет — клиент получает ошибку в последнем событии перед data: [DONE].

Исчерпанная квота Cowork/Code: ответ объявляет лимит, а не выполняет запрос. Это отдельное состояние, не имеющее отношения к X-Model-Fallback выше: тот заголовок отмечает подмену модели, здесь же квота подписки исчерпана. Когда окно квоты исчерпано, а на платформе настроена резервная модель, запрос отвечает кодом 200, но работа по нему не делается: поля tools, tool_choice и response_format снимаются, системные сообщения запроса не действуют, и модель сообщает, что лимит достигнут и когда он сбросится. Признаки состояния — заголовок X-Cowork-Fallback: true и предупреждение COWORK_QUOTA_FALLBACK в массиве warnings. В потоковом режиме предупреждения в теле нет, состояние видно по заголовку. Списания за такой ответ нет, квота не расходуется. Не ждите здесь tool_calls и JSON по схеме: даже с response_format в запросе придёт обычный текст. Если резервная модель не настроена — или настроенная сама не ответила, — приходит 402 cowork_quota_exhausted. По коду ответа эти два случая не различаются, поэтому обрабатывайте 402 на этом эндпоинте всегда.

Месячная AI-квота портала. На порталах с включённым контролем квоты запрос может вернуть 402 ai_quota_exhausted. Поле reason различает три случая: breaker — сработал часовой предохранитель расходов сверх квоты, wallet_empty — квота исчерпана и на балансе портала нет средств, wallet_off — расход сверх квоты для портала недоступен. Поле resetAt содержит момент, когда запросы снова начнут проходить, для wallet_off оно может отсутствовать. В ветке wallet_empty ответ может дополнительно нести строку hint с подсказкой и ссылку topupUrl на пополнение баланса — оба поля появляются, когда на платформе включены принудительный контроль квоты и подсказка о пополнении, поэтому читайте их как необязательные. Поле hint в этом ответе — строка. Пока расход укладывается в квоту, поведение эндпоинта не меняется. Сверх квоты, если такой расход для портала разрешён, запросы списываются с денежного баланса портала по базовой цене модели из каталога.

Бюджет обработки синхронного запроса — около 850 секунд. По исчерпании бюджета приходит 503 ai_provider_timeout. Заголовка Retry-After в этом ответе нет намеренно: повтор того же запроса упрётся в тот же бюджет. Сократите объём запроса или перейдите на потоковую передачу — там действует тайм-аут простоя между событиями, а не общий бюджет на весь вызов.

Лимит размера тела запроса — 30 MiB. Этого хватает, чтобы передать одно изображение размером до 20 MiB: после кодирования base64 оно занимает около 27 MiB.

Передача content массивом. Для текстовых моделей передавайте content строкой. Массив с одним элементом text тоже работает, но избыточен. Массив обязателен только для запросов с изображениями.

Смотрите также