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é.

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

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).
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

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).
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é).
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.
404
not_found · Job inconnu — ou appartenant à un autre compte.
503
internal · File de jobs momentanément indisponible à la soumission. Réessayez.

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