Jobs asynchrones
Exécute une chat completion en tâche de fond : la requête est acceptée immédiatement (202 + identifiant job_…), traitée par nos workers, et le résultat se récupère par polling. C'est la voie recommandée pour toute génération susceptible de dépasser ~100 secondes.
Principe#principe
En mode synchrone non streamé, l'infrastructure coupe toute requête restée ~100 s sans octet transmis (erreur 524) — typiquement une génération longue avec effort: high ou une sortie volumineuse. Le mode background découple la soumission de l'exécution :
- 1.
POST /v1/chat/completionsavec"background": true→ réponse immédiate202avec unjob_…. - 2. Le job est exécuté en arrière-plan, avec le même timeout que le mode synchrone (600 s par défaut).
- 3.
GET /v1/jobs/{id}→ statut, puis résultat complet (shapechat.completionidentique au synchrone) une fois terminé.
Soumission (background)#soumission
Tous les paramètres de Chat completions s'appliquent — seuls changent :
| Champ | Description |
|---|---|
background boolean requis | Passe la requête en mode asynchrone. Tous les autres paramètres de chat.completions (model, messages, effort, max_tokens…) restent valides. ex. true |
stream boolean | Interdit en mode background (400 invalid_request) : un job asynchrone se récupère par polling, pas en SSE. |
curl https://ai.3gks.cloud/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-3gk-7XQp4kL8…" \ -d '{ "model": "3gk-llm", "messages": [ {"role": "user", "content": "Analyse ce dossier complet : …"} ], "effort": "high", "max_tokens": 4096, "background": true }'
Récupérer le résultat#polling
Tant que le job est queued ou running, la réponse ne contient ni result ni error. Une fois succeeded, result contient la complétion complète — champs choices, usage, reasoning identiques au mode synchrone. Cadence conseillée : toutes les 2 à 5 s, avec backoff si vos jobs durent plusieurs minutes.
curl https://ai.3gks.cloud/v1/jobs/job_a1b2c3d4e5f60718 \ -H "Authorization: Bearer sk-3gk-7XQp4kL8…"
status: "failed" avec un objet error au format OpenAI (message, type, code). Les erreurs HTTP du polling lui-même se limitent à 401/404. Lister ses jobs#liste
| Champ | Description |
|---|---|
limit integer · 1 → 100 défaut 20 | Nombre de jobs renvoyés (les plus récents d'abord). |
status "queued" | "running" | "succeeded" | "failed" | Filtre optionnel sur le statut. |
Renvoie { object: "list", data: [ … ] } — les jobs du compte, du plus récent au plus ancien, sans le champ result (récupérez-le job par job).
Cycle de vie & statuts#statuts
| status | Signification |
|---|---|
queued | Accepté, en attente d'un worker. |
running | Génération en cours (started_at renseigné). |
succeeded | Terminé — result disponible sur le GET unitaire. |
failed | Échec — détail dans error (format OpenAI). |
failed. Exemples#exemples
import time import httpx BASE = "https://ai.3gks.cloud/v1" HEADERS = {"Authorization": "Bearer sk-3gk-7XQp4kL8…"} # 1. Soumission — réponse immédiate (202) job = httpx.post(f"{BASE}/chat/completions", headers=HEADERS, json={ "model": "3gk-llm", "messages": [{"role": "user", "content": "Analyse ce dossier : …"}], "background": True, }).json() # 2. Polling — 3 s d'intervalle, à adapter à vos durées while True: state = httpx.get(f"{BASE}/jobs/{job['id']}", headers=HEADERS).json() if state["status"] in ("succeeded", "failed"): break time.sleep(3) if state["status"] == "succeeded": print(state["result"]["choices"][0]["message"]["content"]) else: print("Échec :", state["error"]["message"])
Codes de réponse#status
background: true).result si terminé).stream et background combinés, ou paramètre de liste invalide.Pour le détail du format d'erreur, voir Codes d'erreur.
