Zum Inhalt springen
Responses API

Responses API

Neu

POST /v1/responses nimmt Anweisungen und eine Liste von Input-Elementen entgegen und gibt ein Response-Objekt aus Output-Elementen zurück, im Format der OpenAI Responses. Verwenden Sie es mit der Responses API des OpenAI-SDK und mit darauf aufbauenden Tools wie Codex CLI. Der Endpunkt speichert keinen Zustand: Senden Sie die gesamte Konversation mit jeder Anfrage.

POST https://api.shannon-ai.com/v1/responses

Die kleinste Anfrage besteht aus einer Modell-ID und einem Text. Die Antwort wird nicht gestreamt, es sei denn, Sie fordern es an.

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com/v1",
)

response = client.responses.create(
    model="shannon-3",
    input="Say hello in one sentence.",
)

print(response.output_text)

Die Antwort ist ein Response-Objekt. Sein output enthält das Reasoning, wenn das Modell nachgedacht hat, und die Nachricht:

200 JSON
{
  "id": "resp_5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
  "object": "response",
  "created_at": 1791625200,
  "model": "shannon-3",
  "status": "completed",
  "error": null,
  "incomplete_details": null,
  "instructions": null,
  "metadata": {},
  "parallel_tool_calls": true,
  "temperature": null,
  "tool_choice": "auto",
  "tools": [],
  "top_p": null,
  "output": [
    {
      "id": "rs_8a2e6c1f4b7d4e03b9c5a1d70f3e2b64",
      "type": "reasoning",
      "summary": [
        {
          "type": "summary_text",
          "text": "The user wants a greeting in one sentence. Keep it short and friendly."
        }
      ]
    },
    {
      "id": "msg_1c7b9e3a5d2f4a86b0e4c8d19a6f7e25",
      "type": "message",
      "role": "assistant",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "text": "Hello, it is good to meet you.",
          "annotations": []
        }
      ]
    }
  ],
  "usage": {
    "input_tokens": 1184,
    "output_tokens": 46,
    "total_tokens": 1230
  }
}

Anfragefelder

model und input braucht eine Anfrage. Die Spalte Angewendet von nennt die Modelle, bei denen ein Feld die Antwort verändert. Die gehosteten Open-Weight-Modelle sind die zwölf IDs der Modellliste; die Shannon-3-Familie besteht aus shannon-3, shannon-3-pro, shannon-3.1 und shannon-3.1-pro. Modelle & Preise

Feld Typ Standard Beschreibung Angewendet von
model string Erforderlich. Eine ID aus der Modellliste. Die Zuordnung unterscheidet nicht zwischen Groß- und Kleinschreibung. Eine fehlende oder nicht veröffentlichte ID gibt 400 unknown model zurück. Alle Modelle
input string | array Ein String, der als eine User-Nachricht gelesen wird, oder ein Array von Input-Elementen. Siehe Input-Elemente weiter unten. Alle Modelle
instructions string Anweisungen für das Modell, der System-Prompt dieses Formats. Gehostete Open-Weight-Modelle, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true sendet die Antwort als Server-Sent Events. Siehe Streaming weiter unten. Alle Modelle
max_output_tokens integer 4096 Obergrenze der Antwort, in Tokens. Ein Wert außerhalb von 1 bis 65,536 wird in diesen Bereich verschoben. Es ist auch der Betrag, der von Ihrem Guthaben zurückgelegt wird, solange die Anfrage läuft. Siehe Output-Limit weiter unten. Gehostete Open-Weight-Modelle, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Sampling-Temperatur. Bei den gehosteten Open-Weight-Modellen werden Werte zwischen 0 und 2 gehalten. Gehostete Open-Weight-Modelle; shannon-1.6-*, shannon-2-* und shannon-coder-1 bei Antworten, die nicht gestreamt werden
top_p number Nucleus-Sampling. Werte werden zwischen 0 und 1 gehalten. Gehostete Open-Weight-Modelle
tools array Die Funktionen, die das Modell aufrufen darf, in der flachen Form dieses Formats: {"type": "function", "name", "description", "parameters"}. Siehe Tools weiter unten. Alle Modelle
tool_choice string | object auto "auto" lässt das Modell entscheiden. "required" zwingt es, ein Tool aufzurufen. {"type": "function", "name": "…"} zwingt es, dieses Tool aufzurufen. Gehostete Open-Weight-Modelle
reasoning object {"effort": "…"} mit off, low, medium oder high. Jeder andere Wert gibt 400 zurück. Gehostete Open-Weight-Modelle
text object {"format": {…}} fordert eine JSON-Antwort an. Siehe Strukturierte Ausgabe weiter unten. Alle Shannon-Stufen; gehostete Open-Weight-Modelle wie pro ID aufgeführt

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user und prompt_cache_key werden akzeptiert, damit vorhandener Client-Code unverändert läuft. Sie verändern die Antwort nicht. Da keine Konversation gespeichert wird, trägt eine Folgeanfrage die früheren Turns in input.

