Vai al contenuto
Responses API

Responses API

Nuovo

POST /v1/responses accetta istruzioni e un elenco di elementi di input e restituisce un oggetto response composto da elementi di output, nel formato OpenAI Responses. Usalo con la responses API dell'SDK OpenAI e con gli strumenti costruiti su di essa, come Codex CLI. L'endpoint non mantiene stato: invia l'intera conversazione a ogni richiesta.

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

La richiesta minima è un id di modello e un testo. La risposta non è in streaming, a meno che tu non lo richieda.

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)

La risposta è un oggetto response. Il suo output contiene il ragionamento, quando il modello ha ragionato, e il messaggio:

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

Campi della richiesta

model e input sono ciò che serve a una richiesta. La colonna Applicato da indica i modelli su cui un campo cambia la risposta. I modelli open-weight ospitati sono i dodici id dell'elenco dei modelli; la famiglia Shannon 3 è shannon-3, shannon-3-pro, shannon-3.1 e shannon-3.1-pro. Modelli e prezzi

Campo Tipo Default Descrizione Applicato da
model string Obbligatorio. Un id dell'elenco dei modelli. Il confronto non distingue maiuscole e minuscole. Un id mancante o non pubblicato restituisce 400 unknown model. Tutti i modelli
input string | array Una stringa, che viene letta come un unico messaggio dell'utente, oppure un array di elementi di input. Vedi Elementi di input più sotto. Tutti i modelli
instructions string Istruzioni per il modello, il system prompt di questo formato. Modelli open-weight ospitati, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true invia la risposta come server-sent events. Vedi Streaming più sotto. Tutti i modelli
max_output_tokens integer 4096 Limite massimo della risposta, in token. Un valore fuori dall'intervallo da 1 a 65,536 viene riportato in quell'intervallo. È anche la quantità messa da parte dal tuo saldo mentre la richiesta è in corso. Vedi Limite di output più sotto. Modelli open-weight ospitati, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Temperatura di campionamento. Sui modelli open-weight ospitati i valori vengono mantenuti tra 0 e 2. Modelli open-weight ospitati; shannon-1.6-*, shannon-2-* e shannon-coder-1 nelle risposte senza streaming
top_p number Nucleus sampling. I valori vengono mantenuti tra 0 e 1. Modelli open-weight ospitati
tools array Le funzioni che il modello può chiamare, nella forma piatta di questo formato: {"type": "function", "name", "description", "parameters"}. Vedi Tool più sotto. Tutti i modelli
tool_choice string | object auto "auto" lascia decidere al modello. "required" lo obbliga a chiamare un tool. {"type": "function", "name": "…"} lo obbliga a chiamare quel tool. Modelli open-weight ospitati
reasoning object {"effort": "…"} con off, low, medium o high. Qualsiasi altro valore restituisce 400. Modelli open-weight ospitati
text object {"format": {…}} richiede una risposta JSON. Vedi Output strutturato più sotto. Tutti i livelli Shannon; modelli open-weight ospitati come elencato per id

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user e prompt_cache_key vengono accettati affinché il codice client esistente funzioni senza modifiche. Non cambiano la risposta. Poiché nessuna conversazione viene memorizzata, una richiesta successiva porta i turni precedenti in input.

Elementi di input

Un elemento di input è o un messaggio, con un role e un content, oppure un elemento tipizzato che porta una chiamata di tool o il suo risultato. content è una stringa o un array di parti.

Elemento Descrizione Applicato da
{"role": "user", "content": …} Ciò che chiedi. content è una stringa, oppure parti input_text e input_image. Tutti i modelli
{"role": "assistant", "content": …} Una risposta precedente del modello. content è una stringa, oppure parti output_text. Tutti i modelli
{"role": "system", "content": …}
{"role": "developer", "content": …}
Istruzioni all'interno della conversazione. Modelli open-weight ospitati
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Una chiamata di tool fatta dal modello in una risposta precedente. arguments è una stringa JSON. Tutti i modelli
{"type": "function_call_output", "call_id": "…", "output": "…"} Il risultato di quella chiamata. call_id è l'id della chiamata e output il risultato come stringa. Tutti i modelli

Metti le istruzioni nel campo instructions. Con un id della famiglia Shannon 3, metti le istruzioni che devono valere nel messaggio user.

Gli elementi di output di una risposta possono tornare in input così come sono: gli elementi message e function_call vengono letti, gli elementi reasoning vengono saltati.

Parti di contenuto

