Sari la conținut
Responses API

Responses API

Nou

POST /v1/responses primește instrucțiuni și o listă de elemente de intrare și returnează un obiect de răspuns format din elemente de ieșire, în formatul OpenAI Responses. Folosește-l cu API-ul responses al SDK-ului OpenAI și cu instrumentele construite pe el, precum Codex CLI. Endpoint-ul nu păstrează stare: trimite întreaga conversație cu fiecare cerere.

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

Cea mai mică cerere este un id de model și un text. Răspunsul nu are streaming dacă nu îl ceri.

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)

Răspunsul este un obiect de răspuns. output conține raționamentul, când modelul a raționat, și mesajul:

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
  }
}

Câmpuri de cerere

model și input sunt ce are nevoie o cerere. Coloana Aplicat de numește modelele pe care un câmp schimbă răspunsul. Modelele open-weight găzduite sunt cele douăsprezece id-uri din lista de modele; familia Shannon 3 este shannon-3, shannon-3-pro, shannon-3.1 și shannon-3.1-pro. Modele și prețuri

Câmp Tip Implicit Descriere Aplicat de
model string Obligatoriu. Un id din lista de modele. Potrivirea nu ține cont de majuscule. Un id lipsă sau nepublicat returnează 400 unknown model. Toate modelele
input string | array Un șir, citit ca un singur mesaj de utilizator, sau un array de elemente de intrare. Vezi Elementele de intrare mai jos. Toate modelele
instructions string Instrucțiuni pentru model, system prompt-ul acestui format. Modele open-weight găzduite, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true trimite răspunsul ca server-sent events. Vezi Streaming mai jos. Toate modelele
max_output_tokens integer 4096 Limita superioară a răspunsului, în token-uri. O valoare în afara intervalului 1 – 65,536 este mutată în acel interval. Este și suma pusă deoparte din soldul tău cât rulează cererea. Vezi Limita ieșirii mai jos. Modele open-weight găzduite, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Temperatura de eșantionare. La modelele open-weight găzduite valorile sunt păstrate între 0 și 2. Modele open-weight găzduite; shannon-1.6-*, shannon-2-* și shannon-coder-1 la răspunsurile fără streaming
top_p number Eșantionare nucleus. Valorile sunt păstrate între 0 și 1. Modele open-weight găzduite
tools array Funcțiile pe care modelul le poate apela, în forma plată a acestui format: {"type": "function", "name", "description", "parameters"}. Vezi Instrumentele mai jos. Toate modelele
tool_choice string | object auto "auto" lasă modelul să decidă. "required" îl obligă să apeleze un instrument. {"type": "function", "name": "…"} îl obligă să apeleze acel instrument. Modele open-weight găzduite
reasoning object {"effort": "…"} cu off, low, medium sau high. Orice altă valoare returnează 400. Modele open-weight găzduite
text object {"format": {…}} cere un răspuns JSON. Vezi Ieșirea structurată mai jos. Toate nivelurile Shannon; modelele open-weight găzduite așa cum sunt listate pe id

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user și prompt_cache_key sunt acceptate pentru ca codul client existent să ruleze neschimbat. Ele nu schimbă răspunsul. Fiindcă nu se stochează nicio conversație, o cerere ulterioară poartă rundele anterioare în input.

Elemente de intrare

Un element de intrare este fie un mesaj, cu role și content, fie un element tipizat care poartă un apel de instrument sau rezultatul lui. content este un șir sau un array de părți.

Element Descriere Aplicat de
{"role": "user", "content": …} Ce întrebi. content este un șir sau părți input_text și input_image. Toate modelele
{"role": "assistant", "content": …} Un răspuns anterior al modelului. content este un șir sau părți output_text. Toate modelele
{"role": "system", "content": …}
{"role": "developer", "content": …}
Instrucțiuni în interiorul conversației. Modele open-weight găzduite
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Un apel de instrument făcut de model într-un răspuns anterior. arguments este un șir JSON. Toate modelele
{"type": "function_call_output", "call_id": "…", "output": "…"} Rezultatul acelui apel. call_id este id-ul apelului, iar output rezultatul ca șir. Toate modelele

Pune instrucțiunile în câmpul instructions. Cu un id din familia Shannon 3, pune instrucțiunile care trebuie respectate în mesajul user.

Elementele din output ale unui răspuns se pot întoarce în input așa cum sunt: elementele message și function_call sunt citite, elementele reasoning sunt sărite.

Părți de conținut

