Chat Completions
POST /v1/chat/completions принимает разговор и возвращает следующее сообщение модели в формате OpenAI Chat Completions. Используйте его из любого SDK OpenAI или по обычному HTTP; эта страница — справочник по полям.
POST https://api.shannon-ai.com/v1/chat/completions
Минимальный запрос — это id модели и одно сообщение пользователя.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="shannon-3",
messages=[{"role": "user", "content": "Say hello in one sentence."}],
)
print(response.choices[0].message.content) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.chat.completions.create({
model: "shannon-3",
messages: [{ role: "user", content: "Say hello in one sentence." }],
});
console.log(response.choices[0].message.content); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [{"role": "user", "content": "Say hello in one sentence."}]
}' Ответ — один JSON-объект:
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello, it is good to meet you.",
"reasoning_content": "The user wants a greeting in one sentence. Keep it short and friendly."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1184,
"completion_tokens": 46,
"total_tokens": 1230
}
} Заголовки
Заголовки запроса
| Заголовок | Значение | Описание |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Ваш API-ключ. Вместо него на любом эндпоинте принимается x-api-key: YOUR_API_KEY. |
Content-Type | application/json | Обязателен. Любое другое значение возвращает 415. |
x-request-id | Необязателен. Ваш собственный id запроса. Он возвращается в ответе без изменений. |
Заголовки ответа
| Заголовок | Описание |
|---|---|
x-request-id | В каждом ответе, включая ошибки и потоки: присланное вами значение либо 12 шестнадцатеричных символов, если вы ничего не присылали. Приводите его, когда сообщаете о проблеме. |
content-type | application/json или text/event-stream, когда stream равен true. |
Поля запроса
Обязательно только messages. В столбце Применяется на указаны модели, на которых поле влияет на ответ. Размещенные модели с открытыми весами — это двенадцать id из списка моделей; семейство Shannon 3 — это shannon-3, shannon-3-pro, shannon-3.1 и shannon-3.1-pro. Модели и цены
| Поле | Тип | По умолчанию | Описание | Применяется на |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Модель, которая отвечает: id из списка моделей. Отправляйте его с каждым запросом. Регистр не учитывается. Неопубликованный id возвращает 400 unknown model. | Все модели |
messages | array | Обязательно. Разговор, начиная с самого старого сообщения. См. ниже «Сообщения». | Все модели | |
stream | boolean | false | true отправляет ответ как server-sent events по мере его написания. | Все модели |
max_tokens | integer | 4096 | Верхний предел ответа в токенах. Значение вне диапазона от 1 до 65,536 приводится к этому диапазону. Это также объем, который резервируется на вашем балансе на время выполнения запроса. См. ниже «Длина вывода». | Размещенные модели с открытыми весами, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | То же, что max_tokens. Если отправлены оба, используется max_tokens. | Размещенные модели с открытыми весами, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Температура сэмплирования. На размещенных моделях с открытыми весами значение по умолчанию равно 1, а значения ограничиваются диапазоном от 0 до 2. | Размещенные модели с открытыми весами, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Ядерное сэмплирование (nucleus sampling). Значения ограничиваются диапазоном от 0 до 1. | Размещенные модели с открытыми весами |
seed | integer | Seed сэмплера, любое целое число. Без него seed выводится из модели и разговора, поэтому один и тот же запрос, отправленный дважды, использует один и тот же seed. | Размещенные модели с открытыми весами | |
stop | string | array | Строка или массив строк. Используются до 4. Ответ заканчивается перед первой из них, которая встретится; сам стоп-текст не возвращается. | Размещенные модели с открытыми весами | |
reasoning_effort | string | high | Сколько модель рассуждает перед ответом: off, low, medium или high. none и minimal означают off, default означает medium, max означает high. Любое другое значение возвращает 400. | Размещенные модели с открытыми весами |
reasoning | object | Та же настройка в виде объекта: {"effort": "low"}. Если отправлены оба, используется reasoning_effort. | Размещенные модели с открытыми весами | |
tools | array | Функции, которые модель может вызывать, каждая в виде {"type": "function", "function": {"name", "description", "parameters"}}. Вызовы модели возвращаются в tool_calls; ваш код их выполняет. | Все модели | |
tool_choice | string | object | auto | "auto" позволяет модели решать самой. "required" заставляет вызвать инструмент. {"type": "function", "function": {"name": "…"}} заставляет вызвать именно этот инструмент. | Размещенные модели с открытыми весами |
response_format | object | {"type": "json_object"} для ответа в JSON или {"type": "json_schema", "json_schema": {…}} для ответа, следующего вашей схеме. | Все уровни Shannon; размещенные модели с открытыми весами — как указано для каждого id | |
web_search | boolean | false | true позволяет модели искать в интернете перед ответом. | shannon-1.6-*, shannon-2-*, семейство Shannon 3 |
Другие поля OpenAI, такие как n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store и prompt_cache_key, принимаются, чтобы существующий клиентский код работал без изменений. Они не меняют ответ: вариант ответа всегда один, а поток всегда заканчивается usage.
Поле с неверным типом JSON, например "max_tokens": "100", возвращает 422. Запрос без messages тоже.
Инструменты, структурированный вывод, рассуждения и веб-поиск описаны каждый на своей странице: Вызов функций, Структурированные ответы, Усилие рассуждения, Встроенный веб‑поиск.
Запрос с параметрами
Этот запрос задает системное сообщение, поля сэмплирования и усилие рассуждения. Он использует размещенную модель с открытыми весами, которая применяет все эти параметры.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages=[
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"},
],
max_tokens=512,
temperature=0.3,
top_p=0.9,
seed=7,
stop=["\n\n"],
reasoning_effort="low",
)
message = response.choices[0].message
print(message.reasoning_content) # the reasoning
print(message.content) # the answer
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.chat.completions.create({
model: "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages: [
{ role: "system", content: "You are a physics teacher. Answer in two sentences." },
{ role: "user", content: "Why is the sky blue?" },
],
max_tokens: 512,
temperature: 0.3,
top_p: 0.9,
seed: 7,
stop: ["\n\n"],
reasoning_effort: "low",
});
const message = response.choices[0].message;
console.log(message.reasoning_content); // the reasoning
console.log(message.content); // the answer
console.log(response.usage); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
"messages": [
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"}
],
"max_tokens": 512,
"temperature": 0.3,
"top_p": 0.9,
"seed": 7,
"stop": ["\n\n"],
"reasoning_effort": "low"
}' Ответ имеет ту же форму, что и выше. Его usage на размещенных моделях с открытыми весами добавляет две детали: токены промпта, прочитанные из кэша, и токены, потраченные на рассуждения.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Длина вывода
max_tokens делает две вещи. Во-первых, это число токенов, которое резервируется на вашем балансе в начале запроса. Когда ответ завершен, эта сумма заменяется токенами, которые запрос фактически использовал. Если max_tokens больше остатка вашего баланса, запрос возвращает 429 Quota exceeded, даже если сам ответ поместился бы. Отправьте меньший max_tokens, чтобы зарезервировать меньше.
shannon-coder-1 на этом эндпоинте считается иначе: каждый запрос — это один из вызовов Shannon Coder по вашему плану, и токены под него не резервируются. Лимиты и баланс
Во-вторых, он ограничивает длину ответа на этих моделях:
| Модели | Что делает max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Ответ останавливается, достигнув лимита. Поток тогда заканчивается с finish_reason length. |
| Размещенные модели с открытыми весами | Текст ответа обрывается на max_tokens. Рассуждения в него не засчитываются. Значения меньше 256 действуют как 256. |
Без max_tokens или max_completion_tokens значение равно 4,096. На shannon-coder-1 оно равно 65,536.
Сообщения
Каждое сообщение — это объект с role и content. content — строка или массив частей, когда сообщение содержит не только текст.
| Роль | Описание | Применяется на |
|---|---|---|
system | Инструкции для модели. Ставьте его первым. На уровнях Shannon используется первое сообщение system. | Размещенные модели с открытыми весами, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Читается как system. | Размещенные модели с открытыми весами |
user | Ваш вопрос. На уровнях Shannon последнее сообщение user — это промпт, а предыдущие сообщения — история. | Все модели |
assistant | Предыдущие ответы модели. Сохраняйте ее tool_calls, когда отправляете после них результат инструмента. | Все модели |
tool | Результат вызова инструмента: tool_call_id содержит id вызова, а content — результат в виде строки. | Все модели |
С id семейства Shannon 3 помещайте обязательные инструкции в сообщение user.
На уровнях Shannon запрос без пользовательского текста и без tools возвращает 400 No user message provided.
Части контента
| Часть | Описание | Доступно на |
|---|---|---|
{"type": "text", "text": "…"} | Обычный текст. | Все модели |
{"type": "image_url", "image_url": {"url": "…"}} | Изображение в виде URL data: с содержимым base64 или URL http(s). | Семейство Shannon 3, shannon-1.6-lite, shannon-1.6-pro и размещенные модели с открытыми весами, поддерживающие ввод изображений |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Документ (PDF, Word, PowerPoint или Excel) в виде base64 или по URL. | Семейство Shannon 3 |
Размеры, лимиты и полный список форм описаны на отдельной странице. Изображения и файлы
Объект ответа
| Поле | Тип | Описание |
|---|---|---|
id | string | chatcmpl-, за которым следуют 32 шестнадцатеричных символа. |
object | string | Всегда chat.completion. |
created | integer | Время ответа в секундах Unix. |
model | string | Каноничный id модели, давшей ответ. Он может отличаться написанием от id, который вы отправили. |
choices | array | Всегда ровно один вариант, с index 0. |
choices[0].message.role | string | Всегда assistant. |
choices[0].message.content | string | null | Текст ответа. При наличии tool_calls на уровнях Shannon он равен null; размещенные модели с открытыми весами могут присылать текст рядом с вызовами. |
choices[0].message.reasoning_content | string | null | Рассуждения, которые модель написала перед ответом, или null, если их нет. |
choices[0].message.tool_calls | array | Присутствует, только когда модель вызывает инструменты. Каждая запись содержит id, type function и function с name и arguments в виде JSON-строки. |
choices[0].message.annotations | array | Только в запросе с web_search: true, поиск которого что-то нашел. По одному url_citation на каждый источник, который называет маркер в content, с url, title, start_index и end_index (позиция маркера, посчитанная в символах, конец не включается). |
choices[0].finish_reason | string | Почему ответ закончился. См. «Причины завершения». |
usage | object | Токены запроса. См. «Использование». |
sources | array | Только в запросе с web_search: true, поиск которого что-то нашел: результаты, переданные модели, каждый с index, title и url. [1] в ответе — это запись с index 1. |
Причины завершения
| finish_reason | Описание |
|---|---|
stop | Модель закончила ответ, либо встретилась строка stop. |
tool_calls | Модель вызывает один или несколько инструментов. Выполните их и отправьте результаты в сообщениях tool. |
length | Ответ был обрезан по лимиту вывода. Сообщается в потоках shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 и семейства Shannon 3. |
Ответ без стриминга сообщает stop или tool_calls.
Использование
| Поле | Тип | Описание | Доступно на |
|---|---|---|---|
usage.prompt_tokens | integer | Токены ввода. | Все модели |
usage.completion_tokens | integer | Токены вывода: рассуждения, ответ и вызовы инструментов вместе. | Все модели |
usage.total_tokens | integer | prompt_tokens плюс completion_tokens. | Все модели |
usage.prompt_tokens_details.cached_tokens | integer | Часть prompt_tokens, прочитанная из кэша промптов. | Размещенные модели с открытыми весами |
usage.completion_tokens_details.reasoning_tokens | integer | Часть completion_tokens, потраченная на рассуждения. | Размещенные модели с открытыми весами |
На размещенных моделях с открытыми весами prompt_tokens — это ваши сообщения и определения инструментов, подсчитанные собственным токенайзером модели, плюс токены изображений. Эндпоинты подсчета токенов возвращают то же число до отправки. Подсчет токенов
На уровнях Shannon prompt_tokens учитывает все, что модель прочитала, чтобы написать ответ, поэтому оно больше, чем один только текст ваших сообщений.
Стриминг
Если stream равен true, ответ приходит событиями chat.completion.chunk и заканчивается data: [DONE]. Последний чанк перед ним содержит finish_reason и usage; stream_options не нужны. Формы чанков, keep-alive-строки и ошибки внутри потока описаны на отдельной странице. Потоковая передача
Ошибки
Ошибка — это JSON-объект с полем error. Проверки выполняются в таком порядке: API-ключ, тело запроса, id модели, затем баланс. В таблице перечислено то, что этот эндпоинт возвращает чаще всего. Полный список с указанием, что повторять, находится на отдельной странице. Обработка ошибок
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Статус | Тип | Сообщение | Когда |
|---|---|---|---|
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: в запросе нет пользовательского текста и нет tools. |
400 | invalid_request_error | <id> does not accept image input | Часть с изображением отправлена размещенной модели с открытыми весами, не поддерживающей ввод изображений. |
400 | invalid_request_error | <id> does not accept response_format | response_format отправлен размещенной модели с открытыми весами без структурированного вывода. |
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: … | messages отсутствует или у поля неверный тип JSON. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens больше, чем остаток вашего баланса. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Защита от флуда: более 120 запросов в минуту с вашего аккаунта. |
500 | server_error | The model backend failed to answer. Please retry. | Модель не сформировала ответ. Отправьте запрос еще раз. |
502 | api_error | The model backend failed to answer. Please retry. | То же самое на семействе Shannon 3 и размещенных моделях с открытыми весами. |