Streaming
stream بکە بە true و وەڵامەکە وەک server-sent events دەگات لەکاتێکدا مۆدێلەکە دەینووسێت: سەرەتا بیرکردنەوە، پاشان وەڵامەکە، پاشان دوایین chunk لەگەڵ هۆکاری کۆتاییهاتن و usage. هەر کاتێک کەسێک چاوەڕێی دەقەکەیە بەکاری بهێنە، و بۆ وەڵامی درێژ.
POST https://api.shannon-ai.com/v1/chat/completions
SDK ـەکانی OpenAI chunk ـەکان یەک بە یەک دەدەن. هەر chunk ێک بەپێی ئەوەی هەڵیدەگرێت بخوێنەرەوە: پارچەیەک لە بیرکردنەوە، پارچەیەک لە وەڵامەکە، بانگکردنی ئامرازێک، یان کۆتایی وەڵامەکە.
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
}' stream چۆن چوارچێوە دەکرێت
- وەڵامەکە status ی
200و headers یcontent-type: text/event-streamوcache-control: no-cacheی هەیە. - هەر ڕووداوێک یەک هێڵە کە بە
data:دەست پێدەکات و دوای ئەوە هێڵێکی بەتاڵ دێت. دەقی دوایdata:یەک chunk ی JSON ە. هێڵیevent:یانid:نییە. - هێڵێک کە بە دوو خاڵ دەست پێدەکات، وەک
: ping، تێبینییەکە کە پەیوەندییەکە کراوە دەهێڵێتەوە. تێیبپەڕێنە. - stream بە
data: [DONE]کۆتایی دێت. stream ێک کە بەبێ ئەوە بوەستێت ناتەواوە.
Chunk ـەکان بە ڕیز
هەر chunk ێک ئۆبجێکتێکی chat.completion.chunk ە:
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion.chunk",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"delta": {
"content": "Server-sent"
},
"finish_reason": null
}
]
} هەموو chunk ـەکانی یەک stream هەمان id، created و model هەڵدەگرن. choices هەمیشە یەک تۆمار هەڵدەگرێت. delta ـەکەی ئەوە هەڵدەگرێت کە نوێیە، و finish_reason null ە تا دوایین chunk.
| کلیل لە delta | جۆر | وەسف | دەنێردرێت لەلایەن |
|---|---|---|---|
role | string | هەمیشە assistant. یەک جار لە سەرەتای stream دا دەگات. | مۆدێلە open-weight ـە میوانداریکراوەکان، shannon-2-lite، shannon-2-pro |
reasoning_content | string | پارچەیەک لە بیرکردنەوەی مۆدێلەکە. پارچەکان بە ڕیز یەک بخەرەوە. | مۆدێلە open-weight ـە میوانداریکراوەکان، بنەماڵەی Shannon 3، shannon-1.6-pro، shannon-coder-1 |
content | string | پارچەیەک لە وەڵامەکە. پارچەکان بە ڕیز یەک بخەرەوە. | هەموو مۆدێلەکان |
tool_calls | array | یەک بانگکردنی ئامرازی تەواو. Tool call deltas ببینە. | هەموو مۆدێلەکان |
بیرکردنەوە یەکەم دێت، پاشان وەڵامەکە، پاشان هەر بانگکردنێکی ئامراز. chunk ێک بەپێی کلیلەکانی delta ـەکەی بخوێنەرەوە، نەک بەپێی شوێنی لە stream دا: delta دەتوانێت role لەگەڵ یەکەم پارچەی دەق هەڵبگرێت، و دوایینیان بەتاڵە.
stream ێکی تەواو وەک دەگەڕێت. بۆ کورتکردنی هێڵەکان، id، object، created و model لێرە لە هەر chunk ێک دەردەهێنراون.
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] Delta ـەکانی بیرکردنەوە
مۆدێلێک کە بیر دەکاتەوە بیرکردنەوەکەی لە delta.reasoning_content دەنێرێت پێش وەڵامەکە. ئەو دوو دەقە لێک جیا بهێڵەرەوە: بیرکردنەوە وەک بەشێکی جیای قەبارە گەورەکراو نیشان بدە، یان لایببە.
مۆدێلە open-weight ـە میوانداریکراوەکان هیچ بیرکردنەوەیەک نانێرن کاتێک reasoning_effort off ە، و کاتێکیش داواکارییەکە response_format ی هەبێت.
shannon-2-lite و shannon-2-pro یش پێش وەڵامدانەوە بیر دەکەنەوە. لەسەر ئەم endpoint ـە لەکاتی ئەوەدا هێڵی تێبینیی : thinking دەنێرن، پاشان وەڵامەکە.
reasoning_content لە مۆدێلە جۆردارەکانی SDK ـەکانی OpenAI نییە. لە Python بە getattr(delta, "reasoning_content", None) بیخوێنەرەوە؛ لە JavaScript delta.reasoning_content وەک خۆی کار دەکات.
Delta ـەکانی بانگکردنی ئامراز
بانگکردنی ئامرازێک بە تەواوی دەگات: یەک chunk بۆ هەر بانگکردنێک، کە delta ـەکەی بانگکردنەکە لەگەڵ string ی arguments ی تەواو هەڵدەگرێت. index بانگکردنەکانی وەڵامەکە لە 0 ەوە ژمارە دەکات. ئەو کۆدەی arguments پارچە پارچە یەک دەخات بێ گۆڕان کار دەکات، چونکە یەک پارچە یەک دەخات.
{
"tool_calls": [
{
"index": 0,
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\":\"Paris\"}"
}
}
]
} دوای بانگکردنەکان، دوایین chunk finish_reason ی tool_calls ی هەیە.
کاتێک داواکارییەکە tools ی هەبێت، shannon-1.6-lite، shannon-1.6-pro و shannon-coder-1 دەقی وەڵامەکە وەک یەک delta لە کۆتایی وەڵامەکەدا دەنێرن.
دوایین chunk
دوایین chunk پێش data: [DONE] delta ێکی بەتاڵ، finish_reason و usage ی داواکارییەکەی هەیە، هەموو لە هەمان chunk دا. هەموو stream ێک هەیەتی؛ پێویستت بە stream_options نییە.
{
"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
}
} لەسەر مۆدێلە open-weight ـە میوانداریکراوەکان usage هەروەها prompt_tokens_details.cached_tokens و completion_tokens_details.reasoning_tokens ی هەیە.
دوای داواکارییەک بە web_search: true کە گەڕانەکەی شتێکی دۆزیبێتەوە، دوایین chunk هەروەها sources هەڵدەگرێت، و یەک chunk پێش ئەوە نیشانەکانی ئاماژەپێکردن وەک delta.annotations هەڵدەگرێت. Lêgerîna webê
| finish_reason | وەسف | دەنێردرێت لەلایەن |
|---|---|---|
stop | مۆدێلەکە وەڵامەکەی تەواو کرد، یان string ێکی stop دەرکەوت. | هەموو مۆدێلەکان |
tool_calls | وەڵامەکە یەک یان چەند بانگکردنی ئامراز هەڵدەگرێت. | هەموو مۆدێلەکان |
length | وەڵامەکە لە سنووری output دا بڕدرا. | بنەماڵەی Shannon 3، shannon-1.6-lite، shannon-1.6-pro، shannon-coder-1 |
بوارەکانی usage لەگەڵ endpoint ـەکە باس کراون. Chat Completions
هێڵەکانی keep-alive
لەکاتێکدا مۆدێلەکە کار دەکات و هێشتا هیچی نییە بینێرێت، stream هێڵی تێبینی هەڵدەگرێت. هیچ داتایەک هەڵناگرن. parser ی SSE خۆی تێیان دەپەڕێنێت؛ ئەو کۆدەی هێڵی خاو دەخوێنێتەوە دەبێت هەر هێڵێک بپەڕێنێت کە بە دوو خاڵ دەست پێدەکات.
| هێڵ | دەنێردرێت لەلایەن | کەی |
|---|---|---|
: ping | بنەماڵەی Shannon 3، shannon-1.6-lite، shannon-1.6-pro، shannon-coder-1 | هەر 15 چرکە جارێک. |
: keepalive | مۆدێلە open-weight ـە میوانداریکراوەکان | هەر 15 چرکە جارێک لەکاتی کارکردنی مۆدێلەکە. |
: thinking | shannon-2-lite، shannon-2-pro | لەکاتی بیرکردنەوەی مۆدێلەکە. |
هەڵە لەناو stream دا
کاتێک stream دەست پێدەکات status ـەکەی 200 ە، بۆیە شکست لەناو stream دا دەگات: chunk ێک بە ئەندامی error لەو شوێنەی choices دەبوو.
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 ی هەڵە، دوایین chunk، لەگەڵ finish_reason و usage، و data: [DONE] هێشتا دێن. هەر chunk ێک بپشکنە بۆ error. بەبێ ئەو پشکنینە وەڵامێک کە لە ناوەڕاستدا شکستی هێنابێت تەواو دیارە.
| جۆر | کۆد | پەیام | کەی |
|---|---|---|---|
api_error | The model backend failed to answer. Please retry. | مۆدێلەکە شکستی هێنا، یان هیچی نەنووسی. داواکارییەکە دووبارە بنێرە. | |
rate_limit_error | Shannon routes are temporarily busy. Please retry. | مۆدێلەکە لەم ساتەدا ماندووە. چەند چرکەیەک چاوەڕێ بکە و داواکارییەکە دووبارە بنێرە. | |
invalid_request_error | context_length_exceeded | گفتوگۆکە لە context window ی مۆدێلەکە درێژترە. کورتی بکەرەوە پێش ئەوەی دووبارە بینێریت. دەقی پەیامەکە دەگۆڕێت. |
مۆدێلە open-weight ـە میوانداریکراوەکان ئەندامی error تەنها بە type و message دەنێرن.
SDK ـەکانی Python و JavaScript ی OpenAI chunk ی هەڵە وەک هەڵەی API بەرز دەکەنەوە لەکاتی iterate کردنەکەتدا، بۆیە خولەکە بخەرە ناو مامەڵەکردنی ئاسایی هەڵەکانتەوە.
کۆدەکانی status، body ی هەڵە و ئەوەی چی دووبارە بکرێتەوە لاپەڕەی تایبەتی خۆیان هەیە. Çewtî
داخستنی پەیوەندییەکە
داخستنی پەیوەندییەکە گەیاندن ڕادەگرێت، نەک داواکارییەکە. مۆدێلەکە وەڵامەکە تا کۆتایی دەنووسێت و داواکارییەکە نرخ دەگیرێت وەک ئەوەی هەمووت خوێندبێتەوە. بۆ پارەدانی کەمتر، کەمتر داوا بکە: max_tokens ێکی کەمتر دابنێ لەسەر مۆدێلێک کە جێبەجێی دەکات.
stream دەتوانێت لە ڕێگای گەیشتنی بۆ تۆ زووتریش کۆتایی بێت، بۆ نموونە لە پچڕانی تۆڕ یان لەکاتی نوێکردنەوەی سێرڤەرێک. ئەو کات بەبێ دوایین chunk و بەبێ data: [DONE] دەوەستێت. ئەو وەڵامە وەک ناتەواو ببینە و داواکارییەکە دووبارە بنێرە.
خوێندنەوەی stream بەبێ SDK
خوێنەرێکی دروست پێنج کار دەکات: ئەو هەڵانەی پێش stream دەگەن دەنێرێت بۆ مامەڵەکردنی هەڵەکانی، body ی دەکات بە هێڵ، هێڵی تێبینی دەپەڕێنێت، لە data: [DONE] دەوەستێت، و هەر chunk ێک دەپشکنێت بۆ 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); نموونەی Python پاکێجی requests بەکاردەهێنێت. نموونەی JavaScript لەسەر Node.js 18 یان نوێتر کار دەکات.
Stream ی فۆرماتەکانی دیکە
Endpoint ـەکانی Responses و Messages یش stream دەکەن. Frame ـەکانیان هێڵی event: لەگەڵ ناوی ڕووداوەکە و هێڵی data: لەگەڵ JSON ـەکەی هەڵدەگرن. هەر لاپەڕەیەک ڕووداوەکانی بە ڕیز لیست دەکات.
| لە stream دا | Chat Completions | Responses | Messages |
|---|---|---|---|
| Frame ـەکان | هێڵەکانی data: | هێڵەکانی event: و data: | هێڵەکانی event: و data: |
| بیرکردنەوە دەگات لە | delta.reasoning_content | response.reasoning_summary_text.delta | thinking_delta |
| دەقی وەڵام دەگات لە | delta.content | response.output_text.delta | text_delta |
| Usage دەگات لە | دوایین chunk | response.completed | message_delta |
| stream کۆتایی دێت بە | دوایین chunk، پاشان data: [DONE] | response.completed | message_stop |