Skip to main content

openclaw doctor

Перевірки працездатності та швидкі виправлення для Gateway, каналів, плагінів, навичок, маршрутизації моделей, локального стану й міграцій конфігурації. Використовуйте цю команду, коли щось працює не так, як очікується, і потрібно однією командою з’ясувати причину. Пов’язані матеріали:

Режими

Doctor має п’ять режимів: Віддавайте перевагу --lint, коли автоматизації потрібен стабільний результат. Віддавайте перевагу --fix, коли оператор хоче, щоб doctor змінив конфігурацію або стан.

Приклади

Для дозволів, специфічних для каналу, замість doctor використовуйте зондування каналів:
channels capabilities повідомляє фактичні дозволи бота для конкретного цільового каналу. channels status --probe перевіряє всі налаштовані канали та цілі автоматичного приєднання до голосових каналів.

Параметри

--severity-min, --all, --only і --skip приймаються лише разом із --lint; --json приймається з --lint, --post-upgrade, --state-sqlite і --session-sqlite.

Режим лінтингу

openclaw doctor --lint працює лише для читання: без запитів, виправлень і перезапису конфігурації чи стану.
Вивід для людини стислий:
Вивід JSON — це інтерфейс для сценаріїв:
Коди завершення: --severity-min визначає як результати, що виводяться, так і поріг завершення: openclaw doctor --lint --severity-min error може нічого не вивести й завершитися з кодом 0, навіть якщо наявні результати нижчого рівня серйозності info/warning. --all визначає, які перевірки вибираються до фільтрування за рівнем серйозності. Стандартний запуск лінтингу виключає глибокі й історичні перевірки, а також перевірки, що частіше виявляють застарілі залишки, які можна виправити; використовуйте --all для повного переліку. --only <id> — найточніший селектор, який може запускати будь-яку зареєстровану перевірку за ідентифікатором. core/doctor/local-audio-acceleration повідомляє автоматично вибрану локальну команду STT, окремі свідчення щодо придатного, запитаного й виявленого бекендів, а також порядок резервних варіантів без завантаження моделі розпізнавання мовлення. Вона створює інформаційний результат, тому для його відображення додайте --severity-min info.

Структуровані перевірки працездатності

Сучасні перевірки doctor використовують невеликий розділений контракт:
detect() забезпечує роботу doctor --lint. repair() необов’язковий і запускається лише за doctor --fix / doctor --repair. Перевірки, які ще не перенесено на цю структуру, досі використовують застарілий механізм внесків doctor. Контексти виправлення можуть містити запити dryRun/diff; результати виправлення можуть повертати структуровані diffs (зміни конфігурації або файлів) і effects (побічні ефекти для служб, процесів, пакетів, стану тощо), тому перетворені перевірки можуть розвиватися в напрямку doctor --fix --dry-run, не переносячи планування змін у detect(). repair() повідомляє status: "repaired" | "skipped" | "failed" (якщо статус пропущено, мається на увазі repaired). Коли виправлення повертає skipped або failed, doctor повідомляє причину та пропускає перевірку для цієї діагностики. Після успішного виправлення doctor повторно запускає detect() лише для виправлених результатів; якщо проблему все ще виявлено, doctor повідомляє попередження про виправлення, а не вважає зміну завершеною. Результат перевірки містить: Модернізовані основні перевірки doctor залишаються прив’язаними до впорядкованого внеску doctor, якому належить їхня поведінка doctor / doctor --fix для користувача. Спільний структурований реєстр стану системи є точкою розширення: вбудовані перевірки та перевірки на основі Plugin виконуються після основних перевірок doctor, щойно пакети-власники зареєструють їх в активному шляху команди. openclaw/plugin-sdk/health надає той самий контракт авторам Plugin.

Вибір перевірок

--only та --skip приймають повні ідентифікатори перевірок і можуть бути вказані кілька разів. Якщо ідентифікатор --only не зареєстровано, для нього не виконується жодна перевірка; скористайтеся checksRun/checksSkipped у виводі, щоб підтвердити, що цільовий шлюз вибирає очікувані перевірки.

Режим після оновлення

