ಸ್ಟ್ರೀಮಿಂಗ್
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}") import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const stream = await client.chat.completions.create({
model: "shannon-3",
messages: [{ role: "user", content: "Explain server-sent events in three sentences." }],
stream: true,
});
let answer = "";
let reasoning = "";
const toolCalls = [];
let finishReason = null;
let usage = null;
try {
for await (const chunk of stream) {
if (chunk.usage) usage = chunk.usage;
const choice = chunk.choices?.[0];
if (!choice) continue;
const delta = choice.delta;
if (delta.reasoning_content) reasoning += delta.reasoning_content;
if (delta.content) {
answer += delta.content;
process.stdout.write(delta.content);
}
for (const call of delta.tool_calls ?? []) {
toolCalls.push({ id: call.id, name: call.function.name, arguments: call.function.arguments });
}
if (choice.finish_reason) finishReason = choice.finish_reason;
}
} catch (error) {
// A failure after the stream started arrives as an error chunk.
console.error("\nstream failed:", error.message);
}
console.log("\n", finishReason, usage); curl -N https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [{"role": "user", "content": "Explain server-sent events in three sentences."}],
"stream": true
}' 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 ಆಬ್ಜೆಕ್ಟ್:
{
"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 ಅನ್ನು ಬಿಡಲಾಗಿದೆ.
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 ಅನ್ನು ತುಣುಕು ತುಣುಕಾಗಿ ಜೋಡಿಸುವ ಕೋಡ್ ಬದಲಾವಣೆ ಇಲ್ಲದೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ, ಏಕೆಂದರೆ ಅದು ಒಂದೇ ತುಣುಕನ್ನು ಜೋಡಿಸುತ್ತದೆ.
{
"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 ಬೇಕಿಲ್ಲ.
{
"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.
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)) const response = await fetch("https://api.shannon-ai.com/v1/chat/completions", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "shannon-3",
messages: [{ role: "user", content: "Explain server-sent events in three sentences." }],
stream: true,
}),
});
// 1. Errors before the stream are plain JSON with their own status.
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const decoder = new TextDecoder();
let buffer = "";
let answer = "";
let done = false;
read: for await (const bytes of response.body) {
buffer += decoder.decode(bytes, { stream: true });
const lines = buffer.split("\n"); // 2. one line at a time
buffer = lines.pop(); // keep the unfinished line
for (const line of lines) {
if (!line.startsWith("data: ")) continue; // 3. empty lines and ": ping" comments
const data = line.slice(6);
if (data === "[DONE]") { // 4. the end of the stream
done = true;
break read;
}
const chunk = JSON.parse(data);
if (chunk.error) throw new Error(chunk.error.message); // 5. a failure inside the stream
const choice = chunk.choices[0];
if (choice.delta.content) answer += choice.delta.content;
if (chunk.usage) console.log(choice.finish_reason, chunk.usage);
}
}
if (!done) throw new Error("the stream ended before [DONE]");
console.log(answer); Python ಮಾದರಿ requests ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. JavaScript ಮಾದರಿ Node.js 18 ಅಥವಾ ನಂತರದ ಆವೃತ್ತಿಯಲ್ಲಿ ಚಲಿಸುತ್ತದೆ.
ಇತರ ಫಾರ್ಮ್ಯಾಟ್ಗಳ streams
Responses ಮತ್ತು Messages ಎಂಡ್ಪಾಯಿಂಟ್ಗಳೂ stream ಮಾಡುತ್ತವೆ. ಅವುಗಳ ಫ್ರೇಮ್ಗಳು ಈವೆಂಟ್ನ ಹೆಸರಿರುವ event: ಸಾಲು ಮತ್ತು ಅದರ JSON ಇರುವ data: ಸಾಲನ್ನು ಹೊತ್ತಿರುತ್ತವೆ. ಪ್ರತಿ ಪುಟ ತನ್ನ ಈವೆಂಟ್ಗಳನ್ನು ಕ್ರಮದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡುತ್ತದೆ.
| stream ನಲ್ಲಿ | Chat Completions | Responses | Messages |
|---|---|---|---|
| ಫ್ರೇಮ್ಗಳು | data: ಸಾಲುಗಳು | event: ಮತ್ತು data: ಸಾಲುಗಳು | event: ಮತ್ತು data: ಸಾಲುಗಳು |
| ರೀಸನಿಂಗ್ ಇದರಲ್ಲಿ ಬರುತ್ತದೆ | delta.reasoning_content | response.reasoning_summary_text.delta | thinking_delta |
| ಉತ್ತರ ಪಠ್ಯ ಇದರಲ್ಲಿ ಬರುತ್ತದೆ | delta.content | response.output_text.delta | text_delta |
| Usage ಇದರಲ್ಲಿ ಬರುತ್ತದೆ | ಕೊನೆಯ chunk | response.completed | message_delta |
| stream ಇದರೊಂದಿಗೆ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ | ಕೊನೆಯ chunk, ನಂತರ data: [DONE] | response.completed | message_stop |