Тема
Язык

Прозрачная маршрутизация и разбивка рейсов

Прозрачный маршрутизатор GetVibe: явно укажите маршрут через :alias или используйте автоматическую маршрутизацию по стратегии ключа. Публичные псевдонимы, отказоустойчивое переключение, заголовки для раскрытия и отладки x-getvibe-route, а также поля route/address_as в истории.

GetVibe — это прозрачный маршрутизатор: вы либо явно выбираете публичный вариант через суффикс :alias, либо оставляете имя модели без суффикса — тогда шлюз выбирает маршрут согласно стратегии вашего аккаунта/ключа и при сбоях переключается на другой доступный вариант. В ответах и истории используются только публичные идентификаторы маршрутов.

Два режима: pin или auto

ПараметрТипОписание
Explicit pinmodel:alias or model:NЗапрос всегда идёт через выбранный вариант. Переключение между вариантами отключено: при 429/5xx ошибка возвращается как есть (повторная попытка на том же варианте разрешена).
Auto (bare model)только название моделиШлюз выбирает вариант в соответствии с настройками аккаунта или ключа. При 429/5xx и пустом 200 он пробует другие варианты той же модели с учётом ограничений по стоимости и входным данным.
"model": "claude-opus-4.8"          // auto — key strategy
"model": "claude-opus-4.8:yellow"   // pin — :yellow only, no switching to other channels
"model": "claude-opus-4.8:2"        // pin — catalog variant #2 (legacy :N syntax)

Границы цены: max_price и min_price

Каждая модель обслуживается несколькими каналами по разным ценам — своего рода лестницей. Эти два параметра тела запроса указывают, какие ступени этой лестницы могут вас обслуживать. Оба выражаются в USD за 1M токенов — та же единица измерения и те же числа, что печатает страница Models. Они сравниваются с нашей ценой — тем, что списывается с вас, — и никогда с оптовым числом, которое вы не видите.

ПараметрТипОписание
max_priceчисло или объектВерхний предел. Число ограничивает ОБЕ части; объект ограничивает их по отдельности: {"input": 0.5, "output": 2}. Пропущенная часть не ограничена. Включительно: предел, равный опубликованной цене, допускает этот канал.
min_priceчисло или объектНижняя граница, той же формы. Отклоняет каналы с ценой НИЖЕ неё — для вызывающих, которые предпочли бы не обслуживаться самой глубокой скидкой в книге. Может только увеличить стоимость запроса, но никогда не уменьшить её.
{
  "model": "deepseek-v4-flash-0731",
  "messages": [{"role": "user", "content": "hi"}],
  "max_price": 0.02,
  "min_price": {"input": 0.001}
}

Обе составляющие должны укладываться в лимит — и вход, и выход, а не их среднее. Канал, дешёвый на входе и дорогой на выходе, не удовлетворяет ограничению по одному числу.

Постоянный потолок, задаётся один раз в кабинете

Потолок не обязательно указывать в каждом вызове. Дашборд хранит один потолок на API-ключ и на модель, плюс значение по умолчанию, которое покрывает все модели, для которых вы не задали его явно, и API читает его при каждом запросе. Запрос, содержащий max_price, использует это значение только для данного вызова; запрос без него использует ваш сохранённый потолок. Приоритет, от самого конкретного:

ПараметрТипОписание
max_price in the requestза вызовЗаменяет сохранённый потолок только для этого запроса — целиком, без объединения по частям.
key + modelstoredПотолок этого API-ключа для данной модели.
account + modelstoredВаш лимит аккаунта для этой модели; используется ключами, которые свой лимит не задают.
key / account defaultstoredОбщий потолок для всех моделей, у которых нет собственного.
Потолок и фильтр каналов — два разных механизма, и они действуют вместе. Порядок каналов и исключения определяют, какие каналы могут вас обслуживать; потолок определяет, какая ступень цены внутри них может закрыть запрос. Задавайте любой из них, оба или ни одного. Один только фильтр каналов не ограничивает вашу цену: один канал может предлагать одну и ту же модель сразу по многим ценам, поэтому исключение каналов никак не ограничивает то, сколько в итоге спишет самый дешёвый из них.

Где посмотреть цены, которые вы ограничиваете

