پاسخ زنده با SSE
متن را هنگام تولید نمایش دهید و پایان واقعی جریان را تشخیص دهید.
فعال کردن جریان
در بدنهٔ /v1/responses مقدار stream را true کنید. پاسخ از نوع text/event-stream است. هر رویداد با یک خط خالی جدا میشود. خواندن داده بر اساس یک تکهٔ شبکه اشتباه است؛ مرز رویداد و مرز دریافت داده الزاماً یکی نیستند.
رویدادها
| رویداد | معنی |
|---|---|
| response.created | درخواست پذیرفته شد و شناسه مشخص است |
| response.output_text.delta | بخش بعدی متن در delta |
| response.tool | وضعیت یک ابزار داخلی در صورت اجرا |
| response.completed | پاسخ نهایی و usage در response |
| response.failed | خطا پس از شروع جریان |
HTTP 200 فقط یعنی جریان شروع شده است. موفقیت مدل زمانی مشخص است که response.completed دریافت شود. قطع شدن اتصال پیش از رویداد پایان را کاملشده نمایش ندهید.
نمایش و ذخیره
deltaها را با حفظ ترتیب به متن اضافه کنید. کدگذاری UTF-8 را بهصورت جریانی بخوانید تا حروف فارسی در مرز بستهها خراب نشوند. پیامهای keep-alive که با : شروع میشوند دادهٔ پاسخ نیستند. متن نهایی رویداد completed را برای ذخیرهٔ نتیجه استفاده کنید.
قطع اتصال و هزینه
خروجیای که تا لحظهٔ قطع واقعاً مصرف شده ممکن است قابل محاسبه باشد. توقف نمایش در مرورگر به معنی بازپرداخت کامل نیست. اگر قطع اتصال رخ داد، شناسهٔ درخواست را نگه دارید و گزارش آن را بخوانید. ارسال دوباره با یک کلید idempotency تازه یک کار جدید محسوب میشود.
تنظیم سرور شما
پروکسی برنامه باید buffering جریان را خاموش کند و مهلت مناسبی برای پاسخ مدل داشته باشد. SSE را از سرور خودتان به مرورگر منتقل کنید؛ کلید ساروی را برای اتصال مستقیم مرورگر نفرستید.
import json, os, urllib.request, urllib.error
payload = {
"model": "z-ai/glm-5.3-flash",
"input": "سلام! در یک جمله خودت را معرفی کن.",
"max_output_tokens": 512,
"stream": True
}
request = urllib.request.Request(
"https://api.sarovi.ir/v1/responses",
data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
headers={
"Authorization": "Bearer " + os.environ["SAROVI_API_KEY"],
"Content-Type": "application/json"
},
method="POST"
)
try:
with urllib.request.urlopen(request, timeout=300) as response:
for line in response:
print(line.decode("utf-8").rstrip())
except urllib.error.HTTPError as error:
detail = json.load(error)
raise RuntimeError(f"{error.code}: {detail['error'].get('code', detail['error'].get('type', 'HTTP_ERROR'))}") from errorکلید را در متغیر محیطی SAROVI_API_KEY قرار بده. بدون نصب کتابخانه؛ با Python استاندارد.
قرارداد API 1.6.0 · تاریخچهٔ تغییرات