گرفتن جواب بهصورت استریم (streaming)
چطور با stream: true جواب رو تکهتکه و زنده بگیری، بهجای اینکه منتظر کل completion بمونی.
اگه جواب بنفش رو الان فقط یهجا، بعد از تمومشدن کامل completion میگیری و میخوای بهجاش تکهتکه و
زنده نمایشش بدی (مثل تایپشدن آنی تو یه chat UI یا CLI) — این مقاله برای توئه. تا آخرش، درخواستت رو با
stream: true میفرستی و از رشتهی SSE که برمیگرده جواب رو میخونی.
چرا استریم
بدون استریم، کاربر باید صبر کنه تا کل جواب آماده بشه و بعد یهو کل متن ظاهر بشه. با استریم، توکنها همونجوری که مدل تولیدشون میکنه میرسن — تاخیر محسوسشده کمتره، حتی اگه زمان کل یکی باشه.
چطور فعالش کنی
فقط stream: true رو به بدنهی درخواست اضافه کن — همون endpoint سازگار با OpenAI (api-quickstart)،
پارامتر یا مسیر جداگونهای نداره:
curl YOUR_SERVICE_URL/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "YOUR_MODEL_ID",
"stream": true,
"messages": [{ "role": "user", "content": "یه شعر کوتاه بگو" }]
}'
جواب چه شکلیه
بهجای یه JSON کامل، یه رشتهی event-stream (SSE) میگیری — هر خط با data: شروع میشه و یه تکهی
کوچیک از جواب رو داره:
data: {"choices":[{"delta":{"content":"سلام"}}]}
data: {"choices":[{"delta":{"content":" دنیا"}}]}
data: [DONE]
هر تکه رو از choices[0].delta.content بردار و بچسبون به آخر چیزی که تا الان جمع کردی. رسیدن به خط
data: [DONE] یعنی جواب تموم شده — بعدش دیگه چیزی نمیرسه.
تو SDK رسمی
SDKهای رسمی OpenAI (پایتون، Node) پارسکردن SSE رو خودشون انجام میدن — کافیه موقع صداکردن
chat.completions.create همون stream: true رو بدی و روی نتیجه iterate کنی:
stream = client.chat.completions.create(
model="YOUR_MODEL_ID",
stream=True,
messages=[{"role": "user", "content": "یه شعر کوتاه بگو"}],
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="")
چی فرق نمیکنه
قیمت، احراز هویت، و همهی کنترلهای مصرف (کیف پول، سقف هر کلید، سقف هر اجرا — «کنترل مصرف و هزینه») دقیقاً مثل حالت غیراستریم کار میکنن؛ استریم فقط شکل تحویل جواب رو عوض میکنه، نه هیچکدوم از اینها.