GET /api/catalog публикует массив channels для каждой модели: по одной записи на каждый канал, на который может попасть запрос, от самого дешёвого, с адресом, по которому его можно закрепить, его ценой inputUsd / outputUsd за 1M токенов и признаком того, является ли он каналом по умолчанию. Это те самые числа, с которыми сравниваются max_price и min_price, и те самые числа, по которым с вас списывают средства — один список, а не три.

curl -s https://getvibeapi.com/api/catalog   | jq '.[] | select(.apiModel=="z-ai/glm-5.3") | .channels'

За что вы платите

Вы платите за канал, который фактически обслужил запрос, плюс нашу фиксированную наценку — не за установленный вами потолок и никогда не больше него. Если вы ограничиваете цену, а запрос закрывается на более дешёвой ступени, вы платите по более дешёвой. Лестница на странице модели показывает диапазон, и значение «от» — это самая дешёвая существующая ступень: это реальная цена, которую с вас могут взять, а не обещание, что этот запрос попадёт именно на неё. Указывайте max_price, когда вам нужна гарантированная верхняя граница.

Когда ничего не подходит

Запрос отклонён: HTTP 422 с "type": "price_bound_no_lane", где указаны самая дешёвая и самая дорогая цены канала для этой модели и полный список channels, чтобы вы могли выбрать лимит по числам, а не угадывать его. lowest_passing_usd_per_million — это наименьший лимит, который прямо сейчас допускает канал: собственная пара одного канала, поэтому его отправка проходит (два плеча cheapest могут относиться к разным каналам). То же поле появляется, когда сама биржа отклонила ваш лимит: тогда это следующий ценовой уровень, на котором ещё есть предложение, и он никогда не ниже отправленного вами лимита. Когда лимитом были не вы — им был наш собственный потолок закупки для канала, а предложения под ним оказались заняты или исчерпаны — ответ вместо этого HTTP 503 "type": "no_seller_available" с Retry-After и без предложенной цены: повышение max_price не помогло бы, а повтор чуть позже мог бы. Самая дешёвая ступень часто содержит единственное предложение, которое занято, поэтому для надёжного исполнения устанавливайте лимит на уровне priceTypical модели или выше, где сосредоточена основная часть предложения. Мы никогда не обслуживаем молча более дорогой канал и никогда не подменяем модель другой. Некорректное значение — строка, ноль, отрицательное число, неизвестное поле — это 400 invalid_request_error, и оно никогда не игнорируется молча.

{
  "error": {
    "message": "No channel of model "deepseek-v4-flash-0731" is priced within your max_price $0.0001 in / $0.0001 out...",
    "type": "price_bound_no_lane",
    "code": 422,
    "param": "max_price",
    "cheapest_usd_per_million": {"input": 0.0065, "output": 0.013},
    "dearest_usd_per_million": {"input": 0.0528, "output": 0.1584},
    "lowest_passing_usd_per_million": {"input": 0.0205, "output": 0.0613},
    "channels": [
      {"address": "deepseek/deepseek-v4-flash-0731:codebuddy-cn", "label": "codebuddy-cn", "inputUsd": 0.0205, "outputUsd": 0.0613, "isDefault": true},
      {"address": "deepseek/deepseek-v4-flash-0731:qwencloud", "label": "qwencloud", "inputUsd": 0.0378, "outputUsd": 0.1132, "isDefault": false}
    ]
  }
}
Границы цены действуют и для чистой модели, и для явного закрепления. Если само закрепление выходит за границу, вы получите ту же ошибку 422 с указанием закрепления — закрепление никогда не переносится на другой канал за вас.

Имена пулов, которые можно закрепить

Каналы, обслуживаемые из пула подписки вендора, адресуются по имени. Напишите имя после двоеточия, точно так же, как любой другой псевдоним:

"model": "gpt-6.1-sol:codex"         // pin a subscription pool
"model": "claude-opus-5.5:claude-code"  // pin the Claude Code pool
Адресуемые пулы
ПараметрТипОписание
:codexpoolОбращайтесь к этому пулу по имени. Также принимается: :openai-codex.
:qwencloudpoolОбращайтесь к этому пулу по имени. Также принимается: :alibaba-qwencloud.
:zaipoolОбращайтесь к этому пулу по имени. Также принимается: :z-ai-glm-coding-plan.
:claude-codepoolОбращайтесь к этому пулу по имени.
:antigravitypoolОбращайтесь к этому пулу по имени.
:grokpoolОбращайтесь к этому пулу по имени.
:codebuddypoolОбращайтесь к этому пулу по имени.
:codebuddy-cnpoolОбращайтесь к этому пулу по имени.
:clinepasspoolОбращайтесь к этому пулу по имени.
:command-codepoolОбращайтесь к этому пулу по имени. Также принимается: :commandcode.
:opencodepoolОбращайтесь к этому пулу по имени. Также принимается: :opencode-go.
:mimopoolОбращайтесь к этому пулу по имени.
:kiro-poolpoolОбращайтесь к этому пулу по имени.
:meta-aipoolОбращайтесь к этому пулу по имени.
:minimax-cnpoolОбращайтесь к этому пулу по имени.
:qwencloud-alibaba-cnpoolОбращайтесь к этому пулу по имени.
:marketplacepoolОбращайтесь к этому пулу по имени. Также принимается: :bare-marketplace-alias.
:nouspoolОбращайтесь к этому пулу по имени.
Эти удобочитаемые имена — единственное написание, которое рекламирует данное развёртывание. Более старая короткая буквенная форма всё ещё разрешается в течение переходного периода и объявляется в каждом ответе (x-pv-deprecated-alias / x-pv-use-instead), но здесь она никогда не показывается, и новые интеграции должны использовать имя. Каждый пул — это один канал со своей ценовой лестницей; старая форма диапазона, оканчивающаяся цифрой (:claude-code-2), всё ещё разрешается в этот пул.

Публичные алиасы (:alias)

Суффикс после двоеточия — это публичный идентификатор маршрута, а не имя апстрима. Полный список для конкретной модели есть в каталоге (Models, столбец «In API»). Основные alias:

ПараметрТипОписание
:yellowaliasПубличный вариант, доступный для многих моделей; его цена указана в каталоге.
:codex / :claude-code / …aliasПулы подписок, перечисленные по именам выше в разделе «Имена пулов, которые можно закрепить».
:pixel / :flowaliasМедиамаршруты (изображения/видео), не чат.
Подробнее о вариантах одной модели — в разделе Модели → Провайдеры. Если суффикс недоступен для модели, запрос возвращает 400.

Настройки ключа

Для запросов auto (модель без суффикса) для каждого API-ключа задаются следующие настройки (панель управления → API-ключи):

ПараметрТипОписание
routingStrategystringpriority (по умолчанию) — порядок providerPriority, иначе первый вариант в каталоге; price — самый дешёвый для нас вариант; latency — самый быстрый по последним замерам; default — строго первый подходящий вариант.
providerPrioritylistПриоритет внутренних тегов провайдеров (человекочитаемые названия в панели управления). Используется с strategy=priority.
disabledProviderslistИсключите провайдеров из автоматической маршрутизации. Явно указанный :alias по-прежнему можно вызвать, если такой вариант существует.
cacheOnlybooleanТолько варианты с поддержкой кеша промпта — подходят для повторяющегося префикса.
Настройки применяются только к запросам без явно указанного суффикса. Пустое поле в настройках ключа означает значение по умолчанию. См. также allowedModels и ограничения в таблице ниже.

Стратегия маршрутизации

ПараметрТипОписание
priority (default)strategyОбычный маршрут по умолчанию.
pricestrategyВыберите вариант с наименьшей ценой среди доступных для этой модели.
latencystrategyВыберите самый быстрый вариант по последним измерениям.
cacheOnlybooleanТолько варианты с поддержкой кеша — подходят для повторяющегося префикса промпта.
Стратегия применяется только к запросам по умолчанию. Если вы явно задаёте вариант с помощью суффикса (например, :yellow), он всегда учитывается и маршрутизация его не переопределяет. Настраивается отдельно для каждого ключа в панели управления → API-ключи.

Явный выбор провайдера

Добавьте псевдоним поставщика после двоеточия — он учитывается независимо от стратегии маршрутизации. Полный список псевдонимов и примеры — в разделе Models → Providers.

"model": "claude-opus-4.8"        // auto — key strategy
"model": "claude-opus-4.8:yellow"     // explicitly pin the :yellow channel
"model": "claude-opus-4.8:kiro-pool"  // explicitly pin the :kiro-pool channel