openclaw doctor --post-upgrade запускає перевірки сумісності Plugin для послідовного виконання після збирання або оновлення. Результати виводяться у stdout; код завершення дорівнює 1, якщо будь-який результат має level: "error". Додайте --json для машинозчитуваної оболонки ({ probesRun, findings }), придатної для CI, спільнотного вміння fork-upgrade та інших засобів швидкої перевірки після оновлення. Якщо індекс установлених Plugin відсутній або має неправильний формат, режим JSON усе одно виводить оболонку з результатом помилки plugin.index_unavailable. Запуск образу контейнера є винятком зі звичайного процесу «запустити doctor після оновлення». Коли openclaw gateway run запускається з новою версією OpenClaw, він виконує безпечні виправлення стану та Plugin, перш ніж повідомити про готовність. Якщо виправлення неможливо безпечно завершити, запуск припиняється з указівкою один раз запустити той самий образ із openclaw doctor --fix для того самого змонтованого стану/конфігурації, перш ніж перезапустити контейнер у звичайному режимі.

Compaction спільного стану SQLite

openclaw doctor --state-sqlite compact — це явне автономне обслуговування канонічної бази даних спільного стану за адресою <state-dir>/state/openclaw.sqlite. Команда не приймає довільний шлях до бази даних, ніколи не викликається під час звичайної роботи Gateway і не є частиною openclaw doctor --fix. Команда отримує те саме блокування володіння станом, що й запуск Gateway, і утримує його під час перевірки, створення контрольної точки, VACUUM та остаточних перевірок цілісності. Вона відмовляється виконуватися, поки Gateway або інша команда обслуговування SQLite володіє цим блокуванням. Блокування стану залишається активним, коли OPENCLAW_ALLOW_MULTI_GATEWAY=1 пропускає окремий екземпляр Gateway для кожної конфігурації, тож оболонці оператора не потрібно успадковувати середовище служби Gateway, щоб виявити її під час обслуговування. Спочатку зупиніть Gateway і створіть перевірену резервну копію:
Команда:
  1. Вимагає звичайний файл за канонічним шляхом спільного стану. Відсутню базу даних позначено як skipped, і команда успішно завершує роботу.
  2. Перевіряє поточну підтримувану версію схеми та schema_meta.role = "global" перед створенням контрольної точки або зміною файлу.
  3. Вимагає, щоб wal_checkpoint(TRUNCATE) не був зайнятий. Зупиніть усі інші процеси OpenClaw і повторіть спробу, якщо контрольна точка зайнята.
  4. Установлює auto_vacuum у INCREMENTAL, повністю виконує VACUUM і знову створює контрольну точку.
  5. Виконує quick_check, integrity_check та foreign_key_check, а потім повторно застосовує дозволи лише для власника до бази даних і бічних файлів SQLite.
У виводі JSON зазначено розміри бази даних і WAL, кількість сторінок у списку вільних сторінок, розмір сторінки та значення auto_vacuum до й після Compaction, а також кількість звільнених байтів і результати quick_check та integrity_check. foreign_key_check застосовується за принципом безпечної відмови та не має окремого поля успішності. SQLite повідомляє auto_vacuum як 0 для відсутнього, 1 для повного та 2 для інкрементного режиму. Compaction завершується невдало без змін, якщо схема застаріла, новіша за запущену збірку OpenClaw або належить базі даних агента. Спочатку запустіть openclaw doctor --fix для застарілої схеми спільного стану. Відновіть сумісну резервну копію або оновіть OpenClaw для новішої схеми.

Міграція SQLite сеансів

OpenClaw автоматично імпортує застарілі рядки сеансів та історію транскриптів до бази даних SQLite кожного агента під час запуску Gateway та під час openclaw doctor --fix. openclaw doctor --session-sqlite <mode> — це цільовий засіб перевірки та валідації цієї міграції. Поточні рядки сеансів середовища виконання зберігаються в ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite. Застарілі файли sessions.json є джерелами міграції. Активні файли транскриптів JSONL імпортуються та переміщуються до архіву за межі активного каталогу сеансів після успішного імпорту; архівні файли JSONL залишаються артефактами підтримки, а не резервними джерелами середовища виконання. Режими: Селектори:
  • Типово: налаштоване сховище агента за замовчуванням, якщо файл цього застарілого сховища існує.
  • --session-sqlite-agent <id>: один налаштований агент.
  • --session-sqlite-all-agents: налаштовані та виявлені сховища агентів.
  • --session-sqlite-store <path>: один явно вказаний застарілий шлях sessions.json.