Input-Elemente

Ein Input-Element ist entweder eine Nachricht, mit einer role und einem content, oder ein typisiertes Element, das einen Tool-Aufruf oder sein Ergebnis trägt. content ist ein String oder ein Array von Teilen.

Element Beschreibung Angewendet von
{"role": "user", "content": …} Das, was Sie fragen. content ist ein String oder input_text- und input_image-Teile. Alle Modelle
{"role": "assistant", "content": …} Eine frühere Antwort des Modells. content ist ein String oder output_text-Teile. Alle Modelle
{"role": "system", "content": …}
{"role": "developer", "content": …}
Anweisungen innerhalb der Konversation. Gehostete Open-Weight-Modelle
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Ein Tool-Aufruf, den das Modell in einer früheren Antwort gemacht hat. arguments ist ein JSON-String. Alle Modelle
{"type": "function_call_output", "call_id": "…", "output": "…"} Das Ergebnis dieses Aufrufs. call_id ist die ID des Aufrufs und output das Ergebnis als String. Alle Modelle

Legen Sie Anweisungen in das Feld instructions. Bei einer ID der Shannon-3-Familie gehören Anweisungen, die gelten müssen, in die user-Nachricht.

Die Elemente von output einer Antwort können unverändert in input zurückgehen: message- und function_call-Elemente werden gelesen, reasoning-Elemente übersprungen.

Content-Teile

Teil Beschreibung Verfügbar bei
{"type": "input_text", "text": "…"} Text einer User-Nachricht. Alle Modelle
{"type": "output_text", "text": "…"} Text einer Assistant-Nachricht. Alle Modelle
{"type": "input_image", "image_url": "…"} Ein Bild, als data:-URL mit Base64-Inhalt oder als http(s)-URL. Shannon-3-Familie, shannon-1.6-lite, shannon-1.6-pro und die gehosteten Open-Weight-Modelle, die Bild-Input aufführen
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} Ein Dokument (PDF, Word, PowerPoint oder Excel): file_data enthält eine data:-URL oder file_url eine http(s)-URL. Shannon-3-Familie

Bei den Shannon-Stufen werden Bilder und Dateien aus dem letzten user-Element von input gelesen. Größen und Limits haben eine eigene Seite. Bilder und Dateien

Eine Anfrage mit Anweisungen und Optionen

Diese Anfrage sendet Anweisungen, eine Konversation als Input-Elemente, ein Output-Limit, eine Temperatur und einen Reasoning-Aufwand. Sie verwendet ein gehostetes Open-Weight-Modell, das alle davon anwendet.

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com/v1",
)

response = client.responses.create(
    model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
    instructions="You are a physics teacher. Answer in two sentences.",
    input=[
        {"role": "user", "content": "Why is the sky blue?"},
        {"role": "assistant", "content": "Air scatters blue light more than red light."},
        {"role": "user", "content": "And why are sunsets red?"},
    ],
    max_output_tokens=512,
    temperature=0.3,
    reasoning={"effort": "low"},
)

for item in response.output:
    if item.type == "reasoning":
        print("reasoning:", item.summary[0].text)
    elif item.type == "message":
        print("answer:", item.content[0].text)
print(response.usage)

Die Antwort eines gehosteten Open-Weight-Modells hat id, object, model, created_at, status, output und usage. Ihre usage ergänzt die aus dem Cache gelesenen Tokens und die für Reasoning aufgewendeten Tokens:

200 JSON
{
  "usage": {
    "input_tokens": 58,
    "input_tokens_details": {
      "cached_tokens": 0
    },
    "output_tokens": 67,
    "output_tokens_details": {
      "reasoning_tokens": 19
    },
    "total_tokens": 125
  }
}

Das Response-Objekt

id, object, status, output und usage sind in jeder Antwort enthalten. Bauen Sie Ihren Code darauf auf.

