# Авто-роутинг и пресеты

Если канал в запросе не выбран, его выбирает **Авто-роутинг**: пробует каналы модели по
порядку **пресета роутинга**, при отказе — следующий, пока один не ответит или каналы не
кончатся.

## Пресеты

Пресет — поле `routing` запроса или настройка аккаунта. `cheap` «Дешевле» — самый дешёвый
канал, даже если он медленнее; скорость решает только при равной цене. `balanced` «Баланс»
(по умолчанию) — заметно быстрее за небольшую доплату. `fast` «Быстрее» — самый быстрый
канал; при близкой скорости — дешевле.

Скорость — медиана последних успешных запросов канала за сутки, а если их меньше трёх —
типичная за 7 дней (у чата — время ответа: до первого токена плюс типичная длина ответа
модели); канал без замеров первым ради скорости не ставится. «Баланс» и «Быстрее»
сравнивают каналы по времени до результата с учётом медленных ответов и сбоев: канал,
который чаще отвечает медленно или не отвечает, проигрывает каналу, который отвечает
ровно. Первый канал пресета не меняется из-за разницы меньше 10 %. Канал с частыми
сбоями первым не ставится, пока есть другие. Около 2 % запросов идут первым на
следующий канал, если он дороже первого не больше чем на 15 %: так его скорость остаётся
известной; цена такого запроса — цена канала, который его выполнил. Запасные каналы:
«Дешевле» — по цене, «Баланс» — тем же компромиссом среди оставшихся (без него — по цене),
«Быстрее» — по времени до результата; канал с частыми сбоями — в конце. Нет заметно более быстрого
канала за небольшую доплату — «Баланс» идёт как «Дешевле». Любой
пресет принимается для любой модели; при одном канале порядок у всех пресетов один.
Значение не из списка — `400 invalid_request` с
`{"path": "routing", "reason": "unsupported_value", "allowed": ["cheap", "balanced", "fast"]}`.

```json
{"model": "nano-banana-pro", "prompt": "кот-космонавт на Луне", "routing": "fast"}
```

## Цена и время пресета

`pricing.presets` карточки — для параметров по умолчанию, `pricing.options[].presets` — для
каждого сочетания параметров: одна–три опции, у опции `routing` — список пресетов. Цена опции — цена
первого канала пресета для этих параметров (у видео — за все `billed_seconds`),
`typical_seconds` — его типичное время (до 10 с — до секунды, 10–60 с — до 5 с, дольше —
до 10 с); у чата — ставки за 1M токенов без времени.

> [!IMPORTANT]
> Следующий канал может стоить дороже: **итог может превысить цену пресета**. Предел задаёт
> потолок цены.

## Потолок цены — `max_price_multiplier`

`1.5`, `2`, `3`, `5` или `10`; `null` — без потолка (по умолчанию). Каналы дороже цены
пресета больше чем во столько раз не пробуются; первый канал пробуется всегда. Не ответили
все каналы под потолком — задача проваливается с деталью
`{"path": "max_price_multiplier", "reason": "price_cap"}`: поднимите или уберите потолок. Значение не из списка (в том числе строка `"2"`) —
`400 invalid_request` с допустимыми в `allowed`; в multipart-форме транскрибации поле —
текст (`2`, `null`).

## Настройка аккаунта и запрос

Пресет, потолок и `routing_options` аккаунта задаются в кабинете (раздел «Роутинг и
вебхуки») или `PATCH /v1/settings` ключом управления. Настройки аккаунта сервер применяет
сам; поля запроса главнее: `"max_price_multiplier": null` — без потолка на этот вызов,
`"routing_options": {}` — без каналов из настроек.

## Когда запрос переходит к следующему каналу

Только после отказа, при котором канал точно не выполнил запрос, — в том числе когда запрос
не уложился в пределы одного канала (размер тела, длина контекста): `400` с деталью
`messages` `too_long` приходит, только если контекст не принял ни один канал. Канал, который
уже отказал телу такого размера, не пробуется снова; если так отказали все каналы модели,
`400` с деталью `messages` `too_large` и наибольшим принимаемым размером приходит сразу, а
до этого отказ всех каналов по размеру тела — `503 model_unavailable`. Исход неизвестен (нет ответа вовремя,
обрыв) — `502 generation_failed` без списания. Исключения: чат до первого токена — один
переход на следующий канал; задача, чья отправка оборвалась на нашей стороне, — следующий
канал. Оплачивается только полученный ответ.

Задачу (картинка, видео, музыка), которая у канала идёт заметно дольше обычного для него,
один раз получает и следующий канал, а первый продолжает работу: результат отдаёт тот, кто
успел раньше, списывается одна цена — его канала, `attempt_count` — `2`. С
`allow_fallbacks: false` второй канал не подключается.

Чат ждёт первого токена от канала недолго, если есть следующий, и до 90 секунд — от
последнего. После первого токена поток может молчать между чанками не дольше 60 секунд (у
моделей, которые долго думают молча, — до 90). Не уложился — `upstream_timeout` без
списания; поток в этом случае обрывается без `[DONE]`.

В задаче и истории — `routing` (пресет, под которым шёл запрос), в задаче ещё
`max_price_multiplier` и `routing_options` — потолок и настройки каналов, с которыми она
принята (`null` — их нет), `attempt_count` —
сколько раз запрос отправлялся каналам (`1` — с первого раза), и `channel` — каким каналом
он выполнен. Выбрать канал вручную — [Каналы](https://souz.ai/docs/channels.md).

---

Оглавление документации: https://souz.ai/llms.txt. Всё руководство одним файлом: https://souz.ai/llms-full.txt. Справочник методов: https://souz.ai/docs/api-reference.md.
