Gateway
پروتکل Gateway
Gateway پروتکل WS، صفحه کنترل واحد + انتقال Node برای OpenClaw است. همه کلاینتها (CLI، رابط کاربری وب، برنامه macOS، Nodeهای iOS/Android، Nodeهای headless) از طریق WebSocket وصل میشوند و در زمان دستدهی، نقش + حوزه خود را اعلام میکنند.
انتقال
- WebSocket، فریمهای متنی با payloadهای JSON.
- نخستین فریم باید یک درخواست
connectباشد. - فریمهای پیش از اتصال به 64 KiB محدود هستند. پس از دستدهی موفق، کلاینتها
باید از محدودیتهای
hello-ok.policy.maxPayloadوhello-ok.policy.maxBufferedBytesپیروی کنند. وقتی تشخیصها فعال باشند، فریمهای ورودی بیشازحد بزرگ و بافرهای خروجی کند، پیش از آنکه gateway فریم تحتتأثیر را ببندد یا حذف کند، رویدادهایpayload.largeمنتشر میکنند. این رویدادها اندازهها، محدودیتها، سطحها و کدهای دلیل امن را نگه میدارند. آنها بدنه پیام، محتوای پیوست، بدنه خام فریم، توکنها، کوکیها یا مقادیر محرمانه را نگه نمیدارند.
دستدهی (connect)
Gateway → کلاینت (چالش پیش از اتصال):
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}کلاینت → Gateway:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "maxProtocol": 4, "client": { "id": "cli", "version": "1.2.3", "platform": "macos", "mode": "operator" }, "role": "operator", "scopes": ["operator.read", "operator.write"], "caps": [], "commands": [], "permissions": {}, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-cli/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Gateway → کلاینت:
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}در حالی که Gateway هنوز در حال تکمیل sidecarهای راهاندازی است، درخواست connect میتواند
یک خطای قابلتلاشمجدد UNAVAILABLE برگرداند که در آن details.reason برابر
"startup-sidecars" و شامل retryAfterMs است. کلاینتها باید این پاسخ را
در چارچوب بودجه کلی اتصال خود دوباره تلاش کنند، بهجای اینکه آن را بهعنوان
شکست نهایی دستدهی نمایش دهند.
server، features، snapshot و policy همگی طبق schema
(packages/gateway-protocol/src/schema/frames.ts) الزامی هستند. auth نیز الزامی است و
نقش/حوزههای مذاکرهشده را گزارش میکند. pluginSurfaceUrls اختیاری است و نام سطحهای Plugin،
مانند canvas، را به URLهای میزبانیشده و حوزهبندیشده نگاشت میکند.
URLهای سطح Plugin حوزهبندیشده ممکن است منقضی شوند. Nodeها میتوانند
node.pluginSurface.refresh را با { "surface": "canvas" } فراخوانی کنند تا یک ورودی تازه
در pluginSurfaceUrls دریافت کنند. بازآرایی آزمایشی Plugin بوم از مسیر سازگاری منسوخ
canvasHostUrl، canvasCapability یا
node.canvas.capability.refresh پشتیبانی نمیکند؛ کلاینتها و gatewayهای native فعلی
باید از سطحهای Plugin استفاده کنند.
وقتی هیچ توکن دستگاهی صادر نمیشود، hello-ok.auth مجوزهای مذاکرهشده را
بدون فیلدهای توکن گزارش میکند:
{ "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }}کلاینتهای بکاند مورداعتماد در همان فرایند (client.id: "gateway-client",
client.mode: "backend") میتوانند در اتصالات loopback مستقیم، وقتی با توکن/گذرواژه مشترک gateway
احراز هویت میکنند، device را حذف کنند. این مسیر برای RPCهای صفحه کنترل داخلی رزرو شده است
و مانع میشود baselineهای قدیمی جفتسازی CLI/دستگاه، کار بکاند محلی مانند بهروزرسانیهای نشست
subagent را مسدود کنند. کلاینتهای دوردست،
کلاینتهای با مبدأ مرورگر، کلاینتهای Node، و کلاینتهای صریح device-token/device-identity
همچنان از بررسیهای عادی جفتسازی و ارتقای حوزه استفاده میکنند.
وقتی یک توکن دستگاه صادر میشود، hello-ok همچنین شامل موارد زیر است:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}bootstrap داخلی QR/setup-code یک مسیر تحویل موبایل تازه است. یک اتصال موفق baseline setup-code یک توکن Node اصلی بههمراه یک توکن operator محدود برمیگرداند:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}تحویل operator عمداً محدود شده است تا onboarding با QR بتواند حلقه operator موبایل را شروع کند
و راهاندازی native را بدون اعطای حوزههای تغییر جفتسازی یا operator.admin کامل کند.
این شامل operator.talk.secrets است تا کلاینت native بتواند پیکربندی Talk موردنیاز خود را
پس از bootstrap بخواند. دسترسی گستردهتر به جفتسازی و admin به یک جریان جداگانه جفتسازی
یا توکن operator تأییدشده نیاز دارد. کلاینتها باید
hello-ok.auth.deviceTokens را فقط
وقتی پایدار کنند که اتصال از احراز هویت bootstrap روی انتقال مورداعتماد مانند wss:// یا
جفتسازی loopback/local استفاده کرده باشد.
نمونه Node
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "maxProtocol": 4, "client": { "id": "ios-node", "version": "1.2.3", "platform": "ios", "mode": "node" }, "role": "node", "scopes": [], "caps": ["camera", "canvas", "screen", "location", "voice"], "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"], "permissions": { "camera.capture": true, "screen.record": false }, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-ios/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}فریمبندی
- درخواست:
{type:"req", id, method, params} - پاسخ:
{type:"res", id, ok, payload|error} - رویداد:
{type:"event", event, payload, seq?, stateVersion?}
متدهای دارای اثر جانبی به کلیدهای idempotency نیاز دارند (schema را ببینید).
نقشها + حوزهها
برای مدل کامل حوزههای operator، بررسیهای زمان تأیید، و معناشناسی secret مشترک، حوزههای operator را ببینید.
نقشها
operator= سرویسگیرنده سطح کنترل (CLI/UI/اتوماسیون).node= میزبان قابلیت (camera/screen/canvas/system.run).
دامنهها (operator)
دامنههای رایج:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config با includeSecrets: true به operator.talk.secrets
(یا operator.admin) نیاز دارد.
وقتی رازها گنجانده میشوند، سرویسگیرندهها باید اعتبارنامه ارائهدهنده فعال Talk را
از talk.resolved.config.apiKey بخوانند؛ talk.providers.<id>.apiKey
در شکل منبع باقی میماند و ممکن است یک شیء SecretRef یا یک رشته پوشیدهشده باشد.
روشهای RPC متعلق به Gateway که توسط Plugin ثبت شدهاند ممکن است دامنه operator خودشان را درخواست کنند، اما
پیشوندهای مدیریت هسته رزرو شده (config.*، exec.approvals.*، wizard.*،
update.*) همیشه به operator.admin نگاشت میشوند.
دامنه روش فقط نخستین دروازه است. برخی دستورهای اسلش که از طریق
chat.send قابل دسترسی هستند، افزون بر آن بررسیهای سختگیرانهتری در سطح دستور اعمال میکنند. برای نمونه، نوشتنهای پایدار
/config set و /config unset به operator.admin نیاز دارند.
node.pair.approve افزون بر دامنه پایه روش، یک بررسی دامنه اضافی در زمان تأیید نیز دارد:
- درخواستهای بدون دستور:
operator.pairing - درخواستهای دارای دستورهای
nodeغیر اجرایی:operator.pairing+operator.write - درخواستهایی که شامل
system.run،system.run.prepare، یاsystem.whichهستند:operator.pairing+operator.admin
قابلیتها/دستورها/مجوزها (node)
گرهها هنگام اتصال ادعاهای قابلیت را اعلام میکنند:
caps: دستههای سطحبالای قابلیت مانندcamera،canvas،screen،location،voice، وtalk.commands: فهرست مجاز دستورها برای فراخوانی.permissions: کنترلهای جزئی (مانندscreen.record،camera.capture).
Gateway این موارد را بهعنوان ادعا در نظر میگیرد و فهرستهای مجاز سمت سرور را اعمال میکند.
حضور
system-presenceورودیهایی را برمیگرداند که با هویت دستگاه کلیدگذاری شدهاند.- ورودیهای حضور شامل
deviceId،roles، وscopesهستند تا UIها بتوانند برای هر دستگاه یک ردیف واحد نشان دهند، حتی وقتی دستگاه هم بهعنوانoperatorو هم بهعنوانnodeمتصل میشود. node.listشامل فیلدهای اختیاریlastSeenAtMsوlastSeenReasonاست. گرههای متصل، زمان اتصال فعلی خود را بهعنوانlastSeenAtMsبا دلیلconnectگزارش میکنند؛ گرههای جفتشده همچنین میتوانند زمانی که یک رویداد قابل اعتماد گره، فراداده جفتسازی آنها را بهروزرسانی میکند، حضور پسزمینه پایدار را گزارش کنند.
رویداد زنده بودن پسزمینه گره
گرهها میتوانند node.event را با event: "node.presence.alive" فراخوانی کنند تا ثبت شود که یک گره جفتشده
در طول یک بیدارسازی پسزمینه زنده بوده، بدون اینکه بهعنوان متصل علامتگذاری شود.
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger یک enum بسته است: background، silent_push، bg_app_refresh،
significant_location، manual، یا connect. رشتههای ناشناخته trigger پیش از پایداری توسط Gateway به
background عادیسازی میشوند. این رویداد فقط برای نشستهای دستگاه node احراز هویتشده پایدار است؛
نشستهای بدون دستگاه یا جفتنشده handled: false را برمیگردانند.
Gatewayهای موفق یک نتیجه ساختاریافته برمیگردانند:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Gatewayهای قدیمیتر ممکن است هنوز برای node.event مقدار { "ok": true } را برگردانند؛ سرویسگیرندهها باید آن را بهعنوان یک
RPC تأییدشده در نظر بگیرند، نه بهعنوان پایداری حضور بادوام.
دامنهبندی رویدادهای پخش
رویدادهای پخش WebSocket که از سرور ارسال میشوند با دامنه محدود میشوند تا نشستهای محدود به جفتسازی یا فقط گره، محتوای نشست را بهصورت منفعل دریافت نکنند.
- فریمهای چت، عامل، و نتیجه ابزار (از جمله رویدادهای
agentجریانی و نتایج فراخوانی ابزار) دستکم بهoperator.readنیاز دارند. نشستهای بدونoperator.readاین فریمها را بهطور کامل رد میکنند. - پخشهای
plugin.*تعریفشده توسط Plugin بسته به اینکه Plugin چگونه آنها را ثبت کرده است، بهoperator.writeیاoperator.adminمحدود میشوند. - رویدادهای وضعیت و انتقال (
heartbeat،presence،tick، چرخه عمر اتصال/قطع اتصال، و مانند آن) بدون محدودیت باقی میمانند تا سلامت انتقال برای هر نشست احراز هویتشده قابل مشاهده بماند. - خانوادههای ناشناخته رویدادهای پخش بهصورت پیشفرض با دامنه محدود میشوند (بسته در صورت خطا)، مگر اینکه یک handler ثبتشده صراحتاً آنها را آزادتر کند.
هر اتصال سرویسگیرنده شماره توالی مخصوص همان سرویسگیرنده را نگه میدارد تا پخشها روی همان سوکت ترتیب یکنواخت را حفظ کنند، حتی وقتی سرویسگیرندههای مختلف زیرمجموعههای متفاوتی از جریان رویداد را پس از فیلتر دامنه میبینند.
خانوادههای رایج روشهای RPC
سطح عمومی WS گستردهتر از نمونههای handshake/auth بالا است. این
یک خروجی تولیدشده نیست — hello-ok.features.methods یک فهرست محافظهکارانه
برای کشف قابلیت است که از src/gateway/server-methods-list.ts بهعلاوه exportهای روش بارگذاریشده
Plugin/channel ساخته شده است. آن را بهعنوان کشف قابلیت در نظر بگیرید، نه یک
شمارش کامل از src/gateway/server-methods/*.ts.
سیستم و هویت
healthنمایه سلامت Gateway را، چه از حافظه نهان و چه با بررسی تازه، برمیگرداند.diagnostics.stabilityضبطکننده پایداری تشخیصی محدود اخیر را برمیگرداند. این مورد فرادادههای عملیاتی مانند نام رویدادها، شمارشها، اندازههای بایتی، خوانشهای حافظه، وضعیت صف/نشست، نام کانال/Plugin و شناسههای نشست را نگه میدارد. متن گفتوگو، بدنههای Webhook، خروجیهای ابزار، بدنههای خام درخواست یا پاسخ، توکنها، کوکیها، یا مقادیر محرمانه را نگه نمیدارد. محدوده خواندن اپراتور لازم است.statusخلاصه Gateway به سبک/statusرا برمیگرداند؛ فیلدهای حساس فقط برای کلاینتهای اپراتور با محدوده ادمین گنجانده میشوند.gateway.identity.getهویت دستگاه Gateway را که جریانهای رله و جفتسازی از آن استفاده میکنند برمیگرداند.system-presenceنمایه حضور فعلی را برای دستگاههای اپراتور/Node متصل برمیگرداند.system-eventیک رویداد سیستم را اضافه میکند و میتواند زمینه حضور را بهروزرسانی/پخش کند.last-heartbeatآخرین رویداد Heartbeat پایدارشده را برمیگرداند.set-heartbeatsپردازش Heartbeat را در Gateway تغییر وضعیت میدهد.
مدلها و مصرف
models.listکاتالوگ مدل مجاز در زمان اجرا را برمیگرداند. برای مدلهای پیکربندیشده در اندازه انتخابگر (agents.defaults.modelsابتدا، سپسmodels.providers.*.models) مقدار{ "view": "configured" }را بفرستید، یا برای کاتالوگ کامل مقدار{ "view": "all" }را.usage.statusپنجرههای مصرف/خلاصه سهمیه باقیمانده ارائهدهنده را برمیگرداند.usage.costخلاصههای تجمیعی مصرف هزینه را برای یک بازه تاریخی برمیگرداند. برای یک عاملagentIdرا بفرستید، یا برای تجمیع عاملهای پیکربندیشدهagentScope: "all"را.doctor.memory.statusآمادگی حافظه برداری / embedding ذخیرهشده در حافظه نهان را برای فضای کاری عامل پیشفرض فعال برمیگرداند. فقط زمانی که فراخواننده صریحا یک ping زنده به ارائهدهنده embedding میخواهد،{ "probe": true }یا{ "deep": true }را بفرستید. کلاینتهای آگاه از Dreaming همچنین میتوانند برای محدود کردن آمار ذخیرهگاه Dreaming به یک فضای کاری عامل انتخابشده،{ "agentId": "agent-id" }را بفرستند؛ حذفagentIdجایگزین عامل پیشفرض را نگه میدارد و فضاهای کاری Dreaming پیکربندیشده را تجمیع میکند.doctor.memory.dreamDiary،doctor.memory.backfillDreamDiary،doctor.memory.resetDreamDiary،doctor.memory.resetGroundedShortTerm،doctor.memory.repairDreamingArtifacts، وdoctor.memory.dedupeDreamDiaryپارامترهای اختیاری{ "agentId": "agent-id" }را برای نماها/کنشهای Dreaming عامل انتخابشده میپذیرند. وقتیagentIdحذف شود، روی فضای کاری عامل پیشفرض پیکربندیشده عمل میکنند.doctor.memory.remHarnessیک پیشنمایش محدود و فقطخواندنی از مهار REM را برای کلاینتهای صفحه کنترل راهدور برمیگرداند. این میتواند مسیرهای فضای کاری، بریدههای حافظه، Markdown زمینهدار رندرشده و نامزدهای ارتقای عمیق را شامل شود، بنابراین فراخوانندهها بهoperator.readنیاز دارند.sessions.usageخلاصههای مصرف برای هر نشست را برمیگرداند. برای یک عاملagentIdرا بفرستید، یا برای فهرست کردن عاملهای پیکربندیشده با همagentScope: "all"را.sessions.usage.timeseriesمصرف سری زمانی را برای یک نشست برمیگرداند.sessions.usage.logsورودیهای گزارش مصرف را برای یک نشست برمیگرداند.
کانالها و کمککنندههای ورود
channels.statusخلاصههای وضعیت کانال/Plugin داخلی + همراه را برمیگرداند.channels.logoutاز یک کانال/حساب مشخص، در جایی که کانال از خروج پشتیبانی میکند، خارج میشود.web.login.startیک جریان ورود QR/وب را برای ارائهدهنده کانال وب فعلی که قابلیت QR دارد شروع میکند.web.login.waitمنتظر کامل شدن همان جریان ورود QR/وب میماند و در صورت موفقیت کانال را شروع میکند.push.testیک پوش آزمایشی APNs را به یک Node ثبتشده iOS میفرستد.voicewake.getمحرکهای wake-word ذخیرهشده را برمیگرداند.voicewake.setمحرکهای wake-word را بهروزرسانی و تغییر را پخش میکند.
پیامرسانی و گزارشها
sendهمان RPC مستقیم تحویل خروجی برای ارسالهای هدفگیریشده به کانال/حساب/رشته خارج از اجراکننده گفتوگو است.logs.tailدنباله گزارش فایل پیکربندیشده Gateway را همراه با کنترلهای نشانگر/محدودیت و حداکثر بایت برمیگرداند.
Talk و TTS
talk.catalogکاتالوگ فقطخواندنی ارائهدهنده Talk را برای گفتار، رونویسی جریانی، و صدای بلادرنگ برمیگرداند. این شامل شناسههای رسمی ارائهدهنده، نامهای مستعار رجیستری، برچسبها، وضعیت پیکربندیشده، یک نتیجه اختیاریreadyدر سطح گروه، شناسههای مدل/صدای آشکارشده، حالتهای رسمی، انتقالها، راهبردهای مغز، و پرچمهای صوتی/قابلیت بلادرنگ است، بدون اینکه اسرار ارائهدهنده را برگرداند یا پیکربندی سراسری را تغییر دهد. Gatewayهای فعلی پس از اعمال انتخاب ارائهدهنده زمان اجرا،readyرا تنظیم میکنند؛ کلاینتها برای سازگاری با Gatewayهای قدیمیتر باید نبود آن را تأییدنشده در نظر بگیرند.talk.configبار پیکربندی مؤثر Talk را برمیگرداند؛includeSecretsبهoperator.talk.secrets(یاoperator.admin) نیاز دارد.talk.session.createیک نشست Talk تحت مالکیت Gateway برایrealtime/gateway-relay،transcription/gateway-relay، یاstt-tts/managed-roomایجاد میکند. برایstt-tts/managed-room، فراخوانندههایoperator.writeکهsessionKeyمیفرستند باید برای دیدپذیری scoped کلید نشست،spawnedByرا نیز بفرستند؛ ایجادsessionKeyبدون scoped وbrain: "direct-tools"بهoperator.adminنیاز دارد.talk.session.joinتوکن نشست managed-room را اعتبارسنجی میکند، در صورت نیاز رویدادهایsession.readyیاsession.replacedرا منتشر میکند، و فراداده اتاق/نشست را بههمراه رویدادهای اخیر Talk بدون توکن متنآشکار یا هش توکن ذخیرهشده برمیگرداند.talk.session.appendAudioصدای ورودی PCM با کدگذاری base64 را به نشستهای رله بلادرنگ و رونویسی تحت مالکیت Gateway اضافه میکند.talk.session.startTurn،talk.session.endTurn، وtalk.session.cancelTurnچرخه عمر نوبت managed-room را با رد نوبت کهنه پیش از پاک شدن وضعیت هدایت میکنند.talk.session.cancelOutputخروجی صوتی دستیار را متوقف میکند، عمدتا برای ورود میانگفتاری کنترلشده با VAD در نشستهای رله Gateway.talk.session.submitToolResultیک فراخوانی ابزار ارائهدهنده را که توسط نشست رله بلادرنگ تحت مالکیت Gateway منتشر شده کامل میکند. وقتی نتیجه نهایی بعدا میآید، برای خروجی موقت ابزارoptions: { willContinue: true }را بفرستید، یا وقتی نتیجه ابزار باید فراخوانی ارائهدهنده را بدون شروع پاسخ بلادرنگ دیگری از دستیار برآورده کند،options: { suppressResponse: true }را.talk.session.steerکنترل صوتی اجرای فعال را به یک نشست Talk پشتوانهدار با عامل و تحت مالکیت Gateway میفرستد. این مقدار{ sessionId, text, mode? }را میپذیرد، که در آنmodeیکی ازstatus،steer،cancel، یاfollowupاست؛ حالت حذفشده از متن گفتاری طبقهبندی میشود.talk.session.closeیک نشست رله، رونویسی، یا managed-room تحت مالکیت Gateway را میبندد و رویدادهای پایانی Talk را منتشر میکند.talk.modeوضعیت حالت Talk فعلی را برای کلاینتهای WebChat/Control UI تنظیم/پخش میکند.talk.client.createیک نشست ارائهدهنده بلادرنگ تحت مالکیت کلاینت را با استفاده ازwebrtcیاprovider-websocketایجاد میکند، در حالی که Gateway مالک پیکربندی، اعتبارنامهها، دستورالعملها، و سیاست ابزار است.talk.client.toolCallبه انتقالهای بلادرنگ تحت مالکیت کلاینت اجازه میدهد فراخوانیهای ابزار ارائهدهنده را به سیاست Gateway ارسال کنند. نخستین ابزار پشتیبانیشدهopenclaw_agent_consultاست؛ کلاینتها یک شناسه اجرا دریافت میکنند و پیش از ارسال نتیجه ابزار ویژه ارائهدهنده، منتظر رویدادهای چرخه عمر عادی گفتوگو میمانند.talk.client.steerکنترل صوتی اجرای فعال را برای انتقالهای بلادرنگ تحت مالکیت کلاینت میفرستد. Gateway اجرای تعبیهشده فعال را ازsessionKeyحل میکند و بهجای کنار گذاشتن بیصدای هدایت، یک نتیجه ساختاریافته پذیرفته/ردشده برمیگرداند.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.reloadSecretRefهای فعال را دوباره حل میکند و وضعیت محرمانه زمان اجرا را فقط در صورت موفقیت کامل جایگزین میکند.secrets.resolveانتسابهای محرمانه هدفدستور را برای یک مجموعه دستور/هدف مشخص حل میکند.config.getنمایه و هش پیکربندی فعلی را برمیگرداند.config.setیک بار پیکربندی اعتبارسنجیشده را مینویسد.config.patchیک بهروزرسانی جزئی پیکربندی را ادغام میکند. جایگزینی مخرب آرایه نیاز دارد مسیر تحتتأثیر درreplacePathsباشد؛ آرایههای تودرتو زیر ورودیهای آرایه از مسیرهای[]مانندagents.list[].skillsاستفاده میکنند.config.applyکل بار پیکربندی را اعتبارسنجی + جایگزین میکند.config.schemaبار schema پیکربندی زنده را که Control UI و ابزارهای CLI استفاده میکنند برمیگرداند: schema،uiHints، نسخه، و فراداده تولید، شامل فراداده schema مربوط به Plugin + کانال وقتی زمان اجرا بتواند آن را بارگذاری کند. schema شامل فراداده فیلدtitle/descriptionاست که از همان برچسبها و متن راهنمای استفادهشده توسط UI مشتق شده، شامل شاخههای ترکیب شیء تودرتو، wildcard، آیتم آرایه، وanyOf/oneOf/allOfوقتی مستندات فیلد منطبق وجود داشته باشد.config.schema.lookupیک بار جستوجوی محدود به مسیر را برای یک مسیر پیکربندی برمیگرداند: مسیر نرمالشده، یک گره schema کمعمق، راهنمای منطبق +hintPath،reloadKindاختیاری، و خلاصههای فرزند بلافصل برای کاوش UI/CLI.reloadKindیکی ازrestart،hot، یاnoneاست و برنامهریز بارگذاری مجدد پیکربندی Gateway را برای مسیر درخواستشده بازتاب میدهد. گرههای schema جستوجو، مستندات کاربرمحور و فیلدهای رایج اعتبارسنجی (title،description،type،enum،const،format،pattern، کرانهای عددی/رشتهای/آرایهای/شیء، و پرچمهایی مانندadditionalProperties،deprecated،readOnly،writeOnly) را نگه میدارند. خلاصههای فرزندkey،pathنرمالشده،type،required،hasChildren،reloadKindاختیاری، بهعلاوهhint/hintPathمنطبق را آشکار میکنند.update.runجریان بهروزرسانی Gateway را اجرا میکند و فقط وقتی خود بهروزرسانی موفق شده باشد، یک راهاندازی مجدد زمانبندی میکند؛ فراخوانندههای دارای نشست میتوانندcontinuationMessageرا بگنجانند تا راهاندازی، یک نوبت پیگیری عامل را از طریق صف ادامه راهاندازی مجدد از سر بگیرد. بهروزرسانیهای مدیر بسته و بهروزرسانیهای git-checkout نظارتشده از صفحه کنترل، بهجای جایگزینی درخت بسته یا تغییر خروجی checkout/build داخل Gateway زنده، از تحویل مدیریتشده سرویس جداشده استفاده میکنند. یک تحویل شروعشدهok: trueرا باresult.reason: "managed-service-handoff-started"وhandoff.status: "started"برمیگرداند؛ تحویلهای در دسترس نبودن یا ناموفقok: falseرا باmanaged-service-handoff-unavailableیاmanaged-service-handoff-failed، بهعلاوهhandoff.commandوقتی به بهروزرسانی دستی shell نیاز باشد، برمیگردانند. تحویل در دسترس نبودن یعنی OpenClaw مرز ناظر امن یا هویت سرویس پایدار ندارد، مانندOPENCLAW_SYSTEMD_UNITبرای systemd. هنگام یک تحویل شروعشده، sentinel راهاندازی مجدد ممکن است برای مدت کوتاهیstats.reason: "restart-health-pending"را گزارش کند؛ ادامه تا زمانی به تأخیر میافتد که CLI، Gateway راهاندازیشده دوباره را تأیید و sentinel نهاییokرا بنویسد.update.statusآخرین sentinel راهاندازی مجدد بهروزرسانی را تازهسازی و برمیگرداند، شامل نسخه در حال اجرای پس از راهاندازی مجدد وقتی در دسترس باشد.wizard.start،wizard.next،wizard.status، وwizard.cancelجادوگر راهاندازی اولیه را از طریق WS RPC ارائه میکنند.
کمککنندههای عامل و فضای کاری
agents.listمدخلهای عامل پیکربندیشده، از جمله مدل مؤثر و فرادادهٔ زمان اجرا را برمیگرداند.agents.create،agents.updateوagents.deleteرکوردهای عامل و اتصال فضای کاری را مدیریت میکنند.agents.files.list،agents.files.getوagents.files.setفایلهای فضای کاری راهانداز را که برای یک عامل در دسترس قرار گرفتهاند مدیریت میکنند.tasks.list،tasks.getوtasks.cancelدفتر وظایف Gateway را برای کلاینتهای SDK و اپراتور در دسترس قرار میدهند.artifacts.list،artifacts.getوartifacts.downloadخلاصههای آرتیفکت مشتقشده از رونوشت و بارگیریها را برای محدودهٔ صریحsessionKey،runIdیاtaskIdدر دسترس قرار میدهند. پرسوجوهای اجرا و وظیفه، نشست مالک را در سمت سرور حل میکنند و فقط رسانههای رونوشت با منشأ مطابق را برمیگردانند؛ منابع URL ناامن یا محلی بهجای واکشی در سمت سرور، بارگیریهای پشتیبانینشده برمیگردانند.environments.listوenvironments.statusکشف فقطخواندنی محیطهای محلی Gateway و Node را برای کلاینتهای SDK در دسترس قرار میدهند.agent.identity.getهویت مؤثر دستیار را برای یک عامل یا نشست برمیگرداند.agent.waitمنتظر پایان یک اجرا میماند و در صورت موجود بودن، عکسبرداشت پایانی را برمیگرداند.
کنترل نشست
sessions.listنمایهٔ فعلی نشست را برمیگرداند، از جمله فرادادهٔagentRuntimeدر هر ردیف، وقتی یک پشتانهٔ زمان اجرای عامل پیکربندی شده باشد.sessions.subscribeوsessions.unsubscribeاشتراکهای رویداد تغییر نشست را برای کلاینت WS فعلی روشن یا خاموش میکنند.sessions.messages.subscribeوsessions.messages.unsubscribeاشتراکهای رویداد رونوشت/پیام را برای یک نشست روشن یا خاموش میکنند.sessions.previewپیشنمایشهای رونوشت محدودشده را برای کلیدهای نشست مشخص برمیگرداند.sessions.describeیک ردیف نشست Gateway را برای یک کلید نشست دقیق برمیگرداند.sessions.resolveیک هدف نشست را حل یا متعارفسازی میکند.sessions.createیک مدخل نشست جدید ایجاد میکند.sessions.sendپیامی را به یک نشست موجود میفرستد.sessions.steerگونهٔ وقفهدادن و هدایت برای یک نشست فعال است.sessions.abortکار فعال برای یک نشست را لغو میکند. فراخوان میتواندkeyبههمراهrunIdاختیاری را بفرستد، یا برای اجراهای فعالی که Gateway میتواند به یک نشست حل کند، فقطrunIdرا بفرستد.sessions.patchفراداده/بازنویسیهای نشست را بهروزرسانی میکند و مدل متعارف حلشده بههمراهagentRuntimeمؤثر را گزارش میدهد.sessions.reset،sessions.deleteوsessions.compactنگهداشت نشست را انجام میدهند.sessions.getردیف کامل نشست ذخیرهشده را برمیگرداند.- اجرای چت همچنان از
chat.history،chat.send،chat.abortوchat.injectاستفاده میکند.chat.historyبرای کلاینتهای UI از نظر نمایش نرمالسازی میشود: برچسبهای دستور درونخطی از متن قابلمشاهده حذف میشوند، payloadهای XML فراخوانی ابزار در متن ساده (از جمله<tool_call>...</tool_call>،<function_call>...</function_call>،<tool_calls>...</tool_calls>،<function_calls>...</function_calls>، و بلوکهای کوتاهشدهٔ فراخوانی ابزار) و توکنهای کنترل مدل ASCII/تمامعرض نشتکرده حذف میشوند، ردیفهای دستیار فقط دارای توکن خاموش مانند دقیقاًNO_REPLY/no_replyحذف میشوند، و ردیفهای بیشازحد بزرگ میتوانند با جاینگهدارها جایگزین شوند. chat.message.getخوانندهٔ افزایشی و محدودِ پیام کامل برای یک مدخل رونوشت قابلمشاهدهٔ واحد است. کلاینتهاsessionKey، در صورت عاملمحور بودن انتخاب نشستagentIdاختیاری، بههمراه یکmessageIdرونوشت را که قبلاً از طریقchat.historyارائه شده میفرستند، و Gateway همان تصویرسازی نرمالشده برای نمایش را بدون سقف کوتاهسازی تاریخچهٔ سبک برمیگرداند، وقتی مدخل ذخیرهشده هنوز موجود باشد و بیشازحد بزرگ نباشد.chat.sendمقدار یکنوبتیfastMode: "auto"را میپذیرد تا برای فراخوانیهای مدل که پیش از آستانهٔ خودکار شروع شدهاند از حالت سریع استفاده کند، سپس فراخوانیهای تلاش دوباره، fallback، نتیجهٔ ابزار یا ادامه را بدون حالت سریع شروع کند. مقدار پیشفرض آستانه ۶۰ ثانیه است و میتوان آن را برای هر مدل باagents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondsپیکربندی کرد. فراخوانchat.sendمیتواند مقدار یکنوبتیfastAutoOnSecondsرا برای بازنویسی آستانه در آن درخواست بفرستد.
جفتسازی دستگاه و توکنهای دستگاه
device.pair.listدستگاههای جفتشدهٔ در انتظار و تأییدشده را برمیگرداند.device.pair.setupCodeیک کد راهاندازی موبایل و، بهطور پیشفرض، یک URL دادهٔ QR بهصورت PNG ایجاد میکند. بهoperator.adminنیاز دارد و عمداً از کشف تبلیغشده حذف شده است. نتیجه شاملsetupCode،qrDataUrlاختیاری،gatewayUrl، برچسب غیرمحرمانهٔauthوurlSourceاست.device.pair.approve،device.pair.rejectوdevice.pair.removeرکوردهای جفتسازی دستگاه را مدیریت میکنند.device.token.rotateیک توکن دستگاه جفتشده را در محدودهٔ نقش تأییدشده و دامنهٔ فراخوان آن میچرخاند.device.token.revokeیک توکن دستگاه جفتشده را در محدودهٔ نقش تأییدشده و دامنهٔ فراخوان آن باطل میکند.
کد راهاندازی یک گواهی راهانداز کوتاهعمر را در خود دارد. کلاینتها نباید آن را بیرون از جریان جفتسازی ثبت یا پایدار کنند.
جفتسازی Node، فراخوانی و کار در انتظار
node.pair.request،node.pair.list،node.pair.approve،node.pair.reject،node.pair.removeوnode.pair.verifyجفتسازی Node و تأیید راهاندازی را پوشش میدهند.node.listوnode.describeوضعیت Nodeهای شناختهشده/متصل را برمیگردانند.node.renameبرچسب یک Node جفتشده را بهروزرسانی میکند.node.invokeیک فرمان را به یک Node متصل ارسال میکند.node.invoke.resultنتیجهٔ یک درخواست فراخوانی را برمیگرداند.node.eventرویدادهای منشأگرفته از Node را به gateway برمیگرداند.node.pending.pullوnode.pending.ackAPIهای صف Node متصل هستند.node.pending.enqueueوnode.pending.drainکارهای در انتظار بادوام را برای Nodeهای آفلاین/قطعشده مدیریت میکنند.
خانوادههای تأیید
exec.approval.request،exec.approval.get،exec.approval.listوexec.approval.resolveدرخواستهای تأیید اجرای یکباره بههمراه جستوجو/بازپخش تأییدهای در انتظار را پوشش میدهند.exec.approval.waitDecisionمنتظر یک تأیید اجرای در انتظار میماند و تصمیم نهایی را برمیگرداند (یا در صورت timeout،null).exec.approvals.getوexec.approvals.setعکسبرداشتهای سیاست تأیید اجرای gateway را مدیریت میکنند.exec.approvals.node.getوexec.approvals.node.setسیاست تأیید اجرای محلی Node را از طریق فرمانهای relay Node مدیریت میکنند.plugin.approval.request،plugin.approval.list،plugin.approval.waitDecisionوplugin.approval.resolveجریانهای تأیید تعریفشده توسط Plugin را پوشش میدهند.
اتوماسیون، Skills و ابزارها
- اتوماسیون:
wakeتزریق متن بیدارسازی فوری یا در Heartbeat بعدی را زمانبندی میکند؛cron.get،cron.list،cron.status،cron.add،cron.update،cron.remove،cron.run،cron.runsکار زمانبندیشده را مدیریت میکنند. cron.runبرای اجراهای دستی همچنان یک RPC از نوع صفگذاری باقی میماند. کلاینتهایی که به معناشناسی تکمیل نیاز دارند بایدrunIdبرگشتی را بخوانند وcron.runsرا poll کنند.cron.runsیک فیلتر اختیاری و غیرخالیrunIdمیپذیرد تا کلاینتها بتوانند یک اجرای دستی صفشده را بدون رقابت با سایر مدخلهای تاریخچه برای همان کار دنبال کنند.- Skills و ابزارها:
commands.list،skills.*،tools.catalog،tools.effective،tools.invoke.
خانوادههای رویداد رایج
chat: بهروزرسانیهای چت UI مانندchat.injectو سایر رویدادهای چت فقط مربوط به رونوشت. در نسخهٔ ۴ پروتکل، payloadهای دلتاdeltaTextرا حمل میکنند؛messageعکسبرداشت تجمعی دستیار باقی میماند. جایگزینیهای غیرپیشوندیreplace=trueرا تنظیم میکنند و ازdeltaTextبهعنوان متن جایگزین استفاده میکنند.session.message،session.operationوsession.tool: بهروزرسانیهای رونوشت، عملیات نشست در جریان، و جریان رویداد برای یک نشست مشترکشده.sessions.changed: نمایهٔ نشست یا فراداده تغییر کرده است.presence: بهروزرسانیهای عکسبرداشت حضور سیستم.tick: رویداد دورهای keepalive / زندهبودن.health: بهروزرسانی عکسبرداشت سلامت gateway.heartbeat: بهروزرسانی جریان رویداد Heartbeat.cron: رویداد تغییر اجرای/کار cron.shutdown: اعلان خاموششدن gateway.node.pair.requested/node.pair.resolved: چرخهٔ عمر جفتسازی Node.node.invoke.request: پخش درخواست فراخوانی Node.device.pair.requested/device.pair.resolved: چرخهٔ عمر دستگاه جفتشده.voicewake.changed: پیکربندی trigger واژهٔ بیدارباش تغییر کرده است.exec.approval.requested/exec.approval.resolved: چرخهٔ عمر تأیید اجرا.plugin.approval.requested/plugin.approval.resolved: چرخهٔ عمر تأیید Plugin.
متدهای کمککنندهٔ Node
- Nodeها میتوانند
skills.binsرا فراخوانی کنند تا فهرست فعلی فایلهای اجرایی skill را برای بررسیهای اجازهٔ خودکار واکشی کنند.
RPCهای دفتر وظایف
کلاینتهای اپراتور میتوانند رکوردهای وظیفهٔ پسزمینهٔ Gateway را از طریق RPCهای دفتر وظایف بررسی و لغو کنند. این متدها خلاصههای پالایششدهٔ وظیفه را برمیگردانند، نه وضعیت خام زمان اجرا.
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گزارش میدهد که آیا زمان اجرا لغو را پذیرفته یا ثبت کرده است.
- پارامترها:
TaskSummary شامل id، status و فرادادهٔ اختیاری مانند kind،
runtime، title، agentId، sessionKey، childSessionKey، ownerKey،
runId، taskId، flowId، parentTaskId، sourceId، timestampها، پیشرفت،
خلاصهٔ پایانی و متن خطای پالایششده است. agentId عاملی را شناسایی میکند که
وظیفه را اجرا میکند؛ sessionKey و ownerKey زمینهٔ درخواستکننده و کنترل را
حفظ میکنند.
متدهای کمککنندهٔ اپراتور
- اپراتورها میتوانند
commands.list(operator.read) را برای دریافت فهرست دستورهای زمان اجرای یک عامل فراخوانی کنند.agentIdاختیاری است؛ برای خواندن فضای کاری عامل پیشفرض آن را حذف کنید.scopeکنترل میکند کهnameاصلی کدام سطح را هدف بگیرد:textتوکن دستور متنی اصلی را بدون/ابتدایی برمیگرداندnativeو مسیر پیشفرضboth، در صورت وجود، نامهای بومی آگاه از ارائهدهنده را برمیگردانند
textAliasesنامهای مستعار دقیق اسلشدار مانند/modelو/mرا حمل میکند.nativeNameنام دستور بومی آگاه از ارائهدهنده را، وقتی وجود داشته باشد، حمل میکند.providerاختیاری است و فقط بر نامگذاری بومی و در دسترس بودن دستورهای Plugin بومی اثر میگذارد.includeArgs=falseفراداده آرگومان سریالشده را از پاسخ حذف میکند.
- اپراتورها میتوانند
tools.catalog(operator.read) را برای دریافت کاتالوگ ابزار زمان اجرا برای یک عامل فراخوانی کنند. پاسخ شامل ابزارهای گروهبندیشده و فراداده منشأ است:source:coreیاpluginpluginId: مالک Plugin وقتیsource="plugin"باشدoptional: اینکه ابزار Plugin اختیاری است یا نه
- اپراتورها میتوانند
tools.effective(operator.read) را برای دریافت فهرست ابزار مؤثر در زمان اجرا برای یک نشست فراخوانی کنند.sessionKeyالزامی است.- Gateway بهجای پذیرش زمینه احراز هویت یا تحویلِ ارائهشده توسط فراخوان، زمینه زمان اجرای قابل اعتماد را سمت سرور از نشست استخراج میکند.
- پاسخ، یک تصویر مشتقشده سمت سرور و محدود به نشست از فهرست فعال است، شامل ابزارهای هسته، Plugin، کانال، و ابزارهای سرور MCP که از قبل کشف شدهاند.
tools.effectiveبرای MCP فقط خواندنی است: ممکن است کاتالوگ MCP یک نشست گرم را از طریق سیاست نهایی ابزار تصویر کند، اما زمانهای اجرای MCP را ایجاد نمیکند، ترابریها را وصل نمیکند، یاtools/listصادر نمیکند. اگر هیچ کاتالوگ گرم مطابقی وجود نداشته باشد، پاسخ ممکن است اعلانی مانندmcp-not-yet-connected،mcp-not-yet-listed، یاmcp-stale-catalogرا شامل شود.- ورودیهای ابزار مؤثر از
source="core"،source="plugin"،source="channel"، یاsource="mcp"استفاده میکنند.
- اپراتورها میتوانند
tools.invoke(operator.write) را برای فراخوانی یک ابزار در دسترس از همان مسیر سیاست Gateway مانند/tools/invokeفراخوانی کنند.nameالزامی است.args،sessionKey،agentId،confirm، وidempotencyKeyاختیاری هستند.- اگر هم
sessionKeyو همagentIdوجود داشته باشند، عامل نشست حلشده باید باagentIdمطابقت داشته باشد. - پوششدهندههای هسته فقط-مالک مانند
cron،gateway، وnodesبه هویت مالک/مدیر (operator.admin) نیاز دارند، هرچند خود متدtools.invokeبرابرoperator.writeاست. - پاسخ یک پوشش رو به SDK با فیلدهای
ok،toolName،outputاختیاری، وerrorنوعدار است. ردهای تأیید یا سیاست، بهجای دور زدن خط لوله سیاست ابزار Gateway، در payload مقدارok:falseبرمیگردانند.
- اپراتورها میتوانند
skills.status(operator.read) را برای دریافت فهرست skill قابل مشاهده برای یک عامل فراخوانی کنند.agentIdاختیاری است؛ برای خواندن فضای کاری عامل پیشفرض آن را حذف کنید.- پاسخ شامل واجد شرایط بودن، نیازمندیهای موجود نبودن، بررسیهای پیکربندی، و گزینههای نصب پاکسازیشده است، بدون افشای مقادیر خام secret.
- اپراتورها میتوانند
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 })بایتها را در offset دقیقِ رمزگشاییشده اضافه میکند.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? }یک بارگذاری commitشده را در دایرکتوریskills/<slug>فضای کاری عامل پیشفرض نصب میکند. مقدار slug و force باید با درخواست اصلیskills.upload.beginمطابقت داشته باشند. این حالت رد میشود مگر اینکهskills.install.allowUploadedArchivesفعال باشد. این تنظیم بر نصبهای ClawHub اثر نمیگذارد. - حالت نصبکننده Gateway:
{ name, installId, timeoutMs? }یک کنش اعلامشدهmetadata.openclaw.installرا روی میزبان Gateway اجرا میکند. کلاینتهای قدیمیتر ممکن است هنوزdangerouslyForceUnsafeInstallرا ارسال کنند؛ این فیلد منسوخ شده، فقط برای سازگاری پروتکل پذیرفته میشود، و نادیده گرفته میشود. برای تصمیمهای نصب تحت مالکیت اپراتور ازsecurity.installPolicyاستفاده کنید.
- حالت ClawHub:
- اپراتورها میتوانند
skills.update(operator.admin) را در دو حالت فراخوانی کنند:- حالت ClawHub یک slug رهگیریشده یا همه نصبهای رهگیریشده ClawHub را در فضای کاری عامل پیشفرض بهروزرسانی میکند.
- حالت پیکربندی مقادیر
skills.entries.<skillKey>مانندenabled،apiKey، وenvرا patch میکند.
نماهای models.list
models.list یک پارامتر اختیاری view میپذیرد:
- حذفشده یا
"default": رفتار فعلی زمان اجرا. اگرagents.defaults.modelsپیکربندی شده باشد، پاسخ کاتالوگ مجاز است، شامل مدلهای کشفشده بهصورت پویا برای ورودیهایprovider/*. در غیر این صورت پاسخ، کاتالوگ کامل Gateway است. "configured": رفتار در اندازه انتخابگر. اگرagents.defaults.modelsپیکربندی شده باشد، همچنان اولویت دارد، شامل کشف محدود به ارائهدهنده برای ورودیهایprovider/*. بدون یک allowlist، پاسخ از ورودیهای صریحmodels.providers.*.modelsاستفاده میکند و فقط وقتی هیچ ردیف مدل پیکربندیشدهای وجود نداشته باشد به کاتالوگ کامل برمیگردد."all": کاتالوگ کامل Gateway، با دور زدنagents.defaults.models. از این برای تشخیص و رابطهای کاربری کشف استفاده کنید، نه انتخابگرهای عادی مدل.
تأییدهای اجرا
- وقتی یک درخواست exec به تأیید نیاز داشته باشد، Gateway رویداد
exec.approval.requestedرا پخش میکند. - کلاینتهای اپراتور با فراخوانی
exec.approval.resolveحل میکنند (به scopeoperator.approvalsنیاز دارد). - برای
host=node،exec.approval.requestبایدsystemRunPlanرا شامل شود (argv/cwd/rawCommand/فراداده نشستِ canonical). درخواستهایی کهsystemRunPlanندارند رد میشوند. - پس از تأیید، فراخوانیهای فورواردشده
node.invoke system.runهمانsystemRunPlancanonical را بهعنوان زمینه معتبر دستور/cwd/نشست دوباره استفاده میکنند. - اگر فراخوان بین آمادهسازی و فوروارد نهاییِ تأییدشده
system.runمقدارcommand،rawCommand،cwd،agentId، یاsessionKeyرا تغییر دهد، Gateway بهجای اعتماد به payload تغییریافته، اجرا را رد میکند.
fallback تحویل عامل
- درخواستهای
agentمیتوانندdeliver=trueرا برای درخواست تحویل خروجی شامل کنند. bestEffortDeliver=falseرفتار سختگیرانه را نگه میدارد: هدفهای تحویل حلنشده یا فقط-داخلیINVALID_REQUESTبرمیگردانند.bestEffortDeliver=trueاجازه میدهد وقتی هیچ مسیر قابل تحویل خارجی قابل حل نباشد، به اجرای فقط-نشست fallback شود (برای مثال نشستهای داخلی/webchat یا پیکربندیهای چندکاناله مبهم).- نتیجههای نهایی
agentممکن است وقتی تحویل درخواست شده باشدresult.deliveryStatusرا شامل شوند، با استفاده از همان وضعیتهایsent،suppressed،partial_failed، وfailedکه برایopenclaw agent --json --deliverمستند شدهاند.
نسخهبندی
PROTOCOL_VERSIONدرpackages/gateway-protocol/src/version.tsقرار دارد.- کلاینتها
minProtocol+maxProtocolرا ارسال میکنند؛ سرور بازههایی را که پروتکل فعلیاش را شامل نشوند رد میکند. کلاینتها و سرورهای فعلی به پروتکل v4 نیاز دارند. - Schemaها + مدلها از تعریفهای TypeBox تولید میشوند:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ثابتهای کلاینت
کلاینت مرجع در src/gateway/client.ts از این پیشفرضها استفاده میکند. مقادیر در سراسر پروتکل v4 پایدار هستند و baseline مورد انتظار برای کلاینتهای شخص ثالثاند.
| ثابت | پیشفرض | منبع |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
| زمان پایان درخواست (برای هر RPC) | 30_000 میلیثانیه |
src/gateway/client.ts (requestTimeoutMs) |
| زمان پایان Preauth / چالش اتصال | 15_000 میلیثانیه |
src/gateway/handshake-timeouts.ts (پیکربندی/env میتواند بودجه جفتشده سرور/کلاینت را افزایش دهد) |
| backoff اولیه اتصال مجدد | 1_000 میلیثانیه |
src/gateway/client.ts (backoffMs) |
| حداکثر backoff اتصال مجدد | 30_000 میلیثانیه |
src/gateway/client.ts (scheduleReconnect) |
| محدودسازی تلاش مجدد سریع پس از بستهشدن device-token | 250 میلیثانیه |
src/gateway/client.ts |
مهلت force-stop پیش از terminate() |
250 میلیثانیه |
FORCE_STOP_TERMINATE_GRACE_MS |
زمان پایان پیشفرض stopAndWait() |
1_000 میلیثانیه |
STOP_AND_WAIT_TIMEOUT_MS |
فاصله tick پیشفرض (پیش از hello-ok) |
30_000 میلیثانیه |
src/gateway/client.ts |
| بستن در زمان پایان tick | کد 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) یاgateway.auth.mode: "trusted-proxy"غیر loopback، بررسی احراز هویت اتصال را از سرآیندهای درخواست، بهجایconnect.params.auth.*، برآورده میکنند. - حالت ورودی خصوصی
gateway.auth.mode: "none"احراز هویت اتصال با راز مشترک را کاملا رد میکند؛ این حالت را روی ورودی عمومی/نامطمئن در معرض دسترس قرار ندهید. - پس از جفتسازی، Gateway یک توکن دستگاه صادر میکند که به نقش اتصال
- دامنهها محدود است. این توکن در
hello-ok.auth.deviceTokenبرگردانده میشود و باید برای اتصالهای آینده توسط کلاینت پایدار شود.
- دامنهها محدود است. این توکن در
- کلاینتها باید
hello-ok.auth.deviceTokenاصلی را پس از هر اتصال موفق پایدار کنند. - اتصال مجدد با آن توکن دستگاه ذخیرهشده باید مجموعه دامنه تاییدشده ذخیرهشده برای آن توکن را نیز دوباره استفاده کند. این کار دسترسی خواندن/کاوش/وضعیت را که قبلا اعطا شده حفظ میکند و از فروکاستن بیصدای اتصالهای مجدد به یک دامنه ضمنی باریکتر و فقط مدیریتی جلوگیری میکند.
- سرهمبندی احراز هویت اتصال در سمت کلاینت (
selectConnectAuthدرsrc/gateway/client.ts):auth.passwordمستقل است و هر زمان تنظیم شده باشد همیشه ارسال میشود.auth.tokenبهترتیب اولویت پر میشود: ابتدا توکن مشترک صریح، سپس یکdeviceTokenصریح، سپس یک توکن ذخیرهشده بهازای هر دستگاه (کلیدشده باdeviceId+role).auth.bootstrapTokenفقط زمانی فرستاده میشود که هیچکدام از موارد بالا یکauth.tokenرا بهدست نیاورده باشند. توکن مشترک یا هر توکن دستگاه بهدستآمدهای آن را سرکوب میکند.- ارتقای خودکار یک توکن دستگاه ذخیرهشده در تلاش مجدد یکباره
AUTH_TOKEN_MISMATCHفقط به نقطههای پایانی مورد اعتماد محدود است — loopback، یاwss://باtlsFingerprintسنجاقشده.wss://عمومی بدون سنجاقکردن واجد شرایط نیست.
- راهاندازی bootstrap داخلی با کد راهاندازی،
hello-ok.auth.deviceTokenنود اصلی بههمراه یک توکن عملگر محدود را درhello-ok.auth.deviceTokensبرای تحویل موبایل مورد اعتماد برمیگرداند. توکن عملگر شاملoperator.talk.secretsبرای خواندن پیکربندی بومی Talk است، اما دامنههای تغییر جفتسازی وoperator.adminرا مستثنی میکند. - هنگامی که bootstrap کد راهاندازی غیرخطمبنا منتظر تایید است، جزئیات
PAIRING_REQUIREDشاملrecommendedNextStep: "wait_then_retry"،retryable: true، وpauseReconnect: falseاست. کلاینتها باید تا زمانی که درخواست تایید شود یا توکن نامعتبر شود، با همان توکن bootstrap به اتصال مجدد ادامه دهند. hello-ok.auth.deviceTokensرا فقط زمانی پایدار کنید که اتصال از احراز هویت bootstrap روی یک انتقال مورد اعتماد مانندwss://یا جفتسازی loopback/محلی استفاده کرده باشد.- اگر کلاینت یک
deviceTokenصریح یاscopesصریح ارائه کند، آن مجموعه دامنه درخواستشده توسط فراخواننده مرجع باقی میماند؛ دامنههای کششده فقط زمانی دوباره استفاده میشوند که کلاینت از توکن ذخیرهشده بهازای هر دستگاه دوباره استفاده کند. - توکنهای دستگاه را میتوان از طریق
device.token.rotateوdevice.token.revokeچرخاند/لغو کرد (به دامنهoperator.pairingنیاز دارد). چرخاندن یا لغو یک نود یا نقش غیرعملگر دیگر همچنین بهoperator.adminنیاز دارد. device.token.rotateفراداده چرخش را برمیگرداند. این متد توکن bearer جایگزین را فقط برای فراخوانیهای همان دستگاه که از قبل با همان توکن دستگاه احراز هویت شدهاند بازتاب میدهد، تا کلاینتهای فقطتوکن بتوانند جایگزین خود را پیش از اتصال مجدد پایدار کنند. چرخشهای مشترک/مدیریتی توکن bearer را بازتاب نمیدهند.- صدور، چرخش، و لغو توکن محدود به مجموعه نقش تاییدشدهای میماند که در ورودی جفتسازی آن دستگاه ثبت شده است؛ تغییر توکن نمیتواند دامنه را گسترش دهد یا نقش دستگاهی را هدف بگیرد که تایید جفتسازی هرگز اعطا نکرده است.
- برای نشستهای توکن دستگاه جفتشده، مدیریت دستگاه خوددامنه است مگر اینکه
فراخواننده
operator.adminنیز داشته باشد: فراخوانندههای غیرمدیر فقط میتوانند توکن عملگر ورودی دستگاه خودشان را مدیریت کنند. مدیریت توکن نود و دیگر توکنهای غیرعملگر فقط مدیریتی است، حتی برای دستگاه خود فراخواننده. device.token.rotateوdevice.token.revokeهمچنین مجموعه دامنه توکن عملگر هدف را در برابر دامنههای نشست فعلی فراخواننده بررسی میکنند. فراخوانندههای غیرمدیر نمیتوانند توکن عملگری گستردهتر از آنچه خودشان دارند را بچرخانند یا لغو کنند.- شکستهای احراز هویت شامل
error.details.codeبههمراه راهنماییهای بازیابی هستند:error.details.canRetryWithDeviceToken(بولی)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.id) داشته باشند که از اثرانگشت keypair مشتق شده است. - Gatewayها برای هر دستگاه + نقش توکن صادر میکنند.
- تاییدهای جفتسازی برای شناسههای دستگاه جدید لازم هستند، مگر اینکه تایید خودکار محلی فعال باشد.
- تایید خودکار جفتسازی حول اتصالهای مستقیم local loopback متمرکز است.
- OpenClaw همچنین یک مسیر self-connect محدود محلی در backend/container برای جریانهای کمکی راز مشترک مورد اعتماد دارد.
- اتصالهای tailnet همان میزبان یا LAN همچنان برای جفتسازی remote تلقی میشوند و به تایید نیاز دارند.
- کلاینتهای WS معمولا هویت
deviceرا هنگامconnectشامل میکنند (عملگر + نود). تنها استثناهای عملگر بدون دستگاه، مسیرهای اعتماد صریح هستند:gateway.controlUi.allowInsecureAuth=trueبرای سازگاری HTTP ناامن فقط localhost.- احراز هویت موفق Control UI عملگر با
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass، کاهش شدید امنیت).- RPCهای backend مستقیم-loopback
gateway-clientروی مسیر کمکی داخلی رزروشده.
- حذف هویت دستگاه پیامدهای دامنه دارد. وقتی اتصال عملگر بدون دستگاه
از طریق یک مسیر اعتماد صریح مجاز میشود، OpenClaw همچنان دامنههای
خوداظهارشده را به یک مجموعه خالی پاک میکند مگر اینکه آن مسیر یک استثنای
نامگذاریشده برای حفظ دامنه داشته باشد. سپس متدهای محدودشده با دامنه با
missing scopeشکست میخورند. gateway.controlUi.dangerouslyDisableDeviceAuth=trueیک مسیر حفظ دامنه break-glass برای Control UI است. این گزینه دامنهها را به کلاینتهای WebSocket سفارشی دلخواه backend یا CLI-شکل اعطا نمیکند.- مسیر کمکی backend رزروشده مستقیم-loopback
gateway-clientدامنهها را فقط برای RPCهای داخلی control-plane محلی حفظ میکند؛ شناسههای backend سفارشی این استثنا را دریافت نمیکنند. - همه اتصالها باید nonce ارائهشده توسط سرور در
connect.challengeرا امضا کنند.
عیبیابی مهاجرت احراز هویت دستگاه
برای کلاینتهای قدیمی که هنوز از رفتار امضای پیش از challenge استفاده میکنند، connect اکنون
کدهای جزئیات 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 نسخه 2 مطابقت ندارد. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
زمانمهر امضاشده خارج از skew مجاز است. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id با اثرانگشت کلید عمومی مطابقت ندارد. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
قالب/استانداردسازی کلید عمومی شکست خورد. |
هدف مهاجرت:
- همیشه منتظر
connect.challengeبمانید. - payload نسخه 2 را که شامل nonce سرور است امضا کنید.
- همان nonce را در
connect.params.device.nonceبفرستید. - payload امضای ترجیحی
v3است، که علاوه بر فیلدهای دستگاه/کلاینت/نقش/دامنهها/توکن/nonce،platformوdeviceFamilyرا نیز bind میکند. - امضاهای قدیمی
v2برای سازگاری همچنان پذیرفته میشوند، اما pinning فراداده دستگاه جفتشده همچنان سیاست فرمان را در اتصال مجدد کنترل میکند.
TLS + سنجاقکردن
- TLS برای اتصالهای WS پشتیبانی میشود.
- کلاینتها میتوانند بهصورت اختیاری اثرانگشت گواهی gateway را سنجاق کنند (پیکربندی
gateway.tlsبههمراهgateway.remote.tlsFingerprintیا CLI--tls-fingerprintرا ببینید).
دامنه
این پروتکل API کامل gateway را در معرض دسترس قرار میدهد (وضعیت، کانالها، مدلها، چت،
عامل، نشستها، نودها، تاییدها، و غیره). سطح دقیق توسط
طرحوارههای TypeBox در packages/gateway-protocol/src/schema.ts تعریف شده است.