ਸਮੱਗਰੀ ਤੇ ਜਾਓ
ਸਟ੍ਰੀਮਿੰਗ

ਸਟ੍ਰੀਮਿੰਗ

stream ਨੂੰ true ਕਰੋ ਅਤੇ ਜਵਾਬ ਮਾਡਲ ਦੇ ਲਿਖਣ ਦੇ ਨਾਲ-ਨਾਲ server-sent events ਵਜੋਂ ਆਉਂਦਾ ਹੈ: ਪਹਿਲਾਂ ਰੀਜ਼ਨਿੰਗ, ਫਿਰ ਜਵਾਬ, ਫਿਰ ਸਮਾਪਤੀ ਦੇ ਕਾਰਨ ਅਤੇ usage ਵਾਲਾ ਆਖਰੀ ਚੰਕ। ਜਦੋਂ ਵੀ ਕੋਈ ਵਿਅਕਤੀ ਟੈਕਸਟ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੋਵੇ, ਅਤੇ ਲੰਬੇ ਜਵਾਬਾਂ ਲਈ, ਇਸਨੂੰ ਵਰਤੋ।

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

OpenAI SDK ਤੁਹਾਨੂੰ ਚੰਕ ਇੱਕ-ਇੱਕ ਕਰਕੇ ਦਿੰਦੇ ਹਨ। ਹਰ ਚੰਕ ਨੂੰ ਇਸ ਅਨੁਸਾਰ ਪੜ੍ਹੋ ਕਿ ਉਹ ਕੀ ਲੈ ਕੇ ਆਇਆ ਹੈ: ਰੀਜ਼ਨਿੰਗ ਦਾ ਟੁਕੜਾ, ਜਵਾਬ ਦਾ ਟੁਕੜਾ, ਇੱਕ ਟੂਲ ਕਾਲ, ਜਾਂ ਜਵਾਬ ਦਾ ਅੰਤ।

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

ਸਟ੍ਰੀਮ ਦੀ ਫਰੇਮਿੰਗ ਕਿਵੇਂ ਹੁੰਦੀ ਹੈ

  • ਜਵਾਬ ਦਾ ਸਟੇਟਸ 200 ਹੁੰਦਾ ਹੈ ਅਤੇ headers content-type: text/event-stream ਅਤੇ cache-control: no-cache ਹੁੰਦੇ ਹਨ।
  • ਹਰ ਇਵੈਂਟ ਇੱਕ ਲਾਈਨ ਹੈ ਜੋ data: ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ ਅਤੇ ਉਸ ਤੋਂ ਬਾਅਦ ਇੱਕ ਖਾਲੀ ਲਾਈਨ ਆਉਂਦੀ ਹੈ। data: ਤੋਂ ਬਾਅਦ ਦਾ ਟੈਕਸਟ ਇੱਕ JSON ਚੰਕ ਹੈ। ਇੱਥੇ ਕੋਈ event: ਜਾਂ id: ਲਾਈਨ ਨਹੀਂ ਹੁੰਦੀ।
  • ਕੋਲਨ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀ ਲਾਈਨ, ਜਿਵੇਂ : ping, ਇੱਕ ਕੁਮੈਂਟ ਹੈ ਜੋ ਕਨੈਕਸ਼ਨ ਨੂੰ ਖੁੱਲ੍ਹਾ ਰੱਖਦੀ ਹੈ। ਇਸਨੂੰ ਛੱਡ ਦਿਓ।
  • ਸਟ੍ਰੀਮ data: [DONE] ਨਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ। ਜੋ ਸਟ੍ਰੀਮ ਇਸ ਤੋਂ ਬਿਨਾਂ ਰੁਕ ਜਾਵੇ ਉਹ ਅਧੂਰੀ ਹੈ।

ਕ੍ਰਮ ਅਨੁਸਾਰ ਚੰਕ

ਹਰ ਚੰਕ ਇੱਕ chat.completion.chunk object ਹੈ:

JSON
{
  "id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
  "object": "chat.completion.chunk",
  "created": 1791625200,
  "model": "shannon-3",
  "choices": [
    {
      "index": 0,
      "delta": {
        "content": "Server-sent"
      },
      "finish_reason": null
    }
  ]
}

