ข้ามไปยังเนื้อหา
Sursa Developers

POST/v1/chat

สตรีมคำตอบของผู้ช่วย (SSE)

chat

เมื่อมี API หลายสำเนาอยู่หลังตัวกระจายโหลด (ที่อยู่ api.<domain> ตั้งแต่ 1.62.0) คำตอบและบัฟเฟอร์อีเวนต์ของคำตอบจะอยู่ในหน่วยความจำของสำเนาที่สร้างคำตอบนั้น การทำต่อจากสตรีมด้วย Last-Event-ID จึงใช้ได้เฉพาะกับสำเนานั้น

คำขอซ้ำที่มี request_id และบทสนทนาเดียวกัน ซึ่งไปถึงสำเนาอื่นหลังคำตอบเสร็จแล้ว จะได้รับคำตอบที่บันทึกไว้ (token และ done โดยอีเวนต์นับจาก 1) โดยไม่ถามคำถามซ้ำ คำขอซ้ำที่ไปถึงสำเนาอื่นระหว่างที่คำตอบยังสร้างอยู่จะหยุดการสร้างนั้นและสร้างคำตอบใหม่ทั้งหมด และไม่เกิดคำถามที่สองเช่นกัน ถ้าต้องการทำต่อจากสตรีมโดยไม่สร้างคำตอบใหม่ ให้คงการเชื่อมต่อกับสำเนาเดิม หรือส่งคำขอซ้ำหลังอีเวนต์ done

การยืนยันตัวตน

ส่งคีย์ API ในเฮดเดอร์ Authorization: Authorization: Bearer <คีย์>

พารามิเตอร์เฮดเดอร์

  • X-View-Asstring

    สำหรับคีย์ API ที่มีบทบาท admin เท่านั้น ทำคำขอในนามโปรไฟล์ข้อมูล <profile>[:viewer|verifier|editor] เช่น employee:viewer คีย์การติดตั้งใช้เฮดเดอร์นี้ไม่ได้ (403)

พารามิเตอร์คุกกี้

  • kb_view_asstring

    คุกกี้ของโหมด “View as” สำหรับเซสชัน POST /auth/view-as ตั้งค่าคุกกี้นี้ และ DELETE /auth/view-as ล้างค่า

เนื้อหาคำขอ

application/json