Лимиты ключей

Для каждого API-ключа вы можете задать в дашборде:

ПараметрТипОписание
allowedModelsсписок моделейБелый список моделей, которые может вызывать этот ключ. Пусто — разрешены все. Запрос модели вне списка получит 403.
routingStrategy / cacheOnlyoverrideСтратегия и фильтр кеша для этого ключа.
limitRubлимит расходовЛимит расходов для ключа.
allowedIpsБелый список IPОграничение по IP (см. раздел «Аутентификация»).
Это удобно для передачи ключей командам и интеграциям: один ключ — только дешёвые модели, другой — с лимитом расходов, третий — со своей стратегией. Всё настраивается в панели управления.

Failover (только auto)

С bare model шлюз может переключиться на другой публичный вариант той же модели, если текущий вернул 429, 5xx или пустой 200 без содержимого. Ограничения:

  • Запросы с изображениями/PDF не переключаются на другого провайдера (совместимость с vision).
  • Failover не переходит на существенно более дорогой вариант (кроме strategy=price).
  • Существует верхняя граница числа попыток на один клиентский запрос.
  • С pin (:alias) межпровайдерное переключение при сбое отключено — вы получите ошибку выбранного маршрута.

Повторные попытки с экспоненциальным backoff при 429 описаны в разделе Errors and limits.

Разбивка рейса — какой маршрут обслужил запрос

Для доверенных клиентов reveal/debug после завершения запроса (включая auto) доступны заголовки, показывающие, какой вариант public фактически выполнялся. Обычным клиентам эти данные не предоставляются.

Заголовки ответа для доверенных клиентов reveal/debug (chat / messages / responses)

ПараметрТипОписание
x-getvibe-routestringПубличный псевдоним маршрута: yellow, codex, claude-code, …
x-getvibe-modelstringЗначение model для повторного закрепления: base или base:alias (например, gpt-6.1-sol:yellow). При явном закреплении оно соответствует вашему выбору.
x-pv-generation-idstringid записи истории (без стриминга). См. «Баланс и история».
curl -sD - https://getvibeapi.com/v1/chat/completions \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-6.1-sol","messages":[{"role":"user","content":"ping"}],"max_tokens":8}' \
  -o /dev/null | grep -i getvibe

# x-getvibe-route: yellow
# x-getvibe-model: gpt-6.1-sol:yellow

История использования

В GET /v1/generations, GET /v1/usage и панели управления каждая запись содержит поля:

ПараметрТипОписание
modelstringБазовое имя модели (без внутренних суффиксов).
routestring | nullПубличный :alias выигравшего маршрута.
address_asstringТочное значение для поля model при повторном закреплении (аналогично addressAs в каталоге).
cost_detailobjectКак была рассчитана стоимость: строки по токенам с их ставкой за 1M (lines), надбавки (adjustments) и итог. Канал маркетплейса тарифицирует по ценовому уровню (ступени лестницы), продавец которого выполнил запрос, поэтому, когда он отличается от каталожной ставки, rateBasis равен "tier", строки показываются по ставке этой ступени и в сумме дают стоимость, а в tier указано название ставки. realisedRate {input, output} — это цена за 1M, по которой запрос был фактически протарифицирован; найдите её в ценовой лестнице модели (/api/model-ladder), чтобы увидеть, какая ступень его выполнила; minimumCharge равно true (а realisedRate — null), если вместо этого запрос был протарифицирован по минимальной стоимости за запрос. Передайте max_price, чтобы ограничить ступень сверху.
В теле ответа OpenAI-совместимых эндпоинтов апстрим-брендов внутренние суффиксы в model и cost_usd остаются скрытыми (кроме клиентов с исключением на раскрытие). Разбивка по провайдерам есть только в заголовках и истории, без поломки SDK.

Ограничения

GetVibe не предоставляет «сырой» каскадный список вышестоящих провайдеров в теле запроса. Управление осуществляется через публичный :alias, стратегию ключа и автоматическое переключение при сбоях в рамках каталога моделей. Отдельного API «игнорировать провайдеров» или флагов маршрутизации ZDR нет.

Маршрутизация в GetVibe — :alias, авто-маршрут, переключение при сбоях, разбор полёта | GetVibe API