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

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

Ответ приходит в сыром 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[].reasoning_content Типstring | null Обяз.нет По умолч.— ОписаниеРассуждение модели из прошлого ответа, возвращённое в историю диалога. Учитывается только у роли assistant, у сообщений других ролей игнорируется. Значение null равнозначно отсутствию поля, пустая строка допустима. Значение не строкой или длиннее 4 000 000 символов отклоняется с 400 invalid_request. Поле доходит до модели, у которой owned_by в GET /v1/models равно bitrix, openrouter или vibecode, и не передаётся моделям OpenAI, Anthropic и других OpenAI-совместимых провайдеров. Модель, которая читает рассуждение, учитывает его во входных токенах. Применение — вызов функций
Полеmessages[].tool_call_id Типstring Обяз.нет По умолч.— ОписаниеID вызова функции — обязателен в сообщении с role: "tool"
Полеtemperature Типnumber Обяз.нет По умолч.по модели ОписаниеТемпература генерации, диапазон 0..2. Меньше — точнее и детерминированнее, больше — креативнее
Полеmax_tokens Типnumber Обяз.нет По умолч.по модели ОписаниеМаксимум токенов в ответе
Полеtop_p Типnumber Обяз.нет По умолч.— ОписаниеNucleus sampling, диапазон 0..1
Полеreasoning_effort Типstring Обяз.нет По умолч.по модели ОписаниеOpenAI-совместимый уровень рассуждения: none, minimal, low, medium, high, xhigh, max. Нормализуется в ступень платформы — см. «Управление рассуждением»
Полеreasoning Типobject Обяз.нет По умолч.— ОписаниеКанонический объект. effort — уровень из того же словаря. max_tokens — бюджет токенов рассуждения, действует только у моделей с budgetTokens: true. enabled — false выключает рассуждение. exclude — true убирает reasoning_content из ответа, токены рассуждения при этом оплачиваются. Старше, чем reasoning_effort
Полеchat_template_kwargs Типobject Обяз.нет По умолч.— ОписаниеВендорский формат {"thinking": boolean, "reasoning_effort": string}. Принимается для совместимости, разбирается в ту же ступень и в модель сырым не передаётся. Неизвестные ключи внутри игнорируются. Младше двух полей выше
Поле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, требует поддержки моделью
Полеrepetition_guard Типstring Обяз.нет По умолч."off" Описание"off" или "abort". Явный ранний отказ при повторении JSON. Нужны json_object/json_schema, отсутствие объявленных инструментов и модель с поддержкой потока даже при stream: false. Ограничения, риск ложного отказа и пример SDK — JSON-ответ
Полеtools Типarray Обяз.нет По умолч.— ОписаниеОпределения функций, которые модель может вызвать
Полеtool_choice Типstring | object Обяз.нет По умолч.— Описаниеauto (модель решает сама), none (запретить вызовы) или {"type": "function", "function": {"name": "..."}} (форсировать конкретную)

Управление рассуждением

Модели с рассуждением думают перед ответом. Токены рассуждения входят в usage.completion_tokens и тарифицируются как выходные по той же ставке — рычаг цены не тариф, а объём. Вайбкод описывает объём пятью ступенями: none — ответ сразу, low — короткая прикидка, medium — стандартное рассуждение модели, когда оно включено, а уровень не задан, high — сильнее стандартного, max — всё, что модель умеет.

Что умеет конкретная модель, показывает поле reasoning в GET /v1/models. Его map — карта ступеней на родные режимы модели, две ступени с одним родным значением — объявленное схлопывание. default — ступень по умолчанию, budgetTokens — поддержка бюджета токенов рассуждения. У модели с reasoning: null управление недоступно: параметр игнорируется с предупреждением REASONING_NOT_SUPPORTED, и в модель ничего не добавляется.

Нормализация входа: minimal → low, xhigh → max. reasoning.enabled: true или chat_template_kwargs.thinking: true без уровня дают medium. reasoning.max_tokens без effort — medium с бюджетом. Пустой reasoning: {} или chat_template_kwargs: {} — то же, что параметра нет. null в любом из трёх полей равнозначен отсутствию. Пришло несколько полей — берётся старшее: сначала reasoning, затем reasoning_effort, затем chat_template_kwargs. Значение вне словаря, неположительный reasoning.max_tokens или chat_template_kwargs не-объект отклоняются с 400 invalid_request.

Если запрошенной ступени у модели нет, применяется ближайшая ниже из ступеней с рассуждением, а в warnings приходит REASONING_EFFORT_ADJUSTED с полями requested, applied, direction. Ступень none округлением не выбирается никогда — выключить рассуждение можно только явно. Если ниже ничего нет, берётся ближайшая выше. Просьба none у модели, где выключить нельзя, даёт низшую ступень и REASONING_CANNOT_BE_DISABLED. Бюджет у модели без budgetTokens игнорируется с REASONING_BUDGET_NOT_SUPPORTED.

