استریم پاسخ
دریافت پاسخ قطعهبهقطعه.
چطور کار میکند
با 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]نشان میدهد استریم کامل بوده است.
در مرورگر
کلید را هرگز در کد مرورگر نگذارید. درخواست را از سرور خودتان بفرستید و قطعهها را به مرورگر برسانید.
این صفحه کمکتان نکرد؟ به ما بگویید.