ഉള്ളടക്കത്തിലേക്ക് പോകുക
സ്റ്റ്രീമിംഗ്

സ്റ്റ്രീമിംഗ്

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-ഉം content-type: text/event-stream, cache-control: no-cache ഹെഡറുകളും ഉണ്ട്.
  • ഓരോ ഇവന്റും data: എന്ന് തുടങ്ങുന്നതും തുടർന്ന് ഒരു ശൂന്യ വരി ഉള്ളതുമായ ഒരു വരിയാണ്. data: ന് ശേഷമുള്ള ടെക്സ്റ്റ് ഒരു JSON ചങ്ക് ആണ്. event: അല്ലെങ്കിൽ id: വരികളില്ല.
  • : ping പോലെ കോളനിൽ തുടങ്ങുന്ന വരി കണക്ഷൻ തുറന്നുവയ്ക്കുന്ന ഒരു കമന്റ് ആണ്. അത് ഒഴിവാക്കുക.
  • സ്ട്രീം data: [DONE] ഓടെ അവസാനിക്കുന്നു. അതില്ലാതെ നിൽക്കുന്ന സ്ട്രീം അപൂർണ്ണമാണ്.

ക്രമത്തിലുള്ള ചങ്കുകൾ

ഓരോ ചങ്കും ഒരു 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
    }
  ]
}

ഒരു സ്ട്രീമിലെ എല്ലാ ചങ്കുകളും ഒരേ id, created, model വഹിക്കുന്നു. choices-ൽ എപ്പോഴും ഒരു എൻട്രി ഉണ്ട്. അതിന്റെ delta പുതിയത് വഹിക്കുന്നു, അവസാന ചങ്ക് വരെ finish_reason null ആണ്.

ഡെൽറ്റയിലെ കീ ടൈപ്പ് വിവരണം അയയ്ക്കുന്നത്
role string എപ്പോഴും assistant. സ്ട്രീമിന്റെ തുടക്കത്തിൽ ഒരിക്കൽ എത്തുന്നു. ഹോസ്റ്റ് ചെയ്ത ഓപ്പൺ-വെയിറ്റ് മോഡലുകൾ, shannon-2-lite, shannon-2-pro
reasoning_content string മോഡലിന്റെ റീസണിംഗിന്റെ ഒരു കഷണം. കഷണങ്ങൾ ക്രമത്തിൽ ചേർക്കുക. ഹോസ്റ്റ് ചെയ്ത ഓപ്പൺ-വെയിറ്റ് മോഡലുകൾ, Shannon 3 കുടുംബം, shannon-1.6-pro, shannon-coder-1
content string ഉത്തരത്തിന്റെ ഒരു കഷണം. കഷണങ്ങൾ ക്രമത്തിൽ ചേർക്കുക. എല്ലാ മോഡലുകളും
tool_calls array ഒരു പൂർണ്ണ ടൂൾ കോൾ. ടൂൾ കോൾ ഡെൽറ്റകൾ കാണുക. എല്ലാ മോഡലുകളും

ആദ്യം റീസണിംഗ്, പിന്നെ ഉത്തരം, പിന്നെ ടൂൾ കോളുകൾ. ഒരു ചങ്ക് സ്ട്രീമിലെ അതിന്റെ സ്ഥാനം നോക്കിയല്ല, അതിന്റെ delta-യിലെ കീകൾ നോക്കി വായിക്കുക: ഒരു 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]

റീസണിംഗ് ഡെൽറ്റകൾ

റീസൺ ചെയ്യുന്ന മോഡൽ ഉത്തരത്തിന് മുമ്പ് അതിന്റെ റീസണിംഗ് delta.reasoning_content-ൽ അയയ്ക്കുന്നു. രണ്ട് ടെക്സ്റ്റുകളും വേറിട്ട് നിർത്തുക: റീസണിംഗ് മടക്കാവുന്ന പ്രത്യേക ഭാഗമായി കാണിക്കുക, അല്ലെങ്കിൽ ഒഴിവാക്കുക.

reasoning_effort off ആയിരിക്കുമ്പോഴും, റിക്വസ്റ്റിൽ response_format ഉള്ളപ്പോഴും ഹോസ്റ്റ് ചെയ്ത ഓപ്പൺ-വെയിറ്റ് മോഡലുകൾ റീസണിംഗ് അയയ്ക്കില്ല.

shannon-2-lite, shannon-2-pro എന്നിവയും ഉത്തരത്തിന് മുമ്പ് റീസൺ ചെയ്യുന്നു. ഈ എൻഡ്‌പോയിന്റിൽ അവ റീസൺ ചെയ്യുമ്പോൾ : thinking കമന്റ് വരികൾ അയയ്ക്കുന്നു, പിന്നീട് ഉത്തരവും.

reasoning_content OpenAI SDK-കളുടെ ടൈപ്പ് ചെയ്ത മോഡലുകളിൽ ഇല്ല. Python-ൽ getattr(delta, "reasoning_content", None) ഉപയോഗിച്ച് വായിക്കുക; JavaScript-ൽ delta.reasoning_content അതേപടി പ്രവർത്തിക്കും.

ടൂൾ കോൾ ഡെൽറ്റകൾ