Parte Descriere Disponibil pe
{"type": "input_text", "text": "…"} Textul unui mesaj de utilizator. Toate modelele
{"type": "output_text", "text": "…"} Textul unui mesaj al asistentului. Toate modelele
{"type": "input_image", "image_url": "…"} O imagine, ca URL data: cu conținut base64 sau ca URL http(s). Familia Shannon 3, shannon-1.6-lite, shannon-1.6-pro și modelele open-weight găzduite care listează intrare de imagini
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} Un document (PDF, Word, PowerPoint sau Excel): file_data conține un URL data:, sau file_url un URL http(s). Familia Shannon 3

La nivelurile Shannon, imaginile și fișierele sunt citite din ultimul element user din input. Mărimile și limitele au pagina lor. Imagini și fișiere

O cerere cu instrucțiuni și opțiuni

Această cerere trimite instrucțiuni, o conversație ca elemente de intrare, o limită de ieșire, o temperatură și un efort de raționament. Folosește un model open-weight găzduit, care le aplică pe toate.

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)

Răspunsul unui model open-weight găzduit are id, object, model, created_at, status, output și usage. usage adaugă token-urile citite din cache și token-urile cheltuite pe raționament:

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

Obiectul de răspuns

id, object, status, output și usage sunt în fiecare răspuns. Construiește-ți codul pe acestea.

Câmp Tip Descriere Trimis de
id string resp_ urmat de 32 de caractere hexazecimale. Toate modelele
object string Întotdeauna response. Toate modelele
status string completed. Într-un stream este mai întâi in_progress, iar failed într-un eveniment response.failed. Toate modelele
output array Elementele de ieșire în ordinea în care le-a produs modelul: reasoning, message, function_call. Toate modelele
usage object input_tokens, output_tokens și total_tokens. Toate modelele
usage.input_tokens_details object cached_tokens: token-urile de intrare citite din cache-ul de prompt. Modele open-weight găzduite
usage.output_tokens_details object reasoning_tokens: token-urile de ieșire cheltuite pe raționament. Modele open-weight găzduite
model string Id-ul canonic al modelului care a răspuns. Familia Shannon 3, modele open-weight găzduite
created_at integer Momentul răspunsului, în secunde Unix. Familia Shannon 3, modele open-weight găzduite
instructions, tools, temperature, … instructions, tools și temperature repetă cererea. error și incomplete_details sunt null, metadata este {}, parallel_tool_calls este true, tool_choice este auto, iar top_p este null. Familia Shannon 3

Elemente de ieșire

Element Descriere
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} Raționamentul modelului ca o parte summary_text. Prezent doar când modelul a raționat.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} Răspunsul: o parte output_text cu textul.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Un apel de instrument. arguments este un șir JSON. Trimite rezultatul înapoi cu același call_id.

SDK-urile OpenAI unesc pentru tine textul mesajului în response.output_text.

Streaming

Setează stream la true pentru server-sent events. Fiecare frame are o linie event: cu numele evenimentului și o linie data: cu un obiect JSON; obiectul repetă numele în type. Asociază delta-urile cu elementul lor după output_index.

Cu SDK-ul OpenAI, citește evenimentele după 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")

Evenimentele sosesc în această ordine. Grupurile pentru raționament, mesaj și apeluri de instrumente apar doar când răspunsul le are.

Eveniment Payload Când
response.created response Întotdeauna primul. response.status este in_progress, iar response.output este gol.
response.in_progress response Întotdeauna al doilea, cu același obiect.
response.output_item.added output_index, item Raționamentul începe: un element reasoning cu summary gol.
response.reasoning_summary_text.delta output_index, summary_index, delta O bucată din raționament.
response.reasoning_summary_text.done output_index, summary_index, text Raționamentul este complet: întregul său text.
response.output_item.done output_index, item Elementul reasoning încheiat.
response.output_item.added output_index, item Răspunsul începe: un element message cu statusul in_progress și fără conținut.
response.content_part.added output_index, content_index, part Se deschide o parte output_text goală.
response.output_text.delta output_index, content_index, delta O bucată din răspuns.
response.output_text.done output_index, content_index, text Răspunsul este complet: întregul său text.
response.content_part.done output_index, content_index, part Partea output_text încheiată.
response.output_item.done output_index, item Elementul message încheiat, cu statusul completed.
response.output_item.added output_index, item Un apel de instrument începe: un element function_call cu call_id, name și arguments goale.
response.function_call_arguments.delta output_index, delta Argumentele apelului, complete într-un singur delta.
response.function_call_arguments.done output_index, arguments Aceleași argumente, ca arguments.
response.output_item.done output_index, item Elementul function_call încheiat.
response.completed response Întotdeauna ultimul la succes: întregul obiect de răspuns cu output și 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}, …}}

Un stream care eșuează

