Перейти до вмісту
Responses API

Responses API

Нове

POST /v1/responses приймає інструкції та список елементів входу й повертає об'єкт відповіді з елементів виходу у форматі OpenAI Responses. Використовуйте його з API responses в SDK OpenAI та з інструментами на його основі, як-от Codex CLI. Ендпоінт не зберігає стану: надсилайте всю розмову з кожним запитом.

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

Найменший запит — це id моделі й текст. Відповідь не стрімиться, доки ви цього не попросите.

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)

Відповідь — це об'єкт відповіді. Його output містить міркування, якщо модель міркувала, і повідомлення:

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

Поля запиту

Запиту потрібні model і input. Колонка Applied by називає моделі, на яких поле змінює відповідь. Хостовані open-weight моделі — це дванадцять id зі списку моделей; сімейство Shannon 3 — це shannon-3, shannon-3-pro, shannon-3.1 і shannon-3.1-pro. Моделі та ціни

Поле Тип За замовчуванням Опис Застосовується
model string Обов'язкове. Id зі списку моделей. Регістр не враховується. Відсутній або неопублікований id повертає 400 unknown model. Усі моделі
input string | array Рядок, який читається як одне повідомлення користувача, або масив елементів входу. Див. Input items нижче. Усі моделі
instructions string Інструкції для моделі, системний промпт цього формату. Хостовані open-weight моделі, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true надсилає відповідь як server-sent events. Див. Streaming нижче. Усі моделі
max_output_tokens integer 4096 Верхня межа відповіді в токенах. Значення поза діапазоном від 1 до 65,536 переноситься в цей діапазон. Це також сума, відкладена з вашого балансу, поки запит виконується. Див. Output limit нижче. Хостовані open-weight моделі, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Температура семплювання. На хостованих open-weight моделях значення утримуються між 0 і 2. Хостовані open-weight моделі; shannon-1.6-*, shannon-2-* і shannon-coder-1 у відповідях без стрімінгу
top_p number Nucleus-семплювання. Значення утримуються між 0 і 1. Хостовані open-weight моделі
tools array Функції, які модель може викликати, у пласкій формі цього формату: {"type": "function", "name", "description", "parameters"}. Див. Tools нижче. Усі моделі
tool_choice string | object auto "auto" дозволяє моделі вирішити. "required" змушує її викликати інструмент. {"type": "function", "name": "…"} змушує її викликати саме цей інструмент. Хостовані open-weight моделі
reasoning object {"effort": "…"} з off, low, medium або high. Будь-яке інше значення повертає 400. Хостовані open-weight моделі
text object {"format": {…}} просить відповідь у JSON. Див. Structured output нижче. Усі рівні Shannon; хостовані open-weight моделі — як указано для кожного id

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user і prompt_cache_key приймаються, щоб наявний клієнтський код працював без змін. Вони не змінюють відповідь. Оскільки розмова не зберігається, наступний запит містить попередні ходи в input.

Елементи входу

Елемент входу — це або повідомлення з role і content, або типізований елемент, що несе виклик інструмента чи його результат. content — рядок або масив частин.

Елемент Опис Застосовується
{"role": "user", "content": …} Те, про що ви питаєте. content — рядок або частини input_text і input_image. Усі моделі
{"role": "assistant", "content": …} Попередня відповідь моделі. content — рядок або частини output_text. Усі моделі
{"role": "system", "content": …}
{"role": "developer", "content": …}
Інструкції всередині розмови. Хостовані open-weight моделі
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Виклик інструмента, який модель зробила в попередній відповіді. arguments — рядок JSON. Усі моделі
{"type": "function_call_output", "call_id": "…", "output": "…"} Результат цього виклику. call_id — id виклику, output — результат як рядок. Усі моделі

Розміщуйте інструкції в полі instructions. З id сімейства Shannon 3 інструкції, які мають виконуватися обов'язково, розміщуйте в повідомленні user.

Елементи output відповіді можна повертати в input як є: елементи message і function_call читаються, елементи reasoning пропускаються.

Частини контенту

Частина Опис Доступно на
{"type": "input_text", "text": "…"} Текст повідомлення користувача. Усі моделі
{"type": "output_text", "text": "…"} Текст повідомлення асистента. Усі моделі
{"type": "input_image", "image_url": "…"} Зображення як URL data: із вмістом base64 або як URL http(s). Сімейство Shannon 3, shannon-1.6-lite, shannon-1.6-pro і хостовані open-weight моделі, що мають вхід зображень
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} Документ (PDF, Word, PowerPoint або Excel): file_data містить URL data:, а file_url — URL http(s). Сімейство Shannon 3