Feld Typ Beschreibung Gesendet von
id string resp_ gefolgt von 32 hexadezimalen Zeichen. Alle Modelle
object string Immer response. Alle Modelle
status string completed. In einem Stream ist es zuerst in_progress und in einem Event response.failed failed. Alle Modelle
output array Die Output-Elemente in der Reihenfolge, in der das Modell sie erzeugt hat: reasoning, message, function_call. Alle Modelle
usage object input_tokens, output_tokens und total_tokens. Alle Modelle
usage.input_tokens_details object cached_tokens: die Input-Tokens, die aus dem Prompt-Cache gelesen wurden. Gehostete Open-Weight-Modelle
usage.output_tokens_details object reasoning_tokens: die Output-Tokens, die für Reasoning aufgewendet wurden. Gehostete Open-Weight-Modelle
model string Die kanonische ID des Modells, das geantwortet hat. Shannon-3-Familie, gehostete Open-Weight-Modelle
created_at integer Zeitpunkt der Antwort, in Unix-Sekunden. Shannon-3-Familie, gehostete Open-Weight-Modelle
instructions, tools, temperature, … instructions, tools und temperature wiederholen die Anfrage. error und incomplete_details sind null, metadata ist {}, parallel_tool_calls ist true, tool_choice ist auto und top_p ist null. Shannon-3-Familie

Output-Elemente

Element Beschreibung
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} Das Reasoning des Modells als ein summary_text-Teil. Nur vorhanden, wenn das Modell nachgedacht hat.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} Die Antwort: ein output_text-Teil mit dem Text.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Ein Tool-Aufruf. arguments ist ein JSON-String. Senden Sie das Ergebnis mit derselben call_id zurück.

Die OpenAI-SDKs fügen den Text der Nachricht für Sie in response.output_text zusammen.

Streaming

Setzen Sie stream auf true, um Server-Sent Events zu erhalten. Jeder Frame hat eine event:-Zeile mit dem Namen des Events und eine data:-Zeile mit einem JSON-Objekt; das Objekt wiederholt den Namen in type. Ordnen Sie Deltas ihrem Element über output_index zu.

Lesen Sie die Events mit dem OpenAI-SDK nach ihrem type:

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com/v1",
)

stream = client.responses.create(
    model="shannon-3",
    input="Explain server-sent events in three sentences.",
    stream=True,
)

for event in stream:
    kind = getattr(event, "type", "error")     # an event without a type is an error event
    if kind == "response.reasoning_summary_text.delta":
        pass                                   # a piece of reasoning: event.delta
    elif kind == "response.output_text.delta":
        print(event.delta, end="", flush=True)
    elif kind == "response.output_item.done" and event.item.type == "function_call":
        print("\ntool call:", event.item.name, event.item.arguments)
    elif kind == "response.completed":
        print("\n", event.response.usage)
    elif kind in ("response.failed", "error"):
        raise RuntimeError("the stream failed, send the request again")

Die Events treffen in dieser Reihenfolge ein. Die Gruppen für Reasoning, die Nachricht und Tool-Aufrufe erscheinen nur, wenn die Antwort sie enthält.

Event Payload Wann
response.created response Immer zuerst. response.status ist in_progress, und response.output ist leer.
response.in_progress response Immer an zweiter Stelle, mit demselben Objekt.
response.output_item.added output_index, item Das Reasoning beginnt: ein Element reasoning mit einer leeren summary.
response.reasoning_summary_text.delta output_index, summary_index, delta Ein Stück des Reasonings.
response.reasoning_summary_text.done output_index, summary_index, text Das Reasoning ist vollständig: sein gesamter text.
response.output_item.done output_index, item Das fertige Element reasoning.
response.output_item.added output_index, item Die Antwort beginnt: ein Element message mit dem Status in_progress und ohne Inhalt.
response.content_part.added output_index, content_index, part Ein leerer output_text-Teil wird geöffnet.
response.output_text.delta output_index, content_index, delta Ein Stück der Antwort.
response.output_text.done output_index, content_index, text Die Antwort ist vollständig: ihr gesamter text.
response.content_part.done output_index, content_index, part Der fertige output_text-Teil.
response.output_item.done output_index, item Das fertige Element message, mit dem Status completed.
response.output_item.added output_index, item Ein Tool-Aufruf beginnt: ein Element function_call mit call_id, name und leeren arguments.
response.function_call_arguments.delta output_index, delta Die Argumente des Aufrufs, vollständig in einem Delta.
response.function_call_arguments.done output_index, arguments Dieselben Argumente, als arguments.
response.output_item.done output_index, item Das fertige Element function_call.
response.completed response Bei Erfolg immer zuletzt: das gesamte Response-Objekt mit output und usage.
200 text/event-stream
event: response.created
data: {"type":"response.created","response":{"id":"resp_5f0c…","object":"response","status":"in_progress","output":[], …}}

