
## Добавить модель вручную

`POST /v1/ai/credentials/:id/models`

Регистрирует одну модель, привязанную к Custom-ключу. Используется для провайдеров, которые не отдают каталог через `GET /v1/models` (Minimax, корпоративный `vLLM`/`Ollama`, Cohere). Эндпоинт работает только с провайдером `custom-openai-compat`.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|----------|
| `id` (path) | string | да | ID Custom-ключа из [`GET /v1/ai/credentials`](./list.md) |

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

| Поле | Тип | Обяз. | По умолч. | Описание |
|------|-----|:-----:|-----------|----------|
| `modelId` | string | да | — | ID модели у провайдера. Будет использоваться в `model` запроса к [`/v1/chat/completions`](/docs/ai/chat/completions) |
| `name` | string | нет | значение `modelId` | Отображаемое название модели |
| `contextLength` | number | нет | `8192` | Максимальный размер контекста в токенах |
| `maxOutputTokens` | number | нет | `4096` | Максимум токенов в ответе |

## Примеры

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

```bash
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-приложение

```bash
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 — личный ключ

```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-приложение

```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_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ modelId: 'abab6.5-chat' }),
})

const { data } = await res.json()
console.log('Готово:', data.modelId)
```

## Поля ответа

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data.id` | string | Уникальный ID записи `AiModel` (нужен для [удаления](./models-delete.md)) |
| `data.modelId` | string | Зарегистрированный `modelId` |
| `data.name` | string | Имя модели |
| `data.contextLength` | number | Сохранённый размер контекста |

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

HTTP-статус `201 Created`:

```json
{
  "success": true,
  "data": {
    "id": "aimodel_xyz789",
    "modelId": "abab6.5-chat",
    "name": "MiniMax abab6.5-chat",
    "contextLength": 32768
  }
}
```

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

`400 not_custom_provider` — ключ не относится к Custom-провайдеру:

```json
{
  "success": false,
  "error": {
    "code": "not_custom_provider",
    "message": "Manual model registration is only available for custom-openai-compat provider"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `invalid_request` | Поле `modelId` не передано или нарушена схема |
| 400 | `not_custom_provider` | Эндпоинт работает только с провайдером `custom-openai-compat` |
| 404 | `not_found` | Ключ с таким `id` не найден или не принадлежит вам |
| 403 | `scope_missing` | API-ключу не хватает скоупа `vibe:ai` |

Полный список общих ошибок API — [Ошибки](/docs/errors).

Лимит регистрации моделей: 30 запросов в минуту.

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

**Идемпотентно.** Повторный вызов с тем же `modelId` обновит существующую запись (поля `name`, `contextLength`, `maxOutputTokens`) вместо создания дубликата.

**`modelId` совпадает с провайдерским.** Передавайте именно тот идентификатор, который провайдер ожидает в `model` запроса. Например, для Minimax — `abab6.5-chat`, для корпоративного `vLLM` — то имя, под которым модель загружена.

**Цена — нулевая.** Модели Custom-провайдера всегда регистрируются с нулевой ценой (`inputPrice = 0`, `outputPrice = 0`). Платформенный биллинг такие записи пропускает — вы платите провайдеру напрямую.

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

- [Загрузить каталог моделей](./fetch-models.md)
- [Список моделей ключа](./models-list.md)
- [Удалить модель ключа](./models-delete.md)
- [Создать чат-комплишен](/docs/ai/chat/completions)
