Содержание

Адресация моделей

Клиент кладёт имя модели в поле 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/* не реализованы. См. Форматы и операции.