ವಿಷಯಕ್ಕೆ ಹೋಗಿ
ಸ್ಟ್ರೀಮಿಂಗ್

ಸ್ಟ್ರೀಮಿಂಗ್

stream ಅನ್ನು true ಗೆ ಹೊಂದಿಸಿದರೆ ಮಾಡೆಲ್ ಬರೆಯುತ್ತಿರುವಾಗಲೇ ಉತ್ತರ server-sent events ಆಗಿ ಬರುತ್ತದೆ: ಮೊದಲು ರೀಸನಿಂಗ್, ನಂತರ ಉತ್ತರ, ನಂತರ ಮುಕ್ತಾಯದ ಕಾರಣ ಮತ್ತು usage ಇರುವ ಕೊನೆಯ chunk. ವ್ಯಕ್ತಿಯೊಬ್ಬರು ಪಠ್ಯಕ್ಕಾಗಿ ಕಾಯುತ್ತಿರುವಾಗ ಮತ್ತು ಉದ್ದದ ಉತ್ತರಗಳಿಗೆ ಇದನ್ನು ಬಳಸಿ.

POST https://api.shannon-ai.com/v1/chat/completions

OpenAI SDK ಗಳು 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 ಅನ್ನು ಹೇಗೆ ಫ್ರೇಮ್ ಮಾಡಲಾಗುತ್ತದೆ

  • ಉತ್ತರಕ್ಕೆ ಸ್ಥಿತಿ 200 ಮತ್ತು content-type: text/event-stream ಹಾಗೂ cache-control: no-cache ಹೆಡರ್‌ಗಳಿರುತ್ತವೆ.
  • ಪ್ರತಿ ಈವೆಂಟ್ data: ನಿಂದ ಆರಂಭವಾಗುವ ಒಂದು ಸಾಲು, ಅದರ ನಂತರ ಖಾಲಿ ಸಾಲು. data: ನಂತರದ ಪಠ್ಯ ಒಂದು JSON chunk. 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
    }
  ]
}

ಒಂದು stream ನ ಎಲ್ಲಾ chunk ಗಳು ಒಂದೇ id, created ಮತ್ತು model ಹೊತ್ತಿರುತ್ತವೆ. choices ಯಾವಾಗಲೂ ಒಂದು ನಮೂದನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಅದರ delta ಹೊಸದನ್ನು ಹೊಂದಿರುತ್ತದೆ, ಮತ್ತು finish_reason ಕೊನೆಯ chunk ವರೆಗೆ null.

delta ನಲ್ಲಿ ಕೀ ವಿಧ ವಿವರಣೆ ಕಳುಹಿಸುವವರು
role string ಯಾವಾಗಲೂ assistant. ಇದು stream ನ ಆರಂಭದಲ್ಲಿ ಒಮ್ಮೆ ಬರುತ್ತದೆ. ಹೋಸ್ಟ್ ಮಾಡಿದ ಓಪನ್-ವೇಟ್ ಮಾಡೆಲ್‌ಗಳು, shannon-2-lite, shannon-2-pro
reasoning_content string ಮಾಡೆಲ್‌ನ ರೀಸನಿಂಗ್‌ನ ಒಂದು ತುಣುಕು. ತುಣುಕುಗಳನ್ನು ಕ್ರಮವಾಗಿ ಜೋಡಿಸಿ. ಹೋಸ್ಟ್ ಮಾಡಿದ ಓಪನ್-ವೇಟ್ ಮಾಡೆಲ್‌ಗಳು, Shannon 3 ಕುಟುಂಬ, shannon-1.6-pro, shannon-coder-1
content string ಉತ್ತರದ ಒಂದು ತುಣುಕು. ತುಣುಕುಗಳನ್ನು ಕ್ರಮವಾಗಿ ಜೋಡಿಸಿ. ಎಲ್ಲಾ ಮಾಡೆಲ್‌ಗಳು
tool_calls array ಒಂದು ಪೂರ್ಣ ಟೂಲ್ ಕರೆ. ಟೂಲ್ ಕರೆ deltas ಅನ್ನು ನೋಡಿ. ಎಲ್ಲಾ ಮಾಡೆಲ್‌ಗಳು

ರೀಸನಿಂಗ್ ಮೊದಲು ಬರುತ್ತದೆ, ನಂತರ ಉತ್ತರ, ನಂತರ ಯಾವುದೇ ಟೂಲ್ ಕರೆಗಳು. chunk ಅನ್ನು stream ನಲ್ಲಿ ಅದರ ಸ್ಥಾನದಿಂದಲ್ಲ, ಅದರ delta ನಲ್ಲಿನ ಕೀಗಳಿಂದ ಓದಿ: delta ಮೊದಲ ಪಠ್ಯ ತುಣುಕಿನೊಂದಿಗೆ role ಅನ್ನೂ ಹೊತ್ತಿರಬಹುದು, ಮತ್ತು ಕೊನೆಯದು ಖಾಲಿ.

