بازدان بۆ ناوەڕۆک
Streaming

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}")

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 ە:

JSON
{
  "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 ێک دەردەهێنراون.

200 text/event-stream
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 پارچە پارچە یەک دەخات بێ گۆڕان کار دەکات، چونکە یەک پارچە یەک دەخات.

delta
{
  "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 نییە.

JSON
{
  "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 دەبوو.

200 text/event-stream
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))

نموونەی Python پاکێجی requests بەکاردەهێنێت. نموونەی JavaScript لەسەر Node.js 18 یان نوێتر کار دەکات.

Stream ی فۆرماتەکانی دیکە

Endpoint ـەکانی Responses و Messages یش stream دەکەن. Frame ـەکانیان هێڵی event: لەگەڵ ناوی ڕووداوەکە و هێڵی data: لەگەڵ JSON ـەکەی هەڵدەگرن. هەر لاپەڕەیەک ڕووداوەکانی بە ڕیز لیست دەکات.

لە stream دا Chat CompletionsResponsesMessages
Frame ـەکان هێڵەکانی data:هێڵەکانی event: و data:هێڵەکانی event: و data:
بیرکردنەوە دەگات لە delta.reasoning_contentresponse.reasoning_summary_text.deltathinking_delta
دەقی وەڵام دەگات لە delta.contentresponse.output_text.deltatext_delta
Usage دەگات لە دوایین chunkresponse.completedmessage_delta
stream کۆتایی دێت بە دوایین chunk، پاشان data: [DONE]response.completedmessage_stop