Concepts and configuration
การสลับโมเดลเมื่อเกิดข้อผิดพลาด
OpenClaw จัดการความล้มเหลวเป็นสองขั้นตอน:
- การหมุนเวียนโปรไฟล์การตรวจสอบสิทธิ์ ภายในผู้ให้บริการปัจจุบัน
- การสลับไปใช้โมเดลสำรอง ไปยังโมเดลถัดไปใน
agents.defaults.model.fallbacks
ลำดับการทำงานขณะรัน
ระบุสถานะเซสชัน
ระบุโมเดลของเซสชันที่ใช้งานอยู่และค่ากำหนดโปรไฟล์การตรวจสอบสิทธิ์
สร้างลำดับตัวเลือก
สร้างลำดับโมเดลตัวเลือกจากโมเดลที่เลือกอยู่ในปัจจุบันและนโยบายการใช้โมเดลสำรองสำหรับแหล่งที่มาของการเลือกนั้น ค่าเริ่มต้นที่กำหนดไว้ โมเดลหลักของงาน Cron และโมเดลสำรองที่เลือกโดยอัตโนมัติสามารถใช้รายการสำรองที่กำหนดไว้ได้ ส่วนการเลือกเซสชันโดยผู้ใช้อย่างชัดเจนจะเป็นแบบเคร่งครัด
ลองใช้ผู้ให้บริการปัจจุบัน
ลองใช้ผู้ให้บริการปัจจุบันตามกฎการหมุนเวียนและช่วงพักของโปรไฟล์การตรวจสอบสิทธิ์
เลื่อนไปยังตัวเลือกถัดไปเมื่อเกิดข้อผิดพลาดที่ควรสลับระบบ
หากผู้ให้บริการนั้นหมดตัวเลือกเนื่องจากข้อผิดพลาดที่ควรสลับระบบ ให้เลื่อนไปยังโมเดลตัวเลือกถัดไป
บันทึกการแทนที่ด้วยโมเดลสำรอง
บันทึกการแทนที่ด้วยโมเดลสำรองที่เลือกไว้ก่อนเริ่มลองใหม่ เพื่อให้ตัวอ่านเซสชันอื่นเห็นผู้ให้บริการและโมเดลเดียวกับที่ตัวรันกำลังจะใช้ การแทนที่โมเดลที่บันทึกไว้จะถูกทำเครื่องหมายเป็น modelOverrideSource: "auto"
ย้อนกลับเฉพาะส่วนเมื่อเกิดความล้มเหลว
หากโมเดลสำรองที่เลือกทำงานล้มเหลว ให้ย้อนกลับเฉพาะฟิลด์การแทนที่เซสชันที่การใช้โมเดลสำรองเป็นเจ้าของ และเฉพาะเมื่อฟิลด์เหล่านั้นยังตรงกับตัวเลือกที่ล้มเหลวนั้น
ส่ง FallbackSummaryError หากตัวเลือกทั้งหมดล้มเหลว
หากตัวเลือกทั้งหมดล้มเหลว ให้ส่ง FallbackSummaryError พร้อมรายละเอียดของแต่ละครั้งที่ลอง และเวลาสิ้นสุดช่วงพักที่เร็วที่สุดเมื่อทราบค่านั้น
ขอบเขตนี้จงใจแคบกว่าแนวทาง “บันทึกและคืนค่าทั้งเซสชัน” ตัวรันการตอบกลับจะบันทึกเฉพาะฟิลด์การเลือกโมเดลที่ตนเป็นเจ้าของสำหรับการใช้โมเดลสำรอง ได้แก่ providerOverride, modelOverride, modelOverrideSource, authProfileOverride, authProfileOverrideSource, authProfileOverrideCompactionCount วิธีนี้ป้องกันไม่ให้การลองใช้โมเดลสำรองที่ล้มเหลวเขียนทับการเปลี่ยนแปลงอื่นในเซสชันที่ใหม่กว่าและไม่เกี่ยวข้อง เช่น การเปลี่ยน /model ด้วยตนเองหรือการอัปเดตการหมุนเวียนเซสชันที่เกิดขึ้นระหว่างการลอง
นโยบายแหล่งที่มาของการเลือก
แหล่งที่มาของการเลือกเป็นตัวกำหนดว่าอนุญาตให้ใช้ลำดับโมเดลสำรองหรือไม่:
- ค่าเริ่มต้นที่กำหนดไว้:
agents.defaults.model.primaryใช้agents.defaults.model.fallbacks - โมเดลหลักของเอเจนต์:
agents.list[].modelเป็นแบบเคร่งครัด เว้นแต่ออบเจ็กต์โมเดลของเอเจนต์นั้นจะมีfallbacksของตนเอง ใช้fallbacks: []เพื่อระบุพฤติกรรมแบบเคร่งครัดอย่างชัดเจน หรือใช้รายการที่ไม่ว่างเพื่อเปิดใช้การสลับโมเดลสำรองสำหรับเอเจนต์นั้น - การแทนที่ด้วยโมเดลสำรองอัตโนมัติ: การใช้โมเดลสำรองขณะรันจะเขียน
providerOverride,modelOverride,modelOverrideSource: "auto"และโมเดลต้นทางที่เลือกไว้ก่อนลองใหม่ การแทนที่นี้จะดำเนินต่อไปตามลำดับโมเดลสำรองที่กำหนดไว้โดยไม่ตรวจสอบโมเดลหลักทุกข้อความ แต่ OpenClaw จะตรวจสอบโมเดลต้นทางที่กำหนดไว้ทุก 5 นาที (กำหนดค่าไม่ได้) และล้างการแทนที่เมื่อโมเดลนั้นกลับมาทำงานได้/new,/resetและsessions.resetจะล้างการแทนที่ที่มาจากระบบอัตโนมัติด้วย การทำงานของ Heartbeat ที่ไม่ได้ระบุheartbeat.modelอย่างชัดเจนจะล้างการแทนที่อัตโนมัติโดยตรงเมื่อต้นทางไม่ตรงกับค่าเริ่มต้นที่กำหนดไว้ในปัจจุบันอีกต่อไป - การแทนที่เซสชันโดยผู้ใช้:
/model, ตัวเลือกโมเดล,session_status(model=...)และsessions.patchจะเขียนmodelOverrideSource: "user"นี่คือการเลือกเซสชันแบบเจาะจง หากผู้ให้บริการหรือโมเดลที่เลือกทำงานล้มเหลวก่อนสร้างคำตอบ OpenClaw จะรายงานความล้มเหลวแทนการตอบโดยใช้โมเดลสำรองที่กำหนดไว้อื่นซึ่งไม่เกี่ยวข้อง - การแทนที่เซสชันแบบเดิม: รายการเซสชันรุ่นเก่าอาจมี
modelOverrideโดยไม่มีmodelOverrideSourceOpenClaw จะถือว่ารายการเหล่านั้นเป็นการแทนที่โดยผู้ใช้ เพื่อไม่ให้การเลือกแบบเจาะจงเดิมถูกเปลี่ยนเป็นพฤติกรรมการใช้โมเดลสำรองโดยไม่แจ้งให้ทราบ - โมเดลในเพย์โหลด Cron:
payload.model/--modelของงาน Cron เป็นโมเดลหลักของงาน ไม่ใช่การแทนที่เซสชันโดยผู้ใช้ โดยจะใช้โมเดลสำรองที่กำหนดไว้ เว้นแต่งานจะระบุpayload.fallbacks;payload.fallbacks: []ทำให้การทำงานของ Cron เป็นแบบเคร่งครัด
OpenClaw จดจำการตรวจสอบโมเดลหลักล่าสุดแยกตามเซสชันและโมเดลหลัก เพื่อไม่ให้ลองโมเดลหลักที่ล้มเหลวซ้ำในทุกครั้งที่โต้ตอบ ระบบจะส่งการแจ้งเตือนที่มองเห็นได้เมื่อเซสชันย้ายไปใช้โมเดลสำรอง และส่งอีกครั้งเมื่อกลับไปใช้โมเดลหลักที่เลือกไว้ โดยจะไม่ส่งการแจ้งเตือนซ้ำทุกครั้งที่ยังคงใช้โมเดลสำรองเดิม
แคชข้ามความล้มเหลวในการตรวจสอบสิทธิ์
ตามค่าเริ่มต้น การโต้ตอบใหม่แต่ละครั้งจะคงพฤติกรรมการลองใช้โมเดลสำรองเดิมไว้ โดย OpenClaw จะลองตัวเลือกโมเดลสำรองที่กำหนดไว้แต่ละรายการอีกครั้ง รวมถึงตัวเลือกที่ไม่ใช่โมเดลหลักซึ่งเพิ่งล้มเหลวด้วย auth หรือ auth_permanent
เปิดใช้การระงับความล้มเหลวในการตรวจสอบสิทธิ์ซ้ำด้วย:
OPENCLAW_FALLBACK_SKIP_TTL_MS=60000เมื่อเปิดใช้ OpenClaw จะบันทึกเครื่องหมายข้ามที่อยู่ในหน่วยความจำและจำกัดขอบเขตตามเซสชัน สำหรับตัวเลือกโมเดลสำรองที่ไม่ใช่โมเดลหลักหลังเกิดความล้มเหลวประเภทการตรวจสอบสิทธิ์ โดยใช้รหัสเซสชัน ผู้ให้บริการ และโมเดลเป็นคีย์ ระบบจะไม่ข้ามตัวเลือกโมเดลหลัก ดังนั้นการเลือกโมเดลโดยผู้ใช้อย่างชัดเจนจะยังแสดงข้อผิดพลาดการตรวจสอบสิทธิ์จริง แคชนี้ใช้เฉพาะภายในโพรเซสและจะถูกล้างเมื่อ Gateway เริ่มต้นใหม่
ค่านี้เป็น TTL หน่วยมิลลิวินาที ค่า 0 หรือการไม่กำหนดค่าจะปิดใช้แคช ค่าบวกจะถูกจำกัดให้อยู่ระหว่าง 1 วินาทีถึง 10 นาที
การแจ้งเตือนการใช้โมเดลสำรองที่ผู้ใช้มองเห็น
เมื่อเซสชันย้ายไปใช้โมเดลสำรองที่เลือกโดยอัตโนมัติ OpenClaw จะส่งการแจ้งเตือนสถานะในช่องทางการตอบกลับเดียวกัน:
↪️ การสลับไปใช้โมเดลสำรอง: <fallback> (เลือกไว้ <primary>; <reason>)เมื่อการตรวจสอบในภายหลังสำเร็จและเซสชันกลับไปใช้โมเดลหลักที่เลือกไว้ OpenClaw จะส่ง:
↪️ ยกเลิกการสลับไปใช้โมเดลสำรองแล้ว: <primary> (ก่อนหน้านี้ใช้ <fallback>)การแจ้งเตือนเหล่านี้เป็นข้อความการปฏิบัติงาน ไม่ใช่เนื้อหาจากผู้ช่วย ระบบจะส่งหนึ่งครั้งต่อการเปลี่ยนสถานะ รวมถึงการโต้ตอบที่มีเพียงผลข้างเคียงเมื่อทำได้ แต่จะไม่ส่งซ้ำในการโต้ตอบที่ยังคงใช้โมเดลสำรองเดิม การส่งจะข้ามการระงับการตอบกลับไปยังต้นทางตามปกติ ไม่ใช้ช่องคำตอบแรกของผู้ช่วยสำหรับช่องทางแบบเธรด และไม่รวมอยู่ในการแปลงข้อความเป็นเสียงพูดและการแยกคำมั่นสัญญา
ที่เก็บข้อมูลการตรวจสอบสิทธิ์ (คีย์และ OAuth)
OpenClaw ใช้ โปรไฟล์การตรวจสอบสิทธิ์ สำหรับทั้งคีย์ API และโทเค็น OAuth
- ข้อมูลลับและสถานะการกำหนดเส้นทางการตรวจสอบสิทธิ์ขณะรันอยู่ใน
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite - การกำหนดค่า
auth.profiles/auth.orderเป็น ข้อมูลเมตาและการกำหนดเส้นทางเท่านั้น (ไม่มีข้อมูลลับ) - ไฟล์ OAuth แบบเดิมที่ใช้สำหรับนำเข้าเท่านั้น:
~/.openclaw/credentials/oauth.json(นำเข้าไปยังที่เก็บข้อมูลการตรวจสอบสิทธิ์ของแต่ละเอเจนต์เมื่อใช้งานครั้งแรก) - ไฟล์
auth-profiles.json,auth-state.jsonและauth.jsonของแต่ละเอเจนต์แบบเดิมจะถูกนำเข้าโดยopenclaw doctor --fix
รายละเอียดเพิ่มเติม: OAuth
ประเภทข้อมูลรับรอง:
type: "api_key"→{ provider, key }type: "oauth"→{ provider, access, refresh, expires, email? }(+projectId/enterpriseUrlสำหรับผู้ให้บริการบางราย)type: "token"→ โทเค็นแบบ bearer คงที่ซึ่งอาจกำหนดวันหมดอายุได้ OpenClaw จะไม่รีเฟรชโทเค็นนี้ (ใช้สำหรับaws-sdkและโหมดการตรวจสอบสิทธิ์ผ่านลำดับข้อมูลรับรองอื่น ๆ)
รหัสโปรไฟล์
การเข้าสู่ระบบด้วย OAuth จะสร้างโปรไฟล์แยกกันเพื่อให้หลายบัญชีใช้งานร่วมกันได้
- ค่าเริ่มต้น:
provider:defaultเมื่อไม่มีอีเมล - OAuth ที่มีอีเมล:
provider:<email>(ตัวอย่างเช่นgoogle-antigravity:user@gmail.com)
โปรไฟล์อยู่ในที่เก็บโปรไฟล์การตรวจสอบสิทธิ์ openclaw-agent.sqlite ของแต่ละเอเจนต์
ลำดับการหมุนเวียน
เมื่อผู้ให้บริการมีหลายโปรไฟล์ OpenClaw จะเลือกลำดับดังนี้:
การกำหนดค่าอย่างชัดเจน
auth.order[provider] (หากกำหนดไว้)
โปรไฟล์ที่กำหนดไว้
auth.profiles ที่กรองตามผู้ให้บริการ
โปรไฟล์ที่จัดเก็บไว้
รายการโปรไฟล์การตรวจสอบสิทธิ์ SQLite ของแต่ละเอเจนต์สำหรับผู้ให้บริการ
หากไม่ได้กำหนดลำดับอย่างชัดเจน OpenClaw จะใช้ลำดับแบบวนรอบ:
- คีย์หลัก: ประเภทโปรไฟล์ (OAuth ตามด้วยโทเค็นคงที่ แล้วจึงคีย์ API)
- คีย์รอง:
usageStats.lastUsed(เก่าที่สุดก่อนภายในแต่ละประเภท) - โปรไฟล์ที่อยู่ในช่วงพักหรือถูกปิดใช้ จะถูกย้ายไปท้ายลำดับ โดยเรียงตามเวลาสิ้นสุดที่เร็วที่สุด
การยึดโปรไฟล์ประจำเซสชัน (เป็นมิตรกับแคช)
OpenClaw ยึดโปรไฟล์การตรวจสอบสิทธิ์ที่เลือกไว้ต่อเซสชัน เพื่อให้แคชของผู้ให้บริการพร้อมใช้งานอยู่เสมอ ระบบจะ ไม่ หมุนเวียนทุกคำขอ โปรไฟล์ที่ยึดไว้จะถูกใช้ซ้ำจนกระทั่ง:
- เซสชันถูกรีเซ็ต (
/new//reset) - Compaction เสร็จสิ้น (จำนวน Compaction เพิ่มขึ้น)
- โปรไฟล์อยู่ในช่วงพักหรือถูกปิดใช้
การเลือกด้วยตนเองผ่าน /model …@<profileId> จะตั้งค่า การแทนที่โดยผู้ใช้ สำหรับเซสชันนั้น และจะไม่ถูกหมุนเวียนโดยอัตโนมัติจนกว่าจะเริ่มเซสชันใหม่
การสมัครใช้บริการ OpenAI Codex พร้อมคีย์ API สำรอง
สำหรับโมเดลเอเจนต์ OpenAI การตรวจสอบสิทธิ์และรันไทม์แยกจากกัน openai/gpt-* จะยังคงทำงานบนระบบ Codex ขณะที่การตรวจสอบสิทธิ์สามารถหมุนเวียนระหว่างโปรไฟล์การสมัครใช้บริการ Codex และคีย์ API สำรองของ OpenAI ได้
ใช้ auth.order.openai สำหรับลำดับที่ผู้ใช้มองเห็น:
{ auth: { order: { openai: ["openai:user@example.com", "openai:api-key-backup"], }, },}ใช้ openai:* สำหรับทั้งโปรไฟล์ OAuth ของ ChatGPT/Codex และโปรไฟล์คีย์ API ของ OpenAI เมื่อการสมัครใช้บริการถึงขีดจำกัดการใช้งาน Codex OpenClaw จะบันทึกเวลารีเซ็ตที่แน่นอนเมื่อ Codex ระบุไว้ ลองใช้โปรไฟล์การตรวจสอบสิทธิ์ถัดไปตามลำดับ และคงการทำงานไว้ภายในระบบ Codex เมื่อพ้นเวลารีเซ็ตแล้ว โปรไฟล์การสมัครใช้บริการจะมีสิทธิ์ใช้งานอีกครั้ง และการเลือกอัตโนมัติครั้งถัดไปสามารถกลับไปใช้โปรไฟล์นั้นได้
ใช้โปรไฟล์ที่ผู้ใช้ยึดไว้เฉพาะเมื่อต้องการบังคับใช้บัญชีหรือคีย์เดียวสำหรับเซสชันนั้น โปรไฟล์ที่ผู้ใช้ยึดไว้เป็นแบบเคร่งครัดโดยเจตนาและจะไม่เปลี่ยนไปยังโปรไฟล์อื่นโดยไม่แจ้งให้ทราบ
ช่วงพัก
เมื่อโปรไฟล์ทำงานล้มเหลวเนื่องจากข้อผิดพลาดการตรวจสอบสิทธิ์หรือการจำกัดอัตรา (หรือการหมดเวลาที่มีลักษณะคล้ายการจำกัดอัตรา) OpenClaw จะทำเครื่องหมายว่าโปรไฟล์นั้นอยู่ในช่วงพักและย้ายไปยังโปรไฟล์ถัดไป
สิ่งที่ถูกจัดอยู่ในกลุ่มการจำกัดอัตราและการหมดเวลา
กลุ่มการจำกัดอัตรานี้ครอบคลุมมากกว่าเพียง 429 โดยยังรวมถึงข้อความจากผู้ให้บริการ เช่น Too many concurrent requests, ThrottlingException, concurrency limit reached, workers_ai ... quota limit exceeded, throttled, resource exhausted และขีดจำกัดตามรอบการใช้งาน เช่น weekly limit reached หรือ monthly limit exhausted
ข้อผิดพลาดด้านรูปแบบหรือคำขอไม่ถูกต้องมักเป็นข้อผิดพลาดสิ้นสุด เนื่องจากการลองเพย์โหลดเดิมซ้ำจะล้มเหลวแบบเดิม ดังนั้น OpenClaw จะแสดงข้อผิดพลาดเหล่านั้นแทนการหมุนเวียนโปรไฟล์การตรวจสอบสิทธิ์ เส้นทางการซ่อมแซมและลองใหม่ที่รองรับสามารถเปิดใช้ได้อย่างชัดเจน ตัวอย่างเช่น ความล้มเหลวในการตรวจสอบรหัสการเรียกใช้เครื่องมือของ Cloud Code Assist จะถูกปรับให้ปลอดภัยและลองใหม่หนึ่งครั้งผ่านนโยบาย allowFormatRetry ข้อผิดพลาดเหตุผลการหยุดที่เข้ากันได้กับ OpenAI เช่น Unhandled stop reason: error, stop reason: error และ reason: error จะถูกจัดประเภทเป็นสัญญาณการหมดเวลาหรือการสลับระบบ
ข้อความทั่วไปจากเซิร์ฟเวอร์อาจถูกจัดอยู่ในกลุ่มการหมดเวลานี้ด้วยเมื่อแหล่งที่มาตรงกับรูปแบบชั่วคราวที่รู้จัก ตัวอย่างเช่น ข้อความจากตัวครอบสตรีมของรันไทม์โมเดลโดยตรง An unknown error occurred จะถือว่าควรสลับระบบสำหรับผู้ให้บริการทุกราย เนื่องจากรันไทม์โมเดลที่ใช้ร่วมกันจะส่งข้อความนี้เมื่อสตรีมของผู้ให้บริการสิ้นสุดด้วย stopReason: "aborted" หรือ stopReason: "error" โดยไม่มีรายละเอียดเฉพาะ เพย์โหลด JSON api_error ที่มีข้อความเซิร์ฟเวอร์ชั่วคราว เช่น internal server error, unknown error, 520, upstream error หรือ backend error จะถือเป็นการหมดเวลาที่ควรสลับระบบด้วย
ข้อความทั่วไปจากต้นทางที่เฉพาะเจาะจงกับ OpenRouter เช่น Provider returned error จะถือเป็นการหมดเวลาเฉพาะเมื่อบริบทของผู้ให้บริการเป็น OpenRouter จริง ๆ ข้อความสำรองภายในทั่วไป เช่น LLM request failed with an unknown error. จะยังคงใช้แนวทางแบบระมัดระวังและไม่เรียกใช้การสลับระบบด้วยตัวเอง
ขีดจำกัด retry-after ของ SDK
SDK ของผู้ให้บริการบางรายอาจพักการทำงานเป็นเวลานานตามช่วง Retry-After ก่อนคืนการควบคุมให้ OpenClaw สำหรับ SDK ที่สร้างบน Stainless เช่น Anthropic และ OpenAI โดยค่าเริ่มต้น OpenClaw จะจำกัดการรอ retry-after-ms / retry-after ภายใน SDK ไว้ที่ 60 วินาที และส่งต่อการตอบกลับที่ลองใหม่ได้ซึ่งมีเวลารอนานกว่านั้นทันที เพื่อให้เส้นทางการสลับเมื่อเกิดความล้มเหลวนี้ทำงานได้ ปรับหรือปิดขีดจำกัดด้วย OPENCLAW_SDK_RETRY_MAX_WAIT_SECONDS; ดูพฤติกรรมการลองใหม่
ช่วงพักการใช้งานที่กำหนดขอบเขตตามโมเดล
ช่วงพักการใช้งานจากการจำกัดอัตราสามารถกำหนดขอบเขตตามโมเดลได้เช่นกัน:
- OpenClaw บันทึก
cooldownModelสำหรับความล้มเหลวจากการจำกัดอัตรา เมื่อทราบรหัสโมเดลที่ล้มเหลว - ยังคงสามารถลองโมเดลอื่นในเครือของผู้ให้บริการรายเดียวกันได้ เมื่อช่วงพักการใช้งานกำหนดขอบเขตไว้กับโมเดลอื่น
- ช่วงระงับจากการเรียกเก็บเงิน/การปิดใช้งานยังคงบล็อกทั้งโปรไฟล์ในทุกโมเดล
ช่วงพักการใช้งานปกติ (ไม่ใช่การเรียกเก็บเงินและไม่ใช่การยืนยันตัวตนที่ล้มเหลวถาวร) จะเพิ่มขึ้นตามจำนวนข้อผิดพลาดล่าสุดของโปรไฟล์:
- ล้มเหลวครั้งที่ 1: 30 วินาที
- ล้มเหลวครั้งที่ 2: 1 นาที
- ล้มเหลวครั้งที่ 3 ขึ้นไป: 5 นาที (ขีดสูงสุด)
ตัวนับจะรีเซ็ตเมื่อพ้นช่วงเวลาความล้มเหลวของโปรไฟล์ (auth.cooldowns.failureWindowHours ค่าเริ่มต้นคือ 24)
สถานะถูกจัดเก็บในสถานะการยืนยันตัวตน SQLite ประจำเอเจนต์ภายใต้ usageStats:
{ "usageStats": { "provider:profile": { "lastUsed": 1736160000000, "cooldownUntil": 1736160600000, "errorCount": 2 } }}การปิดใช้งานเนื่องจากการเรียกเก็บเงิน
ความล้มเหลวด้านการเรียกเก็บเงิน/เครดิต (เช่น "เครดิตไม่เพียงพอ" / "ยอดเครดิตต่ำเกินไป") ถือว่าเป็นเหตุให้ควรสลับเมื่อเกิดความล้มเหลว แต่โดยทั่วไปไม่ได้เกิดขึ้นชั่วคราว แทนที่จะใช้ช่วงพักสั้น ๆ OpenClaw จะทำเครื่องหมายโปรไฟล์ว่า ปิดใช้งาน (พร้อมระยะหน่วงที่นานกว่า) และหมุนไปยังโปรไฟล์/ผู้ให้บริการถัดไป
ความล้มเหลวด้านการยืนยันตัวตนแบบถาวรที่มีความเชื่อมั่นสูง (คีย์ถูกเพิกถอน/ปิดใช้งาน หรือพื้นที่ทำงานถูกปิดใช้งาน) จะเข้าสู่เส้นทางปิดใช้งานที่คล้ายกัน แต่จะกู้คืนได้เร็วกว่ากรณีการเรียกเก็บเงินมาก เนื่องจากผู้ให้บริการบางรายอาจส่งเพย์โหลดที่ดูเหมือนข้อผิดพลาดด้านการยืนยันตัวตนเพียงชั่วคราวระหว่างเหตุขัดข้อง
สถานะถูกจัดเก็บในสถานะการยืนยันตัวตน SQLite ประจำเอเจนต์:
{ "usageStats": { "provider:profile": { "disabledUntil": 1736178000000, "disabledReason": "billing" } }}ค่าเริ่มต้น (auth.cooldowns.*):
| คีย์ | ค่าเริ่มต้น | วัตถุประสงค์ |
|---|---|---|
billingBackoffHours |
5 | ระยะหน่วงพื้นฐานสำหรับการเรียกเก็บเงิน เพิ่มเป็นสองเท่าต่อความล้มเหลวด้านการเรียกเก็บเงินแต่ละครั้ง |
billingMaxHours |
24 | ขีดสูงสุดของระยะหน่วงสำหรับการเรียกเก็บเงิน |
authPermanentBackoffMinutes |
10 | ระยะหน่วงพื้นฐานสำหรับความล้มเหลวด้านการยืนยันตัวตนแบบถาวรที่มีความเชื่อมั่นสูง |
authPermanentMaxMinutes |
60 | ขีดสูงสุดของระยะหน่วงดังกล่าว |
failureWindowHours |
24 | รีเซ็ตตัวนับความล้มเหลวหากไม่มีความล้มเหลวเกิดขึ้นในช่วงเวลานี้ |
overloadedProfileRotations |
1 | จำนวนครั้งที่อนุญาตให้หมุนโปรไฟล์ของผู้ให้บริการรายเดิมก่อนใช้โมเดลสำรองเมื่อโหลดเกิน |
overloadedBackoffMs |
0 | ระยะหน่วงคงที่ก่อนลองหมุนโปรไฟล์อีกครั้งเมื่อโหลดเกิน |
rateLimitedProfileRotations |
1 | จำนวนครั้งที่อนุญาตให้หมุนโปรไฟล์ของผู้ให้บริการรายเดิมก่อนใช้โมเดลสำรองเมื่อถูกจำกัดอัตรา |
ข้อผิดพลาดจากโหลดเกินและการจำกัดอัตราจะถูกจัดการเชิงรุกมากกว่าช่วงพักจากการเรียกเก็บเงิน โดยค่าเริ่มต้น OpenClaw อนุญาตให้ลองโปรไฟล์การยืนยันตัวตนของผู้ให้บริการรายเดิมอีกหนึ่งครั้ง จากนั้นจึงสลับไปยังโมเดลสำรองที่กำหนดค่าไว้ลำดับถัดไปโดยไม่รอ
โมเดลสำรอง
หากโปรไฟล์ทั้งหมดของผู้ให้บริการล้มเหลว OpenClaw จะย้ายไปยังโมเดลถัดไปใน agents.defaults.model.fallbacks พฤติกรรมนี้ใช้กับความล้มเหลวด้านการยืนยันตัวตน การจำกัดอัตรา และการหมดเวลาที่ใช้การหมุนโปรไฟล์จนหมดแล้ว (ข้อผิดพลาดประเภทอื่นจะไม่เลื่อนไปยังโมเดลสำรอง) ข้อผิดพลาดจากผู้ให้บริการที่ไม่แสดงรายละเอียดเพียงพอยังคงถูกติดป้ายอย่างแม่นยำในสถานะโมเดลสำรอง: empty_response หมายถึงผู้ให้บริการไม่ได้ส่งคืนข้อความหรือสถานะที่ใช้งานได้ no_error_details หมายถึงผู้ให้บริการส่งคืน Unknown error (no error details in response) อย่างชัดเจน และ unclassified หมายถึง OpenClaw เก็บตัวอย่างข้อมูลดิบไว้ แต่ยังไม่มีตัวจำแนกใดตรงกับข้อผิดพลาดนั้น
สัญญาณว่าผู้ให้บริการไม่ว่าง เช่น ModelNotReadyException จะถูกจัดไว้ในกลุ่มโหลดเกิน และใช้นโยบายหมุนหนึ่งครั้งแล้วใช้โมเดลสำรองเช่นเดียวกับการจำกัดอัตรา (ดูตารางค่าเริ่มต้นด้านบน)
เมื่อการทำงานเริ่มจากโมเดลหลักค่าเริ่มต้นที่กำหนดค่าไว้ โมเดลหลักของงาน Cron โมเดลหลักของเอเจนต์ที่มีโมเดลสำรองระบุไว้อย่างชัดเจน หรือการแทนที่โมเดลสำรองที่เลือกโดยอัตโนมัติ OpenClaw สามารถไล่ตามลำดับโมเดลสำรองที่กำหนดค่าไว้ซึ่งตรงกันได้ โมเดลหลักของเอเจนต์ที่ไม่มีโมเดลสำรองระบุไว้อย่างชัดเจนและการเลือกโดยผู้ใช้อย่างชัดเจน (เช่น /model ollama/qwen3.5:27b ตัวเลือกโมเดล sessions.patch หรือการแทนที่ผู้ให้บริการ/โมเดลแบบครั้งเดียวผ่าน CLI) จะใช้กฎแบบเข้มงวด: หากไม่สามารถเข้าถึงผู้ให้บริการ/โมเดลนั้น หรือเกิดความล้มเหลวก่อนสร้างคำตอบ OpenClaw จะรายงานความล้มเหลวแทนที่จะตอบจากโมเดลสำรองที่ไม่เกี่ยวข้อง
กฎของลำดับตัวเลือก
OpenClaw สร้างรายการตัวเลือกจาก provider/model ที่ร้องขอในขณะนั้นร่วมกับโมเดลสำรองที่กำหนดค่าไว้
กฎ
- โมเดลที่ร้องขอจะอยู่ลำดับแรกเสมอ
- โมเดลสำรองที่กำหนดค่าไว้อย่างชัดเจนจะถูกขจัดรายการซ้ำ แต่ไม่ถูกกรองด้วยรายการโมเดลที่อนุญาต โดยถือว่าเป็นเจตนาที่ชัดเจนของผู้ดูแลระบบ
- หากการทำงานปัจจุบันอยู่บนโมเดลสำรองที่กำหนดค่าไว้แล้วในตระกูลผู้ให้บริการเดียวกัน OpenClaw จะยังคงใช้ลำดับที่กำหนดค่าไว้ทั้งหมด
- เมื่อไม่ได้ระบุการแทนที่โมเดลสำรองอย่างชัดเจน ระบบจะลองโมเดลสำรองที่กำหนดค่าไว้ก่อนโมเดลหลักที่กำหนดค่าไว้ แม้ว่าโมเดลที่ร้องขอจะใช้ผู้ให้บริการรายอื่น
- เมื่อไม่ได้ระบุการแทนที่โมเดลสำรองอย่างชัดเจนให้กับตัวดำเนินการโมเดลสำรอง ระบบจะเพิ่มโมเดลหลักที่กำหนดค่าไว้ต่อท้าย เพื่อให้ลำดับกลับไปใช้ค่าเริ่มต้นปกติได้เมื่อใช้ตัวเลือกก่อนหน้าจนหมดแล้ว
- เมื่อผู้เรียกส่ง
fallbacksOverrideตัวดำเนินการจะใช้เฉพาะโมเดลที่ร้องขอร่วมกับรายการแทนที่นั้น รายการว่างจะปิดใช้งานโมเดลสำรองและป้องกันไม่ให้เพิ่มโมเดลหลักที่กำหนดค่าไว้เป็นเป้าหมายการลองใหม่แบบซ่อน
ข้อผิดพลาดใดบ้างที่เลื่อนไปยังโมเดลสำรอง
ดำเนินการต่อเมื่อ
- การยืนยันตัวตนล้มเหลว
- ถึงขีดจำกัดอัตราและใช้ช่วงพักจนหมด
- ข้อผิดพลาดจากโหลดเกิน/ผู้ให้บริการไม่ว่าง
- ข้อผิดพลาดการสลับเมื่อเกิดความล้มเหลวที่มีลักษณะเป็นการหมดเวลา
- การปิดใช้งานเนื่องจากการเรียกเก็บเงิน
LiveSessionModelSwitchErrorซึ่งถูกปรับให้อยู่ในเส้นทางการสลับเมื่อเกิดความล้มเหลว เพื่อไม่ให้โมเดลที่คงอยู่แต่ล้าสมัยสร้างวงรอบการลองใหม่ภายนอก- ข้อผิดพลาดอื่นที่ไม่รู้จักเมื่อยังมีตัวเลือกเหลืออยู่
ไม่ดำเนินการต่อเมื่อ
- การยกเลิกอย่างชัดเจนที่ไม่มีลักษณะเป็นการหมดเวลา/การสลับเมื่อเกิดความล้มเหลว
- ข้อผิดพลาดบริบทล้นที่ควรอยู่ภายในตรรกะ Compaction/การลองใหม่ (เช่น
request_too_large,input token count exceeds the maximum number of input tokens,input exceeds the maximum number of tokens,input too long for the modelหรือollama error: context length exceeded) - ข้อผิดพลาดที่ไม่รู้จักรายการสุดท้ายเมื่อไม่มีตัวเลือกเหลืออยู่
- การปฏิเสธด้วยเหตุผลด้านความปลอดภัยของ Claude Fable 5; คำขอที่ใช้คีย์ API โดยตรงจะจัดการกรณีดังกล่าวในระดับผู้ให้บริการผ่านโมเดลสำรองฝั่งเซิร์ฟเวอร์ของ Anthropic ไปยัง
claude-opus-4-8แทน (ดู Anthropic)
พฤติกรรมการข้ามช่วงพักเทียบกับการตรวจสอบ
เมื่อโปรไฟล์การยืนยันตัวตนทั้งหมดของผู้ให้บริการอยู่ในช่วงพักแล้ว OpenClaw จะไม่ข้ามผู้ให้บริการนั้นตลอดไปโดยอัตโนมัติ แต่จะตัดสินใจแยกตามตัวเลือก:
การตัดสินใจแยกตามตัวเลือก
- ความล้มเหลวด้านการยืนยันตัวตนแบบถาวรจะข้ามผู้ให้บริการทั้งรายทันที
- การปิดใช้งานเนื่องจากการเรียกเก็บเงินมักจะถูกข้าม แต่ยังสามารถตรวจสอบตัวเลือกหลักแบบจำกัดความถี่ได้ เพื่อให้กู้คืนได้โดยไม่ต้องเริ่มระบบใหม่
- อาจตรวจสอบตัวเลือกหลักเมื่อใกล้สิ้นสุดช่วงพัก โดยจำกัดความถี่แยกตามผู้ให้บริการ
- สามารถลองโมเดลสำรองอื่นในเครือผู้ให้บริการรายเดียวกันได้แม้อยู่ในช่วงพัก เมื่อความล้มเหลวดูเหมือนเกิดขึ้นชั่วคราว (
rate_limit,overloadedหรือไม่ทราบประเภท) กรณีนี้มีความสำคัญเป็นพิเศษเมื่อการจำกัดอัตรากำหนดขอบเขตตามโมเดล และโมเดลอื่นในเครืออาจกู้คืนได้ทันที - การตรวจสอบช่วงพักชั่วคราวถูกจำกัดไว้ที่หนึ่งครั้งต่อผู้ให้บริการต่อการทำงานของโมเดลสำรอง เพื่อไม่ให้ผู้ให้บริการรายเดียวทำให้การสลับข้ามผู้ให้บริการหยุดชะงัก
การแทนที่ของเซสชันและการสลับโมเดลขณะทำงาน
การเปลี่ยนโมเดลของเซสชันเป็นสถานะที่ใช้ร่วมกัน ตัวดำเนินการที่ทำงานอยู่ คำสั่ง /model การอัปเดต Compaction/เซสชัน และการปรับสถานะเซสชันขณะทำงานให้สอดคล้องกัน ล้วนอาจอ่านหรือเขียนส่วนต่าง ๆ ของรายการเซสชันเดียวกัน
ดังนั้น การลองโมเดลสำรองใหม่จึงต้องประสานงานกับการสลับโมเดลขณะทำงาน:
- เฉพาะการเปลี่ยนโมเดลที่ผู้ใช้สั่งอย่างชัดเจนเท่านั้นที่จะทำเครื่องหมายว่ามีการสลับขณะทำงานที่รอดำเนินการ ซึ่งรวมถึง
/model,session_status(model=...)และsessions.patch - การเปลี่ยนโมเดลที่ระบบเป็นผู้ดำเนินการ เช่น การหมุนโมเดลสำรอง การแทนที่ Heartbeat หรือ Compaction จะไม่ทำเครื่องหมายว่ามีการสลับขณะทำงานที่รอดำเนินการด้วยตัวเอง
- การแทนที่โมเดลโดยผู้ใช้จะถือเป็นการเลือกที่แน่นอนสำหรับนโยบายโมเดลสำรอง ดังนั้นหากไม่สามารถเข้าถึงผู้ให้บริการที่เลือก ระบบจะแสดงความล้มเหลวแทนที่จะถูกบดบังด้วย
agents.defaults.model.fallbacks - ก่อนเริ่มลองโมเดลสำรองใหม่ ตัวดำเนินการตอบกลับจะบันทึกฟิลด์การแทนที่โมเดลสำรองที่เลือกไว้ในรายการเซสชัน
- การแทนที่โมเดลสำรองอัตโนมัติจะยังคงถูกเลือกในรอบถัดไป เพื่อไม่ให้ OpenClaw ตรวจสอบโมเดลหลักที่ทราบว่าใช้งานไม่ได้ในทุกข้อความ OpenClaw จะตรวจสอบต้นทางที่กำหนดค่าไว้อีกครั้งเป็นระยะ และล้างการแทนที่อัตโนมัติเมื่อกู้คืนแล้ว;
/new,/resetและsessions.resetจะล้างการแทนที่ที่มีแหล่งที่มาแบบอัตโนมัติทันที - คำตอบต่อผู้ใช้จะแจ้งการเปลี่ยนไปใช้โมเดลสำรองและการกู้คืนที่ล้างสถานะโมเดลสำรองหนึ่งครั้งต่อการเปลี่ยนสถานะแต่ละครั้ง รอบที่ยังคงใช้โมเดลสำรองเดิมจะไม่แจ้งซ้ำ
/statusแสดงโมเดลที่เลือก และเมื่อสถานะโมเดลสำรองแตกต่างออกไป จะแสดงโมเดลสำรองที่ใช้งานอยู่พร้อมเหตุผล- การปรับสถานะเซสชันขณะทำงานให้สอดคล้องกันจะให้ความสำคัญกับการแทนที่ของเซสชันที่บันทึกไว้ มากกว่าฟิลด์โมเดลขณะทำงานที่ล้าสมัย
- หากข้อผิดพลาดจากการสลับขณะทำงานชี้ไปยังตัวเลือกลำดับหลังในลำดับโมเดลสำรองที่ใช้งานอยู่ OpenClaw จะข้ามไปยังโมเดลที่เลือกนั้นโดยตรง แทนที่จะไล่ผ่านตัวเลือกที่ไม่เกี่ยวข้องก่อน
- หากความพยายามใช้โมเดลสำรองล้มเหลว ตัวดำเนินการจะย้อนกลับเฉพาะฟิลด์การแทนที่ที่ตนเขียน และเฉพาะเมื่อฟิลด์เหล่านั้นยังคงตรงกับตัวเลือกที่ล้มเหลวนั้น
วิธีนี้ป้องกันสภาวะแข่งขันแบบคลาสสิก:
โมเดลหลักล้มเหลว
โมเดลหลักที่เลือกไว้ล้มเหลว
เลือกโมเดลสำรองในหน่วยความจำ
เลือกตัวเลือกโมเดลสำรองในหน่วยความจำ
ที่เก็บเซสชันยังระบุโมเดลหลักเดิม
ที่เก็บเซสชันยังคงสะท้อนโมเดลหลักเดิม
การปรับสถานะขณะทำงานอ่านสถานะล้าสมัย
การปรับสถานะเซสชันขณะทำงานให้สอดคล้องกันอ่านสถานะเซสชันที่ล้าสมัย
การลองใหม่ถูกดึงกลับ
การลองใหม่ถูกดึงกลับไปยังโมเดลเดิมก่อนเริ่มความพยายามใช้โมเดลสำรอง
การบันทึกการแทนที่โมเดลสำรองจะปิดช่องว่างดังกล่าว และการย้อนกลับแบบจำกัดขอบเขตจะคงการเปลี่ยนเซสชันด้วยตนเองหรือโดยรันไทม์ที่ใหม่กว่าไว้
การสังเกตการณ์และสรุปความล้มเหลว
runWithModelFallback(...) บันทึกรายละเอียดของความพยายามแต่ละครั้ง ซึ่งใช้เป็นข้อมูลสำหรับบันทึกเหตุการณ์และข้อความช่วงพักที่แสดงต่อผู้ใช้:
- ผู้ให้บริการ/โมเดลที่พยายามใช้
- สาเหตุ (
rate_limit,overloaded,billing,auth,model_not_foundและสาเหตุการสลับสำรองที่คล้ายกัน) - สถานะ/รหัส (ไม่บังคับ)
- สรุปข้อผิดพลาดที่มนุษย์อ่านเข้าใจได้
บันทึกแบบมีโครงสร้าง model_fallback_decision ยังมีฟิลด์ fallbackStep* แบบแบนด้วย เมื่อผู้สมัครล้มเหลว ถูกข้าม หรือการสลับสำรองลำดับถัดไปสำเร็จ ฟิลด์เหล่านี้ระบุการเปลี่ยนผ่านที่พยายามดำเนินการไว้อย่างชัดเจน (fallbackStepFromModel, fallbackStepToModel, fallbackStepFromFailureReason, fallbackStepFromFailureDetail, fallbackStepFinalOutcome) เพื่อให้ตัวส่งออกบันทึกและข้อมูลวินิจฉัยสามารถสร้างรายละเอียดความล้มเหลวหลักขึ้นใหม่ได้ แม้ว่าการสลับสำรองขั้นสุดท้ายจะล้มเหลวด้วยก็ตาม
เมื่อผู้สมัครทุกรายล้มเหลว OpenClaw จะโยน FallbackSummaryError ตัวดำเนินการตอบกลับชั้นนอกสามารถใช้ข้อผิดพลาดนี้เพื่อสร้างข้อความที่เฉพาะเจาะจงยิ่งขึ้น เช่น "ขณะนี้โมเดลทั้งหมดถูกจำกัดอัตราการใช้งานชั่วคราว" และระบุเวลาสิ้นสุดช่วงพักที่เร็วที่สุด หากทราบ
สรุปช่วงพักดังกล่าวจะคำนึงถึงโมเดล:
- จะไม่พิจารณาขีดจำกัดอัตราการใช้งานระดับโมเดลที่ไม่เกี่ยวข้องกับลำดับผู้ให้บริการ/โมเดลที่พยายามใช้
- หากการระงับที่เหลืออยู่เป็นขีดจำกัดอัตราการใช้งานระดับโมเดลที่ตรงกัน OpenClaw จะรายงานเวลาสิ้นสุดล่าสุดที่ตรงกันและยังคงระงับโมเดลนั้นอยู่
การกำหนดค่าที่เกี่ยวข้อง
ดู การกำหนดค่า Gateway สำหรับ:
auth.profiles/auth.orderauth.cooldowns.billingBackoffHours/auth.cooldowns.billingBackoffHoursByProviderauth.cooldowns.billingMaxHours/auth.cooldowns.failureWindowHoursauth.cooldowns.authPermanentBackoffMinutes/auth.cooldowns.authPermanentMaxMinutesauth.cooldowns.overloadedProfileRotations/auth.cooldowns.overloadedBackoffMsauth.cooldowns.rateLimitedProfileRotationsagents.defaults.model.primary/agents.defaults.model.fallbacks- การกำหนดเส้นทาง
agents.defaults.imageModel
ดู โมเดล สำหรับภาพรวมที่กว้างขึ้นเกี่ยวกับการเลือกโมเดลและการสลับสำรอง