Послідовність ручної перевірки:
Створіть резервну копію каталогу стану OpenClaw перед запуском import в інсталяції з важливою історією. validate завершується з ненульовим кодом, якщо вибраний застарілий запис відсутній у SQLite, ідентифікатор сеансу відрізняється або кількість подій транскрипту відрізняється. Під час використання --session-sqlite-store <path> переконайтеся, що звіт містить очікувану кількість цілей; явно вказаний неіснуючий шлях до сховища не вибирає жодної цілі. Після видалення SQLite спочатку звільняє сторінки всередині бази даних; це не обов’язково негайно зменшує файл бази даних. Після видалення або архівування великих транскриптів запустіть openclaw doctor --session-sqlite compact --session-sqlite-all-agents, щоб створити контрольні точки файлів WAL, виконати VACUUM і повідомити розміри бази даних та WAL до й після операції. Для Compaction потрібен звичайний файл із поточною схемою агента, стійкими метаданими власника вибраного агента та без відкритого дескриптора в процесі doctor. Деструктивні режими import, compact, recover та restore утримують те саме блокування володіння станом, що й запуск Gateway, протягом усієї операції; inspect, dry-run та validate залишаються лише для читання й не отримують його. Спочатку зупиніть Gateway. Деструктивні режими завершуються невдало замість конфлікту з активними операціями запису або іншою командою обслуговування. Ціль деструктивного режиму --session-sqlite-store має бути всередині активного каталогу стану; установіть OPENCLAW_STATE_DIR у каталог стану, якому належить сховище, перш ніж обслуговувати іншу інсталяцію. Наявні цілі з жорсткими посиланнями відхиляються, оскільки інший шлях може спільно використовувати той самий inode бази даних за межами заблокованого каталогу стану. Ті самі перевірки володіння охоплюють WAL SQLite, спільну пам’ять і бічні файли журналу відкочування. Кожен імпорт записує маніфест у ~/.openclaw/session-sqlite-migration-runs/, перш ніж перемістити артефакти транскриптів до архіву. Якщо запуск повідомляє про невдалу міграцію SQLite сеансів після переміщення артефактів, запустіть відновлення:
Відновлення вибирає останній невдалий маніфест міграції, відновлює лише заархівовані артефакти з маніфесту, перевіряє відповідні цілі, оновлює очищені звіти .failure.md та .failure.json і готує текст проблеми GitHub, який не містить вмісту транскриптів, необробленого середовища, секретів і необмеженої конфігурації. Якщо маніфест невдалої міграції відсутній, але вибрана база даних SQLite агента пошкоджена, не є базою даних або має бічні файли журналу без основної бази даних, відновлення копіює повний набір файлів до тимчасового каталогу перевірки. SQLite може відкотити чинний активний журнал у цій одноразовій копії перед виконанням quick_check, integrity_check та foreign_key_check, тоді як оригінальні файли для судової експертизи залишаються незміненими. Невдалі перевірки цілісності або осиротілі бічні файли зберігають файли DB, WAL, SHM та журналу відкочування, перейменовуючи весь виявлений набір з одним суфіксом .corrupt-<timestamp>. Перехоплена помилка перейменування повертає вже переміщені файли на місце до повідомлення про помилку, тому відновлюваний набір файлів не буде непомітно розділено. Зупиніть Gateway перед відновленням; копіювання або перейменування набору файлів SQLite, який активно змінюється, є небезпечним і має різну поведінку в різних операційних системах. З --github-issue --yes doctor використовує GitHub CLI для створення проблеми в openclaw/openclaw; без підтвердження він записує локальний звіт підтримки та виводить попередньо заповнену URL-адресу проблеми. restore залишається низькорівневою операцією скасування. Вона використовує записи sourcePath -> archivePath маніфесту, переміщує заархівовані артефакти назад, лише коли оригінальний шлях відсутній, повідомляє про конфлікти, коли існують обидва шляхи, і залишає базу даних SQLite на місці.

