สารบัญ
Streaming
Streaming
ตั้ง stream: true เพื่อรับ Server-Sent Events (SSE) stream แต่ละเหตุการณ์มีส่วนหนึ่งของการตอบกลับ
รูปแบบ SSE
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hello"},"index":0}]}
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":" world"},"index":0}]}
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}
data: [DONE]การใช้งานใน streaming
เมื่อ streaming ข้อมูลการใช้งานจะถูกส่งคืนในชิ้นสุดท้ายก่อนข้อความ [DONE] พร้อมอาร์เรย์ choices ที่มี delta ว่างและ finish_reason: "stop"
Keep-alive และ chunk สุดท้าย
สตรีมอาจมีบรรทัดคอมเมนต์ SSE และ event unknown หรือ ping เพื่อ keep-alive ให้ข้ามและ parse data frame; data frame สุดท้ายอาจมี usage ก่อน data: [DONE]
: keepalive <- SSE comment line — ignore, do NOT JSON.parse
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hi"},"index":0}]}
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}
data: [DONE]การยกเลิกสตรีม
คำขอ streaming สามารถยกเลิกได้ด้วยการปิดการเชื่อมต่อฝั่งไคลเอนต์ — เช่น เรียก AbortController.abort() หรือปิดออบเจ็กต์ stream ทันทีที่ BazaarLink ได้รับสัญญาณยกเลิก จะหยุดส่งต่อ chunk ถัดไปและยกเลิกคำขอที่ส่งไปยังผู้ให้บริการ
สตรีมที่ถูกขัดจังหวะไม่มีค่าใช้จ่าย
ถ้าสตรีมจบลงก่อนที่ chunk usage สุดท้ายจะมาถึง — รวมถึงกรณีที่ไคลเอนต์ยกเลิกเอง — จะไม่มีข้อมูลจำนวนโทเค็นที่เชื่อถือได้สำหรับคำขอนั้น BazaarLink จึงคืนเงินที่กันไว้เต็มจำนวน คุณจะไม่ถูกเรียกเก็บเงินสำหรับเนื้อหาที่ส่งถึงไคลเอนต์ไปแล้วก่อนการยกเลิก
ไม่รับประกันว่าผู้ให้บริการจะหยุดทันที
การปิดการเชื่อมต่อทำให้ BazaarLink หยุดส่งต่อและหยุดคิดค่าใช้จ่ายโทเค็นถัดไปทันที แต่ผู้ให้บริการต้นทางจะหยุดการสร้างข้อมูลบนเซิร์ฟเวอร์ของตนเองทันทีที่การเชื่อมต่อขาดหรือไม่นั้น ขึ้นอยู่กับผู้ให้บริการรายนั้น ๆ — บางรายอาจยังประมวลผลต่ออีกสักครู่หลังจากตัดการเชื่อมต่อ
ข้อผิดพลาดกลางสตรีม
เฟรม error ไม่มีฟิลด์ choices
หากเกิดความล้มเหลวหลังจากที่ streaming เริ่มไปแล้ว (เช่น การเชื่อมต่อ upstream หลุด) คุณจะได้รับ SSE data frame รูปแบบ {error:{message,type,code}} แทนที่ {choices:[...]} ตามปกติ — โดยไม่มีการเปลี่ยนสถานะ HTTP เนื่องจาก header ถูกส่งไปแล้ว ให้ตรวจสอบ error key ก่อนอ่าน choices[0].delta และจะเรียกเก็บเงินเฉพาะโทเค็นที่ stream ไปแล้วเท่านั้น (ใช้การเรียกเก็บเงินบางส่วน)
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"The capital of "},"index":0}]}
data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}
data: [DONE]