Chat Completions
POST /v1/chat/completions przyjmuje rozmowę i zwraca następną wiadomość modelu w formacie OpenAI Chat Completions. Używaj go z dowolnego SDK OpenAI lub przez zwykłe HTTP; ta strona jest referencją pole po polu.
POST https://api.shannon-ai.com/v1/chat/completions
Najmniejsze zapytanie to id modelu i jedna wiadomość użytkownika.
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."}]
}' Odpowiedzią jest jeden obiekt 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
}
} Nagłówki
Nagłówki zapytania
| Nagłówek | Wartość | Opis |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Twój klucz API. W każdym endpoincie zamiast niego akceptowany jest x-api-key: YOUR_API_KEY. |
Content-Type | application/json | Wymagany. Każda inna wartość zwraca 415. |
x-request-id | Opcjonalny. Twój własny id zapytania. Wraca bez zmian w odpowiedzi. |
Nagłówki odpowiedzi
| Nagłówek | Opis |
|---|---|
x-request-id | W każdej odpowiedzi, także w błędach i strumieniach: wartość, którą wysłano, albo 12 znaków szesnastkowych, gdy nie wysłano żadnej. Podaj go, zgłaszając problem. |
content-type | application/json albo text/event-stream, gdy stream ma wartość true. |
Pola zapytania
Wymagane jest tylko messages. 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 | shannon-1.6-lite | Model, który odpowiada: id z listy modeli. Wysyłaj go z każdym zapytaniem. Wielkość liter nie ma znaczenia. Id, który nie jest opublikowany, zwraca 400 unknown model. | Wszystkie modele |
messages | array | Wymagane. Rozmowa, od najstarszej wiadomości. Zobacz niżej Wiadomości. | Wszystkie modele | |
stream | boolean | false | true wysyła odpowiedź jako server-sent events w trakcie jej pisania. | Wszystkie modele |
max_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 trwania zapytania. Zobacz niżej Długość wyjścia. | Hostowane modele open-weight, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | To samo co max_tokens. Gdy wysłano oba, używane jest max_tokens. | Hostowane modele open-weight, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura próbkowania. W hostowanych modelach open-weight domyślnie wynosi 1, a wartości są utrzymywane między 0 a 2. | Hostowane modele open-weight, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Próbkowanie jądrowe (nucleus sampling). Wartości są utrzymywane między 0 a 1. | Hostowane modele open-weight |
seed | integer | Ziarno próbkowania (seed), dowolna liczba całkowita. Bez niego ziarno jest wyprowadzane z modelu i rozmowy, więc to samo zapytanie wysłane dwa razy używa tego samego ziarna. | Hostowane modele open-weight | |
stop | string | array | Ciąg znaków albo tablica ciągów. Używane są do 4. Odpowiedź kończy się przed pierwszym z nich, który się pojawi; sam tekst stopu nie jest zwracany. | Hostowane modele open-weight | |
reasoning_effort | string | high | Jak dużo model wnioskuje, zanim odpowie: off, low, medium lub high. none i minimal oznaczają off, default oznacza medium, max oznacza high. Każda inna wartość zwraca 400. | Hostowane modele open-weight |
reasoning | object | To samo ustawienie w postaci obiektu: {"effort": "low"}. Gdy wysłano oba, używane jest reasoning_effort. | Hostowane modele open-weight | |
tools | array | Funkcje, które model może wywołać, każda jako {"type": "function", "function": {"name", "description", "parameters"}}. Wywołania modelu wracają w tool_calls; Twój kod je uruchamia. | Wszystkie modele | |
tool_choice | string | object | auto | "auto" pozwala modelowi zdecydować. "required" zmusza go do wywołania narzędzia. {"type": "function", "function": {"name": "…"}} zmusza go do wywołania tego narzędzia. | Hostowane modele open-weight |
response_format | object | {"type": "json_object"} dla odpowiedzi JSON albo {"type": "json_schema", "json_schema": {…}} dla odpowiedzi zgodnej z Twoim schematem. | Wszystkie poziomy Shannon; hostowane modele open-weight według listy dla każdego id | |
web_search | boolean | false | true pozwala modelowi przeszukać sieć, zanim odpowie. | shannon-1.6-*, shannon-2-*, rodzina Shannon 3 |
Inne pola OpenAI, takie jak n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store i prompt_cache_key, są akceptowane, aby istniejący kod klienta działał bez zmian. Nie zmieniają odpowiedzi: zawsze jest jeden wybór (choice), a strumień zawsze kończy się użyciem.
Pole ze złym typem JSON, na przykład "max_tokens": "100", zwraca 422. Zapytanie bez messages także.
Narzędzia, wyjście strukturyzowane, wnioskowanie i wyszukiwanie w sieci mają każde własną stronę: Wywołanie funkcji, Ustrukturyzowane odpowiedzi, Wysiłek rozumowania, Wbudowane wyszukiwanie w sieci.
Zapytanie z opcjami
To zapytanie ustawia wiadomość systemową, pola próbkowania i wysiłek rozumowania. Używa hostowanego modelu open-weight, który stosuje je wszystkie.
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"
}' Odpowiedź ma ten sam kształt co powyżej. Jej usage dodaje w hostowanych modelach open-weight dwie pozycje: tokeny promptu odczytane z cache i tokeny wydane na wnioskowanie.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Długość wyjścia
max_tokens robi dwie rzeczy. Po pierwsze, jest liczbą tokenów odłożoną z Twojego salda na początku zapytania. Gdy odpowiedź jest kompletna, ta kwota jest zastępowana tokenami, które zapytanie zużyło. Jeśli max_tokens jest większe niż to, co zostało z Twojego salda, zapytanie zwraca 429 Quota exceeded, nawet gdyby sama odpowiedź się zmieściła. Wyślij niższe max_tokens, aby odłożyć mniej.
shannon-coder-1 jest w tym endpoincie liczony inaczej: każde zapytanie to jedno z wywołań Shannon Coder w Twoim planie i żadne tokeny nie są na nie odkładane. Limity i saldo
Po drugie, ogranicza długość odpowiedzi w tych modelach:
| Modele | Co robi max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Odpowiedź zatrzymuje się po osiągnięciu limitu. Strumień kończy się wtedy z finish_reason length. |
| Hostowane modele open-weight | Tekst odpowiedzi kończy się na max_tokens. Wnioskowanie nie jest wliczane do limitu. Wartości poniżej 256 działają jak 256. |
Bez max_tokens i max_completion_tokens wartość wynosi 4,096. W shannon-coder-1 jest to 65,536.
Wiadomości
Każda wiadomość to obiekt z role i content. content to ciąg znaków albo tablica części, gdy wiadomość niesie coś więcej niż tekst.
| Rola | Opis | Stosowane przez |
|---|---|---|
system | Instrukcje dla modelu. Umieść ją na początku. W poziomach Shannon używana jest pierwsza wiadomość system. | Hostowane modele open-weight, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Odczytywana jak system. | Hostowane modele open-weight |
user | To, o co pytasz. W poziomach Shannon ostatnia wiadomość user jest promptem, a wcześniejsze wiadomości są historią. | Wszystkie modele |
assistant | Wcześniejsze odpowiedzi modelu. Zachowaj jego tool_calls, gdy po nim wysyłasz wynik narzędzia. | Wszystkie modele |
tool | Wynik wywołania narzędzia: tool_call_id zawiera id wywołania, a content wynik jako ciąg znaków. | Wszystkie modele |
Przy id z rodziny Shannon 3 umieść instrukcje, które muszą obowiązywać, w wiadomości user.
W poziomach Shannon zapytanie bez tekstu użytkownika i bez tools zwraca 400 No user message provided.
Części treści
| Część | Opis | Dostępne w |
|---|---|---|
{"type": "text", "text": "…"} | Zwykły tekst. | Wszystkie modele |
{"type": "image_url", "image_url": {"url": "…"}} | Obraz, jako URL data: z zawartością base64 lub jako URL http(s). | Rodzina Shannon 3, shannon-1.6-lite, shannon-1.6-pro oraz hostowane modele open-weight, które obsługują obraz na wejściu |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Dokument (PDF, Word, PowerPoint lub Excel), jako base64 lub przez URL. | Rodzina Shannon 3 |
Rozmiary, limity i pełna lista form mają własną stronę. Obrazy i pliki
Obiekt odpowiedzi
| Pole | Typ | Opis |
|---|---|---|
id | string | chatcmpl- i 32 znaki szesnastkowe. |
object | string | Zawsze chat.completion. |
created | integer | Czas odpowiedzi, w sekundach Unix. |
model | string | Kanoniczny id modelu, który odpowiedział. Jego pisownia może różnić się od id, który wysłano. |
choices | array | Zawsze dokładnie jeden wybór (choice), z index 0. |
choices[0].message.role | string | Zawsze assistant. |
choices[0].message.content | string | null | Tekst odpowiedzi. Z tool_calls w poziomach Shannon ma wartość null; hostowane modele open-weight mogą wysłać tekst obok wywołań. |
choices[0].message.reasoning_content | string | null | Wnioskowanie, które model napisał przed odpowiedzią, albo null, gdy go nie ma. |
choices[0].message.tool_calls | array | Obecne tylko wtedy, gdy model wywołuje narzędzia. Każda pozycja ma id, type function oraz function z name i arguments jako ciągiem JSON. |
choices[0].message.annotations | array | Tylko w zapytaniu z web_search: true, którego wyszukiwanie coś znalazło. Jedno url_citation dla każdego źródła, które wskazuje znacznik w content, z url, title, start_index i end_index (pozycja znacznika liczona w znakach, koniec nie jest wliczony). |
choices[0].finish_reason | string | Dlaczego odpowiedź się zakończyła. Zobacz Powody zakończenia. |
usage | object | Tokeny zapytania. Zobacz Użycie. |
sources | array | Tylko w zapytaniu z web_search: true, którego wyszukiwanie coś znalazło: wyniki przekazane modelowi, każdy z index, title i url. [1] w odpowiedzi to wpis z index 1. |
Powody zakończenia
| finish_reason | Opis |
|---|---|
stop | Model zakończył odpowiedź albo pojawił się ciąg stop. |
tool_calls | Model wywołuje jedno lub więcej narzędzi. Uruchom je i odeślij wyniki w wiadomościach tool. |
length | Odpowiedź została ucięta na limicie wyjścia. Raportowane w strumieniach shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 i rodziny Shannon 3. |
Odpowiedź bez streamingu raportuje stop lub tool_calls.
Użycie
| Pole | Typ | Opis | Dostępne w |
|---|---|---|---|
usage.prompt_tokens | integer | Tokeny wejściowe. | Wszystkie modele |
usage.completion_tokens | integer | Tokeny wyjściowe: wnioskowanie, odpowiedź i wywołania narzędzi razem. | Wszystkie modele |
usage.total_tokens | integer | prompt_tokens plus completion_tokens. | Wszystkie modele |
usage.prompt_tokens_details.cached_tokens | integer | Część prompt_tokens, która została odczytana z cache promptów. | Hostowane modele open-weight |
usage.completion_tokens_details.reasoning_tokens | integer | Część completion_tokens, która została wydana na wnioskowanie. | Hostowane modele open-weight |
W hostowanych modelach open-weight prompt_tokens to Twoje wiadomości i definicje narzędzi policzone własnym tokenizerem modelu, plus tokeny wszystkich obrazów. Endpointy liczenia tokenów zwracają tę samą liczbę, zanim wyślesz zapytanie. Liczenie tokenów
W poziomach Shannon prompt_tokens liczy wszystko, co model przeczytał, by napisać odpowiedź, więc jest większe niż sam tekst Twoich wiadomości.
Streaming
Gdy stream ma wartość true, odpowiedź przychodzi jako zdarzenia chat.completion.chunk i kończy się data: [DONE]. Ostatni fragment przed nim niesie finish_reason i usage; stream_options nie są potrzebne. Kształty fragmentów, linie keep-alive i błędy wewnątrz strumienia mają własną stronę. Streaming
Błędy
Błąd to obiekt JSON z polem error. Kontrole przebiegają w tej kolejności: klucz API, treść zapytania, id modelu, a potem saldo. Tabela pokazuje, co ten endpoint zwraca najczęściej. Pełna lista, razem z informacją, co ponawiać, ma własną stronę. Obsługa błędów
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Typ | Komunikat | Kiedy |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Nie wysłano klucza API albo klucz jest nieznany lub unieważniony. |
400 | invalid_request_error | unknown model: <id> | model nie jest opublikowanym id. |
400 | invalid_request_error | No user message provided | Poziomy Shannon: zapytanie nie ma tekstu użytkownika ani tools. |
400 | invalid_request_error | <id> does not accept image input | Część z obrazem wysłano do hostowanego modelu open-weight bez obsługi obrazu na wejściu. |
400 | invalid_request_error | <id> does not accept response_format | response_format wysłano do hostowanego modelu open-weight bez wyjścia strukturyzowanego. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort ma wartość spoza listy. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Brakuje messages albo pole ma zły typ JSON. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_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 | server_error | The model backend failed to answer. Please retry. | Model nie wygenerował odpowiedzi. Wyślij zapytanie ponownie. |
502 | api_error | The model backend failed to answer. Please retry. | To samo, w rodzinie Shannon 3 i w hostowanych modelach open-weight. |