Chat Completions
POST /v1/chat/completions accepteert een gesprek en geeft het volgende bericht van het model terug in het OpenAI Chat Completions-formaat. Gebruik het vanuit elke OpenAI SDK of via gewone HTTP; deze pagina is de referentie per veld.
POST https://api.shannon-ai.com/v1/chat/completions
De kleinste aanvraag bestaat uit een model-id en één gebruikersbericht.
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."}]
}' Het antwoord is één JSON-object:
{
"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
}
} Headers
Request-headers
| Header | Waarde | Beschrijving |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Je API-sleutel. x-api-key: YOUR_API_KEY wordt op elk endpoint in plaats daarvan geaccepteerd. |
Content-Type | application/json | Verplicht. Elke andere waarde geeft 415 terug. |
x-request-id | Optioneel. Je eigen id voor de aanvraag. Hij komt ongewijzigd terug in het antwoord. |
Antwoordheaders
| Header | Beschrijving |
|---|---|
x-request-id | Op elk antwoord, ook bij fouten en streams: de waarde die je hebt meegestuurd, of 12 hexadecimale tekens als je niets hebt meegestuurd. Vermeld hem als je een probleem meldt. |
content-type | application/json, of text/event-stream als stream true is. |
Request-velden
Alleen messages is verplicht. De kolom Toegepast door noemt de modellen waarop een veld het antwoord verandert. De gehoste open-weight modellen zijn de twaalf id's uit de modellijst; de Shannon 3-familie is shannon-3, shannon-3-pro, shannon-3.1 en shannon-3.1-pro. Modellen en prijzen
| Veld | Type | Standaard | Beschrijving | Toegepast door |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Het model dat antwoordt: een id uit de modellijst. Stuur het mee met elke aanvraag. Hoofdletters maken niet uit. Een id dat niet is gepubliceerd, geeft 400 unknown model terug. | Alle modellen |
messages | array | Verplicht. Het gesprek, oudste bericht eerst. Zie Berichten hieronder. | Alle modellen | |
stream | boolean | false | true stuurt het antwoord als server-sent events terwijl het wordt geschreven. | Alle modellen |
max_tokens | integer | 4096 | Bovengrens van het antwoord, in tokens. Een waarde buiten 1 tot 65,536 wordt naar dat bereik verplaatst. Het is ook het bedrag dat van je saldo wordt gereserveerd zolang de aanvraag loopt. Zie Outputlengte hieronder. | Gehoste open-weight modellen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Hetzelfde als max_tokens. Als beide worden meegestuurd, wordt max_tokens gebruikt. | Gehoste open-weight modellen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Sampling-temperatuur. Op de gehoste open-weight modellen is de standaardwaarde 1 en blijven waarden tussen 0 en 2. | Gehoste open-weight modellen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Nucleus sampling. Waarden blijven tussen 0 en 1. | Gehoste open-weight modellen |
seed | integer | Seed van de sampler, een willekeurig geheel getal. Zonder seed wordt hij afgeleid van het model en het gesprek, dus dezelfde aanvraag die twee keer wordt verstuurd, gebruikt dezelfde seed. | Gehoste open-weight modellen | |
stop | string | array | Een string of een array van strings. Maximaal 4 worden gebruikt. Het antwoord eindigt vóór de eerste die voorkomt; de stoptekst zelf wordt niet teruggegeven. | Gehoste open-weight modellen | |
reasoning_effort | string | high | Hoeveel het model redeneert voordat het antwoordt: off, low, medium of high. none en minimal betekenen off, default betekent medium, max betekent high. Elke andere waarde geeft 400 terug. | Gehoste open-weight modellen |
reasoning | object | Dezelfde instelling in objectvorm: {"effort": "low"}. Als beide worden meegestuurd, wordt reasoning_effort gebruikt. | Gehoste open-weight modellen | |
tools | array | De functies die het model mag aanroepen, elk als {"type": "function", "function": {"name", "description", "parameters"}}. De calls van het model komen terug in tool_calls; jouw code voert ze uit. | Alle modellen | |
tool_choice | string | object | auto | "auto" laat het model beslissen. "required" laat het een tool aanroepen. {"type": "function", "function": {"name": "…"}} laat het die tool aanroepen. | Gehoste open-weight modellen |
response_format | object | {"type": "json_object"} voor een JSON-antwoord, of {"type": "json_schema", "json_schema": {…}} voor een antwoord dat jouw schema volgt. | Alle Shannon-tiers; gehoste open-weight modellen zoals per id vermeld | |
web_search | boolean | false | true laat het model het web doorzoeken voordat het antwoordt. | shannon-1.6-*, shannon-2-*, Shannon 3-familie |
Andere OpenAI-velden, zoals n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store en prompt_cache_key, worden geaccepteerd zodat bestaande clientcode ongewijzigd draait. Ze veranderen het antwoord niet: er is altijd één choice, en een stream eindigt altijd met usage.
Een veld met het verkeerde JSON-type, bijvoorbeeld "max_tokens": "100", geeft 422 terug. Een aanvraag zonder messages ook.
Tools, gestructureerde output, reasoning en web search hebben elk een eigen pagina: Function calling, Gestructureerde outputs, Reasoning effort, Ingebouwde webzoekopdracht.
Een aanvraag met opties
Deze aanvraag stelt een systeembericht, de samplingvelden en de reasoning effort in. Ze gebruikt een gehost open-weight model, dat ze allemaal toepast.
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"
}' Het antwoord heeft dezelfde vorm als hierboven. De usage ervan voegt op de gehoste open-weight modellen twee details toe: de prompttokens die uit de cache zijn gelezen en de tokens die aan reasoning zijn besteed.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Outputlengte
max_tokens doet twee dingen. Ten eerste is het het aantal tokens dat van je saldo wordt gereserveerd als de aanvraag begint. Zodra het antwoord compleet is, wordt dat bedrag vervangen door de tokens die de aanvraag heeft gebruikt. Als max_tokens groter is dan wat er van je saldo over is, geeft de aanvraag 429 Quota exceeded terug, ook als het antwoord zelf had gepast. Stuur een lagere max_tokens om minder te reserveren.
shannon-coder-1 wordt op dit endpoint anders geteld: elke aanvraag is een van de Shannon Coder-calls van je plan, en er worden geen tokens voor gereserveerd. Limieten en saldo
Ten tweede beperkt het de lengte van het antwoord op deze modellen:
| Modellen | Wat max_tokens doet |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Het antwoord stopt zodra het de limiet bereikt. Een stream eindigt dan met finish_reason length. |
| Gehoste open-weight modellen | De antwoordtekst stopt bij max_tokens. Reasoning telt hier niet voor mee. Waarden onder 256 werken als 256. |
Zonder max_tokens of max_completion_tokens is de waarde 4,096. Op shannon-coder-1 is dat 65,536.
Berichten
Elk bericht is een object met een role en een content. content is een string, of een array van onderdelen als het bericht meer dan tekst bevat.
| Rol | Beschrijving | Toegepast door |
|---|---|---|
system | Instructies voor het model. Zet het eerst. Op de Shannon-tiers wordt het eerste system-bericht gebruikt. | Gehoste open-weight modellen, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Wordt gelezen als system. | Gehoste open-weight modellen |
user | Wat je vraagt. Op de Shannon-tiers is het laatste user-bericht de prompt en zijn de berichten ervoor de geschiedenis. | Alle modellen |
assistant | Eerdere antwoorden van het model. Behoud de tool_calls ervan als je daarna een toolresultaat verstuurt. | Alle modellen |
tool | Het resultaat van een toolcall: tool_call_id bevat het id van de call en content het resultaat als string. | Alle modellen |
Zet bij een id uit de Shannon 3-familie instructies die moeten gelden in het user-bericht.
Op de Shannon-tiers geeft een aanvraag zonder gebruikerstekst en zonder tools 400 No user message provided terug.
Contentonderdelen
| Onderdeel | Beschrijving | Beschikbaar op |
|---|---|---|
{"type": "text", "text": "…"} | Gewone tekst. | Alle modellen |
{"type": "image_url", "image_url": {"url": "…"}} | Een afbeelding, als data:-URL met base64-inhoud of als http(s)-URL. | Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro en de gehoste open-weight modellen met afbeeldingen als input |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Een document (PDF, Word, PowerPoint of Excel), als base64 of via URL. | Shannon 3-familie |
Groottes, limieten en de volledige lijst met vormen hebben een eigen pagina. Afbeeldingen en bestanden
Het antwoordobject
| Veld | Type | Beschrijving |
|---|---|---|
id | string | chatcmpl- gevolgd door 32 hexadecimale tekens. |
object | string | Altijd chat.completion. |
created | integer | Tijdstip van het antwoord, in Unix-seconden. |
model | string | Het canonieke id van het model dat antwoordde. De schrijfwijze kan afwijken van het id dat je hebt verstuurd. |
choices | array | Altijd precies één choice, met index 0. |
choices[0].message.role | string | Altijd assistant. |
choices[0].message.content | string | null | De antwoordtekst. Bij tool_calls is hij null op de Shannon-tiers; de gehoste open-weight modellen kunnen tekst naast de calls sturen. |
choices[0].message.reasoning_content | string | null | De reasoning die het model vóór het antwoord schreef, of null als er geen is. |
choices[0].message.tool_calls | array | Alleen aanwezig als het model tools aanroept. Elk item heeft een id, type function en function met de name en de arguments als JSON-string. |
choices[0].message.annotations | array | Alleen bij een aanvraag met web_search: true waarvan de zoekopdracht iets vond. Eén url_citation voor elke bron die een markering in content noemt, met url, title, start_index en end_index (de positie van de markering, geteld in tekens, het einde hoort er niet bij). |
choices[0].finish_reason | string | Waarom het antwoord eindigde. Zie Finish reasons. |
usage | object | De tokens van de aanvraag. Zie Usage. |
sources | array | Alleen bij een aanvraag met web_search: true waarvan de zoekopdracht iets vond: de resultaten die het model kreeg, elk met index, title en url. [1] in het antwoord is het item met index 1. |
Finish reasons
| finish_reason | Beschrijving |
|---|---|
stop | Het model heeft zijn antwoord afgerond, of een stop-string kwam voor. |
tool_calls | Het model roept een of meer tools aan. Voer ze uit en stuur de resultaten in tool-berichten. |
length | Het antwoord is afgekapt bij de outputlimiet. Wordt gemeld in streams van shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 en de Shannon 3-familie. |
Een antwoord dat niet wordt gestreamd, meldt stop of tool_calls.
Usage
| Veld | Type | Beschrijving | Beschikbaar op |
|---|---|---|---|
usage.prompt_tokens | integer | Inputtokens. | Alle modellen |
usage.completion_tokens | integer | Outputtokens: reasoning, antwoord en toolcalls samen. | Alle modellen |
usage.total_tokens | integer | prompt_tokens plus completion_tokens. | Alle modellen |
usage.prompt_tokens_details.cached_tokens | integer | Het deel van prompt_tokens dat uit de prompt cache is gelezen. | Gehoste open-weight modellen |
usage.completion_tokens_details.reasoning_tokens | integer | Het deel van completion_tokens dat aan reasoning is besteed. | Gehoste open-weight modellen |
Op de gehoste open-weight modellen is prompt_tokens je berichten en tooldefinities geteld met de eigen tokenizer van het model, plus de tokens van eventuele afbeeldingen. De endpoints voor tokentelling geven hetzelfde getal terug voordat je verstuurt. Tokens tellen
Op de Shannon-tiers telt prompt_tokens alles wat het model heeft gelezen om het antwoord te schrijven, dus het is groter dan alleen de tekst van je berichten.
Streaming
Met stream op true komt het antwoord binnen als chat.completion.chunk-events en eindigt het met data: [DONE]. De laatste chunk daarvoor bevat finish_reason en usage; stream_options zijn niet nodig. De chunkvormen, keep-alive-regels en fouten binnen een stream hebben een eigen pagina. Streaming
Fouten
Een fout is een JSON-object met een error-lid. De controles verlopen in deze volgorde: API-sleutel, request-body, model-id en daarna saldo. De tabel toont wat dit endpoint het vaakst teruggeeft. De volledige lijst, met wat je opnieuw moet proberen, heeft een eigen pagina. Foutafhandeling
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Type | Bericht | Wanneer |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Er is geen API-sleutel verzonden, of de sleutel is onbekend of ingetrokken. |
400 | invalid_request_error | unknown model: <id> | model is geen gepubliceerd id. |
400 | invalid_request_error | No user message provided | Shannon-tiers: de aanvraag bevat geen gebruikerstekst en geen tools. |
400 | invalid_request_error | <id> does not accept image input | Er is een afbeeldingsonderdeel verzonden naar een gehost open-weight model zonder afbeeldingen als input. |
400 | invalid_request_error | <id> does not accept response_format | response_format is verzonden naar een gehost open-weight model zonder gestructureerde output. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort bevat een waarde buiten de lijst. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages ontbreekt, of een veld heeft het verkeerde JSON-type. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens is groter dan wat er van je saldo over is. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: meer dan 120 aanvragen in één minuut op je account. |
500 | server_error | The model backend failed to answer. Please retry. | Het model gaf geen antwoord. Verstuur de aanvraag opnieuw. |
502 | api_error | The model backend failed to answer. Please retry. | Hetzelfde, op de Shannon 3-familie en de gehoste open-weight modellen. |