event: response.in_progress
data: {"type":"response.in_progress","response":{"id":"resp_5f0c…","object":"response","status":"in_progress","output":[], …}}

event: response.output_item.added
data: {"type":"response.output_item.added","output_index":0,"item":{"id":"msg_1c7b…","type":"message","role":"assistant","status":"in_progress","content":[]}}

event: response.content_part.added
data: {"type":"response.content_part.added","output_index":0,"content_index":0,"part":{"type":"output_text","text":""}}

event: response.output_text.delta
data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":"Server-sent"}

event: response.output_text.delta
data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":" events let a server push text over one HTTP reply."}

event: response.output_text.done
data: {"type":"response.output_text.done","output_index":0,"content_index":0,"text":"Server-sent events let a server push text over one HTTP reply."}

event: response.content_part.done
data: {"type":"response.content_part.done","output_index":0,"content_index":0,"part":{"type":"output_text","text":"Server-sent events let a server push text over one HTTP reply."}}

event: response.output_item.done
data: {"type":"response.output_item.done","output_index":0,"item":{"id":"msg_1c7b…","type":"message","role":"assistant","status":"completed","content":[{"type":"output_text","text":"Server-sent events let a server push text over one HTTP reply.","annotations":[]}]}}

event: response.completed
data: {"type":"response.completed","response":{"id":"resp_5f0c…","object":"response","status":"completed","output":[…],"usage":{"input_tokens":1190,"output_tokens":18,"total_tokens":1208}, …}}

Ein Stream, der fehlschlägt

Bei den Shannon-Stufen endet eine fehlgeschlagene Antwort mit response.failed anstelle von response.completed. Ihr response.status ist failed, und response.error enthält einen code, rate_limit_exceeded oder server_error, und eine message.

Bei den gehosteten Open-Weight-Modellen ist ein Fehler ein error-Event mit code api_error und einer message. response.completed folgt trotzdem darauf.

Behandeln Sie einen Stream als fehlgeschlagen, wenn er ein Event response.failed oder error enthält, und senden Sie die Anfrage erneut.

Tools

Ein Tool ist eine Funktion, die Ihr Code ausführt. Beschreiben Sie es in tools; wenn das Modell es braucht, enthält die Antwort ein Element function_call anstelle der Nachricht oder neben ihr.

Eine Tool-Definition in tools:

tools
[
  {
    "type": "function",
    "name": "get_weather",
    "description": "Current weather for a city.",
    "parameters": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        }
      },
      "required": [
        "city"
      ]
    }
  }
]

Der output einer Antwort, die es aufruft:

200 output
[
  {
    "id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "type": "function_call",
    "name": "get_weather",
    "call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "arguments": "{\"city\":\"Paris\"}"
  }
]

Führen Sie die Funktion aus und senden Sie die Anfrage dann erneut, wobei der Aufruf und sein Ergebnis zu input hinzugefügt werden:

input
[
  {
    "role": "user",
    "content": "What is the weather in Paris?"
  },
  {
    "type": "function_call",
    "call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "name": "get_weather",
    "arguments": "{\"city\":\"Paris\"}"
  },
  {
    "type": "function_call_output",
    "call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "output": "{\"temperature_c\": 18, \"sky\": \"cloudy\"}"
  }
]

Nur Tools vom Typ function werden gelesen. Bei shannon-1.6-*, shannon-2-* und shannon-coder-1 wird das Schema parameters auf die gängigen JSON-Schema-Schlüsselwörter reduziert: oneOf wird als anyOf gelesen, und Schlüsselwörter wie $ref, additionalProperties, const, default und title werden nicht an das Modell weitergegeben.

Die tool_choice-Werte required und eine benannte Funktion werden von den gehosteten Open-Weight-Modellen angewendet.

Die Tool-Schleife ist auf einer eigenen Seite vollständig beschrieben. Funktionsaufrufe

Strukturierte Ausgabe

Dieses Format schreibt strukturierte Ausgabe als text.format. Das Schema steht direkt in format, neben name und strict, nicht unter einem Member json_schema wie bei Chat Completions.

  • {"type": "json_object"} fordert ein beliebiges JSON-Objekt an.
  • {"type": "json_schema", "name", "schema", "strict"} fordert JSON an, das Ihrem Schema folgt. strict ist true, wenn Sie es weglassen.
POST /v1/responses
{
  "model": "shannon-1.6-lite",
  "input": "Extract the city and the date: 'The conference opens in Lisbon on 12 May 2027.'",
  "text": {
    "format": {
      "type": "json_schema",
      "name": "event",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "description": "ISO 8601 date"
          }
        },
        "required": [
          "city",
          "date"
        ]
      }
    }
  }
}

