Przejdź do treści
Responses API

Responses API

Nowe

POST /v1/responses przyjmuje instrukcje i listę elementów wejścia, a zwraca obiekt odpowiedzi złożony z elementów wyjścia, w formacie OpenAI Responses. Używaj go z API responses z SDK OpenAI i z narzędziami na nim zbudowanymi, takimi jak Codex CLI. Endpoint nie przechowuje stanu: wysyłaj całą rozmowę z każdym zapytaniem.

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

Najmniejsze zapytanie to id modelu i tekst. Odpowiedź nie jest streamowana, dopóki o to nie poprosisz.

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)

Odpowiedź to obiekt odpowiedzi. Jego output zawiera wnioskowanie, jeśli model wnioskował, oraz wiadomość:

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

Pola zapytania

model i input to to, czego potrzebuje zapytanie. Kolumna Stosowane przez podaje modele, w których pole zmienia odpowiedź. Hostowane modele open-weight to dwanaście id z listy modeli; rodzina Shannon 3 to shannon-3, shannon-3-pro, shannon-3.1 i shannon-3.1-pro. Modele i ceny

Pole Typ Domyślnie Opis Stosowane przez
model string Wymagane. Id z listy modeli. Dopasowanie nie rozróżnia wielkości liter. Brakujące lub nieopublikowane id zwraca 400 unknown model. Wszystkie modele
input string | array Ciąg znaków, który jest czytany jako jedna wiadomość użytkownika, albo tablica elementów wejścia. Zobacz Elementy wejścia niżej. Wszystkie modele
instructions string Instrukcje dla modelu, prompt systemowy tego formatu. Hostowane modele open-weight, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true wysyła odpowiedź jako server-sent events. Zobacz Streaming niżej. Wszystkie modele
max_output_tokens integer 4096 Górny limit odpowiedzi, w tokenach. Wartość spoza zakresu od 1 do 65,536 jest przesuwana do tego zakresu. To także kwota odłożona z Twojego salda na czas zapytania. Zobacz Limit wyjścia niżej. Hostowane modele open-weight, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Temperatura próbkowania. W hostowanych modelach open-weight wartości są utrzymywane między 0 a 2. Hostowane modele open-weight; shannon-1.6-*, shannon-2-* i shannon-coder-1 w odpowiedziach bez streamingu
top_p number Próbkowanie nucleus. Wartości są utrzymywane między 0 a 1. Hostowane modele open-weight
tools array Funkcje, które model może wywołać, w płaskiej formie tego formatu: {"type": "function", "name", "description", "parameters"}. Zobacz Narzędzia niżej. Wszystkie modele
tool_choice string | object auto "auto" pozwala modelowi zdecydować. "required" każe mu wywołać narzędzie. {"type": "function", "name": "…"} każe mu wywołać to narzędzie. Hostowane modele open-weight
reasoning object {"effort": "…"} z off, low, medium lub high. Każda inna wartość zwraca 400. Hostowane modele open-weight
text object {"format": {…}} prosi o odpowiedź w JSON. Zobacz Ustrukturyzowane wyjście niżej. Wszystkie poziomy Shannon; hostowane modele open-weight zgodnie z listą dla każdego id

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user i prompt_cache_key są akceptowane, aby istniejący kod klienta działał bez zmian. Nie zmieniają odpowiedzi. Ponieważ żadna rozmowa nie jest przechowywana, kolejne zapytanie niesie wcześniejsze tury w input.

Elementy wejścia

Element wejścia to albo wiadomość z role i content, albo element z typem, który niesie wywołanie narzędzia lub jego wynik. content to ciąg znaków albo tablica części.

Element Opis Stosowane przez
{"role": "user", "content": …} To, o co pytasz. content to ciąg znaków albo części input_text i input_image. Wszystkie modele
{"role": "assistant", "content": …} Wcześniejsza odpowiedź modelu. content to ciąg znaków albo części output_text. Wszystkie modele
{"role": "system", "content": …}
{"role": "developer", "content": …}
Instrukcje wewnątrz rozmowy. Hostowane modele open-weight
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Wywołanie narzędzia, które model wykonał we wcześniejszej odpowiedzi. arguments to ciąg JSON. Wszystkie modele
{"type": "function_call_output", "call_id": "…", "output": "…"} Wynik tego wywołania. call_id to id wywołania, a output to wynik jako ciąg znaków. Wszystkie modele

Umieść instrukcje w polu instructions. Z id rodziny Shannon 3 instrukcje, które muszą obowiązywać, umieść w wiadomości user.

Elementy output odpowiedzi mogą wrócić do input bez zmian: elementy message i function_call są czytane, elementy reasoning są pomijane.

Części treści