ออบเจ็กต์: ChatRequest

  • messagesarray of ChatMessageจำเป็น

    items ≥ 1

  • collectionstring

    ค่าเริ่มต้น: "default"

  • tagsarray of string | null
  • exportstring | null
  • card_idsarray of string | null

    items ≤ 50

  • streamboolean

    ค่าเริ่มต้น: false

  • conversation_idstring | null

    length ≤ 64

  • originstring | null
  • toolsboolean | null
  • bypass_cacheboolean

    ไม่ใช้คำตอบจากแคชคำตอบ (ปุ่ม “Get a fresh answer” ใต้คำตอบจากแคช) คำตอบใหม่จะแทนที่รายการเดิมในแคช

    ค่าเริ่มต้น: false

  • languagestring | null

    ภาษาของคำตอบ: รหัส ISO 639-1 (de en ru …) เพื่อให้ตอบเป็นภาษานั้น เมื่อเป็น auto หรือไม่มีฟิลด์นี้ ระบบตรวจหาภาษาจากคำถาม หน้าจอส่งภาษาของคำแนะนำที่เป็นภาษาอื่นมาอย่างชัดเจน (Starter.language)

  • scopeChatScope | null

    ขอบเขตของคำถาม: หลายคอลเลกชัน แหล่งข้อมูล แท็ก และช่วงเวลา คอลเลกชันของขอบเขตใช้แทน collection แหล่งข้อมูลจำกัดคำตอบให้อยู่ในคอลเลกชันของแหล่งข้อมูลนั้น (และการ์ดของแหล่งข้อมูลนั้นเอง) แท็กจะเพิ่มเข้าใน tags ช่วงเวลาจำกัดคำตอบทางการเงินให้อยู่ในช่วงนั้น เลือกได้เฉพาะสิ่งที่ผู้ใช้มองเห็น (คอลเลกชัน: collections.no_access/collections.not_found แหล่งข้อมูล: sources.not_found) เมื่อมี conversation_id ระบบบันทึกขอบเขตไว้ในบทสนทนา เมื่อไม่มีฟิลด์นี้ จะใช้ขอบเขตของบทสนทนา ส่วน null หรือขอบเขตว่างจะล้างขอบเขตนั้น

  • request_idstring

    คีย์ป้องกันการทำซ้ำของคำถาม ส่งคีย์เดียวกันในการลองใหม่ทุกครั้งของสตรีมสำหรับคำถามเดียว (การลองใหม่หลังการเชื่อมต่อขาด ในกรณีนี้ Last-Event-ID ไม่ได้ทำให้สตรีมทำต่อจากเดิมและใช้บันทึกในล็อกเท่านั้น) การลองใหม่ด้วยคีย์ของคำตอบที่บันทึกไว้แล้วจะไม่สร้างคำถามที่สอง: ระบบส่งผลที่บันทึกไว้อีกครั้งเป็นอีเวนต์ done หนึ่งรายการ (และ token พร้อมข้อความ) แม้ขีดจำกัดคำถามหรือเครดิตจะหมดแล้ว ถ้าคำตอบก่อนหน้ายังอยู่ระหว่างการสร้างให้ไคลเอ็นต์ที่ขาดการเชื่อมต่อ ระบบจะหยุดการสร้างนั้นและสร้างคำตอบใหม่

    length ≤ 64

  • version_ofinteger (int64)

    สร้างเวอร์ชันใหม่ของรอบการสนทนาของคำถามนี้ในบทสนทนา (question_id จากประวัติบทสนทนา): คำถามที่แก้ไขแล้ว (ข้อความใหม่ใน messages) คำตอบที่สร้างใหม่ (ข้อความเดิม โดยปกติใช้กับ bypass_cache) หรือคำถามเดิมที่ใช้ quality อื่น (เช่น precise หลังคำตอบแบบ fast) คู่คำถามและคำตอบก่อนหน้ายังคงอยู่ รอบการสนทนาหลังจากนั้นอยู่ในแขนงเดิมและซ่อนจากประวัติบทสนทนาขณะที่เลือกเวอร์ชันใหม่อยู่ (FeedItem.versions และ POST /v1/conversations/{conv_id}/versions) ประวัติที่ใช้สร้างคำตอบคือแขนงที่เลือกจนถึงรอบนี้ quality ของเวอร์ชันไม่เปลี่ยนการตั้งค่าของบทสนทนา ต้องมี conversation_id ถ้าเป็นคำถามจากบทสนทนาอื่นจะได้รับ 404 questions.not_found

  • qualitystring

    ความสมดุลระหว่างความเร็วและความแม่นยำของการค้นหาที่อยู่เบื้องหลังผลลัพธ์: fast เร็วกว่า precise แม่นยำกว่า ค่าเริ่มต้น: precise

    ค่าที่ใช้ได้: fastprecise

การตอบกลับ

200เมื่อใช้ `stream=true`: `text/event-stream` แต่ละอีเวนต์ประกอบด้วยบรรทัด `id: <number>` (ลำดับของอีเวนต์ในสตรีม เริ่มที่ 1) และ `data: <JSON>` ตามด้วยบรรทัดว่าง ไม่ใช้ฟิลด์ `event:` และ `retry:` ประเภทอีเวนต์อยู่ในฟิลด์ `type` (`ChatEvent`)

เมื่อใช้ stream=true: text/event-stream แต่ละอีเวนต์ประกอบด้วยบรรทัด id: <number> (ลำดับของอีเวนต์ในสตรีม เริ่มที่ 1) และ data: <JSON> ตามด้วยบรรทัดว่าง ไม่ใช้ฟิลด์ event: และ retry: ประเภทอีเวนต์อยู่ในฟิลด์ type (ChatEvent)