ടൂൾ കോൾ പൂർണ്ണമായി എത്തുന്നു: ഓരോ കോളിനും ഒരു ചങ്ക്, അതിന്റെ delta-യിൽ പൂർണ്ണമായ arguments സ്ട്രിംഗുള്ള കോൾ ഉണ്ട്. 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 എന്നിവ ഉത്തര ടെക്സ്റ്റ് മറുപടിയുടെ അവസാനം ഒരൊറ്റ ഡെൽറ്റയായി അയയ്ക്കുന്നു.

അവസാന ചങ്ക്

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

ഹോസ്റ്റ് ചെയ്ത ഓപ്പൺ-വെയിറ്റ് മോഡലുകളിൽ usage-ൽ prompt_tokens_details.cached_tokens-ഉം completion_tokens_details.reasoning_tokens-ഉം ഉണ്ട്.

സെർച്ച് എന്തെങ്കിലും കണ്ടെത്തിയ, web_search: true ഉള്ള റിക്വസ്റ്റിന് ശേഷം, അവസാന ചങ്കിൽ sources-ഉം ഉണ്ടാകും, അതിന് മുമ്പുള്ള ഒരു ചങ്കിൽ ഉദ്ധരണി മാർക്കറുകൾ delta.annotations ആയും ഉണ്ടാകും. വെബ് തിരയൽ

finish_reason വിവരണം അയയ്ക്കുന്നത്
stop മോഡൽ ഉത്തരം പൂർത്തിയാക്കി, അല്ലെങ്കിൽ ഒരു stop സ്ട്രിംഗ് പ്രത്യക്ഷപ്പെട്ടു. എല്ലാ മോഡലുകളും
tool_calls മറുപടിയിൽ ഒന്നോ അതിലധികമോ ടൂൾ കോളുകൾ ഉണ്ട്. എല്ലാ മോഡലുകളും
length മറുപടി ഔട്ട്പുട്ട് പരിധിയിൽ മുറിഞ്ഞു. Shannon 3 കുടുംബം, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1

usage-ലെ ഫീൽഡുകൾ എൻഡ്‌പോയിന്റിനൊപ്പം വിവരിച്ചിട്ടുണ്ട്. Chat Completions

കീപ്-എലൈവ് വരികൾ

മോഡൽ പ്രവർത്തിക്കുകയും അയയ്ക്കാൻ ഒന്നുമില്ലാതിരിക്കുകയും ചെയ്യുമ്പോൾ, സ്ട്രീം കമന്റ് വരികൾ വഹിക്കുന്നു. അവയിൽ ഡാറ്റയില്ല. 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 മോഡൽ റീസൺ ചെയ്യുമ്പോൾ.

സ്ട്രീമിനുള്ളിലെ പിശകുകൾ

സ്ട്രീം തുടങ്ങിയാൽ അതിന്റെ സ്റ്റാറ്റസ് 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 സംഭാഷണം മോഡലിന്റെ കോൺടെക്സ്റ്റ് വിൻഡോയേക്കാൾ ദൈർഘ്യമേറിയതാണ്. വീണ്ടും അയയ്ക്കുന്നതിന് മുമ്പ് അത് ചുരുക്കുക. സന്ദേശ ടെക്സ്റ്റ് മാറാം.

ഹോസ്റ്റ് ചെയ്ത ഓപ്പൺ-വെയിറ്റ് മോഡലുകൾ type-ഉം message-ഉം മാത്രമുള്ള error അംഗം അയയ്ക്കുന്നു.

OpenAI Python, JavaScript SDK-കൾ നിങ്ങൾ ഇറ്ററേറ്റ് ചെയ്യുമ്പോൾ എറർ ചങ്കിനെ API എററായി ഉയർത്തുന്നു, അതിനാൽ ലൂപ്പ് നിങ്ങളുടെ പതിവ് എറർ ഹാൻഡ്‌ലിംഗിൽ പൊതിയുക.

സ്റ്റാറ്റസ് കോഡുകൾ, എറർ ബോഡി, എന്ത് വീണ്ടും ശ്രമിക്കണം എന്നിവയ്ക്ക് സ്വന്തം പേജ് ഉണ്ട്. എറർ ഹാൻഡ്ലിംഗ്

കണക്ഷൻ അടയ്ക്കൽ

കണക്ഷൻ അടയ്ക്കുന്നത് ഡെലിവറി നിർത്തുന്നു, റിക്വസ്റ്റ് നിർത്തുന്നില്ല. മോഡൽ മറുപടി അവസാനം വരെ എഴുതുന്നു, നിങ്ങൾ മുഴുവൻ വായിച്ചതുപോലെ റിക്വസ്റ്റിന് ചാർജ് ഈടാക്കും. കുറച്ച് പണം നൽകാൻ, കുറച്ച് ആവശ്യപ്പെടുക: അത് പ്രയോഗിക്കുന്ന മോഡലിൽ കുറഞ്ഞ 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 എൻഡ്‌പോയിന്റുകളും സ്ട്രീം ചെയ്യുന്നു. അവയുടെ ഫ്രെയിമുകളിൽ ഇവന്റിന്റെ പേരുള്ള 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