Fonctionnement
Codex communique au moyen de l’API Responses d’OpenAI. opencodex accepte POST /v1/responses
sur HTTP avec des événements envoyés par le serveur, ainsi qu’une mise à niveau WebSocket facultative
sur le même chemin. Il traduit la requête vers le protocole du fournisseur, puis reconvertit la réponse
en événements Responses. Codex ignore ainsi qu’il ne dialogue pas avec OpenAI.
┌──────────────────────────── opencodex ────────────────────────────┐ │ │ Codex ──▶ │ parser ──▶ router ──▶ [vision] ──▶ adapter ──▶ provider │ ──▶ Codex (/v1/ │ │ │ │ │ │ │ (SSE / WS) responses)│ OcxParsed provider describe buildRequest parseStream │ │ Request +adapter images + fetch AdapterEvent[] │ │ │ │ │ │ [web-search loop] bridge ─▶ SSE │ └─────────────────────────────────────────────────────────────────────┘Sélection du compte d’authentification Codex
Section intitulée « Sélection du compte d’authentification Codex »Lorsque le fournisseur sélectionné est le relais ChatGPT/Codex, opencodex peut choisir un compte dans le pool enregistré avant de transmettre la requête en amont. Cette règle distingue volontairement deux cas :
- Les fils existants conservent leur affinité. Un fil reste lié à la génération du compte qui l’a démarré. Une longue session SSH, tmux ou Codex connectée depuis un appareil mobile conserve donc le même compte au lieu d’être rééquilibrée en pleine conversation.
- Les nouvelles sessions peuvent être rééquilibrées. Pour un nouveau fil, opencodex choisit parmi les comptes admissibles selon
accountPoolStrategy(quotapar défaut, ouround-robin/fill-first). La stratégiequotacompare l’utilisation connue sur les fenêtres de 5 heures, d’une semaine et de 30 jours. Il peut choisir un compte moins utilisé lorsque le compte actif franchitautoSwitchThreshold. Les comptes en délai de récupération ou nécessitant une réauthentification sont ignorés, quelle que soit la stratégie. - Les signaux de quota et d’échec alimentent le routage. Le tableau de bord peut forcer l’actualisation des quotas avec
GET /api/codex-auth/accounts?refresh=1; les réponses réussies en amont capturent les en-têtes de quota, une réponse 429 place le compte en délai de récupération, et une réponse 401/403 exige sa réauthentification.
Sélection du modèle de sous-agent
Section intitulée « Sélection du modèle de sous-agent »Sur une nouvelle installation, subagentModels comprend gpt-5.5, le trio GPT-5.6 Sol/Terra/Luna et
gpt-5.4-mini dans le sélecteur de sous-agents de Codex. Le tableau de bord peut réorganiser ou remplacer jusqu’à cinq entrées
avec des modèles natifs ou routés. Pour les requêtes de collaboration v1, les paramètres injectionModel
et injectionEffort ajoutent des instructions destinées au développeur afin d’indiquer à spawn_agent
le modèle et l’effort de raisonnement à utiliser. Les requêtes v2 conservent le guidage multi-agent natif de Codex.
Le cycle de vie
Section intitulée « Le cycle de vie »-
Analyse —
responses/parser.tsvalide la requête avec un schéma Zod (responses/schema.ts) et la convertit en unOcxParsedRequestinterne : invite système, liste normalisée de messages (texte, images, appels d’outils, résultats d’outils), les définitions d’outils, les options de génération et les fonctionnalités indicateurs tels que_webSearch(recherche web hébergée demandée) et_structuredOutput(un schéma JSON ou un objet JSON a été défini danstext.format). Les images restent de véritables parties du contenu, jamais du texte en base64. -
Routage —
router.tsassocie l’identifiant du modèle demandé à un fournisseur configuré selon l’ordre de priorité suivant :provider/modelexplicite →defaultModeld’un fournisseur → préfixes de modèles intégrés (claude-,gpt-,o1-/o3-/o4-,llama-/mixtral-/gemma-) → lemodels[]d’un fournisseur →defaultProviderde secours. Consultez Routage des modèles. -
Authentification — pour un fournisseur
oauth, opencodex injecte un jeton d’accès automatiquement actualisé comme jeton Bearer, ce qui permet aux adaptateurs existants de s’authentifier sans modification. Pour les comptes du pool ChatGPT/Codex,codex/auth-context.tsrésout d’abord le compte et l’adaptateur de transfert direct refuse de poursuivre si les informations d’identification requises sont indisponibles. -
Service auxiliaire de vision (facultatif) — si le modèle routé figure dans
provider.noVisionModelset que la requête contient une image, opencodex fait décrire chaque image par le service auxiliaire de vision ChatGPT configuré, puis la remplace par du texte afin qu’un modèle textuel puisse tout de même la traiter. Voir Services auxiliaires. -
Transfert direct rapide — si l’adaptateur transfère directement les Responses (
openai-responsesouazure-openai), opencodex conserve le corps Responses, applique les réécritures de routage et de compatibilité ciblées, puis relaie la réponse sans la convertir en événementsAdapterEvent. -
Service auxiliaire de recherche web (facultatif) — si Codex active l’outil hébergé
web_searchalors que le modèle routé n’est pas un modèle OpenAI, opencodex expose une fonction synthétiqueweb_searchet exécute le modèle dans une courte boucle agentique. Par défaut, les recherches réelles passent pargpt-5.6-lunaavec votre connexion ChatGPT, puis leurs résultats sont réinjectés comme résultats d’outil. -
Compactage (sur demande) — Codex v1 appelle
POST /v1/responses/compact; v2 ajoute uncompaction_triggerà un tour de réponses. Le passthrough natif achemine le compactage en amont, tandis qu’un modèle routé produit un résumé sans outil et renvoie l’historique de remplacement attendu par Codex. -
Adaptation — sinon, la méthode
buildRequest()de l’adaptateur choisi produit la requête HTTP en amont (URL, en-têtes et corps) dans le format natif du fournisseur, puis opencodex l’envoie avecfetch. -
Pont de réponse — la méthode
parseStream()(ouparseResponse()) de l’adaptateur produit desAdapterEventinternes (texte, raisonnement, début/delta/fin d’appel d’outil, fin et erreur).bridge.tsreconvertit ce flux en événements Responses SSE —response.output_text.delta,response.reasoning_summary_text.delta,response.function_call_arguments.delta,response.completed, etc. L’option WebSocket transporte les mêmes charges utiles d’événement que les blocs de texte.
Pourquoi un proxy et pas un fork Codex ?
Section intitulée « Pourquoi un proxy et pas un fork Codex ? »Codex utilise directement l’API Responses. En traduisant les échanges à la frontière du protocole,
opencodex fonctionne avec les CLI, App et SDK Codex sans modification, résiste aux mises à jour de
Codex et permet de changer de fournisseur pour chaque requête sans toucher au client. La traduction est
bidirectionnelle et fidèle à la diffusion : résumés de raisonnement, espaces de noms d’outils MCP, outils
libres (apply_patch) et découverte tool_search effectuent tous un aller-retour correct. Consultez la
référence d’architecture pour la correspondance événement par événement.