คำถามที่มี request_id ได้รับคำตอบโดยไม่ขึ้นกับการเชื่อมต่อ การตัดการเชื่อมต่อไม่หยุดคำตอบ: คำตอบจะสร้างจนเสร็จและบันทึกไว้ในบทสนทนา (ได้นานสูงสุด 10 นาที) การส่งคำขอเดิมซ้ำ (request_id และบทสนทนาเดียวกัน) จะเชื่อมต่อเข้ากับคำตอบที่กำลังสร้างอยู่ และเมื่อมีเฮดเดอร์ Last-Event-ID จะได้รับอีเวนต์ที่อยู่หลังหมายเลขนั้น สตรีมจึงดำเนินต่อด้วยหมายเลขอีเวนต์เดิม ถ้าสตรีมดำเนินต่อจากหมายเลขนั้นไม่ได้ คำขอซ้ำจะได้รับสตรีมตั้งแต่ต้น: อีเวนต์แรกจะมีหมายเลขไม่เกิน Last-Event-ID และไคลเอ็นต์เริ่มแสดงคำตอบใหม่ตั้งแต่ต้น ถ้าคำตอบเสร็จแล้วและบัฟเฟอร์อีเวนต์ถูกปล่อยไปแล้ว (หลัง 3 นาที) ระบบจะส่งผลลัพธ์ที่บันทึกไว้อีกครั้ง (token และ done นับจาก 1) โดยไม่ถามคำถามซ้ำ มิฉะนั้นจะสร้างคำตอบใหม่ทั้งหมด หากต้องการหยุดคำตอบแบบนี้ ให้เรียก POST /v1/chat/cancel เมื่อไม่มี request_id การตัดการเชื่อมต่อของไคลเอ็นต์จะยกเลิกคำตอบ

หลังอีเวนต์แรก ระหว่างที่คำตอบกำลังสร้างอยู่ เซิร์ฟเวอร์จะส่งความคิดเห็น : ping ทุก 15 วินาที ให้ข้ามไป ลำดับอีเวนต์: อีเวนต์ stage (ความคืบหน้า) meta sources data แล้วจึงเป็นข้อความของคำตอบในอีเวนต์ token และตามด้วย done ก่อนข้อความของคำตอบ sources และ data อาจซ้ำได้ และอาจมีอีเวนต์ tool ข้อความอาจมาเป็น token เดียวหรือเป็นหลายส่วน คำตอบจากแคช: meta (มี cached) sources data token และ done ข้อผิดพลาดหลังสตรีมเริ่มแล้วจะมาเป็นอีเวนต์ error และสตรีมจะปิดโดยไม่มี done สถานะ HTTP ของสตรีมเป็น 200 เสมอ หลัง done อาจมีอีเวนต์ followups ที่มีคำถามถัดไปที่แนะนำ ให้ข้ามประเภทอีเวนต์ที่คุณไม่ได้จัดการ

เมื่อใช้ stream=false: application/json ที่มีเนื้อหา AnswerResponse (และ conversation_id)

เฮดเดอร์การตอบกลับ

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

application/json

ออบเจ็กต์: AnswerResponse

  • answerstringจำเป็น
  • question_idintegerจำเป็น
  • querystring
  • collectionstringจำเป็น
  • sourcesarray of Sourceจำเป็น
  • table_queriesarray of TableQueryจำเป็น
  • datasetsarray of Datasetจำเป็น
  • chartsarray of ChartSpecจำเป็น
  • warningsarray of AnswerWarningจำเป็น
  • timingsTimingsจำเป็น
  • provenancearray of NumberProvenance
  • emptystring

    ค่าที่ใช้ได้: no_hitsrestrictedguardrailno_data_for_period

  • verificationAnswerVerification
  • alt_periodsarray of AnswerAltPeriod

    items ≤ 6

  • drilldownarray of AnswerDrilldown

    items ≤ 20

  • restrictedRestrictedInfo
  • verified_onlyboolean
  • cachedboolean
  • out_of_scopeAnswerOutOfScope
  • attachmentsarray of Attachment
  • export_errorstring
  • toolsstring | null

    เหตุผลที่ใช้เครื่องมือสำหรับคำตอบนี้: request (ขออย่างชัดเจน) compare compute และ action (ตามคำถาม) needs_calc (ต้องคำนวณจากตาราง) summary (ภาพรวมของคอลเลกชันหรือเอกสาร) และ mcp (องค์กรเชื่อมต่อเซิร์ฟเวอร์ MCP ภายนอกไว้)

    ค่าที่ใช้ได้: requestcomparecomputeactionneeds_calcsummarymcpnull

  • tool_callsarray of ToolCallInfo
  • calculationsarray of Calculation
  • pending_actionsarray of PendingAction
  • entitiesarray of AnswerEntityจำเป็น
  • followupsarray of Followupจำเป็น
  • conversation_idstring

    เฉพาะ POST /v1/chat ที่มีบทสนทนา

  • answer_idstring

    ID ของออบเจ็กต์คำตอบ

400คำขอไม่ถูกต้อง: ค่าพารามิเตอร์หรือสถานะของออบเจ็กต์ไม่อนุญาตให้ดำเนินการ (`detail` เป็นข้อความ)