Parte Descrizione Disponibile su
{"type": "input_text", "text": "…"} Testo di un messaggio dell'utente. Tutti i modelli
{"type": "output_text", "text": "…"} Testo di un messaggio dell'assistente. Tutti i modelli
{"type": "input_image", "image_url": "…"} Un'immagine, come URL data: con contenuto base64 oppure come URL http(s). Famiglia Shannon 3, shannon-1.6-lite, shannon-1.6-pro e i modelli open-weight ospitati che elencano l'input di immagini
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} Un documento (PDF, Word, PowerPoint o Excel): file_data contiene un URL data:, oppure file_url un URL http(s). Famiglia Shannon 3

Sui livelli Shannon immagini e file vengono letti dall'ultimo elemento user di input. Dimensioni e limiti hanno una pagina propria. Immagini e file

Una richiesta con istruzioni e opzioni

Questa richiesta invia istruzioni, una conversazione come elementi di input, un limite di output, una temperatura e un livello di ragionamento. Usa un modello open-weight ospitato, che li applica tutti.

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)

La risposta di un modello open-weight ospitato ha id, object, model, created_at, status, output e usage. Il suo usage aggiunge i token letti dalla cache e i token spesi in ragionamento:

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

L'oggetto response

id, object, status, output e usage sono presenti in ogni risposta. Costruisci il tuo codice su questi.

Campo Tipo Descrizione Inviato da
id string resp_ seguito da 32 caratteri esadecimali. Tutti i modelli
object string Sempre response. Tutti i modelli
status string completed. In uno stream è prima in_progress, e failed in un evento response.failed. Tutti i modelli
output array Gli elementi di output nell'ordine in cui il modello li ha prodotti: reasoning, message, function_call. Tutti i modelli
usage object input_tokens, output_tokens e total_tokens. Tutti i modelli
usage.input_tokens_details object cached_tokens: i token di input letti dalla prompt cache. Modelli open-weight ospitati
usage.output_tokens_details object reasoning_tokens: i token di output spesi in ragionamento. Modelli open-weight ospitati
model string L'id canonico del modello che ha risposto. Famiglia Shannon 3, modelli open-weight ospitati
created_at integer Ora della risposta, in secondi Unix. Famiglia Shannon 3, modelli open-weight ospitati
instructions, tools, temperature, … instructions, tools e temperature ripetono la richiesta. error e incomplete_details sono null, metadata è {}, parallel_tool_calls è true, tool_choice è auto e top_p è null. Famiglia Shannon 3

Elementi di output

Elemento Descrizione
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} Il ragionamento del modello come un'unica parte summary_text. Presente solo quando il modello ha ragionato.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} La risposta: una parte output_text con il testo.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Una chiamata di tool. arguments è una stringa JSON. Rimanda il risultato con lo stesso call_id.

Gli SDK OpenAI uniscono per te il testo del messaggio in response.output_text.

Streaming

Imposta stream su true per i server-sent events. Ogni frame ha una riga event: con il nome dell'evento e una riga data: con un oggetto JSON; l'oggetto ripete il nome in type. Associa i delta al loro elemento tramite output_index.

Con l'SDK OpenAI, leggi gli eventi dal loro 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")

Gli eventi arrivano in questo ordine. I gruppi per il ragionamento, il messaggio e le chiamate di tool compaiono solo quando la risposta li contiene.

Evento Payload Quando
response.created response Sempre primo. response.status è in_progress e response.output è vuoto.
response.in_progress response Sempre secondo, con lo stesso oggetto.
response.output_item.added output_index, item Il ragionamento inizia: un elemento reasoning con summary vuoto.
response.reasoning_summary_text.delta output_index, summary_index, delta Un pezzo del ragionamento.
response.reasoning_summary_text.done output_index, summary_index, text Il ragionamento è completo: il suo intero text.
response.output_item.done output_index, item L'elemento reasoning completato.
response.output_item.added output_index, item La risposta inizia: un elemento message con stato in_progress e senza contenuto.
response.content_part.added output_index, content_index, part Si apre una parte output_text vuota.
response.output_text.delta output_index, content_index, delta Un pezzo della risposta.
response.output_text.done output_index, content_index, text La risposta è completa: il suo intero text.
response.content_part.done output_index, content_index, part La parte output_text completata.
response.output_item.done output_index, item L'elemento message completato, con stato completed.
response.output_item.added output_index, item Inizia una chiamata di tool: un elemento function_call con call_id, name e arguments vuoto.
response.function_call_arguments.delta output_index, delta Gli argomenti della chiamata, completi in un solo delta.
response.function_call_arguments.done output_index, arguments Gli stessi argomenti, come arguments.
response.output_item.done output_index, item L'elemento function_call completato.
response.completed response Sempre ultimo in caso di successo: l'intero oggetto response con output e 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}, …}}

Uno stream che fallisce

