Резервний перехід моделей
OpenClaw обробляє збої у два етапи:- Ротація профілів автентифікації в межах поточного провайдера.
- Резервний перехід моделі до наступної моделі в
agents.defaults.model.fallbacks.
Потік виконання під час роботи
Для звичайного текстового запуску OpenClaw оцінює кандидати в такому порядку:- Поточна вибрана модель сеансу.
- Налаштовані
agents.defaults.model.fallbacksу заданому порядку. - Налаштована основна модель наприкінці, якщо запуск почався з перевизначення.
- Визначити активну модель сеансу та пріоритет профілю автентифікації.
- Побудувати ланцюжок кандидатів моделей.
- Спробувати поточний провайдер із правилами ротації/охолодження профілів автентифікації.
- Якщо цей провайдер вичерпано через помилку, що допускає резервний перехід, перейти до наступного кандидата моделі.
- Зберегти вибране перевизначення резервного переходу до початку повторної спроби, щоб інші читачі сеансу бачили того самого провайдера/модель, яких виконавець ось-ось використає.
- Якщо кандидат резервного переходу завершується помилкою, відкотити лише поля перевизначення сеансу, що належать резервному переходу, якщо вони все ще відповідають цьому невдалому кандидату.
- Якщо всі кандидати завершилися помилкою, згенерувати
FallbackSummaryErrorіз деталями для кожної спроби та найближчим часом завершення охолодження, якщо його відомо.
providerOverridemodelOverrideauthProfileOverrideauthProfileOverrideSourceauthProfileOverrideCompactionCount
/model або оновлення ротації сеансу, які
відбулися під час виконання спроби.
Сховище автентифікації (ключі + 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для деяких провайдерів)
ID профілів
Входи OAuth створюють окремі профілі, щоб могли співіснувати кілька облікових записів.- За замовчуванням:
provider:default, якщо email недоступний. - OAuth з email:
provider:<email>(наприклад,google-antigravity:user@gmail.com).
~/.openclaw/agents/<agentId>/agent/auth-profiles.json у розділі profiles.
Порядок ротації
Коли провайдер має кілька профілів, OpenClaw вибирає порядок так:- Явна конфігурація:
auth.order[provider](якщо задано). - Налаштовані профілі:
auth.profiles, відфільтровані за провайдером. - Збережені профілі: записи в
auth-profiles.jsonдля цього провайдера.
- Основний ключ: тип профілю (OAuth перед API-ключами).
- Вторинний ключ:
usageStats.lastUsed(найдавніші першими в межах кожного типу). - Профілі в охолодженні/вимкнені профілі переміщуються в кінець, упорядковані за найближчим завершенням терміну дії.
Закріплення сеансу (сприятливе для кешу)
OpenClaw закріплює вибраний профіль автентифікації за сеансом, щоб підтримувати кеші провайдера активними. Він не виконує ротацію для кожного запиту. Закріплений профіль використовується повторно, доки:- сеанс не скинуто (
/new//reset) - не завершиться компакція (лічильник компакції збільшується)
- профіль не перебуває в охолодженні/не вимкнений
/model …@<profileId> встановлює перевизначення користувача для цього сеансу
і не бере участі в автоматичній ротації, доки не почнеться новий сеанс.
Автоматично закріплені профілі (вибрані маршрутизатором сеансів) розглядаються як пріоритет:
їх пробують першими, але OpenClaw може переключитися на інший профіль у разі лімітів швидкості/тайм-аутів.
Профілі, закріплені користувачем, залишаються прив’язаними до цього профілю; якщо він завершується помилкою і налаштовано резервні переходи моделей,
OpenClaw переходить до наступної моделі замість перемикання профілів.
Чому OAuth може «здаватися втраченим»
Якщо для одного й того самого провайдера у вас є і профіль OAuth, і профіль API-ключа, round‑robin може перемикатися між ними між повідомленнями, якщо вони не закріплені. Щоб примусово використовувати один профіль:- Закріпіть через
auth.order[provider] = ["provider:profileId"], або - Використовуйте перевизначення для окремого сеансу через
/model …із перевизначенням профілю (якщо це підтримує ваш UI/поверхня чату).
Періоди охолодження
Коли профіль завершується помилкою через помилки автентифікації/ліміту швидкості (або тайм-аут, схожий на обмеження швидкості), OpenClaw позначає його як такий, що перебуває в охолодженні, і переходить до наступного профілю. Ця категорія обмежень швидкості ширша за звичайний429: вона також включає повідомлення
провайдерів, такі як Too many concurrent requests, ThrottlingException,
concurrency limit reached, workers_ai ... quota limit exceeded,
throttled, resource exhausted і періодичні обмеження вікон використання, такі як
weekly/monthly limit reached.
Помилки формату/некоректного запиту (наприклад, помилки валідації ID виклику інструмента Cloud Code Assist)
вважаються такими, що допускають резервний перехід, і використовують ті самі періоди охолодження.
Сумісні з OpenAI помилки причини зупинки, такі як Unhandled stop reason: error,
stop reason: error і reason: error, класифікуються як сигнали
тайм-ауту/резервного переходу.
Загальний текст серверних помилок на рівні провайдера також може потрапляти до цієї категорії тайм-аутів, коли
джерело відповідає відомому тимчасовому шаблону. Наприклад, у Anthropic просте
An unknown error occurred і JSON-повідомлення api_error із тимчасовим серверним
текстом, таким як internal server error, unknown error, 520, upstream error,
або backend error, вважаються такими, що допускають резервний перехід через тайм-аут. Специфічний для OpenRouter
загальний upstream-текст, такий як просте Provider returned error, також розглядається як
тайм-аут, але лише тоді, коли контекст провайдера справді OpenRouter. Загальний внутрішній
резервний текст, такий як LLM request failed with an unknown error., залишається
консервативним і сам по собі не запускає резервний перехід.
Періоди охолодження через ліміти швидкості також можуть бути прив’язані до моделі:
- OpenClaw записує
cooldownModelдля збоїв через ліміти швидкості, коли відомо ID моделі, що завершилася помилкою. - Споріднена модель у того самого провайдера все ще може бути випробувана, коли охолодження прив’язане до іншої моделі.
- Вікна білінгу/вимкнення, як і раніше, блокують увесь профіль для всіх моделей.
- 1 хвилина
- 5 хвилин
- 25 хвилин
- 1 година (максимум)
auth-state.json у розділі usageStats:
Вимкнення через білінг
Збої через білінг/кредити (наприклад, «недостатньо кредитів» / «занадто низький баланс кредитів») вважаються такими, що допускають резервний перехід, але зазвичай вони не є тимчасовими. Замість короткого періоду охолодження 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).
Вони залишаються на шляху короткого охолодження/резервного переходу замість довгого
шляху вимкнення через білінг.
Стан зберігається в auth-state.json:
- Інтервал зворотного відліку для білінгу починається з 5 годин, подвоюється з кожним збоєм через білінг і обмежується 24 годинами.
- Лічильники зворотного відліку скидаються, якщо профіль не зазнавав збоїв протягом 24 годин (налаштовується).
- Повторні спроби при перевантаженні допускають 1 ротацію профілю того самого провайдера перед резервним переходом моделі.
- Повторні спроби при перевантаженні за замовчуванням використовують інтервал зворотного відліку 0 мс.
Резервний перехід моделі
Якщо всі профілі для провайдера завершилися помилкою, OpenClaw переходить до наступної моделі вagents.defaults.model.fallbacks. Це стосується помилок автентифікації, лімітів швидкості та
тайм-аутів, які вичерпали ротацію профілів (інші помилки не просувають резервний перехід).
Помилки перевантаження та ліміту швидкості обробляються агресивніше, ніж періоди охолодження через білінг.
За замовчуванням OpenClaw дозволяє одну повторну спробу з іншим профілем автентифікації в того самого провайдера,
а потім без очікування перемикається на наступну налаштовану резервну модель.
Сигнали зайнятості провайдера, такі як ModelNotReadyException, належать до цієї категорії перевантаження.
Налаштуйте це за допомогою auth.cooldowns.overloadedProfileRotations,
auth.cooldowns.overloadedBackoffMs і
auth.cooldowns.rateLimitedProfileRotations.
Коли запуск починається з перевизначення моделі (hooks або CLI), резервні переходи все одно завершуються на
agents.defaults.model.primary після спроб усіх налаштованих резервних варіантів.
Правила ланцюжка кандидатів
OpenClaw будує список кандидатів із поточного запитаногоprovider/model
та налаштованих резервних варіантів.
Правила:
- Запитана модель завжди перша.
- Явно налаштовані резервні варіанти дедуплікуються, але не фільтруються за списком дозволених моделей. Вони розглядаються як явний намір оператора.
- Якщо поточний запуск уже використовує налаштований резервний варіант у тому самому сімействі провайдерів, OpenClaw продовжує використовувати весь налаштований ланцюжок.
- Якщо поточний запуск використовує іншого провайдера, ніж у конфігурації, і ця поточна модель ще не є частиною налаштованого ланцюжка резервних варіантів, OpenClaw не додає непов’язані налаштовані резервні варіанти від іншого провайдера.
- Коли запуск почався з перевизначення, налаштована основна модель додається в кінець, щоб ланцюжок міг повернутися до звичайного значення за замовчуванням після вичерпання попередніх кандидатів.
Які помилки просувають резервний перехід
Резервний перехід моделі продовжується за таких умов:- збої автентифікації
- ліміти швидкості та вичерпання періоду охолодження
- помилки перевантаження/зайнятості провайдера
- помилки резервного переходу, схожі на тайм-аут
- вимкнення через білінг
LiveSessionModelSwitchError, яка нормалізується до шляху резервного переходу, щоб застаріла збережена модель не створювала зовнішній цикл повторних спроб- інші нерозпізнані помилки, коли ще залишаються кандидати
- явні переривання, які не мають форми тайм-ауту/резервного переходу
- помилки переповнення контексту, які мають залишатися в межах логіки компакції/повторної спроби
(наприклад,
request_too_large,INVALID_ARGUMENT: input exceeds the maximum number of tokens,input token count exceeds the maximum number of input tokens,The input is too long for the modelабоollama error: context length exceeded) - фінальна невідома помилка, коли кандидатів більше не залишилося
Поведінка пропуску через охолодження та пробних спроб
Коли всі профілі автентифікації для провайдера вже перебувають в охолодженні, OpenClaw не пропускає цього провайдера автоматично назавжди. Він ухвалює рішення для кожного кандидата окремо:- Стійкі збої автентифікації відразу пропускають увесь провайдер.
- Вимкнення через білінг зазвичай пропускаються, але основного кандидата все одно можна пробно перевірити із обмеженням частоти, щоб відновлення було можливим без перезапуску.
- Основного кандидата можна пробно перевірити ближче до завершення періоду охолодження, з обмеженням частоти для кожного провайдера.
- Резервні споріднені моделі того самого провайдера можна пробувати попри охолодження, коли
збій виглядає тимчасовим (
rate_limit,overloadedабо невідомий). Це особливо важливо, коли обмеження швидкості прив’язане до моделі, а споріднена модель може все ще відновитися негайно. - Тимчасові пробні спроби під час охолодження обмежуються однією на провайдера за один запуск резервного переходу, щоб один провайдер не затримував міжпровайдерний резервний перехід.
Перевизначення сеансу та живе перемикання моделі
Зміни моделі сеансу — це спільний стан. Активний виконавець, команда/model,
оновлення компакції/сеансу та узгодження живого сеансу читають або записують
частини одного й того самого запису сеансу.
Це означає, що повторні спроби резервного переходу мають узгоджуватися з живим перемиканням моделі:
- Лише явні зміни моделі, ініційовані користувачем, позначають очікуване живе перемикання. Це
включає
/model,session_status(model=...)іsessions.patch. - Зміни моделі, ініційовані системою, такі як ротація резервного переходу, перевизначення heartbeat або компакція, самі по собі ніколи не позначають очікуване живе перемикання.
- Перш ніж почнеться повторна спроба резервного переходу, виконавець відповідей зберігає вибрані поля перевизначення резервного переходу в запис сеансу.
- Узгодження живого сеансу віддає перевагу збереженим перевизначенням сеансу перед застарілими полями моделі під час виконання.
- Якщо спроба резервного переходу завершується помилкою, виконавець відкочує лише ті поля перевизначення, які він записав, і лише якщо вони все ще відповідають цьому невдалому кандидату.
- Основний варіант завершується помилкою.
- Кандидат резервного переходу вибирається в пам’яті.
- Сховище сеансу все ще вказує старий основний варіант.
- Узгодження живого сеансу читає застарілий стан сеансу.
- Повторна спроба повертається до старої моделі ще до початку спроби резервного переходу.
Спостережуваність і зведення помилок
runWithModelFallback(...) записує деталі кожної спроби, які використовуються для журналів і
повідомлень для користувача про період охолодження:
- спроба
provider/model - причина (
rate_limit,overloaded,billing,auth,model_not_foundта подібні причини резервного переходу) - необов’язковий status/code
- зрозуміле людині зведення помилки
FallbackSummaryError. Зовнішній
виконавець відповідей може використати це для побудови точнішого повідомлення, наприклад «усі моделі
тимчасово обмежені за швидкістю», і включити найближчий час завершення періоду охолодження, якщо його відомо.
Це зведення про охолодження враховує модель:
- не пов’язані з поточним ланцюжком
provider/modelобмеження швидкості, прив’язані до моделі, ігноруються - якщо блокування, що залишилося, є відповідним обмеженням швидкості, прив’язаним до моделі, 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