معمولی

گرفتن جواب به‌صورت استریم (streaming)

چطور با stream: true جواب رو تکه‌تکه و زنده بگیری، به‌جای این‌که منتظر کل completion بمونی.

اگه جواب بنفش رو الان فقط یه‌جا، بعد از تموم‌شدن کامل completion می‌گیری و می‌خوای به‌جاش تکه‌تکه و زنده نمایشش بدی (مثل تایپ‌شدن آنی تو یه chat UI یا CLI) — این مقاله برای توئه. تا آخرش، درخواستت رو با stream: true می‌فرستی و از رشته‌ی SSE که برمی‌گرده جواب رو می‌خونی.

چرا استریم

بدون استریم، کاربر باید صبر کنه تا کل جواب آماده بشه و بعد یهو کل متن ظاهر بشه. با استریم، توکن‌ها همون‌جوری که مدل تولیدشون می‌کنه می‌رسن — تاخیر محسوس‌شده کمتره، حتی اگه زمان کل یکی باشه.

چطور فعالش کنی

فقط stream: true رو به بدنه‌ی درخواست اضافه کن — همون endpoint سازگار با OpenAI (api-quickstart)، پارامتر یا مسیر جداگونه‌ای نداره:

bash
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: شروع می‌شه و یه تکه‌ی کوچیک از جواب رو داره:

css
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 کنی:

python
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="")

چی فرق نمی‌کنه

قیمت، احراز هویت، و همه‌ی کنترل‌های مصرف (کیف پول، سقف هر کلید، سقف هر اجرا — «کنترل مصرف و هزینه») دقیقاً مثل حالت غیراستریم کار می‌کنن؛ استریم فقط شکل تحویل جواب رو عوض می‌کنه، نه هیچ‌کدوم از این‌ها.