Responses API
NyPOST /v1/responses tar instruksjoner og en liste med input-elementer og returnerer et respons-objekt satt sammen av output-elementer, i OpenAI Responses-formatet. Bruk det med responses-API-et i OpenAI-SDK-en og med verktøy bygget på det, som Codex CLI. Endepunktet holder ingen tilstand: send hele samtalen med hver forespørsel.
POST https://api.shannon-ai.com/v1/responses
Den minste forespørselen er en modell-id og en tekst. Svaret sendes ikke som strøm med mindre du ber 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 respons-objekt. Dets output inneholder resonneringen, når modellen resonnerte, og meldingen:
{
"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
}
} Forespørselsfelt
model og input er det en forespørsel trenger. Kolonnen Brukes av oppgir modellene der et felt endrer svaret. De hostede åpne vektmodellene er de tolv id-ene i modelllisten; Shannon 3-familien er shannon-3, shannon-3-pro, shannon-3.1 og shannon-3.1-pro. Modeller og priser
| Felt | Type | Standard | Beskrivelse | Brukes av |
|---|---|---|---|---|
model | string | Påkrevd. En id fra modelllisten. Sammenligningen skiller ikke mellom store og små bokstaver. En manglende eller upublisert id returnerer 400 unknown model. | Alle modeller | |
input | string | array | En streng, som leses som én brukermelding, eller en matrise av input-elementer. Se Input-elementer nedenfor. | Alle modeller | |
instructions | string | Instruksjoner til modellen, system prompten i dette formatet. | Hostede åpne vektmodeller, 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 grense for svaret, i tokens. En verdi utenfor 1 til 65,536 flyttes inn i dette området. Det er også beløpet som settes av fra saldoen din mens forespørselen kjører. Se Utdatagrense nedenfor. | Hostede åpne vektmodeller, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
temperature | number | Samplingtemperatur. På de hostede åpne vektmodellene holdes verdiene mellom 0 og 2. | Hostede åpne vektmodeller; shannon-1.6-*, shannon-2-* og shannon-coder-1 i svar uten streaming | |
top_p | number | Nucleus-sampling. Verdiene holdes mellom 0 og 1. | Hostede åpne vektmodeller | |
tools | array | Funksjonene modellen kan kalle, i den flate formen i dette formatet: {"type": "function", "name", "description", "parameters"}. Se Verktøy nedenfor. | Alle modeller | |
tool_choice | string | object | auto | "auto" lar modellen bestemme. "required" får den til å kalle et verktøy. {"type": "function", "name": "…"} får den til å kalle det verktøyet. | Hostede åpne vektmodeller |
reasoning | object | {"effort": "…"} med off, low, medium eller high. Enhver annen verdi returnerer 400. | Hostede åpne vektmodeller | |
text | object | {"format": {…}} ber om et JSON-svar. Se Strukturert utdata nedenfor. | Alle Shannon-nivåer; hostede åpne vektmodeller som oppgitt per id |
previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user og prompt_cache_key godtas, slik at eksisterende klientkode kjører uendret. De endrer ikke svaret. Fordi ingen samtale lagres, har en oppfølgingsforespørsel de tidligere rundene i input.
Input-elementer
Et input-element er enten en melding, med en role og en content, eller et typet element som bærer et verktøykall eller resultatet av det. content er en streng eller en matrise av deler.
| Element | Beskrivelse | Brukes av |
|---|---|---|
{"role": "user", "content": …} | Det du spør om. content er en streng, eller input_text- og input_image-deler. | Alle modeller |
{"role": "assistant", "content": …} | Et tidligere svar fra modellen. content er en streng, eller output_text-deler. | Alle modeller |
{"role": "system", "content": …}{"role": "developer", "content": …} | Instruksjoner inne i samtalen. | Hostede åpne vektmodeller |
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} | Et verktøykall modellen gjorde i et tidligere svar. arguments er en JSON-streng. | Alle modeller |
{"type": "function_call_output", "call_id": "…", "output": "…"} | Resultatet av det kallet. call_id er id-en til kallet og output resultatet som en streng. | Alle modeller |
Legg instruksjoner i feltet instructions. Med en id fra Shannon 3-familien legger du instruksjoner som må gjelde, i user-meldingen.
Elementene i output fra et svar kan sendes tilbake i input som de er: message- og function_call-elementer leses, reasoning-elementer hoppes over.
Innholdsdeler
| Del | Beskrivelse | Tilgjengelig på |
|---|---|---|
{"type": "input_text", "text": "…"} | Tekst i en brukermelding. | Alle modeller |
{"type": "output_text", "text": "…"} | Tekst i en assistentmelding. | Alle modeller |
{"type": "input_image", "image_url": "…"} | Et bilde, som en data:-URL med base64-innhold eller som en http(s)-URL. | Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro og de hostede åpne vektmodellene som oppgir bildeinput |
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} | Et dokument (PDF, Word, PowerPoint eller Excel): file_data inneholder en data:-URL, eller file_url en http(s)-URL. | Shannon 3-familien |
På Shannon-nivåene leses bilder og filer fra det siste user-elementet i input. Størrelser og grenser har en egen side. Bilder og filer
En forespørsel med instruksjoner og valg
Denne forespørselen sender instruksjoner, en samtale som input-elementer, en utdatagrense, en temperatur og en resonneringsinnsats. Den bruker en hostet åpen vektmodell, som tar hensyn til 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 åpen vektmodell har id, object, model, created_at, status, output og usage. Dens usage legger til tokens lest fra cachen og tokens brukt på resonnering:
{
"usage": {
"input_tokens": 58,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 67,
"output_tokens_details": {
"reasoning_tokens": 19
},
"total_tokens": 125
}
} Respons-objektet
id, object, status, output og usage finnes i hvert svar. Bygg koden din på dem.
| Felt | Type | Beskrivelse | Sendes av |
|---|---|---|---|
id | string | resp_ etterfulgt av 32 heksadesimale tegn. | Alle modeller |
object | string | Alltid response. | Alle modeller |
status | string | completed. I en strøm er den først in_progress, og failed i en response.failed-hendelse. | Alle modeller |
output | array | Output-elementene i den rekkefølgen modellen produserte 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: input-tokens lest fra prompt-cachen. | Hostede åpne vektmodeller |
usage.output_tokens_details | object | reasoning_tokens: output-tokens brukt på resonnering. | Hostede åpne vektmodeller |
model | string | Den kanoniske id-en til modellen som svarte. | Shannon 3-familien, hostede åpne vektmodeller |
created_at | integer | Tidspunktet for svaret, i Unix-sekunder. | Shannon 3-familien, hostede åpne vektmodeller |
instructions, tools, temperature, … | instructions, tools og temperature gjentar forespørselen. 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 resonnering som én summary_text-del. Finnes bare når modellen resonnerte. |
{"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 verktøykall. arguments er en JSON-streng. Send resultatet tilbake med samme call_id. |
OpenAI-SDK-ene slår sammen teksten i meldingen for deg i response.output_text.
Streaming
Sett stream til true for server-sent events. Hver ramme har en event:-linje med navnet på hendelsen og en data:-linje med et JSON-objekt; objektet gjentar navnet i type. Knytt deltaer til elementet sitt med output_index.
Med OpenAI-SDK-en leser du hendelsene etter 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
}' Hendelsene kommer i denne rekkefølgen. Gruppene for resonnering, meldingen og verktøykall finnes bare når svaret har dem.
| Hendelse | Nyttelast | Når |
|---|---|---|
response.created | response | Alltid først. response.status er in_progress og response.output er tom. |
response.in_progress | response | Alltid nummer to, med det samme objektet. |
response.output_item.added | output_index, item | Resonneringen starter: et reasoning-element med en tom summary. |
response.reasoning_summary_text.delta | output_index, summary_index, delta | Et stykke av resonneringen. |
response.reasoning_summary_text.done | output_index, summary_index, text | Resonneringen er fullført: hele text. |
response.output_item.done | output_index, item | Det ferdige reasoning-elementet. |
response.output_item.added | output_index, item | Svaret starter: et message-element med status in_progress og uten innhold. |
response.content_part.added | output_index, content_index, part | En tom output_text-del åpnes. |
response.output_text.delta | output_index, content_index, delta | Et stykke av svaret. |
response.output_text.done | output_index, content_index, text | Svaret er fullført: hele text. |
response.content_part.done | output_index, content_index, part | Den ferdige output_text-delen. |
response.output_item.done | output_index, item | Det ferdige message-elementet, med status completed. |
response.output_item.added | output_index, item | Et verktøykall starter: et function_call-element med call_id, name og tomme arguments. |
response.function_call_arguments.delta | output_index, delta | Argumentene til kallet, komplette i én delta. |
response.function_call_arguments.done | output_index, arguments | De samme argumentene, som arguments. |
response.output_item.done | output_index, item | Det ferdige function_call-elementet. |
response.completed | response | Alltid sist ved suksess: hele respons-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 strøm som feiler
På Shannon-nivåene ender et mislykket svar med response.failed i stedet for response.completed. Dets response.status er failed, og response.error inneholder en code, rate_limit_exceeded eller server_error, og en message.
På de hostede åpne vektmodellene er en feil en error-hendelse med code api_error og en message. response.completed følger likevel etter den.
Behandle en strøm som mislykket når den inneholder en response.failed- eller en error-hendelse, og send forespørselen på nytt.
Verktøy
Et verktøy er en funksjon koden din kjører. Beskriv det i tools; når modellen vil bruke det, inneholder svaret et function_call-element i stedet for meldingen, eller ved siden av den.
En verktøydefinisjon 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 som kaller det:
[
{
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function_call",
"name": "get_weather",
"call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"arguments": "{\"city\":\"Paris\"}"
}
] Kjør funksjonen, og send så forespørselen på nytt med kallet og resultatet lagt til i 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\"}"
}
] Bare verktøy av typen function leses. På shannon-1.6-*, shannon-2-* og shannon-coder-1 reduseres parameters-skjemaet til de vanlige JSON Schema-nøkkelordene: oneOf leses som anyOf, og nøkkelord som $ref, additionalProperties, const, default og title videresendes ikke til modellen.
tool_choice-verdiene required og en navngitt funksjon brukes av de hostede åpne vektmodellene.
Verktøysløyfen er beskrevet fullt ut på sin egen side. Funksjonskall
Strukturert utdata
Dette formatet skriver strukturert utdata som text.format. Skjemaet ligger direkte i format, ved siden av name og strict, ikke under et json_schema-medlem som på Chat Completions.
{"type": "json_object"}ber om et vilkårlig JSON-objekt.{"type": "json_schema", "name", "schema", "strict"}ber om JSON som følger skjemaet ditt.strictertruenår du utelater 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 kommer som tekst i output_text-delen av meldingen; parse den selv. En hostet åpen vektmodell uten strukturert utdata returnerer 400.
{"city": "Lisbon", "date": "2027-05-12"} Hvilken modell som tar hvilken form, er listet på sin egen side. Strukturerte utdata
Resonnering
En modell som resonnerer, returnerer resonneringen som et output-element av typen reasoning, før meldingen. I en strøm kommer den som response.reasoning_summary_text.delta-hendelser.
De hostede åpne vektmodellene bruker reasoning.effort: off, low, medium eller high, med high når du ikke sender noe. off returnerer ikke noe resonneringselement. Send det som et objekt; en ren streng leses ikke på dette endepunktet.
Innsatsnivåene er beskrevet på sin egen side. Resonneringsinnsats
Utdatagrense
max_output_tokens er 4,096 når du ikke sender det. Det er antallet tokens som settes av fra saldoen din når forespørselen starter; når svaret er fullført, erstattes dette beløpet av det forespørselen brukte. En verdi som ikke får plass i den resterende saldoen din, returnerer 429 Quota exceeded.
Den begrenser lengden på svaret på shannon-1.6-*, shannon-2-* og shannon-coder-1, og lengden på svarteksten på de hostede åpne vektmodellene.
På dette endepunktet belastes shannon-coder-1 i tokens fra saldoen din, som alle andre modeller.
En forespørselskropp kan være opptil 32 MiB. Grenser og saldo
Feil
Feil bruker OpenAI-feilkroppen: et error-objekt med type og message; noen har også code og param med verdien null. Tabellen lister det dette endepunktet oftest returnerer. Den fullstendige listen, med hva som kan prøves på nytt, har en egen side. Feilhåndtering
| Status | Type | Melding | Når |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Ingen API-nøkkel ble sendt, eller nøkkelen er ukjent eller trukket tilbake. |
400 | invalid_request_error | unknown model: <id> | model mangler eller er ikke en publisert id. |
400 | invalid_request_error | No user message provided. | Shannon-nivåer: input inneholder ingen brukertekst. |
400 | invalid_request_error | <id> does not accept image input | Et bilde ble sendt til en hostet åpen vektmodell uten bildeinput. |
400 | invalid_request_error | <id> does not accept response_format | text.format ble sendt til en hostet åpen vektmodell uten strukturert utdata. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning.effort har en verdi utenfor listen. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Kroppen er gyldig JSON, men et felt har feil type. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_output_tokens er større enn det som er igjen av saldoen din. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: mer enn 120 forespørsler i løpet av ett minutt på kontoen din. |
500 | api_error | The model backend failed to answer. Please retry. | Modellen produserte ikke noe svar. Send forespørselen på nytt. |
502 | api_error | The model backend failed to answer. Please retry. | Det samme, på de hostede åpne vektmodellene. |
504 | api_error | upstream timed out | En hostet åpen vektmodell brukte lengre tid enn tidsgrensen for et svar uten streaming. Send den med stream satt til true. |