Webhooks¶
Gateway สามารถเปิดเอ็นด์พอยต์ HTTP webhook ขนาดเล็กสำหรับทริกเกอร์จากภายนอกได้
เปิดใช้งาน¶
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
},
}
หมายเหตุ:
- ต้องใช้
hooks.tokenเมื่อhooks.enabled=true hooks.pathใช้ค่าเริ่มต้นเป็น/hooks
การยืนยันตัวตน¶
ทุกคำขอต้องมี hook token แนะนำให้ส่งผ่านเฮดเดอร์: 4. ให้ความสำคัญกับเฮดเดอร์:
Authorization: Bearer <token>(แนะนำ)x-openclaw-token: <token>?token=<token>(เลิกใช้แล้ว; จะบันทึกคำเตือนในล็อกและจะถูกลบออกในรีลีสหลักในอนาคต)
เอนด์พอยต์¶
POST /hooks/wake¶
เพย์โหลด:
{ "text": "System line", "mode": "now" }
textจำเป็น (string): คำอธิบายของเหตุการณ์ (เช่น "New email received")modeไม่บังคับ (now|next-heartbeat): ระบุว่าจะทริกเกอร์ heartbeat ทันทีหรือรอการตรวจสอบตามรอบถัดไป (ค่าเริ่มต้นnow)
ผลลัพธ์:
- เข้าคิวเหตุการณ์ระบบสำหรับเซสชัน หลัก
- หาก
mode=nowจะทริกเกอร์ heartbeat ทันที
POST /hooks/agent¶
เพย์โหลด:
{
"message": "Run this",
"name": "Email",
"sessionKey": "hook:email:msg-123",
"wakeMode": "now",
"deliver": true,
"channel": "last",
"to": "+15551234567",
"model": "openai/gpt-5.2-mini",
"thinking": "low",
"timeoutSeconds": 120
}
messageจำเป็น (string): พรอมป์ต์หรือข้อความที่ให้เอเจนต์ประมวลผลnameไม่บังคับ (string): ชื่อที่อ่านเข้าใจง่ายสำหรับ hook (เช่น "GitHub") ใช้เป็นคำนำหน้าในสรุปเซสชันsessionKeyไม่บังคับ (string): คีย์ที่ใช้ระบุเซสชันของเอเจนต์ ค่าเริ่มต้นเป็นhook:<uuid>แบบสุ่ม การใช้คีย์ที่สม่ำเสมอช่วยให้สนทนาได้หลายเทิร์นภายในบริบทของ hook 5. ค่าเริ่มต้นเป็นhook:<uuid>แบบสุ่ม 6. การใช้คีย์ที่สอดคล้องกันช่วยให้สามารถสนทนาแบบหลายรอบภายในบริบทของ hook เดียวกันได้wakeModeไม่บังคับ (now|next-heartbeat): ระบุว่าจะทริกเกอร์ heartbeat ทันทีหรือรอการตรวจสอบตามรอบถัดไป (ค่าเริ่มต้นnow)deliverไม่บังคับ (boolean): หากtrueการตอบกลับของเอเจนต์จะถูกส่งไปยังช่องทางข้อความ ค่าเริ่มต้นเป็นtrueการตอบกลับที่เป็นเพียงการยืนยัน heartbeat จะถูกข้ามโดยอัตโนมัติ 7. ค่าเริ่มต้นเป็นtrue8. การตอบกลับที่เป็นเพียงการยืนยัน heartbeat เท่านั้นจะถูกข้ามโดยอัตโนมัติchanneloptional (string): The messaging channel for delivery.channelไม่บังคับ (string): ช่องทางข้อความสำหรับการส่ง หนึ่งใน:last,whatsapp,telegram,discord,slack,mattermost(plugin),signal,imessage,msteamsค่าเริ่มต้นเป็นlast10. ค่าเริ่มต้นเป็นlasttoไม่บังคับ (string): ตัวระบุผู้รับสำหรับช่องทาง (เช่น หมายเลขโทรศัพท์สำหรับ WhatsApp/Signal, chat ID สำหรับ Telegram, channel ID สำหรับ Discord/Slack/Mattermost (plugin), conversation ID สำหรับ Microsoft Teams) ค่าเริ่มต้นเป็นผู้รับล่าสุดในเซสชันหลัก 11. ค่าเริ่มต้นเป็นผู้รับรายล่าสุดในเซสชันหลักmodelไม่บังคับ (string): การแทนที่โมเดล (เช่นanthropic/claude-3-5-sonnetหรือชื่อแฝง) ต้องอยู่ในรายการโมเดลที่อนุญาตหากมีการจำกัด Must be in the allowed model list if restricted.thinkingไม่บังคับ (string): การแทนที่ระดับการคิด (เช่นlow,medium,high)timeoutSecondsไม่บังคับ (number): ระยะเวลาสูงสุดสำหรับการรันเอเจนต์เป็นวินาที
Effect:
- รันเอเจนต์แบบ แยก (ใช้คีย์เซสชันของตนเอง)
- โพสต์สรุปไปยังเซสชัน หลัก เสมอ
- หาก
wakeMode=nowจะทริกเกอร์ heartbeat ทันที
POST /hooks/<name> (mapped)¶
Custom hook names are resolved via hooks.mappings (see configuration). ชื่อ hook แบบกำหนดเองจะถูกแก้ไขผ่าน hooks.mappings (ดูการกำหนดค่า) การแมปสามารถ
แปลง payload ใดๆ ให้เป็นการกระทำ wake หรือ agent พร้อมเทมเพลตหรือ
การแปลงโค้ดตามต้องการ
ตัวเลือกการแมป (สรุป):
hooks.presets: ["gmail"]เปิดใช้การแมป Gmail ที่มีมาให้hooks.mappingsให้คุณกำหนดmatch,actionและเทมเพลตในคอนฟิกhooks.transformsDir+transform.moduleโหลดโมดูล JS/TS สำหรับลอจิกแบบกำหนดเอง- ใช้
match.sourceเพื่อคงเอ็นด์พอยต์รับเข้าทั่วไป (การกำหนดเส้นทางตาม payload) - การแปลง TS ต้องใช้ตัวโหลด TS (เช่น
bunหรือtsx) หรือ.jsที่คอมไพล์ล่วงหน้าในขณะรันไทม์ - ตั้งค่า
deliver: true+channel/toบนการแมปเพื่อกำหนดเส้นทางการตอบกลับไปยังพื้นผิวแชต (channelใช้ค่าเริ่มต้นเป็นlastและจะถอยกลับไปใช้ WhatsApp) allowUnsafeExternalContent: trueปิดตัวห่อความปลอดภัยของเนื้อหาภายนอกสำหรับ hook นั้น (อันตราย; ใช้เฉพาะแหล่งภายในที่เชื่อถือได้)openclaw webhooks gmail setupเขียนคอนฟิกhooks.gmailสำหรับopenclaw webhooks gmail runดู Gmail Pub/Sub สำหรับโฟลว์การเฝ้าดู Gmail แบบครบถ้วน 14. ดู Gmail Pub/Sub สำหรับขั้นตอนการ watch ของ Gmail แบบครบถ้วน
Responses¶
200สำหรับ/hooks/wake202สำหรับ/hooks/agent(เริ่มการรันแบบ async แล้ว)401เมื่อการยืนยันตัวตนล้มเหลว400เมื่อ payload ไม่ถูกต้อง413เมื่อ payload มีขนาดใหญ่เกินไป
Examples¶
curl -X POST http://127.0.0.1:18789/hooks/wake \
-H 'Authorization: Bearer SECRET' \
-H 'Content-Type: application/json' \
-d '{"text":"New email received","mode":"now"}'
curl -X POST http://127.0.0.1:18789/hooks/agent \
-H 'x-openclaw-token: SECRET' \
-H 'Content-Type: application/json' \
-d '{"message":"Summarize inbox","name":"Email","wakeMode":"next-heartbeat"}'
Use a different model¶
เพิ่ม model ลงใน payload ของเอเจนต์ (หรือในการแมป) เพื่อแทนที่โมเดลสำหรับการรันนั้น:
curl -X POST http://127.0.0.1:18789/hooks/agent \
-H 'x-openclaw-token: SECRET' \
-H 'Content-Type: application/json' \
-d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.2-mini"}'
หากคุณบังคับใช้ agents.defaults.models โปรดตรวจสอบให้แน่ใจว่าโมเดลที่แทนที่ถูกรวมอยู่ในรายการดังกล่าว
curl -X POST http://127.0.0.1:18789/hooks/gmail \
-H 'Authorization: Bearer SECRET' \
-H 'Content-Type: application/json' \
-d '{"source":"gmail","messages":[{"from":"Ada","subject":"Hello","snippet":"Hi"}]}'
Security¶
- เก็บเอ็นด์พอยต์ hook ไว้หลัง loopback, tailnet หรือรีเวิร์สพร็อกซีที่เชื่อถือได้
- ใช้ hook token เฉพาะ ห้ามนำโทเคนยืนยันตัวตนของ Gateway มาใช้ซ้ำ
- หลีกเลี่ยงการใส่ payload ดิบที่มีข้อมูลอ่อนไหวในล็อกของ webhook
-
- payload ของ hook จะถูกมองว่าไม่น่าเชื่อถือ และถูกห่อด้วยขอบเขตความปลอดภัยตามค่าเริ่มต้น
payload ของ hook จะถูกมองว่าไม่น่าเชื่อถือและถูกห่อด้วยขอบเขตความปลอดภัยตามค่าเริ่มต้น
หากจำเป็นต้องปิดสำหรับ hook เฉพาะ ให้ตั้งค่า
allowUnsafeExternalContent: trueในการแมปของ hook นั้น (อันตราย)
- payload ของ hook จะถูกมองว่าไม่น่าเชื่อถือ และถูกห่อด้วยขอบเขตความปลอดภัยตามค่าเริ่มต้น
payload ของ hook จะถูกมองว่าไม่น่าเชื่อถือและถูกห่อด้วยขอบเขตความปลอดภัยตามค่าเริ่มต้น
หากจำเป็นต้องปิดสำหรับ hook เฉพาะ ให้ตั้งค่า