Gateway
เครื่องมือเรียกใช้ API
Gateway ของ OpenClaw เปิดเผยปลายทาง HTTP สำหรับเรียกใช้เครื่องมือเดียวโดยตรง ปลายทางนี้เปิดใช้งานอยู่เสมอ และใช้การยืนยันตัวตนของ Gateway ร่วมกับนโยบายเครื่องมือ เช่นเดียวกับพื้นผิว /v1/* ที่เข้ากันได้กับ OpenAI การยืนยันตัวตนแบบ bearer ด้วยข้อมูลลับที่ใช้ร่วมกันจะถือว่าเป็นการเข้าถึงโดยผู้ปฏิบัติการที่เชื่อถือได้สำหรับ Gateway ทั้งหมด
POST /tools/invoke- ใช้พอร์ตเดียวกับ Gateway (มัลติเพล็กซ์ WS + HTTP):
http://<gateway-host>:<port>/tools/invoke - ขนาดเนื้อหาคำขอสูงสุดโดยค่าเริ่มต้น: 2 MB
การยืนยันตัวตน
ใช้การกำหนดค่าการยืนยันตัวตนของ Gateway
เส้นทางการยืนยันตัวตน HTTP ที่ใช้ทั่วไป:
- การยืนยันตัวตนด้วยข้อมูลลับที่ใช้ร่วมกัน (
gateway.auth.mode="token"หรือ"password"):Authorization: Bearer <token-or-password> - การยืนยันตัวตน HTTP ที่มีข้อมูลอัตลักษณ์ที่เชื่อถือได้ (
gateway.auth.mode="trusted-proxy"): กำหนดเส้นทางผ่านพร็อกซีที่รับรู้อัตลักษณ์ซึ่งกำหนดค่าไว้ และให้พร็อกซีแทรกส่วนหัวอัตลักษณ์ที่จำเป็น - การเปิดการยืนยันตัวตนบนทางเข้าที่เป็นส่วนตัว (
gateway.auth.mode="none"): ไม่ต้องมีส่วนหัวการยืนยันตัวตน
หมายเหตุ:
mode="token"ใช้gateway.auth.token(หรือOPENCLAW_GATEWAY_TOKEN)mode="password"ใช้gateway.auth.password(หรือOPENCLAW_GATEWAY_PASSWORD)mode="trusted-proxy"กำหนดให้คำขอ HTTP มาจากแหล่งพร็อกซีที่เชื่อถือได้ซึ่งกำหนดค่าไว้ พร็อกซี local loopback บนโฮสต์เดียวกันต้องกำหนดgateway.auth.trustedProxy.allowLoopback = trueอย่างชัดเจน- ผู้เรียกภายในโฮสต์เดียวกันที่ข้ามพร็อกซีสามารถใช้
gateway.auth.password/OPENCLAW_GATEWAY_PASSWORDเป็นทางเลือกสำรองโดยตรงภายในเครื่องได้ แต่หากมีหลักฐานจากส่วนหัวForwarded,X-Forwarded-*หรือX-Real-IPคำขอจะยังคงใช้เส้นทางพร็อกซีที่เชื่อถือได้แทน - หากกำหนดค่า
gateway.auth.rateLimitและเกิดความล้มเหลวในการยืนยันตัวตนมากเกินไป ปลายทางจะส่งคืน429พร้อมRetry-After
ขอบเขตความปลอดภัย (สำคัญ)
ให้ถือว่าปลายทางนี้เป็นพื้นผิวที่มี สิทธิ์การเข้าถึงเต็มรูปแบบของผู้ปฏิบัติการ สำหรับอินสแตนซ์ Gateway
- การยืนยันตัวตนแบบ HTTP bearer ที่นี่ไม่ใช่โมเดลขอบเขตสิทธิ์แบบจำกัดเฉพาะผู้ใช้แต่ละราย
- ควรถือว่าโทเค็น/รหัสผ่าน Gateway ที่ใช้ได้สำหรับปลายทางนี้เป็นข้อมูลรับรองของเจ้าของ/ผู้ปฏิบัติการ
- สำหรับโหมดการยืนยันตัวตนด้วยข้อมูลลับที่ใช้ร่วมกัน (
tokenและpassword) ปลายทางจะคืนค่าขอบเขตสิทธิ์เริ่มต้นแบบเต็มของผู้ปฏิบัติการตามปกติ แม้ว่าผู้เรียกจะส่งส่วนหัวx-openclaw-scopesที่จำกัดกว่า - การยืนยันตัวตนด้วยข้อมูลลับที่ใช้ร่วมกันยังถือว่าการเรียกใช้เครื่องมือโดยตรงบนปลายทางนี้เป็นเทิร์นจากผู้ส่งที่เป็นเจ้าของ
- โหมด HTTP ที่มีข้อมูลอัตลักษณ์ที่เชื่อถือได้ (การยืนยันตัวตนผ่านพร็อกซีที่เชื่อถือได้ หรือ
gateway.auth.mode="none"บนทางเข้าที่เป็นส่วนตัว) จะใช้x-openclaw-scopesหากมี มิฉะนั้นจะใช้ชุดขอบเขตสิทธิ์เริ่มต้นตามปกติของผู้ปฏิบัติการ - ให้ปลายทางนี้อยู่บนลูปแบ็ก/เทลเน็ต/ทางเข้าที่เป็นส่วนตัวเท่านั้น อย่าเปิดเผยโดยตรงสู่อินเทอร์เน็ตสาธารณะ
ตารางการยืนยันตัวตน:
| โหมดการยืนยันตัวตน | ลักษณะการทำงาน |
|---|---|
token หรือ password + Authorization: Bearer ... |
พิสูจน์ว่าครอบครองข้อมูลลับที่ใช้ร่วมกันของผู้ปฏิบัติการ Gateway ไม่สนใจ x-openclaw-scopes ที่จำกัดกว่า คืนค่าชุดขอบเขตสิทธิ์เริ่มต้นแบบเต็มของผู้ปฏิบัติการ ได้แก่ operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write ถือว่าการเรียกใช้เครื่องมือโดยตรงเป็นเทิร์นจากผู้ส่งที่เป็นเจ้าของ |
HTTP ที่มีข้อมูลอัตลักษณ์ที่เชื่อถือได้ (การยืนยันตัวตนผ่านพร็อกซีที่เชื่อถือได้ หรือ mode="none" บนทางเข้าที่เป็นส่วนตัว) |
ยืนยันตัวตนของอัตลักษณ์ภายนอกที่เชื่อถือได้หรือขอบเขตการติดตั้งใช้งาน ใช้ x-openclaw-scopes หากมี และใช้ชุดขอบเขตสิทธิ์เริ่มต้นตามปกติของผู้ปฏิบัติการเมื่อไม่มีส่วนหัวดังกล่าว จะสูญเสียความหมายของการเป็นเจ้าของเฉพาะเมื่อผู้เรียกจำกัดขอบเขตสิทธิ์อย่างชัดเจนและไม่รวม operator.admin เท่านั้น |
เนื้อหาคำขอ
{ "tool": "sessions_list", "action": "json", "args": {}, "sessionKey": "main", "dryRun": false}ฟิลด์:
tool/name(สตริง, จำเป็น): ชื่อเครื่องมือที่จะเรียกใช้nameมีลำดับความสำคัญสูงกว่าหากส่งมาทั้งคู่action(สตริง, ไม่บังคับ): ผสานเข้าในargs.actionหากสคีมาของเครื่องมือรองรับพร็อพเพอร์ตีactionและargsยังไม่ได้กำหนดค่าไว้args(ออบเจ็กต์, ไม่บังคับ): อาร์กิวเมนต์เฉพาะของเครื่องมือsessionKey(สตริง, ไม่บังคับ): คีย์เซสชันเป้าหมาย หากละไว้หรือเป็น"main"Gateway จะใช้คีย์เซสชันหลักที่กำหนดค่าไว้ (ใช้session.mainKeyและเอเจนต์เริ่มต้น หรือglobalในขอบเขตเซสชันส่วนกลาง)agentId(สตริง, ไม่บังคับ): แปลงเป็นคีย์เซสชันสำหรับเอเจนต์นั้น ส่งข้อผิดพลาด400หากขัดแย้งกับsessionKeyที่ระบุไว้อย่างชัดเจนและแมปกับเอเจนต์อื่นอยู่แล้วidempotencyKey(สตริง, ไม่บังคับ): ใช้สร้างรหัสการเรียกเครื่องมือที่คงที่สำหรับการเรียกใช้นี้dryRun(บูลีน, ไม่บังคับ): สงวนไว้สำหรับการใช้งานในอนาคต ปัจจุบันจะถูกละเว้น
ลักษณะการทำงานของนโยบายและการกำหนดเส้นทาง
ความพร้อมใช้งานของเครื่องมือจะถูกกรองผ่านสายโซ่นโยบายเดียวกับที่เอเจนต์ของ Gateway ใช้:
tools.profile/tools.byProvider.profiletools.allow/tools.byProvider.allowagents.<id>.tools.allow/agents.<id>.tools.byProvider.allow- นโยบายกลุ่ม (หากคีย์เซสชันแมปกับกลุ่มหรือช่องทาง)
- นโยบายเอเจนต์ย่อย (เมื่อเรียกใช้ด้วยคีย์เซสชันของเอเจนต์ย่อย)
หากนโยบายไม่อนุญาตเครื่องมือ ปลายทางจะส่งคืน 404
หมายเหตุสำคัญเกี่ยวกับขอบเขต:
- การอนุมัติ
execเป็นมาตรการป้องกันสำหรับผู้ปฏิบัติการ ไม่ใช่ขอบเขตการให้สิทธิ์แยกต่างหากสำหรับปลายทาง HTTP นี้ หากสามารถเข้าถึงเครื่องมือได้ที่นี่ผ่านการยืนยันตัวตนของ Gateway และนโยบายเครื่องมือ/tools/invokeจะไม่เพิ่มข้อความแจ้งขออนุมัติแยกสำหรับแต่ละการเรียก - หากเข้าถึง
execได้ที่นี่ ให้ถือว่าเป็นพื้นผิวเชลล์ที่แก้ไขข้อมูลได้ การปฏิเสธwrite,edit,apply_patchหรือเครื่องมือเขียนระบบไฟล์ผ่าน HTTP ไม่ได้ทำให้การเรียกใช้เชลล์เป็นแบบอ่านอย่างเดียว - อย่าแบ่งปันข้อมูลรับรองแบบ bearer ของ Gateway กับผู้เรียกที่ไม่น่าเชื่อถือ หากต้องการแยกขอบเขตความเชื่อถือ ให้เรียกใช้ Gateway แยกกัน (โดยควรใช้ผู้ใช้ระบบปฏิบัติการ/โฮสต์แยกกัน)
HTTP ของ Gateway ยังใช้รายการปฏิเสธแบบตายตัวโดยค่าเริ่มต้น (แม้ว่านโยบายเซสชันจะอนุญาตเครื่องมือนั้น):
| เครื่องมือ | เหตุผล |
|---|---|
exec |
การเรียกใช้คำสั่งโดยตรง (พื้นผิว RCE) |
spawn |
การสร้างโพรเซสลูกโดยพลการ (พื้นผิว RCE) |
shell |
การเรียกใช้คำสั่งเชลล์ (พื้นผิว RCE) |
fs_write |
การแก้ไขไฟล์บนโฮสต์โดยพลการ |
fs_delete |
การลบไฟล์บนโฮสต์โดยพลการ |
fs_move |
การย้าย/เปลี่ยนชื่อไฟล์บนโฮสต์โดยพลการ |
apply_patch |
การใช้แพตช์สามารถเขียนทับไฟล์ใด ๆ ได้ |
sessions_spawn |
การจัดการเซสชัน การสร้างเอเจนต์จากระยะไกลถือเป็น RCE |
sessions_send |
การแทรกข้อความข้ามเซสชัน |
cron |
ระนาบควบคุมระบบอัตโนมัติแบบถาวร |
gateway |
ระนาบควบคุม Gateway ป้องกันการกำหนดค่าใหม่ผ่าน HTTP |
nodes |
รีเลย์คำสั่ง Node สามารถเข้าถึง system.run บนโฮสต์ที่จับคู่ไว้ |
cron, gateway และ nodes จำกัดเฉพาะเจ้าของด้วยเช่นกัน แม้อยู่นอกรายการปฏิเสธเริ่มต้นนี้ ผู้เรียกที่ไม่ใช่เจ้าของจะไม่สามารถเรียกใช้เครื่องมือเหล่านี้บนพื้นผิวนี้ได้
ปรับแต่งรายการปฏิเสธทั่วไปผ่าน gateway.tools:
{ gateway: { tools: { // Additional tools to block over HTTP /tools/invoke deny: ["browser"], // Remove tools from the default deny list for owner/admin callers allow: ["gateway"], }, },}gateway.tools.allow เป็นการเขียนทับการเปิดเผย ไม่ใช่การยกระดับขอบเขตสิทธิ์ ในโหมด HTTP ที่มีข้อมูลอัตลักษณ์ cron, gateway และ nodes จะยังคงไม่พร้อมใช้งานสำหรับผู้เรียกที่ไม่มีอัตลักษณ์เจ้าของ/ผู้ดูแลระบบ (operator.admin) แม้จะระบุไว้ใน gateway.tools.allow การยืนยันตัวตนแบบ bearer ด้วยข้อมูลลับที่ใช้ร่วมกันยังคงเป็นไปตามกฎผู้ปฏิบัติการที่เชื่อถือได้แบบเต็มตามที่อธิบายไว้ข้างต้น
เพื่อช่วยให้นโยบายกลุ่มแปลงบริบทได้ คุณสามารถกำหนดค่าต่อไปนี้ได้โดยไม่บังคับ:
x-openclaw-message-channel: <channel>(ตัวอย่าง:slack,telegram)x-openclaw-account-id: <accountId>(เมื่อมีหลายบัญชี)x-openclaw-message-to: <target>(เป้าหมายการส่งสำหรับนโยบายเครื่องมือข้อความ)x-openclaw-thread-id: <threadId>(บริบทเธรดสำหรับนโยบายเครื่องมือข้อความ)
การตอบกลับ
| สถานะ | ความหมาย |
|---|---|
200 |
{ ok: true, result } |
400 |
{ ok: false, error: { type, message } } (คำขอไม่ถูกต้องหรือข้อผิดพลาดของอินพุตเครื่องมือ) |
401 |
ไม่ได้รับอนุญาต |
403 |
{ ok: false, error: { type, message, requiresApproval? } } (การเรียกเครื่องมือถูกนโยบายบล็อก) |
404 |
เครื่องมือไม่พร้อมใช้งาน (ไม่พบหรือไม่อยู่ในรายการที่อนุญาต) |
405 |
ไม่อนุญาตให้ใช้เมธอดนี้ |
408 |
หมดเวลาขณะอ่านเนื้อหาคำขอ |
413 |
เนื้อหาคำขอเกินขนาดเพย์โหลดสูงสุด |
429 |
การยืนยันตัวตนถูกจำกัดอัตรา (มีการกำหนด Retry-After) |
500 |
{ ok: false, error: { type, message } } (ข้อผิดพลาดที่ไม่คาดคิดในการเรียกใช้เครื่องมือ ข้อความผ่านการกรองแล้ว) |
ตัวอย่าง
curl -sS http://127.0.0.1:18789/tools/invoke \ -H 'Authorization: Bearer secret' \ -H 'Content-Type: application/json' \ -d '{ "tool": "sessions_list", "action": "json", "args": {} }'