La nivelurile Shannon, un răspuns eșuat se termină cu response.failed în locul lui response.completed. response.status este failed, iar response.error conține un code, rate_limit_exceeded sau server_error, și un message.

La modelele open-weight găzduite, un eșec este un eveniment error cu code api_error și un message. response.completed urmează totuși după el.

Tratează un stream ca eșuat când conține un eveniment response.failed sau error și trimite cererea din nou.

Instrumente

Un instrument este o funcție pe care o rulează codul tău. Descrie-l în tools; când modelul îl vrea, răspunsul conține un element function_call în locul mesajului sau lângă el.

O definiție de instrument în tools:

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

output al unui răspuns care îl apelează:

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

Rulează funcția, apoi trimite din nou cererea, cu apelul și rezultatul lui adăugate în input:

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\"}"
  }
]

Sunt citite doar instrumentele de tip function. Pe shannon-1.6-*, shannon-2-* și shannon-coder-1, schema parameters este redusă la cuvintele-cheie comune JSON Schema: oneOf este citit ca anyOf, iar cuvinte-cheie precum $ref, additionalProperties, const, default și title nu sunt transmise modelului.

Valorile tool_choice required și o funcție numită sunt aplicate de modelele open-weight găzduite.

Bucla instrumentelor este descrisă complet pe pagina ei. Apelare funcții

Ieșire structurată

Acest format scrie ieșirea structurată ca text.format. Schema stă direct în format, lângă name și strict, nu sub un membru json_schema ca la Chat Completions.

  • {"type": "json_object"} cere orice obiect JSON.
  • {"type": "json_schema", "name", "schema", "strict"} cere JSON care urmează schema ta. strict este true când îl omiți.
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"
        ]
      }
    }
  }
}

JSON-ul sosește ca text în partea output_text a mesajului; parsează-l singur. Un model open-weight găzduit fără ieșire structurată returnează 400.

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

Care model acceptă ce formă este listat pe pagina lui. Rezultate structurate

Raționament

Un model care raționează returnează raționamentul ca element de ieșire de tip reasoning, înaintea mesajului. Într-un stream sosește ca evenimente response.reasoning_summary_text.delta.

Modelele open-weight găzduite aplică reasoning.effort: off, low, medium sau high, cu high când nu trimiți nimic. off nu returnează niciun element de raționament. Trimite-l ca obiect; un șir simplu nu este citit pe acest endpoint.

Eforturile sunt descrise pe pagina lor. Efort de raționament

Limita ieșirii

max_output_tokens este 4,096 când nu îl trimiți. Este numărul de token-uri pus deoparte din soldul tău la începutul cererii; când răspunsul este complet, această sumă este înlocuită cu ce a folosit cererea. O valoare care nu încape în soldul tău rămas returnează 429 Quota exceeded.

Limitează lungimea răspunsului la shannon-1.6-*, shannon-2-* și shannon-coder-1, iar la modelele open-weight găzduite lungimea textului răspunsului.

Pe acest endpoint, shannon-coder-1 este taxat în token-uri din soldul tău, ca orice alt model.

Corpul unei cereri poate avea până la 32 MiB. Limite și sold

Erori

Erorile folosesc corpul de eroare OpenAI: un obiect error cu type și message; unele conțin și code și param cu valoarea null. Tabelul listează ce returnează cel mai des acest endpoint. Lista completă, cu ce trebuie reîncercat, are pagina ei. Gestionare erori

Status Tip Mesaj Când
401 authentication_error Missing authentication
Invalid API key
Nu s-a trimis nicio cheie API sau cheia este necunoscută ori revocată.
400 invalid_request_error unknown model: <id> model lipsește sau nu este un id publicat.
400 invalid_request_error No user message provided. Nivelurile Shannon: input nu conține text de utilizator.
400 invalid_request_error <id> does not accept image input O imagine a fost trimisă unui model open-weight găzduit fără intrare de imagini.
400 invalid_request_error <id> does not accept response_format text.format a fost trimis unui model open-weight găzduit fără ieșire structurată.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high reasoning.effort conține o valoare din afara listei.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … Corpul este JSON valid, dar un câmp are tipul greșit.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_tokens este mai mare decât ce a rămas din soldul tău.
429 rate_limit_error Too many requests. Retry in <n>s. Protecție anti-flood: mai mult de 120 de cereri într-un minut pe contul tău.
500 api_error The model backend failed to answer. Please retry. Modelul nu a produs un răspuns. Trimite cererea din nou.
502 api_error The model backend failed to answer. Please retry. La fel, la modelele open-weight găzduite.
504 api_error upstream timed out Un model open-weight găzduit a durat mai mult decât limita de timp a unui răspuns fără streaming. Trimite cererea cu stream setat la true.