هویدای

استریم پاسخ

دریافت پاسخ قطعه‌به‌قطعه.

زمان مطالعه: ۱ دقیقه

چطور کار می‌کند

با stream: true پاسخ به‌صورت text/event-stream (رویدادهای ارسالی از سرور، SSE) می‌رسد. هر خط data: یک شیء JSON از نوع chat.completion.chunk دارد که choices[0].delta.content در آن تکهٔ بعدی متن است و استریم با خط data: [DONE] تمام می‌شود. خط‌ها با یک سطر خالی از هم جدا می‌شوند؛ پس بدنهٔ پاسخ را خط‌به‌خط بخوانید، خط ناتمام را در یک بافر نگه دارید و خط‌هایی را که با data: شروع نمی‌شوند نادیده بگیرید.

import jsonimport os import requests payload = {    "model": "MODEL_ID",    "messages": [{"role": "user", "content": "Write a two-line poem."}],    "stream": True,    "stream_options": {"include_usage": True},}with requests.post(    "https://api.hoveydai.ir/v1/chat/completions",    headers={"Authorization": f"Bearer {os.environ['HOVEYDAI_API_KEY']}"},    json=payload,    stream=True,    timeout=120,) as reply:    reply.raise_for_status()    for line in reply.iter_lines(decode_unicode=True):        if not line.startswith("data: "):            continue        data = line[len("data: "):]        if data == "[DONE]":            break        chunk = json.loads(data)        if "error" in chunk:            raise RuntimeError(chunk["error"]["message"])        if chunk["choices"]:            print(chunk["choices"][0]["delta"].get("content") or "", end="")

با include_usage آخرین قطعه پیش از [DONE] مقدار usage را دارد و choices آن خالی است؛ کد بالا همین را در نظر می‌گیرد. بدون این گزینه، مصرف در استریم فرستاده نمی‌شود.

خطا در میان استریم

  • خطاهای پیش از اولین قطعه (کلید، مدل، اعتبار) مثل یک درخواست عادی با کد وضعیت خطا و بدنهٔ JSON می‌رسند که در صفحهٔ خطاها آمده است.
  • خطای بعد از اولین قطعه دیگر نمی‌تواند وضعیت 200 را عوض کند؛ به‌شکل رویداد data: {"error": {...}} می‌رسد و استریم بدون [DONE] تمام می‌شود. متنی را که تا آن لحظه گرفته‌اید نگه دارید و تصمیم بگیرید درخواست را دوباره بفرستید یا نه.
  • اگر ارتباط بدون رویداد خطا قطع شد، پاسخ را ناتمام بدانید: فقط data: [DONE] نشان می‌دهد استریم کامل بوده است.
در مرورگر

کلید را هرگز در کد مرورگر نگذارید. درخواست را از سرور خودتان بفرستید و قطعه‌ها را به مرورگر برسانید.

این صفحه کمکتان نکرد؟ به ما بگویید.