AI Gridเอกสาร
สมัครใช้งาน

การสตรีม

Server-sent events ที่ส่งเพิ่มทีละส่วน และตัวจบที่บอกว่าคำตอบสมบูรณ์

อัปเดต 9 ก.ย. 2026

ตั้งค่า stream: true เพื่อรับคำตอบทีละส่วนตามที่ผู้ให้บริการสร้างขึ้น

stream.py
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 header X-AIGrid-Invocation)
  • model คือ product id ของ Grid ไม่ใช่ชื่อภายในของผู้ให้บริการ

สตรีมจบด้วย terminal chunk ที่มีบล็อก usage แล้วตามด้วย:

text
data: [DONE]

เป็น semantics มาตรฐานของ OpenAI ดังนั้น OpenAI-compatible client ใช้งานได้โดยไม่ต้องเปลี่ยน

ข้อผิดพลาดระหว่างสตรีม#

ความล้มเหลวหลังเปิดสตรีมมาเป็น data: frame ไม่ใช่สถานะ HTTP:

json
data: {"error": {"code": "provider_failed", "message": "…"}, "id": "<invocation id>"}

id ใน frame คือ invocation id ดังนั้นแม้คำตอบที่ถูกตัดก็ยังตรวจสอบเทียบกับ usage record ได้

การตัดการเชื่อมต่อและการคิดเงิน#

ระบบตัดบัญชีหลังสตรีมจบใน context ที่แยกจากผู้เรียก หาก client ตัดการเชื่อมต่อระหว่างคำตอบ เซิร์ฟเวอร์ยังคงอ่านข้อมูลจากผู้ให้บริการ บันทึกการใช้งาน และตัดบัญชีต่อไป การตัดการเชื่อมต่อจึงไม่ทำให้ยอดที่กันไว้ค้างหรือค่าบริการสูญหาย สตรีมที่จบโดยไม่มี usage block (ผู้ให้บริการหยุดกลางคำตอบ) จะคง reservation เป็น Reconciling ให้ผู้ปฏิบัติงานตรวจสอบ เช่นเดียวกับเส้นทางที่ไม่สตรีม

การเรียกแบบสตรีมถูกวัดปริมาณเช่นเดียวกับการเรียกที่รอคำตอบครบ: ระบบกันยอดประมาณการแบบระมัดระวังตอนรับคำขอ แล้วตัดบัญชีตามจำนวน token จริงจาก usage block สุดท้าย และปล่อยส่วนต่าง การสตรีมเปลี่ยนวิธีส่งคำตอบ ไม่เปลี่ยนราคา

ขั้นตอนถัดไป#