ਸਟ੍ਰੀਮਿੰਗ
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}") 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
}' ਸਟ੍ਰੀਮ ਦੀ ਫਰੇਮਿੰਗ ਕਿਵੇਂ ਹੁੰਦੀ ਹੈ
- ਜਵਾਬ ਦਾ ਸਟੇਟਸ
200ਹੁੰਦਾ ਹੈ ਅਤੇ headerscontent-type: text/event-streamਅਤੇcache-control: no-cacheਹੁੰਦੇ ਹਨ। - ਹਰ ਇਵੈਂਟ ਇੱਕ ਲਾਈਨ ਹੈ ਜੋ
data:ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ ਅਤੇ ਉਸ ਤੋਂ ਬਾਅਦ ਇੱਕ ਖਾਲੀ ਲਾਈਨ ਆਉਂਦੀ ਹੈ।data:ਤੋਂ ਬਾਅਦ ਦਾ ਟੈਕਸਟ ਇੱਕ JSON ਚੰਕ ਹੈ। ਇੱਥੇ ਕੋਈevent:ਜਾਂid:ਲਾਈਨ ਨਹੀਂ ਹੁੰਦੀ। - ਕੋਲਨ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀ ਲਾਈਨ, ਜਿਵੇਂ
: ping, ਇੱਕ ਕੁਮੈਂਟ ਹੈ ਜੋ ਕਨੈਕਸ਼ਨ ਨੂੰ ਖੁੱਲ੍ਹਾ ਰੱਖਦੀ ਹੈ। ਇਸਨੂੰ ਛੱਡ ਦਿਓ। - ਸਟ੍ਰੀਮ
data: [DONE]ਨਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ। ਜੋ ਸਟ੍ਰੀਮ ਇਸ ਤੋਂ ਬਿਨਾਂ ਰੁਕ ਜਾਵੇ ਉਹ ਅਧੂਰੀ ਹੈ।
ਕ੍ਰਮ ਅਨੁਸਾਰ ਚੰਕ
ਹਰ ਚੰਕ ਇੱਕ chat.completion.chunk object ਹੈ:
{
"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 ਛੱਡ ਦਿੱਤੇ ਗਏ ਹਨ।
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 ਨੂੰ ਟੁਕੜਾ-ਟੁਕੜਾ ਜੋੜਦਾ ਹੈ, ਉਹ ਬਿਨਾਂ ਬਦਲੇ ਕੰਮ ਕਰਦਾ ਹੈ, ਕਿਉਂਕਿ ਉਹ ਇੱਕ ਹੀ ਟੁਕੜਾ ਜੋੜਦਾ ਹੈ।
{
"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 ਦੀ ਲੋੜ ਨਹੀਂ।
{
"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 ਮੈਂਬਰ ਹੁੰਦਾ ਹੈ।
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)) 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 ਜਾਂ ਨਵੇਂ ਉੱਤੇ ਚੱਲਦਾ ਹੈ।
ਹੋਰ ਫਾਰਮੈਟਾਂ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ
Responses ਅਤੇ Messages endpoints ਵੀ ਸਟ੍ਰੀਮ ਕਰਦੇ ਹਨ। ਉਨ੍ਹਾਂ ਦੇ ਫਰੇਮਾਂ ਵਿੱਚ ਇਵੈਂਟ ਦੇ ਨਾਮ ਵਾਲੀ event: ਲਾਈਨ ਅਤੇ ਉਸਦੇ JSON ਵਾਲੀ data: ਲਾਈਨ ਹੁੰਦੀ ਹੈ। ਹਰ ਪੰਨਾ ਆਪਣੇ ਇਵੈਂਟ ਕ੍ਰਮ ਅਨੁਸਾਰ ਦਿੰਦਾ ਹੈ।
| ਸਟ੍ਰੀਮ ਵਿੱਚ | 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 ਇੱਥੇ ਆਉਂਦਾ ਹੈ | ਆਖਰੀ ਚੰਕ | response.completed | message_delta |
| ਸਟ੍ਰੀਮ ਇਸ ਨਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ | ਆਖਰੀ ਚੰਕ, ਫਿਰ data: [DONE] | response.completed | message_stop |