Aller au contenu principal

Transport HTTP+SSE

Le serveur ACP d'iac-code prend en charge deux modes de transport. Le transport Stdio par défaut communique via l'entrée/sortie standard et est idéal pour les intégrations IDE locales. Le transport HTTP+SSE expose un point de terminaison réseau et diffuse les réponses via Server-Sent Events, ce qui le rend adapté aux déploiements distants, aux environnements à équilibrage de charge et à l'accès multi-clients.

Pourquoi HTTP+SSE

Le Stdio présente des limitations inhérentes :

  • Nécessite que le processus serveur soit un enfant direct du client -- pas d'accès distant.
  • La gestion bloquante des processus rend difficile de servir plusieurs clients simultanément.
  • Incompatible avec les proxys réseau, les équilibreurs de charge ou les déploiements conteneurisés.

HTTP+SSE répond à ces contraintes :

  • Compatible réseau -- accessible depuis toute machine pouvant atteindre le point de terminaison.
  • Multi-clients -- chaque client obtient une connexion isolée avec son propre flux d'événements.
  • Prêt pour l'infrastructure -- fonctionne derrière des proxys inverses, dans des conteneurs, et avec les outils de surveillance HTTP standard.
  • Intégration facile -- tout client HTTP (curl, fetch, SDK) peut interagir avec le serveur.

Démarrage du serveur HTTP

# Default port 8765
iac-code acp --transport http

# Custom port
iac-code acp --transport http --port 9090

Le serveur utilise Starlette comme framework ASGI et s'exécute sur Uvicorn.

Routes

Toutes les routes sont servies au chemin /acp. La méthode HTTP détermine l'opération.

POST /acp

Envoyer une requête JSON-RPC au serveur.

  • initialize -- Crée une nouvelle connexion et retourne la réponse JSON-RPC complète directement. La réponse inclut un en-tête Acp-Connection-Id.
  • Toutes les autres méthodes -- Nécessite un en-tête Acp-Connection-Id valide. Retourne 202 Accepted immédiatement ; le résultat réel est livré de manière asynchrone via le flux SSE.

GET /acp

Ouvre un flux Server-Sent Events pour recevoir les réponses et notifications.

  • Nécessite l'en-tête Acp-Connection-Id.
  • Les événements ont le type message avec la réponse/notification JSON-RPC comme champ data.
  • Le flux inclut les champs id et retry pour la reconnexion automatique.

DELETE /acp

Ferme la connexion et libère toutes les ressources associées.

  • Nécessite l'en-tête Acp-Connection-Id.
  • Retourne 200 OK.

Identifiant de connexion

L'identifiant de connexion lie les requêtes d'un client à son flux d'événements SSE.

  1. Le client envoie un POST /acp avec la méthode initialize.
  2. Le serveur répond avec le résultat d'initialisation et un en-tête de réponse Acp-Connection-Id contenant un UUID.
  3. Toutes les requêtes suivantes (POST, GET, DELETE) doivent inclure l'en-tête de requête Acp-Connection-Id avec cette valeur.
  4. Chaque identifiant de connexion correspond à une session d'agent ACP indépendante avec sa propre file d'événements.

Si une requête référence un identifiant de connexion manquant ou invalide, le serveur retourne 400 Bad Request.

Authentification

Le serveur prend en charge l'authentification optionnelle par jeton Bearer via la variable d'environnement IACCODE_ACP_HTTP_TOKEN.

# Set the token before starting the server
export IACCODE_ACP_HTTP_TOKEN=your-secret-token
iac-code acp --transport http

Lorsqu'il est défini, chaque requête doit inclure :

Authorization: Bearer your-secret-token
ScénarioComportement
Jeton non définiAucune authentification requise (adapté au développement local)
Jeton défini, en-tête correspondantLa requête se poursuit normalement
Jeton défini, en-tête manquant/incorrect401 Unauthorized retourné

Flux de travail complet

Voici une interaction complète utilisant curl :

# Step 1: Initialize — creates a connection and returns the Connection ID
CONN_ID=$(curl -s -D - -X POST http://localhost:8765/acp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1,"capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}' \
| grep -i 'acp-connection-id' | awk '{print $2}' | tr -d '\r')

echo "Connection ID: $CONN_ID"

# Step 2: Open the SSE stream (run in background)
curl -N http://localhost:8765/acp \
-H "Acp-Connection-Id: $CONN_ID" &
SSE_PID=$!

# Step 3: Create a session
curl -X POST http://localhost:8765/acp \
-H "Content-Type: application/json" \
-H "Acp-Connection-Id: $CONN_ID" \
-d '{"jsonrpc":"2.0","id":2,"method":"session/new","params":{"cwd":"/workspace"}}'

# Step 4: Send a prompt
curl -X POST http://localhost:8765/acp \
-H "Content-Type: application/json" \
-H "Acp-Connection-Id: $CONN_ID" \
-d '{"jsonrpc":"2.0","id":3,"method":"session/prompt","params":{"sessionId":"...","prompt":[{"type":"text","text":"Hello"}]}}'

# Step 5: Close the connection
curl -X DELETE http://localhost:8765/acp \
-H "Acp-Connection-Id: $CONN_ID"

# Clean up background SSE process
kill $SSE_PID 2>/dev/null
Astuce

La réponse initialize est retournée de manière synchrone (dans un délai de 30 secondes). Toutes les réponses suivantes arrivent exclusivement via le flux SSE ouvert à l'étape 2.