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 ส่งชาเลนจ์ก่อนเชื่อมต่อ:

json
{  "type": "event",  "event": "connect.challenge",  "payload": { "nonce": "…", "ts": 1737264000000 }}

ไคลเอนต์ตอบกลับด้วย connect:

json
{  "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:

json
{  "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 จะเพิ่มโทเค็นดังกล่าว:

json
{  "auth": {    "deviceToken": "…",    "role": "operator",    "scopes": ["operator.read", "operator.write"]  }}

การบูตสแตรปด้วย QR/รหัสตั้งค่าในตัวเป็นเส้นทางส่งต่อไปยังอุปกรณ์เคลื่อนที่ การเชื่อมต่อ ด้วยรหัสตั้งค่าพื้นฐานที่สำเร็จจะส่งคืนโทเค็น Node หลัก พร้อมโทเค็น ผู้ดำเนินการแบบจำกัดหนึ่งรายการ:

json
{  "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

json
{  "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, talk
  • commands: รายการอนุญาตคำสั่งสำหรับการเรียกใช้
  • permissions: ตัวสลับแบบละเอียด (เช่น screen.record, camera.capture)

Gateway ถือว่าสิ่งเหล่านี้เป็นการอ้างสิทธิ์และบังคับใช้รายการอนุญาตฝั่งเซิร์ฟเวอร์

บทบาทและขอบเขต

สำหรับโมเดลขอบเขตของผู้ดำเนินการทั้งหมด การตรวจสอบในเวลาอนุมัติ และความหมายของข้อมูลลับ ที่ใช้ร่วมกัน โปรดดู ขอบเขตของผู้ดำเนินการ

บทบาท:

  • operator: ไคลเอนต์ระนาบควบคุม (CLI/UI/ระบบอัตโนมัติ)
  • node: โฮสต์ความสามารถ (กล้อง/หน้าจอ/แคนวาส/system.run)
  • worker: โฮสต์การดำเนินการบนคลาวด์ในโปรโตคอลเวิร์กเกอร์เฉพาะแบบปิด

ขอบเขตของผู้ดำเนินการ (src/gateway/operator-scopes.ts) ซึ่งเป็นชุดแบบปิดทั้งหมด:

  • operator.read
  • operator.write
  • operator.admin
  • operator.approvals
  • operator.pairing
  • operator.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 และ talk
  • commands: รายการคำสั่งที่อนุญาตสำหรับการเรียกใช้
  • 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 แสดงหนึ่งแถวต่ออุปกรณ์ได้ แม้ อุปกรณ์นั้นจะเชื่อมต่อทั้งในฐานะผู้ปฏิบัติงานและ Node
  • node.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 ที่จับคู่ยังทำงานอยู่ระหว่างการปลุกเบื้องหลัง โดยไม่ทำเครื่องหมายว่าเชื่อมต่ออยู่:

json
{  "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 ที่ดำเนินการสำเร็จจะส่งคืนผลลัพธ์แบบมีโครงสร้าง:

json
{  "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.read
  • status ส่งคืนข้อมูลสรุป Gateway ในรูปแบบ /status; ฟิลด์ที่ละเอียดอ่อนมีให้เฉพาะไคลเอนต์ผู้ปฏิบัติงานที่มีขอบเขตผู้ดูแลระบบ
  • gateway.identity.get ส่งคืนข้อมูลประจำตัวอุปกรณ์ของ Gateway ที่โฟลว์รีเลย์และการจับคู่ใช้
  • system-presence ส่งคืนสแนปช็อตสถานะการปรากฏปัจจุบันของอุปกรณ์ผู้ปฏิบัติงาน/Node ที่เชื่อมต่อ
  • system-event เพิ่มเหตุการณ์ระบบและสามารถอัปเดต/กระจายบริบทสถานะการปรากฏ
  • last-heartbeat ส่งคืนเหตุการณ์ Heartbeat ล่าสุดที่คงอยู่
  • set-heartbeats เปิดหรือปิดการประมวลผล Heartbeat บน Gateway
  • gateway.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.read
  • sessions.usage ส่งคืนข้อมูลสรุปการใช้งานต่อเซสชัน ส่ง agentId สำหรับเอเจนต์หนึ่งตัว หรือ agentScope: "all" เพื่อแสดงเอเจนต์ที่กำหนดค่าไว้ร่วมกัน เมธอดการใช้งานทั้งสองยอมรับ mode: "specific" พร้อม timeZone ตามมาตรฐาน IANA สำหรับขอบเขตและบักเก็ตของวันตามปฏิทินที่รองรับ DST utcOffset ยังคงรองรับไคลเอนต์รุ่นเก่า และใช้เป็นทางเลือกสำรองเมื่อรันไทม์ Gateway ไม่รู้จักโซนที่ร้องขอ
  • sessions.usage.timeseries ส่งคืนการใช้งานแบบอนุกรมเวลาสำหรับหนึ่งเซสชัน
  • sessions.usage.logs ส่งคืนรายการบันทึกการใช้งานสำหรับหนึ่งเซสชัน
ช่องทางและตัวช่วยเข้าสู่ระบบ
  • channels.status ส่งคืนข้อมูลสรุปสถานะของช่องทาง/Plugin ที่มีในตัวและรวมมากับระบบ
  • channels.logout ออกจากระบบของช่องทาง/บัญชีที่ระบุ ในกรณีที่ช่องทางรองรับ
  • web.login.start เริ่มโฟลว์เข้าสู่ระบบด้วย QR/เว็บสำหรับผู้ให้บริการช่องทางเว็บปัจจุบันที่รองรับ QR
  • web.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 ถึง 100
  • plugins.install (operator.admin) ติดตั้งรายการแค็ตตาล็อกทางการด้วย { source: "official", pluginId } หรือแพ็กเกจ ClawHub ด้วย { source: "clawhub", packageName, version?, acknowledgeClawHubRisk? } การติดตั้ง ClawHub จะคงการตรวจสอบความน่าเชื่อถือ ความสมบูรณ์ และนโยบายการติดตั้งของ Gateway การติดตั้งที่สำเร็จต้องรีสตาร์ต Gateway
  • plugins.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.admin
  • talk.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 ในเซสชันรีเลย์ของ Gateway
  • talk.session.submitToolResult ดำเนินการเรียกใช้เครื่องมือของผู้ให้บริการที่ส่งมาจากเซสชันรีเลย์แบบเรียลไทม์ที่ Gateway เป็นเจ้าของให้เสร็จสมบูรณ์ คำขอจะรอสัญญาณการเสร็จสิ้นแบบอะซิงโครนัสที่บริดจ์ผู้ให้บริการเปิดเผย การส่งที่ล้มเหลวจะทำให้การเรียกใช้ที่เชื่อมโยงยังทำงานอยู่และไม่ส่งเหตุการณ์ผลลัพธ์เครื่องมือที่สำเร็จ ส่ง options: { willContinue: true } สำหรับเอาต์พุตเครื่องมือระหว่างดำเนินการ หรือ options: { suppressResponse: true } เมื่อบริดจ์ผู้ให้บริการประกาศว่ารองรับการระงับและผลลัพธ์ไม่ควรเริ่มการตอบกลับใหม่
  • talk.session.steer ส่งการควบคุมด้วยเสียงของการเรียกใช้ที่ทำงานอยู่ไปยังเซสชัน Talk ที่มีเอเจนต์เป็นแบ็กเอนด์และ Gateway เป็นเจ้าของ: { sessionId, text, mode? } โดย mode คือ status, steer, cancel หรือ followup; หากไม่ระบุโหมด ระบบจะจำแนกจากข้อความเสียงพูด
  • talk.session.close ปิดเซสชันรีเลย์ การถอดเสียง หรือห้องที่มีการจัดการซึ่ง Gateway เป็นเจ้าของ และส่งเหตุการณ์ Talk สิ้นสุด
  • talk.mode ตั้งค่า/ประกาศสถานะโหมด Talk ปัจจุบันสำหรับไคลเอนต์ WebChat/Control UI
  • talk.client.create สร้างหรือดำเนินเซสชันผู้ให้บริการแบบเรียลไทม์ที่ไคลเอนต์เป็นเจ้าของต่อ โดยใช้ webrtc หรือ provider-websocket ขณะที่ Gateway เป็นเจ้าของข้อมูลประจำตัว คำสั่ง นโยบายเครื่องมือ และ voiceSessionId ที่ส่งคืน ไคลเอนต์ส่ง sessionKey และใช้ voiceSessionId ซ้ำเมื่อเปลี่ยนการขนส่งของผู้ให้บริการระหว่างการโทรหนึ่งครั้ง
  • talk.client.transcript เพิ่มรายการ { role, text } ที่เสร็จสมบูรณ์หนึ่งรายการต่อท้ายเซสชันเอเจนต์ปกติ entryId ที่จำเป็นมีคุณสมบัติ idempotent ภายใน voiceSessionId; การลองใหม่จะไม่ทำให้ข้อความทรานสคริปต์ซ้ำ
  • talk.client.close ปิดเซสชันเสียงเชิงตรรกะหลังการเขียนทรานสคริปต์ที่รอดำเนินการ การปิดมีคุณสมบัติ idempotent และอาจส่งข้อมูลสรุปการโทรที่มีเฉพาะการเปลี่ยนแปลงไปยังช่องทางล่าสุดของเซสชันที่ไม่ใช่ WebChat
  • talk.client.toolCall ช่วยให้การขนส่งแบบเรียลไทม์ที่ไคลเอนต์เป็นเจ้าของส่งต่อการเรียกใช้เครื่องมือของผู้ให้บริการไปยังนโยบายของ Gateway เครื่องมือแรกที่รองรับคือ openclaw_agent_consult; ไคลเอนต์จะได้รับ ID การเรียกใช้และรอเหตุการณ์วงจรชีวิตแชตตามปกติก่อนส่งผลลัพธ์เครื่องมือเฉพาะของผู้ให้บริการ การดำเนินการที่มีผลกระทบสูงซึ่งผูกกับเสียงจะส่งคืน VOICE_CONFIRMATION_REQUIRED:<id> จนกว่าคำพูดของผู้ใช้ที่เสร็จสมบูรณ์ในภายหลังจะยืนยันการดำเนินการนั้นอย่างชัดเจน และการปรึกษาครั้งถัดไปส่ง confirmationId
  • talk.client.steer ส่งการควบคุมด้วยเสียงของการเรียกใช้ที่ทำงานอยู่สำหรับการขนส่งแบบเรียลไทม์ที่ไคลเอนต์เป็นเจ้าของ Gateway จะแก้ไขการเรียกใช้แบบฝังที่ทำงานอยู่จาก sessionKey และส่งคืนผลลัพธ์การยอมรับ/ปฏิเสธที่มีโครงสร้าง แทนการละทิ้งการชี้นำโดยไม่แจ้ง
  • talk.event เป็นช่องเหตุการณ์ Talk เดียวสำหรับอะแดปเตอร์แบบเรียลไทม์ การถอดเสียง STT/TTS ห้องที่มีการจัดการ โทรศัพท์ และการประชุม
  • talk.speak สังเคราะห์เสียงพูดผ่านผู้ให้บริการเสียงพูด Talk ที่ใช้งานอยู่
  • tts.status ส่งคืนสถานะการเปิดใช้ TTS ผู้ให้บริการที่ใช้งานอยู่ ผู้ให้บริการสำรอง และสถานะการกำหนดค่าผู้ให้บริการ
  • tts.providers ส่งคืนรายการผู้ให้บริการ TTS ที่มองเห็นได้
  • tts.enable และ tts.disable สลับสถานะค่ากำหนด TTS
  • tts.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[].skills
  • config.apply ตรวจสอบและแทนที่เพย์โหลดการกำหนดค่าทั้งหมด
  • config.schema ส่งคืนเพย์โหลดสคีมาการกำหนดค่าแบบสดที่ใช้โดย Control UI และเครื่องมือ CLI ได้แก่ สคีมา uiHints เวอร์ชัน ข้อมูลเมตาการสร้าง และข้อมูลเมตาสคีมาของ Plugin กับช่องทางเมื่อโหลดได้ โดยรวมข้อมูลเมตา title / description จากป้ายกำกับ/ข้อความช่วยเหลือชุดเดียวกับ UI รวมถึงออบเจ็กต์ที่ซ้อนกัน ไวลด์การ์ด รายการอาร์เรย์ และกิ่งการประกอบ anyOf / oneOf / allOf เมื่อมีเอกสารฟิลด์ที่ตรงกัน
  • config.schema.lookup ส่งคืนเพย์โหลดการค้นหาตามขอบเขตพาธสำหรับพาธการกำหนดค่าหนึ่งรายการ ได้แก่ พาธที่ปรับให้เป็นมาตรฐาน โหนดสคีมาแบบตื้น คำใบ้ที่ตรงกันพร้อม hintPath ค่า reloadKind ที่อาจมี และข้อมูลสรุปโหนดลูกโดยตรงสำหรับการเจาะลึกผ่าน UI/CLI reloadKind เป็นหนึ่งใน 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 รุ่นเก่าอาจส่งคืนแถวที่ไม่มี kind
  • agents.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 และ orphaned
  • environments.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 ที่ไม่ใช่ความลับ และ urlSource
  • device.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.denyCommands
  • node.event นำเหตุการณ์ที่เริ่มต้นจาก Node กลับเข้าสู่ Gateway
  • node.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 ของ Gateway
  • exec.approvals.node.get และ exec.approvals.node.set จัดการนโยบายการอนุมัติ exec ภายใน Node ผ่านคำสั่งรีเลย์ของ Node
  • plugin.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.runs
  • cron.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: การอัปเดตสแนปช็อตสถานภาพของ Gateway
  • heartbeat: การอัปเดตสตรีมเหตุการณ์ Heartbeat
  • cron: เหตุการณ์การเปลี่ยนแปลงการเรียกใช้/งาน Cron
  • shutdown: การแจ้งเตือนการปิดระบบ Gateway
  • node.pair.requested / node.pair.resolved: วงจรชีวิตการจับคู่ Node
  • node.invoke.request: การกระจายคำขอเรียกใช้ Node
  • device.pair.requested / device.pair.resolved: วงจรชีวิตอุปกรณ์ที่จับคู่แล้ว
  • voicewake.changed: การกำหนดค่าทริกเกอร์คำปลุกเปลี่ยนแปลง
  • config.changed: การเขียนการกำหนดค่าถูกบันทึกอย่างคงทน (เพย์โหลดมีพาธการกำหนดค่า แฮชสแนปช็อตใหม่ และการประทับเวลา — ไม่มีเนื้อหาการกำหนดค่าโดยเด็ดขาด) มีขอบเขตสำหรับการอ่านโดยผู้ปฏิบัติงาน ไคลเอนต์รีเฟรชผ่าน config.get
  • exec.approval.requested / exec.approval.resolved: วงจรชีวิต การอนุมัติ exec
  • plugin.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 หรือ unknown
  • outcome ขาเข้า: 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_aborted
  • outcome ขาออก: 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 และ /m
    • nativeName มีชื่อคำสั่งเนทีฟที่รับรู้ผู้ให้บริการเมื่อมี ชื่อดังกล่าว
    • provider เป็นตัวเลือกเสริมและมีผลเฉพาะต่อการตั้งชื่อแบบเนทีฟ รวมถึงความพร้อมใช้งานของคำสั่ง Plugin แบบเนทีฟ
    • includeArgs=false จะตัดข้อมูลเมตาของอาร์กิวเมนต์ที่ซีเรียลไลซ์แล้วออกจากการตอบกลับ
  • tools.catalog (operator.read) ดึงแค็ตตาล็อกเครื่องมือรันไทม์สำหรับ เอเจนต์ การตอบกลับประกอบด้วยเครื่องมือที่จัดกลุ่มและข้อมูลเมตาแหล่งที่มา:
    • source: core หรือ plugin
    • pluginId: เจ้าของ 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) ส่งคืนข้อมูลเมตา การค้นพบของ ClawHub
  • skills.upload.begin, skills.upload.chunk และ skills.upload.commit (operator.admin) จัดเตรียมไฟล์เก็บถาวร Skills ส่วนตัวก่อนติดตั้ง นี่คือ เส้นทางอัปโหลดสำหรับผู้ดูแลระบบที่แยกต่างหากสำหรับไคลเอนต์ที่เชื่อถือได้ ไม่ใช่ขั้นตอนการติดตั้ง Skills ของ ClawHub ตามปกติ และจะปิดใช้งานโดยค่าเริ่มต้น เว้นแต่จะเปิดใช้ skills.install.allowUploadedArchives
    • skills.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 สำหรับการตัดสินใจติดตั้งที่ผู้ปฏิบัติงานเป็นเจ้าของ
  • 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_REQUEST
  • bestEffortDeliver=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:gen
    • pnpm protocol:gen:swift
    • pnpm 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

เนื้อหาที่เกี่ยวข้อง

Was this useful?
On this page

On this page