Chat

Chatcompletions

De Chat Completions API van OpenAI, voor elk tekstmodel: dezelfde verzoeken en antwoorden, dezelfde streaming, dezelfde SDK's.

POST/v1/chat/completions

Verzoek

modelstringverplicht
Een model-ID van de modellenpagina, zoals claude-opus-5-5 of gpt-6-sol.
messagesarrayverplicht
Het gesprek: system- (of developer-), user-, assistant- en tool-berichten. content is een string, of een array van onderdelen om afbeeldingen, PDF's, audio of video toe te voegen.
streamboolean
Verstuur het antwoord als server-sent events terwijl het wordt geschreven. Zie Streaming hieronder.
stream_optionsobject
{ "include_usage": true } voegt een laatste chunk met het tokenverbruik toe.
max_completion_tokensinteger
Het maximale aantal te genereren tokens, inclusief redeneertokens. max_tokens werkt ook.
temperaturenumber
0 tot 2. Lager is gerichter, hoger geeft meer variatie. Sommige redeneermodellen negeren dit. Claude accepteert dit niet vanaf Opus 4.7 (Opus 5 en 5.5, Fable 5 en 5.1, Sonnet 5.5, Haiku 5.5), dus voor die modellen laten we het weg.
top_pnumber
Nucleus sampling, 0 tot 1. Pas dit of temperature aan, niet allebei. We laten dit weg voor dezelfde Claude-modellen, net als top_k voor die modellen en voor Muse Wonder.
stopstring | array
Tot 4 tekenreeksen waarbij het genereren stopt.
toolsarray
Functies die het model mag aanroepen. Zie Toolaanroepen hieronder.
tool_choicestring | object
auto, none, required, of een specifieke functie. Als het lab achter een model een optie weigert of negeert (een afgedwongen tool bij Claude Opus 5.5, Sonnet 5.5 en Fable 5.1; alles behalve auto bij Muse Wonder; none bij sommige Gemini-, DeepSeek Flash-, MiMo-, HY4- en MiniMax-modellen), sturen we die in een vorm waaraan het model zich houdt en vertellen we het model wat je hebt gevraagd; een op naam afgedwongen functie bieden we als enige aan.
response_formatobject
JSON-uitvoer: { "type": "json_object" }, of json_schema met een schema. Zie Gestructureerde uitvoer hieronder.
reasoning_effortstring
Hoe diep een redeneermodel nadenkt: none, minimal, low, medium, high, xhigh of max. Elk model ondersteunt een deel hiervan (zie Redeneren hieronder); bij een ander niveau wordt het dichtstbijzijnde ondersteunde niveau gebruikt. Een hoger niveau laat het model langer nadenken en kost meer uitvoertokens.
seedinteger
Reproduceerbaarheid voor zover mogelijk, voor modellen die dit ondersteunen.
modelsarray
Slimme routering voor dit verzoek: alternatieven om op volgorde te proberen als het model niet beschikbaar is. Zie Slimme routering.
Andere OpenAI-parameters gaan ongewijzigd naar het model, behalve user en metadata, die bij ons blijven. Welke parameters een model ondersteunt (tools, JSON-schema’s, redeneren), hangt af van het model, net als bij de aanbieder zelf. Met de OpenAI Python SDK stuur je models als extra_body={"models": [...]}.

Antwoord

Antwoord
{
"id": "chatcmpl-AbC123...",
"object": "chat.completion",
"created": 1790870400,
"model": "claude-opus-5-5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Here's the summary..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1204,
"completion_tokens": 312,
"total_tokens": 1516,
"prompt_tokens_details": { "cached_tokens": 1024 },
"completion_tokens_details": { "reasoning_tokens": 128 }
}
}
  • model is het model dat heeft geantwoord. Dat is het model dat je hebt gevraagd, tenzij slimme routering een alternatief heeft gebruikt.
  • Redeneermodellen kunnen reasoning_content aan het bericht toevoegen: de denkstappen van het model, als het die deelt.
  • usage is wat je in rekening wordt gebracht. cached_tokens zijn invoertokens die uit de promptcache van het model worden gelezen, gefactureerd tegen het cachetarief als het model dat heeft.

Elk antwoord bevat ook deze headers:

HeaderWaarde
x-request-idDe ID van het verzoek, zoals die in je verzoeklog staat. Vermeld deze als je contact opneemt met support.
x-zurelay-modelHet model dat heeft geantwoord.
x-zurelay-routed-fromAlleen na slimme routering: het model dat je hebt gevraagd.
x-zurelay-reasoning-effortAlleen als het verzoek een redeneerniveau opgaf: het niveau waarop het model heeft gedraaid, het dichtstbijzijnde niveau dat het ondersteunt (zie Redeneren).
x-zurelay-stoppedAlleen als het saldo of het budget van de sleutel onderweg opraakte, of als het antwoord de max_tokens bereikte die was verlaagd omdat het saldo of budget niet meer toeliet: insufficient_quota, key_budget_exceeded of key_daily_budget_exceeded. Het antwoord bevat wat er tot dan toe was geschreven, met finish_reason: "length".