ಇಡೀ stream, ಅದು ಪ್ರಯಾಣಿಸುವಂತೆ. ಸಾಲುಗಳನ್ನು ಚಿಕ್ಕದಾಗಿಡಲು, ಇಲ್ಲಿ ಪ್ರತಿ chunk ನಿಂದ id, object, created ಮತ್ತು model ಅನ್ನು ಬಿಡಲಾಗಿದೆ.

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]

ರೀಸನಿಂಗ್ deltas

ರೀಸನಿಂಗ್ ಮಾಡುವ ಮಾಡೆಲ್ ಉತ್ತರದ ಮೊದಲು ತನ್ನ ರೀಸನಿಂಗ್ ಅನ್ನು delta.reasoning_content ನಲ್ಲಿ ಕಳುಹಿಸುತ್ತದೆ. ಎರಡು ಪಠ್ಯಗಳನ್ನು ಬೇರೆಯಾಗಿ ಇಡಿ: ರೀಸನಿಂಗ್ ಅನ್ನು ಪ್ರತ್ಯೇಕ, ಮಡಚಬಹುದಾದ ಭಾಗವಾಗಿ ತೋರಿಸಿ, ಅಥವಾ ಬಿಟ್ಟುಬಿಡಿ.

reasoning_effort off ಆಗಿದ್ದಾಗ ಹೋಸ್ಟ್ ಮಾಡಿದ ಓಪನ್-ವೇಟ್ ಮಾಡೆಲ್‌ಗಳು ರೀಸನಿಂಗ್ ಕಳುಹಿಸುವುದಿಲ್ಲ, ಮತ್ತು ವಿನಂತಿಗೆ response_format ಇದ್ದಾಗಲೂ ಕಳುಹಿಸುವುದಿಲ್ಲ.

shannon-2-lite ಮತ್ತು shannon-2-pro ಕೂಡ ಉತ್ತರಿಸುವ ಮೊದಲು ರೀಸನಿಂಗ್ ಮಾಡುತ್ತವೆ. ಈ ಎಂಡ್‌ಪಾಯಿಂಟ್‌ನಲ್ಲಿ ಅವು ಮಾಡುತ್ತಿರುವಾಗ : thinking ಕಾಮೆಂಟ್ ಸಾಲುಗಳನ್ನು, ನಂತರ ಉತ್ತರವನ್ನು ಕಳುಹಿಸುತ್ತವೆ.

reasoning_content OpenAI SDK ಗಳ typed ಮಾಡೆಲ್‌ಗಳಲ್ಲಿ ಇಲ್ಲ. Python ನಲ್ಲಿ ಅದನ್ನು getattr(delta, "reasoning_content", None) ನೊಂದಿಗೆ ಓದಿ; JavaScript ನಲ್ಲಿ delta.reasoning_content ಇದ್ದಂತೆಯೇ ಕೆಲಸ ಮಾಡುತ್ತದೆ.

ಟೂಲ್ ಕರೆ deltas

ಟೂಲ್ ಕರೆ ಪೂರ್ಣವಾಗಿ ಬರುತ್ತದೆ: ಪ್ರತಿ ಕರೆಗೆ ಒಂದು chunk, ಅದರ delta ಸಂಪೂರ್ಣ arguments string ಇರುವ ಕರೆಯನ್ನು ಹೊಂದಿರುತ್ತದೆ. 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

data: [DONE] ಮೊದಲಿನ ಕೊನೆಯ chunk ಖಾಲಿ 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
  }
}

ಹೋಸ್ಟ್ ಮಾಡಿದ ಓಪನ್-ವೇಟ್ ಮಾಡೆಲ್‌ಗಳಲ್ಲಿ usage ಗೆ prompt_tokens_details.cached_tokens ಮತ್ತು completion_tokens_details.reasoning_tokens ಕೂಡ ಇರುತ್ತವೆ.

ಹುಡುಕಾಟ ಏನನ್ನಾದರೂ ಕಂಡ web_search: true ವಿನಂತಿಯ ನಂತರ, ಕೊನೆಯ chunk sources ಅನ್ನೂ ಹೊತ್ತಿರುತ್ತದೆ, ಮತ್ತು ಅದರ ಮುಂಚಿನ ಒಂದು chunk ಉಲ್ಲೇಖ ಗುರುತುಗಳನ್ನು delta.annotations ಆಗಿ ಹೊತ್ತಿರುತ್ತದೆ. ಒಳನಿರ್ಮಿತ ವೆಬ್ ಹುಡುಕಾಟ

