Concepts and configuration

การสลับโมเดลเมื่อขัดข้อง

OpenClaw จัดการความล้มเหลวเป็นสองขั้นตอน:

  1. การหมุนเวียนโปรไฟล์การยืนยันตัวตน ภายในผู้ให้บริการปัจจุบัน
  2. การสลับไปใช้โมเดลสำรอง ไปยังโมเดลถัดไปใน 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 โดยไม่มี modelOverrideSource OpenClaw จะถือว่ารายการเหล่านั้นเป็นการแทนที่โดยผู้ใช้ เพื่อไม่ให้การเลือกเดิมอย่างชัดเจนถูกเปลี่ยนเป็นพฤติกรรมสำรองโดยไม่มีการแจ้งเตือน
    • โมเดลในเพย์โหลด Cron: payload.model / --model ของงาน cron เป็นโมเดลหลักของงาน ไม่ใช่การแทนที่โดยเซสชันผู้ใช้ โดยจะใช้ตัวเลือกสำรองที่กำหนดไว้ เว้นแต่งานจะระบุ payload.fallbacks; payload.fallbacks: [] ทำให้การเรียกใช้ cron ทำงานแบบเคร่งครัด

    OpenClaw ส่งการแจ้งเตือนที่มองเห็นได้เมื่อรอบหนึ่งเปลี่ยนไปใช้ตัวเลือกสำรอง และส่งการแจ้งเตือนอีกครั้งเมื่อรอบถัดมาทำงานสำเร็จด้วยโมเดลหลักที่เลือกไว้ สถานะการแจ้งเตือนที่บันทึกไว้จะป้องกันการแจ้งเตือนซ้ำเมื่อรอบที่ต่อเนื่องกันใช้คู่โมเดลที่เลือกไว้/โมเดลที่ใช้งานอยู่คู่เดิม ขณะที่การเลือกโมเดลเองยังคงไม่เปลี่ยนแปลง

    แคชข้ามความล้มเหลวของการยืนยันตัวตน

    ตามค่าเริ่มต้น ทุกรอบใหม่จะคงพฤติกรรมการลองตัวเลือกสำรองซ้ำที่มีอยู่ โดย OpenClaw จะลองตัวเลือกสำรองแต่ละรายการที่กำหนดไว้อีกครั้ง รวมถึงตัวเลือกที่ไม่ใช่โมเดลหลักซึ่งเพิ่งล้มเหลวด้วย auth หรือ auth_permanent

    เลือกเปิดใช้การระงับความล้มเหลวของการยืนยันตัวตนซ้ำด้วย:

    bash
    OPENCLAW_FALLBACK_SKIP_TTL_MS=60000

    เมื่อเปิดใช้ OpenClaw จะบันทึกเครื่องหมายข้ามในหน่วยความจำซึ่งจำกัดขอบเขตตามเซสชันสำหรับตัวเลือกสำรองที่ไม่ใช่โมเดลหลัก หลังจากเกิดความล้มเหลวประเภทการยืนยันตัวตน โดยใช้รหัสเซสชัน ผู้ให้บริการ และโมเดลเป็นคีย์ ระบบจะไม่ข้ามตัวเลือกหลัก ดังนั้นการเลือกโมเดลอย่างชัดเจนโดยผู้ใช้จึงยังคงแสดงข้อผิดพลาดการยืนยันตัวตนจริง แคชนี้มีผลเฉพาะในโปรเซสและจะถูกล้างเมื่อ Gateway เริ่มใหม่

    ค่านี้คือ TTL ในหน่วยมิลลิวินาที 0 หรือการไม่กำหนดค่าจะปิดใช้งานแคช ค่าบวกจะถูกจำกัดให้อยู่ระหว่าง 1 วินาทีถึง 10 นาที

    การแจ้งเตือนตัวเลือกสำรองที่ผู้ใช้มองเห็น

    เมื่อเซสชันเปลี่ยนไปใช้ตัวเลือกสำรองที่เลือกโดยอัตโนมัติ OpenClaw จะส่งการแจ้งสถานะในพื้นผิวการตอบกลับเดียวกัน:

    text
    ↪️ ตัวเลือกสำรองของโมเดล: <fallback> (เลือกไว้ <primary>; <reason>)

    เมื่อการตรวจสอบในภายหลังสำเร็จและเซสชันกลับไปยังโมเดลหลักที่เลือกไว้ OpenClaw จะส่ง:

    text
    ↪️ ล้างตัวเลือกสำรองของโมเดลแล้ว: <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 สำหรับลำดับที่ผู้ใช้มองเห็น:

    json5
    {  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:

    json
    {  "usageStats": {    "provider:profile": {      "lastUsed": 1736160000000,      "cooldownUntil": 1736160600000,      "errorCount": 2    }  }}

    การปิดใช้งานเนื่องจากการเรียกเก็บเงิน

    ความล้มเหลวด้านการเรียกเก็บเงิน/เครดิต (เช่น "เครดิตไม่เพียงพอ" / "ยอดเครดิตต่ำเกินไป") ถือเป็นเหตุที่ควรสลับเมื่อขัดข้อง แต่โดยทั่วไปไม่ได้เกิดขึ้นชั่วคราว แทนที่จะใช้ช่วงพักการใช้งานสั้นๆ OpenClaw จะทำเครื่องหมายโปรไฟล์ว่า ปิดใช้งาน (โดยมีระยะถอยกลับที่นานกว่า) และหมุนไปยังโปรไฟล์/ผู้ให้บริการถัดไป

    ความล้มเหลวของการตรวจสอบสิทธิ์แบบถาวรที่มีความเชื่อมั่นสูง (คีย์ถูกเพิกถอน/ปิดใช้งาน หรือพื้นที่ทำงานถูกปิดใช้งาน) จะเข้าสู่เส้นทางปิดใช้งานที่คล้ายกัน แต่จะกู้คืนได้เร็วกว่ากรณีการเรียกเก็บเงินมาก เนื่องจากผู้ให้บริการบางรายอาจส่งเพย์โหลดที่ดูเหมือนข้อผิดพลาดการตรวจสอบสิทธิ์เป็นการชั่วคราวระหว่างเหตุขัดข้อง

    สถานะจัดเก็บอยู่ในสถานะการตรวจสอบสิทธิ์ SQLite ของแต่ละเอเจนต์:

    json
    {  "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.order
    • agents.defaults.model.primary / agents.defaults.model.fallbacks
    • agents.defaults.imageModel การกำหนดเส้นทาง

    ดูโมเดลสำหรับภาพรวมที่ครอบคลุมยิ่งขึ้นเกี่ยวกับการเลือกโมเดลและการใช้ตัวเลือกสำรอง

    Was this useful?
    On this page

    On this page