Gateway WS-протокол є єдиною площиною керування + транспортом вузлів для OpenClaw. Усі клієнти (CLI, вебінтерфейс, застосунок macOS, вузли iOS/Android, headless вузли) підключаються через WebSocket і оголошують свої роль + область дії під час handshake.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.
Транспорт
- WebSocket, текстові фрейми з JSON-навантаженнями.
- Перший фрейм має бути запитом
connect. - Фрейми до підключення обмежені 64 KiB. Після успішного handshake клієнти
мають дотримуватися обмежень
hello-ok.policy.maxPayloadіhello-ok.policy.maxBufferedBytes. Коли діагностику ввімкнено, завеликі вхідні фрейми та повільні вихідні буфери генерують подіїpayload.largeперед тим, як gateway закриє або відкине відповідний фрейм. Ці події зберігають розміри, ліміти, поверхні та безпечні коди причин. Вони не зберігають тіло повідомлення, вміст вкладень, сире тіло фрейму, токени, cookies або секретні значення.
Handshake (connect)
Gateway → Клієнт (виклик до підключення):connect може
повернути придатну для повтору помилку UNAVAILABLE, де details.reason має значення
"startup-sidecars" і вказано retryAfterMs. Клієнти мають повторювати таку відповідь
у межах загального бюджету підключення, а не показувати її як остаточний
збій handshake.
server, features, snapshot і policy є обов’язковими за схемою
(src/gateway/protocol/schema/frames.ts). auth також є обов’язковим і повідомляє
узгоджену роль/області дії. pluginSurfaceUrls є необов’язковим і зіставляє назви
поверхонь plugin, як-от canvas, з обмеженими за областю дії hosted URL.
Обмежені за областю дії URL поверхонь plugin можуть завершуватися. Вузли можуть викликати
node.pluginSurface.refresh з { "surface": "canvas" }, щоб отримати свіжий
запис у pluginSurfaceUrls. Експериментальний рефакторинг Canvas plugin не
підтримує застарілий шлях сумісності canvasHostUrl, canvasCapability або
node.canvas.capability.refresh; поточні нативні клієнти та gateway мають використовувати поверхні plugin.
Коли токен пристрою не видано, hello-ok.auth повідомляє узгоджені
дозволи без полів токена:
client.id: "gateway-client",
client.mode: "backend") можуть не вказувати device у прямих loopback-підключеннях, коли
автентифікуються зі спільним gateway-токеном/паролем. Цей шлях зарезервований
для внутрішніх RPC площини керування і не дає застарілим базовим станам прив’язки CLI/пристрою
блокувати локальну backend-роботу, наприклад оновлення сесій subagent. Віддалені клієнти,
клієнти з browser-origin, клієнти вузлів і явні клієнти з device-token/device-identity
надалі використовують звичайні перевірки прив’язки та підвищення області дії.
Коли токен пристрою видано, hello-ok також містить:
hello-ok.auth також може містити додаткові
обмежені записи ролей у deviceTokens:
scopes: [], а будь-який переданий токен оператора лишається обмеженим allowlist
bootstrap-оператора (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Перевірки областей дії bootstrap лишаються
роль-префіксними: записи оператора задовольняють лише запити оператора, а ролі, що не є операторами,
надалі потребують областей дії під власним префіксом ролі.
Приклад вузла
Фреймінг
- Запит:
{type:"req", id, method, params} - Відповідь:
{type:"res", id, ok, payload|error} - Подія:
{type:"event", event, payload, seq?, stateVersion?}
Ролі + області дії
Повну модель областей дії оператора, перевірки під час схвалення та семантику спільних секретів див. у Області дії оператора.Ролі
operator= клієнт площини керування (CLI/UI/автоматизація).node= хост можливостей (camera/screen/canvas/system.run).
Області дії (оператор)
Поширені області дії:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config з includeSecrets: true потребує operator.talk.secrets
(або operator.admin).
Зареєстровані plugin методи Gateway RPC можуть запитувати власну область дії оператора, але
зарезервовані префікси адміністрування ядра (config.*, exec.approvals.*, wizard.*,
update.*) завжди зводяться до operator.admin.
Область дії методу є лише першим шлюзом. Деякі slash-команди, доступні через
chat.send, застосовують суворіші перевірки на рівні команд поверх цього. Наприклад, постійні
записи /config set і /config unset потребують operator.admin.
node.pair.approve також має додаткову перевірку області дії під час схвалення поверх
базової області дії методу:
- запити без команд:
operator.pairing - запити з non-exec командами вузла:
operator.pairing+operator.write - запити, що містять
system.run,system.run.prepareабоsystem.which:operator.pairing+operator.admin
Можливості/команди/дозволи (вузол)
Вузли оголошують заявлені можливості під час підключення:caps: категорії можливостей високого рівня, як-отcamera,canvas,screen,location,voiceіtalk.commands: allowlist команд для invoke.permissions: деталізовані перемикачі (наприклад,screen.record,camera.capture).
Присутність
system-presenceповертає записи, ключовані за ідентичністю пристрою.- Записи присутності містять
deviceId,rolesіscopes, щоб UI могли показувати один рядок на пристрій навіть коли він підключається і як operator, і як node. node.listмістить необов’язкові поляlastSeenAtMsіlastSeenReason. Підключені вузли повідомляють свій поточний час підключення якlastSeenAtMsз причиноюconnect; прив’язані вузли також можуть повідомляти тривалу фонову присутність, коли довірена подія вузла оновлює їхні метадані прив’язки.
Фонова подія активності вузла
Вузли можуть викликатиnode.event з event: "node.presence.alive", щоб зафіксувати, що прив’язаний вузол був
активний під час фонового пробудження, не позначаючи його як підключений.
trigger є закритим enum: background, silent_push, bg_app_refresh,
significant_location, manual або connect. Невідомі рядки trigger нормалізуються до
background gateway перед збереженням. Подія є тривалою лише для автентифікованих сесій пристроїв вузлів;
сесії без пристрою або без прив’язки повертають handled: false.
Успішні gateway повертають структурований результат:
{ "ok": true } для node.event; клієнти мають трактувати це як
підтверджений RPC, а не як тривале збереження присутності.
Обмеження областей дії broadcast-подій
Broadcast-події WebSocket, які надсилає сервер, обмежуються областями дії, щоб сесії з областю дії прив’язки або лише вузлові сесії не отримували пасивно вміст сесій.- Фрейми чату, агента та результатів інструментів (включно зі streamed подіями
agentі результатами викликів інструментів) потребують щонайменшеoperator.read. Сесії безoperator.readповністю пропускають ці фрейми. - Визначені plugin broadcast
plugin.*обмежуютьсяoperator.writeабоoperator.admin, залежно від того, як plugin їх зареєстрував. - Події статусу й транспорту (
heartbeat,presence,tick, життєвий цикл connect/disconnect тощо) лишаються без обмежень, щоб стан транспорту був видимий кожній автентифікованій сесії. - Невідомі сімейства broadcast-подій типово обмежуються областями дії (fail-closed), якщо зареєстрований обробник явно не послаблює їх.
Поширені сімейства RPC-методів
Публічна WS-поверхня ширша за наведені вище приклади handshake/auth. Це не згенерований дамп —hello-ok.features.methods є консервативним
списком виявлення, побудованим із src/gateway/server-methods-list.ts плюс завантажених
експортів методів plugin/channel. Трактуйте його як виявлення функцій, а не як повний
перелік src/gateway/server-methods/*.ts.
Система та ідентичність
Система та ідентичність
healthповертає кешований або щойно перевірений знімок стану gateway.diagnostics.stabilityповертає нещодавній обмежений реєстратор діагностичної стабільності. Він зберігає операційні метадані, як-от назви подій, лічильники, розміри в байтах, показники пам’яті, стан черг/сесій, назви channel/plugin і ids сесій. Він не зберігає текст чату, тіла webhook, виходи інструментів, сирі тіла запитів або відповідей, токени, cookies або секретні значення. Потрібна область дії читання оператора.statusповертає зведення gateway у стилі/status; чутливі поля включаються лише для клієнтів-операторів з admin-областю дії.gateway.identity.getповертає ідентичність пристрою gateway, яку використовують потоки relay і pairing.system-presenceповертає поточний знімок присутності для підключених пристроїв operator/node.system-eventдодає системну подію і може оновлювати/broadcast контекст присутності.last-heartbeatповертає останню збережену подію heartbeat.set-heartbeatsперемикає обробку heartbeat на gateway.
Моделі та використання
Моделі та використання
models.listповертає дозволений під час виконання каталог моделей. Передайте{ "view": "configured" }для налаштованих моделей розміру вибірника (agents.defaults.modelsспочатку, потімmodels.providers.*.models) або{ "view": "all" }для повного каталогу.usage.statusповертає вікна використання провайдера та зведення залишкової квоти.usage.costповертає агреговані зведення витрат за діапазон дат.doctor.memory.statusповертає готовність векторної пам’яті / кешованих вбудовувань для активного робочого простору агента за замовчуванням. Передавайте{ "probe": true }або{ "deep": true }лише тоді, коли викликач явно хоче живий ping провайдера вбудовувань.doctor.memory.remHarnessповертає обмежений, доступний лише для читання попередній перегляд REM harness для віддалених клієнтів площини керування. Він може містити шляхи робочого простору, фрагменти пам’яті, відрендерений обґрунтований markdown і кандидатів на глибоке просування, тому викликачам потрібенoperator.read.sessions.usageповертає зведення використання за сеансами.sessions.usage.timeseriesповертає часові ряди використання для одного сеансу.sessions.usage.logsповертає записи журналу використання для одного сеансу.
Канали та помічники входу
Канали та помічники входу
channels.statusповертає зведення стану вбудованих і bundled каналів/плагінів.channels.logoutвиконує вихід із конкретного каналу/облікового запису, якщо канал підтримує вихід.web.login.startзапускає QR/web-потік входу для поточного web-провайдера каналу з підтримкою QR.web.login.waitочікує завершення цього QR/web-потоку входу та запускає канал у разі успіху.push.testнадсилає тестовий APNs push на зареєстрований iOS-вузол.voicewake.getповертає збережені тригери wake-word.voicewake.setоновлює тригери wake-word і транслює зміну.
Повідомлення та журнали
Повідомлення та журнали
send— це прямий RPC вихідної доставки для надсилань, націлених на канал/обліковий запис/потік, поза chat runner.logs.tailповертає налаштований tail файлового журналу Gateway з елементами керування курсором/лімітом і максимальною кількістю байтів.
Talk і TTS
Talk і TTS
talk.catalogповертає доступний лише для читання каталог провайдерів Talk для мовлення, потокової транскрипції та голосу в реальному часі. Він містить ідентифікатори провайдерів, мітки, налаштований стан, відкриті ідентифікатори моделей/голосів, канонічні режими, транспорти, стратегії мозку та прапорці аудіо/можливостей у реальному часі, не повертаючи секрети провайдерів і не змінюючи глобальну конфігурацію.talk.configповертає ефективне корисне навантаження конфігурації Talk;includeSecretsпотребуєoperator.talk.secrets(абоoperator.admin).talk.session.createстворює сеанс Talk, яким володіє Gateway, дляrealtime/gateway-relay,transcription/gateway-relayабоstt-tts/managed-room.brain: "direct-tools"потребуєoperator.admin.talk.session.joinперевіряє токен сеансу managed-room, за потреби надсилає подіїsession.readyабоsession.replacedі повертає метадані кімнати/сеансу разом з останніми подіями Talk без відкритого тексту токена або збереженого хеша токена.talk.session.appendAudioдодає вхідний base64 PCM-аудіо до relay і транскрипційних сеансів у реальному часі, якими володіє Gateway.talk.session.startTurn,talk.session.endTurnіtalk.session.cancelTurnкерують життєвим циклом ходу managed-room з відхиленням застарілого ходу до очищення стану.talk.session.cancelOutputзупиняє аудіовихід асистента, переважно для VAD-керованого втручання в relay-сеансах Gateway.talk.session.submitToolResultзавершує виклик інструмента провайдера, згенерований relay-сеансом у реальному часі, яким володіє Gateway. Передайтеoptions: { willContinue: true }для проміжного виводу інструмента, коли за ним буде фінальний результат, абоoptions: { suppressResponse: true }, коли результат інструмента має задовольнити виклик провайдера без запуску ще однієї відповіді асистента в реальному часі.talk.session.closeзакриває relay-, транскрипційний або managed-room сеанс, яким володіє Gateway, і надсилає кінцеві події Talk.talk.modeвстановлює/транслює поточний стан режиму Talk для клієнтів WebChat/Control UI.talk.client.createстворює клієнтський сеанс провайдера реального часу з використаннямwebrtcабоprovider-websocket, тоді як Gateway володіє конфігурацією, обліковими даними, інструкціями та політикою інструментів.talk.client.toolCallдає змогу клієнтським транспортам реального часу пересилати виклики інструментів провайдера до політики Gateway. Перший підтримуваний інструмент —openclaw_agent_consult; клієнти отримують run id і очікують звичайних подій життєвого циклу чату перед поданням результату інструмента, специфічного для провайдера.talk.event— це єдиний канал подій Talk для адаптерів реального часу, транскрипції, STT/TTS, managed-room, телефонії та зустрічей.talk.speakсинтезує мовлення через активного провайдера мовлення Talk.tts.statusповертає стан увімкнення TTS, активного провайдера, резервних провайдерів і стан конфігурації провайдера.tts.providersповертає видимий інвентар провайдерів TTS.tts.enableіtts.disableперемикають стан налаштувань TTS.tts.setProviderоновлює бажаного провайдера TTS.tts.convertвиконує одноразове перетворення тексту на мовлення.
Секрети, конфігурація, оновлення та майстер
Секрети, конфігурація, оновлення та майстер
secrets.reloadповторно розв’язує активні SecretRefs і замінює стан секретів під час виконання лише за повного успіху.secrets.resolveрозв’язує призначення секретів, націлені на команду, для конкретного набору команди/цілей.config.getповертає поточний знімок конфігурації та hash.config.setзаписує перевірене корисне навантаження конфігурації.config.patchоб’єднує часткове оновлення конфігурації.config.applyперевіряє та замінює повне корисне навантаження конфігурації.config.schemaповертає live корисне навантаження схеми конфігурації, яке використовують Control UI та інструменти CLI: schema,uiHints, version і generation metadata, включно з метаданими схем Plugin і каналів, коли runtime може їх завантажити. Схема містить метадані полівtitle/description, отримані з тих самих міток і довідкового тексту, що використовуються UI, включно з вкладеними об’єктами, wildcard, елементами масиву та гілками композиціїanyOf/oneOf/allOf, коли існує відповідна документація полів.config.schema.lookupповертає корисне навантаження пошуку, обмежене шляхом, для одного шляху конфігурації: нормалізований шлях, поверхневий вузол схеми, відповідну підказку +hintPathі короткі зведення безпосередніх дочірніх елементів для деталізації в UI/CLI. Вузли схеми пошуку зберігають документацію для користувача та поширені поля перевірки (title,description,type,enum,const,format,pattern, межі чисел/рядків/масивів/об’єктів і прапорці на кшталтadditionalProperties,deprecated,readOnly,writeOnly). Зведення дочірніх елементів показуютьkey, нормалізованийpath,type,required,hasChildren, а також відповідніhint/hintPath.update.runзапускає потік оновлення Gateway і планує перезапуск лише тоді, коли саме оновлення успішне; викликачі із сеансом можуть додатиcontinuationMessage, щоб під час запуску відновився один наступний хід агента через чергу продовження після перезапуску. Оновлення package-manager примусово виконують невідкладений перезапуск після оновлення без cooldown після заміни пакета, щоб старий процес Gateway не продовжував lazy-loading із заміненого дереваdist.update.statusповертає останній кешований restart sentinel оновлення, включно з версією, що працює після перезапуску, якщо вона доступна.wizard.start,wizard.next,wizard.statusіwizard.cancelвідкривають майстер onboarding через WS RPC.
Помічники агента та робочого простору
Помічники агента та робочого простору
agents.listповертає налаштовані записи агентів, включно з ефективною моделлю та метаданими runtime.agents.create,agents.updateіagents.deleteкерують записами агентів і зв’язуванням робочого простору.agents.files.list,agents.files.getіagents.files.setкерують bootstrap-файлами робочого простору, відкритими для агента.tasks.list,tasks.getіtasks.cancelвідкривають ledger завдань Gateway для SDK та клієнтів-операторів.artifacts.list,artifacts.getіartifacts.downloadвідкривають похідні від transcript зведення артефактів і завантаження для явної областіsessionKey,runIdабоtaskId. Запити run і task розв’язують сеанс-власник на боці сервера та повертають лише transcript media з відповідним provenance; небезпечні або локальні URL-джерела повертають непідтримувані завантаження замість fetching на боці сервера.environments.listіenvironments.statusвідкривають доступне лише для читання виявлення локальних для Gateway і вузлових середовищ для клієнтів SDK.agent.identity.getповертає ефективну ідентичність асистента для агента або сеансу.agent.waitочікує завершення run і повертає кінцевий snapshot, коли він доступний.
Керування сеансами
Керування сеансами
sessions.listповертає поточний індекс сеансів, включно з метаданимиagentRuntimeдля кожного рядка, коли налаштовано backend runtime агента.sessions.subscribeіsessions.unsubscribeперемикають підписки на події зміни сеансів для поточного WS-клієнта.sessions.messages.subscribeіsessions.messages.unsubscribeперемикають підписки на події transcript/повідомлень для одного сеансу.sessions.previewповертає обмежені попередні перегляди transcript для конкретних ключів сеансів.sessions.describeповертає один рядок сеансу Gateway для точного ключа сеансу.sessions.resolveрозв’язує або канонікалізує ціль сеансу.sessions.createстворює новий запис сеансу.sessions.sendнадсилає повідомлення в наявний сеанс.sessions.steer— це варіант переривання та скеровування для активного сеансу.sessions.abortперериває активну роботу для сеансу. Викликач може передатиkeyплюс необов’язковийrunIdабо передати лишеrunIdдля активних runs, які Gateway може розв’язати до сеансу.sessions.patchоновлює метадані/перевизначення сеансу та повідомляє розв’язану канонічну модель плюс ефективнийagentRuntime.sessions.reset,sessions.deleteіsessions.compactвиконують обслуговування сеансу.sessions.getповертає повний збережений рядок сеансу.- Виконання чату й надалі використовує
chat.history,chat.send,chat.abortіchat.inject.chat.historyнормалізовано для відображення клієнтам UI: inline directive tags вилучаються з видимого тексту, plain-text XML payloads викликів інструментів (зокрема<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>і обрізані блоки викликів інструментів) і leaked ASCII/full-width model control tokens вилучаються, суто silent-token рядки асистента, як-от точніNO_REPLY/no_reply, пропускаються, а завеликі рядки можуть замінюватися placeholders.
Парування пристроїв і токени пристроїв
Парування пристроїв і токени пристроїв
device.pair.listповертає очікувані та схвалені paired devices.device.pair.approve,device.pair.rejectіdevice.pair.removeкерують записами device-pairing.device.token.rotateротує токен paired device в межах його схваленої ролі та області викликача.device.token.revokeвідкликає токен paired device в межах його схваленої ролі та області викликача.
Парування вузлів, invoke і pending work
Парування вузлів, invoke і pending work
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.removeіnode.pair.verifyохоплюють парування вузлів і перевірку bootstrap.node.listіnode.describeповертають відомий/підключений стан вузла.node.renameоновлює мітку paired node.node.invokeпересилає команду до підключеного вузла.node.invoke.resultповертає результат для запиту invoke.node.eventпереносить події, що походять від вузла, назад у gateway.node.pending.pullіnode.pending.ack— це API черги підключеного вузла.node.pending.enqueueіnode.pending.drainкерують стійкою pending work для offline/disconnected вузлів.
Сімейства схвалень
Сімейства схвалень
exec.approval.request,exec.approval.get,exec.approval.listіexec.approval.resolveохоплюють одноразові запити на схвалення виконання, а також пошук/повторне відтворення очікуваних схвалень.exec.approval.waitDecisionочікує на одне очікуване схвалення виконання й повертає остаточне рішення (абоnullу разі тайм-ауту).exec.approvals.getіexec.approvals.setкерують знімками політики схвалення виконання gateway.exec.approvals.node.getіexec.approvals.node.setкерують локальною для вузла політикою схвалення виконання через команди ретрансляції вузла.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionіplugin.approval.resolveохоплюють визначені plugin потоки схвалення.
Автоматизація, Skills та інструменти
Автоматизація, Skills та інструменти
- Автоматизація:
wakeпланує негайне або наступне під час heartbeat додавання тексту пробудження;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsкерують запланованою роботою. - Skills та інструменти:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
Поширені сімейства подій
chat: оновлення чату UI, як-отchat.injectта інші події чату лише для транскрипту.session.messageіsession.tool: оновлення транскрипту/потоку подій для підписаного сеансу.sessions.changed: індекс сеансів або метадані змінено.presence: оновлення знімка присутності системи.tick: періодична подія keepalive / liveness.health: оновлення знімка стану gateway.heartbeat: оновлення потоку подій heartbeat.cron: подія зміни виконання/завдання cron.shutdown: сповіщення про завершення роботи gateway.node.pair.requested/node.pair.resolved: життєвий цикл сполучення вузла.node.invoke.request: широкомовний запит виклику вузла.device.pair.requested/device.pair.resolved: життєвий цикл сполученого пристрою.voicewake.changed: конфігурацію тригера слова пробудження змінено.exec.approval.requested/exec.approval.resolved: життєвий цикл схвалення виконання.plugin.approval.requested/plugin.approval.resolved: життєвий цикл схвалення plugin.
Допоміжні методи вузла
- Вузли можуть викликати
skills.bins, щоб отримати поточний список виконуваних файлів skill для перевірок автоматичного дозволу.
RPC журналу завдань
Клієнти операторів можуть переглядати й скасовувати записи фонових завдань Gateway через RPC журналу завдань. Ці методи повертають очищені зведення завдань, а не сирий стан runtime.tasks.listпотребуєoperator.read.- Параметри: необов’язковий
status("queued","running","completed","failed","cancelled"або"timed_out") чи масив таких статусів, необов’язковийagentId, необов’язковийsessionKey, необов’язковийlimitвід1до500і необов’язковий рядокcursor. - Результат:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Параметри: необов’язковий
tasks.getпотребуєoperator.read.- Параметри:
{ "taskId": string }. - Результат:
{ "task": TaskSummary }. - Відсутні ідентифікатори завдань повертають форму помилки not-found Gateway.
- Параметри:
tasks.cancelпотребуєoperator.write.- Параметри:
{ "taskId": string, "reason"?: string }. - Результат:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundповідомляє, чи журнал мав відповідне завдання.cancelledповідомляє, чи runtime прийняв або зафіксував скасування.
- Параметри:
TaskSummary містить id, status і необов’язкові метадані, як-от kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, часові позначки, прогрес,
термінальне зведення та очищений текст помилки.
Допоміжні методи оператора
- Оператори можуть викликати
commands.list(operator.read), щоб отримати runtime інвентар команд для агента.agentIdнеобов’язковий; опустіть його, щоб читати типовий робочий простір агента.scopeкерує тим, на яку поверхню націлено основнийname:textповертає основний текстовий токен команди без початкового/nativeі типовий шляхbothповертають нативні імена з урахуванням провайдера, коли вони доступні
textAliasesмістить точні slash-псевдоніми, як-от/modelі/m.nativeNameмістить нативну назву команди з урахуванням провайдера, коли така існує.providerнеобов’язковий і впливає лише на нативне іменування та доступність нативних команд plugin.includeArgs=falseопускає серіалізовані метадані аргументів із відповіді.
- Оператори можуть викликати
tools.catalog(operator.read), щоб отримати runtime-каталог інструментів для агента. Відповідь містить згруповані інструменти та метадані походження:source:coreабоpluginpluginId: власник plugin, колиsource="plugin"optional: чи інструмент plugin є необов’язковим
- Оператори можуть викликати
tools.effective(operator.read), щоб отримати ефективний для runtime інвентар інструментів для сеансу.sessionKeyобов’язковий.- Gateway виводить довірений runtime-контекст із сеансу на серверному боці замість приймання наданого викликачем контексту автентифікації чи доставки.
- Відповідь обмежена сеансом і відображає те, що активна розмова може використовувати прямо зараз, включно з core, plugin та інструментами каналів.
- Оператори можуть викликати
tools.invoke(operator.write), щоб викликати один доступний інструмент через той самий шлях політики gateway, що й/tools/invoke.nameобов’язковий.args,sessionKey,agentId,confirmіidempotencyKeyнеобов’язкові.- Якщо присутні і
sessionKey, іagentId, розв’язаний агент сеансу має збігатися зagentId. - Відповідь є конвертом для SDK з полями
ok,toolName, необов’язковимoutputі типізованими полямиerror. Відмови через схвалення або політику повертаютьok:falseу payload, а не обходять pipeline політики інструментів gateway.
- Оператори можуть викликати
skills.status(operator.read), щоб отримати видимий інвентар skill для агента.agentIdнеобов’язковий; опустіть його, щоб читати типовий робочий простір агента.- Відповідь містить відповідність вимогам, відсутні вимоги, перевірки конфігурації та очищені параметри встановлення без розкриття сирих значень секретів.
- Оператори можуть викликати
skills.searchіskills.detail(operator.read) для метаданих виявлення ClawHub. - Оператори можуть викликати
skills.upload.begin,skills.upload.chunkіskills.upload.commit(operator.admin), щоб підготувати приватний архів skill перед його встановленням. Це окремий адміністративний шлях завантаження для довірених клієнтів, а не звичайний потік встановлення skill з ClawHub, і за замовчуванням він вимкнений, якщоskills.install.allowUploadedArchivesне ввімкнено.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })створює завантаження, прив’язане до цього slug і значення force.skills.upload.chunk({ uploadId, offset, dataBase64 })додає байти за точним декодованим зміщенням.skills.upload.commit({ uploadId, sha256? })перевіряє фінальний розмір і SHA-256. Commit лише завершує завантаження; він не встановлює skill.- Завантажені архіви skill є zip-архівами, що містять кореневий
SKILL.md. Внутрішня назва каталогу архіву ніколи не вибирає ціль встановлення.
- Оператори можуть викликати
skills.install(operator.admin) у трьох режимах:- Режим ClawHub:
{ source: "clawhub", slug, version?, force? }встановлює папку skill у каталогskills/типового робочого простору агента. - Режим завантаження:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }встановлює зафіксоване завантаження в каталогskills/<slug>типового робочого простору агента. Slug і значення force мають збігатися з початковим запитомskills.upload.begin. Цей режим відхиляється, якщоskills.install.allowUploadedArchivesне ввімкнено. Налаштування не впливає на встановлення з ClawHub. - Режим інсталятора Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }запускає оголошену діюmetadata.openclaw.installна хості gateway.
- Режим ClawHub:
- Оператори можуть викликати
skills.update(operator.admin) у двох режимах:- Режим ClawHub оновлює один відстежуваний slug або всі відстежувані встановлення ClawHub у типовому робочому просторі агента.
- Режим конфігурації виправляє значення
skills.entries.<skillKey>, як-отenabled,apiKeyіenv.
Подання models.list
models.list приймає необов’язковий параметр view:
- Опущено або
"default": поточна поведінка runtime. Якщоagents.defaults.modelsналаштовано, відповідь є дозволеним каталогом, включно з динамічно виявленими моделями для записівprovider/*. Інакше відповідь є повним каталогом Gateway. "configured": поведінка розміру picker. Якщоagents.defaults.modelsналаштовано, він усе ще має пріоритет, включно з виявленням у межах провайдера для записівprovider/*. Без allowlist відповідь використовує явні записиmodels.providers.*.models, повертаючись до повного каталогу лише тоді, коли немає налаштованих рядків моделей."all": повний каталог Gateway, в обхідagents.defaults.models. Використовуйте це для діагностики та UI виявлення, а не для звичайних picker моделей.
Схвалення виконання
- Коли запит виконання потребує схвалення, gateway транслює
exec.approval.requested. - Клієнти операторів розв’язують його, викликаючи
exec.approval.resolve(потребує scopeoperator.approvals). - Для
host=nodeexec.approval.requestмає міститиsystemRunPlan(канонічніargv/cwd/rawCommand/метадані сеансу). Запити безsystemRunPlanвідхиляються. - Після схвалення переадресовані виклики
node.invoke system.runповторно використовують цей канонічнийsystemRunPlanяк авторитетний контекст команди/cwd/сеансу. - Якщо викликач змінює
command,rawCommand,cwd,agentIdабоsessionKeyміж підготовкою та фінальним схваленим пересиланнямsystem.run, gateway відхиляє виконання замість довіри до зміненого payload.
Резервний варіант доставки агентом
- Запити
agentможуть міститиdeliver=true, щоб запросити вихідну доставку. bestEffortDeliver=falseзберігає сувору поведінку: нерозв’язані або лише внутрішні цілі доставки повертаютьINVALID_REQUEST.bestEffortDeliver=trueдозволяє резервне виконання лише в сеансі, коли неможливо розв’язати зовнішній маршрут доставки (наприклад, внутрішні/webchat-сеанси або неоднозначні багатоканальні конфігурації).- Фінальні результати
agentможуть міститиresult.deliveryStatus, коли доставку було запитано, використовуючи ті самі статусиsent,suppressed,partial_failedіfailed, що задокументовані дляopenclaw agent --json --deliver.
Версіонування
PROTOCOL_VERSIONрозташовано вsrc/gateway/protocol/version.ts.- Клієнти надсилають
minProtocol+maxProtocol; сервер відхиляє діапазони, які не включають його поточний протокол. Нативні клієнти використовують нижню межу v3, щоб адитивні клієнти v4 усе ще могли досягати gateway v3. - Схеми + моделі генеруються з визначень TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Константи клієнта
Еталонний клієнт уsrc/gateway/client.ts використовує ці значення за замовчуванням. Значення
стабільні в межах protocol v4 і є очікуваною базовою лінією для сторонніх клієнтів.
| Константа | Типове значення | Джерело |
|---|---|---|
PROTOCOL_VERSION | 4 | src/gateway/protocol/version.ts |
MIN_CLIENT_PROTOCOL_VERSION | 3 | src/gateway/protocol/version.ts |
| Тайм-аут запиту (на RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Тайм-аут preauth / connect-challenge | 15_000 ms | src/gateway/handshake-timeouts.ts (config/env може збільшити парний бюджет сервера/клієнта) |
| Початковий backoff повторного підключення | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Максимальний backoff повторного підключення | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Обмеження швидкого повтору після закриття через device-token | 250 ms | src/gateway/client.ts |
Пільговий період force-stop перед terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Типовий тайм-аут stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Типовий інтервал tick (до hello-ok) | 30_000 ms | src/gateway/client.ts |
| Закриття через тайм-аут tick | code 4000, коли тиша перевищує tickIntervalMs * 2 | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 МБ) | src/gateway/server-constants.ts |
policy.tickIntervalMs, policy.maxPayload
і policy.maxBufferedBytes у hello-ok; клієнти мають дотримуватися цих значень,
а не типових значень до handshake.
Автентифікація
- Автентифікація Gateway зі спільним секретом використовує
connect.params.auth.tokenабоconnect.params.auth.password, залежно від налаштованого режиму автентифікації. - Режими з ідентичністю, як-от Tailscale Serve
(
gateway.auth.allowTailscale: true) або non-loopbackgateway.auth.mode: "trusted-proxy", задовольняють перевірку автентифікації підключення через заголовки запиту замістьconnect.params.auth.*. - Private-ingress
gateway.auth.mode: "none"повністю пропускає автентифікацію підключення зі спільним секретом; не виставляйте цей режим у публічний/ненадійний ingress. - Після pairing Gateway видає device token, обмежений роллю підключення
- scopes. Його повертають у
hello-ok.auth.deviceToken, і клієнт має зберігати його для майбутніх підключень.
- scopes. Його повертають у
- Клієнти мають зберігати основний
hello-ok.auth.deviceTokenпісля будь-якого успішного підключення. - Повторне підключення з цим збереженим device token також має повторно використовувати збережений схвалений набір scopes для цього токена. Це зберігає доступ для read/probe/status, який уже було надано, і запобігає непомітному звуженню повторних підключень до неявного scope лише для адміністратора.
- Формування автентифікації підключення на боці клієнта (
selectConnectAuthуsrc/gateway/client.ts):auth.passwordє ортогональним і завжди пересилається, коли його задано.auth.tokenзаповнюється в порядку пріоритету: спочатку явний спільний токен, потім явнийdeviceToken, потім збережений токен окремого пристрою (за ключемdeviceId+role).auth.bootstrapTokenнадсилається лише тоді, коли жоден із варіантів вище не визначивauth.token. Спільний токен або будь-який визначений device token пригнічує його.- Автоматичне підвищення збереженого device token під час одноразової
повторної спроби
AUTH_TOKEN_MISMATCHдозволене лише для довірених endpoints — loopback абоwss://із закріпленимtlsFingerprint. Публічнийwss://без pinning не підходить.
- Додаткові записи
hello-ok.auth.deviceTokensє токенами передавання bootstrap. Зберігайте їх лише тоді, коли підключення використовувало bootstrap auth через довірений транспорт, як-отwss://або loopback/local pairing. - Якщо клієнт надає явний
deviceTokenабо явніscopes, цей запитаний викликачем набір scopes залишається авторитетним; кешовані scopes повторно використовуються лише тоді, коли клієнт повторно використовує збережений токен окремого пристрою. - Device tokens можна ротувати/відкликати через
device.token.rotateіdevice.token.revoke(потрібен scopeoperator.pairing). device.token.rotateповертає метадані ротації. Він віддзеркалює замінний bearer token лише для викликів із того самого пристрою, які вже автентифіковані цим device token, тож клієнти лише з токеном можуть зберегти свою заміну перед повторним підключенням. Shared/admin ротації не віддзеркалюють bearer token.- Видача, ротація та відкликання токенів залишаються обмеженими схваленим набором ролей, записаним у pairing-записі цього пристрою; зміна токена не може розширити або націлити роль пристрою, яку pairing-approval ніколи не надавав.
- Для сесій paired-device token керування пристроями є self-scoped, якщо
викликач також не має
operator.admin: неадміністративні викликачі можуть видаляти/відкликати/ротувати лише запис власного пристрою. device.token.rotateіdevice.token.revokeтакож перевіряють цільовий набір scopes operator token щодо поточних scopes сесії викликача. Неадміністративні викликачі не можуть ротувати або відкликати ширший operator token, ніж уже мають.- Помилки автентифікації містять
error.details.codeплюс підказки для відновлення:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Поведінка клієнта для
AUTH_TOKEN_MISMATCH:- Довірені клієнти можуть спробувати одну обмежену повторну спробу з кешованим токеном окремого пристрою.
- Якщо ця повторна спроба не вдається, клієнти мають зупинити автоматичні цикли повторного підключення та показати оператору вказівки щодо дії.
AUTH_SCOPE_MISMATCHозначає, що device token було розпізнано, але він не покриває запитану роль/scopes. Клієнти не мають подавати це як поганий токен; запропонуйте оператору виконати re-pair або схвалити вужчий/ширший контракт scopes.
Ідентичність пристрою + pairing
- Nodes мають включати стабільну ідентичність пристрою (
device.id), отриману з fingerprint пари ключів. - Gateways видають токени для кожного пристрою + ролі.
- Pairing approvals потрібні для нових device IDs, якщо не ввімкнено локальне auto-approval.
- Pairing auto-approval зосереджене на прямих підключеннях local loopback.
- OpenClaw також має вузький backend/container-local шлях самопідключення для довірених helper flows зі спільним секретом.
- Підключення same-host tailnet або LAN усе ще вважаються віддаленими для pairing і потребують схвалення.
- WS-клієнти зазвичай включають ідентичність
deviceпід часconnect(operator + node). Єдині винятки operator без пристрою — явні trust paths:gateway.controlUi.allowInsecureAuth=trueдля сумісності небезпечного HTTP лише на localhost.- успішна автентифікація operator Control UI для
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, серйозне зниження безпеки).- backend RPCs прямого loopback
gateway-client, автентифіковані спільним gateway token/password.
- Усі підключення мають підписувати наданий сервером nonce
connect.challenge.
Діагностика міграції автентифікації пристроїв
Для legacy clients, які досі використовують поведінку підписування до challenge,connect тепер повертає
detail codes DEVICE_AUTH_* у error.details.code зі стабільним error.details.reason.
Поширені помилки міграції:
| Повідомлення | details.code | details.reason | Значення |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Клієнт пропустив device.nonce (або надіслав порожнє значення). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Клієнт підписав із застарілим/неправильним nonce. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Payload підпису не відповідає payload v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Підписаний timestamp поза дозволеним skew. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id не відповідає fingerprint відкритого ключа. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Не вдалося перевірити формат/canonicalization відкритого ключа. |
- Завжди чекайте
connect.challenge. - Підписуйте payload v2, який містить server nonce.
- Надсилайте той самий nonce у
connect.params.device.nonce. - Бажаний payload підпису —
v3, який прив’язуєplatformіdeviceFamilyна додачу до полів device/client/role/scopes/token/nonce. - Legacy-підписи
v2залишаються прийнятими для сумісності, але pinning metadata paired-device усе ще керує command policy під час повторного підключення.
TLS + pinning
- TLS підтримується для WS-з’єднань.
- Клієнти можуть необов’язково закріпити fingerprint сертифіката gateway (див. конфігурацію
gateway.tlsплюсgateway.remote.tlsFingerprintабо CLI--tls-fingerprint).
Область дії
Цей протокол відкриває повний API Gateway (status, channels, models, chat, agent, sessions, nodes, approvals тощо). Точну поверхню визначають схеми TypeBox уsrc/gateway/protocol/schema.ts.