Для AI-агентов: markdown этой страницы — /docs-content/ai/credentials/models-add.md индекс документации — /llms.txt
Добавить модель вручную
POST /v1/ai/credentials/:id/models
Подключает модель к ключу любого провайдера. Передайте один modelId или пакет modelIds (от 1 до 100 строк). Для ключей всех провайдеров, кроме Custom-провайдера, метаданные берутся в порядке: тело запроса → живой список → умолчания. Если список недоступен, подключение по имени работает. Для одиночного запроса к Custom-провайдеру контракт сохраняется: любая строка длиной до 200 символов, непустая после удаления пробелов по краям, метаданные тела имеют приоритет.
Требуется скоуп vibe:ai. Публичный API работает только с вашим USER-ключом. Чужой, несуществующий или PORTAL-ключ возвращает 404 not_found.
Параметры
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
Параметрid (path) |
Типstring | Обяз.да | ОписаниеID ключа из GET /v1/ai/credentials |
Поля запроса (body)
| Поле | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
ПолеmodelId |
Типstring | Обяз.одиночный | По умолч.— | ОписаниеID модели у провайдера без префикса <slug>/. В ответе префикс добавляется. Используйте возвращённый modelId в model запроса к /v1/chat/completions |
ПолеmodelIds |
Типstring[] | Обяз.пакет | По умолч.— | ОписаниеОт 1 до 100 ID провайдера. Нельзя сочетать с modelId |
Полеname |
Типstring | Обяз.нет | По умолч.значение modelId |
ОписаниеОтображаемое название модели. null использует значение по умолчанию |
ПолеcontextLength |
Типinteger | Обяз.нет | По умолч.4096 |
ОписаниеМаксимальный размер контекста в токенах. Целое число от -2147483648 до 2147483647. null использует значение по умолчанию |
ПолеmaxOutputTokens |
Типinteger | Обяз.нет | По умолч.null |
ОписаниеМаксимум токенов в ответе. Целое число от -2147483648 до 2147483647 или null |
Примеры
curl — личный ключ
curl -X POST https://vibecode.bitrix24.tech/v1/ai/credentials/cred_custom_xyz/models \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"modelId": "abab6.5-chat",
"name": "MiniMax abab6.5-chat",
"contextLength": 32768,
"maxOutputTokens": 8192
}'
curl — OAuth-приложение
curl -X POST https://vibecode.bitrix24.tech/v1/ai/credentials/cred_custom_xyz/models \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"modelId": "abab6.5-chat",
"name": "MiniMax abab6.5-chat",
"contextLength": 32768,
"maxOutputTokens": 8192
}'
JavaScript — личный ключ
const id = 'cred_custom_xyz'
const res = await fetch(`https://vibecode.bitrix24.tech/v1/ai/credentials/${id}/models`, {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
modelId: 'abab6.5-chat',
name: 'MiniMax abab6.5-chat',
contextLength: 32768,
maxOutputTokens: 8192,
}),
})
const { data } = await res.json()
console.log('Зарегистрирована модель с id:', data.id)
JavaScript — OAuth-приложение
const id = 'cred_custom_xyz'
const res = await fetch(`https://vibecode.bitrix24.tech/v1/ai/credentials/${id}/models`, {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
modelId: 'abab6.5-chat',
name: 'MiniMax abab6.5-chat',
contextLength: 32768,
maxOutputTokens: 8192,
}),
})
const { data } = await res.json()
console.log('Зарегистрирована модель с id:', data.id)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | ОписаниеВсегда true при успехе |
Полеdata.id |
Типstring | ОписаниеУникальный ID записи AiModel (нужен для удаления) |
Полеdata.modelId |
Типstring | ОписаниеЗарегистрированный modelId с префиксом провайдера <slug>/, например custom-openai-compat/ |
Полеdata.name |
Типstring | ОписаниеИмя модели |
Полеdata.contextLength |
Типinteger | ОписаниеСохранённый размер контекста |
Полеdata.created[] |
Типarray | ОписаниеТолько пакетный запрос modelIds, ответ 200: подключённые модели, каждая { modelId, rowId } |
Полеdata.skipped[] |
Типarray | ОписаниеТолько пакетный запрос modelIds, ответ 200: пропущенные модели, каждая { modelId, reason }, reason равен already_connected |
Пример ответа
Одиночный запрос modelId, HTTP-статус 201 Created:
{
"success": true,
"data": {
"id": "aimodel_xyz789",
"modelId": "custom-openai-compat/abab6.5-chat",
"name": "MiniMax abab6.5-chat",
"contextLength": 32768
}
}
Пакетный запрос { "modelIds": ["gpt-4o-mini", "gpt-4o"] }, HTTP-статус 200 OK. Модель gpt-4o уже была подключена к ключу:
{
"success": true,
"data": {
"created": [
{ "modelId": "gpt-4o-mini", "rowId": "aimodel_xyz789" }
],
"skipped": [
{ "modelId": "gpt-4o", "reason": "already_connected" }
]
}
}
Пример ответа при ошибке
404 not_found — ключ не найден или принадлежит другому пользователю:
{
"success": false,
"error": {
"code": "not_found",
"message": "Credential not found"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | Кодinvalid_request |
ОписаниеmodelId отсутствует, не является строкой, пуст после trim или исходная строка длиннее 200 символов |
| HTTP400 | Кодinvalid_request |
Описаниеname задан и не является строкой или null. Сообщение указывает поле name |
| HTTP400 | Кодinvalid_request |
ОписаниеcontextLength или maxOutputTokens задан и не является целым числом от -2147483648 до 2147483647 или null. Сообщение указывает неверное поле |
| HTTP400 | Кодinvalid_request |
ОписаниеПереданы одновременно modelId и modelIds |
| HTTP400 | Кодinvalid_request |
ОписаниеmodelIds не массив, пуст или содержит больше 100 ID |
| HTTP400 | Кодinvalid_request |
ОписаниеID для провайдера, кроме Custom-провайдера, содержит символы вне [A-Za-z0-9._:/@-] |
| HTTP400 | Кодno_key |
ОписаниеСохранённый ключ не содержит значения API-ключа |
| HTTP400 | Кодbase_url_redirect |
ОписаниеПровайдер ответил на запрос списка моделей запрещённым перенаправлением |
| HTTP403 | Кодscope_missing |
ОписаниеAPI-ключу не хватает скоупа vibe:ai |
| HTTP404 | Кодnot_found |
ОписаниеКлюч с таким id не найден или не принадлежит вам |
| HTTP409 | Кодkey_models_limit |
ОписаниеНа ключе получилось бы больше 1000 строк. Пакет целиком не записан |
| HTTP409 | Кодalready_exists |
ОписаниеМодель с тем же modelId уже зарегистрирована для этого ключа |
| HTTP429 | Кодmodel_discovery_busy |
ОписаниеДругой запрос списка моделей уже выполняется |
| HTTP429 | Кодmodel_discovery_rate_limit |
ОписаниеДостигнут общий лимит 10 запросов списка моделей в минуту |
| HTTP500 | Кодdecryption_error |
ОписаниеНе удалось расшифровать сохранённый ключ |
Полный список общих ошибок API — Ошибки.
Лимит регистрации моделей: 30 запросов в минуту. Действующее значение — в заголовке x-ratelimit-limit.
Известные особенности
Цена — нулевая. Модели ключа всегда регистрируются с нулевой ценой (inputPrice = 0, outputPrice = 0). Платформа такие записи не тарифицирует — вы платите провайдеру напрямую.
Пакетное подключение. Передайте { "modelIds": ["gpt-4o-mini", "gpt-4o"] } без modelId. Весь пакет проверяется до записи. ID для провайдеров, кроме Custom-провайдера, содержат только [A-Za-z0-9._:/@-], до 200 символов. Один снимок списка используется для всего пакета. Ответ 200: created содержит { modelId, rowId }, skipped — { modelId, reason: "already_connected" }. В пакетном ответе modelId — исходный ID провайдера. Повторы и одновременные запросы на ту же модель попадают в skipped.
На ключе не больше 1000 строк. Превышение возвращает 409 key_models_limit без частичной записи пакета. Одиночный повтор — 409 already_exists, успешный одиночный ответ остаётся 201. Новая строка наследует capabilities и reasoningControl одноимённой модели платформы. При отсутствии такой строки используются возможности из списка провайдера.
Пределы запроса списка моделей. Они общие для available-models, fetch-models и подключения: 20 секунд на все повторы и страницы, до 5 МиБ на ответ до разбора JSON, до 1000 моделей и 10 страниц. Повтор курсора останавливает обход. На один портал одновременно выполняется один такой запрос, частота — 10 в минуту. При неполном списке отсутствующие модели не переводятся в DEPRECATED.