Gateway
Alat memanggil API
Gateway OpenClaw mengekspos endpoint HTTP untuk memanggil satu alat secara langsung. Endpoint ini selalu diaktifkan dan menggunakan autentikasi Gateway beserta kebijakan alat. Seperti permukaan /v1/* yang kompatibel dengan OpenAI, autentikasi bearer dengan rahasia bersama diperlakukan sebagai akses operator tepercaya untuk seluruh gateway.
POST /tools/invoke- Port yang sama dengan Gateway (multipleks WS + HTTP):
http://<gateway-host>:<port>/tools/invoke - Ukuran maksimum default isi permintaan: 2 MB
Autentikasi
Menggunakan konfigurasi autentikasi Gateway.
Jalur autentikasi HTTP yang umum:
- autentikasi rahasia bersama (
gateway.auth.mode="token"atau"password"):Authorization: Bearer <token-or-password> - autentikasi HTTP tepercaya yang membawa identitas (
gateway.auth.mode="trusted-proxy"): rutekan melalui proksi sadar-identitas yang dikonfigurasi dan biarkan proksi tersebut menyisipkan header identitas yang diperlukan - autentikasi terbuka pada ingress privat (
gateway.auth.mode="none"): header autentikasi tidak diperlukan
Catatan:
mode="token"menggunakangateway.auth.token(atauOPENCLAW_GATEWAY_TOKEN).mode="password"menggunakangateway.auth.password(atauOPENCLAW_GATEWAY_PASSWORD).mode="trusted-proxy"mengharuskan permintaan HTTP berasal dari sumber proksi tepercaya yang dikonfigurasi; proksi local loopback pada host yang sama memerlukangateway.auth.trustedProxy.allowLoopback = truesecara eksplisit.- Pemanggil internal pada host yang sama yang melewati proksi dapat menggunakan
gateway.auth.password/OPENCLAW_GATEWAY_PASSWORDsebagai fallback langsung lokal. Adanya bukti headerForwarded,X-Forwarded-*, atauX-Real-IPakan tetap mempertahankan permintaan pada jalur proksi tepercaya. - Jika
gateway.auth.rateLimitdikonfigurasi dan terjadi terlalu banyak kegagalan autentikasi, endpoint mengembalikan429denganRetry-After.
Batas keamanan (penting)
Perlakukan endpoint ini sebagai permukaan dengan akses operator penuh untuk instans gateway.
- Autentikasi bearer HTTP di sini bukan model cakupan sempit per pengguna.
- Token/kata sandi Gateway yang valid untuk endpoint ini harus diperlakukan seperti kredensial pemilik/operator.
- Untuk mode autentikasi rahasia bersama (
tokendanpassword), endpoint memulihkan cakupan default operator penuh yang normal meskipun pemanggil mengirim headerx-openclaw-scopesyang lebih sempit. - Autentikasi rahasia bersama juga memperlakukan pemanggilan alat langsung pada endpoint ini sebagai giliran dari pengirim-pemilik.
- Mode HTTP tepercaya yang membawa identitas (autentikasi proksi tepercaya, atau
gateway.auth.mode="none"pada ingress privat) mematuhix-openclaw-scopesjika tersedia dan jika tidak, kembali ke kumpulan cakupan default operator yang normal. - Pertahankan endpoint ini hanya pada local loopback/tailnet/ingress privat; jangan mengeksposnya secara langsung ke internet publik.
Matriks autentikasi:
| Mode autentikasi | Perilaku |
|---|---|
token atau password + Authorization: Bearer ... |
Membuktikan kepemilikan rahasia operator gateway bersama. Mengabaikan x-openclaw-scopes yang lebih sempit. Memulihkan kumpulan cakupan default operator penuh: operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write. Memperlakukan pemanggilan alat langsung sebagai giliran dari pengirim-pemilik. |
HTTP tepercaya yang membawa identitas (autentikasi proksi tepercaya, atau mode="none" pada ingress privat) |
Mengautentikasi identitas tepercaya eksternal atau batas penerapan. Mematuhi x-openclaw-scopes jika tersedia. Kembali ke kumpulan cakupan default operator yang normal jika header tidak ada. Hanya kehilangan semantik pemilik ketika pemanggil secara eksplisit mempersempit cakupan dan tidak menyertakan operator.admin. |
Isi permintaan
{ "tool": "sessions_list", "action": "json", "args": {}, "sessionKey": "main", "dryRun": false}Bidang:
tool/name(string, wajib): nama alat yang akan dipanggil.namediprioritaskan jika keduanya dikirim.action(string, opsional): digabungkan ke dalamargs.actionjika skema alat mendukung propertiactiondanargsbelum menetapkannya.args(objek, opsional): argumen khusus alat.sessionKey(string, opsional): kunci sesi target. Jika dihilangkan atau"main", Gateway menggunakan kunci sesi utama yang dikonfigurasi (mematuhisession.mainKeydan agen default, atauglobaldalam cakupan sesi global).agentId(string, opsional): menyelesaikan kunci sesi untuk agen tersebut. Menghasilkan kesalahan400jika bertentangan dengansessionKeyeksplisit yang sudah dipetakan ke agen lain.idempotencyKey(string, opsional): digunakan untuk menghasilkan ID pemanggilan alat yang stabil bagi pemanggilan tersebut.dryRun(boolean, opsional): dicadangkan untuk penggunaan mendatang; saat ini diabaikan.
Perilaku kebijakan + perutean
Ketersediaan alat difilter melalui rantai kebijakan yang sama dengan yang digunakan oleh agen Gateway:
tools.profile/tools.byProvider.profiletools.allow/tools.byProvider.allowagents.<id>.tools.allow/agents.<id>.tools.byProvider.allow- kebijakan grup (jika kunci sesi dipetakan ke grup atau kanal)
- kebijakan subagen (ketika memanggil dengan kunci sesi subagen)
Jika suatu alat tidak diizinkan oleh kebijakan, endpoint mengembalikan 404.
Catatan penting tentang batas:
- Persetujuan eksekusi adalah pagar pengaman operator, bukan batas otorisasi terpisah untuk endpoint HTTP ini. Jika suatu alat dapat dijangkau di sini melalui autentikasi Gateway + kebijakan alat,
/tools/invoketidak menambahkan permintaan persetujuan tambahan per panggilan. - Jika
execdapat dijangkau di sini, perlakukan sebagai permukaan shell yang dapat mengubah keadaan. Menolakwrite,edit,apply_patch, atau alat tulis sistem berkas melalui HTTP tidak membuat eksekusi shell menjadi hanya-baca. - Jangan bagikan kredensial bearer Gateway dengan pemanggil yang tidak tepercaya. Jika Anda memerlukan pemisahan lintas batas kepercayaan, jalankan gateway terpisah (idealnya pada pengguna OS/host yang terpisah).
HTTP Gateway juga menerapkan daftar penolakan keras secara default (meskipun kebijakan sesi mengizinkan alat tersebut):
| Alat | Alasan |
|---|---|
exec |
Eksekusi perintah langsung (permukaan RCE) |
spawn |
Pembuatan proses anak arbitrer (permukaan RCE) |
shell |
Eksekusi perintah shell (permukaan RCE) |
fs_write |
Perubahan berkas arbitrer pada host |
fs_delete |
Penghapusan berkas arbitrer pada host |
fs_move |
Pemindahan/penggantian nama berkas arbitrer pada host |
apply_patch |
Penerapan patch dapat menulis ulang berkas arbitrer |
sessions_spawn |
Orkestrasi sesi; membuat agen dari jarak jauh merupakan RCE |
sessions_send |
Penyisipan pesan lintas sesi |
cron |
Bidang kendali otomatisasi persisten |
gateway |
Bidang kendali Gateway; mencegah konfigurasi ulang melalui HTTP |
nodes |
Relai perintah Node dapat menjangkau system.run pada host tertaut |
cron, gateway, dan nodes juga hanya untuk pemilik: bahkan di luar daftar penolakan default ini, pemanggil yang bukan pemilik tidak dapat memanggilnya pada permukaan ini.
Sesuaikan daftar penolakan umum melalui 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 adalah penggantian paparan, bukan peningkatan cakupan. Dalam mode HTTP yang membawa identitas, cron, gateway, dan nodes tetap tidak tersedia bagi pemanggil tanpa identitas pemilik/admin (operator.admin), meskipun tercantum dalam gateway.tools.allow. Autentikasi bearer rahasia bersama tetap mengikuti aturan operator tepercaya penuh di atas.
Untuk membantu kebijakan grup menyelesaikan konteks, Anda dapat menetapkan secara opsional:
x-openclaw-message-channel: <channel>(contoh:slack,telegram)x-openclaw-account-id: <accountId>(ketika terdapat beberapa akun)x-openclaw-message-to: <target>(target pengiriman untuk kebijakan alat pesan)x-openclaw-thread-id: <threadId>(konteks utas untuk kebijakan alat pesan)
Respons
| Status | Arti |
|---|---|
200 |
{ ok: true, result } |
400 |
{ ok: false, error: { type, message } } (permintaan tidak valid atau kesalahan masukan alat) |
401 |
Tidak terotorisasi |
403 |
{ ok: false, error: { type, message, requiresApproval? } } (panggilan alat diblokir oleh kebijakan) |
404 |
Alat tidak tersedia (tidak ditemukan atau tidak masuk daftar izin) |
405 |
Metode tidak diizinkan |
408 |
Waktu pembacaan isi permintaan habis |
413 |
Isi permintaan melebihi ukuran muatan maksimum |
429 |
Autentikasi dibatasi lajunya (Retry-After ditetapkan) |
500 |
{ ok: false, error: { type, message } } (kesalahan eksekusi alat yang tidak terduga; pesan telah disanitasi) |
Contoh
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": {} }'