Авто-роутинг и пресеты
Если канал в запросе не выбран, его выбирает Авто-роутинг: пробует каналы модели по порядку пресета роутинга, при отказе — следующий, пока один не ответит или каналы не кончатся.
Пресеты
Пресет — поле routing запроса или настройка аккаунта. cheap «Дешевле» — самый дешёвый
канал, даже если он медленнее; скорость решает только при равной цене. balanced «Баланс»
(по умолчанию) — заметно быстрее за небольшую доплату. fast «Быстрее» — самый быстрый
канал; при близкой скорости — дешевле.
Скорость — медиана последних успешных запросов канала за сутки, а если их меньше трёх —
типичная за 7 дней (у чата — время ответа: до первого токена плюс типичная длина ответа
модели); канал без замеров первым ради скорости не ставится. «Баланс» и «Быстрее»
сравнивают каналы по времени до результата с учётом медленных ответов и сбоев: канал,
который чаще отвечает медленно или не отвечает, проигрывает каналу, который отвечает
ровно. Первый канал пресета не меняется из-за разницы меньше 10 %. Канал с частыми
сбоями первым не ставится, пока есть другие. Около 2 % запросов идут первым на
следующий канал, если он дороже первого не больше чем на 15 %: так его скорость остаётся
известной; цена такого запроса — цена канала, который его выполнил. Запасные каналы:
«Дешевле» — по цене, «Баланс» — тем же компромиссом среди оставшихся (без него — по цене),
«Быстрее» — по времени до результата; канал с частыми сбоями — в конце. Нет заметно более быстрого
канала за небольшую доплату — «Баланс» идёт как «Дешевле». Любой
пресет принимается для любой модели; при одном канале порядок у всех пресетов один.
Значение не из списка — 400 invalid_request с
{"path": "routing", "reason": "unsupported_value", "allowed": ["cheap", "balanced", "fast"]}.
{"model": "nano-banana-pro", "prompt": "кот-космонавт на Луне", "routing": "fast"}Цена и время пресета
pricing.presets карточки — для параметров по умолчанию, pricing.options[].presets — для
каждого сочетания параметров: одна–три опции, у опции routing — список пресетов. Цена опции — цена
первого канала пресета для этих параметров (у видео — за все billed_seconds),
typical_seconds — его типичное время (до 10 с — до секунды, 10–60 с — до 5 с, дольше —
до 10 с); у чата — ставки за 1M токенов без времени.
Потолок цены — 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 — каким каналом
он выполнен. Выбрать канал вручную — Каналы.