ਇੱਕ ਸਟ੍ਰੀਮ ਦੇ ਸਾਰੇ ਚੰਕਾਂ ਵਿੱਚ ਇੱਕੋ id, created ਅਤੇ model ਹੁੰਦੇ ਹਨ। choices ਵਿੱਚ ਹਮੇਸ਼ਾ ਇੱਕ ਐਂਟਰੀ ਹੁੰਦੀ ਹੈ। ਇਸਦੇ delta ਵਿੱਚ ਨਵਾਂ ਹਿੱਸਾ ਹੁੰਦਾ ਹੈ, ਅਤੇ finish_reason ਆਖਰੀ ਚੰਕ ਤੱਕ null ਰਹਿੰਦਾ ਹੈ।

delta ਵਿੱਚ key ਕਿਸਮ ਵੇਰਵਾ ਭੇਜਣ ਵਾਲਾ
role string ਹਮੇਸ਼ਾ assistant। ਇਹ ਸਟ੍ਰੀਮ ਦੇ ਸ਼ੁਰੂ ਵਿੱਚ ਇੱਕ ਵਾਰ ਆਉਂਦਾ ਹੈ। ਹੋਸਟ ਕੀਤੇ 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। ਸਾਰੇ ਮਾਡਲ

ਪਹਿਲਾਂ ਰੀਜ਼ਨਿੰਗ ਆਉਂਦੀ ਹੈ, ਫਿਰ ਜਵਾਬ, ਫਿਰ ਕੋਈ ਵੀ ਟੂਲ ਕਾਲ। ਚੰਕ ਨੂੰ ਸਟ੍ਰੀਮ ਵਿੱਚ ਉਸਦੀ ਥਾਂ ਤੋਂ ਨਹੀਂ, ਸਗੋਂ ਉਸਦੇ delta ਦੀਆਂ keys ਤੋਂ ਪੜ੍ਹੋ: ਇੱਕ delta ਵਿੱਚ ਟੈਕਸਟ ਦੇ ਪਹਿਲੇ ਟੁਕੜੇ ਦੇ ਨਾਲ role ਹੋ ਸਕਦਾ ਹੈ, ਅਤੇ ਆਖਰੀ ਖਾਲੀ ਹੁੰਦਾ ਹੈ।

ਇੱਕ ਪੂਰੀ ਸਟ੍ਰੀਮ ਜਿਵੇਂ ਉਹ ਸਫ਼ਰ ਕਰਦੀ ਹੈ। ਲਾਈਨਾਂ ਨੂੰ ਛੋਟਾ ਰੱਖਣ ਲਈ, ਇੱਥੇ ਹਰ ਚੰਕ ਵਿੱਚੋਂ 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 ਵਿੱਚ ਭੇਜਦਾ ਹੈ। ਦੋਵਾਂ ਟੈਕਸਟਾਂ ਨੂੰ ਵੱਖਰਾ ਰੱਖੋ: ਰੀਜ਼ਨਿੰਗ ਨੂੰ ਵੱਖਰੇ, ਸਮੇਟਣਯੋਗ ਹਿੱਸੇ ਵਜੋਂ ਦਿਖਾਓ, ਜਾਂ ਛੱਡ ਦਿਓ।

ਹੋਸਟ ਕੀਤੇ open-weight ਮਾਡਲ ਉਦੋਂ ਕੋਈ ਰੀਜ਼ਨਿੰਗ ਨਹੀਂ ਭੇਜਦੇ ਜਦੋਂ reasoning_effort off ਹੋਵੇ, ਅਤੇ ਉਦੋਂ ਵੀ ਨਹੀਂ ਜਦੋਂ ਰਿਕੁਐਸਟ ਵਿੱਚ response_format ਹੋਵੇ।

shannon-2-lite ਅਤੇ shannon-2-pro ਵੀ ਜਵਾਬ ਦੇਣ ਤੋਂ ਪਹਿਲਾਂ ਰੀਜ਼ਨਿੰਗ ਕਰਦੇ ਹਨ। ਇਸ endpoint ਉੱਤੇ ਉਹ ਇਸ ਦੌਰਾਨ : thinking ਕੁਮੈਂਟ ਲਾਈਨਾਂ ਭੇਜਦੇ ਹਨ, ਅਤੇ ਫਿਰ ਜਵਾਬ।

reasoning_content OpenAI SDK ਦੇ typed models ਵਿੱਚ ਨਹੀਂ ਹੈ। Python ਵਿੱਚ ਇਸਨੂੰ getattr(delta, "reasoning_content", None) ਨਾਲ ਪੜ੍ਹੋ; JavaScript ਵਿੱਚ delta.reasoning_content ਜਿਵੇਂ ਹੈ ਉਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ।

ਟੂਲ ਕਾਲ deltas