Streaming

Met stream: true komt het antwoord binnen als server-sent events in het chunkformaat van OpenAI, eindigend met data: [DONE]. Elke SDK leest deze voor je.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
stream = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[
{
"role": "user",
"content": "Write a limerick about databases."
}
],
stream=True,
stream_options={
"include_usage": True
},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
  • Er wordt pas een antwoord verstuurd zodra het model zijn eerste token heeft geproduceerd, zodat je niets merkt van een nieuwe poging of een overstap naar een andere route.
  • Tijdens stille periodes (als een model tussen stappen nadenkt) worden elke 15 seconden SSE-commentaarregels (: keep-alive) verstuurd. Clients negeren ze; ze voorkomen dat proxy’s de verbinding sluiten. Duurt het eerste token langer dan 20 seconden (door een lange prompt, of een vastgelopen route die wordt vervangen), dan opent de stream alvast: de headers en keep-alive-commentaarregels komen binnen terwijl je wacht. Elke route krijgt maximaal 3 minuten om te starten (5 bij een hoog redeneerniveau) voordat de volgende wordt geprobeerd, dus stel de time-out van je client in op 10 minuten.
  • Een stream die vóór het eerste token is geopend, bevat alleen x-zurelay-model als geen ander model kan antwoorden (slimme routering uit). Een fout na het openen komt binnen als een foutevent in de stream (met dezelfde structuur als de foutbody), in plaats van een foutstatus.
  • Met include_usage bevat de laatste chunk vóór [DONE] een lege lijst voor choices en de usage.

Tools aanroepen

Beschrijf functies in tools; als het model er een wil aanroepen, antwoordt het met tool_calls in plaats van tekst. Voer de functie uit, stuur het resultaat terug als een tool-bericht met de ID van de aanroep, en het model gaat verder.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gpt-6-sol",
messages=[
{
"role": "user",
"content": "What's the weather in Lisbon right now?"
}
],
tools=[
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
}
],
)
print(response.choices[0].message.content)

Gestructureerde uitvoer

Vraag om JSON met response_format. Een json_schema dwingt modellen die dit ondersteunen om je schema te volgen; json_object vraagt om willekeurige geldige JSON (vermeld dit ook in je prompt).

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gpt-6.1-sol",
messages=[
{
"role": "user",
"content": "Extract the people: 'Ana met Ben and Chloe in Porto.'"
}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "people",
"schema": {
"type": "object",
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"names"
]
}
}
},
)
print(response.choices[0].message.content)

Redeneren

Redeneermodellen denken na voordat ze antwoorden. Stel reasoning_effort in om snelheid en kosten af te wegen tegen diepgang: een hoger niveau denkt langer na, kost meer tijd en gebruikt meer uitvoertokens. Elk model ondersteunt de niveaus die de aanbieder documenteert, van none (niet nadenken) via minimal, low, medium, high en xhigh (extra hoog) tot max; de tabel hieronder geeft ze weer. Laat je het weg, dan gebruikt het model zijn standaardniveau. Het werkt hetzelfde met elke OpenAI SDK, en je kunt elk niveau proberen in de Playground van het dashboard.

from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key="YOUR_ZURELAY_KEY")
response = client.chat.completions.create(
model="zurelay-auto",
reasoning_effort="high",
messages=[{"role": "user", "content": "How many primes are there below 1,000?"}],
)
message = response.choices[0].message
print(getattr(message, "reasoning_content", None)) # the thinking, when the model shares it
print(message.content)

Bij modellen die hun denkstappen delen, krijg je die samen met het antwoord in message.reasoning_content (bij streaming in delta.reasoning_content); sommige noemen het veld reasoning. Ze worden gefactureerd als uitvoertokens en tellen altijd mee in completion_tokens; completion_tokens_details.reasoning_tokens telt ze apart als het model dat rapporteert. Bij een hoog redeneerniveau kan het minuten duren voordat een antwoord begint, dus geef je client een ruime time-out (zie Betrouwbaarheid en time-outs).

Niveaus per model

Uit de documentatie van elke aanbieder zelf. Een niveau dat een model niet ondersteunt, wordt uitgevoerd op het dichtstbijzijnde ondersteunde niveau (bij twee even nabije niveaus het laagste; nadenken gaat alleen uit als je none stuurt), zodat één verzoek op elk model werkt, ook met slimme routering. De antwoordheader x-zurelay-reasoning-effort geeft aan welk niveau is gebruikt. Een woord dat geen niveau is, wordt geweigerd met een 400 die de niveaus van het model vermeldt.

