Перейти к содержимому

Маршрутизация моделей

Когда Codex запрашивает модель, router.ts разрешает её ровно в одного настроенного провайдера. Правила проверяются по порядку; побеждает первое совпадение.

Для OpenAI настроенный id <selector>/gpt-* через codexAccountNamespaces сопоставляется ровно с одним сохранённым аккаунтом Codex до проверки пространств имён combo или провайдеров. Id gpt-* без префикса вместо этого выбирают канонический провайдер openai. Его codexAccountMode определяет Pool (по умолчанию; основной плюс добавленные аккаунты) или Direct (bearer текущего вызывающего/основного аккаунта), не меняя id модели. openai-apikey/<model> явно выбирает транспорт по API-ключу. Эти маршруты учётных данных не откатываются друг на друга.

  1. Точный селектор аккаунта Codex — если id имеет вид <selector>/<native-openai-model>, а селектор настроен в codexAccountNamespaces, запрос использует только сопоставленный сохранённый аккаунт и отправляет upstream голый id нативной модели. Если точный целевой аккаунт недоступен, запрос завершается с отказом (fail closed), не переходя к Pool, Direct или маршрутизации провайдера.

    side/gpt-5.6-sol → provider "openai", model "gpt-5.6-sol", account selector "side"
  2. Id или алиас combo — пока настроен хотя бы один combo, канонический combo/<id> или настроенный алиас combo выбирает конкретную цель до проверки пространств имён провайдеров. Если combo не настроены, legacy physical provider с буквальным именем combo остаётся обычным пространством имён провайдера. Выбор целей и поведение failover описаны в разделе Combo.

  3. Явный provider/model — если id содержит / и часть до него совпадает с именем настроенного провайдера, используется этот провайдер, а id усекается до части после косой черты.

    anthropic/claude-opus-5 → provider "anthropic", model "claude-opus-5"
    ollama-cloud/glm-5.2 → provider "ollama-cloud", model "glm-5.2"
    openrouter/openai/gpt-5.6-sol → provider "openrouter", model "openai/gpt-5.6-sol"

    Это явная форма маршрутизируемого провайдера, и именно её селектор модели Codex использует для маршрутизируемых моделей. Если тот же публичный id настроен как алиас combo, первым срабатывает правило 2. Если указанный провайдер отключён, эта явная форма выбрасывает ошибку вместо маршрутизации.

  4. Голый id нативного семейства OpenAI — id вида gpt-*, o1-*, o3-* или o4-* использует канонический включённый провайдер openai и его настроенный режим Pool или Direct.

  5. defaultModel провайдера — если defaultModel какого-либо провайдера равен id, используется этот провайдер (id передаётся без изменений).

  6. Встроенные шаблоны префиксов — id сопоставляется с известными префиксами семейств моделей и направляется настроенному провайдеру с таким именем (или префиксом имени):

    Префиксы Провайдер
    claude-, claude-sonnet-, claude-opus-, claude-haiku- anthropic
    llama-, mixtral-, gemma- groq

    Этот сопоставитель работает только по имени и, в отличие от проверок defaultModel / models[], в настоящее время не отфильтровывает совпавшего провайдера, у которого флаг disabled равен true.

  7. models[] провайдера — если ни одно правило префикса не сработало, а активный провайдер перечисляет id в своём models[], используется этот провайдер. По правилу 4 id gpt-* без префикса отправляется каноническому включённому провайдеру openai до того, как сможет сработать заявка через models[] другого провайдера.

  8. Провайдер по умолчанию — если ничего не совпало, id отправляется в config.defaultProvider без изменений. (Если провайдер по умолчанию не настроен или отключён, маршрутизация выбрасывает ошибку.)

Какой бы маршрут ни был выбран, apiKey провайдера разрешается через resolveEnvValue(): значение ${OPENAI_API_KEY} или $OPENAI_API_KEY разворачивается из окружения в момент запроса, поэтому секретам вовсе не обязательно храниться в config.json.

Маршрутизация и видимость каталога — независимые механизмы:

  • disabledModels скрывает маршрутизируемые id с пространством имён из каталога Codex и /v1/models; нативный GPT-слаг без префикса остаётся в каталоге с visibility: "hide". Прямой запрос к такой модели при этом не отклоняется.
  • Непустой selectedModels провайдера — ещё один список разрешённых для каталога. Живое обнаружение и прямая маршрутизация продолжают работать; сужается только вывод в каталог и /v1/models.
  • provider.disabled: true убирает провайдера из обнаружения каталога. Явные запросы provider/model завершаются ошибкой, а проверки defaultModel / models[] его пропускают.
  • providerContextCaps задаёт видимые для Codex лимиты контекста по провайдерам. contextCapValue — значение по умолчанию для дашборда (350 000); само по себе оно не применяет ограничение, пока провайдер не указан в providerContextCaps. Изменение значения в дашборде обновляет только активные лимиты и только при включённом переключателе «применить ко всем маршрутизируемым провайдерам»; иначе каждый провайдер сохраняет свой лимит. Обычные известные окна можно только уменьшать; нативные модели с поддержкой длинного контекста могут расширять окно до собственного поддерживаемого предела. Фактический предел вышестоящей модели не меняется. При отключении лимита выбор сохраняется в providerContextCapValues, в том числе после перезагрузки. Повторное включение восстанавливает выбор. Сохранённое значение не ограничивает окно, пока лимит отключён. { "setAll": true } без value включает лимиты всех настроенных провайдеров с текущим глобальным значением и заменяет их сохранённые значения.
{
"contextCapValue": 350000,
"providerContextCaps": {
"anthropic": 350000,
"cursor": 350000
}
}
  • Чтобы явно выбрать аккаунт Codex, используйте <selector>/<native-openai-model> (правило 1). Этот маршрут точный и fail closed: он никогда незаметно не переключается на другой аккаунт.
  • Для маршрутизируемых моделей указывайте маршрут явно. Если точный публичный id не является алиасом combo, предпочитайте provider/model (правило 3). Эта форма прямо называет провайдера и совпадает с тем, что Codex показывает в селекторе после синхронизации каталога.
  • Заполните models[] или defaultModel у провайдера, чтобы короткие id (правила 5/7) разрешались без префикса provider/.
  • Шаблоны префиксов — это удобство, а не гарантия: они срабатывают, только если провайдер с таким именем (например, anthropic или groq) действительно настроен.

Поля провайдера, которые читают эти правила, описаны в разделе Конфигурация.