Повернення до старішої версії після міграції SQLite сеансів

Перед запуском старішої файлової версії OpenClaw відновіть заархівовані застарілі артефакти транскриптів:
Старіші версії зчитують записи sessions.json і шляхи sessionFile, записані в цих записах. Після міграції на SQLite успішні імпорти переміщують активні JSONL- транскрипти до session-sqlite-import-archive/, тому старіше середовище виконання не може бачити цю історію, доки відновлення не поверне ці артефакти, записані в маніфесті, до їхніх початкових шляхів. Відновлення не видаляє дані SQLite. Сеанси, створені після переходу на SQLite, існують лише в SQLite й не відображатимуться в старішому середовищі виконання. Якщо згодом знову оновити систему, виконайте наведену вище звичайну послідовність перевірки міграції, щоб OpenClaw міг порівняти відновлені застарілі артефакти з рядками SQLite перед імпортом.

Примітки

  • У режимі Nix (OPENCLAW_NIX_MODE=1) перевірки doctor лише для читання й надалі працюють, але doctor --fix, doctor --repair, doctor --yes і doctor --generate-gateway-token вимкнено, оскільки openclaw.json є незмінним. Натомість відредагуйте джерело Nix для цього встановлення; для nix-openclaw скористайтеся орієнтованим на агента коротким посібником.
  • Інтерактивні запити (виправлення зв’язки ключів/OAuth тощо) виконуються лише тоді, коли stdin є TTY і --non-interactive не задано. Запуски без інтерфейсу (cron, Telegram, без термінала) пропускають запити.
  • Неінтерактивні запуски doctor пропускають попереднє завантаження плагінів, щоб перевірки працездатності без інтерфейсу залишалися швидкими. Інтерактивні сеанси й надалі завантажують поверхні плагінів, потрібні застарілому процесу перевірки працездатності й відновлення.
  • --lint суворіший за --non-interactive: завжди лише для читання, ніколи не показує запитів і ніколи не застосовує безпечних міграцій. Використовуйте doctor --fix або doctor --repair, якщо потрібно, щоб doctor вносив зміни.
  • За замовчуванням doctor не виконує SecretRef exec під час перевірки секретів. Використовуйте --allow-exec--lint або без нього) лише тоді, коли навмисно потрібно, щоб doctor запускав ці налаштовані засоби отримання секретів.
  • Будь-який запис конфігурації (зокрема виправлення --fix) переміщує резервну копію до ~/.openclaw/openclaw.json.bak (з нумерованим кільцем .bak.1...bak.4). --fix також видаляє невідомі ключі конфігурації, про які повідомляє перевірка за схемою, перелічуючи кожне видалення; під час оновлення ця дія пропускається, щоб частково записаний стан оновлення не було видалено до завершення його міграції.
  • Задайте OPENCLAW_SERVICE_REPAIR_POLICY=external, коли життєвим циклом Gateway керує інший супервізор. Doctor і надалі повідомляє про стан Gateway/служби та застосовує виправлення, не пов’язані зі службою, але пропускає встановлення/запуск/перезапуск/початкове налаштування служби й очищення застарілої служби.
  • У Linux doctor ігнорує неактивні додаткові модулі systemd, подібні до Gateway, і під час виправлення не перезаписує метадані команди/точки входу для запущеної служби Gateway systemd. Спочатку зупиніть службу або скористайтеся openclaw gateway install --force, щоб замінити активний засіб запуску.
  • doctor --fix --non-interactive повідомляє про відсутні або застарілі визначення служби Gateway, але не встановлює й не перезаписує їх поза режимом виправлення оновлення. Запустіть openclaw gateway install для відсутньої служби або openclaw gateway install --force, щоб замінити засіб запуску.
  • Перевірки цілісності стану виявляють осиротілі файли транскриптів у каталозі сеансів. Для їх архівування як .deleted.<timestamp> потрібне інтерактивне підтвердження; --fix, --yes і запуски без інтерфейсу залишають їх на місці.
  • Doctor сканує ~/.openclaw/cron/jobs.json (або cron.store) на наявність застарілих форматів завдань cron і перезаписує їх перед імпортом канонічних рядків до SQLite.
  • Doctor повідомляє про завдання cron із явним перевизначенням payload.model, зокрема про кількість просторів імен постачальників і невідповідності з agents.defaults.model, щоб заплановані завдання, які не успадковують модель за замовчуванням, були видимими під час розслідувань автентифікації або виставлення рахунків.
  • Doctor повідомляє про завдання cron, які досі позначені як виконувані (state.runningAtMs), через що openclaw cron list може показувати їх як running. Ця перевірка виконується лише для читання: якщо жоден Gateway наразі не виконує позначене завдання, наступний запуск служби cron реєструє перерваний запуск і очищає позначку.
  • У Linux doctor попереджає, коли crontab користувача досі запускає непідтримуваний застарілий ~/.openclaw/bin/ensure-whatsapp.sh, який може неправильно повідомляти Gateway inactive, коли cron не має середовища користувацької шини systemd.
  • Коли WhatsApp увімкнено, doctor перевіряє, чи не погіршився цикл подій Gateway за наявності запущених локальних клієнтів openclaw-tui. doctor --fix зупиняє лише перевірені локальні клієнти TUI, щоб відповіді WhatsApp не ставали в чергу за застарілими циклами оновлення TUI.
  • Doctor перезаписує застарілі посилання на моделі codex/* і openai-codex/* у канонічні посилання openai/* для основних моделей, резервних варіантів, списків дозволених моделей, моделей генерування зображень/відео, перевизначень Heartbeat/підлеглого агента/Compaction, хуків, перевизначень моделі каналу, корисних навантажень cron і застарілих прив’язок маршрутів сеансів/транскриптів. --fix також безпечно об’єднує застарілу конфігурацію models.providers.codex і models.providers.openai-codex, переносить застарілі профілі автентифікації openai-codex:* і записи auth.order.openai-codex до openai:*, переносить призначення Codex до записів agentRuntime.id: "codex", прив’язаних до постачальника/моделі, видаляє застарілі прив’язки середовища виконання для всього агента/сеансу та зберігає виправлені посилання агентів OpenAI на маршрутизації автентифікації Codex замість прямої автентифікації за ключем API OpenAI.
  • Doctor повідомляє про непорожні списки auth.order.<provider>, усі профілі з посиланнями в яких уже відсутні, хоча сумісні збережені облікові дані існують. doctor --fix видаляє лише ці застарілі перевизначення, відновлюючи автоматичний вибір облікових даних для кожного агента; явно порожні порядки, частково чинні списки та порядки без сумісних збережених облікових даних залишаються незмінними. Якщо активне сховище автентифікації SQLite неможливо прочитати або воно має неправильний формат, doctor пояснює, чому пропустив це виправлення. Перезапустіть запущений Gateway перед повторною перевіркою стану автентифікації, якщо його режим перезавантаження конфігурації не застосовує запис автоматично.
  • Doctor очищує застарілий проміжний стан залежностей плагінів зі старіших версій OpenClaw і повторно пов’язує пакет хоста openclaw для керованих плагінів npm, які оголошують його одноранговою залежністю. Він також відновлює відсутні завантажувані плагіни, на які посилається конфігурація (plugins.entries, налаштовані канали, налаштовані параметри постачальника/пошуку, налаштовані середовища виконання агентів). Під час оновлення пакетів doctor пропускає відновлення плагінів менеджером пакетів до завершення заміни пакета; після цього повторно запустіть openclaw doctor --fix, якщо налаштований плагін усе ще потребує відновлення. Якщо завантаження не вдається, doctor повідомляє про помилку встановлення та зберігає запис налаштованого плагіна для наступної спроби відновлення.
  • Doctor виправляє застарілу конфігурацію плагінів, видаляючи ідентифікатори відсутніх плагінів із plugins.allow/plugins.deny/plugins.entries, а також відповідну конфігурацію висячих каналів, цілі Heartbeat і перевизначення моделей каналів, коли виявлення плагінів працює належним чином.
  • Doctor ізолює неправильну конфігурацію плагіна, вимикаючи відповідний запис plugins.entries.<id> і видаляючи його неправильне корисне навантаження config. Під час запуску Gateway уже пропускає лише цей несправний плагін, тому інші плагіни й канали продовжують працювати.
  • Doctor видаляє вилучений plugins.entries.codex.config.codexDynamicToolsProfile; сервер застосунку Codex завжди залишає нативні інструменти робочого простору Codex нативними.
  • Doctor автоматично переносить застарілу пласку конфігурацію Talk (talk.voiceId, talk.modelId тощо) до talk.provider + talk.providers.<provider>. Повторні запуски doctor --fix більше не повідомляють про нормалізацію Talk і не застосовують її, коли єдиною відмінністю є порядок ключів об’єкта.
  • Doctor містить перевірку готовності пошуку в пам’яті та може рекомендувати openclaw configure --section model, коли відсутні облікові дані для вбудовувань.
  • Doctor попереджає, коли власника команд не налаштовано. Власник команд — це обліковий запис оператора-людини, якому дозволено виконувати команди лише для власника та схвалювати небезпечні дії. Сполучення через особисті повідомлення лише дозволяє комусь спілкуватися з ботом; якщо відправника було схвалено до появи початкового налаштування першого власника, явно задайте commands.ownerAllowFrom.
  • Doctor показує інформаційну примітку, коли налаштовано агентів у режимі Codex і в домашньому каталозі Codex оператора є особисті ресурси Codex CLI. Локальні запуски сервера застосунку Codex використовують ізольовані домашні каталоги для кожного агента; за потреби спочатку встановіть плагін Codex, а потім скористайтеся openclaw migrate plan codex, щоб інвентаризувати ресурси, які слід перенести свідомо.
  • Doctor попереджає, коли Skills, дозволені для агента за замовчуванням, недоступні в поточному середовищі виконання (відсутні двійкові файли, змінні середовища, конфігурація або вимоги ОС). doctor --fix може вимкнути ці недоступні Skills за допомогою skills.entries.<skill>.enabled=false; якщо потрібно залишити Skill активним, натомість установіть або налаштуйте відсутню вимогу.
  • Якщо режим пісочниці ввімкнено, але Docker недоступний, doctor показує виразне попередження зі способом усунення (install Docker або openclaw config set agents.defaults.sandbox.mode off).
  • Якщо наявні застарілі файли реєстру пісочниці або каталоги сегментів (~/.openclaw/sandbox/containers.json, ~/.openclaw/sandbox/browsers.json, ~/.openclaw/sandbox/containers/ або ~/.openclaw/sandbox/browsers/), doctor повідомляє про них; --fix переносить дійсні записи до SQLite та ізолює неправильні застарілі файли.
  • Якщо gateway.auth.token/gateway.auth.password керуються через SecretRef і недоступні в поточному шляху виконання команди, doctor показує попередження лише для читання та не записує резервні облікові дані у відкритому вигляді. Для SecretRef на основі exec doctor пропускає виконання, якщо немає --allow-exec.
  • Якщо перевірка SecretRef каналу не вдається під час виправлення, doctor продовжує роботу та показує попередження замість передчасного завершення.
  • Після міграцій каталогу стану doctor попереджає, коли ввімкнені облікові записи Telegram або Discord за замовчуванням залежать від резервного отримання зі змінних середовища, а TELEGRAM_BOT_TOKEN або DISCORD_BOT_TOKEN недоступна процесу doctor.
  • Автоматичне визначення імені користувача Telegram allowFrom (doctor --fix) потребує доступного для визначення токена Telegram у поточному шляху виконання команди. Якщо перевірка токена недоступна, doctor показує попередження та пропускає автоматичне визначення під час цього проходу.

macOS: перевизначення змінних середовища launchctl

Якщо раніше було виконано launchctl setenv OPENCLAW_GATEWAY_TOKEN ... (або ...PASSWORD), це значення перевизначає файл конфігурації та може спричиняти постійні помилки «unauthorized».

Пов’язані матеріали