Gateway
โปรโตคอล Gateway
โปรโตคอล Gateway WS เป็นระนาบควบคุมและการขนส่ง Node แบบรวมศูนย์สำหรับ OpenClaw ไคลเอนต์ของผู้ดำเนินการและ Node (CLI, UI เว็บ, แอป macOS, Node iOS/Android, Node แบบไม่มีส่วนติดต่อผู้ใช้) เชื่อมต่อผ่าน WebSocket และประกาศ บทบาท และ ขอบเขต ใน ระหว่างแฮนด์เชก
แพ็กเกจ npm
แพ็กเกจเหล่านี้จัดส่งพร้อมรอบการเผยแพร่ OpenClaw ระหว่างการเปิดตัวครั้งแรก
npm อาจส่งคืน E404 จนกว่าจะเผยแพร่รุ่นแรกที่มีแพ็กเกจ
@openclaw/gateway-protocolเผยแพร่สคีมา ตัวตรวจสอบความถูกต้อง ชนิด TypeScript ตัวช่วยขนาดเล็กสำหรับเฟรมและข้อผิดพลาด ตลอดจนค่าคงที่ของเวอร์ชัน tarball ของแพ็กเกจมีสัญญาที่สร้างขึ้นในรูปแบบที่เครื่องอ่านได้protocol.schema.json@openclaw/gateway-clientเผยแพร่ไคลเอนต์ Node อ้างอิงและเอนทรีที่ปลอดภัยสำหรับเบราว์เซอร์ที่@openclaw/gateway-client/browser
สำหรับคำแนะนำเกี่ยวกับวงจรชีวิตของแอปพลิเคชัน โปรดดู การสร้างไคลเอนต์ Gateway สำหรับแอป ที่ควบคุมดูแล Gateway ในฐานะโปรเซสลูก โปรดดู การฝัง OpenClaw
การขนส่งและการจัดเฟรม
- WebSocket, เฟรมข้อความ, เพย์โหลด JSON
- เฟรมแรก ต้อง เป็นคำขอ
connect - เฟรมก่อนเชื่อมต่อถูกจำกัดไว้ที่ 64 KiB (
MAX_PREAUTH_PAYLOAD_BYTES) หลังจาก แฮนด์เชก ให้ปฏิบัติตามhello-ok.policy.maxPayloadและhello-ok.policy.maxBufferedBytesเมื่อเปิดใช้การวินิจฉัย เฟรมขาเข้าที่มีขนาดเกินกำหนด และบัฟเฟอร์ขาออกที่ทำงานช้าจะปล่อยเหตุการณ์payload.largeก่อนที่ Gateway จะปิดหรือทิ้งเฟรม เหตุการณ์เหล่านี้มีsurface, ขนาดเป็นไบต์, ขีดจำกัด และรหัสเหตุผลที่ปลอดภัย โดยจะไม่มีเนื้อหาข้อความ เนื้อหาไฟล์แนบ ไบต์ดิบของเฟรม โทเค็น คุกกี้ หรือข้อมูลลับ
รูปแบบเฟรม:
- คำขอ:
{type:"req", id, method, params} - การตอบกลับ:
{type:"res", id, ok, payload|error} - เหตุการณ์:
{type:"event", event, payload, seq?, stateVersion?}
ข้อผิดพลาดในการตอบกลับใช้ { code, message, details?, retryable?, retryAfterMs? }
ไคลเอนต์ควรแยกการทำงานตาม code และ details.code; message ยังคงเป็นข้อความ
ที่มนุษย์อ่านได้และอาจเปลี่ยนแปลง เว้นแต่หมายเหตุด้านความเข้ากันได้จะระบุไว้เป็นอย่างอื่น ความล้มเหลว
ในการอนุญาตระดับเมธอดใช้ code: "FORBIDDEN" ระดับบนสุด พร้อมรายละเอียด
ขอบเขตที่ขาดหายไปแบบมีโครงสร้าง:
- ขอบเขตที่ขาดหายไป:
{ code: "MISSING_SCOPE", missingScope, requiredScopes }requiredScopesคือชุดขอบเขตที่รู้จักทั้งหมดสำหรับการดำเนินการที่ร้องขอ ข้อความแบบเดิมmissing scope: <scope>ยังคงเก็บไว้สำหรับไคลเอนต์รุ่นเก่า
ไคลเอนต์ควรอ่าน details ก่อน และใช้ข้อความแบบเดิมเป็นเพียงทางเลือกสำรอง
เพื่อความเข้ากันได้ readMissingScopeError และ readMissingScopeErrorDetails ถูกส่งออกจาก
@openclaw/gateway-protocol/gateway-error-details; ไคลเอนต์ Gateway ที่ปลอดภัยสำหรับเบราว์เซอร์
ส่งออกค่าเหล่านี้อีกครั้งจาก @openclaw/gateway-client/browser
สคีมาถูกส่งออกเป็น GatewayErrorDetailsSchema,
MissingScopeErrorDetailsSchema จาก @openclaw/gateway-protocol/schema
ความล้มเหลวของขอบเขต HTTP สะท้อนออบเจ็กต์ MISSING_SCOPE ภายใต้ error.details และ
ใช้สถานะ HTTP 403
เมธอดที่ก่อให้เกิดผลข้างเคียงต้องใช้คีย์ความเป็นไอดอมโพเทนต์ (ดูสคีมา)
แฮนด์เชก
Gateway ส่งชาเลนจ์ก่อนเชื่อมต่อ:
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}ไคลเอนต์ตอบกลับด้วย connect:
{ "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 ตอบกลับด้วย hello-ok:
{ "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 } }}server, features, snapshot, policy และ auth ล้วนเป็นค่าที่
HelloOkSchema (packages/gateway-protocol/src/schema/frames.ts) กำหนดให้ต้องมี auth
รายงานบทบาท/ขอบเขตที่เจรจาแล้ว แม้จะไม่มีการออกโทเค็นอุปกรณ์ (รูปแบบ
ด้านบน) pluginSurfaceUrls เป็นค่าเสริมและแมปชื่อพื้นผิวของ Plugin (เช่น
canvas) กับ URL ที่โฮสต์และมีขอบเขต URL อาจหมดอายุ ดังนั้น Node จึงเรียก
node.pluginSurface.refresh พร้อม { "surface": "canvas" } เพื่อรับเอนทรีใหม่
ไม่รองรับเส้นทาง canvasHostUrl / canvasCapability / node.canvas.capability.refresh
ที่เลิกใช้แล้ว ให้ใช้พื้นผิวของ Plugin
ค่าเสริม appliedConfigHash ของสแนปช็อตคือรีวิชันการกำหนดค่าต้นทางที่แก้ไขแล้ว
ซึ่งรันไทม์ Gateway ที่ทำงานอยู่ยอมรับ ไคลเอนต์สามารถเปรียบเทียบค่านี้กับ
config.get.configRevisionHash เพื่อพิจารณาว่าการกำหนดค่าที่บันทึกไว้ซึ่งใหม่กว่า
ยังต้องรีสตาร์ตหรือไม่ config.get.hash ยังคงเป็นรีวิชันดิบของไฟล์รากที่ใช้โดย
ตัวป้องกันข้อขัดแย้งในการเขียนการกำหนดค่า
ขณะที่ Gateway ยังดำเนินการเริ่มต้นไซด์คาร์ให้เสร็จสิ้น connect อาจส่งคืน
ข้อผิดพลาด UNAVAILABLE ที่ลองใหม่ได้ พร้อม details.reason: "startup-sidecars" และ
retryAfterMs ให้ลองใหม่ภายในงบประมาณการเชื่อมต่อ แทนที่จะถือว่าเป็น
ความล้มเหลวขั้นสุดท้ายของแฮนด์เชก
เมื่อมีการออกโทเค็นอุปกรณ์ hello-ok.auth จะเพิ่มโทเค็นดังกล่าว:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}การบูตสแตรปด้วย QR/รหัสตั้งค่าในตัวเป็นเส้นทางส่งต่อไปยังอุปกรณ์เคลื่อนที่ การเชื่อมต่อ ด้วยรหัสตั้งค่าพื้นฐานที่สำเร็จจะส่งคืนโทเค็น Node หลัก พร้อมโทเค็น ผู้ดำเนินการแบบจำกัดหนึ่งรายการ:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}การส่งต่อให้ผู้ดำเนินการนี้ถูกจำกัดไว้โดยตั้งใจ: เพียงพอสำหรับเริ่มลูป
ผู้ดำเนินการบนอุปกรณ์เคลื่อนที่และการตั้งค่าแบบเนทีฟ รวมถึง operator.talk.secrets สำหรับการอ่าน
การกำหนดค่า Talk แต่ไม่มีขอบเขตสำหรับแก้ไขการจับคู่และไม่มี operator.admin การเข้าถึง
การจับคู่/ผู้ดูแลระบบที่กว้างกว่านี้ต้องใช้การจับคู่หรือขั้นตอนโทเค็นที่ได้รับอนุมัติแยกต่างหาก ให้เก็บ
hello-ok.auth.deviceTokens ไว้เฉพาะเมื่อการรับรองความถูกต้องแบบบูตสแตรปทำงานผ่านการขนส่ง
ที่เชื่อถือได้ (wss:// หรือการจับคู่แบบลูปแบ็ก/ภายในเครื่อง)
ไคลเอนต์แบ็กเอนด์ในโปรเซสเดียวกันที่เชื่อถือได้ (client.id: "gateway-client",
client.mode: "backend") อาจละเว้น device บนการเชื่อมต่อลูปแบ็กโดยตรง เมื่อ
รับรองความถูกต้องด้วยโทเค็น/รหัสผ่าน Gateway ที่ใช้ร่วมกัน เส้นทางนี้สงวนไว้
สำหรับ RPC ภายในของระนาบควบคุม (เช่น การอัปเดตเซสชันของเอเจนต์ย่อย) และป้องกันไม่ให้
ข้อมูลพื้นฐานการจับคู่ CLI/อุปกรณ์ที่ล้าสมัยขัดขวางงานแบ็กเอนด์ภายในเครื่อง ไคลเอนต์ระยะไกล,
จากต้นทางเบราว์เซอร์, Node และไคลเอนต์ที่ระบุโทเค็นอุปกรณ์/ข้อมูลประจำตัวอุปกรณ์อย่างชัดเจน ยังคง
ผ่านการตรวจสอบการจับคู่และการยกระดับขอบเขตตามปกติ
บทบาทเวิร์กเกอร์และโปรโตคอลแบบปิด
เวิร์กเกอร์คลาวด์ใช้อินเกรสลูปแบ็กเฉพาะผ่านทันเนล SSH ที่ Gateway เป็นเจ้าของ
และตรึงคีย์โฮสต์ อินเกรสนี้ยอมรับเฉพาะข้อมูลประจำตัวของเวิร์กเกอร์ และจะไม่ส่งต่อ
การรับรองความถูกต้องทั่วไป เหตุการณ์ Node, RPC ของผู้ดำเนินการ หรือเมธอดของ Plugin โดยเด็ดขาด connect ที่เข้มงวด
จะตรวจสอบข้อมูลประจำตัวอายุสั้นซึ่งแฮชขณะจัดเก็บและผูกกับสภาพแวดล้อม แฮชของบันเดิล
เอพ็อกของเจ้าของ เวอร์ชันชุด RPC วันหมดอายุ และเซสชันที่เป็นค่าว่างได้หนึ่งเซสชัน โดย
ตรวจสอบเวอร์ชันปัจจุบันและชุดฟีเจอร์แยกต่างหาก เมื่อสำเร็จจะส่งคืน
worker-hello-ok ขั้นต่ำ การเจรจาฟีเจอร์ไม่ขึ้นกับเวอร์ชันโปรโตคอลทั่วไป
เฟรมยังคงมีขนาดต่ำกว่า 64 KiB ยกเว้นเฟรม worker.inference.start
ที่เจรจาแล้วอาจมีขนาดได้ถึง 25 MiB รายการอนุญาตแบบปิดประกอบด้วย worker.heartbeat,
worker.transcript.commit, worker.live-event, worker.inference.start และ
worker.inference.cancel
การคอมมิตทรานสคริปต์ใช้การกั้นด้วยเอพ็อกของเจ้าของ การผูกเซสชันที่ Gateway เป็นเจ้าของ การเปรียบเทียบและสลับลีฟฐาน และการเล่นลำดับซ้ำแบบถาวร Gateway สร้าง เอนทรีทรานสคริปต์และ ID พาเรนต์ผ่านตัวเขียนเซสชันตามปกติ โดยจะตรวจสอบความเป็นเจ้าของและ วันหมดอายุอีกครั้งใน RPC แต่ละครั้ง
ความสามารถของไคลเอนต์
ไคลเอนต์ผู้ดำเนินการอาจประกาศความสามารถเสริมใน connect.params.caps:
tool-events: ยอมรับเหตุการณ์วงจรชีวิตของเครื่องมือแบบมีโครงสร้างinline-widgets: สามารถเรนเดอร์ผลลัพธ์ของเครื่องมือวิดเจ็ตอินไลน์ที่โฮสต์ไว้
ความสามารถของไคลเอนต์อธิบายไคลเอนต์ที่เชื่อมต่อ ไม่ใช่การอนุญาต เครื่องมือของเอเจนต์อาจประกาศความสามารถที่จำเป็น Gateway จะละเว้นเครื่องมือเหล่านั้น เว้นแต่ข้อกำหนดทั้งหมดจะปรากฏใน caps ของไคลเอนต์ต้นทาง การทำงานที่มีต้นทางจากช่องทางไม่มีความสามารถของไคลเอนต์ Gateway ดังนั้นเครื่องมือที่จำกัดด้วยความสามารถจะไม่พร้อมใช้งาน แม้นโยบายเครื่องมือจะอนุญาตเครื่องมือเหล่านั้นอย่างชัดเจนก็ตาม
ตัวอย่างการเชื่อมต่อ 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": "…" } }}Node ประกาศการอ้างสิทธิ์ความสามารถในขณะเชื่อมต่อ:
caps: หมวดหมู่ระดับสูง เช่นcamera,canvas,screen,location,voice,talkcommands: รายการอนุญาตคำสั่งสำหรับการเรียกใช้permissions: ตัวสลับแบบละเอียด (เช่นscreen.record,camera.capture)
Gateway ถือว่าสิ่งเหล่านี้เป็นการอ้างสิทธิ์และบังคับใช้รายการอนุญาตฝั่งเซิร์ฟเวอร์
บทบาทและขอบเขต
สำหรับโมเดลขอบเขตของผู้ดำเนินการทั้งหมด การตรวจสอบในเวลาอนุมัติ และความหมายของข้อมูลลับ ที่ใช้ร่วมกัน โปรดดู ขอบเขตของผู้ดำเนินการ
บทบาท:
operator: ไคลเอนต์ระนาบควบคุม (CLI/UI/ระบบอัตโนมัติ)node: โฮสต์ความสามารถ (กล้อง/หน้าจอ/แคนวาส/system.run)worker: โฮสต์การดำเนินการบนคลาวด์ในโปรโตคอลเวิร์กเกอร์เฉพาะแบบปิด
ขอบเขตของผู้ดำเนินการ (src/gateway/operator-scopes.ts) ซึ่งเป็นชุดแบบปิดทั้งหมด:
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.admin
(src/shared/gateway-method-policy.ts) เสมอ: config.*, exec.approvals.*,
wizard.*, update.*
ขอบเขตของเมธอดเป็นเพียงด่านแรก คำสั่งแบบสแลชบางรายการที่เข้าถึงผ่าน
chat.send ใช้การตรวจสอบระดับคำสั่งที่เข้มงวดยิ่งขึ้น: การเขียน /config set และ
/config unset แบบถาวรต้องใช้ operator.admin แม้สำหรับไคลเอนต์ Gateway ที่
มีขอบเขตผู้ดำเนินการระดับต่ำกว่าอยู่แล้ว
node.pair.approve มีการตรวจสอบขอบเขตเพิ่มเติมในเวลาอนุมัติ นอกเหนือจาก
ขอบเขตพื้นฐานของเมธอด (operator.pairing) โดยอิงตาม commands
(src/infra/node-pairing-authz.ts) ที่คำขอซึ่งรอดำเนินการประกาศไว้:
| คำสั่งที่ประกาศ | ขอบเขตที่จำเป็น |
|---|---|
| ไม่มี | operator.pairing |
| คำสั่งทั่วไป | operator.pairing + operator.write |
มี system.run, system.run.prepare, system.which, browser.proxy, fs.listDir หรือ system.execApprovals.get/set |
operator.pairing + operator.admin |
ความสามารถ/คำสั่ง/สิทธิ์ (Node)
Node ประกาศการอ้างสิทธิ์ความสามารถขณะเชื่อมต่อ:
caps: หมวดหมู่ความสามารถระดับสูง เช่นcamera,canvas,screen,location,voiceและtalkcommands: รายการคำสั่งที่อนุญาตสำหรับการเรียกใช้permissions: ตัวเลือกเปิด/ปิดแบบละเอียด (เช่นscreen.record,camera.capture)
Gateway ถือว่าสิ่งเหล่านี้เป็น การอ้างสิทธิ์ และบังคับใช้รายการที่อนุญาตฝั่งเซิร์ฟเวอร์
Node ที่เชื่อมต่อสามารถเผยแพร่ตัวอธิบาย Plugin หรือเครื่องมือ MCP ซึ่งให้เอเจนต์มองเห็นได้และเป็นตัวเลือก
ผ่าน node.pluginTools.update หลังจากเชื่อมต่อหรือ
เชื่อมต่อใหม่สำเร็จ โฮสต์ Node แบบไม่มีส่วนติดต่อผู้ใช้จะรีสตาร์ตเพื่อใช้การเปลี่ยนแปลง
รายการ MCP ที่ประกาศไว้ วิธีอัปเดตนี้เป็นช่องทางเผยแพร่เพียงช่องทางเดียว ระบบไม่ยอมรับตัวอธิบายเครื่องมือ Plugin ใน
พารามิเตอร์ connect ตัวอธิบายแต่ละรายการต้องใช้ name ของเครื่องมือที่ปลอดภัยสำหรับผู้ให้บริการ และระบุ
command ที่อยู่ในรายการคำสั่งที่อนุญาตปัจจุบันของ Node Gateway เชื่อถือเมทาดาทา
ของตัวอธิบายจาก Node ที่จับคู่ กรองตัวอธิบายที่อยู่นอกขอบเขตคำสั่ง
ที่อนุมัติ ลบออกเมื่อ Node ตัดการเชื่อมต่อ และปฏิเสธความพยายามของผู้ปฏิบัติงาน
ในการแก้ไขแค็ตตาล็อกของ Node อื่น ตั้งค่า gateway.nodes.pluginTools.enabled: false
เพื่อไม่สนใจตัวอธิบายที่ Node เผยแพร่
โฮสต์ Node ที่เชื่อมต่อเผยแพร่แค็ตตาล็อกทดแทน Skills ทั้งหมดผ่าน
node.skills.update เมธอดสำหรับบทบาท Node นี้เป็นช่องทางเผยแพร่ Skills ของ Node
เพียงช่องทางเดียว ระบบไม่ยอมรับ Skills ในพารามิเตอร์ connect ตัวอธิบายแต่ละรายการประกอบด้วย
ชื่อที่ปลอดภัย คำอธิบาย และเนื้อหา SKILL.md ที่มีขอบเขตจำกัด Gateway จะแยกวิเคราะห์
เนื้อหานั้นด้วยตัวโหลด Skills ตามปกติ รวมไว้ในสแนปช็อต Skills ของเอเจนต์
ขณะที่ Node เชื่อมต่อ และลบออกเมื่อตัดการเชื่อมต่อ ตั้งค่า
gateway.nodes.skills.enabled: false เพื่อไม่สนใจ Skills ที่ Node เผยแพร่
สถานะการปรากฏ
system-presenceส่งคืนรายการที่ใช้ข้อมูลประจำตัวของอุปกรณ์เป็นคีย์ รวมถึงdeviceId,rolesและscopesเพื่อให้ UI แสดงหนึ่งแถวต่ออุปกรณ์ได้ แม้ อุปกรณ์นั้นจะเชื่อมต่อทั้งในฐานะผู้ปฏิบัติงานและ Nodenode.listมีlastSeenAtMsและlastSeenReasonซึ่งระบุหรือไม่ก็ได้ Node ที่เชื่อมต่อ รายงานเวลาเชื่อมต่อปัจจุบันโดยใช้เหตุผลconnect; Node ที่จับคู่ยังสามารถ รายงานสถานะการปรากฏเบื้องหลังแบบคงอยู่ผ่านเหตุการณ์ Node ที่เชื่อถือได้
Node แบบเนทีฟบน macOS ยังสามารถส่งเหตุการณ์ node.presence.activity ที่ผ่านการยืนยันตัวตน
พร้อมระยะเวลาที่ไม่มีการป้อนข้อมูลซึ่งมีขอบเขตจำกัด Gateway จะคำนวณการประทับเวลากิจกรรมด้วย
นาฬิกาของตนเอง เปิดเผย Mac ที่เชื่อมต่อและเป็นปัจจุบันที่สุดผ่าน node.list และ
node.describe และกระจายการอัปเดต node.presence ไปยังไคลเอนต์ที่มีขอบเขตสิทธิ์อ่าน
ดูพฤติกรรมการเลือก ความเป็นส่วนตัว บริบทโมเดล
และการกำหนดเส้นทางการแจ้งเตือนได้ที่ สถานะการปรากฏของคอมพิวเตอร์ที่ใช้งานอยู่
เหตุการณ์ที่ Node ยังทำงานในเบื้องหลัง
Node เรียก node.event พร้อม event: "node.presence.alive" เพื่อบันทึกว่า
Node ที่จับคู่ยังทำงานอยู่ระหว่างการปลุกเบื้องหลัง โดยไม่ทำเครื่องหมายว่าเชื่อมต่ออยู่:
{ "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 ค่าที่ไม่รู้จักจะถูกปรับเป็น
background (src/shared/node-presence.ts) เหตุการณ์จะคงอยู่เฉพาะสำหรับ
เซสชันอุปกรณ์ Node ที่ผ่านการยืนยันตัวตน ส่วนเซสชันที่ไม่มีอุปกรณ์หรือไม่ได้จับคู่จะส่งคืน
handled: false
Gateway ที่ดำเนินการสำเร็จจะส่งคืนผลลัพธ์แบบมีโครงสร้าง:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Gateway รุ่นเก่าอาจส่งคืนเพียง { "ok": true } สำหรับ node.event; ให้ถือว่า
เป็น RPC ที่ได้รับการตอบรับ ไม่ใช่การคงสถานะการปรากฏแบบถาวร
การกำหนดขอบเขตเหตุการณ์กระจาย
เหตุการณ์กระจายที่เซิร์ฟเวอร์พุชจะถูกควบคุมตามขอบเขต เพื่อไม่ให้เซสชัน
ที่มีขอบเขตเฉพาะการจับคู่หรือเฉพาะ Node รับเนื้อหาเซสชันโดยไม่ร้องขอ
(src/gateway/server-broadcast.ts):
- เฟรมแชต เอเจนต์ และผลลัพธ์เครื่องมือ (เหตุการณ์
agentแบบสตรีม เหตุการณ์ ผลลัพธ์เครื่องมือ) ต้องมีอย่างน้อยoperator.readเซสชันที่ไม่มีสิทธิ์นี้จะข้าม เฟรมเหล่านี้ทั้งหมด - การกระจาย
plugin.*ที่ Plugin กำหนดจะถูกจำกัดไว้ที่operator.writeหรือoperator.adminโดยค่าเริ่มต้น ส่วนรายการที่ระบุชัด เช่นplugin.approval.requested/plugin.approval.resolvedจะใช้operator.approvalsแทน - เหตุการณ์สถานะ/การขนส่ง (
heartbeat,presence,tick, วงจรชีวิต การเชื่อมต่อ/ตัดการเชื่อมต่อ) ยังคงไม่ถูกจำกัด เพื่อให้ทุกเซสชัน ที่ผ่านการยืนยันตัวตนสามารถสังเกตสถานะการทำงานของการขนส่งได้ - ตระกูลเหตุการณ์กระจายที่ไม่รู้จักจะถูกจำกัดตามขอบเขตโดยค่าเริ่มต้น (ปฏิเสธเมื่อไม่แน่ใจ) เว้นแต่ตัวจัดการที่ลงทะเบียนจะผ่อนปรนข้อจำกัดอย่างชัดเจน
การเชื่อมต่อของไคลเอนต์แต่ละรายการจะเก็บหมายเลขลำดับเฉพาะของตนเอง ดังนั้นเหตุการณ์กระจาย จึงยังคงเรียงลำดับเพิ่มขึ้นอย่างสม่ำเสมอบนซ็อกเก็ตนั้น แม้ไคลเอนต์ต่างกันจะเห็น ชุดย่อยของสตรีมเหตุการณ์ที่ผ่านการกรองตามขอบเขตแตกต่างกัน
ตระกูลเมธอด RPC
hello-ok.features.methods เป็นรายการค้นพบแบบระมัดระวังซึ่งสร้างจาก
src/gateway/server-methods-list.ts ร่วมกับการส่งออกเมธอดของ Plugin/ช่องทาง
ที่โหลดแล้ว โดยไม่ใช่รายการทุกเมธอดที่สร้างขึ้นโดยอัตโนมัติ และบางเมธอด (เช่น
push.test, web.login.start, web.login.wait, sessions.usage)
ถูกตัดออกจากการค้นพบโดยเจตนา แม้จะเป็นเมธอดจริงที่เรียกใช้ได้
ให้ถือว่านี่เป็นการค้นพบคุณสมบัติ ไม่ใช่รายการ
src/gateway/server-methods/*.ts ทั้งหมด
ระบบและข้อมูลประจำตัว
healthส่งคืนสแนปช็อตสถานะการทำงานของ Gateway ที่แคชไว้หรือตรวจสอบใหม่diagnostics.stabilityส่งคืนตัวบันทึกเสถียรภาพการวินิจฉัยล่าสุดที่มีขอบเขตจำกัด ได้แก่ ชื่อเหตุการณ์ จำนวน ขนาดไบต์ ค่าหน่วยความจำ สถานะคิว/เซสชัน ชื่อช่องทาง/Plugin และรหัสเซสชัน ไม่มีข้อความแชต เนื้อหา Webhook ผลลัพธ์เครื่องมือ เนื้อหาคำขอ/การตอบกลับดิบ โทเค็น คุกกี้ หรือข้อมูลลับ ต้องมีoperator.readstatusส่งคืนข้อมูลสรุป Gateway ในรูปแบบ/status; ฟิลด์ที่ละเอียดอ่อนมีให้เฉพาะไคลเอนต์ผู้ปฏิบัติงานที่มีขอบเขตผู้ดูแลระบบgateway.identity.getส่งคืนข้อมูลประจำตัวอุปกรณ์ของ Gateway ที่โฟลว์รีเลย์และการจับคู่ใช้system-presenceส่งคืนสแนปช็อตสถานะการปรากฏปัจจุบันของอุปกรณ์ผู้ปฏิบัติงาน/Node ที่เชื่อมต่อsystem-eventเพิ่มเหตุการณ์ระบบและสามารถอัปเดต/กระจายบริบทสถานะการปรากฏlast-heartbeatส่งคืนเหตุการณ์ Heartbeat ล่าสุดที่คงอยู่set-heartbeatsเปิดหรือปิดการประมวลผล Heartbeat บน Gatewaygateway.suspend.prepareสร้างสัญญาเช่าระงับการทำงานร่วมกันระยะสั้นเฉพาะเมื่องาน Gateway ที่ติดตามอยู่ว่างเท่านั้นgateway.suspend.statusตรวจสอบสัญญาเช่านั้น และgateway.suspend.resumeปล่อยสัญญาหลังกลับมาทำงานหรือการดำเนินการของโฮสต์ถูกยกเลิก
โมเดลและการใช้งาน
models.listส่งคืนแค็ตตาล็อกโมเดลที่รันไทม์อนุญาต ดู "มุมมองmodels.list" ด้านล่างusage.statusส่งคืนข้อมูลสรุปช่วงเวลาการใช้งาน/โควตาที่เหลือของผู้ให้บริการusage.costส่งคืนข้อมูลสรุปการใช้จ่ายรวมสำหรับช่วงวันที่ ส่งagentIdสำหรับเอเจนต์หนึ่งตัว หรือagentScope: "all"เพื่อรวมเอเจนต์ที่กำหนดค่าไว้doctor.memory.statusส่งคืนความพร้อมของหน่วยความจำเวกเตอร์/การฝังที่แคชไว้สำหรับพื้นที่ทำงานของเอเจนต์เริ่มต้นที่ใช้งานอยู่ ส่ง{ "probe": true }หรือ{ "deep": true }เฉพาะเมื่อต้องการ ping ผู้ให้บริการการฝังแบบสดอย่างชัดเจน ส่ง{ "agentId": "agent-id" }เพื่อจำกัดสถิติพื้นที่จัดเก็บ Dreaming ไว้ที่พื้นที่ทำงานของเอเจนต์หนึ่งรายการ หากละเว้นจะรวมพื้นที่ทำงาน Dreaming ที่กำหนดค่าไว้doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifactsและdoctor.memory.dedupeDreamDiaryยอมรับ{ "agentId": "agent-id" }ซึ่งระบุหรือไม่ก็ได้ หากละเว้น เมธอดเหล่านี้จะทำงานกับพื้นที่ทำงานของเอเจนต์เริ่มต้นที่กำหนดค่าไว้doctor.memory.remHarnessส่งคืนตัวอย่าง REM harness แบบอ่านอย่างเดียวที่มีขอบเขตจำกัดสำหรับไคลเอนต์ระนาบควบคุมระยะไกล รวมถึงพาธพื้นที่ทำงาน ส่วนย่อยหน่วยความจำ Markdown ที่เรนเดอร์โดยอิงข้อมูล และรายการที่มีโอกาสเลื่อนระดับแบบเชิงลึก ต้องมีoperator.readsessions.usageส่งคืนข้อมูลสรุปการใช้งานต่อเซสชัน ส่งagentIdสำหรับเอเจนต์หนึ่งตัว หรือagentScope: "all"เพื่อแสดงเอเจนต์ที่กำหนดค่าไว้ร่วมกัน เมธอดการใช้งานทั้งสองยอมรับmode: "specific"พร้อมtimeZoneตามมาตรฐาน IANA สำหรับขอบเขตและบักเก็ตของวันตามปฏิทินที่รองรับ DSTutcOffsetยังคงรองรับไคลเอนต์รุ่นเก่า และใช้เป็นทางเลือกสำรองเมื่อรันไทม์ Gateway ไม่รู้จักโซนที่ร้องขอsessions.usage.timeseriesส่งคืนการใช้งานแบบอนุกรมเวลาสำหรับหนึ่งเซสชันsessions.usage.logsส่งคืนรายการบันทึกการใช้งานสำหรับหนึ่งเซสชัน
ช่องทางและตัวช่วยเข้าสู่ระบบ
channels.statusส่งคืนข้อมูลสรุปสถานะของช่องทาง/Plugin ที่มีในตัวและรวมมากับระบบchannels.logoutออกจากระบบของช่องทาง/บัญชีที่ระบุ ในกรณีที่ช่องทางรองรับweb.login.startเริ่มโฟลว์เข้าสู่ระบบด้วย QR/เว็บสำหรับผู้ให้บริการช่องทางเว็บปัจจุบันที่รองรับ QRweb.login.waitรอให้โฟลว์นั้นเสร็จสมบูรณ์ และเริ่มช่องทางเมื่อสำเร็จpush.testส่งการพุช APNs ทดสอบไปยัง Node iOS ที่ลงทะเบียนไว้voicewake.getส่งคืนทริกเกอร์คำปลุกที่จัดเก็บไว้voicewake.setอัปเดตทริกเกอร์คำปลุกและกระจายการเปลี่ยนแปลง
การจัดการ Plugin
plugins.list(operator.read) ส่งคืนรายการ Plugin ที่ติดตั้ง พร้อมรายการทางการที่คัดสรรไว้ในเครื่อง การวินิจฉัย และข้อมูลว่าโหมดการติดตั้งปัจจุบันอนุญาตให้แก้ไขหรือไม่plugins.search(operator.read) ค้นหาตระกูล Plugin โค้ดและ Plugin ชุดรวมของ ClawHub ที่ติดตั้งได้ ส่งqueryที่ไม่ว่าง และlimitซึ่งระบุหรือไม่ก็ได้ ตั้งแต่ 1 ถึง 100plugins.install(operator.admin) ติดตั้งรายการแค็ตตาล็อกทางการด้วย{ source: "official", pluginId }หรือแพ็กเกจ ClawHub ด้วย{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }การติดตั้ง ClawHub จะคงการตรวจสอบความน่าเชื่อถือ ความสมบูรณ์ และนโยบายการติดตั้งของ Gateway การติดตั้งที่สำเร็จต้องรีสตาร์ต Gatewayplugins.setEnabled(operator.admin) เปลี่ยนนโยบายการเปิดใช้งานของ Plugin ที่ติดตั้งหนึ่งรายการด้วย{ pluginId, enabled }การตอบกลับประกอบด้วยรายการแค็ตตาล็อกที่อัปเดต เมทาดาทาการรีสตาร์ต และคำเตือนเกี่ยวกับการเลือกสล็อตplugins.uninstall(operator.admin) ลบ Plugin ที่ติดตั้งจากภายนอกหนึ่งรายการด้วย{ pluginId }ได้แก่ การอ้างอิงในการกำหนดค่า ระเบียนการติดตั้ง และไฟล์ที่จัดการอยู่ ไม่สามารถถอนการติดตั้ง Plugin ที่รวมมากับระบบได้ ทำได้เพียงปิดใช้งาน การตอบกลับจะแสดงรายการการดำเนินการลบและต้องรีสตาร์ต Gateway เสมอ
การส่งข้อความและบันทึก
sendคือ RPC สำหรับการส่งออกโดยตรงไปยังช่อง/บัญชี/เธรดเป้าหมายภายนอกตัวเรียกใช้แชตlogs.tailส่งคืนส่วนท้ายของบันทึกไฟล์ Gateway ที่กำหนดค่าไว้ พร้อมตัวควบคุมเคอร์เซอร์/ขีดจำกัดและจำนวนไบต์สูงสุด
เทอร์มินัลของผู้ปฏิบัติงาน
terminal.openเริ่ม PTY ของโฮสต์สำหรับagentIdที่ระบุอย่างชัดเจนหรือเอเจนต์เริ่มต้น และส่งคืนเอเจนต์ที่แก้ไขแล้ว ไดเรกทอรีทำงาน เชลล์ และสถานะการจำกัดขอบเขตterminal.input,terminal.resizeและterminal.closeทำงานเฉพาะกับเซสชันที่เป็นของการเชื่อมต่อที่เรียกใช้เท่านั้นterminal.uploadรับไฟล์ base64 หนึ่งไฟล์ขนาดไม่เกิน 16 MiB จัดเตรียมไฟล์ไว้ในไดเรกทอรีชั่วคราวส่วนตัวอายุ 24 ชั่วโมงบน Gateway ของเซสชันหรือโฮสต์ Node ที่จับคู่ และส่งคืนพาธสัมบูรณ์ ผู้เรียกยังคงต้องวางหรือใช้พาธนั้นด้วยวิธีอื่น RPC จะไม่เขียนอินพุตเทอร์มินัลหรือเรียกใช้คำสั่ง- เหตุการณ์
terminal.dataและterminal.exitจะสตรีมไปยังการเชื่อมต่อที่เป็นเจ้าของเซสชันเท่านั้น - เซสชันที่การเชื่อมต่อหลุดจะถูกแยกออก ไม่ใช่ยุติ โดยยังคงเชื่อมต่อกลับได้เป็นเวลา
gateway.terminal.detachedSessionTimeoutSeconds(ค่าเริ่มต้น 300;0คืนค่าการยุติเมื่อการเชื่อมต่อหลุด) ขณะที่เอาต์พุตล่าสุดสะสมอยู่ในบัฟเฟอร์ฝั่งเซิร์ฟเวอร์ที่มีขนาดจำกัด terminal.listส่งคืนเซสชันที่เชื่อมต่อได้;terminal.attachผูกเซสชันที่ยังทำงานหรือถูกแยกอยู่เข้ากับการเชื่อมต่อที่เรียกใช้ใหม่ และส่งคืนบัฟเฟอร์สำหรับเล่นซ้ำ (การยึดครองแบบ tmux — เจ้าของเดิมที่ยังเชื่อมต่ออยู่จะได้รับterminal.exitพร้อมเหตุผลdetached);terminal.textอ่านบัฟเฟอร์เป็นข้อความธรรมดาโดยไม่เชื่อมต่อกับเซสชัน- เมธอดเทอร์มินัลทุกเมธอดต้องมี
operator.admin; ต้องตั้งค่าgateway.terminal.enabledเป็น true อย่างชัดเจน ระบบจะปฏิเสธเอเจนต์ที่อยู่ในแซนด์บ็อกซ์อย่างสมบูรณ์ และการเปลี่ยนนโยบายเอเจนต์จะปิด PTY ที่มีอยู่และกำลังดำเนินการทั้งหมด รวมถึง PTY ที่ถูกแยกไว้
การสนทนาและ TTS
talk.catalogส่งคืนแค็ตตาล็อกผู้ให้บริการ Talk แบบอ่านอย่างเดียวสำหรับเสียงพูด การถอดเสียงแบบสตรีม และเสียงแบบเรียลไทม์ ได้แก่ ID ผู้ให้บริการมาตรฐาน นามแฝงรีจิสทรี ป้ายกำกับ สถานะการกำหนดค่า ผลลัพธ์readyระดับกลุ่มที่อาจมี ID โมเดล/เสียงที่เปิดเผย โหมดมาตรฐาน การขนส่ง กลยุทธ์สมอง และแฟล็กเสียง/ความสามารถแบบเรียลไทม์ โดยไม่ส่งคืนข้อมูลลับของผู้ให้บริการหรือแก้ไขการกำหนดค่าส่วนกลาง 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ต้องส่งspawnedByด้วยเพื่อให้มองเห็นคีย์เซสชันตามขอบเขต; การสร้างsessionKeyแบบไม่มีขอบเขตและbrain: "direct-tools"ต้องมีoperator.admintalk.session.joinตรวจสอบโทเค็นเซสชันของห้องที่มีการจัดการ ส่งsession.readyหรือsession.replacedตามความจำเป็น และส่งคืนข้อมูลเมตาของห้อง/เซสชันพร้อมเหตุการณ์ Talk ล่าสุด โดยไม่ส่งคืนโทเค็นข้อความธรรมดาหรือแฮชของโทเค็นtalk.session.appendAudioเพิ่มเสียงอินพุต PCM แบบ base64 ต่อท้ายเซสชันรีเลย์และการถอดเสียงแบบเรียลไทม์ที่ Gateway เป็นเจ้าของtalk.session.startTurn,talk.session.endTurnและtalk.session.cancelTurnควบคุมวงจรชีวิตของเทิร์นในห้องที่มีการจัดการ พร้อมปฏิเสธเทิร์นที่ล้าสมัยก่อนล้างสถานะtalk.session.cancelOutputหยุดเอาต์พุตเสียงของผู้ช่วย โดยหลักใช้สำหรับการแทรกพูดที่ควบคุมด้วย VAD ในเซสชันรีเลย์ของ Gatewaytalk.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ปิดเซสชันรีเลย์ การถอดเสียง หรือห้องที่มีการจัดการซึ่ง Gateway เป็นเจ้าของ และส่งเหตุการณ์ Talk สิ้นสุดtalk.modeตั้งค่า/ประกาศสถานะโหมด Talk ปัจจุบันสำหรับไคลเอนต์ WebChat/Control UItalk.client.createสร้างหรือดำเนินเซสชันผู้ให้บริการแบบเรียลไทม์ที่ไคลเอนต์เป็นเจ้าของต่อ โดยใช้webrtcหรือprovider-websocketขณะที่ Gateway เป็นเจ้าของข้อมูลประจำตัว คำสั่ง นโยบายเครื่องมือ และvoiceSessionIdที่ส่งคืน ไคลเอนต์ส่งsessionKeyและใช้voiceSessionIdซ้ำเมื่อเปลี่ยนการขนส่งของผู้ให้บริการระหว่างการโทรหนึ่งครั้งtalk.client.transcriptเพิ่มรายการ{ role, text }ที่เสร็จสมบูรณ์หนึ่งรายการต่อท้ายเซสชันเอเจนต์ปกติentryIdที่จำเป็นมีคุณสมบัติ idempotent ภายในvoiceSessionId; การลองใหม่จะไม่ทำให้ข้อความทรานสคริปต์ซ้ำtalk.client.closeปิดเซสชันเสียงเชิงตรรกะหลังการเขียนทรานสคริปต์ที่รอดำเนินการ การปิดมีคุณสมบัติ idempotent และอาจส่งข้อมูลสรุปการโทรที่มีเฉพาะการเปลี่ยนแปลงไปยังช่องทางล่าสุดของเซสชันที่ไม่ใช่ WebChattalk.client.toolCallช่วยให้การขนส่งแบบเรียลไทม์ที่ไคลเอนต์เป็นเจ้าของส่งต่อการเรียกใช้เครื่องมือของผู้ให้บริการไปยังนโยบายของ Gateway เครื่องมือแรกที่รองรับคือopenclaw_agent_consult; ไคลเอนต์จะได้รับ ID การเรียกใช้และรอเหตุการณ์วงจรชีวิตแชตตามปกติก่อนส่งผลลัพธ์เครื่องมือเฉพาะของผู้ให้บริการ การดำเนินการที่มีผลกระทบสูงซึ่งผูกกับเสียงจะส่งคืนVOICE_CONFIRMATION_REQUIRED:<id>จนกว่าคำพูดของผู้ใช้ที่เสร็จสมบูรณ์ในภายหลังจะยืนยันการดำเนินการนั้นอย่างชัดเจน และการปรึกษาครั้งถัดไปส่งconfirmationIdtalk.client.steerส่งการควบคุมด้วยเสียงของการเรียกใช้ที่ทำงานอยู่สำหรับการขนส่งแบบเรียลไทม์ที่ไคลเอนต์เป็นเจ้าของ Gateway จะแก้ไขการเรียกใช้แบบฝังที่ทำงานอยู่จากsessionKeyและส่งคืนผลลัพธ์การยอมรับ/ปฏิเสธที่มีโครงสร้าง แทนการละทิ้งการชี้นำโดยไม่แจ้งtalk.eventเป็นช่องเหตุการณ์ Talk เดียวสำหรับอะแดปเตอร์แบบเรียลไทม์ การถอดเสียง STT/TTS ห้องที่มีการจัดการ โทรศัพท์ และการประชุมtalk.speakสังเคราะห์เสียงพูดผ่านผู้ให้บริการเสียงพูด Talk ที่ใช้งานอยู่tts.statusส่งคืนสถานะการเปิดใช้ TTS ผู้ให้บริการที่ใช้งานอยู่ ผู้ให้บริการสำรอง และสถานะการกำหนดค่าผู้ให้บริการtts.providersส่งคืนรายการผู้ให้บริการ TTS ที่มองเห็นได้tts.enableและtts.disableสลับสถานะค่ากำหนด TTStts.setProviderอัปเดตผู้ให้บริการ TTS ที่ต้องการtts.convertเรียกใช้การแปลงข้อความเป็นเสียงพูดแบบครั้งเดียวtts.speak(operator.write) เรนเดอร์textที่ไม่ว่างด้วยสายโซ่ผู้ให้บริการ TTS ทั่วไปที่กำหนดค่าไว้ และส่งคืนคลิปทั้งหมดหนึ่งคลิปแบบอินไลน์เป็นaudioBase64พร้อมproviderและข้อมูลเมตาoutputFormat,mimeTypeและfileExtensionที่อาจมี ซึ่งต่างจากtts.convertตรงที่ไม่ส่งคืนพาธภายใน Gateway และต่างจากtalk.speakตรงที่ไม่ต้องใช้ผู้ให้บริการ Talk ข้อความที่เกินmessages.tts.maxTextLengthจะส่งคืนINVALID_REQUEST; ความล้มเหลวในการสังเคราะห์จะส่งคืนUNAVAILABLE
ข้อมูลลับ การกำหนดค่า การอัปเดต และตัวช่วยสร้าง
secrets.reloadแก้ไข SecretRefs ที่ใช้งานอยู่อีกครั้งและเผยแพร่สถานะรันไทม์ที่รับรู้เจ้าของแบบอะตอม ความล้มเหลวของเจ้าของที่เข้าเกณฑ์สามารถเผยแพร่เป็นการลดระดับแบบ cold หรือ stale พร้อมwarningCount; ความล้มเหลวแบบเข้มงวดหรือไม่มีการแมปจะปฏิเสธการโหลดซ้ำและรักษาสแนปช็อตที่ใช้งานอยู่secrets.resolveแก้ไขการกำหนดข้อมูลลับของเป้าหมายคำสั่งสำหรับชุดคำสั่ง/เป้าหมายที่ระบุconfig.getส่งคืนสแนปช็อตการกำหนดค่าบนดิสก์ปัจจุบันhashของไฟล์รากแบบดิบconfigRevisionHashที่แก้ไขแล้ว และappliedConfigHashที่อาจมีสำหรับรีวิชันที่แก้ไขแล้วซึ่งรันไทม์ Gateway ที่ใช้งานอยู่ยอมรับconfig.setเขียนเพย์โหลดการกำหนดค่าที่ผ่านการตรวจสอบconfig.patchผสานการอัปเดตการกำหนดค่าบางส่วน การแทนที่อาร์เรย์แบบทำลายต้องมีพาธที่ได้รับผลกระทบในreplacePaths; อาร์เรย์ที่ซ้อนอยู่ภายใต้รายการอาร์เรย์ใช้พาธ[]เช่นagents.list[].skillsconfig.applyตรวจสอบและแทนที่เพย์โหลดการกำหนดค่าทั้งหมดconfig.schemaส่งคืนเพย์โหลดสคีมาการกำหนดค่าแบบสดที่ใช้โดย Control UI และเครื่องมือ CLI ได้แก่ สคีมาuiHintsเวอร์ชัน ข้อมูลเมตาการสร้าง และข้อมูลเมตาสคีมาของ Plugin กับช่องทางเมื่อโหลดได้ โดยรวมข้อมูลเมตาtitle/descriptionจากป้ายกำกับ/ข้อความช่วยเหลือชุดเดียวกับ UI รวมถึงออบเจ็กต์ที่ซ้อนกัน ไวลด์การ์ด รายการอาร์เรย์ และกิ่งการประกอบanyOf/oneOf/allOfเมื่อมีเอกสารฟิลด์ที่ตรงกันconfig.schema.lookupส่งคืนเพย์โหลดการค้นหาตามขอบเขตพาธสำหรับพาธการกำหนดค่าหนึ่งรายการ ได้แก่ พาธที่ปรับให้เป็นมาตรฐาน โหนดสคีมาแบบตื้น คำใบ้ที่ตรงกันพร้อมhintPathค่าreloadKindที่อาจมี และข้อมูลสรุปโหนดลูกโดยตรงสำหรับการเจาะลึกผ่าน UI/CLIreloadKindเป็นหนึ่งในrestart,hotหรือnone(src/config/schema.ts) และสะท้อนตัววางแผนการโหลดการกำหนดค่า Gateway ซ้ำสำหรับพาธที่ขอ โหนดสคีมาการค้นหาจะเก็บเอกสารสำหรับผู้ใช้และฟิลด์การตรวจสอบทั่วไป (title,description,type,enum,const,format,pattern, ขอบเขตตัวเลข/สตริง/อาร์เรย์/ออบเจ็กต์,additionalProperties,deprecated,readOnly,writeOnly) ข้อมูลสรุปโหนดลูกจะแสดงkey,pathที่ปรับให้เป็นมาตรฐาน,type,required,hasChildren, ค่าreloadKindที่อาจมี พร้อมhint/hintPathที่ตรงกันupdate.runเรียกใช้ขั้นตอนการอัปเดต Gateway และกำหนดเวลารีสตาร์ตเฉพาะเมื่ออัปเดตสำเร็จ ผู้เรียกที่มีเซสชันสามารถรวมcontinuationMessageเพื่อให้การเริ่มต้นระบบดำเนินเทิร์นเอเจนต์ติดตามผลหนึ่งครั้งต่อผ่านคิวการดำเนินการต่อหลังรีสตาร์ต การอัปเดตผ่านตัวจัดการแพ็กเกจและการอัปเดต checkout ของ git ที่มีการกำกับดูแลจาก Control Plane ใช้การส่งมอบต่อไปยังบริการที่มีการจัดการแบบแยกออก แทนการแทนที่แผนผังแพ็กเกจหรือแก้ไข checkout/เอาต์พุตบิลด์ภายใน Gateway ที่ทำงานอยู่ การส่งมอบต่อที่เริ่มแล้วจะส่งคืนok: trueพร้อมresult.reason: "managed-service-handoff-started"และhandoff.status: "started"คำขอupdate.runพร้อมกันรายการที่สองซึ่งจัดการโดยกระบวนการ Gateway เดียวกันจะส่งคืนok: falseพร้อมresult.reason: "managed-service-handoff-already-running"และhandoff.status: "already-running"; ระบบจะไม่ยอมรับการดำเนินการต่อของคำขอนั้น ผู้เรียกจึงสามารถลองใหม่หลังการอัปเดตที่ทำงานอยู่เสร็จสมบูรณ์ ตัวอัปเดต CLI แบบสแตนด์อโลนและกระบวนการ Gateway ทดแทนอยู่นอกการป้องกันภายในกระบวนการนี้ การส่งมอบต่อที่ไม่พร้อมใช้งานหรือล้มเหลวจะส่งคืนok: falseพร้อมmanaged-service-handoff-unavailableหรือmanaged-service-handoff-failedรวมถึงhandoff.commandเมื่อต้องอัปเดตผ่านเชลล์ด้วยตนเอง คำว่าไม่พร้อมใช้งานหมายถึง OpenClaw ไม่มีขอบเขตผู้กำกับดูแลที่ปลอดภัยหรือข้อมูลประจำตัวของบริการแบบคงทน เช่นOPENCLAW_SYSTEMD_UNITสำหรับ systemd ระหว่างการส่งมอบต่อที่เริ่มแล้ว เซนทิเนลการรีสตาร์ตอาจรายงานstats.reason: "restart-health-pending"ชั่วครู่; การดำเนินการต่อจะล่าช้าจนกว่า CLI จะตรวจสอบ Gateway ที่รีสตาร์ตแล้วและเขียนเซนทิเนลokขั้นสุดท้ายupdate.statusรีเฟรชและส่งคืนเซนทิเนลการรีสตาร์ตเพื่ออัปเดตล่าสุด รวมถึงเวอร์ชันที่ทำงานหลังรีสตาร์ตเมื่อมีwizard.start,wizard.next,wizard.statusและwizard.cancelเปิดเผยตัวช่วยสร้างการเริ่มต้นใช้งานผ่าน WS RPC
ตัวช่วยสำหรับเอเจนต์และพื้นที่ทำงาน
agents.listส่งคืนรายการเอเจนต์ที่ Gateway มองเห็นได้ รวมถึงข้อมูลเมตาของโมเดล/รันไทม์ที่มีผลใช้งาน และkindเชิงความหมายที่เป็นตัวเลือก (agentหรือsystem) ไคลเอนต์ประกาศความสามารถในการจับมือagent-kindเพื่อรับรายชื่อแบบมีชนิดที่ครบถ้วน ส่วนไคลเอนต์ที่ไม่มีความสามารถนี้จะยังคงได้รับรายชื่อแบบเดิมที่ปลอดภัยสำหรับตัวเลือกโดยไม่มีแถวระบบ ไคลเอนต์ที่รับรู้ชนิดจะไม่นำแถวsystemไปแสดงในตัวเลือกทั่วไป แต่ยังคงเก็บไว้ในมุมมองการวินิจฉัย Gateway v4 รุ่นเก่าอาจส่งคืนแถวที่ไม่มีkindagents.create,agents.updateและagents.deleteจัดการระเบียนเอเจนต์และการเชื่อมโยงพื้นที่ทำงานagents.files.list,agents.files.getและagents.files.setจัดการไฟล์พื้นที่ทำงานบูตสแตรปที่เปิดให้เอเจนต์เข้าถึงaudit.activity.listส่งคืนบัญชีกิจกรรมที่มีการกำหนดเวอร์ชันและมีเฉพาะข้อมูลเมตา ส่วนaudit.listยังคงเป็น RPC สำหรับการรัน/เครื่องมือที่ปลอดภัยต่อความเข้ากันได้agents.workspace.listและagents.workspace.get(operator.read) เปิดให้ไคลเอนต์ในโดเมนผู้ดำเนินการที่เชื่อถือได้ซึ่งอธิบายไว้ใน ขอบเขตผู้ดำเนินการ เรียกดูไดเรกทอรีพื้นที่ทำงานของเอเจนต์แบบอ่านอย่างเดียวและแบ่งหน้าได้ คำขอรับเฉพาะพาธที่สัมพันธ์กับพื้นที่ทำงาน การอ่านจะถูกจำกัดให้อยู่ภายในรากพื้นที่ทำงานที่ผ่านการทำ realpath แล้ว (ปฏิเสธการหลบออกผ่าน symlink และ hardlink) จำกัดขนาด และจำกัดเฉพาะข้อความ UTF-8 รวมถึงชนิดรูปภาพทั่วไป (base64) การตอบกลับไม่เปิดเผยพาธพื้นที่ทำงานบนโฮสต์ เนมสเปซนี้ไม่มีการดำเนินการเขียนtasks.list,tasks.getและtasks.cancelเปิดบัญชีงานของ Gateway ให้ SDK และไคลเอนต์ผู้ดำเนินการเข้าถึง ดู RPC ของบัญชีงาน ด้านล่างartifacts.list,artifacts.getและartifacts.downloadเปิดให้เข้าถึงข้อมูลสรุปอาร์ติแฟกต์และการดาวน์โหลดที่ได้มาจากทรานสคริปต์ สำหรับขอบเขตsessionKey,runIdหรือtaskIdที่ระบุอย่างชัดเจน คำค้นหารันและงานจะระบุเซสชันเจ้าของที่ฝั่งเซิร์ฟเวอร์ และส่งคืนเฉพาะสื่อในทรานสคริปต์ที่มีแหล่งที่มาตรงกัน ส่วนแหล่งที่มา URL ที่ไม่ปลอดภัยหรือเป็น URL ภายในจะส่งคืนการดาวน์โหลดที่ไม่รองรับ แทนการดึงข้อมูลจากฝั่งเซิร์ฟเวอร์environments.listและenvironments.statusคงการค้นพบสภาพแวดล้อมภายใน Gateway และ Node ไว้ เวิร์กเกอร์คลาวด์ที่กำหนดค่าไว้และระเบียนถาวรที่โปรไฟล์ก่อนหน้าทิ้งไว้จะเพิ่มข้อมูลเมตาworkerพร้อมproviderId,leaseIdที่เป็นตัวเลือก,state,ageMs,idleMsที่เป็นตัวเลือก และattachedSessionIdsสถานะวงจรชีวิตของเวิร์กเกอร์ได้แก่requested,provisioning,bootstrapping,ready,attached,idle,draining,destroying,destroyed,failedและorphanedenvironments.create({ profileId, idempotencyKey }) จัดเตรียมเวิร์กเกอร์จากโปรไฟล์ผู้ให้บริการ Plugin ที่กำหนดค่าไว้ การลองใหม่ด้วยคีย์เดิมจะใช้การดำเนินการถาวรเดิมซ้ำenvironments.destroy({ environmentId }) ขอให้รื้อถอนสภาพแวดล้อมเวิร์กเกอร์แบบถาวรโดยทำซ้ำได้อย่างปลอดภัย ทั้งสองรายการต้องมีoperator.adminเป็นการเขียนบนระนาบควบคุม และส่งคืนข้อมูลสรุปสภาพแวดล้อมในรูปแบบเดียวกับที่การตอบกลับสถานะใช้agent.identity.getส่งคืนอัตลักษณ์ผู้ช่วยที่มีผลใช้งานสำหรับเอเจนต์หรือเซสชันagent.waitรอให้การรันเสร็จสิ้น และส่งคืนสแนปช็อตปลายทางเมื่อมี
การควบคุมเซสชัน
sessions.listส่งคืนดัชนีเซสชันปัจจุบัน รวมถึงข้อมูลเมตาagentRuntimeของแต่ละแถวเมื่อมีการกำหนดค่าแบ็กเอนด์รันไทม์ของเอเจนต์ เมื่อเปิดใช้การจัดวางบนเวิร์กเกอร์คลาวด์หรือมีสถานะการกู้คืนแบบถาวร แถวเซสชันจะรวมสถานะplacementแบบปิดด้วย (local,requested,provisioning,syncing,starting,active,draining,reconciling,reclaimedหรือfailed) พร้อมฟิลด์สภาพแวดล้อม ยุคของเจ้าของ พื้นที่ทำงาน บันเดิล เคอร์เซอร์ ACK หรือการกู้คืนที่เฉพาะเจาะจงตามสถานะsessions.subscribeและsessions.unsubscribeสลับการสมัครรับเหตุการณ์การเปลี่ยนแปลงเซสชันสำหรับไคลเอนต์ WS ปัจจุบันsessions.messages.subscribeและsessions.messages.unsubscribeสลับการสมัครรับเหตุการณ์ทรานสคริปต์/ข้อความสำหรับหนึ่งเซสชัน ส่งincludeApprovals: trueเพื่อรับเหตุการณ์วงจรชีวิตsession.approvalที่ผ่านการล้างข้อมูลแล้วเพิ่มเติม สำหรับการอนุมัติที่กลุ่มผู้รับซึ่งบันทึกไว้อย่างถาวรมีเซสชันนั้นตรงกันทุกประการ และการผูกผู้ตรวจสอบอนุญาตไคลเอนต์ที่สมัครรับ การตอบกลับการสมัครรับจะรวมapprovalReplayที่รอดำเนินการและมีขอบเขตจำกัด โดยถือเป็นข้อมูลหลักเมื่อtruncatedเป็น false การเลือกรับนี้มีผลต่อการเรียกสมัครรับแต่ละครั้งและไม่คงอยู่ การสมัครรับเซสชันเดิมอีกครั้งโดยไม่มีincludeApprovals: trueจะยกเลิกการสมัครรับการอนุมัติที่มีอยู่ นอกเหนือจากสิทธิ์อ่านเซสชันตามปกติแล้ว การเลือกรับนี้ต้องมีoperator.adminหรือoperator.approvalsบนอุปกรณ์ที่จับคู่แล้วsessions.previewส่งคืนตัวอย่างทรานสคริปต์ที่มีขอบเขตจำกัดสำหรับคีย์เซสชันที่ระบุsessions.describeส่งคืนหนึ่งแถวเซสชันของ Gateway สำหรับคีย์เซสชันที่ตรงกันทุกประการsessions.resolveระบุหรือทำให้เป้าหมายเซสชันอยู่ในรูปแบบมาตรฐานsessions.createสร้างรายการเซสชันใหม่ ค่าmodelและthinkingLevelที่เป็นตัวเลือกจะบันทึกการแทนที่โมเดลและการให้เหตุผลเริ่มต้นอย่างเป็นอะตอมworktree: trueจัดเตรียม worktree ที่มีการจัดการ ส่วนworktreeBaseRef/worktreeNameที่เป็นตัวเลือกใช้เลือก ref ฐานและชื่อสาขา และexecNode(operator.admin) ผูกการดำเนินการของเซสชันเข้ากับโฮสต์ Node worktree ที่สร้างขึ้นจะถูกส่งกลับในผลลัพธ์และบันทึกไว้ในแถวเซสชัน (worktree: { id, branch, repoRoot }) เมื่อสร้างรายการสำเร็จ แต่chat.sendเริ่มต้นที่ซ้อนอยู่ถูกปฏิเสธ ผลลัพธ์ที่สำเร็จจะรวมrunStarted: falseและrunErrorไคลเอนต์สามารถเก็บพรอมต์ไว้และลองใหม่กับคีย์เซสชันที่ส่งคืน ผู้เรียกที่ส่งparentSessionKeyพร้อมemitCommandHooks: trueควรประกาศการจัดการวงจรชีวิตของเซสชันลูกที่แยกต่างหากด้วย โดยsucceedsParent: trueจะสิ้นสุดเซสชันแม่ด้วยsession_endขณะที่falseจะคงเซสชันแม่ให้ทำงานต่อและปล่อยเฉพาะsession_startของเซสชันลูก การละsucceedsParentจะคงพฤติกรรมการเปลี่ยนผ่านเซสชันแม่แบบเดิมสำหรับไคลเอนต์ที่มีอยู่ การจัดการนี้ต้องมีทั้งการเชื่อมโยงกับเซสชันแม่และฮุกคำสั่ง fork ไม่สามารถทำให้เซสชันแม่สำเร็จได้ พฤติกรรมรีเซ็ตเซสชันหลักในตำแหน่งเดิมไม่เปลี่ยนแปลง เพราะไม่มีการสร้างเซสชันลูกที่แยกต่างหากsessions.dispatch(operator.admin) ย้ายเซสชัน OpenClaw ภายในที่มี worktree ซึ่งเซสชันเป็นเจ้าของและมีการจัดการ ไปยังโปรไฟล์เวิร์กเกอร์คลาวด์ที่กำหนดค่าไว้ ส่ง{ key, profileId, agentId? }เมธอดนี้จะไม่มีอยู่เมื่อไม่ได้กำหนดค่าโปรไฟล์เวิร์กเกอร์ ปิดการรับเทิร์นภายในก่อนระบายงานที่กำลังทำอยู่ และส่งคืนเมื่อการจัดวางไปถึงการเป็นเจ้าของโดยเวิร์กเกอร์activeเท่านั้น การส่งต่อเป็นทางเดียว RPC นี้ไม่รองรับการดึงกลับจากเวิร์กเกอร์มายังระบบภายในsessions.groups.list,sessions.groups.put,sessions.groups.renameและsessions.groups.deleteจัดการแค็ตตาล็อกกลุ่มเซสชันแบบกำหนดเองที่ Gateway เป็นเจ้าของ (ชื่อ + ลำดับการแสดงผล) การเป็นสมาชิกยังคงอยู่ในฟิลด์categoryของแต่ละเซสชัน การเปลี่ยนชื่อและการลบจะอัปเดตเซสชันสมาชิกที่ฝั่งเซิร์ฟเวอร์sessions.sendส่งข้อความเข้าไปในเซสชันที่มีอยู่sessions.steerเป็นรูปแบบขัดจังหวะและชี้นำสำหรับเซสชันที่กำลังทำงานsessions.abortยกเลิกงานที่กำลังทำอยู่ของเซสชัน ส่งkeyพร้อมrunIdที่เป็นตัวเลือก หรือส่งเฉพาะrunIdสำหรับการรันที่กำลังทำงานซึ่ง Gateway สามารถระบุเซสชันได้sessions.patchอัปเดตข้อมูลเมตา/การแทนที่ของเซสชัน และรายงานโมเดลมาตรฐานที่ระบุได้พร้อมagentRuntimeที่มีผลใช้งานsessions.reset,sessions.deleteและsessions.compactดำเนินการบำรุงรักษาเซสชันsessions.getส่งคืนแถวเซสชันที่จัดเก็บไว้ทั้งหมด- การดำเนินการแชตยังคงใช้
chat.history,chat.send,chat.abortและchat.injectโดยchat.historyจะถูกปรับให้เป็นรูปแบบมาตรฐานสำหรับการแสดงผลในไคลเอนต์ UI กล่าวคือ แท็กคำสั่งแบบอินไลน์จะถูกนำออกจากข้อความที่มองเห็นได้ เพย์โหลด 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.toolTitlesส่งคืนชื่อวัตถุประสงค์แบบสั้นสำหรับการเรียกเครื่องมือที่แสดงใน Control UI (ประมวลผลเป็นชุด สูงสุด 24 รายการพร้อมอินพุตที่มีขอบเขตจำกัด) ต้องเลือกรับฟีเจอร์นี้ผ่านgateway.controlUi.toolTitles(ปิดโดยค่าเริ่มต้น) Gateway ที่ปิดใช้งานจะตอบ{ titles: {}, disabled: true }โดยไม่เรียกโมเดล เพื่อให้ไคลเอนต์หยุดส่งคำขอ เมื่อเปิดใช้งาน ชื่อจะใช้การกำหนดเส้นทางโมเดลยูทิลิตีมาตรฐาน ได้แก่utilityModelที่กำหนดค่าไว้อย่างชัดเจน (การตัดสินใจของผู้ดำเนินการซึ่งอาจส่งเนื้อหางานที่มีขอบเขตจำกัดไปยังผู้ให้บริการที่เลือก เช่นเดียวกับงานยูทิลิตีทั้งหมด) หรือค่าเริ่มต้นของโมเดลขนาดเล็กที่ผู้ให้บริการของเซสชันประกาศไว้ เพื่อไม่ให้มีปลายทางขาออกใหม่เกิดขึ้นโดยปริยาย ส่วนutilityModelที่ว่างเปล่าจะปิดใช้งานทั้งหมด ชื่อจะไม่ย้อนกลับไปใช้โมเดลหลัก ผลลัพธ์จะถูกแคชในฐานข้อมูลสถานะต่อเอเจนต์โดยใช้ชื่อเครื่องมือ + อินพุตเป็นคีย์ ดังนั้นการดูซ้ำจะไม่เรียกเก็บเงินซ้ำสำหรับการเรียกเดิมchat.sendรับfastMode: "auto"แบบหนึ่งเทิร์นเพื่อใช้โหมดเร็วสำหรับการเรียกโมเดลที่เริ่มก่อนถึงจุดตัดอัตโนมัติ จากนั้นเริ่มการลองใหม่ การย้อนกลับ ผลลัพธ์เครื่องมือ หรือการเรียกต่อเนื่องในภายหลังโดยไม่ใช้โหมดเร็ว จุดตัดมีค่าเริ่มต้นเป็น 60 วินาที (DEFAULT_FAST_MODE_AUTO_ON_SECONDS) และกำหนดค่าต่อโมเดลได้ด้วยagents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondsผู้เรียกchat.sendสามารถส่งfastAutoOnSecondsแบบหนึ่งเทิร์นเพื่อแทนที่จุดตัดสำหรับคำขอนั้น ส่งqueueMode(steer,followup,collectหรือinterrupt) เพื่อแทนที่โหมดคิวที่จัดเก็บไว้เฉพาะสำหรับคำขอนี้ การดำเนินการชี้นำอย่างชัดเจนใน Control UI ใช้queueMode: "steer"
การจับคู่อุปกรณ์และโทเค็นอุปกรณ์
device.pair.listส่งคืนอุปกรณ์ที่จับคู่แล้วซึ่งอยู่ระหว่างรอและได้รับอนุมัติdevice.pair.setupCodeสร้างรหัสตั้งค่าสำหรับอุปกรณ์เคลื่อนที่ และสร้าง URL ข้อมูล QR แบบ PNG โดยค่าเริ่มต้น รายการนี้ต้องมีoperator.adminและจงใจไม่รวมไว้ในการค้นพบที่ประกาศ ผลลัพธ์ประกอบด้วยsetupCode,qrDataUrlที่เป็นตัวเลือก,gatewayUrl, ป้ายกำกับauthที่ไม่ใช่ความลับ และurlSourcedevice.pair.approve,device.pair.rejectและdevice.pair.removeจัดการระเบียนการจับคู่อุปกรณ์device.pair.renameกำหนดป้ายกำกับผู้ดำเนินการ ({ deviceId, label }) ซึ่งมีลำดับความสำคัญเหนือชื่อที่แสดงซึ่งไคลเอนต์รายงาน และยังคงอยู่หลังการซ่อมแซมหรืออนุมัติอุปกรณ์ใหม่device.token.rotateหมุนเวียนโทเค็นของอุปกรณ์ที่จับคู่แล้ว ภายในขอบเขตบทบาทที่ได้รับอนุมัติและขอบเขตของผู้เรียกdevice.token.revokeเพิกถอนโทเค็นของอุปกรณ์ที่จับคู่แล้ว ภายในขอบเขตบทบาทที่ได้รับอนุมัติและขอบเขตของผู้เรียก
รหัสตั้งค่าฝังข้อมูลรับรองบูตสแตรปที่มีอายุสั้น ไคลเอนต์ต้องไม่ บันทึกลงล็อกหรือเก็บข้อมูลนี้ไว้นอกเหนือจากขั้นตอนการจับคู่
การจับคู่ Node การเรียกใช้ และงานที่รอดำเนินการ
node.pair.list,node.pair.approve,node.pair.rejectและnode.pair.removeครอบคลุมการอนุมัติความสามารถของ Node ส่วนnode.pair.requestและnode.pair.verifyถูกนำออกใน 2026.7 พร้อมกับที่เก็บข้อมูลการจับคู่ Node แบบสแตนด์อโลน โดย Gateway จะสร้างคำขอที่รอดำเนินการระหว่างที่ Node เชื่อมต่อnode.listและnode.describeส่งคืนสถานะของ Node ที่รู้จัก/เชื่อมต่ออยู่node.renameอัปเดตป้ายกำกับของ Node ที่จับคู่แล้วnode.invokeส่งต่อคำสั่งไปยัง Node ที่เชื่อมต่ออยู่node.invoke.resultส่งคืนผลลัพธ์ของคำขอเรียกใช้mcp.tools.call.v1คือคำสั่งโฮสต์ Node แบบไม่มีส่วนติดต่อผู้ใช้สำหรับเรียกเครื่องมือ MCP ภายใน Node ที่กำหนดค่าไว้ คำสั่งนี้ส่งผ่านnode.invokeกำหนดให้ Node ต้องประกาศคำสั่งดังกล่าว และยังคงอยู่ภายใต้การอนุมัติการจับคู่และgateway.nodes.denyCommandsnode.eventนำเหตุการณ์ที่เริ่มต้นจาก Node กลับเข้าสู่ Gatewaynode.pluginTools.updateเป็นเส้นทางเผยแพร่เพียงเส้นทางเดียวสำหรับแทนที่ตัวอธิบายเครื่องมือ Plugin/MCP ที่เอเจนต์มองเห็นของ Node ที่เชื่อมต่ออยู่ โดยพารามิเตอร์connectไม่ได้ส่งข้อมูลเหล่านี้node.pending.pullและnode.pending.ackคือ API คิวของ Node ที่เชื่อมต่ออยู่node.pending.enqueueและnode.pending.drainจัดการงานที่รอดำเนินการแบบคงทนสำหรับ Node ที่ออฟไลน์/ตัดการเชื่อมต่อ
กลุ่มการอนุมัติ
approval.historyส่งคืนการอนุมัติขั้นสุดท้ายตามลำดับใหม่สุดก่อน ซึ่งเก็บรักษาไว้ 30 วันสำหรับคำขอ exec, Plugin และเอเจนต์ระบบ (ขอบเขตoperator.approvals) รองรับการแบ่งหน้าด้วยเคอร์เซอร์และตัวกรองชนิดที่เลือกใช้ได้ ส่วนการอนุมัติที่รอดำเนินการไม่ใช่แถวประวัติapproval.getและapproval.resolveคือเมธอดการอนุมัติแบบคงทนที่ไม่ขึ้นกับชนิด (ขอบเขตoperator.approvals) ส่วนapproval.getส่งคืนภาพฉายที่ผ่านการล้างข้อมูลแล้วของสถานะที่รอดำเนินการหรือขั้นสุดท้ายที่เก็บรักษาไว้ พร้อมurlPathที่เสถียร และapproval.resolveรับรหัสการอนุมัติมาตรฐาน,kindที่ระบุอย่างชัดเจน และผลการตัดสิน จากนั้นใช้การแก้ข้อขัดแย้งแบบคำตอบแรกมีผล และส่งคืนผลลัพธ์มาตรฐานที่บันทึกไว้เสมอexec.approval.request,exec.approval.get,exec.approval.listและexec.approval.resolveครอบคลุมคำขออนุมัติ exec แบบครั้งเดียว รวมถึงการค้นหา/เล่นซ้ำการอนุมัติที่รอดำเนินการ โดยเป็นอะแดปเตอร์ที่ขอบเขตโปรโตคอลบนรีจิสทรีการอนุมัติแบบคงทนเดียวกันexec.approval.waitDecisionรอการอนุมัติ exec ที่รอดำเนินการหนึ่งรายการและส่งคืนผลการตัดสินสุดท้าย (หรือnullเมื่อหมดเวลา)exec.approvals.getและexec.approvals.setจัดการสแนปช็อตนโยบายการอนุมัติ exec ของ Gatewayexec.approvals.node.getและexec.approvals.node.setจัดการนโยบายการอนุมัติ exec ภายใน Node ผ่านคำสั่งรีเลย์ของ Nodeplugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionและplugin.approval.resolveครอบคลุมโฟลว์การอนุมัติที่ Plugin กำหนด
คำสั่ง Control UI
ui.commandช่วยให้ผู้เรียกoperator.writeส่งคำสั่งเค้าโครงและการนำทางแบบระบุชนิดไปยังไคลเอนต์ Control UI ที่เชื่อมต่ออยู่และประกาศความสามารถui-commands- คำสั่งครอบคลุมการแบ่ง/ปิด/โฟกัสบานหน้าต่าง การแสดงแถบด้านข้าง การแสดงและตำแหน่งการเทียบของแผงเทอร์มินัล/เบราว์เซอร์ และการนำทางเซสชัน
- โปรโตคอล v1 กระจายคำสั่งไปยัง Control UI ที่เชื่อมต่ออยู่และมีความสามารถทุกรายการโดยตั้งใจ หากไม่มีรายการใดเชื่อมต่ออยู่ คำขอจะล้มเหลวด้วย
UNAVAILABLEแทนการทำเสมือนว่าเค้าโครงเปลี่ยนแปลงแล้ว
ระบบอัตโนมัติ Skills และเครื่องมือ
- ระบบอัตโนมัติ:
wakeกำหนดเวลาแทรกข้อความปลุกทันทีหรือใน Heartbeat ถัดไป ส่วนcron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsจัดการงานตามกำหนดเวลา cron.runยังคงเป็น RPC แบบนำเข้าคิวสำหรับการเรียกใช้ด้วยตนเอง ไคลเอนต์ที่ต้องการความหมายเชิงการเสร็จสิ้นควรอ่านrunIdที่ส่งคืนและสำรวจcron.runscron.runsรับตัวกรองrunIdแบบไม่ว่างที่เลือกใช้ได้ เพื่อให้ไคลเอนต์ติดตามการเรียกใช้ด้วยตนเองหนึ่งรายการในคิวได้โดยไม่เกิดภาวะแข่งขันกับรายการประวัติอื่นของงานเดียวกัน- Skills และเครื่องมือ:
commands.list,skills.*,tools.catalog,tools.effective,tools.invokeดู เมธอดตัวช่วยสำหรับผู้ปฏิบัติงาน ด้านล่าง
กลุ่มเหตุการณ์ทั่วไป
chat: การอัปเดตแชตใน UI เช่นchat.injectและเหตุการณ์แชตอื่น ที่มีเฉพาะในทรานสคริปต์ ในโปรโตคอล v4 เพย์โหลดเดลตาจะมีdeltaTextส่วนmessageยังคงเป็น สแนปช็อตสะสมของผู้ช่วย การแทนที่ที่ไม่ใช่คำนำหน้าจะตั้งค่าreplace=trueและใช้deltaTextเป็นข้อความแทนที่session.message,session.operation,session.tool: การอัปเดตทรานสคริปต์ การดำเนินการเซสชัน ที่กำลังทำงาน และสตรีมเหตุการณ์สำหรับเซสชันที่สมัครรับข้อมูลsession.approval: ข้อมูลจริงของการอนุมัติที่รอดำเนินการและขั้นสุดท้ายซึ่งผ่านการล้างข้อมูลแล้ว สำหรับผู้สมัครรับข้อมูล เซสชันที่ตรงกันทุกประการและเลือกรับอย่างชัดเจน การอนุมัติของรายการลูกใช้กลุ่มผู้รับของบรรพบุรุษ ที่บันทึกไว้อย่างคงทน เหตุการณ์จะไม่เปลี่ยนทรานสคริปต์หรือปลุกเอเจนต์sessions.changed: ดัชนีหรือข้อมูลเมตาของเซสชันเปลี่ยนแปลงpresence: การอัปเดตสแนปช็อตสถานะการปรากฏของระบบtick: เหตุการณ์ตรวจสอบการเชื่อมต่อ/ความพร้อมใช้งานตามรอบhealth: การอัปเดตสแนปช็อตสถานภาพของ Gatewayheartbeat: การอัปเดตสตรีมเหตุการณ์ Heartbeatcron: เหตุการณ์การเปลี่ยนแปลงการเรียกใช้/งาน Cronshutdown: การแจ้งเตือนการปิดระบบ Gatewaynode.pair.requested/node.pair.resolved: วงจรชีวิตการจับคู่ Nodenode.invoke.request: การกระจายคำขอเรียกใช้ Nodedevice.pair.requested/device.pair.resolved: วงจรชีวิตอุปกรณ์ที่จับคู่แล้วvoicewake.changed: การกำหนดค่าทริกเกอร์คำปลุกเปลี่ยนแปลงconfig.changed: การเขียนการกำหนดค่าถูกบันทึกอย่างคงทน (เพย์โหลดมีพาธการกำหนดค่า แฮชสแนปช็อตใหม่ และการประทับเวลา — ไม่มีเนื้อหาการกำหนดค่าโดยเด็ดขาด) มีขอบเขตสำหรับการอ่านโดยผู้ปฏิบัติงาน ไคลเอนต์รีเฟรชผ่านconfig.getexec.approval.requested/exec.approval.resolved: วงจรชีวิต การอนุมัติ execplugin.approval.requested/plugin.approval.resolved: วงจรชีวิต การอนุมัติ Plugin
เมธอดตัวช่วยของ Node
Node สามารถเรียก skills.bins เพื่อดึงรายการไฟล์ปฏิบัติการของ Skills ปัจจุบัน
สำหรับการตรวจสอบการอนุญาตอัตโนมัติ
RPC บัญชีแยกประเภทการตรวจสอบ
audit.activity.list มอบมุมมองที่เสถียรตามลำดับใหม่สุดก่อนแก่ไคลเอนต์ผู้ปฏิบัติงาน สำหรับข้อมูลเมตาวงจรชีวิต
ของการเรียกใช้เอเจนต์ การดำเนินการของเครื่องมือ และข้อความที่เลือกรับ โดยต้องมี
operator.read คิวรีจะไม่รวมระเบียนที่เก่ากว่า 30 วัน และบัญชีแยกประเภท SQLite ที่ใช้ร่วมกัน
จำกัดไว้ที่ 100,000 ระเบียน แถวที่หมดอายุจะถูกลบระหว่างการเริ่มต้น
Gateway การบำรุงรักษารายชั่วโมง และการเขียนครั้งต่อ ๆ ไป ดูโมเดลข้อมูลและความหมายด้านความเป็นส่วนตัวได้ที่
ประวัติการตรวจสอบ
- พารามิเตอร์:
agentId,sessionKeyหรือrunIdที่ตรงกันทุกประการและเลือกใช้ได้;kindที่เลือกใช้ได้ ("agent_run","tool_action"หรือ"message");statusที่เลือกใช้ได้ ("started","succeeded","failed","cancelled","timed_out","blocked"หรือ"unknown");directionของข้อความที่เลือกใช้ได้ ("inbound"หรือ"outbound") และchannelที่ตรงกันทุกประการ; ขอบเขตมิลลิวินาที Unix แบบรวมค่าขอบafter/beforeที่เลือกใช้ได้;limitตั้งแต่1ถึง500ที่เลือกใช้ได้; และสตริงcursorจากหน้าก่อนหน้าที่เลือกใช้ได้ - ผลลัพธ์:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }
ยูเนียนผลลัพธ์ V1 ที่มีชื่อประกอบด้วยสคีมาแยกกันสำหรับการเรียกใช้เอเจนต์ การดำเนินการของเครื่องมือ ข้อความขาเข้า
และข้อความขาออก ตัวจำแนก eventType คือ
agent_run, tool_action, inbound_message หรือ outbound_message ตามลำดับ ส่วน kind และ
direction ของข้อความยังคงใช้สำหรับการกรองและแสดงผลได้ ทุกเหตุการณ์มี
schemaVersion: 1 ซึ่งเป็นจำนวนเต็ม การอ้างอิงข้อมูลประจำตัวของข้อความใช้รูปแบบ
hmac-sha256:v1:<32 hex key id>:<64 hex digest> ที่ตรงกันทุกประการ รหัสแอ็กเตอร์ของผู้ส่งผ่านช่องทาง
ใช้รูปแบบเดียวกัน
ตัวแปรทั้งหมดกำหนดให้มี eventType, schemaVersion, eventId, sequence,
sourceSequence, occurredAt, kind, action, status, actor และ
redaction ฟิลด์ของตัวแปรมีดังนี้:
eventType |
ฟิลด์ที่จำเป็น | ฟิลด์ที่เลือกใช้ได้ |
|---|---|---|
agent_run |
agentId, runId; kind: "agent_run" |
sessionKey, sessionId, errorCode |
tool_action |
agentId, runId; kind: "tool_action" |
sessionKey, sessionId, toolCallId, toolName, errorCode |
inbound_message |
direction: "inbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, การอ้างอิงข้อมูลประจำตัว, reasonCode, errorCode |
outbound_message |
direction: "outbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, การอ้างอิงข้อมูลประจำตัว, reasonCode, deliveryKind, failureStage, errorCode |
enum แบบปิดของข้อความมีดังนี้:
conversationKind:direct,group,channelหรือunknownoutcomeขาเข้า:completed,skippedหรือfailed;reasonCodeที่เลือกใช้ได้:duplicate,reply_operation_active,reply_operation_aborted,fast_abort,plugin_bound_handled,plugin_bound_unavailable,plugin_bound_declined,plugin_bound_error,before_dispatch_handled,acp_dispatch_completed,acp_dispatch_failed,acp_dispatch_emptyหรือacp_dispatch_abortedoutcomeขาออก:sent,suppressed,failedหรือunknown;reasonCodeที่เลือกใช้ได้:cancelled_by_message_sending_hook,cancelled_by_reply_payload_sending_hook,empty_after_message_sending_hook,empty_after_reply_payload_sending_hookหรือno_visible_payloadอะแดปเตอร์ที่ไม่ส่งคืนข้อมูลประจำตัวของแพลตฟอร์มจะเป็นunknownเนื่องจากไม่สามารถหักล้างได้ว่าผลข้างเคียงภายนอกไม่ได้เกิดขึ้นdeliveryKind:text,mediaหรือother;failureStage:platform_send,queueหรือunknown
ฟิลด์ขั้นสุดท้ายมีความสัมพันธ์กัน ไม่ได้เป็นฟิลด์ที่เลือกใช้ได้อย่างเป็นอิสระ:
| ตัวแปร | การแมปสถานะสิ้นสุด |
|---|---|
| การเรียกใช้เอเจนต์ | started ไม่มี errorCode; สถานะสิ้นสุดที่ไม่สำเร็จแต่ละสถานะต้องมีรหัส run_* ที่ตรงกัน |
| การดำเนินการของเครื่องมือ | started และสถานะสำเร็จไม่มี errorCode; สถานะสิ้นสุดอื่นแต่ละสถานะต้องมีรหัส tool_* ที่ตรงกัน |
| ข้อความขาเข้า | สำเร็จ = completed; ถูกบล็อก = skipped; ล้มเหลว = failed ร่วมกับ message_processing_failed เมื่อมี reasonCode ค่านี้ต้องอยู่ในตระกูลสถานะสิ้นสุดดังกล่าว |
| ข้อความขาออก | สำเร็จ = sent; ถูกบล็อก = suppressed ร่วมกับ reasonCode; ล้มเหลว = failed ร่วมกับ errorCode และ failureStage; ไม่ทราบ = unknown ร่วมกับ failureStage |
เหตุการณ์กิจกรรมแต่ละรายการประกอบด้วยรหัสเหตุการณ์ที่คงที่ ลำดับบัญชีแยกประเภทที่เพิ่มขึ้นแบบทางเดียว
ลำดับเหตุการณ์ต้นทาง การประทับเวลา ผู้ดำเนินการ การดำเนินการ สถานะ ค่า
schemaVersion: 1 ซึ่งเป็นจำนวนเต็ม และ redaction: "metadata_only" ระเบียนการเรียกใช้และเครื่องมือ
ต้องมีข้อมูลที่มาของเอเจนต์และการเรียกใช้ และอาจมีข้อมูลที่มาของเซสชัน ระเบียนข้อความ
อาจมีรหัสเอเจนต์และรหัสการเรียกใช้ แต่ตั้งใจไม่รวม
sessionKey หรือ sessionId; ดังนั้นตัวกรองการสืบค้น sessionKey จึงใช้กับ
แถวการเรียกใช้และเครื่องมือเท่านั้น เหตุการณ์เครื่องมืออาจมีรหัสการเรียกเครื่องมือและชื่อเครื่องมือ
ระเบียนข้อความใช้ message.inbound.processed หรือ
message.outbound.finished และเพิ่มทิศทาง ช่องทาง ประเภทการสนทนา
ผลลัพธ์ที่ปรับให้อยู่ในรูปแบบมาตรฐาน ตลอดจนประเภทการส่ง ขั้นตอนที่ล้มเหลว ระยะเวลา
จำนวนผลลัพธ์ รหัสเหตุผล และนามแฝงบัญชี/การสนทนา/ข้อความ/เป้าหมาย
ที่ใช้คีย์ภายในแต่ละการติดตั้งซึ่งเป็นข้อมูลเสริม นามแฝงเหล่านี้ช่วย
เชื่อมโยงข้อมูลแต่ไม่ใช่การทำให้เป็นนิรนาม เนื่องจากฐานข้อมูลสถานะมีคีย์ของนามแฝง
แต่ข้อมูลส่งออกจาก RPC และ CLI ไม่มีคีย์ดังกล่าว บัญชีแยกประเภทไม่จัดเก็บพรอมต์ เนื้อหา
ข้อความ อาร์กิวเมนต์เครื่องมือ ผลลัพธ์เครื่องมือ เอาต์พุตคำสั่ง หรือข้อความข้อผิดพลาดดิบ
ค่า sessionKey ของการเรียกใช้/เครื่องมือยังคงเป็นเมทาดาทาดิบสำหรับการเชื่อมโยงและอาจฝัง
รหัสบัญชีหรือรหัสเพียร์ของแพลตฟอร์ม ส่วนระเบียนข้อความจะไม่รวมคีย์เซสชัน
สำหรับแถวขาเข้า durationMs วัดระยะเวลาตั้งแต่การส่งต่อในแกนหลักจนถึงสถานะสิ้นสุด และ
resultCount นับเพย์โหลดเครื่องมือ การบล็อก และการตอบกลับที่จัดคิวไว้และดำเนินการเสร็จสมบูรณ์ สำหรับ
แถวขาออก durationMs ครอบคลุมระยะเวลาตั้งแต่การรับผิดชอบการส่งจนถึงการตอบรับ
จดหมายตาย หรือการกระทบยอด (รวมเวลารอในคิว) และ resultCount
นับการส่งจริงบนแพลตฟอร์มที่ระบุได้ เมื่อมี deliveryKind
ค่านี้จะอธิบายเพย์โหลดที่มีผลหลังผ่านฮุกและการเรนเดอร์ ส่วนแถวที่ถูกระงับหรือ
มีความกำกวมจากการหยุดทำงานจะไม่รวมค่านี้
ปัจจุบันความครอบคลุมของข้อความรวมข้อความขาเข้าที่ได้รับการยอมรับและไปถึงการส่งต่อ
ในแกนหลัก รวมถึงผลลัพธ์รายการซ้ำ/สถานะสิ้นสุดของแกนหลัก ความครอบคลุมขาออกจะเขียน
แถวสถานะสิ้นสุดหนึ่งแถวต่อเพย์โหลดตอบกลับเชิงตรรกะต้นฉบับที่ไปถึงการส่งแบบถาวรร่วมกัน
โดยรวมการแบ่งส่วนและการกระจายของอะแดปเตอร์ไว้ใน resultCount การส่งที่จัดคิวไว้
ซึ่งลองใหม่ได้หรือมีความกำกวมจะถูกบันทึกหลังได้รับการตอบรับ เข้าสู่จดหมายตาย
หรือผ่านการกระทบยอดแล้วเท่านั้น เส้นทางเฉพาะของ Plugin และเส้นทางส่งโดยตรงที่ข้าม
ขอบเขตร่วมเหล่านั้นยังไม่ครอบคลุม คิวเวิร์กเกอร์แบบจำกัดขนาดทำงานแบบพยายามให้ดีที่สุด
และอาจทิ้งระเบียนเมื่อเกิดความล้มเหลวหรือถึงขีดจำกัด ดังนั้นส่วนนี้จึงไม่ใช่
คลังข้อมูลการปฏิบัติตามข้อกำหนดแบบไม่สูญหาย
การบันทึกเปิดใช้งานโดยค่าเริ่มต้นและควบคุมด้วย
audit.enabled การบันทึกข้อความควบคุม
แยกต่างหากด้วย audit.messages และมีค่าเริ่มต้นเป็น "off" เมื่อ
ปิดใช้งานการบันทึก audit.activity.list จะยังคงให้บริการระเบียนที่เขียนไว้
ก่อนหน้านี้จนกว่าจะหมดอายุ
สคีมาคำขอ ผลลัพธ์ และ AuditEvent ของ audit.list ที่เผยแพร่แล้ว
ยังคงไม่เปลี่ยนแปลงและส่งคืนเฉพาะระเบียนการเรียกใช้เอเจนต์และการดำเนินการของเครื่องมือ ไคลเอนต์
ผู้ดำเนินการใหม่ควรเรียก audit.activity.list เมื่อ Gateway ประกาศว่ารองรับ เมื่อตอบ
คำขอที่มีขอบเขตการอ่าน Gateway รุ่นเก่าอาจรายงาน unknown method: audit.activity.list หรือ
missing scope: operator.admin เนื่องจากในเวอร์ชันที่เผยแพร่แล้ว การอนุญาตเกิดขึ้นก่อนการค้นหาเมธอด ให้ถือว่ากรณีหลังหมายถึงไม่มีเมธอด
เฉพาะเมื่อไม่ได้มีการประกาศเมธอดดังกล่าว จากนั้นไคลเอนต์อาจลอง audit.list อีกครั้ง
ได้เฉพาะเมื่อตัวกรองไม่ต้องการรองรับประเภทข้อความ ทิศทาง หรือช่องทาง
ใช้ openclaw audit สำหรับการสืบค้นข้อความและการส่งออก JSON แบบจำกัดขนาด
RPC ของบัญชีแยกประเภทงาน
ไคลเอนต์ผู้ดำเนินการตรวจสอบและยกเลิกระเบียนงานเบื้องหลังของ Gateway ผ่าน
RPC ของบัญชีแยกประเภทงาน (packages/gateway-protocol/src/schema/tasks.ts) 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 } - รหัสงานที่ไม่มีอยู่จะส่งคืนข้อผิดพลาดรูปแบบไม่พบของ 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, การประทับเวลา ความคืบหน้า
สรุปสถานะสิ้นสุด และข้อความข้อผิดพลาดที่ผ่านการล้างข้อมูลแล้ว agentId ระบุเอเจนต์
ที่ดำเนินงาน ส่วน sessionKey และ ownerKey จะเก็บรักษาบริบทของผู้ร้องขอและการควบคุม
เมธอดตัวช่วยสำหรับผู้ดำเนินการ
commands.list(operator.read) ดึงรายการคำสั่งรันไทม์สำหรับ เอเจนต์agentIdเป็นตัวเลือกเสริม หากละไว้ ระบบจะอ่านพื้นที่ทำงานเริ่มต้นของเอเจนต์scopeควบคุมว่าพื้นผิวใดเป็นเป้าหมายของnameหลัก:textจะส่งคืน โทเค็นคำสั่งข้อความหลักโดยไม่มี/นำหน้า ส่วนnativeและเส้นทางbothเริ่มต้นจะส่งคืนชื่อเนทีฟที่รับรู้ผู้ให้บริการเมื่อมีtextAliasesมีนามแฝงแบบสแลชที่ตรงกันทุกประการ เช่น/modelและ/mnativeNameมีชื่อคำสั่งเนทีฟที่รับรู้ผู้ให้บริการเมื่อมี ชื่อดังกล่าว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ที่มีชนิดกำกับ การปฏิเสธจากการอนุมัติหรือนโยบายจะส่งคืนok:falseในเพย์โหลด แทนที่จะข้ามไปป์ไลน์นโยบายเครื่องมือของ Gateway
- จำเป็นต้องระบุ
skills.status(operator.read) ดึงรายการ Skills ที่มองเห็นได้สำหรับ เอเจนต์agentIdเป็นตัวเลือกเสริม หากละไว้ ระบบจะอ่านพื้นที่ทำงานเริ่มต้นของเอเจนต์- การตอบกลับประกอบด้วยคุณสมบัติที่เข้าเกณฑ์ ข้อกำหนดที่ขาดหาย การตรวจสอบการกำหนดค่า และตัวเลือกการติดตั้งที่ผ่านการล้างข้อมูล โดยไม่เปิดเผยค่าความลับดิบ
skills.searchและskills.detail(operator.read) ส่งคืนข้อมูลเมตา การค้นพบของ ClawHubskills.upload.begin,skills.upload.chunkและskills.upload.commit(operator.admin) จัดเตรียมไฟล์เก็บถาวร Skills ส่วนตัวก่อนติดตั้ง นี่คือ เส้นทางอัปโหลดสำหรับผู้ดูแลระบบที่แยกต่างหากสำหรับไคลเอนต์ที่เชื่อถือได้ ไม่ใช่ขั้นตอนการติดตั้ง Skills ของ ClawHub ตามปกติ และจะปิดใช้งานโดยค่าเริ่มต้น เว้นแต่จะเปิดใช้skills.install.allowUploadedArchivesskills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })จะสร้างการอัปโหลดที่ผูกกับ slug และค่าบังคับดังกล่าวskills.upload.chunk({ uploadId, offset, dataBase64 })จะผนวกไบต์ ณ ออฟเซ็ตที่ถอดรหัสแล้วอย่างตรงกันทุกประการskills.upload.commit({ uploadId, sha256? })จะตรวจสอบขนาดสุดท้ายและ SHA-256 การคอมมิตเพียงทำให้การอัปโหลดเสร็จสมบูรณ์เท่านั้น ไม่ได้ติดตั้ง Skills- ไฟล์เก็บถาวร Skills ที่อัปโหลดเป็นไฟล์ zip ซึ่งมีราก
SKILL.mdชื่อไดเรกทอรี ภายในไฟล์เก็บถาวรจะไม่ใช้เลือกเป้าหมายการติดตั้ง
skills.install(operator.admin) มีสามโหมด:- โหมด ClawHub:
{ source: "clawhub", slug, version?, force? }จะติดตั้ง โฟลเดอร์ Skills ลงในไดเรกทอรีskills/ของพื้นที่ทำงานเริ่มต้นของเอเจนต์ - โหมดอัปโหลด:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }จะติดตั้งการอัปโหลดที่คอมมิตแล้วลงในไดเรกทอรีskills/<slug>ของพื้นที่ทำงานเริ่มต้นของเอเจนต์ slug และค่าบังคับต้องตรงกับคำขอ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
มุมมอง models.list
models.list ยอมรับพารามิเตอร์ view ซึ่งเป็นตัวเลือกเสริม
(src/agents/model-catalog-visibility.ts):
- ละไว้หรือ
"default": หากกำหนดค่าagents.defaults.modelPolicy.allowไว้ การตอบกลับจะเป็นแค็ตตาล็อกที่อนุญาต ซึ่งรวมถึงโมเดลที่ค้นพบแบบไดนามิก สำหรับรายการprovider/*มิฉะนั้น การตอบกลับจะเป็นแค็ตตาล็อก Gateway ทั้งหมด "configured": ลักษณะการทำงานขนาดพอดีกับตัวเลือก หากกำหนดค่าagents.defaults.modelPolicy.allowไว้ ค่านี้ยังคงมีผลเหนือกว่า รวมถึงการค้นพบที่จำกัดขอบเขตตามผู้ให้บริการสำหรับ รายการprovider/*หากไม่มีรายการอนุญาต การตอบกลับจะใช้รายการmodels.providers.<provider>.modelsที่ระบุไว้อย่างชัดเจน และจะย้อนกลับไปใช้แค็ตตาล็อกทั้งหมด เฉพาะเมื่อไม่มีแถวโมเดลที่กำหนดค่าไว้"provider-config": รายการmodels.providers.*.modelsที่กำหนดโดยแหล่งที่มา และเป็นอิสระจากรายการอนุญาตของตัวเลือก แถวต่าง ๆ ประกอบด้วยความสามารถสาธารณะของโมเดลและ ความพร้อมใช้งานที่รับรู้เส้นทาง แต่ไม่รวมเอนด์พอยต์ของผู้ให้บริการ ข้อมูลการยืนยันตัวตน และ การกำหนดค่าคำขอรันไทม์"all": แค็ตตาล็อก Gateway ทั้งหมด โดยข้ามagents.defaults.modelPolicy.allowใช้สำหรับ UI การวินิจฉัย/การค้นพบ ไม่ใช่ตัวเลือกโมเดลตามปกติ
การอนุมัติการดำเนินการ
- เมื่อคำขอดำเนินการต้องได้รับการอนุมัติ Gateway จะกระจาย
exec.approval.requested - ไคลเอนต์ของผู้ปฏิบัติงานจะแก้ไขโดยเรียก
exec.approval.resolve(ต้องมีoperator.approvals) - สำหรับ
host=nodeนั้นexec.approval.requestต้องมีsystemRunPlan(ข้อมูลเมตาargv/cwd/rawCommand/เซสชันแบบมาตรฐาน) คำขอที่ไม่มีsystemRunPlanจะถูกปฏิเสธ - หลังจากอนุมัติแล้ว การเรียก
node.invoke system.runที่ส่งต่อจะนำsystemRunPlanแบบมาตรฐานนั้นกลับมาใช้เป็นบริบทคำสั่ง/cwd/เซสชันที่เชื่อถือได้ - หากผู้เรียกแก้ไข
command,rawCommand,cwd,agentIdหรือsessionKeyระหว่างการเตรียมกับการส่งต่อsystem.runขั้นสุดท้ายที่ได้รับอนุมัติ Gateway จะปฏิเสธการเรียกใช้แทนที่จะเชื่อถือเพย์โหลดที่ถูกแก้ไข
การย้อนกลับของการส่งมอบจากเอเจนต์
- คำขอ
agentสามารถระบุdeliver=trueเพื่อขอการส่งมอบขาออก bestEffortDeliver=false(ค่าเริ่มต้น) จะคงลักษณะการทำงานที่เข้มงวดไว้: เป้าหมายการส่งมอบ ที่แก้ค่าไม่ได้หรือใช้ภายในเท่านั้นจะส่งคืนINVALID_REQUESTbestEffortDeliver=trueอนุญาตให้ย้อนกลับไปดำเนินการเฉพาะในเซสชันเมื่อไม่สามารถ แก้หาเส้นทางที่ส่งมอบไปภายนอกได้ (เช่น เซสชันภายใน/เว็บแชต หรือการกำหนดค่าหลายช่องทางที่กำกวม)- ผลลัพธ์
agentขั้นสุดท้ายอาจมีresult.deliveryStatusเมื่อมีการร้องขอ การส่งมอบ โดยใช้สถานะsent,suppressed,partial_failedและfailedเดียวกับที่ระบุไว้สำหรับopenclaw agent --json --deliver
การกำหนดเวอร์ชัน
PROTOCOL_VERSION,MIN_CLIENT_PROTOCOL_VERSION,MIN_NODE_PROTOCOL_VERSIONและMIN_PROBE_PROTOCOL_VERSIONอยู่ในpackages/gateway-protocol/src/version.ts- ไคลเอนต์ส่ง
minProtocol+maxProtocolไคลเอนต์ผู้ปฏิบัติงานและ UI ต้อง รวมโปรโตคอลปัจจุบันไว้ในช่วงดังกล่าว ไคลเอนต์และเซิร์ฟเวอร์ปัจจุบันใช้ โปรโตคอล v4 - ไคลเอนต์ที่ผ่านการยืนยันตัวตนและมีทั้ง
role: "node"และclient.mode: "node"สามารถใช้โปรโตคอล Node รุ่น N-1 (ปัจจุบันคือ v3) โพรบการรีสตาร์ทแบบเบาใช้ ช่วง N-1 เดียวกัน การยืนยันตัวตนอุปกรณ์ การจับคู่ ขอบเขต นโยบายคำสั่ง และการอนุมัติ การดำเนินการจะไม่เปลี่ยนแปลงจากช่วงความเข้ากันได้นี้ ความสามารถและคำสั่งของ Node ที่ Plugin เป็นเจ้าของจะถูกระงับไว้จนกว่า Node จะอัปเกรดเป็นโปรโตคอลปัจจุบัน เนื่องจากพื้นผิวที่โฮสต์โดยความสามารถและคำสั่งเหล่านั้นไม่ได้เป็นส่วนหนึ่งของสัญญา N-1 - สคีมาและโมเดลสร้างขึ้นจากข้อกำหนด TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ค่าคงที่ของไคลเอนต์
การติดตั้งใช้งานไคลเอนต์อ้างอิงอยู่ใน packages/gateway-client/src/
(OpenClaw ห่อหุ้มผ่านฟาซาดแบบบาง src/gateway/client.ts) ค่าเริ่มต้นเหล่านี้
คงที่ตลอดโปรโตคอล v4 และเป็นค่าพื้นฐานที่คาดหวังสำหรับ
ไคลเอนต์ของบุคคลที่สาม
| ค่าคงที่ | ค่าเริ่มต้น | แหล่งที่มา |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_NODE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
MIN_PROBE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
| หมดเวลาคำขอ (ต่อ RPC) | 30_000 ms |
packages/gateway-client/src/client.ts (requestTimeoutMs) |
| หมดเวลาการตรวจสอบสิทธิ์ล่วงหน้า / การท้าทายการเชื่อมต่อ | 15_000 ms |
packages/gateway-client/src/timeouts.ts (ตัวแปรสภาพแวดล้อม OPENCLAW_HANDSHAKE_TIMEOUT_MS สามารถเพิ่มงบเวลาของเซิร์ฟเวอร์/ไคลเอนต์ที่จับคู่กันได้) |
| ระยะหน่วงก่อนเชื่อมต่อใหม่ครั้งแรก | 1_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| ระยะหน่วงสูงสุดก่อนเชื่อมต่อใหม่ | 30_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| ขีดจำกัดการลองใหม่อย่างรวดเร็วหลังปิดเนื่องจากโทเค็นอุปกรณ์ | 250 ms |
packages/gateway-client/src/client.ts |
ระยะผ่อนผันก่อนบังคับหยุดด้วย terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
ระยะหมดเวลาเริ่มต้นของ stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
ช่วงเวลาทิกเริ่มต้น (ก่อน hello-ok) |
30_000 ms |
packages/gateway-client/src/client.ts |
| การปิดเมื่อทิกหมดเวลา | รหัส 4000 เมื่อไม่มีการสื่อสารนานเกิน tickIntervalMs * 2 |
packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
เซิร์ฟเวอร์ประกาศค่า policy.tickIntervalMs,
policy.maxPayload และ policy.maxBufferedBytes ที่มีผลจริงใน hello-ok; ไคลเอนต์
ควรใช้ค่าเหล่านั้นแทนค่าเริ่มต้นก่อนการแฮนด์เชค
ไคลเอนต์อ้างอิงยอมให้คำขอแบบจำกัดเวลาควบคุมกำหนดเวลาสิ้นสุดที่ตั้งค่าไว้เอง เมื่อ
คำขอที่รอดำเนินการทุกคำขอมีการกำหนดเวลาดังกล่าว คำขอ expectFinal ที่ไม่มี
timeoutMs แบบจำกัดเวลา คำขอใดก็ตามที่มี timeoutMs: null หรือคำขอแบบจำกัดเวลาและ
ไม่จำกัดเวลาที่ปะปนกัน จะทำให้ตัวเฝ้าระวังทิกยังคงทำงานอยู่ หากไม่มีเหตุการณ์ขาเข้าและ
การตอบกลับนานเกินเกณฑ์หมดเวลาของทิก ไคลเอนต์จะปิด
ซ็อกเก็ตด้วยรหัส 4000 ปฏิเสธคำขอที่รอดำเนินการทั้งหมด และเชื่อมต่อใหม่ โดยจะ
ไม่ส่งคำขอที่ถูกปฏิเสธซ้ำหลังจากเชื่อมต่อใหม่
การตรวจสอบสิทธิ์
- การตรวจสอบสิทธิ์ Gateway ด้วยข้อมูลลับร่วมใช้
connect.params.auth.tokenหรือconnect.params.auth.passwordตามgateway.auth.modeที่กำหนดค่าไว้ ("none" | "token" | "password" | "trusted-proxy") - โหมดที่มีข้อมูลระบุตัวตน เช่น Tailscale Serve (
gateway.auth.allowTailscale: true) หรือgateway.auth.mode: "trusted-proxy"ที่ไม่ใช่ลูปแบ็ก จะผ่านการตรวจสอบสิทธิ์ การเชื่อมต่อจากส่วนหัวคำขอแทนconnect.params.auth.* gateway.auth.mode: "none"สำหรับทางเข้าระบบแบบส่วนตัวจะข้ามการตรวจสอบสิทธิ์การเชื่อมต่อด้วยข้อมูลลับร่วม ทั้งหมด ห้ามเปิดเผยโหมดนี้บนทางเข้าระบบสาธารณะ/ที่ไม่น่าเชื่อถือ- หลังจากจับคู่แล้ว Gateway จะออกโทเค็นอุปกรณ์ที่จำกัดขอบเขตตามบทบาท +
ขอบเขตของการเชื่อมต่อ และส่งคืนใน
hello-ok.auth.deviceTokenไคลเอนต์ควร เก็บโทเค็นนี้ไว้อย่างถาวรหลังจากเชื่อมต่อสำเร็จทุกครั้ง - เมื่อเชื่อมต่อใหม่ด้วยโทเค็นอุปกรณ์ที่จัดเก็บไว้ ควรนำชุดขอบเขตที่อนุมัติและ จัดเก็บไว้สำหรับโทเค็นนั้นกลับมาใช้ด้วย ซึ่งจะคงสิทธิ์การเข้าถึงเพื่ออ่าน/ตรวจสอบ/ดูสถานะ ที่ได้รับแล้ว และหลีกเลี่ยงการลดขอบเขตการเชื่อมต่อใหม่โดยไม่แจ้งให้เหลือเพียง ขอบเขตผู้ดูแลระบบโดยนัยที่แคบกว่า
- การประกอบข้อมูลตรวจสอบสิทธิ์การเชื่อมต่อฝั่งไคลเอนต์ (
selectConnectAuthในpackages/gateway-client/src/client.ts):auth.passwordเป็นอิสระจากส่วนอื่นและจะถูกส่งต่อตลอดเมื่อตั้งค่าไว้auth.tokenจะถูกกำหนดค่าตามลำดับความสำคัญดังนี้: โทเค็นร่วมที่ระบุโดยตรงก่อน ตามด้วยdeviceTokenที่ระบุโดยตรง แล้วจึงเป็นโทเค็นที่จัดเก็บไว้แยกตามอุปกรณ์ (ใช้deviceId+roleเป็นคีย์)auth.bootstrapTokenจะถูกส่งต่อเมื่อไม่มีรายการข้างต้นใด ให้ค่าauth.tokenเท่านั้น โทเค็นร่วมหรือโทเค็นอุปกรณ์ใดก็ตามที่หาได้จะระงับการส่งค่านี้- การเลื่อนใช้โทเค็นอุปกรณ์ที่จัดเก็บไว้โดยอัตโนมัติในการลอง
AUTH_TOKEN_MISMATCHแบบครั้งเดียว จำกัดไว้เฉพาะปลายทางที่เชื่อถือได้: ลูปแบ็ก หรือwss://ที่ตรึงtlsFingerprintไว้ ส่วนwss://สาธารณะที่ไม่มีการตรึง ไม่เข้าเงื่อนไข
- การเริ่มต้นระบบด้วยรหัสตั้งค่าในตัวจะส่งคืน
hello-ok.auth.deviceTokenของ Node หลัก พร้อมโทเค็นผู้ปฏิบัติงานแบบจำกัดในhello-ok.auth.deviceTokensสำหรับการส่งต่อไปยังอุปกรณ์เคลื่อนที่ที่เชื่อถือได้ โทเค็นผู้ปฏิบัติงาน มีoperator.talk.secretsสำหรับการอ่านการกำหนดค่า Talk แบบเนทีฟ แต่ ไม่รวมขอบเขตการแก้ไขการจับคู่และoperator.admin - ระหว่างที่การเริ่มต้นระบบด้วยรหัสตั้งค่าซึ่งไม่ใช่ค่าพื้นฐานกำลังรอการอนุมัติ
รายละเอียด
PAIRING_REQUIREDจะมีrecommendedNextStep: "wait_then_retry",retryable: trueและpauseReconnect: falseให้เชื่อมต่อใหม่ต่อไปโดยใช้ โทเค็นเริ่มต้นระบบเดิมจนกว่าคำขอจะได้รับอนุมัติหรือโทเค็น ใช้งานไม่ได้ - เก็บ
hello-ok.auth.deviceTokensไว้อย่างถาวรเฉพาะเมื่อการเชื่อมต่อใช้การตรวจสอบสิทธิ์ แบบเริ่มต้นระบบผ่านการขนส่งที่เชื่อถือได้ เช่นwss://หรือการจับคู่ผ่านลูปแบ็ก/ภายในเครื่อง - หากไคลเอนต์ระบุ
deviceTokenหรือscopesโดยตรง ชุดขอบเขตที่ผู้เรียกขอยังคงเป็นค่าหลัก ขอบเขตที่แคชไว้จะถูก นำกลับมาใช้เฉพาะเมื่อไคลเอนต์กำลังนำโทเค็นที่จัดเก็บไว้แยกตามอุปกรณ์กลับมาใช้ - โทเค็นอุปกรณ์สามารถหมุนเวียน/เพิกถอนได้ผ่าน
device.token.rotateและdevice.token.revoke(ต้องมีoperator.pairing) การหมุนเวียนหรือเพิกถอน โทเค็นของ Node หรือบทบาทอื่นที่ไม่ใช่ผู้ปฏิบัติงานต้องมีoperator.adminด้วย device.token.rotateส่งคืนข้อมูลเมตาการหมุนเวียน โดยจะส่งโทเค็นผู้ถือสิทธิ์ ตัวใหม่กลับมาเฉพาะสำหรับการเรียกจากอุปกรณ์เดียวกันที่ตรวจสอบสิทธิ์ด้วยโทเค็น ของอุปกรณ์นั้นแล้ว เพื่อให้ไคลเอนต์ที่ใช้เฉพาะโทเค็นสามารถเก็บโทเค็นตัวใหม่ก่อน เชื่อมต่อใหม่ การหมุนเวียนโดยใช้ข้อมูลลับร่วม/ผู้ดูแลระบบจะไม่ส่งโทเค็นผู้ถือสิทธิ์กลับมา- การออก การหมุนเวียน และการเพิกถอนโทเค็นยังคงจำกัดอยู่ภายในชุดบทบาทที่อนุมัติ ซึ่งบันทึกไว้ในรายการจับคู่ของอุปกรณ์นั้น การแก้ไขโทเค็นไม่สามารถขยายหรือ กำหนดเป้าหมายไปยังบทบาทอุปกรณ์ที่การอนุมัติการจับคู่ไม่เคยให้สิทธิ์
- สำหรับเซสชันโทเค็นของอุปกรณ์ที่จับคู่แล้ว การจัดการอุปกรณ์จะจำกัดอยู่ที่ตนเอง เว้นแต่
ผู้เรียกจะมี
operator.adminด้วย: ผู้เรียกที่ไม่ใช่ผู้ดูแลระบบสามารถจัดการได้เฉพาะ โทเค็นผู้ปฏิบัติงานสำหรับรายการอุปกรณ์ของตนเอง การจัดการโทเค็นของ Node และบทบาทอื่น ที่ไม่ใช่ผู้ปฏิบัติงานสงวนไว้สำหรับผู้ดูแลระบบเท่านั้น แม้จะเป็นอุปกรณ์ของผู้เรียกเองก็ตาม 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(packages/gateway-protocol/src/connect-error-details.ts)
- พฤติกรรมไคลเอนต์สำหรับ
AUTH_TOKEN_MISMATCH:- ไคลเอนต์ที่เชื่อถือได้อาจลองใหม่แบบจำกัดหนึ่งครั้งด้วยโทเค็นที่แคชไว้แยกตามอุปกรณ์
- หากการลองใหม่นั้นล้มเหลว ให้หยุดวงรอบการเชื่อมต่อใหม่อัตโนมัติและแสดง คำแนะนำการดำเนินการสำหรับผู้ปฏิบัติงาน
AUTH_SCOPE_MISMATCHหมายความว่าระบบรู้จักโทเค็นอุปกรณ์ แต่โทเค็นนั้นไม่ ครอบคลุมบทบาท/ขอบเขตที่ร้องขอ อย่าแสดงว่านี่เป็นโทเค็นที่ไม่ถูกต้อง ให้แจ้ง ผู้ปฏิบัติงานให้จับคู่ใหม่หรืออนุมัติข้อตกลงขอบเขตที่แคบกว่า/กว้างกว่า
ข้อมูลระบุตัวตนและการจับคู่อุปกรณ์
- Node ควรมีข้อมูลระบุตัวตนอุปกรณ์ที่คงที่ (
device.id) ซึ่งได้มาจาก ลายนิ้วมือของคู่กุญแจ - Gateway ออกโทเค็นแยกตามอุปกรณ์ + บทบาท
- ต้องอนุมัติการจับคู่สำหรับรหัสอุปกรณ์ใหม่ เว้นแต่เปิดใช้ การอนุมัติอัตโนมัติภายในเครื่อง
- การอนุมัติการจับคู่อัตโนมัติมุ่งเน้นที่การเชื่อมต่อลูปแบ็กภายในเครื่องโดยตรง
- OpenClaw ยังมีเส้นทางเชื่อมต่อตนเองภายในแบ็กเอนด์/คอนเทนเนอร์แบบจำกัด สำหรับ โฟลว์ตัวช่วยที่เชื่อถือได้ซึ่งใช้ข้อมูลลับร่วม
- การเชื่อมต่อผ่าน tailnet หรือ LAN บนโฮสต์เดียวกันยังถือว่าเป็นการเชื่อมต่อระยะไกลสำหรับการจับคู่ และต้องได้รับอนุมัติ
- โดยปกติไคลเอนต์ WS จะมีข้อมูลระบุตัวตน
deviceระหว่างconnect(ผู้ปฏิบัติงาน + Node) ข้อยกเว้นสำหรับผู้ปฏิบัติงานที่ไม่มีอุปกรณ์มีเฉพาะเส้นทางที่เชื่อถือได้ซึ่งระบุชัดเจน:gateway.controlUi.allowInsecureAuth=trueสำหรับความเข้ากันได้กับ HTTP ที่ไม่ปลอดภัยและจำกัดเฉพาะ localhost- การตรวจสอบสิทธิ์ Control UI ของผู้ปฏิบัติงานผ่าน
gateway.auth.mode: "trusted-proxy"ที่สำเร็จ gateway.controlUi.dangerouslyDisableDeviceAuth=true(ทางเลือกฉุกเฉิน เป็นการลดระดับ ความปลอดภัยอย่างรุนแรง)- RPC แบ็กเอนด์
gateway-clientผ่านลูปแบ็กโดยตรงบนเส้นทางตัวช่วย ภายในที่สงวนไว้
- การละเว้นข้อมูลระบุตัวตนอุปกรณ์มีผลต่อขอบเขต เมื่ออนุญาตให้การเชื่อมต่อ
ของผู้ปฏิบัติงานที่ไม่มีอุปกรณ์ผ่านเส้นทางที่เชื่อถือได้ซึ่งระบุชัดเจน OpenClaw
จะยังคงล้างขอบเขตที่ประกาศเองให้เป็นชุดว่าง เว้นแต่เส้นทางนั้นจะมี
ข้อยกเว้นการรักษาขอบเขตที่ระบุชื่อไว้ จากนั้นเมธอดที่มีการจำกัดขอบเขตจะล้มเหลวด้วย
missing scope gateway.controlUi.dangerouslyDisableDeviceAuth=trueเป็นเส้นทางรักษาขอบเขต แบบฉุกเฉินของ Control UI โดยไม่ได้ให้ขอบเขตแก่แบ็กเอนด์แบบกำหนดเองหรือ ไคลเอนต์ WebSocket ที่มีรูปแบบ CLI โดยพลการ- เส้นทางตัวช่วยแบ็กเอนด์
gateway-clientผ่านลูปแบ็กโดยตรงที่สงวนไว้จะรักษา ขอบเขตเฉพาะสำหรับ RPC ของระนาบควบคุมภายในเครื่องเท่านั้น รหัสแบ็กเอนด์แบบกำหนดเองจะ ไม่ได้รับข้อยกเว้นนี้ - การเชื่อมต่อทั้งหมดต้องลงนาม nonce
connect.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 |
เพย์โหลดลายมือชื่อไม่ตรงกับเพย์โหลด v2 |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
การประทับเวลาที่ลงลายมือชื่ออยู่นอกช่วงความคลาดเคลื่อนที่อนุญาต |
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เสมอ - ลงลายมือชื่อเพย์โหลด v2 ที่มี nonce ของเซิร์ฟเวอร์
- ส่ง nonce เดียวกันใน
connect.params.device.nonce - เพย์โหลดลายมือชื่อที่แนะนำคือ
v3(buildDeviceAuthPayloadV3ในpackages/gateway-client/src/device-auth.ts), ซึ่งผูกplatformและdeviceFamilyเพิ่มเติมจาก ฟิลด์อุปกรณ์/ไคลเอนต์/บทบาท/ขอบเขตสิทธิ์/โทเค็น/nonce - ลายมือชื่อ
v2แบบเดิมยังคงได้รับการยอมรับเพื่อความเข้ากันได้ แต่การตรึง เมทาดาทาของอุปกรณ์ที่จับคู่ยังคงควบคุมนโยบายคำสั่งเมื่อเชื่อมต่อใหม่
TLS และการตรึง
- รองรับ TLS สำหรับการเชื่อมต่อ WS (การกำหนดค่า
gateway.tls) - ไคลเอนต์สามารถเลือกตรึงลายนิ้วมือใบรับรองของ Gateway ผ่าน
gateway.remote.tlsFingerprintหรือ CLI--tls-fingerprint
ขอบเขต
โปรโตคอลนี้เปิดเผย API ทั้งหมดของ Gateway ได้แก่ สถานะ ช่อง โมเดล แชต
เอเจนต์ เซสชัน โหนด การอนุมัติ และอื่นๆ พื้นผิวที่แน่นอนกำหนดโดย
สคีมา TypeBox ที่ส่งออกซ้ำจาก packages/gateway-protocol/src/schema.ts