Chat

Chat Completions

Die Chat Completions API von OpenAI für jedes Textmodell: gleiche Anfragen und Antworten, gleiches Streaming, gleiche SDKs.

POST/v1/chat/completions

Anfrage

modelstringerforderlich
Eine Modell-ID von der Modellseite, zum Beispiel claude-opus-5-5 oder gpt-6-sol.
messagesarrayerforderlich
Die Unterhaltung: Nachrichten mit system (oder developer), user, assistant und tool. content ist ein String oder ein Array aus Teilen, um Bilder, PDFs, Audio oder Video hinzuzufügen.
streamboolean
Sende die Antwort beim Generieren als Server-Sent Events. Mehr dazu unter Streaming.
stream_optionsobject
{ "include_usage": true } fügt am Ende einen Chunk mit dem Tokenverbrauch hinzu.
max_completion_tokensinteger
Die maximale Anzahl generierter Tokens, einschließlich Reasoning. max_tokens funktioniert auch.
temperaturenumber
0 bis 2. Niedrigere Werte liefern fokussiertere, höhere vielfältigere Antworten. Manche Reasoning-Modelle ignorieren den Wert. Claude ab Opus 4.7 (Opus 5 und 5.5, Fable 5 und 5.1, Sonnet 5.5, Haiku 5.5) unterstützt ihn nicht, daher lassen wir ihn für diese Modelle weg.
top_pnumber
Nucleus Sampling, 0 bis 1. Ändere diesen Wert oder temperature, nicht beides. Wird für dieselben Claude-Modelle weggelassen, ebenso wie top_k für sie und für Muse Wonder.
stopstring | array
Bis zu 4 Sequenzen, bei denen die Generierung stoppt.
toolsarray
Funktionen, die das Modell aufrufen kann. Mehr dazu unter Tool Calling.
tool_choicestring | object
auto, none, required oder eine bestimmte Funktion. Wenn das Labor eines Modells eine Option ablehnt oder ignoriert (ein erzwungenes Tool bei Claude Opus 5.5, Sonnet 5.5 und Fable 5.1; alles außer auto bei Muse Wonder; none bei manchen Modellen von Gemini, DeepSeek Flash, MiMo, HY4 und MiniMax), senden wir sie in einer Form, an die sich das Modell hält, und teilen ihm mit, was du angefordert hast; eine namentlich erzwungene Funktion wird als einzige angeboten.
response_formatobject
JSON-Ausgabe: { "type": "json_object" } oder json_schema mit einem Schema. Mehr dazu unter Strukturierte Ausgabe.
reasoning_effortstring
Wie intensiv ein Reasoning-Modell nachdenkt: none, minimal, low, medium, high, xhigh oder max. Jedes Modell unterstützt einen Teil dieser Stufen (siehe Reasoning); bei einer anderen Stufe wird die nächstgelegene unterstützte verwendet. Höhere Stufen denken länger nach und verbrauchen mehr Ausgabe-Tokens.
seedinteger
Bestmögliche Reproduzierbarkeit für Modelle, die sie unterstützen.
modelsarray
Smart Routing für diese Anfrage: Alternativen, die der Reihe nach versucht werden, wenn das Modell nicht verfügbar ist. Siehe Smart Routing.
Andere OpenAI-Parameter werden unverändert an das Modell weitergegeben, außer user und metadata; die bleiben bei uns. Welche davon ein Modell beachtet (Tools, JSON-Schemas, Reasoning), hängt vom Modell ab – genau wie beim jeweiligen Labor. Sende mit dem OpenAI Python SDK models als extra_body={"models": [...]}.

Antwort

Antwort
{
"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 ist das Modell, das geantwortet hat. Es ist das angeforderte Modell, sofern nicht per Smart Routing eine Alternative geantwortet hat.
  • Reasoning-Modelle können der Nachricht reasoning_content hinzufügen: ihre Gedankengänge, sofern sie diese teilen.
  • usage ist die Grundlage deiner Abrechnung. cached_tokens sind Eingabe-Tokens aus dem Prompt-Cache des Modells. Falls das Modell einen Cache-Preis hat, werden sie zu diesem Preis abgerechnet.

Jede Antwort enthält außerdem diese Header:

HeaderWert
x-request-idDie ID der Anfrage, wie sie in deinem Anfrageprotokoll steht. Gib sie beim Support an.
x-zurelay-modelDas Modell, das geantwortet hat.
x-zurelay-routed-fromNur nach Smart Routing: das Modell, das du angefordert hast.
x-zurelay-reasoning-effortNur wenn für die Anfrage eine Reasoning-Stufe festgelegt wurde: die Stufe, mit der das Modell gearbeitet hat – die nächstgelegene unterstützte Stufe (siehe Reasoning).
x-zurelay-stoppedNur wenn das Guthaben oder das Budget des Schlüssels während der Antwort aufgebraucht wurde oder die Antwort den max_tokens erreicht hat, auf den er wegen zu geringem Guthaben oder Budget reduziert wurde: insufficient_quota, key_budget_exceeded oder key_daily_budget_exceeded. Die Antwort enthält den bis dahin generierten Text, mit finish_reason: "length".

Streaming

Mit stream: true kommt die Antwort als Server-Sent Events im Chunk-Format von OpenAI und endet mit data: [DONE]. Jedes SDK liest diese für dich.

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)
  • Die Antwort wird erst gesendet, wenn das Modell sein erstes Token erzeugt hat. So bleiben ein erneuter Versuch oder der Wechsel zu einem anderen Pfad für dich unsichtbar.
  • Ruhige Phasen (wenn ein Modell zwischen Schritten nachdenkt) werden alle 15 Sekunden mit SSE-Kommentarzeilen (: keep-alive) überbrückt. Clients ignorieren sie; sie verhindern, dass Proxys die Verbindung schließen. Dauert es bis zum ersten Token länger als 20 Sekunden (wegen eines langen Prompts oder eines hängenden Pfads, der ersetzt wird), öffnet sich der Stream dann: Während du wartest, kommen die Header und Keep-alive-Kommentare. Jeder Pfad hat bis zu 3 Minuten Zeit für den Start (5 bei hohem Reasoning-Aufwand), bevor der nächste versucht wird. Setze das Timeout deines Clients daher auf 10 Minuten.
  • Ein Stream, der vor dem ersten Token geöffnet wurde, enthält x-zurelay-model nur, wenn kein anderes Modell die Anfrage beantworten kann (Smart Routing aus). Tritt nach dem Öffnen ein Fehler auf, kommt er als Fehler-Event im Stream (im selben Format wie der Fehler-Body) statt als Fehlerstatus.
  • Mit include_usage hat der letzte Chunk vor [DONE] eine leere choices-Liste und enthält usage.