На рівнях Shannon зображення й файли читаються з останнього елемента user у input. Розміри й ліміти мають власну сторінку. Зображення та файли

Запит з інструкціями та опціями

Цей запит надсилає інструкції, розмову як елементи входу, ліміт виводу, температуру та зусилля міркування. Він використовує хостовану open-weight модель, яка застосовує все це.

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)

Відповідь хостованої open-weight моделі має id, object, model, created_at, status, output і usage. Її usage додає токени, прочитані з кешу, та токени, витрачені на міркування:

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

Об'єкт відповіді

id, object, status, output і usage є в кожній відповіді. Будуйте свій код на них.

Поле Тип Опис Надсилає
id string resp_ і далі 32 шістнадцяткові символи. Усі моделі
object string Завжди response. Усі моделі
status string completed. У стрімі спершу in_progress, а в події response.failed — failed. Усі моделі
output array Елементи виходу в тому порядку, в якому їх створила модель: reasoning, message, function_call. Усі моделі
usage object input_tokens, output_tokens і total_tokens. Усі моделі
usage.input_tokens_details object cached_tokens: вхідні токени, прочитані з кешу промпту. Хостовані open-weight моделі
usage.output_tokens_details object reasoning_tokens: вихідні токени, витрачені на міркування. Хостовані open-weight моделі
model string Канонічний id моделі, що відповіла. Сімейство Shannon 3, хостовані open-weight моделі
created_at integer Час відповіді в секундах Unix. Сімейство Shannon 3, хостовані open-weight моделі
instructions, tools, temperature, … instructions, tools і temperature повторюють запит. error та incomplete_details дорівнюють null, metadata — {}, parallel_tool_calls — true, tool_choice — auto, а top_p — null. Сімейство Shannon 3

Елементи виходу

Елемент Опис
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} Міркування моделі як одна частина summary_text. Є лише тоді, коли модель міркувала.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} Відповідь: одна частина output_text з текстом.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Виклик інструмента. arguments — рядок JSON. Надішліть результат назад з тим самим call_id.

SDK OpenAI самі об'єднують текст повідомлення в response.output_text.

Стрімінг

Задайте stream у true для server-sent events. Кожен кадр має рядок event: з назвою події та рядок data: з JSON-об'єктом; об'єкт повторює назву в type. Зіставляйте дельти з їхнім елементом за output_index.

З SDK OpenAI читайте події за їхнім 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")

Події надходять у такому порядку. Групи для міркувань, повідомлення та викликів інструментів з'являються лише тоді, коли відповідь їх має.

Подія Вміст Коли
response.created response Завжди першим. response.status — in_progress, а response.output порожній.
response.in_progress response Завжди другим, з тим самим об'єктом.
response.output_item.added output_index, item Починаються міркування: елемент reasoning з порожнім summary.
response.reasoning_summary_text.delta output_index, summary_index, delta Шматок міркувань.
response.reasoning_summary_text.done output_index, summary_index, text Міркування завершено: увесь їхній text.
response.output_item.done output_index, item Завершений елемент reasoning.
response.output_item.added output_index, item Починається відповідь: елемент message зі статусом in_progress і без вмісту.
response.content_part.added output_index, content_index, part Відкривається порожня частина output_text.
response.output_text.delta output_index, content_index, delta Шматок відповіді.
response.output_text.done output_index, content_index, text Відповідь завершено: увесь її text.
response.content_part.done output_index, content_index, part Завершена частина output_text.
response.output_item.done output_index, item Завершений елемент message зі статусом completed.
response.output_item.added output_index, item Починається виклик інструмента: елемент function_call з call_id, name і порожніми arguments.
response.function_call_arguments.delta output_index, delta Аргументи виклику, повністю в одній дельті.
response.function_call_arguments.done output_index, arguments Ті самі аргументи, як arguments.
response.output_item.done output_index, item Завершений елемент function_call.
response.completed response Завжди останнім у разі успіху: увесь об'єкт відповіді з output і 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}, …}}

Стрім, що завершується збоєм

На рівнях Shannon невдала відповідь завершується response.failed замість response.completed. Її response.status — failed, а response.error містить code, rate_limit_exceeded або server_error, і message.

