Gateway
Giao thức Gateway
Gateway WS protocol là mặt phẳng điều khiển duy nhất + truyền tải Node cho OpenClaw. Mọi client (CLI, web UI, ứng dụng macOS, Node iOS/Android, Node headless) kết nối qua WebSocket và khai báo role + scope của mình tại thời điểm bắt tay.
Truyền tải
- WebSocket, khung văn bản với payload JSON.
- Khung đầu tiên phải là yêu cầu
connect. - Các khung trước kết nối bị giới hạn ở 64 KiB. Sau khi bắt tay thành công, client
nên tuân theo các giới hạn
hello-ok.policy.maxPayloadvàhello-ok.policy.maxBufferedBytes. Khi bật chẩn đoán, các khung đến quá lớn và bộ đệm gửi đi chậm sẽ phát sự kiệnpayload.largetrước khi Gateway đóng hoặc loại bỏ khung bị ảnh hưởng. Các sự kiện này giữ kích thước, giới hạn, bề mặt và mã lý do an toàn. Chúng không giữ phần thân thông điệp, nội dung tệp đính kèm, phần thân khung thô, token, cookie hoặc giá trị bí mật.
Bắt tay (connect)
Gateway → Client (thử thách trước kết nối):
{
"type": "event",
"event": "connect.challenge",
"payload": { "nonce": "…", "ts": 1737264000000 }
}
Client → Gateway:
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 4,
"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 → Client:
{
"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
}
}
}
Trong khi Gateway vẫn đang hoàn tất các sidecar khởi động, yêu cầu connect có thể
trả về lỗi UNAVAILABLE có thể thử lại với details.reason được đặt thành
"startup-sidecars" và retryAfterMs. Client nên thử lại phản hồi đó
trong ngân sách kết nối tổng thể thay vì hiển thị nó như một lỗi bắt tay
cuối cùng.
server, features, snapshot và policy đều được schema yêu cầu
(src/gateway/protocol/schema/frames.ts). auth cũng bắt buộc và báo cáo
role/scope đã thương lượng. pluginSurfaceUrls là tùy chọn và ánh xạ tên bề mặt
Plugin, chẳng hạn như canvas, tới các URL được lưu trữ có phạm vi.
URL bề mặt Plugin có phạm vi có thể hết hạn. Node có thể gọi
node.pluginSurface.refresh với { "surface": "canvas" } để nhận một mục mới
trong pluginSurfaceUrls. Bản tái cấu trúc Plugin Canvas thử nghiệm không
hỗ trợ đường dẫn tương thích canvasHostUrl, canvasCapability hoặc
node.canvas.capability.refresh đã ngừng dùng; các client native và
Gateway hiện tại phải dùng bề mặt Plugin.
Khi không cấp token thiết bị, hello-ok.auth báo cáo các quyền đã thương lượng
mà không có trường token:
{
"auth": {
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
Các client backend cùng tiến trình đáng tin cậy (client.id: "gateway-client",
client.mode: "backend") có thể bỏ qua device trên các kết nối loopback trực tiếp khi
chúng xác thực bằng token/mật khẩu Gateway dùng chung. Đường dẫn này được dành riêng
cho các RPC mặt phẳng điều khiển nội bộ và ngăn các baseline ghép đôi CLI/thiết bị cũ
chặn công việc backend cục bộ như cập nhật phiên subagent. Client từ xa,
client có nguồn gốc trình duyệt, client Node và client token thiết bị/danh tính thiết bị
rõ ràng vẫn dùng các kiểm tra ghép đôi và nâng cấp scope thông thường.
Khi token thiết bị được cấp, hello-ok cũng bao gồm:
{
"auth": {
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
Trong quá trình bàn giao bootstrap đáng tin cậy, hello-ok.auth cũng có thể bao gồm
các mục role bổ sung có giới hạn trong deviceTokens:
{
"auth": {
"deviceToken": "…",
"role": "node",
"scopes": [],
"deviceTokens": [
{
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"]
}
]
}
}
Đối với luồng bootstrap Node/operator tích hợp sẵn, token Node chính vẫn là
scopes: [] và mọi token operator được bàn giao vẫn bị giới hạn trong allowlist
operator bootstrap (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Kiểm tra scope bootstrap vẫn
được đặt tiền tố theo role: các mục operator chỉ thỏa mãn yêu cầu operator, và
các role không phải operator vẫn cần scope dưới tiền tố role của chính chúng.
Ví dụ Node
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 4,
"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": "…"
}
}
}
Đóng khung
- Yêu cầu:
{type:"req", id, method, params} - Phản hồi:
{type:"res", id, ok, payload|error} - Sự kiện:
{type:"event", event, payload, seq?, stateVersion?}
Các phương thức có tác dụng phụ yêu cầu khóa idempotency (xem schema).
Role + scope
Để xem mô hình scope operator đầy đủ, các kiểm tra tại thời điểm phê duyệt và ngữ nghĩa bí mật dùng chung, xem Scope operator.
Role
operator= client mặt phẳng điều khiển (CLI/UI/tự động hóa).node= host năng lực (camera/screen/canvas/system.run).
Scope (operator)
Các scope phổ biến:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config với includeSecrets: true yêu cầu operator.talk.secrets
(hoặc operator.admin).
Các phương thức RPC Gateway do Plugin đăng ký có thể yêu cầu scope operator riêng,
nhưng các tiền tố quản trị core dành riêng (config.*, exec.approvals.*, wizard.*,
update.*) luôn phân giải thành operator.admin.
Scope phương thức chỉ là cổng kiểm tra đầu tiên. Một số lệnh slash được truy cập qua
chat.send áp dụng các kiểm tra cấp lệnh nghiêm ngặt hơn ở phía trên. Ví dụ, các thao tác ghi
/config set và /config unset bền vững yêu cầu operator.admin.
node.pair.approve cũng có thêm một kiểm tra scope tại thời điểm phê duyệt bên trên
scope phương thức cơ sở:
- yêu cầu không có lệnh:
operator.pairing - yêu cầu có lệnh Node không phải exec:
operator.pairing+operator.write - yêu cầu bao gồm
system.run,system.run.preparehoặcsystem.which:operator.pairing+operator.admin
Caps/commands/permissions (Node)
Node khai báo các tuyên bố năng lực tại thời điểm kết nối:
caps: các danh mục năng lực cấp cao nhưcamera,canvas,screen,location,voicevàtalk.commands: allowlist lệnh cho invoke.permissions: các công tắc chi tiết (ví dụ:screen.record,camera.capture).
Gateway xem chúng là tuyên bố và thực thi allowlist phía máy chủ.
Presence
system-presencetrả về các mục được khóa theo danh tính thiết bị.- Mục presence bao gồm
deviceId,rolesvàscopesđể UI có thể hiển thị một hàng duy nhất cho mỗi thiết bị ngay cả khi thiết bị đó kết nối với cả vai trò operator và node. node.listbao gồm các trường tùy chọnlastSeenAtMsvàlastSeenReason. Node đang kết nối báo cáo thời gian kết nối hiện tại của chúng dưới dạnglastSeenAtMsvới lý doconnect; Node đã ghép đôi cũng có thể báo cáo presence nền bền vững khi một sự kiện Node đáng tin cậy cập nhật metadata ghép đôi của chúng.
Sự kiện Node còn sống trong nền
Node có thể gọi node.event với event: "node.presence.alive" để ghi lại rằng một Node đã ghép đôi đã
còn sống trong một lần đánh thức nền mà không đánh dấu nó là đang kết nối.
{
"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 là một enum đóng: background, silent_push, bg_app_refresh,
significant_location, manual hoặc connect. Các chuỗi trigger không xác định được Gateway chuẩn hóa thành
background trước khi lưu bền vững. Sự kiện chỉ bền vững cho các phiên thiết bị Node đã xác thực;
phiên không có thiết bị hoặc chưa ghép đôi trả về handled: false.
Gateway thành công trả về một kết quả có cấu trúc:
{
"ok": true,
"event": "node.presence.alive",
"handled": true,
"reason": "persisted"
}
Gateway cũ hơn vẫn có thể trả về { "ok": true } cho node.event; client nên xem đó là
RPC đã được xác nhận, không phải là presence đã được lưu bền vững.
Định phạm vi sự kiện broadcast
Các sự kiện broadcast WebSocket do máy chủ đẩy được kiểm soát theo scope để các phiên chỉ có scope ghép đôi hoặc chỉ dành cho Node không thụ động nhận nội dung phiên.
- Khung chat, agent và kết quả công cụ (bao gồm sự kiện
agentđược stream và kết quả gọi công cụ) yêu cầu ít nhấtoperator.read. Phiên không cóoperator.readbỏ qua hoàn toàn các khung này. - Broadcast
plugin.*do Plugin định nghĩa được kiểm soát theooperator.writehoặcoperator.admin, tùy thuộc cách Plugin đăng ký chúng. - Sự kiện trạng thái và truyền tải (
heartbeat,presence,tick, vòng đời kết nối/ngắt kết nối, v.v.) vẫn không bị hạn chế để tình trạng truyền tải luôn quan sát được với mọi phiên đã xác thực. - Các họ sự kiện broadcast không xác định mặc định được kiểm soát theo scope (fail-closed) trừ khi một handler đã đăng ký nới lỏng chúng một cách rõ ràng.
Mỗi kết nối client giữ số thứ tự riêng theo client để broadcast duy trì thứ tự tăng đơn điệu trên socket đó ngay cả khi các client khác nhau thấy các tập con đã lọc theo scope khác nhau của luồng sự kiện.
Các họ phương thức RPC phổ biến
Bề mặt WS công khai rộng hơn các ví dụ bắt tay/xác thực ở trên. Đây
không phải là bản dump được tạo tự động — hello-ok.features.methods là danh sách
khám phá thận trọng được xây dựng từ src/gateway/server-methods-list.ts cộng với các export
phương thức Plugin/kênh đã tải. Hãy xem nó là khám phá tính năng, không phải là bản
liệt kê đầy đủ của src/gateway/server-methods/*.ts.
Hệ thống và danh tính
healthtrả về snapshot tình trạng Gateway đã lưu trong bộ nhớ đệm hoặc vừa được thăm dò.diagnostics.stabilitytrả về trình ghi ổn định chẩn đoán có giới hạn gần đây. Nó giữ metadata vận hành như tên sự kiện, số lượng, kích thước byte, chỉ số bộ nhớ, trạng thái hàng đợi/phiên, tên kênh/Plugin và id phiên. Nó không giữ văn bản chat, phần thân Webhook, đầu ra công cụ, phần thân yêu cầu hoặc phản hồi thô, token, cookie hoặc giá trị bí mật. Yêu cầu scope operator read.statustrả về bản tóm tắt Gateway kiểu/status; các trường nhạy cảm chỉ được bao gồm cho client operator có scope admin.gateway.identity.gettrả về danh tính thiết bị Gateway được dùng bởi các luồng relay và ghép đôi.system-presencetrả về snapshot presence hiện tại cho các thiết bị operator/Node đang kết nối.system-eventthêm một sự kiện hệ thống và có thể cập nhật/broadcast ngữ cảnh presence.last-heartbeattrả về sự kiện Heartbeat đã lưu mới nhất.set-heartbeatsbật/tắt xử lý Heartbeat trên Gateway.
Mô hình và mức sử dụng
models.listtrả về danh mục mô hình được runtime cho phép. Truyền{ "view": "configured" }để lấy các mô hình đã cấu hình có kích thước phù hợp với bộ chọn (agents.defaults.modelstrước, rồi đếnmodels.providers.*.models), hoặc{ "view": "all" }để lấy toàn bộ danh mục.usage.statustrả về các cửa sổ sử dụng của nhà cung cấp/tóm tắt hạn mức còn lại.usage.costtrả về tóm tắt mức sử dụng chi phí đã tổng hợp cho một khoảng ngày.doctor.memory.statustrả về trạng thái sẵn sàng của bộ nhớ vector / embedding đã lưu trong bộ nhớ đệm cho workspace của tác nhân mặc định đang hoạt động. Chỉ truyền{ "probe": true }hoặc{ "deep": true }khi bên gọi rõ ràng muốn ping trực tiếp nhà cung cấp embedding.doctor.memory.remHarnesstrả về bản xem trước REM harness có giới hạn, chỉ đọc cho các client mặt phẳng điều khiển từ xa. Nó có thể bao gồm đường dẫn workspace, đoạn trích bộ nhớ, markdown có căn cứ đã render, và các ứng viên thăng hạng sâu, nên bên gọi cầnoperator.read.sessions.usagetrả về tóm tắt mức sử dụng theo từng phiên.sessions.usage.timeseriestrả về mức sử dụng dạng chuỗi thời gian cho một phiên.sessions.usage.logstrả về các mục nhật ký sử dụng cho một phiên.
Kênh và trình trợ giúp đăng nhập
channels.statustrả về tóm tắt trạng thái kênh/Plugin tích hợp sẵn + đi kèm.channels.logoutđăng xuất một kênh/tài khoản cụ thể khi kênh đó hỗ trợ đăng xuất.web.login.startbắt đầu luồng đăng nhập QR/web cho nhà cung cấp kênh web hiện tại có khả năng QR.web.login.waitchờ luồng đăng nhập QR/web đó hoàn tất và khởi động kênh khi thành công.push.testgửi một push APNs thử nghiệm đến một Node iOS đã đăng ký.voicewake.gettrả về các trigger wake-word đã lưu.voicewake.setcập nhật các trigger wake-word và phát thông báo thay đổi.
Nhắn tin và nhật ký
sendlà RPC gửi trực tiếp ra ngoài cho các lượt gửi nhắm theo kênh/tài khoản/luồng bên ngoài trình chạy chat.logs.tailtrả về phần đuôi nhật ký tệp Gateway đã cấu hình với các điều khiển con trỏ/giới hạn và số byte tối đa.
Talk và TTS
talk.catalogtrả về danh mục nhà cung cấp Talk chỉ đọc cho giọng nói, phiên âm phát trực tuyến, và giọng nói thời gian thực. Nó bao gồm id nhà cung cấp, nhãn, trạng thái đã cấu hình, id mô hình/giọng nói được hiển thị, chế độ chuẩn, phương thức truyền tải, chiến lược não, và cờ âm thanh/khả năng thời gian thực mà không trả về bí mật của nhà cung cấp hoặc thay đổi cấu hình toàn cục.talk.configtrả về payload cấu hình Talk có hiệu lực;includeSecretsyêu cầuoperator.talk.secrets(hoặcoperator.admin).talk.session.createtạo một phiên Talk do Gateway sở hữu chorealtime/gateway-relay,transcription/gateway-relay, hoặcstt-tts/managed-room.brain: "direct-tools"yêu cầuoperator.admin.talk.session.joinxác thực token phiên managed-room, phát các sự kiệnsession.readyhoặcsession.replacedkhi cần, và trả về siêu dữ liệu phòng/phiên cùng các sự kiện Talk gần đây mà không có token dạng văn bản thuần hoặc hàm băm token đã lưu.talk.session.appendAudionối âm thanh đầu vào PCM base64 vào các phiên relay thời gian thực và phiên phiên âm do Gateway sở hữu.talk.session.startTurn,talk.session.endTurn, vàtalk.session.cancelTurnđiều khiển vòng đời lượt managed-room với việc từ chối lượt đã cũ trước khi trạng thái bị xóa.talk.session.cancelOutputdừng đầu ra âm thanh của trợ lý, chủ yếu cho chen ngang có VAD kiểm soát trong các phiên relay Gateway.talk.session.submitToolResulthoàn tất một lệnh gọi công cụ của nhà cung cấp do phiên relay thời gian thực do Gateway sở hữu phát ra.talk.session.closeđóng một phiên relay, phiên âm, hoặc managed-room do Gateway sở hữu và phát các sự kiện Talk kết thúc.talk.modeđặt/phát trạng thái chế độ Talk hiện tại cho các client WebChat/Control UI.talk.client.createtạo một phiên nhà cung cấp thời gian thực do client sở hữu bằngwebrtchoặcprovider-websockettrong khi Gateway sở hữu cấu hình, thông tin xác thực, chỉ dẫn, và chính sách công cụ.talk.client.toolCallcho phép các phương thức truyền tải thời gian thực do client sở hữu chuyển tiếp lệnh gọi công cụ của nhà cung cấp đến chính sách Gateway. Công cụ được hỗ trợ đầu tiên làopenclaw_agent_consult; client nhận một id lượt chạy và chờ các sự kiện vòng đời chat bình thường trước khi gửi kết quả công cụ đặc thù của nhà cung cấp.talk.eventlà kênh sự kiện Talk duy nhất cho thời gian thực, phiên âm, STT/TTS, managed-room, điện thoại, và bộ điều hợp cuộc họp.talk.speaktổng hợp giọng nói thông qua nhà cung cấp giọng nói Talk đang hoạt động.tts.statustrả về trạng thái bật TTS, nhà cung cấp đang hoạt động, nhà cung cấp dự phòng, và trạng thái cấu hình nhà cung cấp.tts.providerstrả về kho nhà cung cấp TTS hiển thị.tts.enablevàtts.disablebật/tắt trạng thái tùy chọn TTS.tts.setProvidercập nhật nhà cung cấp TTS ưu tiên.tts.convertchạy một lần chuyển đổi văn bản thành giọng nói.
Bí mật, cấu hình, cập nhật, và trình hướng dẫn
secrets.reloadphân giải lại các SecretRefs đang hoạt động và chỉ hoán đổi trạng thái bí mật runtime khi thành công hoàn toàn.secrets.resolvephân giải các gán bí mật nhắm đến lệnh cho một tập lệnh/đích cụ thể.config.gettrả về snapshot cấu hình hiện tại và hash.config.setghi một payload cấu hình đã được xác thực.config.patchhợp nhất một bản cập nhật cấu hình một phần.config.applyxác thực + thay thế toàn bộ payload cấu hình.config.schematrả về payload schema cấu hình live được Control UI và công cụ CLI dùng: schema,uiHints, phiên bản, và siêu dữ liệu tạo sinh, bao gồm siêu dữ liệu schema Plugin + kênh khi runtime có thể tải. Schema bao gồm siêu dữ liệu trườngtitle/descriptionđược dẫn xuất từ cùng các nhãn và văn bản trợ giúp mà UI dùng, bao gồm các nhánh thành phần đối tượng lồng nhau, wildcard, mục mảng, vàanyOf/oneOf/allOfkhi có tài liệu trường khớp.config.schema.lookuptrả về payload tra cứu theo phạm vi đường dẫn cho một đường dẫn cấu hình: đường dẫn đã chuẩn hóa, một nút schema nông, gợi ý khớp +hintPath, và tóm tắt con trực tiếp cho thao tác đi sâu UI/CLI. Các nút schema tra cứu giữ tài liệu hướng tới người dùng và các trường xác thực phổ biến (title,description,type,enum,const,format,pattern, giới hạn số/chuỗi/mảng/đối tượng, và các cờ nhưadditionalProperties,deprecated,readOnly,writeOnly). Tóm tắt con hiển thịkey,pathđã chuẩn hóa,type,required,hasChildren, cùnghint/hintPathkhớp.update.runchạy luồng cập nhật Gateway và chỉ lên lịch khởi động lại khi bản cập nhật đã thành công; bên gọi có phiên có thể bao gồmcontinuationMessageđể khi khởi động, hệ thống tiếp tục một lượt tác nhân theo sau thông qua hàng đợi tiếp tục sau khởi động lại. Các bản cập nhật bằng trình quản lý gói buộc khởi động lại cập nhật không trì hoãn, không thời gian chờ sau khi hoán đổi gói để tiến trình Gateway cũ không tiếp tục tải lười từ câydistđã bị thay thế.update.statustrả về sentinel khởi động lại cập nhật đã lưu trong bộ nhớ đệm mới nhất, bao gồm phiên bản đang chạy sau khởi động lại khi có.wizard.start,wizard.next,wizard.status, vàwizard.cancelhiển thị trình hướng dẫn onboarding qua WS RPC.
Trình trợ giúp tác nhân và workspace
agents.listtrả về các mục tác nhân đã cấu hình, bao gồm mô hình có hiệu lực và siêu dữ liệu runtime.agents.create,agents.update, vàagents.deletequản lý bản ghi tác nhân và liên kết workspace.agents.files.list,agents.files.get, vàagents.files.setquản lý các tệp workspace khởi động được hiển thị cho một tác nhân.artifacts.list,artifacts.get, vàartifacts.downloadhiển thị tóm tắt artifact dẫn xuất từ transcript và tải xuống cho phạm visessionKey,runId, hoặctaskIdrõ ràng. Truy vấn lượt chạy và tác vụ phân giải phiên sở hữu ở phía máy chủ và chỉ trả về phương tiện transcript có provenance khớp; nguồn URL không an toàn hoặc cục bộ trả về tải xuống không được hỗ trợ thay vì fetch phía máy chủ.environments.listvàenvironments.statushiển thị khám phá môi trường chỉ đọc cục bộ Gateway và Node cho các client SDK.agent.identity.gettrả về định danh trợ lý có hiệu lực cho một tác nhân hoặc phiên.agent.waitchờ một lượt chạy kết thúc và trả về snapshot kết thúc khi có.
Điều khiển phiên
sessions.listtrả về chỉ mục phiên hiện tại, bao gồm siêu dữ liệuagentRuntimetheo từng hàng khi một backend runtime tác nhân được cấu hình.sessions.subscribevàsessions.unsubscribebật/tắt đăng ký sự kiện thay đổi phiên cho client WS hiện tại.sessions.messages.subscribevàsessions.messages.unsubscribebật/tắt đăng ký sự kiện transcript/tin nhắn cho một phiên.sessions.previewtrả về bản xem trước transcript có giới hạn cho các khóa phiên cụ thể.sessions.describetrả về một hàng phiên Gateway cho một khóa phiên chính xác.sessions.resolvephân giải hoặc chuẩn hóa một đích phiên.sessions.createtạo một mục phiên mới.sessions.sendgửi một tin nhắn vào một phiên hiện có.sessions.steerlà biến thể ngắt-và-điều hướng cho một phiên đang hoạt động.sessions.aborthủy công việc đang hoạt động cho một phiên. Bên gọi có thể truyềnkeycộng vớirunIdtùy chọn, hoặc chỉ truyềnrunIdcho các lượt chạy đang hoạt động mà Gateway có thể phân giải thành một phiên.sessions.patchcập nhật siêu dữ liệu/ghi đè phiên và báo cáo mô hình chuẩn đã phân giải cùngagentRuntimecó hiệu lực.sessions.reset,sessions.delete, vàsessions.compactthực hiện bảo trì phiên.sessions.gettrả về toàn bộ hàng phiên đã lưu.- Thực thi chat vẫn dùng
chat.history,chat.send,chat.abort, vàchat.inject.chat.historyđược chuẩn hóa hiển thị cho các client UI: các thẻ chỉ thị nội tuyến bị loại khỏi văn bản hiển thị, payload XML lệnh gọi công cụ dạng văn bản thuần (bao gồm<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, và các khối lệnh gọi công cụ bị cắt ngắn) và token điều khiển mô hình ASCII/toàn chiều bị rò rỉ sẽ bị loại, các hàng trợ lý chỉ chứa token im lặng như chính xácNO_REPLY/no_replybị bỏ qua, và các hàng quá lớn có thể được thay bằng placeholder.
Ghép đôi thiết bị và token thiết bị
device.pair.listtrả về các thiết bị đã ghép đôi đang chờ duyệt và đã được phê duyệt.device.pair.approve,device.pair.reject, vàdevice.pair.removequản lý bản ghi ghép đôi thiết bị.device.token.rotatexoay vòng token thiết bị đã ghép đôi trong phạm vi vai trò đã phê duyệt và phạm vi bên gọi.device.token.revokethu hồi token thiết bị đã ghép đôi trong phạm vi vai trò đã phê duyệt và phạm vi bên gọi.
Ghép đôi Node, gọi lệnh, và công việc đang chờ
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.remove, vànode.pair.verifybao quát ghép đôi Node và xác minh bootstrap.node.listvànode.describetrả về trạng thái Node đã biết/đã kết nối.node.renamecập nhật nhãn Node đã ghép đôi.node.invokechuyển tiếp một lệnh đến Node đã kết nối.node.invoke.resulttrả về kết quả cho một yêu cầu gọi lệnh.node.eventmang các sự kiện bắt nguồn từ Node quay lại gateway.node.pending.pullvànode.pending.acklà các API hàng đợi Node đã kết nối.node.pending.enqueuevànode.pending.drainquản lý công việc đang chờ bền vững cho các Node ngoại tuyến/mất kết nối.
Các nhóm phê duyệt
exec.approval.request,exec.approval.get,exec.approval.listvàexec.approval.resolvebao quát các yêu cầu phê duyệt exec một lần cùng với việc tra cứu/phát lại phê duyệt đang chờ.exec.approval.waitDecisionchờ một phê duyệt exec đang chờ và trả về quyết định cuối cùng (hoặcnullkhi hết thời gian chờ).exec.approvals.getvàexec.approvals.setquản lý các snapshot chính sách phê duyệt exec của Gateway.exec.approvals.node.getvàexec.approvals.node.setquản lý chính sách phê duyệt exec cục bộ trên Node thông qua các lệnh chuyển tiếp Node.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionvàplugin.approval.resolvebao quát các luồng phê duyệt do Plugin định nghĩa.
Tự động hóa, Skills và công cụ
- Tự động hóa:
wakelên lịch chèn văn bản đánh thức ngay lập tức hoặc ở lần Heartbeat tiếp theo;cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsquản lý công việc đã lên lịch. - Skills và công cụ:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
Các nhóm sự kiện phổ biến
chat: các bản cập nhật trò chuyện UI nhưchat.injectvà các sự kiện trò chuyện chỉ dành cho bản ghi khác.session.messagevàsession.tool: các bản cập nhật bản ghi/luồng sự kiện cho một phiên đã đăng ký theo dõi.sessions.changed: chỉ mục phiên hoặc siêu dữ liệu đã thay đổi.presence: các bản cập nhật snapshot trạng thái hiện diện của hệ thống.tick: sự kiện keepalive / liveness định kỳ.health: bản cập nhật snapshot sức khỏe Gateway.heartbeat: bản cập nhật luồng sự kiện Heartbeat.cron: sự kiện thay đổi lần chạy/tác vụ Cron.shutdown: thông báo tắt Gateway.node.pair.requested/node.pair.resolved: vòng đời ghép cặp Node.node.invoke.request: phát rộng yêu cầu gọi Node.device.pair.requested/device.pair.resolved: vòng đời thiết bị đã ghép cặp.voicewake.changed: cấu hình kích hoạt bằng từ đánh thức đã thay đổi.exec.approval.requested/exec.approval.resolved: vòng đời phê duyệt exec.plugin.approval.requested/plugin.approval.resolved: vòng đời phê duyệt Plugin.
Phương thức trợ giúp Node
- Node có thể gọi
skills.binsđể lấy danh sách hiện tại các tệp thực thi Skills cho các kiểm tra tự động cho phép.
Phương thức trợ giúp cho người vận hành
- Người vận hành có thể gọi
commands.list(operator.read) để lấy danh mục lệnh runtime cho một agent.agentIdlà tùy chọn; bỏ qua để đọc workspace agent mặc định.scopekiểm soát bề mặt mànamechính nhắm tới:texttrả về token lệnh văn bản chính không có dấu/ở đầunativevà đường dẫn mặc địnhbothtrả về tên native có nhận biết provider khi có sẵn
textAliasesmang các bí danh slash chính xác như/modelvà/m.nativeNamemang tên lệnh native có nhận biết provider khi tồn tại.providerlà tùy chọn và chỉ ảnh hưởng đến cách đặt tên native cùng tính khả dụng của lệnh Plugin native.includeArgs=falsebỏ qua siêu dữ liệu đối số đã tuần tự hóa khỏi phản hồi.
- Người vận hành có thể gọi
tools.catalog(operator.read) để lấy danh mục công cụ runtime cho một agent. Phản hồi bao gồm các công cụ đã nhóm và siêu dữ liệu nguồn gốc:source:corehoặcpluginpluginId: chủ sở hữu Plugin khisource="plugin"optional: công cụ Plugin có phải là tùy chọn hay không
- Người vận hành có thể gọi
tools.effective(operator.read) để lấy danh mục công cụ có hiệu lực trong runtime cho một phiên.sessionKeylà bắt buộc.- Gateway suy ra ngữ cảnh runtime đáng tin cậy từ phía máy chủ phiên thay vì chấp nhận ngữ cảnh xác thực hoặc phân phối do bên gọi cung cấp.
- Phản hồi được giới hạn theo phiên và phản ánh những gì cuộc hội thoại đang hoạt động có thể dùng ngay lúc này, bao gồm các công cụ core, Plugin và kênh.
- Người vận hành có thể gọi
tools.invoke(operator.write) để gọi một công cụ khả dụng thông qua cùng đường dẫn chính sách Gateway như/tools/invoke.namelà bắt buộc.args,sessionKey,agentId,confirmvàidempotencyKeylà tùy chọn.- Nếu cả
sessionKeyvàagentIdđều có mặt, agent của phiên đã phân giải phải khớp vớiagentId. - Phản hồi là một envelope hướng SDK với các trường
ok,toolName,outputtùy chọn vàerrorcó kiểu. Các từ chối do phê duyệt hoặc chính sách trả vềok:falsetrong payload thay vì bỏ qua pipeline chính sách công cụ Gateway.
- Người vận hành có thể gọi
skills.status(operator.read) để lấy danh mục Skills hiển thị cho một agent.agentIdlà tùy chọn; bỏ qua để đọc workspace agent mặc định.- Phản hồi bao gồm tính đủ điều kiện, các yêu cầu bị thiếu, kiểm tra cấu hình và các tùy chọn cài đặt đã làm sạch mà không để lộ giá trị bí mật thô.
- Người vận hành có thể gọi
skills.searchvàskills.detail(operator.read) để lấy siêu dữ liệu khám phá ClawHub. - Người vận hành có thể gọi
skills.install(operator.admin) ở hai chế độ:- Chế độ ClawHub:
{ source: "clawhub", slug, version?, force? }cài đặt một thư mục skill vào thư mụcskills/của workspace agent mặc định. - Chế độ trình cài đặt Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }chạy một hành độngmetadata.openclaw.installđã khai báo trên máy chủ Gateway.
- Chế độ ClawHub:
- Người vận hành có thể gọi
skills.update(operator.admin) ở hai chế độ:- Chế độ ClawHub cập nhật một slug đang được theo dõi hoặc tất cả các bản cài đặt ClawHub đang được theo dõi trong workspace agent mặc định.
- Chế độ cấu hình vá các giá trị
skills.entries.<skillKey>nhưenabled,apiKeyvàenv.
Các chế độ xem models.list
models.list chấp nhận tham số view tùy chọn:
- Bỏ qua hoặc
"default": hành vi runtime hiện tại. Nếuagents.defaults.modelsđược cấu hình, phản hồi là danh mục được cho phép; nếu không, phản hồi là toàn bộ danh mục Gateway. "configured": hành vi có kích thước phù hợp cho bộ chọn. Nếuagents.defaults.modelsđược cấu hình, nó vẫn được ưu tiên. Nếu không, phản hồi dùng các mụcmodels.providers.*.modelsrõ ràng, chỉ quay về toàn bộ danh mục khi không có hàng model nào được cấu hình."all": toàn bộ danh mục Gateway, bỏ quaagents.defaults.models. Dùng chế độ này cho chẩn đoán và UI khám phá, không dùng cho bộ chọn model thông thường.
Phê duyệt exec
- Khi một yêu cầu exec cần phê duyệt, Gateway phát rộng
exec.approval.requested. - Client người vận hành phân giải bằng cách gọi
exec.approval.resolve(yêu cầu scopeoperator.approvals). - Với
host=node,exec.approval.requestphải bao gồmsystemRunPlan(argv/cwd/rawCommand/siêu dữ liệu phiên chuẩn). Các yêu cầu thiếusystemRunPlanbị từ chối. - Sau khi được phê duyệt, các lệnh gọi
node.invoke system.runđược chuyển tiếp sẽ tái sử dụngsystemRunPlanchuẩn đó làm ngữ cảnh lệnh/cwd/phiên có thẩm quyền. - Nếu bên gọi thay đổi
command,rawCommand,cwd,agentIdhoặcsessionKeygiữa bước chuẩn bị và lần chuyển tiếpsystem.runđã được phê duyệt cuối cùng, Gateway từ chối lần chạy thay vì tin payload đã bị thay đổi.
Dự phòng phân phối agent
- Các yêu cầu
agentcó thể bao gồmdeliver=trueđể yêu cầu phân phối outbound. bestEffortDeliver=falsegiữ hành vi nghiêm ngặt: các đích phân phối không phân giải được hoặc chỉ nội bộ trả vềINVALID_REQUEST.bestEffortDeliver=truecho phép dự phòng sang thực thi chỉ trong phiên khi không thể phân giải tuyến có thể phân phối bên ngoài (ví dụ các phiên nội bộ/webchat hoặc cấu hình đa kênh mơ hồ).
Đánh phiên bản
PROTOCOL_VERSIONnằm trongsrc/gateway/protocol/version.ts.- Client gửi
minProtocol+maxProtocol; máy chủ từ chối các trường hợp không khớp. - Schema + model được tạo từ các định nghĩa TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Hằng số client
Client tham chiếu trong src/gateway/client.ts dùng các giá trị mặc định này. Các giá trị ổn định trên protocol v4 và là baseline kỳ vọng cho client bên thứ ba.
| Hằng số | Mặc định | Nguồn |
|---|---|---|
PROTOCOL_VERSION |
4 |
src/gateway/protocol/version.ts |
| Thời gian chờ yêu cầu (mỗi RPC) | 30_000 ms |
src/gateway/client.ts (requestTimeoutMs) |
| Thời gian chờ tiền xác thực / thử thách kết nối | 15_000 ms |
src/gateway/handshake-timeouts.ts (cấu hình/env có thể tăng ngân sách máy chủ/client đã ghép cặp) |
| Backoff kết nối lại ban đầu | 1_000 ms |
src/gateway/client.ts (backoffMs) |
| Backoff kết nối lại tối đa | 30_000 ms |
src/gateway/client.ts (scheduleReconnect) |
| Kẹp thử lại nhanh sau khi đóng bằng token thiết bị | 250 ms |
src/gateway/client.ts |
Thời gian gia hạn force-stop trước terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
Thời gian chờ mặc định của stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
Khoảng tick mặc định (trước hello-ok) |
30_000 ms |
src/gateway/client.ts |
| Đóng do hết thời gian chờ tick | code 4000 khi im lặng vượt quá tickIntervalMs * 2 |
src/gateway/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
Máy chủ quảng bá policy.tickIntervalMs, policy.maxPayload và policy.maxBufferedBytes có hiệu lực trong hello-ok; client nên tuân theo các giá trị đó thay vì các giá trị mặc định trước bắt tay.
Xác thực
- Xác thực Gateway bằng bí mật dùng chung sử dụng
connect.params.auth.tokenhoặcconnect.params.auth.password, tùy theo chế độ xác thực đã cấu hình. - Các chế độ mang danh tính như Tailscale Serve
(
gateway.auth.allowTailscale: true) hoặc non-loopbackgateway.auth.mode: "trusted-proxy"đáp ứng kiểm tra xác thực kết nối từ header của yêu cầu thay vìconnect.params.auth.*. - Private-ingress
gateway.auth.mode: "none"bỏ qua hoàn toàn xác thực kết nối bằng bí mật dùng chung; không để lộ chế độ đó trên ingress công khai/không đáng tin cậy. - Sau khi ghép nối, Gateway cấp một mã thông báo thiết bị được giới hạn theo
vai trò kết nối + phạm vi. Nó được trả về trong
hello-ok.auth.deviceTokenvà nên được máy khách lưu lại cho các lần kết nối sau. - Máy khách nên lưu
hello-ok.auth.deviceTokenchính sau mọi lần kết nối thành công. - Kết nối lại bằng mã thông báo thiết bị đã lưu đó cũng nên dùng lại tập phạm vi đã phê duyệt được lưu cho mã thông báo đó. Điều này giữ nguyên quyền truy cập đọc/thăm dò/trạng thái đã được cấp và tránh âm thầm thu hẹp các lần kết nối lại về một phạm vi ngầm định chỉ dành cho quản trị viên.
- Tập hợp xác thực kết nối phía máy khách (
selectConnectAuthtrongsrc/gateway/client.ts):auth.passwordlà độc lập và luôn được chuyển tiếp khi được đặt.auth.tokenđược điền theo thứ tự ưu tiên: mã thông báo dùng chung tường minh trước, sau đó là mộtdeviceTokentường minh, rồi đến mã thông báo theo từng thiết bị đã lưu (được khóa theodeviceId+role).auth.bootstrapTokenchỉ được gửi khi không mục nào ở trên phân giải được mộtauth.token. Mã thông báo dùng chung hoặc bất kỳ mã thông báo thiết bị nào được phân giải sẽ chặn nó.- Việc tự động nâng cấp một mã thông báo thiết bị đã lưu trong lần thử lại một lần
AUTH_TOKEN_MISMATCHchỉ được cho phép với điểm cuối đáng tin cậy — loopback, hoặcwss://vớitlsFingerprintđược ghim.wss://công khai không ghim không đủ điều kiện.
- Các mục
hello-ok.auth.deviceTokensbổ sung là mã thông báo bàn giao bootstrap. Chỉ lưu chúng khi kết nối dùng xác thực bootstrap trên một transport đáng tin cậy nhưwss://hoặc ghép nối loopback/local. - Nếu máy khách cung cấp một
deviceTokentường minh hoặcscopestường minh, thì tập phạm vi do bên gọi yêu cầu đó vẫn là nguồn có thẩm quyền; phạm vi trong bộ nhớ đệm chỉ được dùng lại khi máy khách dùng lại mã thông báo theo từng thiết bị đã lưu. - Mã thông báo thiết bị có thể được xoay/thu hồi qua
device.token.rotatevàdevice.token.revoke(yêu cầu phạm vioperator.pairing). device.token.rotatetrả về siêu dữ liệu xoay. Nó chỉ phản hồi lại mã thông báo bearer thay thế cho các lệnh gọi cùng thiết bị đã được xác thực bằng mã thông báo thiết bị đó, để máy khách chỉ dùng mã thông báo có thể lưu mã thay thế trước khi kết nối lại. Các lần xoay dùng chung/quản trị viên không phản hồi lại mã thông báo bearer.- Việc cấp, xoay và thu hồi mã thông báo vẫn bị giới hạn trong tập vai trò đã phê duyệt được ghi trong mục ghép nối của thiết bị đó; thao tác thay đổi mã thông báo không thể mở rộng hoặc nhắm tới vai trò thiết bị mà phê duyệt ghép nối chưa từng cấp.
- Với các phiên mã thông báo thiết bị đã ghép nối, quản lý thiết bị được giới hạn trong chính thiết bị đó trừ khi
bên gọi cũng có
operator.admin: bên gọi không phải quản trị viên chỉ có thể xóa/thu hồi/xoay mục thiết bị của chính họ. device.token.rotatevàdevice.token.revokecũng kiểm tra tập phạm vi mã thông báo operator đích với phạm vi phiên hiện tại của bên gọi. Bên gọi không phải quản trị viên không thể xoay hoặc thu hồi một mã thông báo operator rộng hơn phạm vi họ đang có.- Lỗi xác thực bao gồm
error.details.codecùng gợi ý khôi phục:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Hành vi của máy khách với
AUTH_TOKEN_MISMATCH:- Máy khách đáng tin cậy có thể thử lại một lần có giới hạn bằng mã thông báo theo từng thiết bị trong bộ nhớ đệm.
- Nếu lần thử lại đó thất bại, máy khách nên dừng các vòng lặp tự động kết nối lại và hiển thị hướng dẫn hành động cho người vận hành.
Danh tính thiết bị + ghép nối
- Các Node nên bao gồm một danh tính thiết bị ổn định (
device.id) được dẫn xuất từ vân tay cặp khóa. - Gateway cấp mã thông báo theo từng thiết bị + vai trò.
- Cần có phê duyệt ghép nối cho ID thiết bị mới trừ khi bật tự động phê duyệt cục bộ.
- Tự động phê duyệt ghép nối tập trung vào các kết nối local loopback trực tiếp.
- OpenClaw cũng có một đường dẫn tự kết nối hẹp trong backend/container-local cho các luồng trợ giúp dùng bí mật dùng chung đáng tin cậy.
- Các kết nối tailnet hoặc LAN cùng máy chủ vẫn được xem là từ xa đối với ghép nối và yêu cầu phê duyệt.
- Máy khách WS thường bao gồm danh tính
devicetrong khiconnect(operator + node). Các ngoại lệ operator không có thiết bị duy nhất là các đường dẫn tin cậy tường minh:gateway.controlUi.allowInsecureAuth=truecho khả năng tương thích HTTP không an toàn chỉ trên localhost.- xác thực Control UI operator thành công với
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, hạ cấp bảo mật nghiêm trọng).- RPC backend
gateway-clientqua direct-loopback được xác thực bằng mã thông báo/mật khẩu Gateway dùng chung.
- Tất cả kết nối phải ký nonce
connect.challengedo máy chủ cung cấp.
Chẩn đoán di chuyển xác thực thiết bị
Với các máy khách cũ vẫn dùng hành vi ký trước challenge, connect hiện trả về
mã chi tiết DEVICE_AUTH_* dưới error.details.code cùng error.details.reason ổn định.
Các lỗi di chuyển thường gặp:
| Thông báo | details.code | details.reason | Ý nghĩa |
|---|---|---|---|
device nonce required |
DEVICE_AUTH_NONCE_REQUIRED |
device-nonce-missing |
Máy khách bỏ qua device.nonce (hoặc gửi rỗng). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Máy khách đã ký bằng nonce cũ/sai. |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
Payload chữ ký không khớp payload v2. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
Dấu thời gian đã ký nằm ngoài độ lệch cho phép. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id không khớp vân tay khóa công khai. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
Định dạng/chuẩn hóa khóa công khai thất bại. |
Mục tiêu di chuyển:
- Luôn chờ
connect.challenge. - Ký payload v2 có bao gồm nonce máy chủ.
- Gửi cùng nonce trong
connect.params.device.nonce. - Payload chữ ký ưu tiên là
v3, liên kếtplatformvàdeviceFamilybên cạnh các trường device/client/role/scopes/token/nonce. - Chữ ký
v2cũ vẫn được chấp nhận để tương thích, nhưng ghim siêu dữ liệu thiết bị đã ghép nối vẫn kiểm soát chính sách lệnh khi kết nối lại.
TLS + ghim
- TLS được hỗ trợ cho kết nối WS.
- Máy khách có thể tùy chọn ghim vân tay chứng chỉ Gateway (xem cấu hình
gateway.tlscùnggateway.remote.tlsFingerprinthoặc CLI--tls-fingerprint).
Phạm vi
Giao thức này phơi bày toàn bộ API Gateway (trạng thái, kênh, mô hình, chat,
agent, phiên, node, phê duyệt, v.v.). Bề mặt chính xác được định nghĩa bởi các schema
TypeBox trong src/gateway/protocol/schema.ts.