Responses API
NovoPOST /v1/responses prima upute i listu ulaznih stavki i vraća objekat odgovora sastavljen od izlaznih stavki, u formatu OpenAI Responses. Koristite ga s responses API-jem OpenAI SDK-a i s alatima izgrađenim na njemu, kao što je Codex CLI. Endpoint ne čuva stanje: šaljite cijeli razgovor sa svakim zahtjevom.
POST https://api.shannon-ai.com/v1/responses
Najmanji zahtjev je id modela i tekst. Odgovor nema streaming osim ako ga zatražite.
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."
}' Odgovor je objekat odgovora. Njegov output sadrži razmišljanje, kada je model razmišljao, i poruku:
{
"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
}
} Polja zahtjeva
model i input su ono što zahtjev treba. Kolona Primjenjuju navodi modele na kojima polje mijenja odgovor. Hostirani open-weight modeli su dvanaest id-ova s liste modela; porodica Shannon 3 su shannon-3, shannon-3-pro, shannon-3.1 i shannon-3.1-pro. Modeli i cijene
| Polje | Tip | Zadano | Opis | Primjenjuju |
|---|---|---|---|---|
model | string | Obavezno. Id s liste modela. Podudaranje ne razlikuje velika i mala slova. Id koji nedostaje ili nije objavljen vraća 400 unknown model. | Svi modeli | |
input | string | array | String, koji se čita kao jedna korisnička poruka, ili niz ulaznih stavki. Pogledajte Ulazne stavke u nastavku. | Svi modeli | |
instructions | string | Upute za model, system prompt ovog formata. | Hostirani open-weight modeli, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
stream | boolean | false | true šalje odgovor kao server-sent events. Pogledajte Streaming u nastavku. | Svi modeli |
max_output_tokens | integer | 4096 | Gornja granica odgovora, u tokenima. Vrijednost izvan raspona od 1 do 65,536 pomjera se u taj raspon. To je i iznos izdvojen sa vašeg stanja dok zahtjev traje. Pogledajte Ograničenje izlaza u nastavku. | Hostirani open-weight modeli, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
temperature | number | Temperatura uzorkovanja. Na hostiranim open-weight modelima vrijednosti se drže između 0 i 2. | Hostirani open-weight modeli; shannon-1.6-*, shannon-2-* i shannon-coder-1 na odgovorima bez streaminga | |
top_p | number | Nucleus uzorkovanje. Vrijednosti se drže između 0 i 1. | Hostirani open-weight modeli | |
tools | array | Funkcije koje model smije pozvati, u ravnom obliku ovog formata: {"type": "function", "name", "description", "parameters"}. Pogledajte Alati u nastavku. | Svi modeli | |
tool_choice | string | object | auto | "auto" prepušta odluku modelu. "required" tjera ga da pozove alat. {"type": "function", "name": "…"} tjera ga da pozove taj alat. | Hostirani open-weight modeli |
reasoning | object | {"effort": "…"} sa off, low, medium ili high. Svaka druga vrijednost vraća 400. | Hostirani open-weight modeli | |
text | object | {"format": {…}} traži JSON odgovor. Pogledajte Strukturirani izlaz u nastavku. | Svi Shannon nivoi; hostirani open-weight modeli kako je navedeno po id-u |
previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user i prompt_cache_key se prihvataju kako bi postojeći klijentski kod radio neizmijenjen. Ne mijenjaju odgovor. Budući da se nijedan razgovor ne sprema, naredni zahtjev nosi ranije krugove u input.
Ulazne stavke
Ulazna stavka je ili poruka, s role i content, ili tipizirana stavka koja nosi poziv alata ili njegov rezultat. content je string ili niz dijelova.
| Stavka | Opis | Primjenjuju |
|---|---|---|
{"role": "user", "content": …} | Ono što pitate. content je string, ili dijelovi input_text i input_image. | Svi modeli |
{"role": "assistant", "content": …} | Raniji odgovor modela. content je string, ili dijelovi output_text. | Svi modeli |
{"role": "system", "content": …}{"role": "developer", "content": …} | Upute unutar razgovora. | Hostirani open-weight modeli |
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} | Poziv alata koji je model napravio u ranijem odgovoru. arguments je JSON string. | Svi modeli |
{"type": "function_call_output", "call_id": "…", "output": "…"} | Rezultat tog poziva. call_id je id poziva, a output rezultat kao string. | Svi modeli |
Stavite upute u polje instructions. Uz id porodice Shannon 3, upute koje moraju važiti stavite u poruku user.
Stavke output iz odgovora mogu se vratiti u input takve kakve jesu: stavke message i function_call se čitaju, stavke reasoning se preskaču.
Dijelovi sadržaja
| Dio | Opis | Dostupno na |
|---|---|---|
{"type": "input_text", "text": "…"} | Tekst korisničke poruke. | Svi modeli |
{"type": "output_text", "text": "…"} | Tekst poruke asistenta. | Svi modeli |
{"type": "input_image", "image_url": "…"} | Slika, kao data: URL sa base64 sadržajem ili kao http(s) URL. | Porodica Shannon 3, shannon-1.6-lite, shannon-1.6-pro i hostirani open-weight modeli koji navode ulaz slika |
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} | Dokument (PDF, Word, PowerPoint ili Excel): file_data sadrži data: URL, ili file_url http(s) URL. | Porodica Shannon 3 |
Na Shannon nivoima slike i datoteke se čitaju iz posljednje stavke user u input. Veličine i ograničenja imaju svoju stranicu. Slike i datoteke
Zahtjev s uputama i opcijama
Ovaj zahtjev šalje upute, razgovor kao ulazne stavke, ograničenje izlaza, temperaturu i jačinu razmišljanja. Koristi hostirani open-weight model, koji primjenjuje sve njih.
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"}
}' Odgovor hostiranog open-weight modela ima id, object, model, created_at, status, output i usage. Njegov usage dodaje tokene pročitane iz keša i tokene utrošene na razmišljanje:
{
"usage": {
"input_tokens": 58,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 67,
"output_tokens_details": {
"reasoning_tokens": 19
},
"total_tokens": 125
}
} Objekat odgovora
id, object, status, output i usage nalaze se u svakom odgovoru. Na njima zasnujte svoj kod.
| Polje | Tip | Opis | Šalje |
|---|---|---|---|
id | string | resp_ iza kojeg slijedi 32 heksadecimalna znaka. | Svi modeli |
object | string | Uvijek response. | Svi modeli |
status | string | completed. U streamu je prvo in_progress, a failed u događaju response.failed. | Svi modeli |
output | array | Izlazne stavke redoslijedom kojim ih je model proizveo: reasoning, message, function_call. | Svi modeli |
usage | object | input_tokens, output_tokens i total_tokens. | Svi modeli |
usage.input_tokens_details | object | cached_tokens: ulazni tokeni pročitani iz keša prompta. | Hostirani open-weight modeli |
usage.output_tokens_details | object | reasoning_tokens: izlazni tokeni utrošeni na razmišljanje. | Hostirani open-weight modeli |
model | string | Kanonski id modela koji je odgovorio. | Porodica Shannon 3, hostirani open-weight modeli |
created_at | integer | Vrijeme odgovora, u Unix sekundama. | Porodica Shannon 3, hostirani open-weight modeli |
instructions, tools, temperature, … | instructions, tools i temperature ponavljaju zahtjev. error i incomplete_details su null, metadata je {}, parallel_tool_calls je true, tool_choice je auto, a top_p je null. | Porodica Shannon 3 |
Izlazne stavke
| Stavka | Opis |
|---|---|
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} | Razmišljanje modela kao jedan dio summary_text. Postoji samo kada je model razmišljao. |
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} | Odgovor: jedan dio output_text s tekstom. |
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} | Poziv alata. arguments je JSON string. Pošaljite rezultat nazad s istim call_id. |
OpenAI SDK-ovi za vas spajaju tekst poruke u response.output_text.
Streaming
Postavite stream na true za server-sent events. Svaki frame ima liniju event: s imenom događaja i liniju data: s JSON objektom; objekat ponavlja ime u type. Delte uparujte s njihovom stavkom preko output_index.
Uz OpenAI SDK, čitajte događaje po njihovom 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
}' Događaji stižu ovim redoslijedom. Grupe za razmišljanje, poruku i pozive alata pojavljuju se samo kada ih odgovor ima.
| Događaj | Sadržaj | Kada |
|---|---|---|
response.created | response | Uvijek prvi. response.status je in_progress, a response.output je prazan. |
response.in_progress | response | Uvijek drugi, s istim objektom. |
response.output_item.added | output_index, item | Počinje razmišljanje: stavka reasoning s praznim summary. |
response.reasoning_summary_text.delta | output_index, summary_index, delta | Dio razmišljanja. |
response.reasoning_summary_text.done | output_index, summary_index, text | Razmišljanje je završeno: njegov cijeli text. |
response.output_item.done | output_index, item | Završena stavka reasoning. |
response.output_item.added | output_index, item | Počinje odgovor: stavka message sa statusom in_progress i bez sadržaja. |
response.content_part.added | output_index, content_index, part | Otvara se prazan dio output_text. |
response.output_text.delta | output_index, content_index, delta | Dio odgovora. |
response.output_text.done | output_index, content_index, text | Odgovor je završen: njegov cijeli text. |
response.content_part.done | output_index, content_index, part | Završen dio output_text. |
response.output_item.done | output_index, item | Završena stavka message, sa statusom completed. |
response.output_item.added | output_index, item | Počinje poziv alata: stavka function_call sa call_id, name i praznim arguments. |
response.function_call_arguments.delta | output_index, delta | Argumenti poziva, kompletni u jednoj delti. |
response.function_call_arguments.done | output_index, arguments | Isti argumenti, kao arguments. |
response.output_item.done | output_index, item | Završena stavka function_call. |
response.completed | response | Uvijek zadnji pri uspjehu: cijeli objekat odgovora s output i 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}, …}} Stream koji ne uspije
Na Shannon nivoima neuspjeli odgovor završava s response.failed umjesto response.completed. Njegov response.status je failed, a response.error sadrži code, rate_limit_exceeded ili server_error, i message.
Na hostiranim open-weight modelima greška je događaj error s code api_error i message. Iza njega i dalje slijedi response.completed.
Smatrajte stream neuspjelim kada sadrži response.failed ili događaj error, i pošaljite zahtjev ponovo.
Alati
Alat je funkcija koju pokreće vaš kod. Opišite ga u tools; kada ga model želi, odgovor sadrži stavku function_call umjesto poruke ili pored nje.
Definicija alata u tools:
[
{
"type": "function",
"name": "get_weather",
"description": "Current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] output odgovora koji ga poziva:
[
{
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function_call",
"name": "get_weather",
"call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"arguments": "{\"city\":\"Paris\"}"
}
] Pokrenite funkciju, zatim ponovo pošaljite zahtjev s pozivom i njegovim rezultatom dodanim u 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\"}"
}
] Čitaju se samo alati tipa function. Na shannon-1.6-*, shannon-2-* i shannon-coder-1 šema parameters svodi se na zajedničke ključne riječi JSON Schema: oneOf se čita kao anyOf, a ključne riječi kao što su $ref, additionalProperties, const, default i title ne prosljeđuju se modelu.
Vrijednosti tool_choice required i imenovana funkcija primjenjuju hostirani open-weight modeli.
Petlja alata opisana je u cijelosti na vlastitoj stranici. Pozivanje funkcija
Strukturirani izlaz
Ovaj format strukturirani izlaz piše kao text.format. Šema stoji direktno u format, pored name i strict, a ne pod članom json_schema kao na Chat Completions.
{"type": "json_object"}traži bilo koji JSON objekat.{"type": "json_schema", "name", "schema", "strict"}traži JSON koji prati vašu šemu.strictjetruekada ga izostavite.
{
"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 stiže kao tekst u dijelu output_text poruke; parsirajte ga sami. Hostirani open-weight model bez strukturiranog izlaza vraća 400.
{"city": "Lisbon", "date": "2027-05-12"} Koji model prima koji oblik navedeno je na vlastitoj stranici. Strukturirani izlazi
Razmišljanje
Model koji razmišlja vraća svoje razmišljanje kao izlaznu stavku tipa reasoning, prije poruke. U streamu stiže kao događaji response.reasoning_summary_text.delta.
Hostirani open-weight modeli primjenjuju reasoning.effort: off, low, medium ili high, a high kada ne pošaljete ništa. off ne vraća stavku razmišljanja. Pošaljite ga kao objekat; goli string se na ovom endpointu ne čita.
Jačine razmišljanja opisane su na vlastitoj stranici. Reasoning effort
Ograničenje izlaza
max_output_tokens je 4,096 kada ga ne pošaljete. To je broj tokena izdvojen sa vašeg stanja kada zahtjev počne; kada je odgovor kompletan, taj iznos se zamjenjuje onim što je zahtjev iskoristio. Vrijednost koja ne stane u vaše preostalo stanje vraća 429 Quota exceeded.
Ograničava dužinu odgovora na shannon-1.6-*, shannon-2-* i shannon-coder-1, te dužinu teksta odgovora na hostiranim open-weight modelima.
Na ovom endpointu shannon-coder-1 se naplaćuje u tokenima sa vašeg stanja, kao i svaki drugi model.
Tijelo zahtjeva može imati do 32 MiB. Ograničenja i stanje
Greške
Greške koriste OpenAI tijelo greške: objekat error s type i message; neke nose i code i param s vrijednošću null. Tabela navodi ono što ovaj endpoint najčešće vraća. Puna lista, s onim što treba ponoviti, ima svoju stranicu. Upravljanje greškama
| Status | Tip | Poruka | Kada |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | API ključ nije poslan, ili je ključ nepoznat ili opozvan. |
400 | invalid_request_error | unknown model: <id> | model nedostaje ili nije objavljeni id. |
400 | invalid_request_error | No user message provided. | Shannon nivoi: input ne sadrži korisnički tekst. |
400 | invalid_request_error | <id> does not accept image input | Slika je poslana hostiranom open-weight modelu bez ulaza slika. |
400 | invalid_request_error | <id> does not accept response_format | text.format je poslan hostiranom open-weight modelu bez strukturiranog izlaza. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning.effort sadrži vrijednost izvan liste. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Tijelo je valjan JSON, ali polje ima pogrešan tip. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_output_tokens je veći od onoga što je ostalo na vašem stanju. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood zaštita: više od 120 zahtjeva u jednoj minuti na vašem računu. |
500 | api_error | The model backend failed to answer. Please retry. | Model nije proizveo odgovor. Pošaljite zahtjev ponovo. |
502 | api_error | The model backend failed to answer. Please retry. | Isto, na hostiranim open-weight modelima. |
504 | api_error | upstream timed out | Hostirani open-weight model trebao je duže od vremenskog ograničenja odgovora bez streaminga. Pošaljite zahtjev sa stream postavljenim na true. |