Chat Completions
POST /v1/chat/completions приема разговор и връща следващото съобщение на модела във формата OpenAI Chat Completions. Използвайте го от всеки OpenAI SDK или през обикновен 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. Колоната Прилага се от посочва моделите, при които полето променя отговора. Хостваните open-weight модели са дванадесетте 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 се привежда в този диапазон. Това е и сумата, заделена от баланса ви, докато заявката се изпълнява. Вижте Дължина на изхода по-долу. | Хоствани open-weight модели, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Същото като max_tokens. Когато са изпратени и двете, използва се max_tokens. | Хоствани open-weight модели, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Температура на семплиране. При хостваните open-weight модели стойността по подразбиране е 1, а стойностите се държат между 0 и 2. | Хоствани open-weight модели, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Nucleus семплиране. Стойностите се държат между 0 и 1. | Хоствани open-weight модели |
seed | integer | Seed на семплера, произволно цяло число. Без него seed се извежда от модела и разговора, така че една и съща заявка, изпратена два пъти, използва същия seed. | Хоствани open-weight модели | |
stop | string | array | Низ или масив от низове. Използват се до 4. Отговорът свършва преди първия, който се появи; самият стоп текст не се връща. | Хоствани open-weight модели | |
reasoning_effort | string | high | Колко разсъждава моделът, преди да отговори: off, low, medium или high. none и minimal означават off, default означава medium, max означава high. Всяка друга стойност връща 400. | Хоствани open-weight модели |
reasoning | object | Същата настройка във вид на обект: {"effort": "low"}. Когато са изпратени и двете, използва се reasoning_effort. | Хоствани open-weight модели | |
tools | array | Функциите, които моделът може да извика, всяка като {"type": "function", "function": {"name", "description", "parameters"}}. Извикванията на модела се връщат в tool_calls; вашият код ги изпълнява. | Всички модели | |
tool_choice | string | object | auto | "auto" оставя модела да реши. "required" го кара да извика инструмент. {"type": "function", "function": {"name": "…"}} го кара да извика този инструмент. | Хоствани open-weight модели |
response_format | object | {"type": "json_object"} за JSON отговор или {"type": "json_schema", "json_schema": {…}} за отговор, който следва вашата схема. | Всички нива на Shannon; хоствани open-weight модели според списъка по 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, се приемат, за да работи съществуващият клиентски код без промяна. Те не променят отговора: винаги има един избор (choice), а стриймът винаги завършва с usage.
Поле с грешен JSON тип, например "max_tokens": "100", връща 422. Заявка без messages също.
Инструментите, структурираният изход, разсъждението и уеб търсенето имат всеки собствена страница: Извикване на функции, Структурирани изходи, Усилие за разсъждение, Вградено уеб търсене.
Заявка с опции
Тази заявка задава системно съобщение, полетата за семплиране и усилието за разсъждение. Използва хостван open-weight модел, който прилага всички тях.
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 добавя две подробности при хостваните open-weight модели: токените на prompt-а, прочетени от кеша, и токените, изразходвани за разсъждение.
{
"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. |
| Хоствани open-weight модели | Текстът на отговора спира при max_tokens. Разсъждението не се брои към него. Стойности под 256 действат като 256. |
Без max_tokens или max_completion_tokens стойността е 4,096. При shannon-coder-1 е 65,536.
Съобщения
Всяко съобщение е обект с role и content. content е низ или масив от части, когато съобщението носи повече от текст.
| Роля | Описание | Прилага се от |
|---|---|---|
system | Инструкции за модела. Поставете го първо. При нивата на Shannon се използва първото съобщение system. | Хоствани open-weight модели, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Чете се като system. | Хоствани open-weight модели |
user | Какво питате. При нивата на Shannon последното съобщение user е prompt-ът, а съобщенията преди него са историята. | Всички модели |
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 и хостваните open-weight модели, които поддържат вход с изображения |
{"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 | Винаги точно един избор (choice), с index 0. |
choices[0].message.role | string | Винаги assistant. |
choices[0].message.content | string | null | Текстът на отговора. При tool_calls е null при нивата на Shannon; хостваните open-weight модели могат да изпратят текст до извикванията. |
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 | Токените на заявката. Вижте Usage. |
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
| Поле | Тип | Описание | Налично при |
|---|---|---|---|
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, прочетена от кеша на prompt-ове. | Хоствани open-weight модели |
usage.completion_tokens_details.reasoning_tokens | integer | Частта от completion_tokens, изразходвана за разсъждение. | Хоствани open-weight модели |
При хостваните open-weight модели prompt_tokens са вашите съобщения и дефиниции на инструменти, преброени с токенизатора на самия модел, плюс токените на евентуални изображения. Ендпоинтите за броене на токени връщат същото число, преди да изпратите. Броене на токени
При нивата на Shannon prompt_tokens брои всичко, което моделът е прочел, за да напише отговора, затова е по-голямо от текста само на вашите съобщения.
Стрийминг
Когато stream е true, отговорът пристига като събития chat.completion.chunk и завършва с data: [DONE]. Последният chunk преди него носи finish_reason и usage; не са нужни stream_options. Формите на chunk-овете, редовете 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 | Част с изображение е изпратена към хостван open-weight модел без вход с изображения. |
400 | invalid_request_error | <id> does not accept response_format | response_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: … | 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 и хостваните open-weight модели. |