ਟੂਲ ਕਾਲ ਪੂਰੀ ਆਉਂਦੀ ਹੈ: ਹਰ ਕਾਲ ਲਈ ਇੱਕ ਚੰਕ, ਜਿਸਦੇ delta ਵਿੱਚ ਪੂਰੀ arguments string ਵਾਲੀ ਕਾਲ ਹੁੰਦੀ ਹੈ। index ਜਵਾਬ ਦੀਆਂ ਕਾਲਾਂ ਨੂੰ 0 ਤੋਂ ਗਿਣਦਾ ਹੈ। ਜੋ ਕੋਡ arguments ਨੂੰ ਟੁਕੜਾ-ਟੁਕੜਾ ਜੋੜਦਾ ਹੈ, ਉਹ ਬਿਨਾਂ ਬਦਲੇ ਕੰਮ ਕਰਦਾ ਹੈ, ਕਿਉਂਕਿ ਉਹ ਇੱਕ ਹੀ ਟੁਕੜਾ ਜੋੜਦਾ ਹੈ।

delta
{
  "tool_calls": [
    {
      "index": 0,
      "id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
      "type": "function",
      "function": {
        "name": "get_weather",
        "arguments": "{\"city\":\"Paris\"}"
      }
    }
  ]
}

ਕਾਲਾਂ ਤੋਂ ਬਾਅਦ, ਆਖਰੀ ਚੰਕ ਵਿੱਚ finish_reason tool_calls ਹੁੰਦਾ ਹੈ।

ਜਦੋਂ ਰਿਕੁਐਸਟ ਵਿੱਚ tools ਹੋਣ, ਤਾਂ shannon-1.6-lite, shannon-1.6-pro ਅਤੇ shannon-coder-1 ਜਵਾਬ ਦਾ ਟੈਕਸਟ ਜਵਾਬ ਦੇ ਅੰਤ ਵਿੱਚ ਇੱਕ ਹੀ delta ਵਜੋਂ ਭੇਜਦੇ ਹਨ।

ਆਖਰੀ ਚੰਕ

data: [DONE] ਤੋਂ ਪਹਿਲਾਂ ਦੇ ਆਖਰੀ ਚੰਕ ਵਿੱਚ ਖਾਲੀ delta, finish_reason ਅਤੇ ਰਿਕੁਐਸਟ ਦਾ usage ਹੁੰਦਾ ਹੈ, ਸਭ ਇੱਕੋ ਚੰਕ ਵਿੱਚ। ਹਰ ਸਟ੍ਰੀਮ ਵਿੱਚ ਇਹ ਹੁੰਦਾ ਹੈ; ਤੁਹਾਨੂੰ 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 ਹੋਵੇ ਅਤੇ ਜਿਸਦੀ ਖੋਜ ਨੂੰ ਕੁਝ ਮਿਲਿਆ ਹੋਵੇ, ਉਸ ਤੋਂ ਬਾਅਦ ਆਖਰੀ ਚੰਕ ਵਿੱਚ sources ਵੀ ਹੁੰਦਾ ਹੈ, ਅਤੇ ਉਸ ਤੋਂ ਇੱਕ ਚੰਕ ਪਹਿਲਾਂ ਵਾਲੇ ਚੰਕ ਵਿੱਚ ਹਵਾਲੇ ਦੇ ਚਿੰਨ੍ਹ delta.annotations ਵਜੋਂ ਹੁੰਦੇ ਹਨ। ਵੈੱਬ ਖੋਜ

finish_reason ਵੇਰਵਾ ਭੇਜਣ ਵਾਲਾ
stop ਮਾਡਲ ਨੇ ਆਪਣਾ ਜਵਾਬ ਪੂਰਾ ਕੀਤਾ, ਜਾਂ ਇੱਕ stop string ਆ ਗਈ। ਸਾਰੇ ਮਾਡਲ
tool_calls ਜਵਾਬ ਵਿੱਚ ਇੱਕ ਜਾਂ ਵੱਧ ਟੂਲ ਕਾਲਾਂ ਹਨ। ਸਾਰੇ ਮਾਡਲ
length ਜਵਾਬ ਆਉਟਪੁੱਟ ਸੀਮਾ ਉੱਤੇ ਕੱਟ ਦਿੱਤਾ ਗਿਆ। Shannon 3 ਪਰਿਵਾਰ, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1

usage ਦੇ ਫੀਲਡ endpoint ਦੇ ਨਾਲ ਦੱਸੇ ਗਏ ਹਨ। Chat Completions