Без параметра в запросе платформа передаёт модели с декларацией ступень default явно. Режим не остаётся на усмотрение провайдера модели, поэтому обновление модели на его стороне не меняет поведение запросов без параметра. Поле reasoning ответа сообщает эту ступень.

В ответе: поле reasoning с requested, applied, native и предупреждения в warnings. В потоковом режиме тело предупреждений не несёт — состояние едет заголовками X-Reasoning-Applied, X-Reasoning-Native, X-Reasoning-Warnings с кодами через запятую. У синхронного ответа те же заголовки дублируют тело. Заголовок отсутствует, когда сообщать нечего. При подмене модели — DISABLED-перенаправлении или переключении на резервную — ступень разрешается по модели, которая выполнила запрос, и поле reasoning с заголовками описывают её. reasoning.exclude исполняется у любой модели, в том числе без декларации.

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

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

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

Кроме того, model принимает идентификатор модели без префикса провайдера: bitrixgpt-5.5 разрешается в bitrix/bitrixgpt-5.5. Короткое имя должно целиком и с учётом регистра совпасть с идентификатором из GET /v1/models, у которого отброшен первый сегмент. Поиска по части идентификатора нет: запрос с bitrixgpt получит 404 ai_model_not_found, а не первую модель, идентификатор которой содержит это слово. Короткое имя, под которое подходят несколько доступных ключу моделей, тоже получает 404 — передайте полный идентификатор. Модель, найденная по короткому имени, отмечается в ответе заголовком X-Model-Resolved с её полным идентификатором.

Примеры

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, TOOL_CALL_MISSING, REASONING_EFFORT_ADJUSTED (несёт requested, applied, direction), REASONING_NOT_SUPPORTED, REASONING_CANNOT_BE_DISABLED, REASONING_BUDGET_NOT_SUPPORTED, TEMPERATURE_OVERRIDDEN_BY_REASONING. Поле отсутствует, когда предупреждений нет
Полеreasoning Типobject ОписаниеПрисутствует у моделей с декларацией рассуждения. requested — нормализованная ступень из запроса, null, если параметра не было. applied — применённая ступень. native — родной режим модели для неё. См. «Управление рассуждением»
Полеusage.prompt_tokens Типnumber ОписаниеТокены входа
Полеusage.completion_tokens Типnumber ОписаниеТокены ответа
Полеusage.total_tokens Типnumber ОписаниеСумма токенов в запросе и ответе

