Chat completions
Génère une réponse conversationnelle à partir d'une liste de messages. Endpoint principal de la plateforme, compatible avec le format openai.chat.completions.create. Supporte le streaming SSE.
Endpoint#endpoint
openai Python et Node.js fonctionne immédiatement en pointant base_url sur notre domaine. Aucune réécriture nécessaire. Paramètres requête#params
| Champ | Description |
|---|---|
model string requis | Identifiant du modèle : <code>3gk-llm</code> (alias stable, découplé du modèle sous-jacent). La liste complète est exposée par GET /v1/models. ex. "3gk-llm" |
messages array<Message> requis | Historique de la conversation. Rôles supportés : "system", "user", "assistant", "tool". content accepte une chaîne, null, ou un tableau de parts typées — voir "Contenus multimodaux" ci-dessous. |
effort "off" | "low" | "medium" | "high" défaut "off" | Extension 3GK. Règle l'effort de raisonnement (chain-of-thought) de <code>3gk-llm</code>. Raisonnement opt-in : off par défaut (configurable côté admin). Voir le tableau dédié ci-dessous. Inconnu ⇒ 400 invalid_request. |
reasoning_effort "minimal" | "low" | "medium" | "high" | Alias standard OpenAI de effort (minimal ⇒ low). Ignoré si effort est présent (effort prime). Inconnu ⇒ 400 invalid_request. |
stream boolean défaut false | Si true, la réponse est envoyée en Server-Sent Events. Booléen STRICT : la chaîne "true" est refusée (400 invalid_request), jamais convertie. Voir Streaming SSE. |
background boolean défaut false | Extension 3GK. Si true, la requête est acceptée immédiatement (202 + identifiant job_…) et exécutée en arrière-plan ; le résultat se récupère via GET /v1/jobs/{id}. Booléen STRICT, comme stream. Incompatible avec stream (400 invalid_request). Voir Jobs asynchrones. |
temperature number · 0.0 → 2.0 défaut 0.7 | Contrôle la créativité. Valeurs basses pour des sorties déterministes, hautes pour de la variété. |
max_tokens integer défaut plafond | Budget de réponse (hors raisonnement), borné par le plafond de sortie de la plateforme. Cf. encarts "Plafond de sortie" et "Réconciliation max_tokens" ci-dessous. max_completion_tokens accepté en alias OpenAI. |
top_p number · 0.0 → 1.0 défaut 1.0 | Nucleus sampling. Alternative à temperature. |
n integer · 1 → 4 défaut 1 | Nombre de complétions générées. Plafonné à 4 : au-delà (ou en dessous de 1) ⇒ 400 invalid_request. Attention, le plafond de tokens de sortie de la plateforme s'applique PAR choix — une requête peut donc générer, et facturer, jusqu'à plafond × n tokens. |
stream_options { include_usage?: boolean } | Options de streaming. Objet STRICT : seule la clé include_usage est acceptée, toute autre clé ⇒ 400 invalid_request. |
stop string | string[] | Séquences qui interrompent la génération. |
seed integer | Améliore la reproductibilité (best-effort, non garanti). |
user string | Identifiant opaque de l'utilisateur final. Utile pour le débogage côté admin. |
top_k integer · -1 → 1000 | Extension du moteur d'inférence, relayée <strong>sur la route nominale vLLM uniquement</strong> (jamais vers le backend de repli). <code>-1</code> = désactivé. Hors bornes ⇒ 400 invalid_request. Sans effet sur le coût. |
min_p number · 0.0 → 1.0 | Extension du moteur d'inférence, relayée <strong>sur la route nominale vLLM uniquement</strong>. Probabilité minimale relative d'un token. Hors bornes ⇒ 400 invalid_request. Sans effet sur le coût. |
repetition_penalty number · > 0 et ≤ 2 | Extension du moteur d'inférence, relayée <strong>sur la route nominale vLLM uniquement</strong>. Hors bornes (dont 0) ⇒ 400 invalid_request. Sans effet sur le coût. |
parallel_tool_calls boolean | Standard OpenAI, relayé <strong>sur la route nominale vLLM uniquement</strong>. <code>false</code> interdit les appels d'outils en parallèle. Une valeur non booléenne ⇒ 400 invalid_request ; <code>null</code> est accepté et traité comme une absence. |
max_completion_tokens, stop, presence_penalty, frequency_penalty, logit_bias, logprobs, top_logprobs, response_format, tools, tool_choice. Leur comportement dépend du modèle cible. S'y ajoutent quatre réglages d'échantillonnage sans effet sur le coût — top_k, min_p, repetition_penalty et parallel_tool_calls — décrits dans le tableau ci-dessus et relayés sur la route nominale vLLM uniquement : ils sont validés (une valeur hors bornes est refusée en 400 invalid_request, elle n'est pas ignorée). Tout autre paramètre est accepté sans erreur mais silencieusement retiré avant l'envoi — y compris les extensions propres au moteur d'inférence (best_of, min_tokens, ignore_eos, guided_json, chat_template_kwargs, vllm_xargs…), dont le coût de génération n'est pas bornable. Ne comptez donc jamais sur un passthrough intégral : vérifiez que le paramètre figure bien dans cette liste. Contenus multimodaux
Le champ content d'un message peut être un tableau de parts. Trois types sont acceptés, tous en ligne : text, image_url et input_audio. Tout autre type (input_image, image_embeds, prompt_embeds…) est refusé en 400 invalid_request.
text— champtext(chaîne) obligatoire.image_url—image_url.urldoit être une data URL base64 (data:image/png|jpeg|webp|gif;base64,…). Les URLhttp(s)distantes sont refusées : le backend d'inférence les téléchargerait depuis son propre réseau. Encodez l'image côté client.detailoptionnel :auto,lowouhigh.input_audio—input_audio.dataen base64 (jamais une URL) etinput_audio.formatàwavoump3.
Le poids total du corps reste soumis à la limite de taille de la plateforme (413 payload_too_large) : une image base64 pèse ~33 % de plus que le binaire.
524). Deux parades : le streaming SSE (tant que le premier token arrive vite), ou le mode asynchrone background: true — soumission immédiate puis récupération par polling. Voir Jobs asynchrones. Paliers d'effort
Le paramètre effort contrôle l'effort de raisonnement chain-of-thought de 3gk-llm (modèle à raisonnement). Le client choisit un palier — le budget de tokens raisonnement est figé côté gateway et ne peut pas être réglé directement. Le raisonnement est opt-in : sans effort ni reasoning_effort, le palier appliqué est off (défaut configurable côté admin).
| effort | Thinking | Budget raisonnement |
|---|---|---|
off (défaut) | désactivé | — |
low | activé | 1 024 tokens |
medium | activé | 4 096 tokens |
high | activé | 16 384 tokens |
Vous pouvez aussi utiliser le paramètre standard OpenAI reasoning_effort (minimal | low | medium | high) pour réactiver le raisonnement sans le champ propriétaire effort : minimal est mappé sur low. Si les deux sont fournis, effort prime.
Plafond de sortie
La plateforme borne le budget de réponse de chaque requête. Ce plafond vaut aujourd'hui 4 096 tokens ; il est administrable et peut évoluer, ne le codez pas en dur.
- Un
max_tokens(oumax_completion_tokens) supérieur au plafond est ramené au plafond, sans erreur : la requête est servie, mais la réponse s'arrêtera surfinish_reason: "length"bien avant la valeur demandée. - Une valeur inférieure ou égale au plafond est appliquée telle quelle.
- Si vous n'envoyez ni l'un ni l'autre, le plafond est imposé comme budget de réponse.
- Le plafond s'applique par choix de complétion : avec
n > 1, la sortie totale peut atteindre plafond ×n.
max_tokens relayé au backend : avec effort: high, celui-ci vaut 16 384 (raisonnement) + 4 096 (réponse) = 20 480. Ces 16 384 tokens supplémentaires sont consommés par le raisonnement, qui n'est pas la réponse. Pour produire un texte plus long que le plafond, il faut découper la demande en plusieurs requêtes — augmenter l'effort ne sert à rien, et peut même raccourcir la réponse si le modèle épuise son budget en réflexion. max_tokens est ramené au plafond, la réponse porte l'en-tête X-3GK-Output-Tokens-Capped, dont la valeur est le plafond appliqué. Son absence signifie que votre budget a été respecté. Un finish_reason: "length" sans cet en-tête est donc une réponse tronquée sur la limite que vous avez vous-même fixée. Réconciliation max_tokens
Côté backend, max_tokens plafonne le total raisonnement + réponse. Pour vous éviter de soustraire vous-même le budget de raisonnement, la gateway traite votre max_tokens comme le budget de réponse uniquement et ajoute le budget de raisonnement avant de relayer :
- Si
max_tokensabsent : le plafond de sortie est imposé (cf. ci-dessous). - Pour
effort: off: pas d'ajout, on relaie votre valeur une fois plafonnée, et le raisonnement est désactivé en amont (enable_thinking=false). max_completion_tokens(alias OpenAI récent) prime surmax_tokenssi les deux sont fournis.- Cette réconciliation s'applique uniquement aux modèles qui supportent le thinking (c'est le cas de
3gk-llm). Pour les autres, votremax_tokenspasse inchangé.
effort est honoré de la même façon : activation/désactivation du raisonnement (enable_thinking) et réconciliation de max_tokens identiques. Seule réserve : le plafonnement strict du raisonnement (thinking_token_budget) n'est pas garanti côté Scaleway — la longueur du raisonnement peut donc varier, mais votre budget de réponse reste préservé. X-3GK-Backend (primary = infrastructure nominale, fallback = secours) et X-3GK-Resolved-Model indiquant l'identifiant public du modèle servi. Utile pour vérifier qu'une requête est bien servie en nominal plutôt qu'en secours. Exemples#exemples
from openai import OpenAI client = OpenAI( base_url="https://ai.3gks.cloud/v1", api_key="sk-3gk-7XQp4kL8…", ) response = client.chat.completions.create( model="3gk-llm", messages=[ {"role": "system", "content": "Tu es un assistant pour courtier en assurance."}, {"role": "user", "content": "Résume ce contrat : …"}, ], temperature=0.3, max_tokens=512, ) print(response.choices[0].message.content)
Format de réponse#response
Réponse JSON conforme à l'API OpenAI. L'identifiant id est préfixé 3gk-cmpl- suivi de 24 caractères aléatoires — utilisez-le pour corréler avec les logs admin en cas de support.
{
"id": "3gk-cmpl-7XQp4kL8mNfRtQzVa2bC3dE4",
"object": "chat.completion",
"created": 1715761712,
"model": "3gk-llm",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Le contrat couvre la responsabilité civile…"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 412,
"completion_tokens": 248,
"total_tokens": 660
}
} Sur les paliers low / medium / high, le champ choices[].message.reasoning et usage.completion_tokens_details.reasoning_tokens sont également retournés. En effort: off, ces champs sont strippés.
Codes de réponse#status
choices.background: true : job accepté, réponse {id: "job_…", status: "queued"}. Résultat via GET /v1/jobs/{id}.model/messages absent, stream ou background non booléen, n hors de 1..4, part de contenu non supportée ou image en URL distante, stream + background combinés.3gk-llm ou consultez GET /v1/models.tools comprises). Raccourcissez le contexte.Pour le détail du format d'erreur et des stratégies de retry, voir Codes d'erreur.
Routage & fallback#routing
Les requêtes chat.completions sont routées par défaut vers nos instances vLLM locales (GPU hébergés en France). Si l'administrateur a configuré un mode fallback ou auto et que les instances vLLM sont indisponibles, le trafic bascule vers Scaleway Generative APIs (Paris, FR). Aucune donnée ne sort du territoire français.
502 / 504) sans retry automatique. Pour basculer en Scaleway, l'administrateur doit activer le mode auto ou forceFallback. 