Chat Completions
POST /v1/chat/completions prend une conversation et renvoie le message suivant du modèle au format OpenAI Chat Completions. Utilisez-le depuis n'importe quel SDK OpenAI ou en HTTP brut ; cette page est la référence champ par champ.
POST https://api.shannon-ai.com/v1/chat/completions
La plus petite requête est un id de modèle et un message utilisateur.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="shannon-3",
messages=[{"role": "user", "content": "Say hello in one sentence."}],
)
print(response.choices[0].message.content) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.chat.completions.create({
model: "shannon-3",
messages: [{ role: "user", content: "Say hello in one sentence." }],
});
console.log(response.choices[0].message.content); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [{"role": "user", "content": "Say hello in one sentence."}]
}' La réponse est un objet JSON :
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello, it is good to meet you.",
"reasoning_content": "The user wants a greeting in one sentence. Keep it short and friendly."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1184,
"completion_tokens": 46,
"total_tokens": 1230
}
} En-têtes
En-têtes de requête
| En-tête | Valeur | Description |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Votre clé API. x-api-key: YOUR_API_KEY est accepté à sa place sur chaque point de terminaison. |
Content-Type | application/json | Obligatoire. Toute autre valeur renvoie 415. |
x-request-id | Facultatif. Votre propre id pour la requête. Il revient inchangé dans la réponse. |
En-têtes de réponse
| En-tête | Description |
|---|---|
x-request-id | Sur chaque réponse, erreurs et flux compris : la valeur que vous avez envoyée, ou 12 caractères hexadécimaux si vous n'en avez envoyé aucune. Citez-la quand vous signalez un problème. |
content-type | application/json, ou text/event-stream quand stream vaut true. |
Champs de requête
Seul messages est obligatoire. La colonne Appliqué par nomme les modèles sur lesquels un champ modifie la réponse. Les modèles open-weight hébergés sont les douze ids de la liste des modèles ; la famille Shannon 3 comprend shannon-3, shannon-3-pro, shannon-3.1 et shannon-3.1-pro. Modèles et tarifs
| Champ | Type | Par défaut | Description | Appliqué par |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Le modèle qui répond : un id de la liste des modèles. Envoyez-le avec chaque requête. La correspondance ne tient pas compte de la casse. Un id non publié renvoie 400 unknown model. | Tous les modèles |
messages | array | Obligatoire. La conversation, message le plus ancien en premier. Voir Messages ci-dessous. | Tous les modèles | |
stream | boolean | false | true envoie la réponse sous forme de server-sent events pendant qu'elle est écrite. | Tous les modèles |
max_tokens | integer | 4096 | Limite supérieure de la réponse, en tokens. Une valeur hors de 1 à 65,536 est ramenée dans cette plage. C'est aussi le montant réservé sur votre solde pendant l'exécution de la requête. Voir Longueur de sortie ci-dessous. | Modèles open-weight hébergés, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Identique à max_tokens. Quand les deux sont envoyés, max_tokens est utilisé. | Modèles open-weight hébergés, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Température d'échantillonnage. Sur les modèles open-weight hébergés, la valeur par défaut est 1 et les valeurs sont maintenues entre 0 et 2. | Modèles open-weight hébergés, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Échantillonnage par noyau (nucleus sampling). Les valeurs sont maintenues entre 0 et 1. | Modèles open-weight hébergés |
seed | integer | Graine de l'échantillonneur, n'importe quel entier. Sans elle, la graine est dérivée du modèle et de la conversation : la même requête envoyée deux fois utilise donc la même graine. | Modèles open-weight hébergés | |
stop | string | array | Une chaîne ou un tableau de chaînes. Jusqu'à 4 sont utilisées. La réponse s'arrête avant la première qui apparaît ; le texte d'arrêt lui-même n'est pas renvoyé. | Modèles open-weight hébergés | |
reasoning_effort | string | high | Combien le modèle raisonne avant de répondre : off, low, medium ou high. none et minimal signifient off, default signifie medium, max signifie high. Toute autre valeur renvoie 400. | Modèles open-weight hébergés |
reasoning | object | Le même réglage sous forme d'objet : {"effort": "low"}. Quand les deux sont envoyés, reasoning_effort est utilisé. | Modèles open-weight hébergés | |
tools | array | Les fonctions que le modèle peut appeler, chacune sous la forme {"type": "function", "function": {"name", "description", "parameters"}}. Les appels du modèle reviennent dans tool_calls ; votre code les exécute. | Tous les modèles | |
tool_choice | string | object | auto | "auto" laisse le modèle décider. "required" l'oblige à appeler un outil. {"type": "function", "function": {"name": "…"}} l'oblige à appeler cet outil. | Modèles open-weight hébergés |
response_format | object | {"type": "json_object"} pour une réponse JSON, ou {"type": "json_schema", "json_schema": {…}} pour une réponse qui suit votre schéma. | Tous les niveaux Shannon ; modèles open-weight hébergés selon la liste par id | |
web_search | boolean | false | true permet au modèle de chercher sur le web avant de répondre. | shannon-1.6-*, shannon-2-*, famille Shannon 3 |
D'autres champs OpenAI, comme n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store et prompt_cache_key, sont acceptés pour que le code client existant fonctionne sans changement. Ils ne modifient pas la réponse : il y a toujours un seul choix, et un flux se termine toujours par l'utilisation.
Un champ avec un mauvais type JSON, par exemple "max_tokens": "100", renvoie 422. Une requête sans messages aussi.
Les outils, la sortie structurée, le raisonnement et la recherche web ont chacun leur propre page : Appel de fonction, Résultats structurés, Effort de raisonnement, Recherche Web intégrée.
Une requête avec des options
Cette requête définit un message système, les champs d'échantillonnage et l'effort de raisonnement. Elle utilise un modèle open-weight hébergé, qui les applique tous.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages=[
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"},
],
max_tokens=512,
temperature=0.3,
top_p=0.9,
seed=7,
stop=["\n\n"],
reasoning_effort="low",
)
message = response.choices[0].message
print(message.reasoning_content) # the reasoning
print(message.content) # the answer
print(response.usage) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.chat.completions.create({
model: "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages: [
{ role: "system", content: "You are a physics teacher. Answer in two sentences." },
{ role: "user", content: "Why is the sky blue?" },
],
max_tokens: 512,
temperature: 0.3,
top_p: 0.9,
seed: 7,
stop: ["\n\n"],
reasoning_effort: "low",
});
const message = response.choices[0].message;
console.log(message.reasoning_content); // the reasoning
console.log(message.content); // the answer
console.log(response.usage); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
"messages": [
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"}
],
"max_tokens": 512,
"temperature": 0.3,
"top_p": 0.9,
"seed": 7,
"stop": ["\n\n"],
"reasoning_effort": "low"
}' La réponse a la même forme que ci-dessus. Son usage ajoute deux détails sur les modèles open-weight hébergés : les tokens de prompt lus dans le cache et les tokens dépensés en raisonnement.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Longueur de sortie
max_tokens fait deux choses. D'abord, c'est le nombre de tokens réservés sur votre solde au début de la requête. Quand la réponse est terminée, ce montant est remplacé par les tokens que la requête a utilisés. Si max_tokens est supérieur à ce qui reste de votre solde, la requête renvoie 429 Quota exceeded même si la réponse elle-même aurait tenu. Envoyez un max_tokens plus bas pour réserver moins.
shannon-coder-1 est compté différemment sur ce point de terminaison : chaque requête est l'un des appels Shannon Coder de votre forfait, et aucun token n'est réservé pour elle. Limites et solde
Ensuite, il limite la longueur de la réponse sur ces modèles :
| Modèles | Ce que fait max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | La réponse s'arrête quand elle atteint la limite. Un flux se termine alors avec finish_reason length. |
| Modèles open-weight hébergés | Le texte de la réponse s'arrête à max_tokens. Le raisonnement n'est pas décompté. Les valeurs inférieures à 256 valent 256. |
Sans max_tokens ni max_completion_tokens, la valeur est 4,096. Sur shannon-coder-1, elle est 65,536.
Messages
Chaque message est un objet avec un role et un content. content est une chaîne, ou un tableau de parties quand le message porte plus que du texte.
| Rôle | Description | Appliqué par |
|---|---|---|
system | Instructions pour le modèle. Placez-le en premier. Sur les niveaux Shannon, c'est le premier message system qui est utilisé. | Modèles open-weight hébergés, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Lu comme system. | Modèles open-weight hébergés |
user | Ce que vous demandez. Sur les niveaux Shannon, le dernier message user est le prompt et les messages qui le précèdent sont l'historique. | Tous les modèles |
assistant | Réponses précédentes du modèle. Conservez ses tool_calls quand vous envoyez un résultat d'outil après. | Tous les modèles |
tool | Le résultat d'un appel d'outil : tool_call_id contient l'id de l'appel et content le résultat sous forme de chaîne. | Tous les modèles |
Avec un id de la famille Shannon 3, placez les instructions qui doivent être respectées dans le message user.
Sur les niveaux Shannon, une requête sans texte utilisateur et sans tools renvoie 400 No user message provided.
Parties de contenu
| Partie | Description | Disponible sur |
|---|---|---|
{"type": "text", "text": "…"} | Texte brut. | Tous les modèles |
{"type": "image_url", "image_url": {"url": "…"}} | Une image, sous forme d'URL data: avec contenu base64 ou d'URL http(s). | Famille Shannon 3, shannon-1.6-lite, shannon-1.6-pro, et les modèles open-weight hébergés qui acceptent les images en entrée |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Un document (PDF, Word, PowerPoint ou Excel), en base64 ou par URL. | Famille Shannon 3 |
Les tailles, les limites et la liste complète des formes ont leur propre page. Images et fichiers
L'objet de réponse
| Champ | Type | Description |
|---|---|---|
id | string | chatcmpl- suivi de 32 caractères hexadécimaux. |
object | string | Toujours chat.completion. |
created | integer | Heure de la réponse, en secondes Unix. |
model | string | L'id canonique du modèle qui a répondu. Son orthographe peut différer de l'id que vous avez envoyé. |
choices | array | Toujours exactement un choix, avec index 0. |
choices[0].message.role | string | Toujours assistant. |
choices[0].message.content | string | null | Le texte de la réponse. Avec tool_calls, il vaut null sur les niveaux Shannon ; les modèles open-weight hébergés peuvent envoyer du texte à côté des appels. |
choices[0].message.reasoning_content | string | null | Le raisonnement que le modèle a écrit avant la réponse, ou null s'il n'y en a pas. |
choices[0].message.tool_calls | array | Présent uniquement quand le modèle appelle des outils. Chaque entrée a un id, un type function, et function avec le name et les arguments sous forme de chaîne JSON. |
choices[0].message.annotations | array | Seulement sur une requête avec web_search: true dont la recherche a trouvé quelque chose. Un url_citation pour chaque source qu'un repère dans content nomme, avec url, title, start_index et end_index (la position du repère, comptée en caractères, fin non incluse). |
choices[0].finish_reason | string | Pourquoi la réponse s'est terminée. Voir Raisons de fin. |
usage | object | Les tokens de la requête. Voir Utilisation. |
sources | array | Seulement sur une requête avec web_search: true dont la recherche a trouvé quelque chose : les résultats remis au modèle, chacun avec index, title et url. [1] dans la réponse est l'entrée dont index vaut 1. |
Raisons de fin
| finish_reason | Description |
|---|---|
stop | Le modèle a terminé sa réponse, ou une chaîne stop est apparue. |
tool_calls | Le modèle appelle un ou plusieurs outils. Exécutez-les et envoyez les résultats dans des messages tool. |
length | La réponse a été coupée à la limite de sortie. Indiqué dans les flux de shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 et de la famille Shannon 3. |
Une réponse hors streaming indique stop ou tool_calls.
Utilisation
| Champ | Type | Description | Disponible sur |
|---|---|---|---|
usage.prompt_tokens | integer | Tokens d'entrée. | Tous les modèles |
usage.completion_tokens | integer | Tokens de sortie : raisonnement, réponse et appels d'outil ensemble. | Tous les modèles |
usage.total_tokens | integer | prompt_tokens plus completion_tokens. | Tous les modèles |
usage.prompt_tokens_details.cached_tokens | integer | La partie de prompt_tokens qui a été lue dans le cache du prompt. | Modèles open-weight hébergés |
usage.completion_tokens_details.reasoning_tokens | integer | La partie de completion_tokens qui a été dépensée en raisonnement. | Modèles open-weight hébergés |
Sur les modèles open-weight hébergés, prompt_tokens correspond à vos messages et définitions d'outils comptés avec le tokenizer propre au modèle, plus les tokens des éventuelles images. Les points de terminaison de comptage de tokens renvoient le même nombre avant l'envoi. Décompte de tokens
Sur les niveaux Shannon, prompt_tokens compte tout ce que le modèle a lu pour écrire la réponse ; il est donc supérieur au seul texte de vos messages.
Streaming
Avec stream à true, la réponse arrive sous forme d'événements chat.completion.chunk et se termine par data: [DONE]. Le dernier chunk avant celui-ci porte finish_reason et usage ; aucun stream_options n'est nécessaire. Les formes de chunk, les lignes keep-alive et les erreurs dans un flux ont leur propre page. Diffusion en continu
Erreurs
Une erreur est un objet JSON avec un membre error. Les vérifications s'exécutent dans cet ordre : clé API, corps de la requête, id du modèle, puis solde. Le tableau liste ce que ce point de terminaison renvoie le plus souvent. La liste complète, avec ce qu'il faut réessayer, a sa propre page. Gestion des erreurs
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Statut | Type | Message | Quand |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Aucune clé API n'a été envoyée, ou la clé est inconnue ou révoquée. |
400 | invalid_request_error | unknown model: <id> | model n'est pas un id publié. |
400 | invalid_request_error | No user message provided | Niveaux Shannon : la requête n'a ni texte utilisateur ni tools. |
400 | invalid_request_error | <id> does not accept image input | Une partie image a été envoyée à un modèle open-weight hébergé sans entrée image. |
400 | invalid_request_error | <id> does not accept response_format | response_format a été envoyé à un modèle open-weight hébergé sans sortie structurée. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort contient une valeur hors de la liste. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages est absent, ou un champ a un mauvais type JSON. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens est supérieur à ce qui reste de votre solde. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protection anti-flood : plus de 120 requêtes en une minute sur votre compte. |
500 | server_error | The model backend failed to answer. Please retry. | Le modèle n'a pas produit de réponse. Renvoyez la requête. |
502 | api_error | The model backend failed to answer. Please retry. | Idem, sur la famille Shannon 3 et les modèles open-weight hébergés. |