Chat Completions
POST /v1/chat/completions primește o conversație și returnează următorul mesaj al modelului în formatul OpenAI Chat Completions. Folosește-l din orice SDK OpenAI sau prin HTTP simplu; această pagină este referința câmp cu câmp.
POST https://api.shannon-ai.com/v1/chat/completions
Cea mai mică cerere este un id de model și un mesaj de utilizator.
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."}]
}' Răspunsul este un singur obiect 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
}
} Header-e
Header-e de cerere
| Header | Valoare | Descriere |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Cheia ta API. x-api-key: YOUR_API_KEY este acceptat în locul ei pe fiecare endpoint. |
Content-Type | application/json | Obligatoriu. Orice altă valoare returnează 415. |
x-request-id | Opțional. Propriul tău id pentru cerere. Se întoarce neschimbat în răspuns. |
Header-e de răspuns
| Header | Descriere |
|---|---|
x-request-id | Pe fiecare răspuns, inclusiv erori și stream-uri: valoarea trimisă de tine sau 12 caractere hexazecimale dacă nu ai trimis niciuna. Menționeaz-o când raportezi o problemă. |
content-type | application/json sau text/event-stream când stream este true. |
Câmpuri de cerere
Doar messages este obligatoriu. Coloana Aplicat de indică modelele pe care un câmp modifică răspunsul. Modelele open-weight găzduite sunt cele douăsprezece id-uri din lista de modele; familia Shannon 3 este shannon-3, shannon-3-pro, shannon-3.1 și shannon-3.1-pro. Modele și prețuri
| Câmp | Tip | Implicit | Descriere | Aplicat de |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Modelul care răspunde: un id din lista de modele. Trimite-l la fiecare cerere. Potrivirea nu ține cont de majuscule. Un id care nu este publicat returnează 400 unknown model. | Toate modelele |
messages | array | Obligatoriu. Conversația, cu cel mai vechi mesaj primul. Vezi Mesaje mai jos. | Toate modelele | |
stream | boolean | false | true trimite răspunsul ca server-sent events pe măsură ce este scris. | Toate modelele |
max_tokens | integer | 4096 | Limita superioară a răspunsului, în token-uri. O valoare în afara intervalului 1 – 65,536 este mutată în acel interval. Este și cantitatea rezervată din soldul tău cât timp rulează cererea. Vezi Lungimea ieșirii mai jos. | Modele open-weight găzduite, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | La fel ca max_tokens. Când sunt trimise ambele, se folosește max_tokens. | Modele open-weight găzduite, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura de eșantionare. Pe modelele open-weight găzduite valoarea implicită este 1, iar valorile sunt păstrate între 0 și 2. | Modele open-weight găzduite, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Eșantionare nucleus. Valorile sunt păstrate între 0 și 1. | Modele open-weight găzduite |
seed | integer | Seed-ul eșantionatorului, orice număr întreg. Fără el, seed-ul este derivat din model și din conversație, deci aceeași cerere trimisă de două ori folosește același seed. | Modele open-weight găzduite | |
stop | string | array | Un șir de caractere sau o matrice de șiruri. Se folosesc cel mult 4. Răspunsul se încheie înainte de primul care apare; textul de oprire în sine nu este returnat. | Modele open-weight găzduite | |
reasoning_effort | string | high | Cât raționează modelul înainte să răspundă: off, low, medium sau high. none și minimal înseamnă off, default înseamnă medium, max înseamnă high. Orice altă valoare returnează 400. | Modele open-weight găzduite |
reasoning | object | Aceeași setare sub formă de obiect: {"effort": "low"}. Când sunt trimise ambele, se folosește reasoning_effort. | Modele open-weight găzduite | |
tools | array | Funcțiile pe care modelul le poate apela, fiecare sub forma {"type": "function", "function": {"name", "description", "parameters"}}. Apelurile modelului revin în tool_calls; codul tău le rulează. | Toate modelele | |
tool_choice | string | object | auto | "auto" lasă modelul să decidă. "required" îl obligă să apeleze un instrument. {"type": "function", "function": {"name": "…"}} îl obligă să apeleze acel instrument. | Modele open-weight găzduite |
response_format | object | {"type": "json_object"} pentru un răspuns JSON sau {"type": "json_schema", "json_schema": {…}} pentru un răspuns care urmează schema ta. | Toate nivelurile Shannon; modelele open-weight găzduite conform listei pe id | |
web_search | boolean | false | true permite modelului să caute pe web înainte de a răspunde. | shannon-1.6-*, shannon-2-*, familia Shannon 3 |
Alte câmpuri OpenAI, precum n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store și prompt_cache_key, sunt acceptate astfel încât codul client existent să ruleze neschimbat. Ele nu modifică răspunsul: există întotdeauna o singură alegere (choice), iar un stream se încheie întotdeauna cu utilizarea.
Un câmp cu tipul JSON greșit, de exemplu "max_tokens": "100", returnează 422. La fel și o cerere fără messages.
Instrumentele, ieșirea structurată, raționamentul și căutarea web au fiecare propria pagină: Apelare funcții, Rezultate structurate, Efort de raționament, Căutare web integrată.
O cerere cu opțiuni
Această cerere setează un mesaj de sistem, câmpurile de eșantionare și efortul de raționament. Folosește un model open-weight găzduit, care le aplică pe toate.
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"
}' Răspunsul are aceeași formă ca mai sus. usage adaugă două detalii pe modelele open-weight găzduite: token-urile de prompt citite din cache și token-urile consumate pentru raționament.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Lungimea ieșirii
max_tokens face două lucruri. În primul rând, este numărul de token-uri rezervat din soldul tău la începutul cererii. Când răspunsul este complet, această sumă este înlocuită cu token-urile folosite de cerere. Dacă max_tokens este mai mare decât ce a rămas din soldul tău, cererea returnează 429 Quota exceeded chiar dacă răspunsul în sine ar fi încăput. Trimite un max_tokens mai mic pentru a rezerva mai puțin.
shannon-coder-1 este numărat diferit pe acest endpoint: fiecare cerere este unul dintre apelurile Shannon Coder ale planului tău și nu se rezervă token-uri pentru ea. Limite și sold
În al doilea rând, limitează lungimea răspunsului pe aceste modele:
| Modele | Ce face max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Răspunsul se oprește când atinge limita. Un stream se încheie atunci cu finish_reason length. |
| Modele open-weight găzduite | Textul răspunsului se oprește la max_tokens. Raționamentul nu se numără în acesta. Valorile sub 256 sunt tratate ca 256. |
Fără max_tokens sau max_completion_tokens, valoarea este 4,096. Pe shannon-coder-1 este 65,536.
Mesaje
Fiecare mesaj este un obiect cu un role și un content. content este un șir de caractere sau o matrice de părți atunci când mesajul conține mai mult decât text.
| Rol | Descriere | Aplicat de |
|---|---|---|
system | Instrucțiuni pentru model. Pune-l primul. Pe nivelurile Shannon se folosește primul mesaj system. | Modele open-weight găzduite, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Citit ca system. | Modele open-weight găzduite |
user | Ce întrebi. Pe nivelurile Shannon, ultimul mesaj user este prompt-ul, iar mesajele dinaintea lui sunt istoricul. | Toate modelele |
assistant | Răspunsurile anterioare ale modelului. Păstrează tool_calls ale acestuia când trimiți după el un rezultat de instrument. | Toate modelele |
tool | Rezultatul unui apel de instrument: tool_call_id conține id-ul apelului, iar content rezultatul ca șir de caractere. | Toate modelele |
Cu un id din familia Shannon 3, pune instrucțiunile care trebuie respectate în mesajul user.
Pe nivelurile Shannon, o cerere fără text de la utilizator și fără tools returnează 400 No user message provided.
Părți de conținut
| Parte | Descriere | Disponibil pe |
|---|---|---|
{"type": "text", "text": "…"} | Text simplu. | Toate modelele |
{"type": "image_url", "image_url": {"url": "…"}} | O imagine, ca URL data: cu conținut base64 sau ca URL http(s). | Familia Shannon 3, shannon-1.6-lite, shannon-1.6-pro și modelele open-weight găzduite care acceptă imagini la intrare |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Un document (PDF, Word, PowerPoint sau Excel), ca base64 sau prin URL. | Familia Shannon 3 |
Dimensiunile, limitele și lista completă a formelor au propria pagină. Imagini și fișiere
Obiectul răspuns
| Câmp | Tip | Descriere |
|---|---|---|
id | string | chatcmpl- urmat de 32 de caractere hexazecimale. |
object | string | Întotdeauna chat.completion. |
created | integer | Momentul răspunsului, în secunde Unix. |
model | string | Id-ul canonic al modelului care a răspuns. Poate diferi ca ortografie de id-ul trimis de tine. |
choices | array | Întotdeauna exact o alegere (choice), cu index 0. |
choices[0].message.role | string | Întotdeauna assistant. |
choices[0].message.content | string | null | Textul răspunsului. Împreună cu tool_calls este null pe nivelurile Shannon; modelele open-weight găzduite pot trimite text alături de apeluri. |
choices[0].message.reasoning_content | string | null | Raționamentul scris de model înaintea răspunsului sau null dacă nu există. |
choices[0].message.tool_calls | array | Prezent doar când modelul apelează instrumente. Fiecare intrare are un id, type function și function cu name și arguments ca șir JSON. |
choices[0].message.annotations | array | Doar la o cerere cu web_search: true a cărei căutare a găsit ceva. Câte un url_citation pentru fiecare sursă numită de un marcaj din content, cu url, title, start_index și end_index (poziția marcajului, numărată în caractere, sfârșitul nu este inclus). |
choices[0].finish_reason | string | Motivul pentru care s-a încheiat răspunsul. Vezi Motive de încheiere. |
usage | object | Token-urile cererii. Vezi Utilizare. |
sources | array | Doar la o cerere cu web_search: true a cărei căutare a găsit ceva: rezultatele date modelului, fiecare cu index, title și url. [1] din răspuns este intrarea cu index 1. |
Motive de încheiere
| finish_reason | Descriere |
|---|---|
stop | Modelul și-a încheiat răspunsul sau a apărut un șir stop. |
tool_calls | Modelul apelează unul sau mai multe instrumente. Rulează-le și trimite rezultatele în mesaje tool. |
length | Răspunsul a fost tăiat la limita de ieșire. Raportat în stream-urile pentru shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 și familia Shannon 3. |
Un răspuns fără streaming raportează stop sau tool_calls.
Utilizare
| Câmp | Tip | Descriere | Disponibil pe |
|---|---|---|---|
usage.prompt_tokens | integer | Token-uri de intrare. | Toate modelele |
usage.completion_tokens | integer | Token-uri de ieșire: raționament, răspuns și apeluri de instrumente la un loc. | Toate modelele |
usage.total_tokens | integer | prompt_tokens plus completion_tokens. | Toate modelele |
usage.prompt_tokens_details.cached_tokens | integer | Partea din prompt_tokens care a fost citită din cache-ul de prompt. | Modele open-weight găzduite |
usage.completion_tokens_details.reasoning_tokens | integer | Partea din completion_tokens care a fost consumată pentru raționament. | Modele open-weight găzduite |
Pe modelele open-weight găzduite, prompt_tokens reprezintă mesajele și definițiile tale de instrumente, numărate cu tokenizatorul propriu al modelului, plus token-urile imaginilor, dacă există. Endpoint-urile de numărare a token-urilor returnează același număr înainte să trimiți cererea. Numărarea token-urilor
Pe nivelurile Shannon, prompt_tokens numără tot ce a citit modelul pentru a scrie răspunsul, deci este mai mare decât textul mesajelor tale luat singur.
Streaming
Cu stream setat la true, răspunsul sosește ca evenimente chat.completion.chunk și se încheie cu data: [DONE]. Ultimul chunk dinaintea lui poartă finish_reason și usage; nu este nevoie de stream_options. Formele chunk-urilor, liniile keep-alive și erorile din interiorul unui stream au propria pagină. Streaming
Erori
O eroare este un obiect JSON cu un membru error. Verificările rulează în această ordine: cheia API, corpul cererii, id-ul modelului, apoi soldul. Tabelul listează ce returnează cel mai des acest endpoint. Lista completă, cu ce merită reîncercat, are propria pagină. Gestionare erori
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Stare | Tip | Mesaj | Când |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Nu a fost trimisă nicio cheie API sau cheia este necunoscută ori revocată. |
400 | invalid_request_error | unknown model: <id> | model nu este un id publicat. |
400 | invalid_request_error | No user message provided | Niveluri Shannon: cererea nu are text de la utilizator și nici tools. |
400 | invalid_request_error | <id> does not accept image input | O parte de tip imagine a fost trimisă unui model open-weight găzduit care nu acceptă imagini la intrare. |
400 | invalid_request_error | <id> does not accept response_format | response_format a fost trimis unui model open-weight găzduit fără ieșire structurată. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort conține o valoare din afara listei. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages lipsește sau un câmp are tipul JSON greșit. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens este mai mare decât ce a rămas din soldul tău. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protecție anti-flood: mai mult de 120 de cereri într-un minut pe contul tău. |
500 | server_error | The model backend failed to answer. Please retry. | Modelul nu a produs un răspuns. Trimite cererea din nou. |
502 | api_error | The model backend failed to answer. Please retry. | La fel, pe familia Shannon 3 și pe modelele open-weight găzduite. |