Адресация моделей
Клиент кладёт имя модели в поле model. Гейт превращает его в пару «провайдер +
имя, понятное провайдеру».
Два способа адресовать¶
provider/model — явный выбор. Префикс срезается, если совпадает с именем
настроенного провайдера.
Голое имя — по таблице маршрутов провайдера (см. Провайдеры).
Если провайдер зарегистрирован ровно один, голое имя уходит к нему без всякой таблицы.
Слэш в имени модели — не всегда префикс¶
meta-llama/Llama-3-8B, Qwen/Qwen3-Coder, Xiaomi/MiMo-V2.5 — обычные имена
моделей на vLLM, у них слэш свой. Поэтому префикс срезается только если он
совпадает с именем настроенного провайдера; нераспознанный префикс остаётся
частью имени модели.
Это различие несёт вес. Если бы префикс срезался всегда, meta-llama/Llama-3-8B
уехал бы наверх как Llama-3-8B и получил 404.
Регистр не важен¶
Ни в имени провайдера, ни в имени модели. Qwen/Qwen3-Coder и
qwen/qwen3-coder попадают в один маршрут.
Провайдеру уходит то написание, которое задано в панели — сам он может быть к регистру чувствителен. То есть регистр прощается на входе и нормализуется к вашему написанию на выходе.
По тому же принципу сравниваются:
- цены — иначе запрос с заглавной буквой доехал бы, но стал бы бесплатным;
- ограничения ключа по моделям и провайдерам — правило, переставшее применяться из-за заглавной буквы, это правило, на которое нельзя положиться.
Что попадает в журнал¶
Два имени, и они не взаимозаменяемы:
| Колонка | Что в ней |
|---|---|
requested_model |
как адресовал клиент — с префиксом, если id взят из /v1/models |
resolved_model |
что ушло провайдеру, уже без префикса |
Цена считается по второму, поэтому тариф задаётся на голое имя. Страница цен сравнивает «модели в трафике без цены» тоже со вторым — иначе каждый вызов с префиксом выглядел бы неоплаченным, будучи оплаченным.
Оба имени записываются на входе, до маршрутизации. Раньше requested_model
вычитывался из сохранённой копии тела — и у запроса, тело которого не влезло в
предел логирования, колонка молча подменялась маршрутизированным именем. Длинные
диалоги теряли префикс, короткие нет; счёт от этого не менялся, но журнал врал.
/v1/models¶
Гейт отдаёт не весь каталог апстрима, а то, что этим ключом реально доступно. Из списка выпадает модель, которую:
- не обслуживает ни один включённый ключ провайдера;
- не разрешает ключ клиента.
Причина простая: клиенты выбирают, что отправить, из этого списка. Оставленная в нём модель, которая ответит 403, — ловушка, которую вызывающему не видно.
Перечисление каталога при этом не считается обращением к модели: запрос
приходит без имени модели, поэтому ограничение по моделям к нему не применяется —
только по провайдеру. Иначе ключ, ограниченный двумя моделями, не мог бы даже
посмотреть каталог, а отказ читался бы как «нельзя использовать openai/».
Идентификаторы в ответе снабжены префиксом провайдера, чтобы один список
адресовал любой апстрим и чтобы маршрутизатор мог разобрать их обратно. Для
модели, у которой слэш свой, это даёт provider/vendor/model — вид неказистый,
зато однозначный: срезав известный префикс, остаток читается буквально. Без
префикса Xiaomi/MiMo-V2.5 было бы не отличить от «провайдер Xiaomi, модель
MiMo-V2.5», и при незаданном маршруте гейт съел бы имя вендора.
Регистр моделей Ollama¶
Клиенты Ollama перед запросом спрашивают POST /api/show про возможности
модели. Гейт отвечает заглушкой: в журнал она не пишется и авторизации не
требует — отвечать там нечем и списывать не с кого. Остальные /api/* не
реализованы. См. Форматы и операции.