Aller au contenu

Codex CLI Integration

La Codex CLI Integration est une famille de quatre workflows N8N qui industrialisent l’usage du CLI Codex d’OpenAI au sein de la stack ai-stack/cli-ollama. Codex est devenu le provider par défaut de CLI Ollama (commit 195d432) : sans automatisation autour de son authentification et de son streaming, le tooling AI casserait silencieusement à la première expiration de session OAuth.

WorkflowIDNodesTriggerRôle
Codex Auth WatchdogPaBIkK76OPcHQr535Schedule (6h)Surveille la fraîcheur de auth.json et alerte via Notification Hub
Codex Reauth FlowsLAIrqJDGRUE6Jmj5Execute WorkflowDémarre une session device-auth et envoie URL + code via Telegram
Codex Reauth Callback ActionsxpHr32uMtdEE0M3Q8Execute WorkflowTraite les boutons [Done] / [Cancel] après réauth
Codex Progress Handlerw8r9JcpArIElZxRe11Webhook /codex-progressBuffer le streaming Codex et édite le message Telegram
EndpointMéthodeConsommé par
/api/codex/auth/statusGETAuth Watchdog
/api/codex/reauthPOSTReauth Flow
/api/codex/reauth/{id}/statusGETCallback Actions ([Done])
/api/codex/reauth/{id}DELETECallback Actions ([Cancel])
/webhook/codex-progress (N8N)POSTCodex provider (streaming)

Codex Auth Watchdog · 5 nodes

HTTP GET /auth/status

HTTP POST /reauth

callback Done / Cancel

HTTP GET /reauth/id/status

HTTP DELETE /reauth/id

POST /webhook/codex-progress

Codex Progress Handler · 11 nodes

Webhook /codex-progress

Parse Body

DT Get Buffer

Code Decide

Edit Message

Send New Message

DT Update Buffer

Codex Reauth Callback Actions · 8 nodes

Execute Workflow Trigger

Answer Callback

Switch Action

Check Reauth Status

Cancel Reauth Session

Edit Original Message

Codex Reauth Flow · 5 nodes

Execute Workflow Trigger

Start Reauth Session

Format Reauth Message

Send Reauth Prompt

Return Reauth Started

Schedule 6h

Get Codex Auth Status

Evaluate Auth Health

IF Should Alert

Call Notification Hub

cli-ollama

