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

Селектор моделей Codex App

opencodex не патчит Codex App. Он записывает ту же конфигурацию Codex и тот же каталог моделей, которыми пользуются Codex CLI/TUI. App-server читает это общее состояние, но некоторые версии Codex Desktop применяют в renderer дополнительный remote allowlist и могут удалить routed-строки из picker’а. Явная combo с nativeAlias: true — режим совместимости для этой upstream-ошибки.

Записи OpenAI используют два credential-транспорта: нативный вход Codex и namespaced-транспорт API-ключа openai-apikey/<model>. Само по себе переключение codexAccountMode между Pool и Direct не меняет id в picker’е. Однако если codexAccountPickerEnabled включает строки picker’а с указанием аккаунта и в codexAccountNamespaces есть подходящие селекторы, opencodex добавляет для сопоставленных аккаунтов отдельные строки <selector>/<native-openai-model> и скрывает bare native-строки из picker’а. Имена селекторов — это публичные метки, которые выбирает пользователь; встроенного смысла роли аккаунта у них нет. Выбор строки с селектором использует только сопоставленный аккаунт, не меняет активный аккаунт Pool и при недоступности цели завершается ошибкой без переключения на другой аккаунт. Подробнее см. в разделе Точные селекторы аккаунтов Codex.

Если map codexAccountNamespaces пуста, строки picker’а с указанием аккаунта выключены. Если при непустой map поле codexAccountPickerEnabled не задано, они считаются включёнными для обратной совместимости. Значение false скрывает созданные account-qualified строки и возвращает bare native-строки в picker, не удаляя сопоставления и не отключая точную маршрутизацию <selector>/<native-openai-model>.

У строк API GPT-5.6 — контекст 922,000 и максимум входа 922,000; id picker’а вида *-pro разрешаются в базовую wire-модель с reasoning.mode: "pro", а логи, usage и picker state сохраняют виртуальный id. Каталог API жёстко ограничен ровно восемью id: gpt-5.5, gpt-5.6, Sol/Terra/Luna и тремя виртуальными Pro-id; обобщённого alias gpt-5.6-pro не существует. Compact-запросы сохраняют выбранный tier, но отправляют базовую модель без объекта reasoning.

Выбирайте credential-маршрут по id в picker’е. Pool/Direct переключается на странице Providers; <selector> ниже — выбранная пользователем публичная метка, сопоставленная через codexAccountNamespaces:

gpt-5.6-sol # bare-маршрут входа Codex через Pool или Direct
<selector>/gpt-5.6-sol # сохранённый аккаунт Codex, сопоставленный с этим селектором
openai-apikey/gpt-5.6-sol # API key

Свежие установки и конфигурации без сохранённого режима по умолчанию используют Pool. Текущие конфигурации помечены marker 2 и сохраняют исходник shipped v1 в ~/.opencodex/config.json.pre-openai-tiers-v2.bak; вернуть его можно так:

Terminal window
cp ~/.opencodex/config.json.pre-openai-tiers-v2.bak ~/.opencodex/config.json

Более ранние трёхпровайдерные конфигурации v1 автоматически мигрируют в одну строку с переключаемым режимом.

ocx init, ocx start и ocx sync подключают общий конфиг и каталог Codex к прокси; подробности о внедрении конфигурации, синхронизации каталога, shim’ах, fallback с WebSocket и механике восстановления см. в Интеграции с Codex.

Почему появляются маршрутизируемые модели

Заголовок раздела «Почему появляются маршрутизируемые модели»

Picker моделей Codex ожидает записи каталога в формате Codex. opencodex строит маршрутизируемые записи, клонируя шаблон нативной модели Codex и затем заменяя идентичность на routed-модель:

slug = "anthropic/claude-sonnet-..."
display_name = "anthropic/claude-sonnet-..."
visibility = "list"

Клон сохраняет поля, нужные строгому парсеру: reasoning level’ы, тип shell, флаги поддержки API и базовые инструкции. После этого opencodex убирает нативные возможности, которые данный маршрут не может честно поддержать, включая service-tier metadata OpenAI.

Нативный fallback-набор включает gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex-spark и GPT-5.6 Sol/Terra/Luna. Для семейства GPT-5.5/5.4 opencodex сохраняет более богатые живые записи установленного каталога Codex и синтезирует только отсутствующую запись. Bundled upstream-snapshot используется только для GPT-5.6, где он даёт настоящую per-model identity и метаданные вместо приближения по старому шаблону.