Keep-alive ਲਾਈਨਾਂ

ਜਦੋਂ ਮਾਡਲ ਕੰਮ ਕਰ ਰਿਹਾ ਹੋਵੇ ਅਤੇ ਅਜੇ ਭੇਜਣ ਲਈ ਕੁਝ ਨਾ ਹੋਵੇ, ਤਾਂ ਸਟ੍ਰੀਮ ਕੁਮੈਂਟ ਲਾਈਨਾਂ ਭੇਜਦੀ ਹੈ। ਇਨ੍ਹਾਂ ਵਿੱਚ ਕੋਈ ਡੇਟਾ ਨਹੀਂ ਹੁੰਦਾ। SSE parser ਇਨ੍ਹਾਂ ਨੂੰ ਆਪਣੇ ਆਪ ਛੱਡ ਦਿੰਦਾ ਹੈ; ਜੋ ਕੋਡ raw ਲਾਈਨਾਂ ਪੜ੍ਹਦਾ ਹੈ, ਉਸਨੂੰ ਕੋਲਨ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀ ਹਰ ਲਾਈਨ ਛੱਡਣੀ ਚਾਹੀਦੀ ਹੈ।

ਲਾਈਨ ਭੇਜਣ ਵਾਲਾ ਕਦੋਂ
: 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 ਜਦੋਂ ਮਾਡਲ ਰੀਜ਼ਨਿੰਗ ਕਰਦਾ ਹੈ।

ਸਟ੍ਰੀਮ ਦੇ ਅੰਦਰ ਗਲਤੀਆਂ

ਸਟ੍ਰੀਮ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਬਾਅਦ ਉਸਦਾ ਸਟੇਟਸ 200 ਹੁੰਦਾ ਹੈ, ਇਸ ਲਈ ਅਸਫਲਤਾ ਸਟ੍ਰੀਮ ਦੇ ਅੰਦਰ ਆਉਂਦੀ ਹੈ: ਇੱਕ ਚੰਕ ਜਿਸ ਵਿੱਚ choices ਦੀ ਥਾਂ error ਮੈਂਬਰ ਹੁੰਦਾ ਹੈ।

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]

ਗਲਤੀ ਵਾਲੇ ਚੰਕ ਤੋਂ ਬਾਅਦ ਵੀ finish_reason ਅਤੇ usage ਵਾਲਾ ਆਖਰੀ ਚੰਕ ਅਤੇ data: [DONE] ਆਉਂਦੇ ਹਨ। ਹਰ ਚੰਕ ਵਿੱਚ 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 ਨਾਲ ਭੇਜਦੇ ਹਨ।

OpenAI Python ਅਤੇ JavaScript SDK ਗਲਤੀ ਵਾਲੇ ਚੰਕ ਨੂੰ ਤੁਹਾਡੇ iterate ਕਰਨ ਦੌਰਾਨ API ਗਲਤੀ ਵਜੋਂ raise ਕਰਦੇ ਹਨ, ਇਸ ਲਈ ਲੂਪ ਨੂੰ ਆਪਣੀ ਆਮ ਗਲਤੀ ਸੰਭਾਲ ਵਿੱਚ ਲਪੇਟੋ।

ਸਟੇਟਸ ਕੋਡਾਂ, ਗਲਤੀ ਦੀ ਬਾਡੀ ਅਤੇ ਕੀ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨਾ ਹੈ, ਇਸਦਾ ਆਪਣਾ ਪੰਨਾ ਹੈ। ਗਲਤੀਆਂ

ਕਨੈਕਸ਼ਨ ਬੰਦ ਕਰਨਾ

ਕਨੈਕਸ਼ਨ ਬੰਦ ਕਰਨ ਨਾਲ ਡਿਲੀਵਰੀ ਰੁਕਦੀ ਹੈ, ਰਿਕੁਐਸਟ ਨਹੀਂ। ਮਾਡਲ ਜਵਾਬ ਨੂੰ ਅੰਤ ਤੱਕ ਲਿਖਦਾ ਹੈ ਅਤੇ ਰਿਕੁਐਸਟ ਦਾ ਖਰਚ ਇਸ ਤਰ੍ਹਾਂ ਲਗਦਾ ਹੈ ਜਿਵੇਂ ਤੁਸੀਂ ਸਾਰਾ ਪੜ੍ਹ ਲਿਆ ਹੋਵੇ। ਘੱਟ ਖਰਚ ਲਈ ਘੱਟ ਮੰਗੋ: ਜੋ ਮਾਡਲ ਇਸਨੂੰ ਲਾਗੂ ਕਰਦਾ ਹੈ, ਉਸ ਉੱਤੇ ਘੱਟ max_tokens ਸੈੱਟ ਕਰੋ।

