Codex Desktop не показывает кастомные модели: 5 решений (2026)
Codex Desktop скрывает кастомные модели из списка? 5 решений для бага model_catalog_json, патч cc-switch v3.16.5 и обходной путь в 1 строку.
Вы подключили кастомного провайдера, codex прекрасно запускается из терминала, но селектор моделей в Desktop ведёт себя так, будто ваших моделей не существует. Этот разрыв почти никогда не связан с вашим API-ключом или синтаксисом конфига. Дело в том, что клиент Desktop тихо фильтрует модели, которые бэкенд уже загрузил.
Диагностика за 30 секунд
Прежде чем что-то переписывать, сопоставьте свой симптом с таблицей. Большинству людей до решения — одна строка.
| Что вы видите | Что на самом деле не так | Первый шаг |
|---|---|---|
| Селектор показывает только «Custom», без имени модели | Модель задана инлайн, нет метаданных каталога | Решение 1: оставьте инлайновый model, он работает |
codex CLI /model показывает её, а Desktop — нет | Клиентский фильтр Desktop (issue #19694) | Решение 1 сейчас, Решение 4 для реального списка |
| Выпадающий список пуст | Каталог отсутствует или некорректен | Решение 2 или Решение 4 |
| Ничего не грузится, при запуске выводится предупреждение | Провайдер в локальном для проекта .codex/config.toml | Решение 3: перенесите в ~/.codex/ |
| Нативный провайдер cc-switch, всё равно скрыт | Формат каталога до v3.16.5 | Решение 4: обновите, затем пересохраните |
Самая быстрая проверка: откройте терминал в той же папке и запустите codex (CLI), затем введите /model. Если CLI показывает вашу модель, а Desktop — нет, у вас баг клиентского фильтра, и никакая правка конфига на стороне Desktop её не проявит. Переходите к Решению 1.
flowchart TD
A[Custom model missing in Desktop] --> B{Does CLI /model show it?}
B -- Yes --> C[Desktop filter bug #19694]
C --> F1[Fix 1: set model inline + Fix 4 catalog]
B -- No --> D{Provider in ~/.codex/config.toml?}
D -- No, it is project-local --> F3[Fix 3: move to user-level]
D -- Yes --> E{Catalog file present + valid?}
E -- No --> F2[Fix 2 or Fix 4: generate catalog]
E -- Yes --> F1
Когда применять эти решения (а когда лучше просто сменить модель)
Правьте конфиг, когда модель работает, но селектор её не показывает. Это проблема отображения, и она стоит десяти минут, потому что всё остальное уже работает. Конкретно — это случай, когда ваши запросы успешно проходят из CLI или напрямую через curl, а модель просто не появляется в выпадающем списке Desktop. Перед вами фильтр из #19694 или пробел в каталоге, и здесь подходят Решения с 1 по 4.
Меняйте модель вместо правки конфигов, когда сломан сам маршрут. Если curl https://your-gateway/v1/responses возвращает 401, 404 или model-not-found, дело не в селекторе. Провайдер или строка модели неверны, и никакая правка каталога не спасёт маршрут, который не разрешается.
Дальше — условие выхода. Если ваша единственная цель — отправлять запросы к кастомной модели, одного Решения 1 достаточно: задайте model инлайн, перезапустите, готово. Остальная часть этого руководства — про то, как заставить селектор показать чистый, переключаемый список, что важно для команд и всех, кто часто меняет модели. Если вы никогда не открываете выпадающий список, остановитесь после Решения 1.
Почему Codex Desktop скрывает кастомные модели
Есть четыре разных корневых причины, и им нужны разные решения. Ошибка в определении причины — вот почему люди тратят полдня, заново вбивая рабочий конфиг.
| Корневая причина | Почему селектор скрывает модель | Каких настроек это касается | Решение |
|---|---|---|---|
| Клиентский фильтр Desktop | App-server возвращает модель через model/list, а рендерер Desktop её отбрасывает | Любой кастомный провайдер с каталогом | Решение 1 + Решение 4 |
| Нет метаданных каталога | model задан инлайн, селектору нечего описывать | Минимальные конфиги config.toml | Решение 1 (примите «Custom») или Решение 2 |
| Некорректный / устаревший каталог | Каталог записан в формате, который Codex не перечисляет | Старый cc-switch, JSON, отредактированный вручную | Решение 2 / Решение 4 |
| Провайдер локальный для проекта | model_provider игнорируется вне ~/.codex/config.toml | .codex/config.toml в репозитории | Решение 3 |
Первая — та, что удивляет людей. Согласно открытому codex issue #19694, app-server корректно загружает каталог и возвращает ваши модели через эндпоинт model/list, но UI Desktop применяет дополнительный фильтр и удаляет локально настроенные модели перед отрисовкой селектора. Бэкенд знает о вашей модели. Фронтенд отказывается её показывать. Это баг клиента, а не ошибка конфига; он заведён 26.04.2026 и на момент написания всё ещё открыт.
Вторая причина — самая частая и наименее пугающая. Если вы указали только model = "some-id" без каталога, у Codex есть строка, но нет отображаемого имени, размера контекстного окна и флагов возможностей. Селектор показывает метку «Custom» и идёт дальше. Ваши запросы всё равно уходят к нужной модели. Людей это сбивает с толку, потому что «Custom» выглядит как поломка, хотя всё работает.
Третья причина — то, на что натыкались пользователи cc-switch до v3.16.5. Сообщество разобрало это в cc-switch issue #3668: сгенерированный каталог и блок провайдера не совпадали с тем, что перечисляет селектор Codex, поэтому /model возвращал пусто для сторонних провайдеров, хотя маршрутизация работала. Подробнее о решении — в Решении 4.
У четвёртой причины есть характерный признак. Если вы положили провайдера в .codex/config.toml репозитория, Codex выводит предупреждение при запуске и полностью игнорирует блок. Определения провайдеров действуют только на уровне пользователя.
Как Codex загружает модели (и где Desktop расходится)
Codex строит список моделей послойно, и знание порядка подсказывает, какое решение действительно сработает. Есть три источника: каталог, встроенный в бинарник; удалённый каталог, загружаемый из OpenAI; и ваш локальный model_catalog_json. Локальный файл побеждает. При запуске он переопределяет и встроенный, и удалённый каталоги — вот почему корректный model_catalog_json является настоящим рычагом для сторонних моделей, а не приятным дополнением.
А вот часть, на которой спотыкаются все. Когда Codex запускается, app-server читает все три слоя, разрешает их и отдаёт результат через внутренний эндпоинт model/list. CLI отрисовывает этот список напрямую, поэтому кастомные модели видны. Приложение Desktop отрисовывает тот же список через дополнительный клиентский шаг, который, согласно issue #19694, применяет собственный allowlist и отбрасывает локально настроенные записи прежде, чем они попадут в выпадающий список. Один бэкенд, один каталог, два разных селектора. Именно это расхождение делает CLI надёжным запасным вариантом, а Desktop — нет.
Есть ещё кэш, за которым надо следить. Codex держит ~/.codex/models_cache.json, и после смены провайдеров или правки каталога он не всегда пересинхронизируется. Устаревший кэш может продолжать показывать старый список или пустой, даже когда конфиг уже верный. Удаление этого файла заставляет заново собрать список с нуля при следующем запуске — это стоит попробовать, прежде чем считать, что дело в самом каталоге.
Как это исправить (решения для любой конфигурации)
Идите сверху вниз. Решение 1 работает всегда. Более поздние делают селектор красивым, а список — переключаемым.
Решение 1: Задать модель инлайн (надёжный обходной путь)
Это тот обходной путь, к которому пришла ветка #19694, и именно за него стоит хвататься первым делом. Впишите строку модели прямо в config.toml и позвольте селектору говорить «Custom».
# ~/.codex/config.toml (user-level, not a project folder)
model = "moonshotai/kimi-k2.7-code"
model_provider = "ofox"
[model_providers.ofox]
name = "ofox"
base_url = "https://api.ofox.ai/v1"
env_key = "OFOX_API_KEY"
wire_api = "responses"
Экспортируйте ключ (export OFOX_API_KEY=sk-... в профиле вашей оболочки), полностью закройте Codex Desktop и откройте заново. Селектор будет показывать «Custom», но каждый запрос уйдёт к moonshotai/kimi-k2.7-code. Если вы указываете на другую модель, замените строку: deepseek/deepseek-v4-pro или openai/gpt-5.3-codex — другие ID для кодинга на том же шлюзе. Все три доступны по одному ключу. Разбор самого блока провайдера — в руководстве Codex CLI multi-provider setup via config.toml.
Про wire_api. Codex удалил старый путь chat/completions в начале февраля 2026 (см. discussion #7782); responses теперь единственное поддерживаемое значение и значение по умолчанию, если ключ опущен. Провайдер, у которого всё ещё стоит wire_api = "chat", падает при запуске. На практике требуется, чтобы ваш шлюз предоставлял OpenAI-совместимый Responses-эндпоинт по адресу {base_url}/responses, что ofox и делает на https://api.ofox.ai/v1/responses, поэтому wire_api = "responses" — правильная настройка здесь. Направьте Codex на шлюз, который понимает только /chat/completions, и каждый запрос получит 404, что выглядит как проблема с моделью, но на деле — несовпадение протоколов. Полный список полей — в справочнике по конфигурации Codex.
Решение 2: Добавить каталог моделей, чтобы селектор их перечислял
Если вы хотите видеть в выпадающем списке настоящее имя вместо «Custom», вам нужен model_catalog_json. Это JSON-файл, загружаемый один раз при запуске, с массивом models верхнего уровня. Каждая запись описывает одну модель.
# top of ~/.codex/config.toml
model_catalog_json = "/Users/you/.codex/ofox-models.json"
model = "moonshotai/kimi-k2.7-code"
model_provider = "ofox"
Минимальная запись каталога с полями из официального codex models.json:
{
"models": [
{
"slug": "moonshotai/kimi-k2.7-code",
"display_name": "Kimi K2.7 Code (ofox)",
"description": "Coding model via the ofox gateway",
"context_window": 262000,
"max_context_window": 262000,
"supported_in_api": true,
"visibility": "list",
"priority": 1
}
]
}
slug должен совпадать со строкой, которую вы отправляете провайдеру. В официальном каталоге у каждой модели куда больше полей (уровни рассуждений, типы инструментов, флаги модальности), и ручное создание полной структуры — дело хлопотное, ровно поэтому и существует следующее решение. После любого изменения каталога перезапустите Desktop. Этот слой переопределяет и встроенный каталог, и удалённый, и перечитывается только при запуске, поэтому изменение конфига на уровне отдельного треда его не переприменит.
Решение 3: Перенести провайдера в пользовательский конфиг
Если Codex выводит предупреждение при запуске об игнорируемых настройках провайдера, значит ваш блок провайдера лежит не в том файле. model_provider и model_providers работают только в ~/.codex/config.toml. .codex/config.toml репозитория не может определять провайдеров. Локальный для проекта model_catalog_json — отдельный случай: по замыслу он должен читаться, но на свежих тредах Desktop сейчас не читается, и это открытый баг (#26308), а не задуманное поведение.
# check where your provider actually lives
grep -rn "model_providers" ~/.codex/config.toml ./.codex/config.toml 2>/dev/null
# if it is in ./.codex/config.toml, move the [model_providers.*] block
# and model_provider = "..." into ~/.codex/config.toml, then restart
Специфичные для репозитория вещи вроде файлов инструкций держите в конфиге проекта. Провайдера и каталог моделей — на уровне пользователя.
Решение 4: Пусть cc-switch v3.16.5 сгенерирует каталог
Если вы управляете Codex через cc-switch, обновитесь до v3.16.5 или новее. Именно этот релиз исправляет пустой селектор для нативных провайдеров. Он генерирует ~/.codex/cc-switch-model-catalog.json для поставщиков на нативных Responses-эндпоинтах (apiFormat: "openai_responses"), что и позволяет Codex Desktop реально видеть модели и использовать встроенные инструменты.
Две вещи, которые нужно сделать после обновления, иначе ничего не изменится:
- Пересохраните каждого нативного провайдера один раз. Каталог генерируется заново только при сохранении. Существующие провайдеры сохраняют своё старое (сломанное) состояние, пока вы не откроете и не пересохраните их. Автоматической миграции нет.
- Поймите разделение. В v3.16.5 каталог моделей больше не привязан к переключателю «локальной маршрутизации». Нативные Responses-поставщики теперь генерируют каталог независимо от того, включена ли локальная маршрутизация, а поставщики формата Chat, как и раньше, проходят через прокси-конвертацию.
# confirm the catalog exists and lists your models after re-saving
cat ~/.codex/cc-switch-model-catalog.json | grep -o '"slug":[^,]*'
# if this is empty, re-save the provider in cc-switch and check again
Одна оговорка, которую сам cc-switch отключает: несколько китайских моделей первого уровня (MiMo, LongCat, MiniMax, Qwen3-Coder) не поддерживают встроенный web_search от OpenAI на своих шлюзах, поэтому v3.16.5 по умолчанию отключает для них этот инструмент, чтобы Codex не выдавал жёсткую 400. Если вы маршрутизируете их через шлюз, ожидайте, что веб-поиск будет выключен.
Частые ошибки настройки, которые маскируются под баг селектора
Половина сообщений о том, что «кастомные модели не показываются», — это на деле сломанный маршрут в костюме проблемы отображения. Прежде чем трогать каталог, исключите эти случаи. Каждый из них даёт симптом, похожий на то, что селектор скрывает вашу модель, тогда как на самом деле у запроса не было шанса дойти.
| Симптом | Настоящая причина | Решение |
|---|---|---|
| Ошибка при запуске или каждый запрос 404 | wire_api = "chat" (удалён в фев. 2026) или шлюз без эндпоинта /responses | Установите wire_api = "responses" и укажите шлюз с поддержкой Responses |
| Каждый запрос возвращает 401 | env_key указан, но переменная не экспортирована | export OFOX_API_KEY=... в профиле оболочки |
| Модель работает, но возвращает неверный вывод | slug каталога не совпадает с ID модели провайдера | Приведите slug к точной строке модели |
| Провайдер игнорируется, при запуске выводится предупреждение | Блок лежит в локальном для проекта .codex/config.toml | Перенесите в ~/.codex/config.toml |
| Периодические сбросы соединения | Завершающий слэш или неверный путь в base_url | Завершайте URL на /v1, без завершающего слэша |
Признак, отличающий эти случаи от настоящего фильтра #19694, — одна команда: выполните тот же запрос из CLI. Если CLI тоже падает — это одна из ошибок выше, а не селектор Desktop, и никакая правка каталога не поможет. Если CLI отрабатывает, а слепнет только Desktop, значит дело в фильтре, и вы возвращаетесь к Решению 1 и Решению 4.
Известные проблемы Codex Desktop с кастомными моделями (хронология 2026)
Это не один баг. Это кластер связанных проблем в приложении Codex и в инструментах, которые пишут его конфиг. Понимание того, какая из них у вас, избавит от применения не того решения.
| Issue | Что ломается | Заведён | Статус |
|---|---|---|---|
| openai/codex #19694 | Селектор Desktop отфильтровывает модели каталога, которые бэкенд загрузил | 2026-04-26 | Открыт |
| openai/codex #26308 | Desktop игнорирует локальный для проекта model_catalog_json на свежих тредах | 2026 | Открыт |
| openai/codex #22160 | Селекторы CLI /model и Desktop не показывали алиасы профилей / провайдеров | 2026 | Закрыт |
| openai/codex #15364 | Нет UI для выбора кастомного провайдера внутри приложения Desktop | 2026 | Закрыт |
| cc-switch #3668 | Формат каталога cc-switch не распознаётся, /model пуст | 2026-06-03 | Исправлено в v3.16.5 |
Общий паттерн для всех них: маршрутизация работает, отображение — нет. CLI каждый раз оказывался надёжным запасным вариантом, потому что читает каталог без дополнительной фильтрации рендерера Desktop. Если вы застряли в Desktop, CLI (codex в терминале) почти всегда покажет и задействует модель.
Когда селектор всё равно не показывает модели: альтернативы, работающие сейчас
Если вы устали бороться с UI Desktop, вот способы продолжать пользоваться кастомными моделями, не дожидаясь исправления клиента. Смысл шлюза здесь — один эндпоинт и один ключ на множество моделей, так что смена модели превращается в правку одной строки, а не в новый блок провайдера каждый раз.
| Путь | Как модель попадает в Codex | Поведение селектора | Примечания |
|---|---|---|---|
| Шлюз ofox | Один base_url, один ключ, много ID моделей | «Custom» или из каталога | Kimi, DeepSeek, GPT-Codex из одного блока провайдера |
| Codex CLI | Тот же конфиг, терминальный клиент | Надёжно перечисляет кастомные модели | Обходит фильтр Desktop |
| Прямой ключ провайдера | Отдельный блок провайдера на каждого вендора | Тот же фильтр применяется | Больше ключей, больше блоков для поддержки |
| Локально (Ollama) | base_url на localhost | Предупреждения без каталога | Офлайн, без шлюза |
Использование ofox в качестве провайдера сводит поддержку к минимуму: moonshotai/kimi-k2.7-code (контекст 262K), deepseek/deepseek-v4-pro (контекст 1M) и openai/gpt-5.3-codex (контекст 512K) — все за одним https://api.ofox.ai/v1 и одним ключом, с актуальными ценами за токен на странице каждой модели на ofox. Чтобы сменить модель, вы меняете одну строку в config.toml — без нового блока провайдера, без второго ключа. Настройка base-URL для OpenAI-совместимых клиентов описана в документации ofox. Какой бы путь вы ни выбрали, особенность селектора Desktop — это слой отображения сверху, а не ограничение маршрутизации.
Как проверить, что ваши кастомные модели действительно загружены
Не доверяйте селектору как источнику истины, ведь именно он сломан. Проверяйте на слое ниже него.
codex --version # confirm you are on a recent build
codex # start the CLI, then type /model
# the CLI enumerates the catalog without the Desktop filter
Если /model в CLI показывает вашу модель, то каталог и провайдер настроены верно, и любой оставшийся пробел — это рендерер Desktop. Если CLI тоже выдаёт пусто, проблема выше: не тот файл (Решение 3), некорректный каталог (Решение 2 / Решение 4) или неверный slug. Для грубой проверки того, что сам маршрут разрешается, один curl к шлюзу с вашим ключом покажет, существует ли модель, ещё до того как винить клиента. Сначала маршрутизация, потом отображение.
FAQ
Почему Codex Desktop не показывает мои кастомные модели?
Обычно модель работает, а приложение Desktop отфильтровывает её из селектора (issue #19694). Второстепенные причины: нет файла каталога, некорректный каталог от старого инструмента или провайдер, определённый в локальном для проекта .codex/config.toml.
Как добавить кастомную модель в Codex config.toml?
Определите [model_providers.NAME] с base_url, env_key и wire_api, затем задайте model_provider и model. Держите это в ~/.codex/config.toml. Для ofox — base_url = "https://api.ofox.ai/v1".
Работает ли cc-switch с Codex Desktop?
Да, начиная с v3.16.5, где генерируется ~/.codex/cc-switch-model-catalog.json для нативных Responses-провайдеров. После обновления один раз пересохраните каждого провайдера.
Где находится файл каталога моделей Codex?
Там, куда указывает model_catalog_json в ~/.codex/config.toml. cc-switch использует ~/.codex/cc-switch-model-catalog.json. Следите за устаревшим ~/.codex/models_cache.json после смены провайдеров.
Почему Codex показывает «Custom» вместо имени моей модели?
Вы задали model инлайн без записи в каталоге, поэтому у селектора нет метаданных для отображения. Запросы всё равно уходят к нужной модели.
Можно ли использовать кастомные модели в локальном для проекта .codex/config.toml?
Нет. Настройки провайдера действуют только в ~/.codex/config.toml. Локальные для проекта блоки провайдера игнорируются с предупреждением при запуске.
Что такое model_catalog_json в Codex?
Ключ config.toml, указывающий на JSON-файл, загружаемый при запуске, с массивом models верхнего уровня из записей, несущих slug, display_name и поля возможностей. Он переопределяет встроенный и удалённый каталоги.
Как направить Codex к Kimi, DeepSeek или GPT-Codex?
Направьте одного кастомного провайдера на шлюз и задайте model. На ofox: moonshotai/kimi-k2.7-code, deepseek/deepseek-v4-pro, openai/gpt-5.3-codex — все из https://api.ofox.ai/v1.
Источники, проверенные для этого обновления
- Codex issue #19694: Desktop model picker filters out models from model_catalog_json (открыт, проверено 2026-07-05)
- cc-switch v3.16.5 release notes (проверено 2026-07-05)
- cc-switch issue #3668: catalog format not recognized by Codex (проверено 2026-07-05)
- Codex configuration reference (проверено 2026-07-05)
- Codex models.json catalog schema (проверено 2026-07-05)
- Снимок каталога моделей и цен ofox, https://ofox.io/models (проверено 2026-07-05)


