رفتن به محتوا
سارویتوسعه‌دهندگان
مستندات/مدل‌ها و پاسخ‌ها

پاسخ زنده با 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 را از سرور خودتان به مرورگر منتقل کنید؛ کلید ساروی را برای اتصال مستقیم مرورگر نفرستید.

Python
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 · تاریخچهٔ تغییرات