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

Порядок моделей

Селектор модели Codex не сохраняет порядок объявления провайдеров или массивов моделей в конфигурации opencodex. Итоговый порядок определяется приоритетами каталога, а маршрутизируемые модели с одинаковым приоритетом упорядочиваются детерминированно по алфавиту.

Менеджер моделей Codex сортирует видимые в селекторе записи каталога по priority по возрастанию. Порядок массива каталога при этом отбрасывается, поэтому перемещение записи ближе к началу сгенерированного JSON-массива не передвигает её ближе к началу селектора. Это ограничение зафиксировано прямо в реализации, в src/codex/catalog/sync.ts.

Поэтому opencodex управляет размещением избранных моделей, назначая более низкие приоритеты, а не полагаясь на позицию в массиве. Задействованные приоритеты:

Запись каталогаPriorityИсточник
subagentModels[i]i (от 0 до 4)Карта рангов избранных в src/codex/catalog/sync.ts
Остальные маршрутизируемые модели5Создание маршрутизируемых записей в src/codex/catalog/sync.ts
Нативные GPT-слаги по умолчанию9Создание нативных записей в src/codex/catalog/sync.ts
Невыбранные нативные модели при непустом списке избранныхНе менее featured.length + 100Слияние нативного каталога в src/codex/catalog/sync.ts

API управления ограничивает subagentModels пятью записями через slice(0, 5) в src/server/management/agent-settings-routes.ts. Это соответствует поверхности Codex spawn_agent, которая объявляет только первые пять переопределений модели. Модели вне этой пятёрки по-прежнему могут оставаться видимыми в основном селекторе и вызываться по точному id.

Все обычные маршрутизируемые модели имеют приоритет 5, поэтому им нужен дополнительный критерий. Прежде чем записи каталога будут построены, gatherRoutedModels() сортирует список маршрутизируемых моделей по имени провайдера, а затем по id модели — в обоих случаях по алфавиту (src/codex/catalog/provider-fetch.ts).

Это означает, что ни одна из следующих деталей конфигурации не влияет на итоговый порядок:

  • порядок объявления ключей в объекте providers;
  • порядок id в массиве models провайдера.

Затем orderForSubagents() стабильной сортировкой перемещает настроенные избранные модели в начало — в том же порядке, что и в subagentModels. Неизбранные модели сохраняют установленный ранее относительный алфавитный порядок «провайдер/id» (src/codex/catalog/sync.ts). При построении записей ранг избранных также преобразуется в приоритеты от 0 до 4, поэтому сортировка Codex по приоритету сохраняет эту ведущую последовательность.

selectedModels и disabledModels решают, какие маршрутизируемые модели будут показаны; порядком они не управляют. filterCatalogVisibleModels() преобразует оба списка в Set для поиска и фильтрует собранный список, не используя массивы как ранги (src/codex/catalog/provider-fetch.ts).

Как следствие, перестановка элементов в selectedModels или disabledModels не влияет на позицию в селекторе. Она может изменить только сам факт включения модели.

При непустом списке избранных итоговый порядок таков:

  1. Модели точно в настроенном порядке subagentModels, с приоритетами от 0 до 4.
  2. Все остальные маршрутизируемые модели, упорядоченные по алфавиту сначала по провайдеру, затем по id модели, с приоритетом 5.
  3. Невыбранные нативные модели, сдвинутые ниже блока избранных при слиянии каталога.

Без subagentModels маршрутизируемые модели остаются с приоритетом 5, нативные GPT-записи используют обычный приоритет (для записей, построенных opencodex, обычно 9), а группа маршрутизируемых моделей сохраняет алфавитный порядок «провайдер/id».

Предположим, subagentModels содержит эти пять id именно в таком порядке:

subagentModels = [
"gpt-5.5",
"opencode-go/glm-5.2",
"anthropic/claude-opus-4-6",
"gpt-5.6-sol",
"gpt-5.6-terra",
]

Селектор начинается так:

Позиция в селектореМодельPriorityПочему она здесь
1gpt-5.50Первый выбор в subagentModels
2opencode-go/glm-5.21Второй выбор — даже при том, что его провайдер по алфавиту идёт после anthropic
3anthropic/claude-opus-4-62Третий выбор
4gpt-5.6-sol3Четвёртый выбор
5gpt-5.6-terra4Пятый выбор
6anthropic/claude-fable-55Первый из оставшихся маршрутизируемых id в алфавитном порядке «провайдер/id»
С 7-йОстальные маршрутизируемые модели5По алфавиту по провайдеру, затем по id модели
После маршрутизируемыхОстальные нативные моделиfeatured.length + 100 или вышеНевыбранные нативные модели перемещаются ниже блока избранных

Первые пять записей — это переопределения, объявляемые spawn_agent; остальные продолжаются в обычном порядке селектора.

Единственный поддерживаемый способ настроить порядок ведущих моделей — переставить элементы subagentModels. Это можно сделать на странице Sub-agents дашборда или в конфигурации opencodex. Список принимает не более пяти моделей, и его порядок имеет значение.

Общих настроек modelOrder, providerOrder или карты приоритетов в OcxConfig сейчас нет. Поддерживаемое поле порядка — subagentModels (src/types.ts:238-246); disabledModels и selectedModels каждого провайдера — поля видимости (src/types.ts:276-282 и src/types.ts:439-446). Изменение остальной части порядка селектора потребовало бы изменения поведения на уровне кода, а не правки конфигурации.