- Ротація профілю автентифікації в межах поточного провайдера.
- Перехід на резервну модель до наступної моделі в
agents.defaults.model.fallbacks.
Потік виконання
Для звичайного текстового запуску OpenClaw оцінює кандидатів у такому порядку:Побудова ланцюжка кандидатів
Побудувати ланцюжок кандидатів моделей з поточного вибору моделі та політики резервного переходу для джерела цього вибору. Налаштовані типові значення, основні моделі cron-завдань і автоматично вибрані резервні моделі можуть використовувати налаштовані резервні варіанти; явні вибори користувача в сесії є суворими.
Спроба з поточним провайдером
Спробувати поточного провайдера з правилами ротації/періоду очікування профілів автентифікації.
Перехід у разі помилок, придатних для failover
Якщо цей провайдер вичерпано з помилкою, придатною для failover, перейти до наступного кандидата моделі.
Збереження резервного перевизначення
Зберегти вибране резервне перевизначення до початку повторної спроби, щоб інші читачі сесії бачили того самого провайдера/модель, які runner збирається використати. Збережене перевизначення моделі позначається як
modelOverrideSource: "auto".Вузький відкат у разі збою
Якщо резервний кандидат зазнає збою, відкотити лише поля перевизначення сесії, що належать резервному механізму, коли вони все ще відповідають цьому невдалому кандидату.
providerOverridemodelOverridemodelOverrideSourceauthProfileOverrideauthProfileOverrideSourceauthProfileOverrideCompactionCount
/model або оновлення ротації сесії, що сталися під час виконання спроби.
Політика джерела вибору
OpenClaw відокремлює вибраного провайдера/модель від причини вибору. Це джерело визначає, чи дозволено ланцюжок резервного переходу:- Налаштоване типове значення:
agents.defaults.model.primaryвикористовуєagents.defaults.model.fallbacks. - Основна модель агента:
agents.list[].modelє суворою, якщо об’єкт моделі цього агента не містить власнихfallbacks. Використайтеfallbacks: [], щоб зробити сувору поведінку явною, або надайте непорожній список, щоб увімкнути для цього агента перехід на резервну модель. - Автоматичне резервне перевизначення: резервний перехід під час виконання записує
providerOverride,modelOverride,modelOverrideSource: "auto"і вибрану вихідну модель перед повторною спробою. Це автоматичне перевизначення може продовжувати рухатися налаштованим ланцюжком резервних моделей без перевірки основної моделі для кожного повідомлення, але OpenClaw періодично знову перевіряє налаштоване джерело й очищає автоматичне перевизначення після його відновлення./new,/resetіsessions.resetтакож очищають перевизначення з автоматичним джерелом. Запуски Heartbeat без явногоheartbeat.modelочищають прямі автоматичні перевизначення, коли їхнє джерело більше не відповідає поточному налаштованому типовому значенню. - Користувацьке перевизначення сесії:
/model, засіб вибору моделі,session_status(model=...)іsessions.patchзаписуютьmodelOverrideSource: "user". Це точний вибір сесії. Якщо вибраний провайдер/модель зазнає збою до створення відповіді, OpenClaw повідомляє про збій замість відповіді від непов’язаної налаштованої резервної моделі. - Застаріле перевизначення сесії: старіші записи сесій можуть мати
modelOverrideбезmodelOverrideSource. OpenClaw розглядає їх як користувацькі перевизначення, щоб явний старий вибір не був непомітно перетворений на поведінку резервного переходу. - Модель у payload Cron:
payload.model/--modelcron-завдання є основною моделлю завдання, а не користувацьким перевизначенням сесії. Вона використовує налаштовані резервні варіанти, якщо завдання не надаєpayload.fallbacks;payload.fallbacks: []робить cron-запуск суворим.
Кеш пропуску збоїв автентифікації
За замовчуванням кожен новий хід зберігає наявну поведінку повторних спроб резервного переходу: OpenClaw знову спробує кожного налаштованого резервного кандидата, включно з неосновними кандидатами, які нещодавно зазнали збою зauth або auth_permanent.
Оператори, які хочуть приглушити такі повторні збої автентифікації, можуть увімкнути це за допомогою:
0 або невстановлене значення вимикає кеш.
Додатні значення обмежуються діапазоном від 1 секунди до 10 хвилин.
Видимі для користувача сповіщення про резервний перехід
Коли сесія переходить на автоматично вибрану резервну модель, OpenClaw надсилає сповіщення про стан у тій самій поверхні відповіді:Сховище автентифікації (ключі + 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.
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-agent.sqlite окремого агента.
Порядок ротації
Коли провайдер має кілька профілів, OpenClaw вибирає порядок так:
Якщо явний порядок не налаштовано, OpenClaw використовує порядок round-robin:
- Основний ключ: тип профілю (OAuth перед API-ключами).
- Вторинний ключ:
usageStats.lastUsed(найстаріші спочатку, в межах кожного типу). - Профілі в періоді очікування/вимкнені профілі переміщуються в кінець, упорядковані за найближчим завершенням періоду.
Фіксація сесії (дружня до кешу)
OpenClaw закріплює вибраний профіль автентифікації за сесією, щоб кеші провайдера залишалися прогрітими. Він не ротатує профіль для кожного запиту. Закріплений профіль повторно використовується, доки:- сесію не скинуто (
/new//reset) - не завершиться Compaction (лічильник Compaction збільшується)
- профіль перебуває в періоді очікування/вимкнений
/model …@<profileId> встановлює користувацьке перевизначення для цієї сесії та не ротатується автоматично до початку нової сесії.
Автоматично закріплені профілі (вибрані маршрутизатором сесії) розглядаються як перевага: їх пробують першими, але OpenClaw може перейти до іншого профілю в разі rate limit або timeout. Коли початковий профіль знову стає доступним, нові запуски можуть знову віддати йому перевагу без зміни вибраної моделі чи runtime. Закріплені користувачем профілі залишаються прив’язаними до цього профілю; якщо він зазнає збою і налаштовано резервні моделі, OpenClaw переходить до наступної моделі замість перемикання профілів.
Підписка OpenAI Codex плюс резервний API-ключ
Для агентних моделей OpenAI автентифікація та runtime є окремими.openai/gpt-* залишається на
Codex harness, тоді як автентифікація може ротуватися між профілем підписки Codex і
резервним API-ключем OpenAI.
Використовуйте auth.order.openai для порядку, видимого користувачу:
openai:* і для профілів OAuth ChatGPT/Codex, і для профілів
API-ключів OpenAI. Коли підписка досягає ліміту використання Codex,
OpenClaw записує точний час скидання, якщо Codex його надає, пробує наступний
упорядкований профіль автентифікації та залишає запуск усередині Codex harness. Після проходження часу
скидання профіль підписки знову придатний, і наступний автоматичний
вибір може повернутися до нього.
Використовуйте закріплений користувачем профіль лише тоді, коли потрібно примусово використовувати один обліковий запис/ключ для цієї
сесії. Закріплені користувачем профілі навмисно суворі й не перемикаються непомітно
на інший профіль.
Періоди очікування
Коли профіль зазнає збою через помилки автентифікації/rate-limit (або timeout, схожий на rate limiting), OpenClaw позначає його як такий, що перебуває в періоді очікування, і переходить до наступного профілю.Що потрапляє до кошика rate-limit / timeout
Що потрапляє до кошика rate-limit / timeout
Цей кошик rate-limit ширший за звичайний
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-сумісні помилки stop-reason, як-от Unhandled stop reason: error, stop reason: error і reason: error, класифікуються як сигнали timeout/failover.Загальний серверний текст також може потрапити до цього кошика timeout, коли джерело відповідає відомому тимчасовому шаблону. Наприклад, просте повідомлення обгортки потоку runtime моделі An unknown error occurred вважається придатним для failover для кожного провайдера, бо спільний runtime моделі видає його, коли потоки провайдера завершуються з stopReason: "aborted" або stopReason: "error" без конкретних деталей. JSON-payload api_error з тимчасовим серверним текстом, як-от internal server error, unknown error, 520, upstream error або backend error, також вважаються timeout, придатними для failover.Загальний upstream-текст, специфічний для OpenRouter, як-от просте Provider returned error, вважається timeout лише тоді, коли контекст провайдера справді є 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 секундами й одразу показує довші повторювані відповіді, щоб цей шлях резервного перемикання міг виконатися. Налаштуйте або вимкніть це обмеження за допомогою OPENCLAW_SDK_RETRY_MAX_WAIT_SECONDS; див. Поведінка повторних спроб.Періоди охолодження на рівні моделі
Періоди охолодження на рівні моделі
Періоди охолодження для обмеження частоти також можуть бути прив’язані до моделі:
- OpenClaw записує
cooldownModelдля збоїв через обмеження частоти, коли відомий ідентифікатор моделі, що зазнала збою. - Споріднену модель у того самого провайдера все ще можна спробувати, коли період охолодження прив’язаний до іншої моделі.
- Вікна білінгу/вимкнення все ще блокують увесь профіль для всіх моделей.
- 1 хвилина
- 5 хвилин
- 25 хвилин
- 1 година (обмеження)
usageStats:
Вимкнення через білінг
Збої білінгу/кредитів (наприклад, “insufficient credits” / “credit balance too low”) вважаються придатними для резервного перемикання, але зазвичай вони не є тимчасовими. Замість короткого періоду охолодження OpenClaw позначає профіль як вимкнений (із довшим відкладенням) і переходить до наступного профілю/провайдера.Не кожна відповідь, схожа на білінгову, є
402, і не кожен HTTP 402 потрапляє сюди. OpenClaw зберігає явний білінговий текст у білінговій гілці навіть тоді, коли провайдер натомість повертає 401 або 403, але специфічні для провайдера зіставлення залишаються обмеженими тим провайдером, якому вони належать (наприклад, OpenRouter 403 Key limit exceeded).Водночас тимчасові помилки 402, пов’язані з вікном використання та лімітами витрат організації/робочого простору, класифікуються як rate_limit, коли повідомлення виглядає придатним для повторної спроби (наприклад, weekly usage limit exhausted, daily limit reached, resets tomorrow або organization spending limit exceeded). Вони залишаються на короткому шляху охолодження/резервного перемикання замість довгого шляху вимкнення через білінг.- Відкладення через білінг починається з 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 дозволяє одну повторну спробу профілю автентифікації того самого провайдера, а потім без очікування перемикається на наступну налаштовану резервну модель. Сигнали зайнятості провайдера, такі як ModelNotReadyException, потрапляють у цей кошик перевантаження. Налаштуйте це за допомогою auth.cooldowns.overloadedProfileRotations, auth.cooldowns.overloadedBackoffMs і auth.cooldowns.rateLimitedProfileRotations.
Коли запуск починається з налаштованої основної моделі за замовчуванням, основної моделі Cron-завдання, основної моделі агента з явними резервними варіантами або автоматично вибраного перевизначення резервного варіанта, OpenClaw може пройти відповідний налаштований ланцюжок резервних варіантів. Основні моделі агентів без явних резервних варіантів і явні вибори користувача (наприклад, /model ollama/qwen3.5:27b, вибір моделі, sessions.patch або одноразові перевизначення провайдера/моделі CLI) є строгими: якщо цей провайдер/модель недоступні або зазнають збою до створення відповіді, OpenClaw повідомляє про збій замість того, щоб відповідати з непов’язаного резервного варіанта.
Правила ланцюжка кандидатів
OpenClaw будує список кандидатів із поточного запитаногоprovider/model плюс налаштованих резервних варіантів.
Правила
Правила
- Запитана модель завжди перша.
- Явно налаштовані резервні варіанти дедуплікуються, але не фільтруються за списком дозволених моделей. Вони вважаються явним наміром оператора.
- Якщо поточний запуск уже використовує налаштований резервний варіант у тій самій родині провайдерів, OpenClaw продовжує використовувати повний налаштований ланцюжок.
- Коли явне перевизначення резервного варіанта не надано, налаштовані резервні варіанти пробуються перед налаштованою основною моделлю, навіть якщо запитана модель використовує іншого провайдера.
- Коли явне перевизначення резервного варіанта не надано runner резервного переходу, налаштована основна модель додається в кінець, щоб ланцюжок міг повернутися до нормального типового значення після вичерпання попередніх кандидатів.
- Коли викликач надає
fallbacksOverride, runner використовує рівно запитану модель плюс цей список перевизначення. Порожній список вимикає резервний перехід моделі й не дає додати налаштовану основну модель як приховану ціль повторної спроби.
Які помилки просувають резервний перехід
- Продовжує після
- Не продовжує після
- збоїв автентифікації
- обмежень частоти та вичерпання періоду охолодження
- помилок перевантаження/зайнятості провайдера
- помилок резервного перемикання у формі тайм-ауту
- вимкнень через білінг
LiveSessionModelSwitchError, яка нормалізується в шлях резервного перемикання, щоб застаріла збережена модель не створювала зовнішній цикл повторних спроб- інших нерозпізнаних помилок, коли ще залишаються кандидати
Пропуск періоду охолодження і поведінка перевірки
Коли кожен профіль автентифікації для провайдера вже перебуває в періоді охолодження, OpenClaw не пропускає цього провайдера автоматично назавжди. Він ухвалює рішення для кожного кандидата:Рішення для кожного кандидата
Рішення для кожного кандидата
- Стійкі збої автентифікації негайно пропускають увесь провайдер.
- Вимкнення через білінг зазвичай пропускаються, але основного кандидата все ще можна перевіряти з обмеженням частоти, щоб відновлення було можливим без перезапуску.
- Основного кандидата можна перевіряти ближче до завершення періоду охолодження, з обмеженням частоти для кожного провайдера.
- Споріднені резервні варіанти того самого провайдера можна спробувати попри період охолодження, коли збій виглядає тимчасовим (
rate_limit,overloadedабо невідомий). Це особливо важливо, коли обмеження частоти прив’язане до моделі, а споріднена модель може відновитися негайно. - Тимчасові перевірки періоду охолодження обмежені однією на провайдера для кожного запуску резервного переходу, щоб один провайдер не затримував резервний перехід між провайдерами.
Перевизначення сесії та живе перемикання моделі
Зміни моделі сесії є спільним станом. Активний runner, команда/model, оновлення Compaction/сесії та узгодження живої сесії читають або записують частини одного й того самого запису сесії.
Це означає, що повторні спроби резервного переходу мають координуватися з живим перемиканням моделі:
- Лише явні зміни моделі, ініційовані користувачем, позначають очікуване живе перемикання. Це включає
/model,session_status(model=...)іsessions.patch. - Системні зміни моделі, такі як ротація резервних варіантів, перевизначення Heartbeat або Compaction, самі по собі ніколи не позначають очікуване живе перемикання.
- Перевизначення моделі, ініційовані користувачем, вважаються точними виборами для політики резервного переходу, тому недоступний вибраний провайдер показується як збій, а не маскується
agents.defaults.model.fallbacks. - Перед початком повторної спроби резервного переходу runner відповіді зберігає вибрані поля перевизначення резервного варіанта в записі сесії.
- Автоматичні перевизначення резервного варіанта залишаються вибраними в наступних ходах, щоб OpenClaw не перевіряв відому несправну основну модель у кожному повідомленні. OpenClaw періодично знову перевіряє налаштоване джерело та очищає автоматичне перевизначення, коли воно відновлюється;
/new,/resetіsessions.resetнегайно очищають перевизначення з автоматичного джерела. - Відповіді користувачу оголошують переходи до резервного варіанта та відновлення після очищення резервного варіанта один раз на зміну стану. Ходи з липким резервним варіантом не повторюють сповіщення.
/statusпоказує вибрану модель і, коли стан резервного переходу відрізняється, активну резервну модель і причину.- Узгодження живої сесії надає перевагу збереженим перевизначенням сесії над застарілими полями моделі runtime.
- Якщо помилка живого перемикання вказує на пізнішого кандидата в активному ланцюжку резервних варіантів, OpenClaw переходить безпосередньо до цієї вибраної моделі замість того, щоб спершу проходити непов’язаних кандидатів.
- Якщо спроба резервного переходу зазнає збою, runner відкочує лише ті поля перевизначення, які він записав, і лише якщо вони все ще відповідають цьому невдалому кандидату.
Сховище сесії все ще вказує стару основну модель
Сховище сесії все ще відображає стару основну модель.
Спостережуваність і підсумки збоїв
runWithModelFallback(...) записує деталі кожної спроби, які живлять журнали та користувацькі повідомлення про період охолодження:
- спробуваний провайдер/модель
- причина (
rate_limit,overloaded,billing,auth,model_not_foundі подібні причини резервного перемикання) - необов’язковий статус/код
- зрозумілий людині підсумок помилки
model_fallback_decision також містять плоскі поля fallbackStep*, коли кандидат зазнає збою, пропускається або пізніший резервний варіант успішний. Ці поля роблять спробу переходу явною (fallbackStepFromModel, fallbackStepToModel, fallbackStepFromFailureReason, fallbackStepFromFailureDetail, fallbackStepFinalOutcome), щоб експортери журналів і діагностики могли відтворити збій основної моделі навіть тоді, коли кінцевий резервний варіант також зазнає збою.
Коли всі кандидати зазнають збою, OpenClaw викидає FallbackSummaryError. Зовнішній runner відповіді може використати це, щоб побудувати конкретніше повідомлення, наприклад “all models are temporarily rate-limited”, і включити найближче завершення періоду охолодження, коли воно відоме.
Цей підсумок періоду охолодження враховує модель:
- непов’язані обмеження частоти на рівні моделі ігноруються для спробуваного ланцюжка провайдер/модель
- якщо залишкове блокування є відповідним обмеженням частоти на рівні моделі, 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