Маршрут Id в селекторе и метаданные каталога
Вход Codex (строки с указанием аккаунта выключены) Bare native-id, например gpt-5.6-sol, gpt-5.6-terra и gpt-5.6-luna; Pool или Direct выбирается через codexAccountMode. У строк GPT-5.6 окно каталога 922 000 токенов.
Вход Codex (строки с указанием аккаунта включены и есть подходящие селекторы) По одной строке <selector>/<native-openai-model> для каждой пары подходящего селектора и поддерживаемой нативной модели; каждая строка использует только сопоставленный аккаунт, а bare native-строки скрыты из picker’а. Нативные метаданные и окна контекста сохраняются.
OpenAI (API key) Ровно восемь namespaced-строк: gpt-5.5, gpt-5.6, Sol/Terra/Luna и три виртуальных id *-pro (контекст 922,000; максимум входа 922,000 у всех восьми)
OpenRouter openrouter/openai/gpt-5.6-sol, openrouter/openai/gpt-5.6-terra, openrouter/openai/gpt-5.6-luna (922,000)
Cursor Статический fallback включает cursor/gpt-5.6-sol, cursor/gpt-5.6-terra и cursor/gpt-5.6-luna (1,000,000), а также обычные/Fast-строки Grok 4.5 и 4.6 (500,000). Для 4.6 доступен ещё xhigh; какие строки останутся видимыми, решает live-discovery аккаунта.
xAI Live-discovery авторитетно. Fallback-каталог включает xai/grok-4.6, а моделью по умолчанию остаётся xai/grok-4.5; у обеих окно 500,000 токенов. Grok 4.6 поддерживает low / medium / high / xhigh (upstream-default: high), а Grok 4.5 — только до high.

Закреплённые записи GPT-5.6 сохраняют точную upstream-лестницу. Sol и Terra дают диапазон от low до ultra; у Luna верхняя ступень — max. По умолчанию у Sol стоит low, а у Terra и Luna — medium. ultra — это клиентский выбор для максимального reasoning плюс proactive delegation и на backend он уходит как max. Наличие записи в picker’е означает лишь готовность каталога: подключённый аккаунт или API-ключ всё равно должен иметь право пользоваться этой моделью.

Переключатели нативных и маршрутизируемых моделей

Заголовок раздела «Переключатели нативных и маршрутизируемых моделей»

Страница Models в дашборде предоставляет переключатели disabledModels для bare native-id и routed provider-id provider/model. Account-qualified id <selector>/<native-openai-model> тоже поддерживаются в disabledModels, но дашборд не перечисляет и не переключает точные строки селекторов; добавляйте их в конфигурацию вручную:

  • Routed provider-id имеют namespace (provider/model). Отключение исключает такую модель из синхронизируемого каталога и /v1/models.
  • Account-qualified native-id имеют вид <selector>/<native-openai-model>. Если добавить такой id в disabledModels, скрывается только строка этого селектора.
  • Bare native GPT-id — это голые slug. Отключение скрывает bare-строку и все account-selector-клоны этой модели, сохраняя записи каталога для последующего включения.
  • Нативные строки берутся из поддерживаемого статического набора, поэтому отключённая нативная модель остаётся видимой в дашборде и её можно включить снова.

Проход по видимости выполняется после обновления snapshot’ов, а management API после такого переключения обновляет каталог и принудительно делает кэш моделей Codex устаревшим.

Элемент v1/base/v2 на странице Models меняет collaboration surface, которую использует каждая запись picker’а Codex; каноническое описание режима, делегирования, наследования, fallback и поведения encrypted task см. в Поверхности подагентов.

Видимость reasoning-tier’ов не зависит от режима поверхности v1/base/v2. Сгенерированные записи, умеющие reasoning, объявляют max, чтобы прямые effort-override для подагентов проходили валидацию; текущие сгенерированные routed-записи и более старые нативные GPT-записи также объявляют ultra. Точные upstream-лестницы GPT-5.6 сохраняются, поэтому у Luna есть max, но нет ultra.

На wire-уровне маршрутизирующие адаптеры сопоставляют или ограничивают неподдерживаемые tier’ы. Для более старых нативных моделей, у которых реальная лестница заканчивается на xhigh, nativeEffortClamp переводит прямой выбор max или ultra в xhigh (например, у GPT-5.5). У Sol, Terra и Luna есть настоящая ступень max.

