OpenClaw обробляє збої у два етапи:Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Ротація профілів автентифікації в межах поточного провайдера.
- Резервне перемикання моделі на наступну модель у
agents.defaults.model.fallbacks.
Потік виконання
Для звичайного текстового запуску OpenClaw оцінює кандидатів у такому порядку:Build candidate chain
Будує ланцюжок моделей-кандидатів із поточного вибору моделі та політики резервного перемикання для джерела цього вибору. Налаштовані значення за замовчуванням, основні моделі завдань cron і автоматично вибрані резервні моделі можуть використовувати налаштовані резервні варіанти; явні вибори користувача в сеансі є строгими.
Try the current provider
Пробує поточного провайдера з правилами ротації та cooldown профілів автентифікації.
Advance on failover-worthy errors
Якщо цей провайдер вичерпано через помилку, що заслуговує на failover, переходить до наступної моделі-кандидата.
Persist fallback override
Зберігає вибране резервне перевизначення до початку повторної спроби, щоб інші читачі сеансу бачили того самого провайдера/модель, які runner збирається використати. Збережене перевизначення моделі позначається як
modelOverrideSource: "auto".Roll back narrowly on failure
Якщо резервний кандидат зазнає невдачі, відкочує лише поля перевизначення сеансу, що належать резервному перемиканню, коли вони все ще відповідають цьому невдалому кандидату.
providerOverridemodelOverridemodelOverrideSourceauthProfileOverrideauthProfileOverrideSourceauthProfileOverrideCompactionCount
/model або оновлення ротації сеансу, що сталися під час виконання спроби.
Політика джерела вибору
OpenClaw відокремлює вибраного провайдера/модель від причини вибору. Це джерело керує тим, чи дозволено ланцюжок резервного перемикання:- Налаштоване значення за замовчуванням:
agents.defaults.model.primaryвикористовуєagents.defaults.model.fallbacks. - Основна модель агента:
agents.list[].modelє строгим, якщо об’єкт моделі цього агента не містить власнихfallbacks. Використовуйтеfallbacks: [], щоб зробити строгу поведінку явною, або надайте непорожній список, щоб увімкнути для цього агента резервне перемикання моделей. - Автоматичне резервне перевизначення: під час виконання резервне перемикання записує
providerOverride,modelOverride,modelOverrideSource: "auto"і вибрану початкову модель перед повторною спробою. Це автоматичне перевизначення може продовжувати проходити налаштований ланцюжок резервного перемикання та очищується командами/new,/resetіsessions.reset. Запуски Heartbeat без явногоheartbeat.modelтакож очищують пряме автоматичне перевизначення, коли його походження більше не відповідає поточному налаштованому значенню за замовчуванням. - Користувацьке перевизначення сеансу:
/model, вибір моделі,session_status(model=...)іsessions.patchзаписуютьmodelOverrideSource: "user". Це точний вибір сеансу. Якщо вибраний провайдер/модель зазнає невдачі до створення відповіді, OpenClaw повідомляє про збій замість відповіді з непов’язаного налаштованого резервного варіанта. - Застаріле перевизначення сеансу: старіші записи сеансу можуть мати
modelOverrideбезmodelOverrideSource. OpenClaw трактує їх як користувацькі перевизначення, щоб явний старий вибір не було непомітно перетворено на поведінку резервного перемикання. - Модель у payload Cron:
payload.model/--modelзавдання cron є основною моделлю завдання, а не користувацьким перевизначенням сеансу. Вона використовує налаштовані резервні варіанти, якщо завдання не надаєpayload.fallbacks;payload.fallbacks: []робить запуск cron строгим.
Зберігання автентифікації (ключі + OAuth)
OpenClaw використовує профілі автентифікації як для ключів API, так і для токенів OAuth.- Секрети зберігаються в
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(застаріле:~/.openclaw/agent/auth-profiles.json). - Стан маршрутизації автентифікації під час виконання зберігається в
~/.openclaw/agents/<agentId>/agent/auth-state.json. - Конфігурація
auth.profiles/auth.order— це лише метадані + маршрутизація (без секретів). - Застарілий файл OAuth лише для імпорту:
~/.openclaw/credentials/oauth.json(імпортується вauth-profiles.jsonпід час першого використання).
type: "api_key"→{ provider, key }type: "oauth"→{ provider, access, refresh, expires, email? }(+projectId/enterpriseUrlдля деяких провайдерів)
Ідентифікатори профілів
Входи OAuth створюють окремі профілі, щоб кілька облікових записів могли співіснувати.- За замовчуванням:
provider:default, коли email недоступний. - OAuth з email:
provider:<email>(наприклад,google-antigravity:user@gmail.com).
~/.openclaw/agents/<agentId>/agent/auth-profiles.json у profiles.
Порядок ротації
Коли провайдер має кілька профілів, OpenClaw вибирає порядок так:
Якщо явний порядок не налаштовано, OpenClaw використовує циклічний порядок:
- Основний ключ: тип профілю (OAuth перед ключами API).
- Вторинний ключ:
usageStats.lastUsed(найстаріші першими, у межах кожного типу). - Профілі в cooldown або вимкнені переміщуються в кінець, упорядковані за найранішим завершенням.
Закріплення сеансу (зручне для кешування)
OpenClaw закріплює вибраний профіль автентифікації за сеансом, щоб кеші провайдерів залишалися прогрітими. Він не перемикає його під час кожного запиту. Закріплений профіль повторно використовується, доки:- сеанс не буде скинуто (
/new//reset) - не завершиться Compaction (лічильник Compaction збільшиться)
- профіль не перебуває в cooldown/вимкненому стані
/model …@<profileId> установлює перевизначення користувача для цього сеансу й не перемикається автоматично, доки не почнеться новий сеанс.
Автоматично закріплені профілі (вибрані маршрутизатором сеансу) розглядаються як перевага: їх пробують першими, але OpenClaw може перейти на інший профіль у разі обмежень частоти запитів або таймаутів. Коли початковий профіль знову стає доступним, нові запуски можуть знову віддавати йому перевагу без зміни вибраної моделі чи runtime. Закріплені користувачем профілі залишаються прив’язаними до цього профілю; якщо він завершується помилкою, а резервні моделі налаштовані, OpenClaw переходить до наступної моделі замість перемикання профілів.
Передплата OpenAI Codex плюс резервний API-ключ
Для агентських моделей OpenAI автентифікація й runtime розділені.openai/gpt-* залишається на
Codex harness, тоді як автентифікація може перемикатися між профілем передплати Codex і
резервним API-ключем OpenAI.
Використовуйте auth.order.openai для порядку, видимого користувачу:
openai-codex:*. Упорядкована резервна копія API-ключа може бути звичайним
профілем API-ключа openai:*. Коли передплата досягає ліміту використання Codex,
OpenClaw записує точний час скидання, якщо Codex його надає, пробує наступний
упорядкований профіль автентифікації та зберігає запуск усередині Codex harness. Після того як час скидання
минув, профіль передплати знову стає придатним, і наступний автоматичний
вибір може повернутися до нього.
Використовуйте закріплений користувачем профіль лише тоді, коли потрібно примусово використовувати один обліковий запис або ключ для цього
сеансу. Закріплені користувачем профілі навмисно суворі й не перемикаються непомітно
на інший профіль.
Cooldown-и
Коли профіль зазнає помилки через проблеми автентифікації чи обмеження частоти запитів (або таймаут, схожий на обмеження частоти), OpenClaw позначає його як такий, що перебуває в cooldown, і переходить до наступного профілю.Що потрапляє до кошика обмеження частоти / таймауту
Що потрапляє до кошика обмеження частоти / таймауту
Цей кошик обмеження частоти ширший за звичайний
429: він також містить повідомлення провайдерів, як-от Too many concurrent requests, ThrottlingException, concurrency limit reached, workers_ai ... quota limit exceeded, throttled, resource exhausted, а також періодичні ліміти вікна використання, як-от weekly/monthly limit reached.Помилки формату або некоректного запиту зазвичай є термінальними, бо повторна спроба з тим самим payload завершиться так само, тому OpenClaw показує їх замість перемикання профілів автентифікації. Відомі шляхи повторної спроби з виправленням можуть явно вмикати таку поведінку: наприклад, помилки перевірки ID виклику інструмента Cloud Code Assist очищаються й повторюються один раз через політику allowFormatRetry. OpenAI-сумісні помилки причини зупинки, як-от Unhandled stop reason: error, stop reason: error і reason: error, класифікуються як сигнали таймауту або failover.Узагальнений серверний текст також може потрапити до цього кошика таймаутів, коли джерело відповідає відомому тимчасовому шаблону. Наприклад, просте повідомлення обгортки потоку pi-ai An unknown error occurred вважається вартим failover для кожного провайдера, бо pi-ai видає його, коли потоки провайдера завершуються з stopReason: "aborted" або stopReason: "error" без конкретних деталей. JSON payload-и api_error з тимчасовим серверним текстом, як-от internal server error, unknown error, 520, upstream error або backend error, також вважаються таймаутами, вартими failover.Специфічний для OpenRouter узагальнений текст upstream, як-от просте Provider returned error, вважається таймаутом лише тоді, коли контекст провайдера справді є OpenRouter. Узагальнений внутрішній текст резервного шляху, як-от LLM request failed with an unknown error., залишається консервативним і сам собою не запускає failover.Обмеження SDK retry-after
Обмеження SDK retry-after
Деякі SDK провайдерів інакше можуть очікувати протягом довгого вікна
Retry-After, перш ніж повернути керування OpenClaw. Для SDK на основі Stainless, як-от Anthropic і OpenAI, OpenClaw за замовчуванням обмежує SDK-внутрішні очікування retry-after-ms / retry-after до 60 секунд і негайно показує довші retryable-відповіді, щоб цей шлях failover міг виконатися. Налаштуйте або вимкніть обмеження за допомогою OPENCLAW_SDK_RETRY_MAX_WAIT_SECONDS; див. Поведінка повторних спроб.Cooldown-и, обмежені моделлю
Cooldown-и, обмежені моделлю
Cooldown-и обмеження частоти також можуть бути обмежені моделлю:
- OpenClaw записує
cooldownModelдля помилок обмеження частоти, коли ідентифікатор моделі, що завершилася помилкою, відомий. - Споріднену модель того самого провайдера все ще можна спробувати, коли cooldown обмежено іншою моделлю.
- Вікна billing/вимкнення все одно блокують увесь профіль для всіх моделей.
- 1 хвилина
- 5 хвилин
- 25 хвилин
- 1 година (верхня межа)
auth-state.json у usageStats:
Вимкнення через billing
Помилки billing/кредитів (наприклад, “insufficient credits” / “credit balance too low”) вважаються вартими failover, але зазвичай вони не тимчасові. Замість короткого cooldown OpenClaw позначає профіль як вимкнений (із довшим backoff) і переходить до наступного профілю або провайдера.Не кожна відповідь, схожа на billing, є
402, і не кожен HTTP 402 потрапляє сюди. OpenClaw зберігає явний текст billing у відповідній лінії навіть тоді, коли провайдер натомість повертає 401 або 403, але специфічні для провайдера зіставлення залишаються обмеженими тим провайдером, якому вони належать (наприклад, OpenRouter 403 Key limit exceeded).Тим часом тимчасові помилки вікна використання 402 і лімітів витрат організації/робочого простору класифікуються як rate_limit, коли повідомлення виглядає придатним до повторної спроби (наприклад weekly usage limit exhausted, daily limit reached, resets tomorrow або organization spending limit exceeded). Вони залишаються на короткому шляху періоду очікування/перемикання на резервний варіант замість довгого шляху вимкнення через білінг.auth-state.json:
- Відкладення через білінг починається з 5 годин, подвоюється після кожного збою білінгу й обмежується 24 годинами.
- Лічильники відкладення скидаються, якщо профіль не зазнавав збою протягом 24 годин (налаштовується).
- Повторні спроби при перевантаженні дозволяють 1 ротацію профілю того самого провайдера перед переходом до резервної моделі.
- Повторні спроби при перевантаженні типово використовують відкладення 0 мс.
Резервний перехід моделі
Якщо всі профілі для провайдера зазнають збою, OpenClaw переходить до наступної моделі вagents.defaults.model.fallbacks. Це стосується збоїв автентифікації, лімітів частоти та таймаутів, які вичерпали ротацію профілів (інші помилки не просувають резервний перехід). Помилки провайдера, які не розкривають достатньо деталей, усе одно точно позначаються в стані резервного переходу: empty_response означає, що провайдер не повернув придатного повідомлення або статусу, no_error_details означає, що провайдер явно повернув Unknown error (no error details in response), а unclassified означає, що OpenClaw зберіг сирий попередній перегляд, але жоден класифікатор ще його не зіставив.
Помилки перевантаження та ліміту частоти обробляються агресивніше, ніж періоди очікування білінгу. Типово OpenClaw дозволяє одну повторну спробу з auth-профілем того самого провайдера, а потім без очікування перемикається на наступну налаштовану резервну модель. Сигнали зайнятості провайдера, як-от ModelNotReadyException, потрапляють у цю групу перевантаження. Налаштуйте це за допомогою auth.cooldowns.overloadedProfileRotations, auth.cooldowns.overloadedBackoffMs і auth.cooldowns.rateLimitedProfileRotations.
Коли запуск починається з налаштованої типової основної моделі, основної моделі cron-завдання, основної моделі агента з явними резервними варіантами або автоматично вибраного перевизначення резервного варіанта, OpenClaw може пройти відповідний налаштований ланцюг резервних моделей. Основні моделі агентів без явних резервних варіантів і явні вибори користувача (наприклад /model ollama/qwen3.5:27b, вибір моделі, sessions.patch або одноразові CLI-перевизначення провайдера/моделі) є строгими: якщо цей провайдер/модель недоступний або зазнає збою до створення відповіді, OpenClaw повідомляє про збій замість відповіді від непов’язаної резервної моделі.
Правила ланцюга кандидатів
OpenClaw будує список кандидатів із поточного запитаногоprovider/model плюс налаштовані резервні варіанти.
Rules
Rules
- Запитана модель завжди перша.
- Явно налаштовані резервні варіанти дедуплікуються, але не фільтруються за allowlist моделей. Вони трактуються як явний намір оператора.
- Якщо поточний запуск уже перебуває на налаштованому резервному варіанті в тій самій родині провайдерів, OpenClaw продовжує використовувати повний налаштований ланцюг.
- Коли явне перевизначення резервних варіантів не надано, налаштовані резервні варіанти пробуються перед налаштованою основною моделлю, навіть якщо запитана модель використовує іншого провайдера.
- Коли runner резервного переходу не отримує явного перевизначення резервних варіантів, налаштована основна модель додається в кінець, щоб ланцюг міг повернутися до звичайного типового варіанта після вичерпання попередніх кандидатів.
- Коли викликач надає
fallbacksOverride, runner використовує саме запитану модель плюс цей список перевизначення. Порожній список вимикає резервний перехід моделі й запобігає додаванню налаштованої основної моделі як прихованої цілі повторної спроби.
Які помилки просувають резервний перехід
- Continues on
- Does not continue on
- збої автентифікації
- ліміти частоти й вичерпання періодів очікування
- помилки перевантаження/зайнятості провайдера
- помилки перемикання, схожі на таймаут
- вимкнення через білінг
LiveSessionModelSwitchError, яка нормалізується в шлях перемикання на резервний варіант, щоб застаріла збережена модель не створювала зовнішній цикл повторних спроб- інші нерозпізнані помилки, коли ще залишаються кандидати
Пропуск періоду очікування порівняно з поведінкою проби
Коли всі auth-профілі для провайдера вже перебувають у періоді очікування, OpenClaw не пропускає цього провайдера автоматично назавжди. Він ухвалює рішення для кожного кандидата:Per-candidate decisions
Per-candidate decisions
- Постійні збої автентифікації негайно пропускають увесь провайдер.
- Вимкнення через білінг зазвичай пропускаються, але основного кандидата все одно можна пробувати з обмеженням частоти, щоб відновлення було можливим без перезапуску.
- Основного кандидата можна пробувати близько до завершення періоду очікування, з обмеженням частоти для кожного провайдера.
- Однорівневі резервні варіанти того самого провайдера можна пробувати попри період очікування, коли збій виглядає тимчасовим (
rate_limit,overloadedабо невідомий). Це особливо актуально, коли ліміт частоти діє на рівні моделі, а споріднена модель може відновитися негайно. - Тимчасові проби періоду очікування обмежені однією на провайдера за один запуск резервного переходу, щоб один провайдер не затримував міжпровайдерний резервний перехід.
Перевизначення сесії та живе перемикання моделі
Зміни моделі сесії є спільним станом. Активний runner, команда/model, оновлення Compaction/сесії та узгодження live-сесії читають або записують частини одного й того самого запису сесії.
Це означає, що повторні спроби резервного переходу мають координуватися з живим перемиканням моделі:
- Лише явні зміни моделі, ініційовані користувачем, позначають очікуване live-перемикання. Це включає
/model,session_status(model=...)іsessions.patch. - Зміни моделі, ініційовані системою, як-от ротація резервних варіантів, перевизначення Heartbeat або Compaction, самі по собі ніколи не позначають очікуване live-перемикання.
- Перевизначення моделі, ініційовані користувачем, трактуються як точні вибори для політики резервного переходу, тому недоступний вибраний провайдер показується як збій, а не маскується
agents.defaults.model.fallbacks. - Перед початком повторної спроби резервного переходу reply runner зберігає вибрані поля перевизначення резервного варіанта в записі сесії.
- Автоматичні перевизначення резервного варіанта залишаються вибраними в наступних ходах, щоб OpenClaw не пробував завідомо несправну основну модель у кожному повідомленні.
/new,/resetіsessions.resetочищають автоматично отримані перевизначення та повертають сесію до налаштованого типового варіанта. /statusпоказує вибрану модель і, коли стан резервного переходу відрізняється, активну резервну модель і причину.- Узгодження live-сесії надає перевагу збереженим перевизначенням сесії над застарілими runtime-полями моделі.
- Якщо помилка live-перемикання вказує на пізнішого кандидата в активному ланцюгу резервного переходу, OpenClaw переходить безпосередньо до цієї вибраної моделі, а не спершу обходить непов’язаних кандидатів.
- Якщо спроба резервного переходу зазнає збою, runner відкочує лише ті поля перевизначення, які він записав, і лише якщо вони все ще відповідають цьому невдалому кандидату.
Збережене перевизначення резервного варіанта закриває це вікно, а вузький відкат залишає новіші ручні або runtime-зміни сесії недоторканими.
Спостережуваність і підсумки збоїв
runWithModelFallback(...) записує деталі кожної спроби, які живлять журнали та орієнтовані на користувача повідомлення про періоди очікування:
- провайдер/модель, які пробувалися
- причина (
rate_limit,overloaded,billing,auth,model_not_foundі подібні причини перемикання) - необов’язковий статус/код
- зрозумілий для людини підсумок помилки
model_fallback_decision також містять плоскі поля fallbackStep*, коли кандидат зазнає збою, пропускається або пізніший резервний варіант успішний. Ці поля роблять спробу переходу явною (fallbackStepFromModel, fallbackStepToModel, fallbackStepFromFailureReason, fallbackStepFromFailureDetail, fallbackStepFinalOutcome), щоб експортери журналів і діагностики могли реконструювати збій основної моделі навіть тоді, коли кінцевий резервний варіант також зазнає збою.
Коли всі кандидати зазнають збою, OpenClaw викидає FallbackSummaryError. Зовнішній reply runner може використати це, щоб побудувати конкретніше повідомлення, наприклад “усі моделі тимчасово обмежені лімітом частоти”, і включити найраніший час завершення періоду очікування, якщо він відомий.
Цей підсумок періоду очікування враховує модель:
- непов’язані ліміти частоти на рівні моделі ігноруються для ланцюга провайдер/модель, який пробувався
- якщо залишкове блокування є відповідним лімітом частоти на рівні моделі, OpenClaw повідомляє останній відповідний час завершення, який усе ще блокує цю модель
Пов’язана конфігурація
Див. конфігурацію Gateway для:auth.profiles/auth.orderauth.cooldowns.billingBackoffHours/auth.cooldowns.billingBackoffHoursByProviderauth.cooldowns.billingMaxHours/auth.cooldowns.failureWindowHoursauth.cooldowns.overloadedProfileRotations/auth.cooldowns.overloadedBackoffMsauth.cooldowns.rateLimitedProfileRotationsagents.defaults.model.primary/agents.defaults.model.fallbacks- маршрутизації
agents.defaults.imageModel