ਸਟ੍ਰੀਮ ਤੁਹਾਡੇ ਤੱਕ ਪਹੁੰਚਦੇ ਸਮੇਂ ਰਸਤੇ ਵਿੱਚ ਵੀ ਜਲਦੀ ਖਤਮ ਹੋ ਸਕਦੀ ਹੈ, ਉਦਾਹਰਨ ਲਈ ਨੈੱਟਵਰਕ ਟੁੱਟਣ ਉੱਤੇ ਜਾਂ ਜਦੋਂ ਸਰਵਰ ਅੱਪਡੇਟ ਹੋ ਰਿਹਾ ਹੋਵੇ। ਤਦ ਇਹ ਆਖਰੀ ਚੰਕ ਅਤੇ data: [DONE] ਤੋਂ ਬਿਨਾਂ ਰੁਕ ਜਾਂਦੀ ਹੈ। ਅਜਿਹੇ ਜਵਾਬ ਨੂੰ ਅਧੂਰਾ ਮੰਨੋ ਅਤੇ ਰਿਕੁਐਸਟ ਦੁਬਾਰਾ ਭੇਜੋ।

SDK ਤੋਂ ਬਿਨਾਂ ਸਟ੍ਰੀਮ ਪੜ੍ਹਨਾ

ਇੱਕ ਸਹੀ ਰੀਡਰ ਪੰਜ ਕੰਮ ਕਰਦਾ ਹੈ: ਸਟ੍ਰੀਮ ਤੋਂ ਪਹਿਲਾਂ ਆਉਣ ਵਾਲੀਆਂ ਗਲਤੀਆਂ ਨੂੰ ਆਪਣੀ ਗਲਤੀ ਸੰਭਾਲ ਵੱਲ ਭੇਜਦਾ ਹੈ, ਬਾਡੀ ਨੂੰ ਲਾਈਨਾਂ ਵਿੱਚ ਵੰਡਦਾ ਹੈ, ਕੁਮੈਂਟ ਲਾਈਨਾਂ ਛੱਡਦਾ ਹੈ, data: [DONE] ਉੱਤੇ ਰੁਕਦਾ ਹੈ, ਅਤੇ ਹਰ ਚੰਕ ਵਿੱਚ 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 ਜਾਂ ਨਵੇਂ ਉੱਤੇ ਚੱਲਦਾ ਹੈ।

ਹੋਰ ਫਾਰਮੈਟਾਂ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ

Responses ਅਤੇ Messages endpoints ਵੀ ਸਟ੍ਰੀਮ ਕਰਦੇ ਹਨ। ਉਨ੍ਹਾਂ ਦੇ ਫਰੇਮਾਂ ਵਿੱਚ ਇਵੈਂਟ ਦੇ ਨਾਮ ਵਾਲੀ event: ਲਾਈਨ ਅਤੇ ਉਸਦੇ JSON ਵਾਲੀ data: ਲਾਈਨ ਹੁੰਦੀ ਹੈ। ਹਰ ਪੰਨਾ ਆਪਣੇ ਇਵੈਂਟ ਕ੍ਰਮ ਅਨੁਸਾਰ ਦਿੰਦਾ ਹੈ।

ਸਟ੍ਰੀਮ ਵਿੱਚ Chat CompletionsResponsesMessages
ਫਰੇਮ data: ਲਾਈਨਾਂevent: ਅਤੇ data: ਲਾਈਨਾਂevent: ਅਤੇ data: ਲਾਈਨਾਂ
ਰੀਜ਼ਨਿੰਗ ਇੱਥੇ ਆਉਂਦੀ ਹੈ delta.reasoning_contentresponse.reasoning_summary_text.deltathinking_delta
ਜਵਾਬ ਦਾ ਟੈਕਸਟ ਇੱਥੇ ਆਉਂਦਾ ਹੈ delta.contentresponse.output_text.deltatext_delta
Usage ਇੱਥੇ ਆਉਂਦਾ ਹੈ ਆਖਰੀ ਚੰਕresponse.completedmessage_delta
ਸਟ੍ਰੀਮ ਇਸ ਨਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ ਆਖਰੀ ਚੰਕ, ਫਿਰ data: [DONE]response.completedmessage_stop