Codex хранит fast-mode так:

service_tier = "fast"
[features]
fast_mode = true

Но каталог моделей и id tier’а во время выполнения используют priority. opencodex сохраняет это разделение. Нативные passthrough-модели OpenAI сохраняют поддержку fast; routed-провайдеры ограничены capability-гейтом — service_tier удаляется только когда провайдер объявил supportsServiceTier: false (registry классифицирует canonical OpenAI как true, DeepSeek и Volcengine Ark как false); неклассифицированные custom gateway’и сохраняют значения вызывающего без изменений и не получают подстановку. Так что опция fast не рекламируется там, где её нельзя выполнить, а custom gateway’и могут включить её явно через true.

Codex сортирует видимые в picker’е записи каталога по возрастанию priority и рекламирует первые пять как model-override для spawn_agent. Страница Subagents в дашборде позволяет выбрать и сохранить до пяти bare native-id или routed provider-id provider/model. Настроенный вручную subagentModels также принимает account-qualified id <selector>/<native-openai-model>, но дашборд не предлагает эти точные id; сохранение страницы заменяет список вариантами, доступными в дашборде. opencodex назначает им низкие приоритеты каталога в выбранном порядке; при включённых строках picker’а с указанием аккаунта bare native-выбор разворачивается в группы selector-qualified строк. Остальные модели всё равно можно вызывать по точному id.

Список featured-моделей отделён от выбора Sub-agent delegation в дашборде. Он только определяет, какие override Codex показывает первыми; он не выбирает модель и не инициирует делегирование сам по себе.

В режиме удалённого сервера Codex Desktop фильтрует picker по собственному списку разрешённых моделей available_models (активируется, когда включена удалённая настройка use_hidden_models). Записи маршрутизированного каталога по-прежнему загружаются и отдаются — model/list возвращает их, и встроенный CLI их читает, — но рендерер Desktop отбрасывает всё, чего нет в этом списке, ограниченном нативными моделями, ещё до отрисовки. opencodex не может влиять на этот список; соответствующий upstream-баг отслеживается в openai/codex#19694.

Пока Desktop не предоставит управление этим списком:

  • Задайте модель напрямую в ~/.codex/config.toml на удалённой машине, например model = "input/grok-4.5". Picker может показывать Custom, но запросы по-прежнему используют настроенную маршрутизированную модель.
  • Используйте Codex CLI или TUI вместо picker в Desktop; они не применяют этот список и показывают маршрутизированные модели как обычно.

Когда приложение Codex исчерпывает нативную пятичасовую квоту, оно может переключиться на резервную модель и сделать остальные строки в своём списке недоступными. Судя по #2813, это ограничение скрывает и маршрутизируемые строки opencodex, хотя они используют не связанные с ChatGPT учётные данные провайдеров и не расходуют его квоту.

Ограничение применяет клиент до того, как запрос доходит до прокси, поэтому opencodex не может его снять. Маршрутизируемые строки записываются с visibility: "list", фильтрация каталога смотрит только на disabledModels и selectedModels каждого провайдера, и никакое значение квоты не участвует в видимости маршрутизируемых строк.

Явный выбор маршрутизируемой модели не проходит через список. Укажите модель в config.toml:

model = "anthropic/claude-sonnet-5"

или отправьте её напрямую:

Terminal window
ocx access test anthropic/claude-sonnet-5 --protocol responses

Оба пути маршрутизируются корректно после того, как запрос дошёл до прокси, и это покрыто тестами. Однако настольное приложение Codex не отправляет настроенную модель в резервном режиме: оно определяет резерв по собственному опросу wham/usage (апселл luna_reserve плюс ещё разрешённый дополнительный лимит gpt-reserve) и принудительно выставляет модель gpt-reserve до отправки, поэтому путь через config.toml перезаписывается внутри приложения. До сброса окна используйте ocx access test, Claude Code через прокси (ocx claude) или любой прямой клиент /v1. См. Маршрутизируемые модели в резервном режиме Codex.

Если picker всё ещё показывает устаревшие записи, обновите каталог и перезапустите нужную поверхность Codex:

Terminal window
ocx sync

Каждый раз, когда меняются видимость, priority или metadata каталога, opencodex переписывает models_cache.json с намеренно устаревшей cache-wrapper, чтобы следующее обновление моделей в Codex прочитало новый каталог.