На хостованих open-weight моделях збій — це подія error з code api_error і message. Після неї все одно йде response.completed.

Вважайте стрім невдалим, якщо він містить подію response.failed або error, і надішліть запит знову.

Інструменти

Інструмент — це функція, яку виконує ваш код. Опишіть її в tools; коли модель її захоче, відповідь містить елемент function_call замість повідомлення або поряд із ним.

Визначення інструмента в tools:

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

output відповіді, що її викликає:

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

Виконайте функцію, потім надішліть запит знову, додавши до 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\"}"
  }
]

Читаються лише інструменти типу function. На shannon-1.6-*, shannon-2-* і shannon-coder-1 схема parameters зводиться до загальних ключових слів JSON Schema: oneOf читається як anyOf, а ключові слова $ref, additionalProperties, const, default і title моделі не передаються.

Значення tool_choice required і названу функцію застосовують хостовані open-weight моделі.

Цикл інструментів повністю описано на окремій сторінці. Виклик функцій

Структурований вивід

Цей формат записує структурований вивід як text.format. Схема міститься безпосередньо в format, поруч із name і strict, а не під членом json_schema, як у Chat Completions.

  • {"type": "json_object"} просить будь-який JSON-об'єкт.
  • {"type": "json_schema", "name", "schema", "strict"} просить JSON, що відповідає вашій схемі. strict дорівнює true, якщо його пропустити.
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 надходить як текст у частині output_text повідомлення; розберіть його самостійно. Хостована open-weight модель без структурованого виводу повертає 400.

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

Яка модель приймає яку форму, перелічено на окремій сторінці. Структуровані відповіді

Міркування

Модель, що міркує, повертає свої міркування як елемент виходу типу reasoning перед повідомленням. У стрімі вони надходять як події response.reasoning_summary_text.delta.

Хостовані open-weight моделі застосовують reasoning.effort: off, low, medium або high, а якщо нічого не надсилати — high. off не повертає елемента міркувань. Надсилайте його як об'єкт; простий рядок на цьому ендпоінті не читається.

Рівні зусилля описано на окремій сторінці. Зусилля міркування

Ліміт виводу

max_output_tokens дорівнює 4,096, якщо ви його не надсилаєте. Це кількість токенів, відкладена з вашого балансу на початку запиту; коли відповідь завершено, ця сума замінюється тим, що використав запит. Значення, що не вміщується в ваш залишок балансу, повертає 429 Quota exceeded.

Він обмежує довжину відповіді на shannon-1.6-*, shannon-2-* і shannon-coder-1, а на хостованих open-weight моделях — довжину тексту відповіді.

На цьому ендпоінті shannon-coder-1 тарифікується в токенах із вашого балансу, як і будь-яка інша модель.

Тіло запиту може бути до 32 MiB. Ліміти та баланс

Помилки

Помилки використовують тіло помилки OpenAI: об'єкт error з type і message; деякі також містять code і param зі значенням null. У таблиці наведено те, що цей ендпоінт повертає найчастіше. Повний список із вказівками, що повторювати, має власну сторінку. Обробка помилок

Статус Тип Повідомлення Коли
401 authentication_error Missing authentication
Invalid API key
API-ключ не надіслано або ключ невідомий чи відкликаний.
400 invalid_request_error unknown model: <id> model відсутня або не є опублікованим id.
400 invalid_request_error No user message provided. Рівні Shannon: input не містить тексту користувача.
400 invalid_request_error <id> does not accept image input Зображення надіслано до хостованої open-weight моделі без входу зображень.
400 invalid_request_error <id> does not accept response_format text.format надіслано до хостованої open-weight моделі без структурованого виводу.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high reasoning.effort містить значення поза списком.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … Тіло є коректним JSON, але поле має неправильний тип.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_tokens більший за залишок вашого балансу.
429 rate_limit_error Too many requests. Retry in <n>s. Захист від флуду: понад 120 запитів за одну хвилину з вашого облікового запису.
500 api_error The model backend failed to answer. Please retry. Модель не створила відповіді. Надішліть запит знову.
502 api_error The model backend failed to answer. Please retry. Те саме, на хостованих open-weight моделях.
504 api_error upstream timed out Хостована open-weight модель відповідала довше за ліміт часу відповіді без стрімінгу. Надішліть запит із stream, заданим у true.