Реализация каталогов моделей для шлюзов и облачных сервисов

Получайте настройки Codex по умолчанию для конкретной версии, применяйте переопределения провайдера и предоставляйте каталог моделей

Эта страница предназначена для разработчиков, реализующих формат Codex Models, который определяет каталог моделей и обеспечивает работу средства выбора модели. Если вы разрабатываете сервис инференса, например шлюз или облачный сервис, используйте эту спецификацию, чтобы настольное приложение Codex и CLI могли обнаруживать ваши модели и использовать их инструкции и настройки возможностей.

Если вы администрируете корпоративную среду и хотите управлять каталогом моделей, см. руководство по настройке model_catalog_url.

Для поддержки формата реализуйте конечную точку каталога с аутентификацией. Получайте актуальные настройки по умолчанию от вышестоящего провайдера для версии Codex, отправившей запрос, применяйте свои переопределения и возвращайте полученный каталог.

Реализуйте конечную точку каталога

Конечная точка каталога по умолчанию — /models относительно base_url провайдера. Например, при base_url = "https://gateway.example.com/v1" Codex отправляет запрос:

GET /v1/models?client_version=0.162.1
Authorization: Bearer <PROVIDER_ACCESS_TOKEN>

Обнаружение по умолчанию поддерживает аутентификацию с помощью команды и аутентификацию через серверную часть Codex, например ChatGPT. Для собственного провайдера с аутентификацией по API key без аутентификации с помощью команды явно задайте model_providers.<id>.model_catalog_url, чтобы включить удаленное обнаружение. Сам по себе API key не запускает обнаружение по пути по умолчанию.

Используйте model_catalog_url, чтобы указать полный URL каталога, например https://gateway.example.com/codex/models. Он также может указывать на конечную точку /v1/models по умолчанию. Codex использует этот URL напрямую, не добавляя /models. Для обнаружения с использованием API key оставьте features.api_key_model_discovery включенным; он включен по умолчанию. Одни лишь пользовательские заголовки не включают обнаружение.

Codex отправляет данные аутентификации выбранного провайдера и настроенные заголовки, а также добавляет client_version и все query_params провайдера. Размещайте каталог в сервисе, которому разрешено получать эти учетные данные.

Аутентифицируйте вызывающую сторону, получите соответствующие настройки по умолчанию от вышестоящего провайдера, примените свои переопределения и верните полный JSON ModelsResponse напрямую. Присвойте каждой записи уникальный непустой slug. Для явно заданного model_catalog_url Codex отклоняет перенаправления и ответы размером более 1 МиБ. Продолжайте проверять права доступа к моделям при запросах инференса.

Удалите все действующие настройки model_catalog_json у клиентов, использующих эту конечную точку: локальный файл имеет приоритет и препятствует удаленному получению каталога.

Обеспечьте соответствие схеме клиента

Считывайте параметр запроса client_version в запросе каталога. Codex передает свою версию CLI в формате major.minor.patch, удаляя суффикс предварительной версии, если он есть. Для настольных клиентов это версия встроенного CLI.

Используйте соответствующий тег rust-v<version> в публичном репозитории Codex или точный коммит исходного кода для собственной сборки. Эти ссылки используют rust-v0.162.1; выберите ревизию, соответствующую вашему клиенту:

Встроенный файл представляет собой снимок на момент выпуска. Получайте актуальные настройки по умолчанию перед формированием своего каталога.

Получайте актуальные настройки по умолчанию от вышестоящего провайдера

Облачные провайдеры, предоставляющие модели OpenAI, получают настройки по умолчанию от OpenAI. Шлюзы считывают каталог своего облачного или вышестоящего провайдера, чтобы сохранить настройки развернутой модели и сведения о доступности для учетной записи и региона. Передавайте версию Codex, отправившей запрос, на каждом этапе и выполняйте аутентификацию отдельно для каждой конечной точки.

Чтобы получить настройки по умолчанию напрямую от OpenAI, вызовите конечную точку моделей Codex с тем же client_version. Например, с OpenAI API key:

curl --fail --silent --show-error \
  'https://chatgpt.com/backend-api/codex/models?client_version=0.162.1' \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Для интеграции с ChatGPT используйте токен доступа ChatGPT вызывающей стороны и заголовок ChatGPT-Account-ID, когда это применимо. Используйте учетные данные, которым разрешен доступ к конечной точке вышестоящего провайдера; собственный API key вашего шлюза не обеспечивает аутентификацию в OpenAI.

Разбирайте полный ответ, включая массив верхнего уровня models. Эта конечная точка возвращает метаданные Codex: инструкции, настройки рассуждения по умолчанию, настройки инструментов, ограничения контекста и уровни обслуживания. Публичная конечная точка /v1/models не предоставляет этот каталог.

Обновляйте эти настройки по умолчанию, даже если версия Codex не изменилась. Выполняйте запросы только от имени нужной учетной записи вышестоящего провайдера и соблюдайте директивы кеширования ответа: каталоги могут зависеть от прав доступа вызывающей стороны. Храните свои переопределения отдельно, чтобы повторно применять их к обновленным настройкам по умолчанию.

Применяйте переопределения провайдера

Изменяйте значения полей, сохраняя структуру ответа для этой версии:

  • Отфильтруйте модели, оставив только доступные вызывающей стороне. Сопоставьте каждый slug с поддерживаемым маршрутом инференса и скорректируйте display_name, description или priority. Для псевдонима без миграции модели задайте upgrade значение null.
  • Установите параметры рассуждения, ограничения контекста, входные модальности и уровни обслуживания в значения, поддерживаемые вашей моделью и маршрутом. Значения по умолчанию должны входить в число поддерживаемых вариантов. Для маршрута без уровней обслуживания очистите service_tiers и additional_speed_tiers и задайте default_service_tier значение null.
  • Сохраняйте инструкции и настройки инструментов вышестоящего провайдера, если вы не протестировали замену. Метаданные не добавляют модели возможностей и не предоставляют доступ к инференсу.

Для Bedrock через LiteLLM внесите обязательные изменения в каталог. Протестируйте полученный каталог с каждой поддерживаемой версией Codex.

Используйте публичные типы Rust

Используйте крейты из того же публичного тега Git или коммита, что и схема клиента:

  • Используйте codex-protocol для codex_protocol::openai_models::{ModelsResponse, ModelInfo}. Выполните разбор с помощью serde_json::from_slice::<ModelsResponse>(), измените catalog.models и сериализуйте всю обертку с помощью serde_json::to_vec(). Обертка обрабатывает поля совместимости для инструкций модели.
  • Используйте codex-models-manager::bundled_models_response(), чтобы загрузить статический встроенный каталог этой ревизии как ModelsResponse. Он не получает актуальные настройки по умолчанию от вышестоящего провайдера.