Mengimplementasikan katalog model untuk gateway dan cloud

Ambil pengaturan default Codex untuk versi tertentu, terapkan penggantian dari penyedia, dan sajikan katalog model

Halaman ini ditujukan bagi pengembang yang mengimplementasikan format Codex Models, yang mendefinisikan katalog model dan mendukung pemilih model. Jika Anda membangun penyedia inferensi, seperti gateway atau layanan cloud, gunakan spesifikasi ini agar aplikasi desktop Codex dan CLI dapat menemukan model Anda serta menggunakan instruksi dan pengaturan kapabilitasnya.

Jika Anda mengelola perusahaan dan ingin mengontrol katalog model, lihat panduan konfigurasi model_catalog_url.

Untuk mendukung format ini, implementasikan endpoint katalog yang memerlukan autentikasi. Ambil pengaturan default terkini dari penyedia hulu Anda untuk versi Codex yang mengajukan permintaan, terapkan penggantian Anda, lalu kembalikan katalog yang dihasilkan.

Implementasikan endpoint katalog

Endpoint katalog default adalah /models di bawah base_url milik penyedia. Misalnya, dengan base_url = "https://gateway.example.com/v1", Codex mengajukan permintaan berikut:

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

Penemuan default mendukung autentikasi berbasis perintah dan autentikasi backend Codex, seperti ChatGPT. Untuk penyedia kustom yang menggunakan autentikasi API key tanpa autentikasi berbasis perintah, tetapkan model_providers.<id>.model_catalog_url secara eksplisit untuk mengaktifkan penemuan jarak jauh. API key saja tidak memicu penemuan di jalur default.

Gunakan model_catalog_url untuk memilih URL katalog lengkap, seperti https://gateway.example.com/codex/models. URL ini juga dapat mengarah ke endpoint /v1/models default. Codex menggunakan URL ini secara langsung tanpa menambahkan /models. Untuk penemuan dengan API key, biarkan features.api_key_model_discovery tetap aktif; pengaturan ini aktif secara default. Header kustom saja tidak mengaktifkan penemuan.

Codex mengirimkan autentikasi penyedia yang dipilih dan header yang dikonfigurasi, serta menambahkan client_version dan setiap query_params dari penyedia. Sajikan katalog pada layanan yang berwenang menerima kredensial tersebut.

Autentikasi pemanggil, ambil pengaturan default hulu yang sesuai, terapkan penggantian Anda, lalu kembalikan JSON ModelsResponse lengkap secara langsung. Berikan setiap entri slug yang unik dan tidak kosong. Untuk model_catalog_url yang ditetapkan secara eksplisit, Codex menolak pengalihan dan respons yang lebih besar dari 1 MiB. Tetap terapkan kontrol akses model pada permintaan inferensi.

Hapus setiap pengaturan model_catalog_json yang berlaku dari klien yang menggunakan endpoint: file lokal lebih diutamakan dan mencegah pengambilan jarak jauh.

Sesuaikan dengan skema klien

Baca parameter kueri client_version pada permintaan katalog. Codex mengirimkan versi CLI-nya sebagai major.minor.patch, tanpa akhiran prarilis. Untuk klien desktop, versi ini adalah versi CLI yang dibundel.

Gunakan tag rust-v<version> yang sesuai dalam repositori publik Codex, atau commit sumber yang persis sama untuk build kustom. Tautan ini menggunakan rust-v0.162.1; pilih revisi yang sesuai dengan klien Anda:

File yang dibundel merupakan snapshot rilis. Ambil pengaturan default terkini sebelum membuat katalog Anda.

Ambil pengaturan default hulu terkini

Penyedia cloud yang menyajikan model OpenAI mengambil pengaturan default dari OpenAI. Gateway membaca katalog penyedia cloud atau penyedia hulunya agar tetap mempertahankan pengaturan model yang diterapkan serta ketersediaan akun dan wilayah. Teruskan versi Codex yang mengajukan permintaan pada setiap tahap, dan lakukan autentikasi secara terpisah ke setiap endpoint.

Untuk mengambil pengaturan default langsung dari OpenAI, panggil endpoint model Codex dengan client_version yang sama. Misalnya, dengan API key OpenAI:

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

Untuk integrasi ChatGPT, gunakan token akses ChatGPT milik pemanggil dan header ChatGPT-Account-ID jika berlaku. Gunakan kredensial yang berwenang mengakses endpoint hulu; API key gateway Anda sendiri tidak dapat digunakan untuk autentikasi ke OpenAI.

Urai seluruh respons, termasuk array models tingkat teratasnya. Endpoint ini mengembalikan metadata Codex seperti instruksi, pengaturan default penalaran, pengaturan alat, batas konteks, dan tingkat layanan. Endpoint publik /v1/models tidak menyediakan katalog ini.

Perbarui pengaturan default ini meskipun versi Codex belum berubah. Batasi cakupan permintaan pada identitas hulu yang dituju dan patuhi kontrol cache respons: katalog dapat bergantung pada akses pemanggil. Simpan penggantian Anda secara terpisah agar Anda dapat menerapkannya kembali pada pengaturan default terbaru.

Terapkan penggantian dari penyedia

Ubah nilai field dengan tetap mempertahankan struktur respons versi tersebut:

  • Filter model agar hanya mencakup model yang dapat digunakan pemanggil. Petakan setiap slug ke rute inferensi yang didukung, dan sesuaikan display_name, description, atau priority. Untuk alias tanpa migrasi model, tetapkan upgrade ke null.
  • Tetapkan opsi penalaran, batas konteks, modalitas masukan, dan tingkat layanan ke nilai yang didukung model dan rute Anda. Pastikan pengaturan default tetap berada dalam pilihan yang didukung. Untuk rute tanpa tingkat layanan, kosongkan service_tiers dan additional_speed_tiers, lalu tetapkan default_service_tier ke null.
  • Pertahankan instruksi dan pengaturan alat dari hulu kecuali Anda telah menguji penggantinya. Metadata tidak menambah kapabilitas model atau memberikan akses inferensi.

Untuk Bedrock melalui LiteLLM, terapkan perubahan katalog yang diperlukan. Uji katalog yang dihasilkan dengan setiap versi Codex yang didukung.

Gunakan tipe Rust publik

Gunakan crate dari tag Git publik atau commit yang sama dengan skema klien:

  • Gunakan codex-protocol untuk codex_protocol::openai_models::{ModelsResponse, ModelInfo}. Urai dengan serde_json::from_slice::<ModelsResponse>(), edit catalog.models, dan serialisasikan seluruh pembungkus dengan serde_json::to_vec(). Pembungkus ini menangani field kompatibilitas untuk instruksi model.
  • Gunakan codex-models-manager::bundled_models_response() untuk memuat katalog statis yang dibundel pada revisi tersebut sebagai ModelsResponse. Ini tidak mengambil pengaturan default hulu terkini.