Część Opis Dostępne w
{"type": "input_text", "text": "…"} Tekst wiadomości użytkownika. Wszystkie modele
{"type": "output_text", "text": "…"} Tekst wiadomości asystenta. Wszystkie modele
{"type": "input_image", "image_url": "…"} Obraz, jako URL data: z treścią base64 albo jako URL http(s). Rodzina Shannon 3, shannon-1.6-lite, shannon-1.6-pro oraz hostowane modele open-weight, które podają wejście obrazów
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} Dokument (PDF, Word, PowerPoint lub Excel): file_data zawiera URL data:, a file_url URL http(s). Rodzina Shannon 3

W poziomach Shannon obrazy i pliki są czytane z ostatniego elementu user w input. Rozmiary i limity mają własną stronę. Obrazy i pliki

Zapytanie z instrukcjami i opcjami

To zapytanie wysyła instrukcje, rozmowę jako elementy wejścia, limit wyjścia, temperaturę i wysiłek wnioskowania. Używa hostowanego modelu open-weight, który stosuje wszystkie z nich.

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)

Odpowiedź hostowanego modelu open-weight ma id, object, model, created_at, status, output i usage. Jego usage dodaje tokeny odczytane z cache i tokeny zużyte na wnioskowanie:

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

Obiekt odpowiedzi

id, object, status, output i usage są w każdej odpowiedzi. Na nich buduj swój kod.

Pole Typ Opis Wysyłane przez
id string resp_ i po nim 32 znaki szesnastkowe. Wszystkie modele
object string Zawsze response. Wszystkie modele
status string completed. W streamie najpierw jest in_progress, a failed w zdarzeniu response.failed. Wszystkie modele
output array Elementy wyjścia w kolejności, w jakiej wytworzył je model: reasoning, message, function_call. Wszystkie modele
usage object input_tokens, output_tokens i total_tokens. Wszystkie modele
usage.input_tokens_details object cached_tokens: tokeny wejścia odczytane z cache promptów. Hostowane modele open-weight
usage.output_tokens_details object reasoning_tokens: tokeny wyjścia zużyte na wnioskowanie. Hostowane modele open-weight
model string Kanoniczne id modelu, który odpowiedział. Rodzina Shannon 3, hostowane modele open-weight
created_at integer Czas odpowiedzi, w sekundach Unix. Rodzina Shannon 3, hostowane modele open-weight
instructions, tools, temperature, … instructions, tools i temperature powtarzają zapytanie. error i incomplete_details mają wartość null, metadata to {}, parallel_tool_calls to true, tool_choice to auto, a top_p to null. Rodzina Shannon 3

Elementy wyjścia

Element Opis
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} Wnioskowanie modelu jako jedna część summary_text. Obecne tylko wtedy, gdy model wnioskował.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} Odpowiedź: jedna część output_text z tekstem.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Wywołanie narzędzia. arguments to ciąg JSON. Odeślij wynik z tym samym call_id.

SDK OpenAI łączą za Ciebie tekst wiadomości w response.output_text.

Streaming

Ustaw stream na true, aby dostać server-sent events. Każda ramka ma wiersz event: z nazwą zdarzenia i wiersz data: z obiektem JSON; obiekt powtarza nazwę w type. Dopasowuj delty do ich elementu po output_index.

W SDK OpenAI czytaj zdarzenia według ich 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")

Zdarzenia przychodzą w tej kolejności. Grupy dla wnioskowania, wiadomości i wywołań narzędzi pojawiają się tylko wtedy, gdy odpowiedź je ma.

Zdarzenie Ładunek Kiedy
response.created response Zawsze pierwsze. response.status to in_progress, a response.output jest puste.
response.in_progress response Zawsze drugie, z tym samym obiektem.
response.output_item.added output_index, item Zaczyna się wnioskowanie: element reasoning z pustym summary.
response.reasoning_summary_text.delta output_index, summary_index, delta Kawałek wnioskowania.
response.reasoning_summary_text.done output_index, summary_index, text Wnioskowanie jest kompletne: jego cały text.
response.output_item.done output_index, item Gotowy element reasoning.
response.output_item.added output_index, item Zaczyna się odpowiedź: element message ze statusem in_progress i bez treści.
response.content_part.added output_index, content_index, part Otwiera się pusta część output_text.
response.output_text.delta output_index, content_index, delta Kawałek odpowiedzi.
response.output_text.done output_index, content_index, text Odpowiedź jest kompletna: jej cały text.
response.content_part.done output_index, content_index, part Gotowa część output_text.
response.output_item.done output_index, item Gotowy element message, ze statusem completed.
response.output_item.added output_index, item Zaczyna się wywołanie narzędzia: element function_call z call_id, name i pustym arguments.
response.function_call_arguments.delta output_index, delta Argumenty wywołania, kompletne w jednej delcie.
response.function_call_arguments.done output_index, arguments Te same argumenty, jako arguments.
response.output_item.done output_index, item Gotowy element function_call.
response.completed response Zawsze ostatnie przy powodzeniu: cały obiekt odpowiedzi z 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}, …}}

Stream, który się nie powiódł

W poziomach Shannon nieudana odpowiedź kończy się response.failed zamiast response.completed. Jej response.status to failed, a response.error zawiera code, rate_limit_exceeded lub server_error, oraz message.