เฮดเดอร์การตอบกลับ

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

401ไม่ได้ส่งข้อมูลรับรอง (ไม่มีทั้งคุกกี้เซสชันและคีย์ API) หรือไม่พบคีย์

เฮดเดอร์การตอบกลับ

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

403ไม่อนุญาตให้ดำเนินการ: บทบาทไม่เพียงพอ ไม่มีสิทธิ์เข้าถึงคอลเลกชันหรือการ์ด คำขอทำงานในโหมด “View as” หรือองค์กรถูกระงับหรือถูกลบ (`detail` เป็นออบเจ็กต์ที่มี `code: org_suspended | org_deleted`)

เฮดเดอร์การตอบกลับ

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

404ออบเจ็กต์ไม่มีอยู่หรือคุณเข้าถึงไม่ได้ API ไม่ยืนยันว่าออบเจ็กต์ที่จำกัดสิทธิ์มีอยู่จริง

เฮดเดอร์การตอบกลับ

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

422ข้อผิดพลาดในการตรวจความถูกต้องของข้อมูล: เนื้อหาหรือพารามิเตอร์ไม่ตรงกับสคีมา (`detail` เป็นรายการข้อผิดพลาดในการตรวจความถูกต้อง) หรือค่าพารามิเตอร์อยู่นอกช่วงที่กำหนด (`detail` เป็นข้อความ)

เฮดเดอร์การตอบกลับ

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

429คำขอมากเกินไป (`api.rate_limited`) โควตาขององค์กรสำหรับนาที วัน หรือเดือนหมดแล้ว (`api.quota_exceeded` โดย `error.details` มี `quota` `limit` และ `reset_at`) องค์กรใช้ถึงขีดจำกัดแล้ว หรือบริการคำตอบไม่ว่าง (`answers.engine_busy`) รอตามเวลาในเฮดเดอร์ `Retry-After`

เฮดเดอร์การตอบกลับ

  • Retry-After

    จำนวนวินาทีที่ต้องรอก่อนลองส่งคำขอใหม่

  • RateLimit-Policy

    ขีดจำกัดที่มีผล ในรูปแบบของร่าง IETF draft-ietf-httpapi-ratelimit-headers: รายการคั่นด้วยจุลภาค "<name>";q=<quota>;w=<window in seconds> โดย key คืออัตราคำขอของคีย์ API (โควตาคือช่วงพุ่งสูง (burst) กรอบเวลาคือเวลาที่ใช้เติมกลับจนเต็ม สำหรับเซสชันคือ user และเมื่อไม่มีข้อมูลรับรองคือ ip) ส่วน minute day และ month คือโควตาขององค์กรสำหรับนาที วัน และเดือนตามปฏิทินใน UTC

  • RateLimit

    ส่วนที่เหลือของแต่ละขีดจำกัดใน RateLimit-Policy: "<name>";r=<remaining>;t=<seconds until reset>

  • X-RateLimit-Limit

    ขีดจำกัดของรายการที่เข้มงวดที่สุดใน RateLimit-Policy (รายการที่เหลือคำขอน้อยที่สุด)

  • X-RateLimit-Remaining

    จำนวนคำขอที่เหลือภายใต้ขีดจำกัดที่เข้มงวดที่สุด

  • X-RateLimit-Reset

    จำนวนวินาทีจนกว่าขีดจำกัดที่เข้มงวดที่สุดจะรีเซ็ต

รหัสข้อผิดพลาด

รหัสที่เอนด์พอยต์นี้อาจส่งคืนใน error.code นอกเหนือจากรหัสทั่วไปของทุกคำขอ

การลองใหม่อย่างปลอดภัย

ส่งเฮดเดอร์ Idempotency-Key (เช่น UUID) ไปกับทุกคำขอ POST และ PATCH เมื่อลองใหม่ด้วยคีย์เดียวกันภายใน 24 ชั่วโมง Sursa จะส่งคืนการตอบกลับที่บันทึกไว้แทนการดำเนินการคำขอซ้ำ

ขีดจำกัดอัตราการเรียก

การตอบกลับมีเฮดเดอร์ RateLimit และ RateLimit-Policy รวมถึงเฮดเดอร์แบบเดิม X-RateLimit-Limit X-RateLimit-Remaining และ X-RateLimit-Reset การตอบกลับ 429 มี Retry-After เป็นวินาที ให้รอตามนั้นแล้วลองใหม่

← answers · เอกสารอ้างอิง API