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

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

Пресеты

Пресет — поле 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 токенов без времени.

Потолок цены — 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 — каким каналом он выполнен. Выбрать канал вручную — Каналы.