API publiqueJobs asynchrones

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.

stablev1202 + polling

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/completions avec "background": true → réponse immédiate 202 avec un job_….
  • 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 (shape chat.completion identique au synchrone) une fois terminé.
  • 4. DELETE /v1/jobs/{id} → annule un job encore en attente, ou efface un job terminé sans attendre la purge.
Périmètre : la clé API, pas le compte. Un job n'est visible que par la clé API qui l'a soumis. Une autre clé du même compte reçoit un 404 sur GET et DELETE /v1/jobs/{id}, et ne voit pas le job dans GET /v1/jobs : un membre à périmètre restreint ne lit jamais les prompts ni les résultats des autres clés. Pollez avec la clé de soumission.

Soumission (background)#soumission

POSThttps://ai.3gks.cloud/v1/chat/completionsauth : Bearer sk-3gk-…

Tous les paramètres de Chat completions s'appliquent — seuls changent :

ChampDescription
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.
shell
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

GEThttps://ai.3gks.cloud/v1/jobs/{id}auth : Bearer sk-3gk-…

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. Un job encore en attente passe en cancelled (avec un bloc error de code cancelled) si la clé API qui l'a soumis est révoquée ou le compte suspendu : il n'est ni exécuté ni facturé. Cadence conseillée : toutes les 2 à 5 s, avec backoff si vos jobs durent plusieurs minutes.

shell
curl https://ai.3gks.cloud/v1/jobs/job_a1b2c3d4e5f60718 \
  -H "Authorization: Bearer sk-3gk-7XQp4kL8…"
Erreurs d'exécution. Un échec côté backend (timeout 600 s, modèle indisponible…) ne se manifeste PAS en erreur HTTP au polling : le job passe en status: "failed" avec un objet error au format OpenAI (message, type, code). Les erreurs HTTP du polling lui-même se limitent à 401, 404 et 429 (cadence de polling trop élevée pour votre IP).

Annuler ou supprimer un job

DELETEhttps://ai.3gks.cloud/v1/jobs/{id}auth : Bearer sk-3gk-…

Même périmètre que le polling : seule la clé qui a soumis le job peut le supprimer (404 sinon). Le comportement dépend du statut :

  • queued → job annulé avant exécution : 200 avec { "id": "job_…", "status": "cancelled" }. Il n'est ni exécuté ni facturé, et son prompt est effacé.
  • running → 409 invalid_request : la génération est en cours, attendez la fin puis rappelez DELETE.
  • succeeded / failed / cancelled → la ligne est supprimée (requête et résultat) sans attendre la purge à 7 jours : 200 avec { "id": "job_…", "deleted": true }.

Lister ses jobs#liste

GEThttps://ai.3gks.cloud/v1/jobsauth : Bearer sk-3gk-…
ChampDescription
limit
integer · 1 → 100
défaut 20
Nombre de jobs renvoyés (les plus récents d'abord). Hors bornes ⇒ 400 invalid_request.
status
"queued" | "running" | "succeeded" | "failed" | "cancelled"
Filtre optionnel sur le statut. Toute autre valeur ⇒ 400 invalid_request.

Renvoie { object: "list", data: [ … ] } — les jobs soumis avec la clé API appelante (et non ceux du compte entier), du plus récent au plus ancien, sans le champ result (récupérez-le job par job).

Cycle de vie & statuts#statuts

statusSignification
queuedAccepté, en attente d'un worker.
runningGénération en cours (started_at renseigné).
succeededTerminé — result disponible sur le GET unitaire.
failedÉchec — détail dans error (format OpenAI).
cancelledAnnulé avant exécution — ni exécuté ni facturé. Soit par DELETE /v1/jobs/{id}, soit automatiquement si la clé qui l'a soumis est révoquée ou le compte suspendu. Un bloc error de code cancelled accompagne le statut dans les deux cas.
Rétention 7 jours. Les jobs (requête et résultat inclus) sont purgés automatiquement 7 jours après leur création — récupérez vos résultats avant. Un job resté non terminé plus de 24 h est acté failed.

Exemples#exemples

python
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

202
queued · Soumission acceptée (POST chat/completions avec background: true).
200 OK
Succès · GET /v1/jobs/{id} ou GET /v1/jobs : le JSON décrit le job (et result si terminé). Également renvoyé par DELETE /v1/jobs/{id} — { "status": "cancelled" } ou { "deleted": true }.
400
invalid_request · stream et background combinés, ou paramètre de liste invalide.
400
model_not_supported · Modèle inconnu — rejeté dès la soumission, aucun job créé.
401
auth_error · Clé absente, mal formée, révoquée ou compte suspendu.
402
insufficient_quota · Compte bloqué à la soumission (essai terminé, crédit épuisé, plafond du forfait, facture de dépassement impayée, litige de paiement). Le worker revérifie à l'exécution.
404
not_found · Job inconnu, ou soumis avec une autre clé API — y compris une autre clé de votre propre compte. Réponse identique dans les deux cas : l'existence d'un job n'est jamais révélée.
409
invalid_request · DELETE /v1/jobs/{id} sur un job running : une génération en cours ne peut être ni annulée ni supprimée avant sa fin.
413
payload_too_large · Corps de requête au-delà de la taille maximale acceptée (limite globale de la plateforme).
429
queue_full · Trop de jobs déjà en attente pour votre compte — attendez qu'ils soient traités avant d'en soumettre d'autres.
429
rate_limit_exceeded · Cadence de requêtes trop élevée pour votre adresse IP, ou nombre maximal d'appels simultanés déjà atteint pour votre compte : une soumission background prend elle aussi une place d'exécution le temps d'être enregistrée. Ralentissez et réessayez.
503
internal · File de jobs momentanément indisponible, ou tarification du service non configurée, à la soumission. Réessayez.

Pour le détail du format d'erreur, voir Codes d'erreur.