Sui livelli Shannon una risposta fallita termina con response.failed al posto di response.completed. Il suo response.status è failed e response.error contiene un code, rate_limit_exceeded o server_error, e un message.

Sui modelli open-weight ospitati un errore è un evento error con code api_error e un message. response.completed segue comunque.

Considera uno stream fallito quando contiene un evento response.failed o error, e invia di nuovo la richiesta.

Tool

Un tool è una funzione che il tuo codice esegue. Descrivilo in tools; quando il modello lo vuole, la risposta contiene un elemento function_call al posto del messaggio o accanto ad esso.

Una definizione di tool in tools:

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

L'output di una risposta che la chiama:

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

Esegui la funzione, poi invia di nuovo la richiesta con la chiamata e il suo risultato aggiunti a 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\"}"
  }
]

Vengono letti solo i tool di tipo function. Su shannon-1.6-*, shannon-2-* e shannon-coder-1 lo schema parameters viene ridotto alle parole chiave comuni di JSON Schema: oneOf viene letto come anyOf, e parole chiave come $ref, additionalProperties, const, default e title non vengono passate al modello.

I valori di tool_choice required e una funzione indicata per nome vengono applicati dai modelli open-weight ospitati.

Il ciclo dei tool è descritto per intero nella sua pagina. Chiamata di funzioni

Output strutturato

Questo formato scrive l'output strutturato come text.format. Lo schema sta direttamente in format, accanto a name e strict, non sotto un membro json_schema come su Chat Completions.

  • {"type": "json_object"} richiede un qualsiasi oggetto JSON.
  • {"type": "json_schema", "name", "schema", "strict"} richiede JSON conforme al tuo schema. strict è true quando lo ometti.
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"
        ]
      }
    }
  }
}

Il JSON arriva come testo nella parte output_text del messaggio; analizzalo tu. Un modello open-weight ospitato senza output strutturato restituisce 400.

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

Quale modello accetta quale forma è elencato nella sua pagina. Output strutturati

Ragionamento

Un modello che ragiona restituisce il proprio ragionamento come elemento di output di tipo reasoning, prima del messaggio. In uno stream arriva come eventi response.reasoning_summary_text.delta.

I modelli open-weight ospitati applicano reasoning.effort: off, low, medium o high, con high quando non invii nulla. off non restituisce alcun elemento di ragionamento. Invialo come oggetto; una semplice stringa non viene letta su questo endpoint.

I livelli di effort sono descritti nella loro pagina. Sforzo di ragionamento

Limite di output

max_output_tokens è 4,096 quando non lo invii. È il numero di token messi da parte dal tuo saldo all'avvio della richiesta; a risposta completa, quella quantità viene sostituita da ciò che la richiesta ha usato. Un valore che non rientra nel saldo residuo restituisce 429 Quota exceeded.

Limita la lunghezza della risposta su shannon-1.6-*, shannon-2-* e shannon-coder-1, e la lunghezza del testo della risposta sui modelli open-weight ospitati.

Su questo endpoint shannon-coder-1 viene addebitato in token dal tuo saldo, come ogni altro modello.

Il corpo di una richiesta può arrivare a 32 MiB. Limiti e saldo

Errori

Gli errori usano il corpo di errore OpenAI: un oggetto error con type e message; alcuni portano anche code e param con il valore null. La tabella elenca ciò che questo endpoint restituisce più spesso. L'elenco completo, con cosa riprovare, ha una pagina propria. Gestione errori

Stato Tipo Messaggio Quando
401 authentication_error Missing authentication
Invalid API key
Non è stata inviata alcuna chiave API, oppure la chiave è sconosciuta o revocata.
400 invalid_request_error unknown model: <id> model manca o non è un id pubblicato.
400 invalid_request_error No user message provided. Livelli Shannon: input non contiene testo dell'utente.
400 invalid_request_error <id> does not accept image input Un'immagine è stata inviata a un modello open-weight ospitato senza input di immagini.
400 invalid_request_error <id> does not accept response_format text.format è stato inviato a un modello open-weight ospitato senza output strutturato.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high reasoning.effort contiene un valore fuori dall'elenco.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … Il corpo è JSON valido ma un campo ha il tipo sbagliato.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_tokens è maggiore di ciò che resta del tuo saldo.
429 rate_limit_error Too many requests. Retry in <n>s. Flood protection: più di 120 richieste in un minuto sul tuo account.
500 api_error The model backend failed to answer. Please retry. Il modello non ha prodotto una risposta. Invia di nuovo la richiesta.
502 api_error The model backend failed to answer. Please retry. Lo stesso, sui modelli open-weight ospitati.
504 api_error upstream timed out Un modello open-weight ospitato ha impiegato più del limite di tempo di una risposta senza streaming. Invia la richiesta con stream impostato su true.