Tool-Aufrufe

Beschreibe Funktionen in tools. Wenn das Modell eine aufrufen will, antwortet es mit tool_calls statt mit Text. Führe die Funktion aus und sende das Ergebnis als tool-Nachricht mit der ID des Aufrufs zurück. Dann macht das Modell weiter.

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)

Strukturierte Ausgabe

Fordere JSON mit response_format an. Ein json_schema sorgt bei Modellen, die es unterstützen, dafür, dass sie dein Schema einhalten; json_object fordert beliebiges gültiges JSON an (schreib das auch in deinen 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)

Reasoning

Reasoning-Modelle denken nach, bevor sie antworten. Mit reasoning_effort bestimmst du, wie viel Tempo und Kosten du für mehr Tiefe in Kauf nimmst: Ein höheres Level denkt länger nach, braucht mehr Zeit und verbraucht mehr Output-Tokens. Jedes Modell unterstützt die von seinem Anbieter dokumentierten Level, von none (kein Nachdenken) über minimal, low, medium, high und xhigh (besonders hoch) bis max; die Tabelle unten zeigt sie. Lässt du die Angabe weg, nutzt das Modell seinen Standardwert. Das funktioniert mit jedem OpenAI SDK gleich. Im Playground des Dashboards kannst du jedes Level ausprobieren.

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)

Bei Modellen, die ihre Gedanken ausgeben, kommen sie zusammen mit der Antwort in message.reasoning_content zurück (beim Streaming in delta.reasoning_content); einige nennen das Feld reasoning. Sie werden als Output-Tokens abgerechnet und sind immer in completion_tokens enthalten; completion_tokens_details.reasoning_tokens zählt sie separat, wenn das Modell sie ausweist. Bei hohem Denkaufwand kann es Minuten dauern, bis eine Antwort beginnt. Gib deinem Client deshalb ein großzügiges Timeout (siehe Zuverlässigkeit und Timeouts).

Level pro Modell

Basierend auf der Dokumentation der jeweiligen Anbieter. Unterstützt ein Modell ein Level nicht, nutzt es das nächstgelegene unterstützte Level (bei gleichem Abstand das niedrigere; das Nachdenken wird nur mit none abgeschaltet). So funktioniert dieselbe Anfrage mit jedem Modell, auch mit intelligentem Routing. Der Response-Header x-zurelay-reasoning-effort zeigt, welches Level verwendet wurde. Ein Wort, das kein Level ist, wird mit 400 abgelehnt; die Antwort nennt die Level des Modells.

ModellIDLevelStandard
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, maxAus, bis du eine Stufe festlegst
Claude Opus 4.7claude-opus-4-7low, medium, high, xhigh, maxAus, bis du eine Stufe festlegst
Claude Opus 4.8claude-opus-4-8low, medium, high, xhigh, maxAus, bis du eine Stufe festlegst
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
Schritt 5 Previewstep-5-previewlow, medium, highmedium
Zurelay Autozurelay-autonone, minimal, low, medium, high, xhigh, maxAus, bis du eine Stufe festlegst
MiniMax M2.5minimax-m2.5Nichts einzustellenDenkt immer mit
Claude Haiku 4.5claude-haiku-4-5Keines (ein Thinking-Budget im Anthropic-Format)Aus
Ministral 3 14Bministral-3-14bKeinesAus
Ministral 3 3Bministral-3-3bKeinesAus

So denkt Claude

Über diesen Endpunkt unterstützt Claude reasoning_effort wie jedes andere Modell: low, medium, high, xhigh oder max (Opus 4.6 unterstützt xhigh nicht). Im Format von Anthropic denkt Claude adaptiv auf einem bestimmten Level: Sende thinking: { type: "adaptive", display: "summarized" } mit output_config: { effort: "xhigh" } und lies die Denkblöcke aus. Siehe Anthropic Messages.

Fragen oder fehlt etwas? Frag unser Support-Team und wir antworten per E-Mail, meist innerhalb einer Minute.