FastAPI · /api/codex/*

Telegram bot

chat utilisateur


ProblèmeSans la familleAvec la famille
Expiration silencieuseToutes les requêtes AI échouent sans signalWatchdog alerte à J-2 et J-0 de l’expiration
Réauth manuelle SSHConnexion VPS + docker exec + copier-coller du codeBouton Telegram + device-code envoyé en push
Spawn hors conteneurCodex CLI lancé sur l’hôte écrit dans le mauvais ~/.codexSpawn in-container, écrit dans /home/cli/.codex/auth.json
Erreurs typées floues« subprocess failed » non actionnableErreur auth_expired détectée côté CLI Ollama
Streaming Codex perduLong run = silence radio Telegram pendant 30s+Edit-in-place du message via buffer DT
Annulation impossibleSession device-auth zombie en cas d’abandon[Cancel] tue le subprocess via DELETE /reauth/{id}

Pourquoi un Watchdog et pas une alerte à la première erreur ?

Section intitulée « Pourquoi un Watchdog et pas une alerte à la première erreur ? »

Découvrir l’expiration au moment d’un appel utilisateur dégrade l’UX : le message Telegram retourne une erreur cryptique et l’utilisateur doit ouvrir la documentation. Le Watchdog tourne toutes les 6 heures et anticipe :

SeuilSévéritéAction
auth.json absentcriticalAlerte immédiate avec commande codex login --device-auth
age > 8 jourscriticalRe-auth fortement recommandée
age > 6 jourswarningSurveillance, re-auth proche
last_refresh illisiblewarningFichier corrompu à inspecter

Les seuils 6/8 jours offrent une fenêtre confortable (~48h) entre la première alerte et la vraie panne.

Pourquoi extraire le Callback Handler du Reauth Flow ?

Section intitulée « Pourquoi extraire le Callback Handler du Reauth Flow ? »

Le Reauth Flow envoie le message Telegram, mais le callback [Done] / [Cancel] est asynchrone : l’utilisateur peut cliquer 10 minutes plus tard. Le séparer en sub-workflow dédié (8 nodes) suit la même logique que NH Callback Handler (#276) : routage précoce via le Telegram Orchestrator, bypass de la dedup, pas d’état partagé.

CommitApport
edfcf79Erreur typée auth_expired côté CLI Ollama (détection au lieu de subprocess error)
9771a97Spawn device-auth in-container + détection auth missing
ba0f7aeBump n8n-exports avec corrections de reauth
32c3282Webhook streaming /webhook/codex-progress côté provider
7ee7dbdChat Codex edit-in-place + streaming temps réel Telegram

WorkflowIDNodesRôle
Codex Auth WatchdogPaBIkK76OPcHQr535Cron 6h, check /api/codex/auth/status, alerte Hub
Codex Reauth FlowsLAIrqJDGRUE6Jmj5Spawn device-auth, push Telegram avec URL + code
Codex Reauth Callback ActionsxpHr32uMtdEE0M3Q8Switch sur callback, confirme ou annule la session
Codex Progress Handlerw8r9JcpArIElZxRe11Buffer DT + edit-in-place du message Telegram

Chaîne linéaire : Schedule 6hGet Codex Auth Status (HTTP GET) → Evaluate Auth Health (Code) → IF Should AlertCall Notification Hub (Execute Workflow).

Le node Evaluate Auth Health applique deux seuils :

var WARNING_AGE = 6 * 86400; // 6 jours
var CRITICAL_AGE = 8 * 86400; // 8 jours
if (!s.exists) {
severity = 'critical';
title = 'Codex auth manquante';
} else if (age > CRITICAL_AGE) {
severity = 'critical';
} else if (age > WARNING_AGE) {
severity = 'warning';
}

L’appel au Notification Hub délègue ensuite la dédup, les quiet hours et le routage Telegram. Le watchdog ne se préoccupe que de l’évaluation, jamais du transport.

Déclenché par Execute Workflow (depuis un agent conversationnel ou un alias /codex-reauth). Le node Start Reauth Session fait un POST http://cli-ollama:11434/api/codex/reauth :

{
"reauth_id": "rau_xxx",
"device_url": "https://auth.openai.com/device",
"user_code": "ABCD-EFGH",
"host_command": "docker exec -it cli-ollama codex login --device-auth",
"ttl_seconds": 600
}

Le node Format Reauth Message construit un message Telegram avec inline keyboard [Ouvrir l'URL] [Done] [Cancel]. Send Reauth Prompt envoie le message, Return Reauth Started retourne le reauth_id au workflow appelant pour qu’il puisse corréler le callback ultérieur.

Routé depuis le Telegram Orchestrator quand callback_data commence par codex_reauth_. Chaîne :

  1. Execute Workflow Trigger — reçoit chatId, messageId, callbackData, reauthId.
  2. Answer Callback — ferme le spinner Telegram immédiatement.
  3. Switch Actiondone vs cancel.
  4. Branche doneCheck Reauth Status (GET /api/codex/reauth/{id}/status) → Format Done Result.
  5. Branche cancelCancel Reauth Session (DELETE /api/codex/reauth/{id}) → Format Cancel Result.
  6. Convergence sur Edit Original Message (Telegram edit) qui remplace le prompt par le résultat.

Quand le provider Codex (cli-ollama/app/services/providers/codex.py) émet un événement de progression, il fait un POST vers http://n8n:5678/webhook/codex-progress avec :

{
"chatId": "5883063462",
"messageId": 12345,
"sessionId": "tg_xxx",
"progressText": "Reading 3 files...",
"isFinal": false
}

Chaîne du handler :

  1. Webhook Trigger (path codex-progress).
  2. Parse Body — extrait chatId, messageId, progressText.
  3. DT Get Buffer — Data Table indexée par messageId (état de l’édition).
  4. IF Buffer Exists — première progression ou suite ?
  5. Code Decide — décide entre edit (append au buffer), split (nouveau message si > limite Telegram) ou skip.
  6. IF Should Edit / IF Need Split — routage selon la décision.
  7. Edit Message (Telegram) ou Send New Message.
  8. Prep DT Update + DT Update Buffer — persiste le nouvel état pour la prochaine progression.

Le buffer évite l’enchaînement d’éditions Telegram bloquant (rate-limit) et permet l’effet « live » sans saturer l’API.

SurfaceProtection
/api/codex/*Endpoint interne du réseau ai-internal, non exposé via Caddy
/webhook/codex-progressWebhook N8N interne, bloqué par Caddy depuis l’extérieur
Spawn codex login --device-authExécuté dans le conteneur cli-ollama avec ~/.codex isolé du host
Session reauth TTL600 secondes — au-delà le subprocess est tué automatiquement

LimiteImpactMitigation
Watchdog mono-instanceUne seule installation Codex surveilléeSuffisant pour un usage solo VPS
Pas de re-auth automatiqueL’utilisateur doit toujours cliquerSécurité OAuth : le device-code exige une interaction humaine
Buffer DT non shardedUne seule conversation Codex active recommandéePour multi-utilisateur, partitionner par chatId + messageId
Pas de métrique PrometheusPas de dashboard Grafana sur la santé CodexTODO : exporter codex_auth_age_seconds depuis CLI Ollama
Cancel best-effortSi le subprocess est déjà bloqué sur stdin, le SIGTERM peut prendre quelques secondesTTL 600s garantit la libération

Si plusieurs providers à surveiller :

  • Généraliser le Watchdog en AI Auth Watchdog paramétré (provider=codex|gemini|claude)
  • Endpoints unifiés /api/auth/status?provider=...
  • Un cron unique pour tous les providers

Si besoin de pré-auth proactif :

  • Tâche cron à J-1 qui démarre déjà la session device-auth et envoie le code en avance
  • L’utilisateur prépare la re-auth sans urgence

Si volume de progressions explose :

  • Throttle côté provider (1 update toutes les 2s minimum)
  • Aggrégation Redis (clé progress:{messageId}) puis flush périodique
  • Sortie alternative ntfy pour les longs runs en arrière-plan

Si multi-utilisateur :

  • Data Table codex_sessions indexée par chatId
  • Chaque utilisateur a son propre auth.json (impossible avec le CLI actuel)
  • Workaround : un compte Codex partagé + traçabilité par session_id Redis