finish_reason ವಿವರಣೆ ಕಳುಹಿಸುವವರು
stop ಮಾಡೆಲ್ ತನ್ನ ಉತ್ತರವನ್ನು ಮುಗಿಸಿತು, ಅಥವಾ stop string ಕಾಣಿಸಿಕೊಂಡಿತು. ಎಲ್ಲಾ ಮಾಡೆಲ್‌ಗಳು
tool_calls ಉತ್ತರ ಒಂದು ಅಥವಾ ಹೆಚ್ಚು ಟೂಲ್ ಕರೆಗಳನ್ನು ಹೊಂದಿದೆ. ಎಲ್ಲಾ ಮಾಡೆಲ್‌ಗಳು
length ಉತ್ತರ ಔಟ್‌ಪುಟ್ ಮಿತಿಯಲ್ಲಿ ಕತ್ತರಿಸಲ್ಪಟ್ಟಿತು. Shannon 3 ಕುಟುಂಬ, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1

usage ನ ಫೀಲ್ಡ್‌ಗಳನ್ನು ಎಂಡ್‌ಪಾಯಿಂಟ್‌ನೊಂದಿಗೆ ವಿವರಿಸಲಾಗಿದೆ. Chat Completions

Keep-alive ಸಾಲುಗಳು

ಮಾಡೆಲ್ ಕೆಲಸ ಮಾಡುತ್ತಿದ್ದು ಇನ್ನೂ ಕಳುಹಿಸಲು ಏನೂ ಇಲ್ಲದಿದ್ದಾಗ, stream ಕಾಮೆಂಟ್ ಸಾಲುಗಳನ್ನು ಹೊತ್ತಿರುತ್ತದೆ. ಅವು ಯಾವುದೇ ಡೇಟಾ ಹೊಂದಿರುವುದಿಲ್ಲ. SSE ಪಾರ್ಸರ್ ಅವನ್ನು ತಾನೇ ಬಿಟ್ಟುಬಿಡುತ್ತದೆ; ಕಚ್ಚಾ ಸಾಲುಗಳನ್ನು ಓದುವ ಕೋಡ್ ಕೊಲೊನ್‌ನಿಂದ ಆರಂಭವಾಗುವ ಪ್ರತಿ ಸಾಲನ್ನು ಬಿಡಬೇಕು.

ಸಾಲು ಕಳುಹಿಸುವವರು ಯಾವಾಗ
: ping Shannon 3 ಕುಟುಂಬ, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 ಪ್ರತಿ 15 ಸೆಕೆಂಡ್‌ಗೆ.
: keepalive ಹೋಸ್ಟ್ ಮಾಡಿದ ಓಪನ್-ವೇಟ್ ಮಾಡೆಲ್‌ಗಳು ಮಾಡೆಲ್ ಕೆಲಸ ಮಾಡುತ್ತಿರುವಾಗ ಪ್ರತಿ 15 ಸೆಕೆಂಡ್‌ಗೆ.
: thinking shannon-2-lite, shannon-2-pro ಮಾಡೆಲ್ ರೀಸನಿಂಗ್ ಮಾಡುತ್ತಿರುವಾಗ.

stream ಒಳಗಿನ ದೋಷಗಳು

stream ಆರಂಭವಾದ ನಂತರ ಅದರ ಸ್ಥಿತಿ 200, ಆದ್ದರಿಂದ ವೈಫಲ್ಯ stream ಒಳಗೆ ಬರುತ್ತದೆ: choices ಇರಬೇಕಾದ ಸ್ಥಳದಲ್ಲಿ error ಸದಸ್ಯವಿರುವ chunk.

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 ನ ನಂತರ finish_reason ಮತ್ತು usage ಇರುವ ಕೊನೆಯ chunk, ಮತ್ತು 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 ಸಂಭಾಷಣೆ ಮಾಡೆಲ್‌ನ ಕಾಂಟೆಕ್ಸ್ಟ್ ವಿಂಡೋಗಿಂತ ಉದ್ದವಾಗಿದೆ. ಮತ್ತೆ ಕಳುಹಿಸುವ ಮೊದಲು ಅದನ್ನು ಚಿಕ್ಕದಾಗಿಸಿ. ಸಂದೇಶದ ಪಠ್ಯ ಬದಲಾಗುತ್ತದೆ.

ಹೋಸ್ಟ್ ಮಾಡಿದ ಓಪನ್-ವೇಟ್ ಮಾಡೆಲ್‌ಗಳು error ಸದಸ್ಯವನ್ನು type ಮತ್ತು message ನೊಂದಿಗೆ ಮಾತ್ರ ಕಳುಹಿಸುತ್ತವೆ.

