U gudub nuxurka
Streaming

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

Sida stream loo qaabeeyo

  • Jawaabtu waxay leedahay xaalad 200 iyo header-yada content-type: text/event-stream iyo cache-control: no-cache.
  • Event kasta waa hal xariiq ku bilaabata data: oo ay raacdo xariiq madhan. Qoraalka data: ka dambeeya waa hal chunk JSON ah. Xariiqo event: ama id: 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:

JSON
{
  "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.

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]

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.

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

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

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.

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

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 CompletionsResponsesMessages
Frame-yo Xariiqaha data:Xariiqaha event: iyo data:Xariiqaha event: iyo data:
Reasoning wuxuu imaanayaa delta.reasoning_contentresponse.reasoning_summary_text.deltathinking_delta
Qoraalka jawaabtu wuxuu imaanayaa delta.contentresponse.output_text.deltatext_delta
Usage wuxuu imaanayaa Chunk-ga ugu dambeeyaresponse.completedmessage_delta
Stream-ku wuxuu ku dhammaadaa Chunk-ga ugu dambeeya, kaddib data: [DONE]response.completedmessage_stop