Responses API
NyPOST /v1/responses tager instruktioner og en liste af input-elementer og returnerer et response-objekt bygget af output-elementer, i OpenAI Responses-formatet. Brug det med responses-API'et i OpenAI-SDK'et og med værktøjer bygget på det, f.eks. Codex CLI. Endpointet gemmer ingen tilstand: send hele samtalen med hver anmodning.
POST https://api.shannon-ai.com/v1/responses
Den mindste anmodning er et model-id og en tekst. Svaret streames ikke, medmindre du beder om det.
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) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.responses.create({
model: "shannon-3",
input: "Say hello in one sentence.",
});
console.log(response.output_text); curl https://api.shannon-ai.com/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"input": "Say hello in one sentence."
}' Svaret er et response-objekt. Dets output indeholder ræsonnementet, når modellen har ræsonneret, og beskeden:
{
"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
}
} Anmodningsfelter
model og input er det, en anmodning har brug for. Kolonnen Anvendes af nævner de modeller, hvor et felt ændrer svaret. De hostede open-weight-modeller er de tolv id'er på modellisten; Shannon 3-familien er shannon-3, shannon-3-pro, shannon-3.1 og shannon-3.1-pro. Modeller og priser
| Felt | Type | Standard | Beskrivelse | Anvendes af |
|---|---|---|---|---|
model | string | Påkrævet. Et id fra modellisten. Sammenligningen skelner ikke mellem store og små bogstaver. Et manglende eller ikke offentliggjort id returnerer 400 unknown model. | Alle modeller | |
input | string | array | En streng, der læses som én brugerbesked, eller et array af input-elementer. Se Input-elementer nedenfor. | Alle modeller | |
instructions | string | Instruktioner til modellen, dette formats systemprompt. | Hostede open-weight-modeller, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
stream | boolean | false | true sender svaret som server-sent events. Se Streaming nedenfor. | Alle modeller |
max_output_tokens | integer | 4096 | Øvre grænse for svaret, i tokens. En værdi uden for 1 til 65,536 flyttes ind i det interval. Det er også det beløb, der sættes til side fra din saldo, mens anmodningen kører. Se Outputgrænse nedenfor. | Hostede open-weight-modeller, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
temperature | number | Samplingtemperatur. På de hostede open-weight-modeller holdes værdier mellem 0 og 2. | Hostede open-weight-modeller; shannon-1.6-*, shannon-2-* og shannon-coder-1 på svar, der ikke streames | |
top_p | number | Nucleus-sampling. Værdier holdes mellem 0 og 1. | Hostede open-weight-modeller | |
tools | array | De funktioner, modellen må kalde, i dette formats flade form: {"type": "function", "name", "description", "parameters"}. Se Værktøjer nedenfor. | Alle modeller | |
tool_choice | string | object | auto | "auto" lader modellen bestemme. "required" får den til at kalde et værktøj. {"type": "function", "name": "…"} får den til at kalde det værktøj. | Hostede open-weight-modeller |
reasoning | object | {"effort": "…"} med off, low, medium eller high. Enhver anden værdi returnerer 400. | Hostede open-weight-modeller | |
text | object | {"format": {…}} beder om et JSON-svar. Se Struktureret output nedenfor. | Alle Shannon-niveauer; hostede open-weight-modeller som angivet per id |
previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user og prompt_cache_key accepteres, så eksisterende klientkode kører uændret. De ændrer ikke svaret. Fordi ingen samtale gemmes, bærer en opfølgende anmodning de tidligere ture i input.
Input-elementer
Et input-element er enten en besked, med en role og et content, eller et typet element, der bærer et værktøjskald eller dets resultat. content er en streng eller et array af dele.
| Element | Beskrivelse | Anvendes af |
|---|---|---|
{"role": "user", "content": …} | Hvad du spørger om. content er en streng eller input_text- og input_image-dele. | Alle modeller |
{"role": "assistant", "content": …} | Et tidligere svar fra modellen. content er en streng eller output_text-dele. | Alle modeller |
{"role": "system", "content": …}{"role": "developer", "content": …} | Instruktioner inde i samtalen. | Hostede open-weight-modeller |
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} | Et værktøjskald, modellen foretog i et tidligere svar. arguments er en JSON-streng. | Alle modeller |
{"type": "function_call_output", "call_id": "…", "output": "…"} | Resultatet af det kald. call_id er kaldets id og output resultatet som en streng. | Alle modeller |
Læg instruktioner i feltet instructions. Med et id fra Shannon 3-familien skal du lægge instruktioner, der skal holde, i user-beskeden.
Elementerne i et svars output kan sendes tilbage i input som de er: message- og function_call-elementer læses, reasoning-elementer springes over.
Indholdsdele
| Del | Beskrivelse | Tilgængelig på |
|---|---|---|
{"type": "input_text", "text": "…"} | Tekst i en brugerbesked. | Alle modeller |
{"type": "output_text", "text": "…"} | Tekst i en assistentbesked. | Alle modeller |
{"type": "input_image", "image_url": "…"} | Et billede, som en data:-URL med base64-indhold eller som en http(s)-URL. | Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro og de hostede open-weight-modeller, der angiver billedinput |
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} | Et dokument (PDF, Word, PowerPoint eller Excel): file_data indeholder en data:-URL, eller file_url en http(s)-URL. | Shannon 3-familien |
På Shannon-niveauerne læses billeder og filer fra det sidste user-element i input. Størrelser og grænser har deres egen side. Billeder og filer
En anmodning med instruktioner og indstillinger
Denne anmodning sender instruktioner, en samtale som input-elementer, en outputgrænse, en temperatur og en ræsonnementsindsats. Den bruger en hostet open-weight-model, som anvender dem alle.
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) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await 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 (const item of response.output) {
if (item.type === "reasoning") console.log("reasoning:", item.summary[0].text);
if (item.type === "message") console.log("answer:", item.content[0].text);
}
console.log(response.usage); curl https://api.shannon-ai.com/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"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"}
}' Svaret fra en hostet open-weight-model har id, object, model, created_at, status, output og usage. Dets usage tilføjer de tokens, der er læst fra cachen, og de tokens, der er brugt på ræsonnement:
{
"usage": {
"input_tokens": 58,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 67,
"output_tokens_details": {
"reasoning_tokens": 19
},
"total_tokens": 125
}
} Response-objektet
id, object, status, output og usage findes i hvert svar. Byg din kode på dem.
| Felt | Type | Beskrivelse | Sendt af |
|---|---|---|---|
id | string | resp_ efterfulgt af 32 hexadecimale tegn. | Alle modeller |
object | string | Altid response. | Alle modeller |
status | string | completed. I en stream er den først in_progress og failed i en response.failed-hændelse. | Alle modeller |
output | array | Output-elementerne i den rækkefølge, modellen frembragte dem: reasoning, message, function_call. | Alle modeller |
usage | object | input_tokens, output_tokens og total_tokens. | Alle modeller |
usage.input_tokens_details | object | cached_tokens: de input-tokens, der er læst fra prompt-cachen. | Hostede open-weight-modeller |
usage.output_tokens_details | object | reasoning_tokens: de output-tokens, der er brugt på ræsonnement. | Hostede open-weight-modeller |
model | string | Det kanoniske id på den model, der svarede. | Shannon 3-familien, hostede open-weight-modeller |
created_at | integer | Svarets tidspunkt, i Unix-sekunder. | Shannon 3-familien, hostede open-weight-modeller |
instructions, tools, temperature, … | instructions, tools og temperature gentager anmodningen. error og incomplete_details er null, metadata er {}, parallel_tool_calls er true, tool_choice er auto, og top_p er null. | Shannon 3-familien |
Output-elementer
| Element | Beskrivelse |
|---|---|
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} | Modellens ræsonnement som én summary_text-del. Findes kun, når modellen har ræsonneret. |
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} | Svaret: én output_text-del med teksten. |
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} | Et værktøjskald. arguments er en JSON-streng. Send resultatet tilbage med det samme call_id. |
OpenAI-SDK'erne samler beskedens tekst for dig i response.output_text.
Streaming
Sæt stream til true for server-sent events. Hver ramme har en event:-linje med hændelsens navn og en data:-linje med et JSON-objekt; objektet gentager navnet i type. Knyt deltaer til deres element via output_index.
Med OpenAI-SDK'et læser du hændelserne efter deres 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") import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const stream = await client.responses.create({
model: "shannon-3",
input: "Explain server-sent events in three sentences.",
stream: true,
});
for await (const event of stream) {
if (event.type === "response.reasoning_summary_text.delta") {
// a piece of reasoning: event.delta
} else if (event.type === "response.output_text.delta") {
process.stdout.write(event.delta);
} else if (event.type === "response.output_item.done" && event.item.type === "function_call") {
console.log("\ntool call:", event.item.name, event.item.arguments);
} else if (event.type === "response.completed") {
console.log("\n", event.response.usage);
} else if (event.type === "response.failed" || event.type === "error") {
throw new Error("the stream failed, send the request again");
}
} curl -N https://api.shannon-ai.com/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"input": "Explain server-sent events in three sentences.",
"stream": true
}' Hændelserne ankommer i denne rækkefølge. Grupperne for ræsonnement, beskeden og værktøjskald optræder kun, når svaret har dem.
| Hændelse | Payload | Hvornår |
|---|---|---|
response.created | response | Altid først. response.status er in_progress, og response.output er tomt. |
response.in_progress | response | Altid nummer to, med det samme objekt. |
response.output_item.added | output_index, item | Ræsonnementet starter: et reasoning-element med en tom summary. |
response.reasoning_summary_text.delta | output_index, summary_index, delta | Et stykke af ræsonnementet. |
response.reasoning_summary_text.done | output_index, summary_index, text | Ræsonnementet er færdigt: hele dets text. |
response.output_item.done | output_index, item | Det færdige reasoning-element. |
response.output_item.added | output_index, item | Svaret starter: et message-element med status in_progress og intet indhold. |
response.content_part.added | output_index, content_index, part | En tom output_text-del åbnes. |
response.output_text.delta | output_index, content_index, delta | Et stykke af svaret. |
response.output_text.done | output_index, content_index, text | Svaret er færdigt: hele dets text. |
response.content_part.done | output_index, content_index, part | Den færdige output_text-del. |
response.output_item.done | output_index, item | Det færdige message-element, med status completed. |
response.output_item.added | output_index, item | Et værktøjskald starter: et function_call-element med call_id, name og tomme arguments. |
response.function_call_arguments.delta | output_index, delta | Kaldets argumenter, komplette i én delta. |
response.function_call_arguments.done | output_index, arguments | De samme argumenter, som arguments. |
response.output_item.done | output_index, item | Det færdige function_call-element. |
response.completed | response | Altid sidst ved succes: hele response-objektet med output og usage. |
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}, …}} En stream, der fejler
På Shannon-niveauerne slutter et fejlet svar med response.failed i stedet for response.completed. Dets response.status er failed, og response.error indeholder en code, rate_limit_exceeded eller server_error, og en message.
På de hostede open-weight-modeller er en fejl en error-hændelse med code api_error og en message. response.completed følger stadig efter den.
Betragt en stream som fejlet, når den indeholder en response.failed- eller en error-hændelse, og send anmodningen igen.
Værktøjer
Et værktøj er en funktion, din kode kører. Beskriv det i tools; når modellen vil have det, indeholder svaret et function_call-element i stedet for beskeden eller ved siden af den.
En værktøjsdefinition i tools:
[
{
"type": "function",
"name": "get_weather",
"description": "Current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] output i et svar, der kalder det:
[
{
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function_call",
"name": "get_weather",
"call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"arguments": "{\"city\":\"Paris\"}"
}
] Kør funktionen, og send så anmodningen igen med kaldet og dets resultat tilføjet til 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\"}"
}
] Kun værktøjer af typen function læses. På shannon-1.6-*, shannon-2-* og shannon-coder-1 reduceres parameters-skemaet til de almindelige JSON Schema-nøgleord: oneOf læses som anyOf, og nøgleord som $ref, additionalProperties, const, default og title gives ikke videre til modellen.
Værdierne required og en navngiven funktion i tool_choice anvendes af de hostede open-weight-modeller.
Værktøjsløkken er beskrevet fuldt ud på sin egen side. Funktionskald
Struktureret output
Dette format staver struktureret output som text.format. Skemaet står direkte i format, ved siden af name og strict, ikke under et json_schema-medlem som på Chat Completions.
{"type": "json_object"}beder om et vilkårligt JSON-objekt.{"type": "json_schema", "name", "schema", "strict"}beder om JSON, der følger dit skema.strictertrue, når du udelader det.
{
"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"
]
}
}
}
} JSON'en ankommer som tekst i beskedens output_text-del; parse den selv. En hostet open-weight-model uden struktureret output returnerer 400.
{"city": "Lisbon", "date": "2027-05-12"} Hvilken model der tager hvilken form, står på dens egen side. Strukturerede outputs
Ræsonnement
En model, der ræsonnerer, returnerer sit ræsonnement som et output-element af typen reasoning før beskeden. I en stream ankommer det som response.reasoning_summary_text.delta-hændelser.
De hostede open-weight-modeller anvender reasoning.effort: off, low, medium eller high, med high når du intet sender. off returnerer intet ræsonnementselement. Send det som et objekt; en ren streng læses ikke på dette endpoint.
Effort-niveauerne er beskrevet på deres egen side. Reasoning effort
Outputgrænse
max_output_tokens er 4,096, når du ikke sender det. Det er det antal tokens, der sættes til side fra din saldo, når anmodningen starter; når svaret er færdigt, erstattes beløbet af det, anmodningen brugte. En værdi, der ikke kan rummes i din resterende saldo, returnerer 429 Quota exceeded.
Den begrænser svarets længde på shannon-1.6-*, shannon-2-* og shannon-coder-1 og svarteksten på de hostede open-weight-modeller.
På dette endpoint afregnes shannon-coder-1 i tokens fra din saldo, som alle andre modeller.
En anmodnings body kan være op til 32 MiB. Grænser og saldo
Fejl
Fejl bruger OpenAI's fejl-body: et error-objekt med type og message; nogle har også code og param med værdien null. Tabellen opregner det, dette endpoint oftest returnerer. Den fulde liste, med hvad der kan prøves igen, har sin egen side. Fejlhåndtering
| Status | Type | Besked | Hvornår |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Der blev ikke sendt nogen API-nøgle, eller nøglen er ukendt eller tilbagekaldt. |
400 | invalid_request_error | unknown model: <id> | model mangler eller er ikke et offentliggjort id. |
400 | invalid_request_error | No user message provided. | Shannon-niveauer: input indeholder ingen brugertekst. |
400 | invalid_request_error | <id> does not accept image input | Et billede blev sendt til en hostet open-weight-model uden billedinput. |
400 | invalid_request_error | <id> does not accept response_format | text.format blev sendt til en hostet open-weight-model uden struktureret output. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning.effort indeholder en værdi uden for listen. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Body'en er gyldig JSON, men et felt har den forkerte type. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_output_tokens er større end det, der er tilbage af din saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: mere end 120 anmodninger på ét minut på din konto. |
500 | api_error | The model backend failed to answer. Please retry. | Modellen frembragte ikke noget svar. Send anmodningen igen. |
502 | api_error | The model backend failed to answer. Please retry. | Det samme, på de hostede open-weight-modeller. |
504 | api_error | upstream timed out | En hostet open-weight-model brugte længere tid end tidsgrænsen for et svar, der ikke streames. Send anmodningen med stream sat til true. |