Concepts and configuration
การสลับโมเดลเมื่อขัดข้อง
OpenClaw จัดการความล้มเหลวเป็นสองขั้นตอน:
- การหมุนเวียนโปรไฟล์การยืนยันตัวตน ภายในผู้ให้บริการปัจจุบัน
- การสลับไปใช้โมเดลสำรอง ไปยังโมเดลถัดไปใน
agents.defaults.model.fallbacks
ลำดับการทำงานขณะรันไทม์
ระบุสถานะเซสชัน
ระบุโมเดลของเซสชันที่ใช้งานอยู่และการกำหนดค่าโปรไฟล์การยืนยันตัวตนที่ต้องการ
สร้างลำดับตัวเลือก
สร้างลำดับโมเดลตัวเลือกจากการเลือกโมเดลปัจจุบันและนโยบายสำรองของแหล่งที่มาของการเลือกนั้น ค่าเริ่มต้นที่กำหนดไว้ โมเดลหลักของงาน cron และโมเดลสำรองที่เลือกโดยอัตโนมัติสามารถใช้โมเดลสำรองที่กำหนดไว้ได้ ส่วนการเลือกเซสชันโดยผู้ใช้อย่างชัดเจนจะใช้แบบเคร่งครัด
ลองใช้ผู้ให้บริการปัจจุบัน
ลองใช้ผู้ให้บริการปัจจุบันตามกฎการหมุนเวียน/คูลดาวน์ของโปรไฟล์การยืนยันตัวตน
เลื่อนไปยังตัวเลือกถัดไปเมื่อเกิดข้อผิดพลาดที่ควรทำ failover
หากลองผู้ให้บริการนั้นจนครบแล้วและเกิดข้อผิดพลาดที่ควรทำ failover ให้ไปยังโมเดลตัวเลือกถัดไป
ใช้ตัวเลือกสำรองสำหรับรอบปัจจุบัน
เรียกใช้ตัวเลือกสำรองที่สำเร็จโดยไม่เปลี่ยนผู้ให้บริการ/โมเดลที่เลือกไว้ของเซสชัน
ลองใหม่เมื่อทุกตัวเลือกล้มเหลวจากภาระงานล้นเพียงอย่างเดียวอย่างปลอดภัย
หากทุกตัวเลือกล้มเหลวเพียงเพราะผู้ให้บริการมีภาระงานล้น ให้ลองลำดับภายในรอบทั้งหมดใหม่ได้สูงสุด 10 ครั้งด้วยการหน่วงเวลาแบบทวีคูณ ตราบใดที่ยังไม่มีการเรียกใช้เครื่องมือหรือเริ่มส่งเอาต์พุตของผู้ช่วย หลังจาก 30 วินาที ให้ส่งการแจ้งสถานะหนึ่งครั้งเพื่อไม่ให้ผู้ใช้รอโดยไม่มีข้อมูล
ส่ง FallbackSummaryError หากลองครบทุกตัวเลือกแล้ว
หากทุกตัวเลือกล้มเหลว ให้ส่ง FallbackSummaryError พร้อมรายละเอียดของแต่ละครั้งที่ลองและเวลาสิ้นสุดคูลดาวน์ที่เร็วที่สุดเมื่อทราบ
การเรียกใช้ตัวเลือกสำรองมีผลเฉพาะรอบปัจจุบัน ตัวดำเนินการตอบกลับจะบันทึกเฉพาะสถานะการแจ้งเตือนตัวเลือกสำรอง เพื่อให้ /status และการแจ้งเตือนการเปลี่ยนสถานะแยกความแตกต่างระหว่างโมเดลที่เลือกไว้กับโมเดลที่ตอบได้ โดยจะไม่บันทึกตัวเลือกสำรองเป็นโมเดลที่เลือกสำหรับรอบถัดไป
นโยบายแหล่งที่มาของการเลือก
แหล่งที่มาของการเลือกควบคุมว่าจะอนุญาตให้ใช้ลำดับตัวเลือกสำรองหรือไม่:
- ค่าเริ่มต้นที่กำหนดไว้:
agents.defaults.model.primaryใช้agents.defaults.model.fallbacks - โมเดลหลักของเอเจนต์:
agents.list[].modelจะทำงานแบบเคร่งครัด เว้นแต่ออบเจ็กต์โมเดลของเอเจนต์นั้นจะมีfallbacksของตนเอง ใช้fallbacks: []เพื่อระบุพฤติกรรมแบบเคร่งครัดอย่างชัดเจน หรือใช้รายการที่ไม่ว่างเพื่ออนุญาตให้เอเจนต์นั้นใช้โมเดลสำรอง - ตัวเลือกสำรองขณะรันไทม์: ตัวเลือกสำรองมีผลเฉพาะรอบปัจจุบัน รอบถัดไปจะเริ่มจากโมเดลหลักที่เลือกไว้อีกครั้ง OpenClaw ยังคงรู้จักรายการ
modelOverrideSource: "auto"ที่บันทึกไว้ก่อนหน้านี้ ตรวจสอบต้นทางที่กำหนดไว้ทุก 5 นาที และล้างรายการเหล่านั้นเมื่อต้นทางกลับมาทำงานได้/new,/resetและsessions.resetจะล้างรายการเหล่านั้นด้วย - การแทนที่โดยเซสชันผู้ใช้:
/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)
- คีย์รองสำหรับ OAuth: โปรไฟล์ที่มีโทเค็นการเข้าถึงซึ่งใช้งานได้ในปัจจุบันจะมาก่อน โปรไฟล์ที่โทเค็นการเข้าถึงหมดอายุ โปรไฟล์ OAuth ที่หมดอายุยังคงมีสิทธิ์ใช้งาน เพื่อให้ รันไทม์สามารถรีเฟรชโปรไฟล์เหล่านั้นได้เมื่อไม่มีโปรไฟล์อื่นที่ใช้งานได้
- คีย์ถัดไป:
usageStats.lastUsed(เก่าที่สุดก่อน ภายในแต่ละระดับประเภท/สถานะ) - โปรไฟล์ที่อยู่ในคูลดาวน์/ถูกปิดใช้งาน จะถูกย้ายไปท้ายสุด โดยเรียงตามเวลาสิ้นสุดที่เร็วที่สุด
การยึดติดกับเซสชัน (เป็นมิตรกับแคช)
OpenClaw ตรึงโปรไฟล์การยืนยันตัวตนที่เลือกไว้ต่อเซสชัน เพื่อรักษาแคชของผู้ให้บริการให้อุ่นอยู่เสมอ โดยจะ ไม่ หมุนเวียนทุกคำขอ โปรไฟล์ที่ตรึงไว้จะถูกใช้ซ้ำจนกว่า:
- เซสชันจะถูกรีเซ็ต (
/new//reset) - Compaction เสร็จสมบูรณ์ (จำนวน Compaction เพิ่มขึ้น)
- โปรไฟล์อยู่ในคูลดาวน์/ถูกปิดใช้งาน
การเลือกด้วยตนเองผ่าน /model …@<profileId> จะกำหนด การแทนที่โดยผู้ใช้ สำหรับเซสชันนั้น และจะไม่หมุนเวียนโดยอัตโนมัติจนกว่าจะเริ่มเซสชันใหม่
การสมัครสมาชิก OpenAI Codex พร้อมคีย์ API สำรอง
สำหรับโมเดลเอเจนต์ OpenAI การยืนยันตัวตนและรันไทม์แยกจากกัน openai/gpt-* จะยังคงอยู่บน Codex harness ขณะที่การยืนยันตัวตนสามารถหมุนเวียนระหว่างโปรไฟล์การสมัครสมาชิก 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 harness เมื่อพ้นเวลารีเซ็ต โปรไฟล์การสมัครสมาชิกจะมีสิทธิ์ใช้งานอีกครั้ง และการเลือกอัตโนมัติครั้งถัดไปสามารถกลับไปใช้โปรไฟล์นั้นได้
ใช้โปรไฟล์ที่ผู้ใช้ตรึงไว้เฉพาะเมื่อต้องการบังคับใช้บัญชี/คีย์หนึ่งรายการสำหรับเซสชันนั้น โปรไฟล์ที่ผู้ใช้ตรึงไว้ทำงานแบบเคร่งครัดโดยเจตนา และจะไม่สลับไปยังโปรไฟล์อื่นโดยไม่มีการแจ้งเตือน
คูลดาวน์
เมื่อโปรไฟล์ล้มเหลวเนื่องจากข้อผิดพลาดด้านการยืนยันตัวตน/ขีดจำกัดอัตรา (หรือการหมดเวลาที่มีลักษณะเหมือนการจำกัดอัตรา) 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 จะถูกจัดประเภทเป็นสัญญาณการหมดเวลา/failover
ข้อความทั่วไปจากเซิร์ฟเวอร์อาจอยู่ในกลุ่มการหมดเวลานั้นด้วยเมื่อแหล่งที่มาตรงกับรูปแบบชั่วคราวที่รู้จัก ตัวอย่างเช่น ข้อความตัวครอบสตรีมของรันไทม์โมเดลแบบไม่มีรายละเอียด An unknown error occurred จะถูกถือว่าควรทำ failover สำหรับผู้ให้บริการทุกราย เนื่องจากรันไทม์โมเดลที่ใช้ร่วมกันจะส่งข้อความนี้เมื่อสตรีมของผู้ให้บริการสิ้นสุดด้วย stopReason: "aborted" หรือ stopReason: "error" โดยไม่มีรายละเอียดเฉพาะ เพย์โหลด JSON api_error ที่มีข้อความเซิร์ฟเวอร์ชั่วคราว เช่น internal server error, unknown error, 520, upstream error หรือ backend error จะถูกถือว่าเป็นการหมดเวลาที่ควรทำ failover เช่นกัน
ข้อความต้นทางทั่วไปที่เฉพาะเจาะจงกับ OpenRouter เช่น Provider returned error แบบไม่มีรายละเอียด จะถูกถือเป็นการหมดเวลาเฉพาะเมื่อบริบทของผู้ให้บริการเป็น OpenRouter จริงเท่านั้น ข้อความตัวเลือกสำรองภายในทั่วไป เช่น LLM request failed with an unknown error. จะยังคงใช้การพิจารณาอย่างระมัดระวังและไม่เรียกใช้ failover ด้วยตัวเอง
ขีดจำกัด 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สำหรับความล้มเหลวจากการจำกัดอัตราเมื่อทราบ ID ของโมเดลที่ล้มเหลว - ยังคงสามารถลองใช้โมเดลพี่น้องจากผู้ให้บริการเดียวกันได้ เมื่อช่วงพักการใช้งานจำกัดขอบเขตไว้ที่โมเดลอื่น
- ช่วงเวลาที่เกี่ยวกับการเรียกเก็บเงิน/การปิดใช้งานยังคงบล็อกทั้งโปรไฟล์ในทุกโมเดล
ช่วงพักการใช้งานทั่วไป (ไม่เกี่ยวกับการเรียกเก็บเงินและไม่ใช่การตรวจสอบสิทธิ์ที่ล้มเหลวถาวร) จะเพิ่มขึ้นตามจำนวนข้อผิดพลาดล่าสุดของโปรไฟล์:
- ล้มเหลวครั้งที่ 1: 30 วินาที
- ล้มเหลวครั้งที่ 2: 1 นาที
- ล้มเหลวครั้งที่ 3 เป็นต้นไป: 5 นาที (ขีดสูงสุด)
ตัวนับจะรีเซ็ตเมื่อพ้นช่วงเวลาความล้มเหลวที่กำหนดไว้ภายในโปรไฟล์
สถานะจัดเก็บอยู่ในสถานะการตรวจสอบสิทธิ์ SQLite ของแต่ละเอเจนต์ภายใต้ usageStats:
{ "usageStats": { "provider:profile": { "lastUsed": 1736160000000, "cooldownUntil": 1736160600000, "errorCount": 2 } }}การปิดใช้งานเนื่องจากการเรียกเก็บเงิน
ความล้มเหลวด้านการเรียกเก็บเงิน/เครดิต (เช่น "เครดิตไม่เพียงพอ" / "ยอดเครดิตต่ำเกินไป") ถือเป็นเหตุที่ควรสลับเมื่อขัดข้อง แต่โดยทั่วไปไม่ได้เกิดขึ้นชั่วคราว แทนที่จะใช้ช่วงพักการใช้งานสั้นๆ OpenClaw จะทำเครื่องหมายโปรไฟล์ว่า ปิดใช้งาน (โดยมีระยะถอยกลับที่นานกว่า) และหมุนไปยังโปรไฟล์/ผู้ให้บริการถัดไป
ความล้มเหลวของการตรวจสอบสิทธิ์แบบถาวรที่มีความเชื่อมั่นสูง (คีย์ถูกเพิกถอน/ปิดใช้งาน หรือพื้นที่ทำงานถูกปิดใช้งาน) จะเข้าสู่เส้นทางปิดใช้งานที่คล้ายกัน แต่จะกู้คืนได้เร็วกว่ากรณีการเรียกเก็บเงินมาก เนื่องจากผู้ให้บริการบางรายอาจส่งเพย์โหลดที่ดูเหมือนข้อผิดพลาดการตรวจสอบสิทธิ์เป็นการชั่วคราวระหว่างเหตุขัดข้อง
สถานะจัดเก็บอยู่ในสถานะการตรวจสอบสิทธิ์ SQLite ของแต่ละเอเจนต์:
{ "usageStats": { "provider:profile": { "disabledUntil": 1736178000000, "disabledReason": "billing" } }}ข้อผิดพลาดจากภาระงานเกินและการจำกัดอัตราจะได้รับการจัดการเชิงรุกมากกว่าช่วงพักการใช้งานด้านการเรียกเก็บเงิน: โดยค่าเริ่มต้น OpenClaw อนุญาตให้ลองโปรไฟล์การตรวจสอบสิทธิ์ของผู้ให้บริการรายเดิมอีกหนึ่งครั้ง จากนั้นจึงสลับไปยังโมเดลสำรองที่กำหนดค่าไว้ถัดไปโดยไม่รอ
โมเดลสำรอง
หากโปรไฟล์ทั้งหมดของผู้ให้บริการล้มเหลว OpenClaw จะย้ายไปยังโมเดลถัดไปใน agents.defaults.model.fallbacks ซึ่งใช้กับความล้มเหลวของการตรวจสอบสิทธิ์ การจำกัดอัตรา และการหมดเวลาที่ใช้การหมุนโปรไฟล์จนหมดแล้ว (ข้อผิดพลาดอื่นจะไม่เลื่อนไปยังโมเดลสำรอง) ข้อผิดพลาดของผู้ให้บริการที่ไม่เปิดเผยรายละเอียดเพียงพอยังคงได้รับป้ายกำกับอย่างแม่นยำในสถานะสำรอง: empty_response หมายถึงผู้ให้บริการไม่ส่งคืนข้อความหรือสถานะที่ใช้งานได้, no_error_details หมายถึงผู้ให้บริการส่งคืน Unknown error (no error details in response) อย่างชัดเจน และ unclassified หมายถึง OpenClaw เก็บตัวอย่างข้อมูลดิบไว้ แต่ยังไม่มีตัวจำแนกใดตรงกัน
สัญญาณว่าผู้ให้บริการไม่ว่าง เช่น ModelNotReadyException จะอยู่ในกลุ่มภาระงานเกิน และใช้นโยบายหมุนหนึ่งครั้งแล้วสลับไปยังโมเดลสำรองเช่นเดียวกับการจำกัดอัตรา (ดูตารางค่าเริ่มต้นด้านบน)
หากเชนตัวเลือกทั้งหมดหมดลงเพราะความล้มเหลวจากภาระงานเกินเท่านั้น ตัวประมวลผลการตอบกลับจะลองเชนใหม่สูงสุด 10 ครั้งภายในเทิร์นเดียวกัน อนุญาตให้ลองใหม่ทั้งเทิร์นได้เฉพาะก่อนเริ่มการเรียกใช้เครื่องมือหรือการส่งเอาต์พุตของผู้ช่วย เพื่อหลีกเลี่ยงการเปลี่ยนแปลงหรือข้อความซ้ำ หากเกิดภาระงานเกินหลังจากมีงานที่สังเกตเห็นได้แล้ว ระยะถอยกลับเริ่มที่ 2.5 วินาทีและเพิ่มเป็นสองเท่าจนถึงขีดสูงสุด 30 วินาที เมื่อเทิร์นรอครบ 30 วินาที OpenClaw จะส่งการแจ้งเตือนสถานะชั่วคราวหนึ่งครั้ง: The AI service is temporarily overloaded. I’m still retrying; this may take a few minutes. การลองใหม่และโมเดลสำรองที่สำเร็จจะมีผลเฉพาะในเทิร์น ส่วนข้อผิดพลาดชั่วคราวทั่วไปของเซิร์ฟเวอร์ยังคงใช้นโยบายลองใหม่หนึ่งครั้งแยกต่างหาก
เมื่อการทำงานเริ่มจากโมเดลหลักเริ่มต้นที่กำหนดค่าไว้ โมเดลหลักของงาน 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 จะตรวจสอบต้นทางที่กำหนดค่าไว้เป็นระยะ และล้างค่าทดแทนเมื่อกู้คืนแล้ว;
/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.orderagents.defaults.model.primary/agents.defaults.model.fallbacksagents.defaults.imageModelการกำหนดเส้นทาง
ดูโมเดลสำหรับภาพรวมที่ครอบคลุมยิ่งขึ้นเกี่ยวกับการเลือกโมเดลและการใช้ตัวเลือกสำรอง