Das JSON trifft als Text im output_text-Teil der Nachricht ein; parsen Sie es selbst. Ein gehostetes Open-Weight-Modell ohne strukturierte Ausgabe gibt 400 zurück.

output_text
{"city": "Lisbon", "date": "2027-05-12"}

Welches Modell welche Form annimmt, ist auf einer eigenen Seite aufgeführt. Strukturierte Ausgaben

Reasoning

Ein Modell, das nachdenkt, liefert sein Reasoning als Output-Element vom Typ reasoning, vor der Nachricht. In einem Stream trifft es als response.reasoning_summary_text.delta-Events ein.

Die gehosteten Open-Weight-Modelle wenden reasoning.effort an: off, low, medium oder high, mit high, wenn Sie nichts senden. off liefert kein Reasoning-Element. Senden Sie es als Objekt; ein bloßer String wird bei diesem Endpunkt nicht gelesen.

Die Aufwandsstufen sind auf einer eigenen Seite beschrieben. Reasoning-Aufwand

Output-Limit

max_output_tokens beträgt 4,096, wenn Sie es nicht senden. Es ist die Anzahl der Tokens, die beim Start der Anfrage von Ihrem Guthaben zurückgelegt werden; ist die Antwort vollständig, wird dieser Betrag durch das ersetzt, was die Anfrage verbraucht hat. Ein Wert, der nicht in Ihr verbleibendes Guthaben passt, gibt 429 Quota exceeded zurück.

Es begrenzt die Länge der Antwort bei shannon-1.6-*, shannon-2-* und shannon-coder-1 sowie die Länge des Antworttextes bei den gehosteten Open-Weight-Modellen.

Bei diesem Endpunkt wird shannon-coder-1 wie jedes andere Modell in Tokens von Ihrem Guthaben berechnet.

Ein Request-Body darf bis zu 32 MiB groß sein. Limits und Guthaben

Fehler

Fehler verwenden den OpenAI-Fehler-Body: ein Objekt error mit type und message; manche enthalten zusätzlich code und param mit dem Wert null. Die Tabelle listet, was dieser Endpunkt am häufigsten zurückgibt. Die vollständige Liste, mit Hinweisen, was wiederholt werden sollte, hat eine eigene Seite. Fehlerbehandlung

Status Typ Nachricht Wann
401 authentication_error Missing authentication
Invalid API key
Es wurde kein API-Key gesendet, oder der Key ist unbekannt oder widerrufen.
400 invalid_request_error unknown model: <id> model fehlt oder ist keine veröffentlichte ID.
400 invalid_request_error No user message provided. Shannon-Stufen: input enthält keinen Nutzertext.
400 invalid_request_error <id> does not accept image input Ein Bild wurde an ein gehostetes Open-Weight-Modell ohne Bild-Input gesendet.
400 invalid_request_error <id> does not accept response_format text.format wurde an ein gehostetes Open-Weight-Modell ohne strukturierte Ausgabe gesendet.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high reasoning.effort enthält einen Wert außerhalb der Liste.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … Der Body ist gültiges JSON, aber ein Feld hat den falschen Typ.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_tokens ist größer als das, was von Ihrem Guthaben übrig ist.
429 rate_limit_error Too many requests. Retry in <n>s. Flood-Schutz: mehr als 120 Anfragen in einer Minute auf Ihrem Konto.
500 api_error The model backend failed to answer. Please retry. Das Modell hat keine Antwort erzeugt. Senden Sie die Anfrage erneut.
502 api_error The model backend failed to answer. Please retry. Dasselbe, bei den gehosteten Open-Weight-Modellen.
504 api_error upstream timed out Ein gehostetes Open-Weight-Modell hat bei einer nicht gestreamten Antwort länger als das Zeitlimit gebraucht. Senden Sie sie mit stream auf true.