ModelIDNiveausStandaard
Abliterated Large V2abliterated-large-v2low, high, maxmax
Claude Fable 5claude-fable-5low, medium, high, xhigh, maxhigh
Claude Fable 5.1claude-fable-5-1low, medium, high, xhigh, maxhigh
Claude Haiku 5.5claude-haiku-5-5low, medium, high, xhigh, maxmedium
Claude Opus 4.6claude-opus-4-6low, medium, high, maxUit totdat je een niveau instelt
Claude Opus 4.7claude-opus-4-7low, medium, high, xhigh, maxUit totdat je een niveau instelt
Claude Opus 4.8claude-opus-4-8low, medium, high, xhigh, maxUit totdat je een niveau instelt
Claude Opus 5claude-opus-5low, medium, high, xhigh, maxhigh
Claude Opus 5.5claude-opus-5-5low, medium, high, xhigh, maxmedium
Claude Sonnet 5.5claude-sonnet-5-5low, medium, high, xhigh, maxhigh
DeepSeek V4 Flashdeepseek-v4-flashnone, high, maxhigh
DeepSeek V4 Flash 0731deepseek-v4-flash-0731none, low, high, maxhigh
DeepSeek V4 Pro 0813deepseek-v4-pro-0813none, low, high, maxhigh
DeepSeek V4.1 Flashdeepseek-v4.1-flashnone, high, maxhigh
DeepSeek V4.1 Flash 1017deepseek-v4.1-flash-1017none, high, maxhigh
Gemini 3.1 Flash-Litegemini-3.1-flash-liteminimal, low, medium, highminimal
Gemini 3.1 Progemini-3.1-prolow, medium, highhigh
Gemini 3.5 Flash-Litegemini-3.5-flash-liteminimal, low, medium, highminimal
Gemini 3.7 Flashgemini-3.7-flashlow, medium, highmedium
Gemini 3.8 Flashgemini-3.8-flashlow, medium, highmedium
Gemini 4 Argongemini-4-argonlow, medium, highmedium
GLM-5.2glm-5.2none, high, maxmax
GLM-5.3glm-5.3low, high, maxmax
GLM-5.3 Flashglm-5.3-flashlow, high, maxmax
GLM-5.3 FlashXglm-5.3-flashxlow, high, maxmax
GPT-5.6 Lunagpt-5.6-lunanone, low, medium, high, xhigh, maxmedium
GPT-5.6 Solgpt-5.6-solnone, low, medium, high, xhigh, maxmedium
GPT-5.6 Terragpt-5.6-terranone, low, medium, high, xhigh, maxmedium
GPT-6 Astragpt-6-astralow, medium, high, xhigh, maxmedium
GPT-6 Lunagpt-6-lunanone, low, medium, high, xhigh, maxmedium
GPT-6 Solgpt-6-solnone, low, medium, high, xhigh, maxmedium
GPT-6.1 Solgpt-6.1-sollow, medium, high, xhigh, maxmedium
GPT-6.1 Terragpt-6.1-terranone, low, medium, high, xhigh, maxmedium
Grok 4.7grok-4.7low, medium, high, xhighhigh
HY4 Previewhy4-previewnone, highhigh
Kimi K2.5kimi-k2.5none, highhigh
Kimi K2.6kimi-k2.6none, highhigh
Kimi K3kimi-k3low, high, maxmax
Kimi K3.1 Prokimi-k3.1-prolow, high, maxmax
Kimi K3.1 Pro Highspeedkimi-k3.1-pro-highspeedlow, high, maxmax
MiMo V2.6 Flashmimo-v2.6-flashnone, highhigh
MiMo V2.6 Promimo-v2.6-pronone, highhigh
MiniMax M3minimax-m3none, highhigh
MiniMax M3.1 Flashminimax-m3.1-flashlow, medium, high, xhigh, maxmax
Muse Spark 1.3 Contributormuse-spark-1.3-contributorminimal, low, medium, high, xhighmedium
Muse Wondermuse-wonder-1.0minimal, low, medium, high, xhigh, maxhigh
Qwen 3.8 Flashqwen3.8-flashnone, low, medium, xhighxhigh
Qwen 3.8 Maxqwen3.8-maxnone, low, medium, xhighxhigh
Qwen 3.8 Omni Flashqwen3.8-omni-flashnone, low, medium, xhighxhigh
Stap 5 Previewstep-5-previewlow, medium, highmedium
Zurelay Autozurelay-autonone, minimal, low, medium, high, xhigh, maxUit totdat je een niveau instelt
MiniMax M2.5minimax-m2.5Niets in te stellenDenkt altijd na
Claude Haiku 4.5claude-haiku-4-5Geen (een denkbudget in Anthropic-formaat)Uit
Ministral 3 14Bministral-3-14bGeenUit
Ministral 3 3Bministral-3-3bGeenUit

Hoe Claude nadenkt

Via dit endpoint accepteert Claude reasoning_effort net als elk ander model: low, medium, high, xhigh of max (Opus 4.6 heeft geen xhigh). In het eigen formaat van Anthropic denkt Claude adaptief op een bepaald niveau: stuur thinking: { type: "adaptive", display: "summarized" } met output_config: { effort: "xhigh" } en lees de denkblokken. Zie Anthropic Messages.

Vragen, of ontbreekt er iets? Vraag het ons supportteam en je krijgt antwoord per e-mail, meestal binnen een minuut.