OpenAI Python ಮತ್ತು JavaScript SDK ಗಳು ನೀವು ಇಟರೇಟ್ ಮಾಡುವಾಗ ದೋಷ chunk ಅನ್ನು API ದೋಷವಾಗಿ ಎಸೆಯುತ್ತವೆ, ಆದ್ದರಿಂದ ಲೂಪ್ ಅನ್ನು ನಿಮ್ಮ ಸಾಮಾನ್ಯ ದೋಷ ನಿರ್ವಹಣೆಯಲ್ಲಿ ಸುತ್ತಿ.

ಸ್ಥಿತಿ ಕೋಡ್‌ಗಳು, ದೋಷ ಬಾಡಿ ಮತ್ತು ಏನನ್ನು ಮರುಪ್ರಯತ್ನಿಸಬೇಕು ಎಂಬುದಕ್ಕೆ ತನ್ನದೇ ಪುಟವಿದೆ. ದೋಷ ನಿರ್ವಹಣೆ

ಸಂಪರ್ಕ ಮುಚ್ಚುವುದು

ಸಂಪರ್ಕವನ್ನು ಮುಚ್ಚುವುದು ವಿತರಣೆಯನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ, ವಿನಂತಿಯನ್ನಲ್ಲ. ಮಾಡೆಲ್ ಉತ್ತರವನ್ನು ಅದರ ಕೊನೆಯವರೆಗೆ ಬರೆಯುತ್ತದೆ ಮತ್ತು ನೀವು ಎಲ್ಲವನ್ನೂ ಓದಿದಂತೆ ವಿನಂತಿಗೆ ಶುಲ್ಕ ವಿಧಿಸಲಾಗುತ್ತದೆ. ಕಡಿಮೆ ಪಾವತಿಸಲು ಕಡಿಮೆ ಕೇಳಿ: ಅದನ್ನು ಅನ್ವಯಿಸುವ ಮಾಡೆಲ್‌ನಲ್ಲಿ ಕಡಿಮೆ max_tokens ಹೊಂದಿಸಿ.

stream ನಿಮಗೆ ಬರುವ ದಾರಿಯಲ್ಲಿ ಬೇಗನೆ ಕೊನೆಗೊಳ್ಳಬಹುದು, ಉದಾಹರಣೆಗೆ ನೆಟ್‌ವರ್ಕ್ ಕಡಿತದಲ್ಲಿ ಅಥವಾ ಸರ್ವರ್ ಅಪ್‌ಡೇಟ್ ಆಗುತ್ತಿರುವಾಗ. ಆಗ ಅದು ಕೊನೆಯ chunk ಇಲ್ಲದೆ ಮತ್ತು data: [DONE] ಇಲ್ಲದೆ ನಿಲ್ಲುತ್ತದೆ. ಆ ಉತ್ತರವನ್ನು ಅಪೂರ್ಣ ಎಂದು ಪರಿಗಣಿಸಿ ವಿನಂತಿಯನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಿ.

SDK ಇಲ್ಲದೆ stream ಓದುವುದು

ಸರಿಯಾದ ರೀಡರ್ ಐದು ಕೆಲಸಗಳನ್ನು ಮಾಡುತ್ತದೆ: stream ಮೊದಲು ಬರುವ ದೋಷಗಳನ್ನು ತನ್ನ ದೋಷ ನಿರ್ವಹಣೆಗೆ ಕಳುಹಿಸುತ್ತದೆ, ಬಾಡಿಯನ್ನು ಸಾಲುಗಳಾಗಿ ವಿಭಜಿಸುತ್ತದೆ, ಕಾಮೆಂಟ್ ಸಾಲುಗಳನ್ನು ಬಿಡುತ್ತದೆ, 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 ಅಥವಾ ನಂತರದ ಆವೃತ್ತಿಯಲ್ಲಿ ಚಲಿಸುತ್ತದೆ.

ಇತರ ಫಾರ್ಮ್ಯಾಟ್‌ಗಳ streams

Responses ಮತ್ತು Messages ಎಂಡ್‌ಪಾಯಿಂಟ್‌ಗಳೂ stream ಮಾಡುತ್ತವೆ. ಅವುಗಳ ಫ್ರೇಮ್‌ಗಳು ಈವೆಂಟ್‌ನ ಹೆಸರಿರುವ event: ಸಾಲು ಮತ್ತು ಅದರ JSON ಇರುವ data: ಸಾಲನ್ನು ಹೊತ್ತಿರುತ್ತವೆ. ಪ್ರತಿ ಪುಟ ತನ್ನ ಈವೆಂಟ್‌ಗಳನ್ನು ಕ್ರಮದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡುತ್ತದೆ.

stream ನಲ್ಲಿ Chat CompletionsResponsesMessages
ಫ್ರೇಮ್‌ಗಳು 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