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) 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."
}' Відповідь — це об'єкт відповіді. Його output містить міркування, якщо модель міркувала, і повідомлення:
{
"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) 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"}
}' Відповідь хостованої open-weight моделі має id, object, model, created_at, status, output і usage. Її usage додає токени, прочитані з кешу, та токени, витрачені на міркування:
{
"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") 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
}' Події надходять у такому порядку. Групи для міркувань, повідомлення та викликів інструментів з'являються лише тоді, коли відповідь їх має.
| Подія | Вміст | Коли |
|---|---|---|
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. |
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:
[
{
"type": "function",
"name": "get_weather",
"description": "Current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] output відповіді, що її викликає:
[
{
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function_call",
"name": "get_weather",
"call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"arguments": "{\"city\":\"Paris\"}"
}
] Виконайте функцію, потім надішліть запит знову, додавши до 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, якщо його пропустити.
{
"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.
{"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 authenticationInvalid 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. |