Если запрос с function tools завершился без полезного ответа или вызова, в content может добавиться английское объяснение, а в warnings — { code: "TOOL_CALL_MISSING", message: "..." } с тем же текстом. Если текст уже есть, он сохраняется перед объяснением через пустую строку. HTTP 200, finish_reason: "stop" и usage сохраняются; объяснение не влияет на списание. Оно не добавляется при tool_choice: "none", структурированном ответе или ходе только с рассуждением, завершившемся stop. В потоке это отдельное событие delta.content до финиша, без массива warnings.

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

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 Код Описание
HTTP400 Кодinvalid_request ОписаниеПустой массив messages, неверная роль, нарушение схемы или недопустимый repetition_guard. Несовместимый "abort" возвращает param: "repetition_guard" до резервирования и обращения к модели
HTTP400 Кодinvalid_image_payload ОписаниеНекорректный image_url — сообщение содержит номер элемента content и причину. См. анализ изображений
HTTP400 Кодno_default_model ОписаниеУ портала нет ни одной доступной для вызова модели
HTTP402 Кодai_credentials_not_configured ОписаниеДля модели нет учётных данных провайдера — подключите BYOK
HTTP402 Кодinsufficient_balance ОписаниеНедостаточно средств для платной модели
HTTP402 Кодaccount_frozen ОписаниеВызов заблокирован заморозкой платёжного аккаунта из-за отрицательного баланса. Пополните его; причину блокировки конкретного вызова уточняет сообщение ответа. Вызовы, покрытые тарифной AI-квотой, могут продолжать работать; состав ограничений — заморозка счёта
HTTP402 Кодai_quota_exhausted ОписаниеМесячная AI-квота портала исчерпана. Поле reason уточняет причину
HTTP402 Кодcowork_subscription_inactive ОписаниеУ ключа со скоупом vibe:cowork нет действующей подписки Cowork/Code. Подписку возобновляют в разделе Cowork/Code в кабинете платформы Вайбкод, сам ключ остаётся действительным
HTTP402 Кодcowork_quota_exhausted ОписаниеИсчерпано одно из окон квоты подписки Cowork/Code. Тело несёт window (5h/week/month), resetAt и nextTier, заголовок Retry-After — число секунд до сброса окна
HTTP402 Кодcompany_budget_exhausted ОписаниеИсчерпан месячный бюджет расхода компании, который задаёт администратор портала. Поле scope называет пробитый бюджет: USER — личный бюджет вызывающего, PORTAL — бюджет всего портала. Поле canRequest говорит, можно ли запросить увеличение: у личного бюджета true, у портального false — его поднимает только администратор. Отказ приходит только на вызовах, которые списывают средства с баланса портала. Вызовы внутри тарифной квоты, по подписке Cowork/Code и на собственном ключе продолжают работать
HTTP403 Кодscope_missing ОписаниеAPI-ключу не хватает скоупа vibe:ai. Ключу стороннего приложения из Partner Connect право добавляют не перевыпуском, а запросом на странице согласия — Платформенные права
HTTP403 КодCONNECT_AI_NOT_PERMITTED ОписаниеКлюч стороннего приложения из Partner Connect, а администратор портала не разрешил приложению AI или отозвал разрешение. Приходит, когда на платформе включено разрешение AI администратором портала. Тело — в общем конверте API { success, error: { code, message } }, а не в форме OpenAI
HTTP404 Кодai_model_not_found ОписаниеМодель не найдена или отключена
HTTP404 Кодai_model_not_found ОписаниеКороткое имя модели подходит нескольким доступным моделям. Передайте полный идентификатор
HTTP409 Кодagent_turn_awaiting_confirmation ОписаниеAI-агент ждёт, пока пользователь подтвердит или отменит операцию. До ответа запросы его ключа на этот адрес отклоняются в любом разговоре. Запрос к модели не уходит, списания нет. При stream: true отказ приходит JSON-ответом. Ожидание снимается ответом пользователя или истекает само: срок задаёт агент, не больше 30 минут. Запросы других ключей отказ не затрагивает
HTTP409 Кодagent_turn_loop_detected ОписаниеХод агента зациклился: в messages после последнего сообщения с ролью user накопилось 20 и более ответов с ролью assistant без tool_calls. Считаются все такие ответы, а не только идущие подряд, ответы с tool_calls в счёт не входят. Запрос к модели не уходит, списания нет. При stream: true отказ приходит JSON-ответом, поток событий не открывается. Чтобы продолжить, добавьте в messages новое сообщение с ролью user — счёт начнётся заново
HTTP413 Кодai_payload_too_large ОписаниеТело запроса к модели bitrix/* больше предела кластера моделей, а тело с изображениями — и после их уменьшения. Запрос к модели не отправляется, списания нет. Сообщение называет размер запроса и действующий предел. Тот же код приходит, если по размеру отказал сам кластер моделей или провайдер модели на вашем ключе: тогда в теле есть поле providerStatusCode: 413. Уменьшите изображения — анализ изображений — или сократите историю сообщений
HTTP422 Кодstructured_output_truncated ОписаниеЗапрос с response_format не дал полного JSON: генерация оборвана по finish_reason: "length" без обнаруженного повтора либо поле content пустое при любой причине завершения и без tool_calls. В режиме json_object есть исключение — готовый JSON, попавший в служебный канал reasoning_content, восстанавливается, и ответ остаётся 200. Подробнее — гарантированный JSON-ответ
HTTP422 Кодstructured_output_invalid_json ОписаниеЗапрос с response_format дал непустой ответ, который не разбирается как JSON-объект или массив — текст вокруг объекта, ответ в markdown-ограждении кода, одиночное значение вроде 42. Полей param и suggestedMaxTokens в теле нет: увеличение max_tokens результат не меняет. В режиме json_object действует то же исключение — готовый JSON из служебного канала reasoning_content восстанавливается, и ответ остаётся 200. Подробнее — гарантированный JSON-ответ
HTTP422 Кодreasoning_repetition ОписаниеМодель зациклилась в рассуждении: повторяла одни и те же фразы и не начала ответ. В синхронном ответе приходит на запросах с response_format вместо structured_output_truncated, в потоке — событием перед data: [DONE] на любом запросе. Повторите запрос с reasoning_effort: "none", больший max_tokens не поможет. Подробнее — гарантированный JSON-ответ
HTTP422 Кодreasoning_repetition ОписаниеПо умолчанию (repetition_guard не передан или "off") обнаружен повтор в непустом незавершённом JSON при json_object или json_schema после finish_reason: "length". Проверка терминальная. Это эвристическая диагностика: она может сработать и на законном повторяющемся массиве, которому не хватило бюджета. Проверьте, ожидаемы ли повторы; если да, проверьте лимит токенов, иначе уточните запрос или смените модель. Подсказки отключить рассуждение нет
HTTP422 Кодreasoning_repetition ОписаниеПри явном repetition_guard: "abort" повтор JSON обнаружен до завершения. Синхронно — обычный JSON 422, в потоке — одно событие error и один data: [DONE] при HTTP 200. Отбросьте частичный ответ. Поля retryable/retryAfter и совет отключить рассуждение отсутствуют. Условия и фиксированный текст — JSON-ответ
HTTP429 Кодrate_limit_exceeded ОписаниеПревышен лимит запросов. Заголовок X-RateLimit-Scope указывает уровень — per-key или per-user. Тот же код приходит, когда ограничил сам кластер моделей: тогда в теле есть поле providerStatusCode, а поля scope и заголовка X-RateLimit-Scope нет, пауза берётся из Retry-After
HTTP429 Кодai_congested ОписаниеПул AI-кластера перегружен. Запрос не выполнялся, списания нет, повторите его по заголовку Retry-After. Ответ несёт заголовок X-AI-Admission: shed, а не X-RateLimit-Scope
HTTP429 Кодai_pacing_limited ОписаниеПревышено суточное или недельное окно равномерного расходования квоты. Это не исчерпание квоты — повторите запрос по заголовку Retry-After. Подробнее — «Равномерное расходование»
HTTP429 Кодai_provider_cooldown ОписаниеКластер моделей временно недоступен, и платформа держит паузу, чтобы повторы его не добивали. Запрос не выполнялся, списания нет — повторите его через число секунд из Retry-After. Заголовков X-RateLimit-Scope и X-AI-Admission у этого ответа нет
HTTP429 Кодai_image_resize_busy ОписаниеПлатформа уже уменьшает много изображений одновременно, а тело запроса к модели bitrix/* без уменьшения в предел не помещается. Запрос не выполнялся, списания нет — повторите его через число секунд из Retry-After или уменьшите изображения сами
HTTP400 Кодai_provider_rejected ОписаниеМодель отклонила сам запрос (например неподдерживаемый параметр). Повторять его без изменений бесполезно. Возвращается, когда провайдер ответил 400 или 422
HTTP502 Кодai_provider_unavailable ОписаниеВнешний провайдер ответил ошибкой (401/403/5xx). Исходный статус приходит в поле providerStatusCode всегда, когда провайдер ответил HTTP-статусом, — в том числе когда поток уже открыт, а провайдер отказал на его установке. Поля нет там, где статуса не было: ошибка пришла кадром из тела уже открытого потока (из тела платформа принимает только статус 429, такой кадр идёт кодом rate_limit_exceeded) или сбой случился при обработке ответа провайдера
HTTP502 Кодai_provider_network ОписаниеПлатформа не смогла соединиться с провайдером или соединение оборвалось до ответа. Поля providerStatusCode у этого ответа нет: провайдер не ответил. Повторите запрос
HTTP503 Кодmodel_unavailable ОписаниеМодель отключена, и преемник для неё не назначен. См. жизненный цикл моделей
HTTP503 Код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 в этом ответе — строка. Когда у портала нет оплаченного доступа к AI-моделям, ответ с reason: "wallet_off" дополнительно несёт details.learnMoreUrl — страницу с описанием подписки или тарифа Битрикс24, в которые входит AI, а поле message называет нужный продукт. При других причинах wallet_off поля details.learnMoreUrl нет. Пока расход укладывается в квоту, поведение эндпоинта не меняется. Сверх квоты, если такой расход для портала разрешён, запросы списываются с денежного баланса портала по базовой цене модели из каталога.

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

Лимит размера тела запроса. У моделей bitrix/* предел задаёт кластер моделей, для тела с изображениями он ниже, чем для текста. Действующий предел называет сообщение ответа 413. Изображения data: в теле больше предела платформа уменьшает сама, а тело, которое не уложилось и после этого, получает 413 ai_payload_too_large. У моделей через свой ключ провайдера — 30 MiB, этого хватает на одно изображение до 20 MiB. Как платформа уменьшает изображения — анализ изображений.

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

Завершение хода Cowork/Code у пятичасового лимита. У успешного шага модели по подписке может прийти заголовок X-Cowork-Completion-Mode: landing-finish означает просьбу сервера завершить уже начатый ход перед исчерпанием окна, reserve — шаг допущен из запаса на завершение после исчерпания окна. Вместе с ним приходит X-Cowork-Completion-Reset-At с ISO-временем сброса этого окна. Заголовки приходят и с JSON-ответом, и в начале потока SSE. Отсутствие заголовка не доказывает, что ход завершён; итог определяйте по обычному завершению ответа модели.

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