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

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

Селектор модели 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 Почему она здесь
1 gpt-5.5 0 Первый выбор в subagentModels
2 opencode-go/glm-5.2 1 Второй выбор — даже при том, что его провайдер по алфавиту идёт после anthropic
3 anthropic/claude-opus-4-6 2 Третий выбор
4 gpt-5.6-sol 3 Четвёртый выбор
5 gpt-5.6-terra 4 Пятый выбор
6 anthropic/claude-fable-5 5 Первый из оставшихся маршрутизируемых 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). Изменение остальной части порядка селектора потребовало бы изменения поведения на уровне кода, а не правки конфигурации.