ตั้งค่า stream: true เพื่อรับคำตอบทีละส่วนตามที่ผู้ให้บริการสร้างขึ้น
stream = client.chat.completions.create(
model="openai/gpt-oss-20b",
messages=[{"role": "user", "content": "Write a haiku."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")รูปแบบบนสายส่ง#
ใช้ Server-sent events (text/event-stream) แต่ละ event เป็นบรรทัด data: ที่มี JSON frame ชนิด chat.completion.chunk ของ OpenAI ระบบส่งต่อ ทีละส่วน เมื่อ chunk จากผู้ให้บริการมาถึง ไม่ได้รวมไว้ส่งก้อนเดียวตอนจบ มีสองฟิลด์ที่เขียนใหม่ในทุก frame:
idคือ AI Grid invocation id (ค่าเดียวกับ response headerX-AIGrid-Invocation)modelคือ product id ของ Grid ไม่ใช่ชื่อภายในของผู้ให้บริการ
สตรีมจบด้วย terminal chunk ที่มีบล็อก usage แล้วตามด้วย:
data: [DONE]เป็น semantics มาตรฐานของ OpenAI ดังนั้น OpenAI-compatible client ใช้งานได้โดยไม่ต้องเปลี่ยน
ข้อผิดพลาดระหว่างสตรีม#
ความล้มเหลวหลังเปิดสตรีมมาเป็น data: frame ไม่ใช่สถานะ HTTP:
data: {"error": {"code": "provider_failed", "message": "…"}, "id": "<invocation id>"}id ใน frame คือ invocation id ดังนั้นแม้คำตอบที่ถูกตัดก็ยังตรวจสอบเทียบกับ usage record ได้
การตัดการเชื่อมต่อและการคิดเงิน#
ระบบตัดบัญชีหลังสตรีมจบใน context ที่แยกจากผู้เรียก หาก client ตัดการเชื่อมต่อระหว่างคำตอบ เซิร์ฟเวอร์ยังคงอ่านข้อมูลจากผู้ให้บริการ บันทึกการใช้งาน และตัดบัญชีต่อไป การตัดการเชื่อมต่อจึงไม่ทำให้ยอดที่กันไว้ค้างหรือค่าบริการสูญหาย สตรีมที่จบโดยไม่มี usage block (ผู้ให้บริการหยุดกลางคำตอบ) จะคง reservation เป็น Reconciling ให้ผู้ปฏิบัติงานตรวจสอบ เช่นเดียวกับเส้นทางที่ไม่สตรีม
การเรียกแบบสตรีมถูกวัดปริมาณเช่นเดียวกับการเรียกที่รอคำตอบครบ: ระบบกันยอดประมาณการแบบระมัดระวังตอนรับคำขอ แล้วตัดบัญชีตามจำนวน token จริงจาก usage block สุดท้าย และปล่อยส่วนต่าง การสตรีมเปลี่ยนวิธีส่งคำตอบ ไม่เปลี่ยนราคา
ขั้นตอนถัดไป#
- การเติมข้อความในแชต — รูปแบบคำขอทั้งหมด
- การใช้งานและการวัดปริมาณ — วิธีคิดค่าบริการของการเรียก