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

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

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

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

  1. Явный 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 использует для маршрутизируемых моделей. Если указанный провайдер отключён, эта явная форма выбрасывает ошибку вместо маршрутизации.

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

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

    Префиксы Провайдер
    claude-, claude-sonnet-, claude-opus-, claude-haiku- anthropic
    gpt-, o1-, o3-, o4- id без префикса используют настроенный режим аккаунта openai; для транспорта по API-ключу используйте openai-apikey/
    llama-, mixtral-, gemma- groq

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

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

  5. Провайдер по умолчанию — если ничего не совпало, 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. Лимиты только понижают известное контекстное окно; они никогда не повышают его и не меняют фактический предел вышестоящей модели.
{
"contextCapValue": 350000,
"providerContextCaps": {
"anthropic": 350000,
"cursor": 350000
}
}
  • Для маршрутизируемых моделей указывайте маршрут явно. Предпочитайте provider/model (правило 1) — эта форма однозначна и совпадает с тем, что Codex показывает в селекторе после синхронизации каталога.
  • Заполните models[] или defaultModel у провайдера, чтобы короткие id (правила 2/4) разрешались без префикса provider/.
  • Шаблоны префиксов — это удобство, а не гарантия: они срабатывают, только если провайдер с таким именем (например, anthropic, openai, groq) действительно настроен.

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