Streaming
Deji stream true jawaabtuna waxay timaadaa sida server-sent events inta model-ku qorayo: marka hore reasoning, kaddib jawaabta, kaddib chunk ugu dambeeya oo leh sababta dhammaadka iyo usage. Isticmaal markasta oo qof qoraalka sugayo, iyo jawaabaha dhaadheer.
POST https://api.shannon-ai.com/v1/chat/completions
SDK-yada OpenAI waxay chunks-ka ku siiyaan mid-mid. Chunk kasta ku akhri waxa uu sido: qayb reasoning ah, qayb jawaab ah, wicitaan tool, ama dhammaadka jawaabta.
from openai import OpenAI, APIError
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
stream = client.chat.completions.create(
model="shannon-3",
messages=[{"role": "user", "content": "Explain server-sent events in three sentences."}],
stream=True,
)
answer, reasoning, tool_calls = [], [], []
finish_reason = usage = None
try:
for chunk in stream:
if chunk.usage:
usage = chunk.usage
if not chunk.choices:
continue
choice = chunk.choices[0]
delta = choice.delta
thought = getattr(delta, "reasoning_content", None)
if thought:
reasoning.append(thought)
if delta.content:
answer.append(delta.content)
print(delta.content, end="", flush=True)
for call in delta.tool_calls or []:
tool_calls.append((call.id, call.function.name, call.function.arguments))
if choice.finish_reason:
finish_reason = choice.finish_reason
except APIError as error:
# A failure after the stream started arrives as an error chunk.
print(f"\nstream failed: {error}")
print(f"\n{finish_reason} {usage}") import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const stream = await client.chat.completions.create({
model: "shannon-3",
messages: [{ role: "user", content: "Explain server-sent events in three sentences." }],
stream: true,
});
let answer = "";
let reasoning = "";
const toolCalls = [];
let finishReason = null;
let usage = null;
try {
for await (const chunk of stream) {
if (chunk.usage) usage = chunk.usage;
const choice = chunk.choices?.[0];
if (!choice) continue;
const delta = choice.delta;
if (delta.reasoning_content) reasoning += delta.reasoning_content;
if (delta.content) {
answer += delta.content;
process.stdout.write(delta.content);
}
for (const call of delta.tool_calls ?? []) {
toolCalls.push({ id: call.id, name: call.function.name, arguments: call.function.arguments });
}
if (choice.finish_reason) finishReason = choice.finish_reason;
}
} catch (error) {
// A failure after the stream started arrives as an error chunk.
console.error("\nstream failed:", error.message);
}
console.log("\n", finishReason, usage); curl -N 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": "Explain server-sent events in three sentences."}],
"stream": true
}' Sida stream loo qaabeeyo
- Jawaabtu waxay leedahay xaalad
200iyo header-yadacontent-type: text/event-streamiyocache-control: no-cache. - Event kasta waa hal xariiq ku bilaabata
data:oo ay raacdo xariiq madhan. Qoraalkadata:ka dambeeya waa hal chunk JSON ah. Xariiqoevent:amaid:ma jiraan. - Xariiq ku bilaabata laba-dhibcood, sida
: ping, waa faallo isku xirka furan hayso. Ka boodo. - Stream-ku wuxuu ku dhammaadaa
data: [DONE]. Stream isaga la'aan istaaga ma dhammaystirna.
Chunks sida ay u kala horreeyaan
Chunk kasta waa shay chat.completion.chunk ah:
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion.chunk",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"delta": {
"content": "Server-sent"
},
"finish_reason": null
}
]
} Chunks-ka hal stream oo dhan waxay sidaan isla id, created iyo model. choices had iyo jeer waxay haysaa hal gelin. delta kiisu wuxuu haystaa waxa cusub, finish_reason-na waa null ilaa chunk-ga ugu dambeeya.
| Furaha delta ku jira | Nooc | Sharaxaad | Waxay dirtaa |
|---|---|---|---|
role | string | Had iyo jeer assistant. Wuxuu imaanayaa hal mar, stream-ka bilowgiisa. | Model-yada open-weight ee la martigeliyo, shannon-2-lite, shannon-2-pro |
reasoning_content | string | Qayb ka mid ah reasoning-ka model-ka. Qaybaha isku xir sida ay u kala horreeyaan. | Model-yada open-weight ee la martigeliyo, qoyska Shannon 3, shannon-1.6-pro, shannon-coder-1 |
content | string | Qayb ka mid ah jawaabta. Qaybaha isku xir sida ay u kala horreeyaan. | Dhammaan model-yada |
tool_calls | array | Hal wicitaan tool oo dhammaystiran. Eeg Tool call deltas. | Dhammaan model-yada |
Reasoning wuu ugu horreeyaa, kaddib jawaabta, kaddib wicitaannada tool kasta. Chunk ku akhri furayaasha delta kiisa, ma aha meeshiisa stream-ka: delta wuxuu haysan karaa role iyo qaybta qoraalka ugu horreysa, kan ugu dambeeyana waa madhan.
Stream dhan sida uu u socdo. Si xariiquhu u gaabnaadaan, id, object, created iyo model halkan chunk kasta waa laga reebay.
data: {"choices":[{"index":0,"delta":{"reasoning_content":"Three sentences:"},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{"reasoning_content":" what it is, how it is framed, why it is used."},"finish_reason":null}]}
: ping
data: {"choices":[{"index":0,"delta":{"content":"Server-sent"},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{"content":" events let a server push text to a client over one HTTP reply."},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":1190,"completion_tokens":84,"total_tokens":1274}}
data: [DONE] Reasoning deltas
Model fikiraya wuxuu reasoning-kiisa ku diraa delta.reasoning_content ka hor jawaabta. Labada qoraal kala hay: reasoning-ka u muuji qayb gooni ah oo la laalaabi karo, ama ka tag.
Model-yada open-weight ee la martigeliyo reasoning ma diraan marka reasoning_effort yahay off, iyo marka codsigu leeyahay response_format.
shannon-2-lite iyo shannon-2-pro sidoo kale way fikiraan ka hor inta ayan jawaabin. Endpoint-kan waxay diraan xariiqo faallo ah : thinking inta ay fikirayaan, kaddib jawaabta.
reasoning_content kuma jiro model-yada nooca leh ee SDK-yada OpenAI. Python ku akhri getattr(delta, "reasoning_content", None); JavaScript delta.reasoning_content sida uu yahay ayuu u shaqeeyaa.
Tool call deltas
Wicitaan tool wuxuu u yimaadaa dhan: hal chunk wicitaan kasta, delta kiisu wuxuu haystaa wicitaanka iyo string-ka arguments oo dhammaystiran. index wuxuu tiriyaa wicitaannada jawaabta laga bilaabo 0. Code isku xira arguments gabal-gabal wuu shaqeeyaa isbeddel la'aan, maxaa yeelay wuxuu isku xiraa hal gabal.
{
"tool_calls": [
{
"index": 0,
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\":\"Paris\"}"
}
}
]
} Wicitaannada ka dib, chunk-ga ugu dambeeya wuxuu leeyahay finish_reason tool_calls.
Marka codsigu leeyahay tools, shannon-1.6-lite, shannon-1.6-pro iyo shannon-coder-1 waxay qoraalka jawaabta u diraan sida hal delta dhammaadka jawaabta.
Chunk-ga ugu dambeeya
Chunk-ga ugu dambeeya ka hor data: [DONE] wuxuu leeyahay delta madhan, finish_reason iyo usage ee codsiga, dhammaantood isla chunk-ga. Stream kasta wuu leeyahay; stream_options uma baahnid.
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion.chunk",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"delta": {},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1190,
"completion_tokens": 84,
"total_tokens": 1274
}
} Model-yada open-weight ee la martigeliyo usage wuxuu sidoo kale leeyahay prompt_tokens_details.cached_tokens iyo completion_tokens_details.reasoning_tokens.
Codsi leh web_search: true oo raadintiisu wax heshay ka dib, chunk-ga ugu dambeeya wuxuu sidaa oo kale sido sources, hal chunk oo ka horeeya na wuxuu sidaa calaamadaha tixraaca sida delta.annotations. Ku-dhismay Raadinta Shabakadda
| finish_reason | Sharaxaad | Waxay dirtaa |
|---|---|---|
stop | Model-ku wuu dhammeeyay jawaabtiisa, ama string stop ayaa soo muuqday. | Dhammaan model-yada |
tool_calls | Jawaabtu waxay haysaa hal ama in ka badan oo wicitaanno tool ah. | Dhammaan model-yada |
length | Jawaabta waxaa lagu gooyay xadka output-ka. | Qoyska Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
Field-yada usage waxaa lagu sharaxay endpoint-ka. Chat Completions
Xariiqaha keep-alive
Inta model-ku shaqeynayo oo aanu wali waxba heysan inuu diro, stream-ku wuxuu sidaa xariiqo faallo ah. Xog ma haystaan. Parser-ka SSE iskiis ayuu uga booda; code-ka akhriya xariiqo cayriin ah waa inuu ka booday xariiq kasta ku bilaabata laba-dhibcood.
| Xariiq | Waxay dirtaa | Goorta |
|---|---|---|
: ping | Qoyska Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | 15 ilbiriqsi kasta. |
: keepalive | Model-yada open-weight ee la martigeliyo | 15 ilbiriqsi kasta inta model-ku shaqeynayo. |
: thinking | shannon-2-lite, shannon-2-pro | Inta model-ku fikirayo. |
Khaladaad stream dhexdiisa ah
Marka stream bilaabmo xaaladdiisu waa 200, sidaas darteed fashil wuxuu u yimaadaa stream dhexdiisa: chunk leh xubin error halka choices ay joogi lahayd.
data: {"error":{"message":"The model backend failed to answer. Please retry.","type":"api_error","code":null,"param":null}}
data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":1190,"completion_tokens":12,"total_tokens":1202}}
data: [DONE] Chunk-ga khaladka ka dib chunk-ga ugu dambeeya, oo leh finish_reason iyo usage, iyo data: [DONE] weli way raacayaan. Chunk kasta ka hubi error. Hubintaas la'aanteed jawaab badhkii ku fashilantay waxay u egtahay mid dhammaystiran.
| Nooc | Code | Fariin | Goorta |
|---|---|---|---|
api_error | The model backend failed to answer. Please retry. | Model-ku wuu fashilmay, ama waxba ma qorin. Mar kale dir codsiga. | |
rate_limit_error | Shannon routes are temporarily busy. Please retry. | Model-ku hadda waa mashquul. Sug dhowr ilbiriqsi oo mar kale dir codsiga. | |
invalid_request_error | context_length_exceeded | Wada-hadalku wuu ka dheer yahay context window-ka model-ka. Soo gaabi ka hor inta aadan mar kale dirin. Qoraalka fariintu wuu kala duwan yahay. |
Model-yada open-weight ee la martigeliyo waxay diraan xubinta error oo leh type iyo message oo keliya.
SDK-yada OpenAI Python iyo JavaScript waxay chunk khalad ah u kor qaadaan sida khalad API marka aad ku wareegayso, sidaas darteed wareegga ku duub maareynta khaladaadkaaga caadiga ah.
Koodhka xaaladda, jidhka khaladka iyo waxa dib loo tijaabiyo waxay leeyihiin bog u gaar ah. Khaladaadka Maareynta
Xidhitaanka isku xirka
Xidhitaanka isku xirku wuxuu joojiyaa gaarsiinta, ma aha codsiga. Model-ku wuxuu jawaabta qoraa ilaa dhammaadkeeda codsiga-na waxaa lagu dallacaa sidii aad oo dhan u akhrisay. Si aad wax yar u bixiso, wax yar codso: deji max_tokens hoose model dabaqa.
Stream sidoo kale wuxuu hore ugu dhammaan karaa jidka kuu socda, tusaale ahaan jaha shabakad ama marka server la cusboonaysiinayo. Kaddib wuu istaagaa chunk-ka ugu dambeeya iyo data: [DONE] la'aantood. Jawaabtaas u aqoon sida aan dhammaystirnayn oo mar kale dir codsiga.
Akhrinta stream SDK la'aan
Akhriyaha sax ahi wuxuu sameeyaa shan shay: khaladaadka stream-ka ka horreeya wuxuu u diraa maareynta khaladaadkiisa, jidhka wuxuu u kala qaybiyaa xariiqo, xariiqaha faallada wuu ka booda, wuxuu istaagaa data: [DONE], wuxuuna chunk kasta ka hubiyaa error.
import json
import requests
response = requests.post(
"https://api.shannon-ai.com/v1/chat/completions",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"model": "shannon-3",
"messages": [{"role": "user", "content": "Explain server-sent events in three sentences."}],
"stream": True,
},
stream=True,
)
# 1. Errors before the stream are plain JSON with their own status.
if response.status_code != 200:
raise RuntimeError(f"{response.status_code}: {response.text}")
answer, done = [], False
for raw in response.iter_lines(): # 2. one line at a time
line = raw.decode("utf-8")
if not line.startswith("data: "): # 3. empty lines and ": ping" comments
continue
data = line[len("data: "):]
if data == "[DONE]": # 4. the end of the stream
done = True
break
chunk = json.loads(data)
if "error" in chunk: # 5. a failure inside the stream
raise RuntimeError(chunk["error"]["message"])
delta = chunk["choices"][0]["delta"]
if delta.get("content"):
answer.append(delta["content"])
if chunk.get("usage"):
print(chunk["choices"][0]["finish_reason"], chunk["usage"])
if not done:
raise RuntimeError("the stream ended before [DONE]")
print("".join(answer)) const response = await fetch("https://api.shannon-ai.com/v1/chat/completions", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "shannon-3",
messages: [{ role: "user", content: "Explain server-sent events in three sentences." }],
stream: true,
}),
});
// 1. Errors before the stream are plain JSON with their own status.
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const decoder = new TextDecoder();
let buffer = "";
let answer = "";
let done = false;
read: for await (const bytes of response.body) {
buffer += decoder.decode(bytes, { stream: true });
const lines = buffer.split("\n"); // 2. one line at a time
buffer = lines.pop(); // keep the unfinished line
for (const line of lines) {
if (!line.startsWith("data: ")) continue; // 3. empty lines and ": ping" comments
const data = line.slice(6);
if (data === "[DONE]") { // 4. the end of the stream
done = true;
break read;
}
const chunk = JSON.parse(data);
if (chunk.error) throw new Error(chunk.error.message); // 5. a failure inside the stream
const choice = chunk.choices[0];
if (choice.delta.content) answer += choice.delta.content;
if (chunk.usage) console.log(choice.finish_reason, chunk.usage);
}
}
if (!done) throw new Error("the stream ended before [DONE]");
console.log(answer); Tusaalaha Python wuxuu isticmaalaa xirmada requests. Tusaalaha JavaScript wuxuu ka shaqeeyaa Node.js 18 ama ka dambeeya.
Streams-ka qaababka kale
Endpoint-yada Responses iyo Messages sidoo kale way stream-gareeyaan. Frame-yadooda waxay sidaan xariiq event: oo leh magaca event-ka iyo xariiq data: oo leh JSON-kiisa. Bog kastaa wuxuu events-kiisa liis garaynayaa sida ay u kala horreeyaan.
| Stream dhexdiisa | Chat Completions | Responses | Messages |
|---|---|---|---|
| Frame-yo | Xariiqaha data: | Xariiqaha event: iyo data: | Xariiqaha event: iyo data: |
| Reasoning wuxuu imaanayaa | delta.reasoning_content | response.reasoning_summary_text.delta | thinking_delta |
| Qoraalka jawaabtu wuxuu imaanayaa | delta.content | response.output_text.delta | text_delta |
| Usage wuxuu imaanayaa | Chunk-ga ugu dambeeya | response.completed | message_delta |
| Stream-ku wuxuu ku dhammaadaa | Chunk-ga ugu dambeeya, kaddib data: [DONE] | response.completed | message_stop |