Building plugins
คำขอสิทธิ์ของ Plugin
คำขอสิทธิ์ของ Plugin ช่วยให้โค้ด Plugin หยุดการเรียกใช้เครื่องมือหรือการดำเนินการที่ Plugin เป็นเจ้าของไว้ชั่วคราว
จนกว่าผู้ใช้จะอนุมัติหรือปฏิเสธ โดยใช้โฟลว์ plugin.approval.* ของ Gateway
และพื้นผิว UI การอนุมัติเดียวกับที่ใช้จัดการปุ่มอนุมัติในแชต
และคำสั่ง /approve
ใช้คำขอสิทธิ์ของ Plugin สำหรับสิทธิ์ของ Plugin/แอป คำขอเหล่านี้ไม่ได้ใช้แทน การอนุมัติ exec ของโฮสต์ รายการอนุญาตเครื่องมือแบบเลือกใช้ หรือการตรวจสอบสิทธิ์ แบบเนทีฟของ Codex
เลือกด่านตรวจสอบที่เหมาะสม
เลือกด่านตรวจสอบที่ตรงกับจุดตัดสินใจที่ต้องการ:
| ด่านตรวจสอบ | ใช้เมื่อ | สิ่งที่ควบคุม |
|---|---|---|
| เครื่องมือแบบเลือกใช้ | ไม่ควรแสดงเครื่องมือแก่โมเดลจนกว่าผู้ใช้จะเลือกใช้ | การเปิดเผยเครื่องมือผ่าน tools.allow |
| คำขอสิทธิ์ของ Plugin | ฮุกของ Plugin หรือการดำเนินการที่ Plugin เป็นเจ้าของต้องขออนุญาตก่อนดำเนินการหนึ่งรายการ | การอนุมัติขณะรันผ่าน plugin.approval.* |
| การอนุมัติ exec | คำสั่งโฮสต์หรือเครื่องมือที่คล้ายเชลล์ต้องได้รับการอนุมัติจากผู้ดำเนินการ | นโยบาย exec ของโฮสต์และรายการอนุญาต exec แบบถาวร |
| คำขอสิทธิ์แบบเนทีฟของ Codex | Codex ขออนุญาตก่อนดำเนินการกับเชลล์ ไฟล์ MCP หรือ app-server แบบเนทีฟ | การจัดการการอนุมัติของ Codex app-server หรือฮุกแบบเนทีฟ ซึ่งส่งผ่านการอนุมัติของ Plugin เมื่อ OpenClaw เป็นเจ้าของพรอมต์ |
| การร้องขอการอนุมัติจาก MCP | เซิร์ฟเวอร์ Codex MCP ขออนุมัติสำหรับการเรียกใช้เครื่องมือ | การตอบกลับการอนุมัติ MCP ที่เชื่อมต่อผ่านการอนุมัติของ Plugin ของ OpenClaw |
เครื่องมือแบบเลือกใช้เป็นด่านตรวจสอบในช่วงการค้นพบ ส่วนคำขอสิทธิ์ของ Plugin เป็น ด่านตรวจสอบต่อการเรียกแต่ละครั้ง ใช้ทั้งสองอย่างเมื่อเครื่องมือที่ละเอียดอ่อนควรกำหนดให้ผู้ใช้เลือกใช้อย่างชัดแจ้ง ก่อนที่โมเดลจะมองเห็น และต้องได้รับการอนุมัติก่อนดำเนินการ
ขออนุมัติก่อนเรียกใช้เครื่องมือ
พรอมต์ส่วนใหญ่ที่สร้างโดย Plugin ควรเริ่มในฮุก before_tool_call ฮุกนี้
ทำงานหลังจากโมเดลเลือกเครื่องมือและก่อนที่ OpenClaw จะเรียกใช้:
export default definePluginEntry({ id: "deploy-policy", name: "Deploy Policy", register(api) { api.on("before_tool_call", async (event) => { if (event.toolName !== "deploy_service") { return; } const environment = typeof event.params.environment === "string" ? event.params.environment : "unknown"; return { requireApproval: { title: "Deploy service", description: `Deploy service to ${environment}.`, severity: environment === "production" ? "critical" : "warning", allowedDecisions: environment === "production" ? ["allow-once", "deny"] : ["allow-once", "allow-always", "deny"], timeoutMs: 120_000, onResolution(decision) { console.log(`deploy approval resolved: ${decision}`); }, }, }; }); },});เขียนข้อความพรอมต์สำหรับผู้ที่จะอนุมัติการดำเนินการ:
- กำหนด
titleให้สั้นและมุ่งเน้นการดำเนินการ Gateway จำกัดไว้ที่ 80 อักขระ - กำหนด
descriptionให้เฉพาะเจาะจงและมีขอบเขต Gateway จำกัดไว้ที่ 512 อักขระ - ระบุการดำเนินการ เป้าหมาย และความเสี่ยง อย่าระบุข้อมูลลับ โทเค็น หรือ เพย์โหลดส่วนตัวที่ไม่ควรปรากฏบนพื้นผิวการอนุมัติในแชต
- หากละเว้น
severityค่าเริ่มต้นคือ"warning"ใช้"critical"เฉพาะกับ การดำเนินการที่การตัดสินใจผิดพลาดอาจสร้างความเสียหายต่อระบบใช้งานจริงหรือทำให้ข้อมูลสูญหาย - หากละเว้น
allowedDecisionsค่าเริ่มต้นคือ["allow-once", "allow-always", "deny"]ส่ง["allow-once", "deny"]เมื่อความเชื่อถือแบบถาวรไม่ปลอดภัยสำหรับ การดำเนินการนั้น - หากละเว้น
timeoutMsค่าเริ่มต้นคือ 120000 (2 นาที) และจำกัดสูงสุดที่ 600000 (10 นาที) ไม่ว่าค่าที่ขอจะเป็นเท่าใด
พฤติกรรมการตัดสินใจ
OpenClaw สร้างการอนุมัติที่รอดำเนินการพร้อม ID plugin: ส่งไปยัง
พื้นผิวการอนุมัติที่พร้อมใช้งาน และรอการตัดสินใจ
| การตัดสินใจ | ผลลัพธ์ |
|---|---|
allow-once |
การเรียกปัจจุบันดำเนินต่อ |
allow-always |
การเรียกปัจจุบันดำเนินต่อและส่งการตัดสินใจให้ Plugin |
deny |
การเรียกถูกบล็อกพร้อมผลลัพธ์เครื่องมือที่ถูกปฏิเสธ |
| หมดเวลา | การเรียกถูกบล็อก |
| การยกเลิก | การเรียกถูกบล็อกเมื่อการรันถูกยกเลิก |
| ไม่มีเส้นทางการอนุมัติ | การเรียกถูกบล็อกเนื่องจากไม่มีพื้นผิวการอนุมัติที่เชื่อมต่ออยู่สามารถดำเนินการให้เสร็จสิ้นได้ |
มีเพียงการตัดสินใจ allow-once และ allow-always ที่ตรงกันทุกประการและได้รับอนุญาตจาก
คำขอเท่านั้นที่อนุญาตให้ดำเนินการ การตัดสินใจที่ไม่รู้จัก ผิดรูปแบบ ไม่ตรงกัน ขาดหาย หรือหมดเวลา
จะปฏิเสธโดยค่าเริ่มต้น ฟิลด์เดิม timeoutBehavior ยังคงรองรับเพื่อ
ความเข้ากันได้ของ Plugin แต่เลิกใช้แล้วและจะถูกละเว้น อย่ากำหนดฟิลด์นี้ในฮุกใหม่
allow-always จะคงอยู่ถาวรก็ต่อเมื่อ Plugin หรือรันไทม์ที่ส่งคำขอ
นำการคงอยู่นั้นไปใช้ สำหรับฮุก before_tool_call.requireApproval ทั่วไป
OpenClaw ถือว่า allow-once และ allow-always เป็นการตัดสินใจอนุมัติสำหรับ
การเรียกปัจจุบัน และส่งค่าที่ได้ไปยัง onResolution หาก Plugin
เสนอ allow-always ให้บันทึกเอกสารและนำไปใช้อย่างชัดเจนว่าจะเชื่อถือ
การเรียกในอนาคตใดบ้าง
หากฮุกส่งคืน params ด้วย OpenClaw จะใช้การเปลี่ยนแปลงพารามิเตอร์เหล่านั้นเฉพาะ
หลังจากการอนุมัติสำเร็จ ฮุกที่มีลำดับความสำคัญต่ำกว่ายังคงสามารถบล็อกได้หลังจาก
ฮุกที่มีลำดับความสำคัญสูงกว่าขอการอนุมัติแล้ว
allowedDecisions จำกัดปุ่มและคำสั่งที่แสดงแก่ผู้ใช้
Gateway จะปฏิเสธความพยายามดำเนินการให้เสร็จสิ้นสำหรับการตัดสินใจใดก็ตามที่คำขอไม่ได้เสนอไว้
กำหนดเส้นทางพรอมต์การอนุมัติ
พรอมต์การอนุมัติสามารถดำเนินการให้เสร็จสิ้นในพื้นผิว UI ภายในเครื่องหรือในช่องแชตที่
รองรับการจัดการการอนุมัติ หากต้องการส่งต่อพรอมต์การอนุมัติของ Plugin ไปยังเป้าหมายแชต
ที่ระบุอย่างชัดเจน ให้กำหนดค่า approvals.plugin:
{ approvals: { plugin: { enabled: true, mode: "targets", agentFilter: ["main"], targets: [{ channel: "slack", to: "U12345678" }], }, },}approvals.plugin เป็นอิสระจาก approvals.exec การเปิดใช้การส่งต่อการอนุมัติ exec
จะไม่กำหนดเส้นทางพรอมต์การอนุมัติของ Plugin และการเปิดใช้การส่งต่อการอนุมัติของ Plugin
จะไม่เปลี่ยนนโยบาย exec ของโฮสต์
เมื่อพรอมต์มีข้อความการอนุมัติด้วยตนเอง ให้ดำเนินการให้เสร็จสิ้นด้วยหนึ่งในการตัดสินใจ ที่เสนอ:
/approve <id> allow-once/approve <id> allow-always/approve <id> denyดู การอนุมัติ exec ขั้นสูง สำหรับโมเดลการส่งต่อทั้งหมด พฤติกรรมการอนุมัติในแชตเดียวกัน การส่งผ่านช่องทางแบบเนทีฟ และกฎผู้อนุมัติเฉพาะช่องทาง
สิทธิ์แบบเนทีฟของ Codex
พรอมต์สิทธิ์แบบเนทีฟของ Codex สามารถส่งผ่านการอนุมัติของ Plugin ได้เช่นกัน แต่ มีความเป็นเจ้าของแตกต่างจากฮุกที่สร้างโดย Plugin
- คำขออนุมัติของ Codex app-server ส่งผ่าน OpenClaw หลังจาก Codex ตรวจสอบ
- รีเลย์ฮุกแบบเนทีฟ
permission_requestสามารถขอผ่านplugin.approval.requestเมื่อเปิดใช้รีเลย์นั้น - การร้องขออนุมัติเครื่องมือ MCP ส่งผ่านการอนุมัติของ Plugin เมื่อ Codex กำหนด
_meta.codex_approval_kindเป็น"mcp_tool_call"
ดู รันไทม์ชุดควบคุม Codex สำหรับพฤติกรรมเฉพาะของ Codex และกฎการสำรอง
การแก้ไขปัญหา
เครื่องมือแจ้งว่าการอนุมัติของ Plugin ไม่พร้อมใช้งาน ไม่มี UI การอนุมัติหรือเส้นทาง
การอนุมัติที่กำหนดค่าไว้ยอมรับคำขอ เชื่อมต่อไคลเอนต์ที่รองรับการอนุมัติ ใช้
ช่องทางที่รองรับ /approve ในแชตเดียวกัน หรือกำหนดค่า approvals.plugin
allow-always ปรากฏขึ้น แต่การเรียกครั้งถัดไปถามอีกครั้ง โฟลว์การอนุมัติของ Plugin
ทั่วไปไม่ได้คงความเชื่อถือสำหรับฮุกที่กำหนดเองโดยอัตโนมัติ ให้คงความเชื่อถือที่ Plugin
เป็นเจ้าของไว้ใน Plugin หลังจาก onResolution("allow-always") หรือ
เสนอเฉพาะ allow-once และ deny
/approve ปฏิเสธการตัดสินใจ คำขอจำกัด
allowedDecisions ให้ใช้หนึ่งในการตัดสินใจที่พิมพ์อยู่ในพรอมต์
พรอมต์ของ Discord, Matrix, Slack หรือ Telegram ถูกกำหนดเส้นทางแตกต่างจากการอนุมัติ
exec การอนุมัติของ Plugin และการอนุมัติ exec ใช้การกำหนดค่าแยกกันและอาจใช้
การตรวจสอบการให้สิทธิ์ต่างกัน ตรวจสอบ approvals.plugin และการรองรับ
การอนุมัติของ Plugin ของช่องทาง แทนที่จะตรวจสอบเพียง approvals.exec