W hostowanych modelach open-weight awaria to zdarzenie error z code api_error i message. Po nim nadal następuje response.completed.

Traktuj stream jako nieudany, gdy zawiera zdarzenie response.failed lub error, i wyślij zapytanie ponownie.

Narzędzia

Narzędzie to funkcja, którą uruchamia Twój kod. Opisz je w tools; gdy model go chce, odpowiedź zawiera element function_call zamiast wiadomości lub obok niej.

Definicja narzędzia w tools:

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

output odpowiedzi, która je wywołuje:

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

Uruchom funkcję, a potem wyślij zapytanie ponownie, dodając do input wywołanie i jego wynik:

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

Czytane są tylko narzędzia typu function. W shannon-1.6-*, shannon-2-* i shannon-coder-1 schemat parameters jest zredukowany do wspólnych słów kluczowych JSON Schema: oneOf jest czytane jako anyOf, a słowa takie jak $ref, additionalProperties, const, default i title nie są przekazywane modelowi.

Wartości tool_choice required i nazwana funkcja są stosowane przez hostowane modele open-weight.

Pętla narzędzi jest opisana w całości na jej własnej stronie. Wywołanie funkcji

Ustrukturyzowane wyjście

Ten format zapisuje ustrukturyzowane wyjście jako text.format. Schemat leży bezpośrednio w format, obok name i strict, a nie pod członem json_schema jak w Chat Completions.

  • {"type": "json_object"} prosi o dowolny obiekt JSON.
  • {"type": "json_schema", "name", "schema", "strict"} prosi o JSON zgodny z Twoim schematem. strict ma wartość true, gdy go pominiesz.
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 przychodzi jako tekst w części output_text wiadomości; sparsuj go samodzielnie. Hostowany model open-weight bez ustrukturyzowanego wyjścia zwraca 400.

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

Który model przyjmuje którą formę, wymienia jego własna strona. Ustrukturyzowane odpowiedzi

Wnioskowanie

Model, który wnioskuje, zwraca wnioskowanie jako element wyjścia typu reasoning, przed wiadomością. W streamie przychodzi jako zdarzenia response.reasoning_summary_text.delta.

Hostowane modele open-weight stosują reasoning.effort: off, low, medium lub high, a high, gdy nic nie wyślesz. off nie zwraca elementu wnioskowania. Wyślij go jako obiekt; sam ciąg znaków nie jest w tym endpoincie czytany.

Poziomy wysiłku opisuje ich własna strona. Wysiłek rozumowania

Limit wyjścia

max_output_tokens wynosi 4,096, gdy go nie wyślesz. To liczba tokenów odłożonych z Twojego salda na początku zapytania; gdy odpowiedź jest kompletna, ta kwota jest zastępowana tym, co zapytanie zużyło. Wartość, która nie mieści się w pozostałym saldzie, zwraca 429 Quota exceeded.

Ogranicza długość odpowiedzi w shannon-1.6-*, shannon-2-* i shannon-coder-1 oraz długość tekstu odpowiedzi w hostowanych modelach open-weight.

W tym endpoincie shannon-coder-1 jest rozliczany w tokenach z Twojego salda, jak każdy inny model.

Treść zapytania może mieć do 32 MiB. Limity i saldo

Błędy

Błędy używają treści błędu OpenAI: obiektu error z type i message; niektóre niosą też code i param o wartości null. Tabela wymienia to, co ten endpoint zwraca najczęściej. Pełna lista, z informacją, co ponawiać, ma własną stronę. Obsługa błędów

Status Typ Komunikat Kiedy
401 authentication_error Missing authentication
Invalid API key
Nie wysłano klucza API albo klucz jest nieznany lub unieważniony.
400 invalid_request_error unknown model: <id> Brakuje model albo nie jest opublikowanym id.
400 invalid_request_error No user message provided. Poziomy Shannon: input nie zawiera tekstu użytkownika.
400 invalid_request_error <id> does not accept image input Obraz wysłano do hostowanego modelu open-weight bez wejścia obrazów.
400 invalid_request_error <id> does not accept response_format text.format wysłano do hostowanego modelu open-weight bez ustrukturyzowanego wyjścia.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high reasoning.effort zawiera wartość spoza listy.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … Treść jest poprawnym JSON, ale pole ma błędny typ.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_tokens jest większe niż to, co zostało z Twojego salda.
429 rate_limit_error Too many requests. Retry in <n>s. Ochrona przed floodem: ponad 120 zapytań w ciągu jednej minuty na Twoim koncie.
500 api_error The model backend failed to answer. Please retry. Model nie wytworzył odpowiedzi. Wyślij zapytanie ponownie.
502 api_error The model backend failed to answer. Please retry. To samo, w hostowanych modelach open-weight.
504 api_error upstream timed out Hostowany model open-weight potrzebował więcej czasu niż wynosi limit czasu odpowiedzi bez streamingu. Wyślij zapytanie z stream ustawionym na true.