From 91b4e5a5cc3bbbfc65182a5b93c1da6873a7ac1f Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Mon, 20 Apr 2026 09:35:42 +0000 Subject: [PATCH] chore(i18n): refresh id translations --- docs/id/channels/pairing.md | 102 +- docs/id/channels/telegram.md | 442 +++--- docs/id/channels/troubleshooting.md | 127 +- docs/id/concepts/qa-e2e-automation.md | 195 ++- docs/id/gateway/configuration-reference.md | 1284 ++++++++-------- docs/id/gateway/doctor.md | 458 +++--- docs/id/gateway/index.md | 131 +- docs/id/gateway/troubleshooting.md | 256 ++-- docs/id/help/faq.md | 1560 ++++++++++---------- docs/id/help/testing.md | 607 ++++---- docs/id/help/troubleshooting.md | 212 +-- docs/id/tools/browser.md | 533 +++---- 12 files changed, 3017 insertions(+), 2890 deletions(-) diff --git a/docs/id/channels/pairing.md b/docs/id/channels/pairing.md index 16b145194..130f05f16 100644 --- a/docs/id/channels/pairing.md +++ b/docs/id/channels/pairing.md @@ -1,40 +1,40 @@ --- read_when: - Menyiapkan kontrol akses DM - - Melakukan pairing node iOS/Android baru + - Mem-pairing node iOS/Android baru - Meninjau postur keamanan OpenClaw -summary: 'Ikhtisar pairing: setujui siapa yang dapat mengirimi Anda DM + node mana yang dapat bergabung' +summary: 'Ringkasan pairing: setujui siapa yang dapat mengirimi Anda DM + node mana yang dapat bergabung' title: Pairing x-i18n: - generated_at: "2026-04-05T13:43:46Z" + generated_at: "2026-04-20T09:27:37Z" model: gpt-5.4 provider: openai - source_hash: 2bd99240b3530def23c05a26915d07cf8b730565c2822c6338437f8fb3f285c9 + source_hash: 4161629ead02dc0bdcd283cc125fe6579a579e03740127f4feb22dfe344bd028 source_path: channels/pairing.md workflow: 15 --- # Pairing -“Pairing” adalah langkah **persetujuan pemilik** eksplisit OpenClaw. +“Pairing” adalah langkah **persetujuan pemilik** yang eksplisit di OpenClaw. Ini digunakan di dua tempat: -1. **Pairing DM** (siapa yang diizinkan berbicara dengan bot) -2. **Pairing node** (perangkat/node mana yang diizinkan bergabung ke jaringan gateway) +1. **DM pairing** (siapa yang diizinkan berbicara dengan bot) +2. **Node pairing** (perangkat/node mana yang diizinkan bergabung ke jaringan Gateway) -Konteks keamanan: [Keamanan](/gateway/security) +Konteks keamanan: [Security](/id/gateway/security) -## 1) Pairing DM (akses chat masuk) +## 1) DM pairing (akses chat masuk) -Saat sebuah channel dikonfigurasi dengan kebijakan DM `pairing`, pengirim yang tidak dikenal akan mendapatkan kode singkat dan pesan mereka **tidak diproses** sampai Anda menyetujuinya. +Saat sebuah channel dikonfigurasi dengan kebijakan DM `pairing`, pengirim yang tidak dikenal akan mendapatkan kode singkat dan pesannya **tidak diproses** sampai Anda menyetujuinya. -Kebijakan DM default didokumentasikan di: [Keamanan](/gateway/security) +Kebijakan DM default didokumentasikan di: [Security](/id/gateway/security) Kode pairing: -- 8 karakter, huruf besar, tanpa karakter ambigu (`0O1I`). +- 8 karakter, huruf besar, tanpa karakter yang ambigu (`0O1I`). - **Kedaluwarsa setelah 1 jam**. Bot hanya mengirim pesan pairing saat permintaan baru dibuat (kurang lebih sekali per jam per pengirim). -- Permintaan pairing DM yang tertunda dibatasi maksimal **3 per channel** secara default; permintaan tambahan diabaikan sampai salah satunya kedaluwarsa atau disetujui. +- Permintaan DM pairing yang tertunda dibatasi hingga **3 per channel** secara default; permintaan tambahan diabaikan sampai salah satunya kedaluwarsa atau disetujui. ### Menyetujui pengirim @@ -45,7 +45,7 @@ openclaw pairing approve telegram Channel yang didukung: `bluebubbles`, `discord`, `feishu`, `googlechat`, `imessage`, `irc`, `line`, `matrix`, `mattermost`, `msteams`, `nextcloud-talk`, `nostr`, `openclaw-weixin`, `signal`, `slack`, `synology-chat`, `telegram`, `twitch`, `whatsapp`, `zalo`, `zalouser`. -### Tempat status disimpan +### Lokasi penyimpanan status Disimpan di bawah `~/.openclaw/credentials/`: @@ -56,46 +56,46 @@ Disimpan di bawah `~/.openclaw/credentials/`: Perilaku cakupan akun: -- Akun non-default hanya membaca/menulis file allowlist dalam cakupannya. -- Akun default menggunakan file allowlist tanpa cakupan yang dicakup per channel. +- Akun non-default hanya membaca/menulis file allowlist dengan cakupan akunnya. +- Akun default menggunakan file allowlist tanpa cakupan yang khusus untuk channel tersebut. -Anggap ini sensitif (karena menentukan akses ke asisten Anda). +Anggap ini sensitif (karena mengendalikan akses ke asisten Anda). -Penting: penyimpanan ini untuk akses DM. Otorisasi grup terpisah. -Menyetujui kode pairing DM tidak secara otomatis mengizinkan pengirim tersebut menjalankan perintah grup atau mengontrol bot di grup. Untuk akses grup, konfigurasikan allowlist grup eksplisit milik channel tersebut (misalnya `groupAllowFrom`, `groups`, atau override per grup/per topik tergantung channel). +Penting: penyimpanan ini untuk akses DM. Otorisasi grup bersifat terpisah. +Menyetujui kode DM pairing tidak secara otomatis mengizinkan pengirim tersebut menjalankan perintah grup atau mengendalikan bot di grup. Untuk akses grup, konfigurasikan allowlist grup eksplisit milik channel tersebut (misalnya `groupAllowFrom`, `groups`, atau override per grup/per topik tergantung pada channel). -## 2) Pairing perangkat node (node iOS/Android/macOS/headless) +## 2) Pairing perangkat Node (node iOS/Android/macOS/headless) Node terhubung ke Gateway sebagai **perangkat** dengan `role: node`. Gateway membuat permintaan pairing perangkat yang harus disetujui. -### Pair melalui Telegram (direkomendasikan untuk iOS) +### Pair via Telegram (disarankan untuk iOS) -Jika Anda menggunakan plugin `device-pair`, Anda dapat melakukan pairing perangkat pertama kali sepenuhnya dari Telegram: +Jika Anda menggunakan Plugin `device-pair`, Anda dapat melakukan pairing perangkat pertama kali sepenuhnya dari Telegram: 1. Di Telegram, kirim pesan ke bot Anda: `/pair` -2. Bot membalas dengan dua pesan: pesan instruksi dan pesan **kode penyiapan** terpisah (mudah untuk disalin/ditempel di Telegram). +2. Bot membalas dengan dua pesan: pesan instruksi dan pesan **kode penyiapan** terpisah (mudah disalin/ditempel di Telegram). 3. Di ponsel Anda, buka aplikasi OpenClaw iOS → Settings → Gateway. -4. Tempel kode penyiapan lalu sambungkan. +4. Tempel kode penyiapan dan hubungkan. 5. Kembali ke Telegram: `/pair pending` (tinjau ID permintaan, role, dan scope), lalu setujui. -Kode penyiapan adalah payload JSON terenkripsi base64 yang berisi: +Kode penyiapan adalah payload JSON berkode base64 yang berisi: - `url`: URL WebSocket Gateway (`ws://...` atau `wss://...`) -- `bootstrapToken`: token bootstrap satu perangkat yang berumur pendek dan digunakan untuk handshake pairing awal +- `bootstrapToken`: token bootstrap satu perangkat berumur singkat yang digunakan untuk handshake pairing awal Token bootstrap tersebut membawa profil bootstrap pairing bawaan: - token `node` utama yang diserahkan tetap `scopes: []` -- token `operator` yang diserahkan tetap dibatasi ke allowlist bootstrap: +- token `operator` yang diserahkan tetap dibatasi ke bootstrap allowlist: `operator.approvals`, `operator.read`, `operator.talk.secrets`, `operator.write` -- pemeriksaan scope bootstrap diberi awalan role, bukan satu kumpulan scope datar: +- pemeriksaan scope bootstrap menggunakan prefiks role, bukan satu kumpulan scope datar: entri scope operator hanya memenuhi permintaan operator, dan role non-operator - tetap harus meminta scope di bawah awalan role mereka sendiri + tetap harus meminta scope di bawah prefiks role mereka sendiri Perlakukan kode penyiapan seperti kata sandi selama masih berlaku. -### Menyetujui perangkat node +### Menyetujui perangkat Node ```bash openclaw devices list @@ -103,34 +103,40 @@ openclaw devices approve openclaw devices reject ``` -Jika perangkat yang sama mencoba lagi dengan detail autentikasi berbeda (misalnya +Jika perangkat yang sama mencoba lagi dengan detail autentikasi yang berbeda (misalnya role/scope/public key yang berbeda), permintaan tertunda sebelumnya akan digantikan dan `requestId` baru akan dibuat. -### Penyimpanan status pairing node +Penting: perangkat yang sudah di-pairing tidak akan diam-diam mendapatkan akses yang lebih luas. Jika perangkat itu +terhubung kembali dengan meminta scope lebih banyak atau role yang lebih luas, OpenClaw mempertahankan +persetujuan yang ada sebagaimana adanya dan membuat permintaan upgrade tertunda yang baru. Gunakan +`openclaw devices list` untuk membandingkan akses yang saat ini disetujui dengan akses yang baru +diminta sebelum Anda menyetujuinya. + +### Penyimpanan status Node pairing Disimpan di bawah `~/.openclaw/devices/`: -- `pending.json` (berumur pendek; permintaan tertunda akan kedaluwarsa) -- `paired.json` (perangkat yang sudah dipairing + token) +- `pending.json` (berumur singkat; permintaan tertunda akan kedaluwarsa) +- `paired.json` (perangkat yang sudah di-pairing + token) ### Catatan - API `node.pair.*` lama (CLI: `openclaw nodes pending|approve|reject|rename`) adalah - penyimpanan pairing terpisah milik gateway. Node WS tetap memerlukan pairing perangkat. -- Rekaman pairing adalah sumber kebenaran tahan lama untuk role yang disetujui. Token - perangkat aktif tetap dibatasi ke kumpulan role yang disetujui tersebut; entri token - liar di luar role yang disetujui tidak menciptakan akses baru. + penyimpanan pairing terpisah yang dimiliki Gateway. Node WS tetap memerlukan pairing perangkat. +- Catatan pairing adalah sumber kebenaran yang tahan lama untuk role yang disetujui. Token perangkat yang aktif + tetap dibatasi pada kumpulan role yang disetujui tersebut; entri token liar + di luar role yang disetujui tidak menciptakan akses baru. -## Dokumen terkait +## Dokumentasi terkait -- Model keamanan + prompt injection: [Keamanan](/gateway/security) -- Memperbarui dengan aman (jalankan doctor): [Memperbarui](/install/updating) +- Model keamanan + prompt injection: [Security](/id/gateway/security) +- Memperbarui dengan aman (jalankan doctor): [Updating](/id/install/updating) - Konfigurasi channel: - - Telegram: [Telegram](/channels/telegram) - - WhatsApp: [WhatsApp](/channels/whatsapp) - - Signal: [Signal](/channels/signal) - - BlueBubbles (iMessage): [BlueBubbles](/channels/bluebubbles) - - iMessage (lama): [iMessage](/channels/imessage) - - Discord: [Discord](/channels/discord) - - Slack: [Slack](/channels/slack) + - Telegram: [Telegram](/id/channels/telegram) + - WhatsApp: [WhatsApp](/id/channels/whatsapp) + - Signal: [Signal](/id/channels/signal) + - BlueBubbles (iMessage): [BlueBubbles](/id/channels/bluebubbles) + - iMessage (legacy): [iMessage](/id/channels/imessage) + - Discord: [Discord](/id/channels/discord) + - Slack: [Slack](/id/channels/slack) diff --git a/docs/id/channels/telegram.md b/docs/id/channels/telegram.md index 3732b7a29..f695a00be 100644 --- a/docs/id/channels/telegram.md +++ b/docs/id/channels/telegram.md @@ -1,13 +1,13 @@ --- read_when: - - Sedang mengerjakan fitur Telegram atau webhook + - Mengerjakan fitur Telegram atau Webhook summary: Status dukungan bot Telegram, kemampuan, dan konfigurasi title: Telegram x-i18n: - generated_at: "2026-04-05T13:52:08Z" + generated_at: "2026-04-20T09:27:34Z" model: gpt-5.4 provider: openai - source_hash: 39fbf328375fbc5d08ec2e3eed58b19ee0afa102010ecbc02e074a310ced157e + source_hash: b9903fae98bca0c345aa86d5c29015539c375442524a34d26bd28181470b8477 source_path: channels/telegram.md workflow: 15 --- @@ -17,13 +17,13 @@ x-i18n: Status: siap produksi untuk DM bot + grup melalui grammY. Long polling adalah mode default; mode webhook bersifat opsional. - - Kebijakan DM default untuk Telegram adalah pairing. + + Kebijakan DM default untuk Telegram adalah pemasangan. - Diagnostik lintas-channel dan panduan perbaikan. + Diagnostik lintas channel dan playbook perbaikan. - + Pola dan contoh konfigurasi channel lengkap. @@ -32,9 +32,9 @@ Status: siap produksi untuk DM bot + grup melalui grammY. Long polling adalah mo - Buka Telegram dan chat dengan **@BotFather** (pastikan handle-nya persis `@BotFather`). + Buka Telegram dan chat dengan **@BotFather** (pastikan handle-nya tepat `@BotFather`). - Jalankan `/newbot`, ikuti petunjuknya, lalu simpan token-nya. + Jalankan `/newbot`, ikuti petunjuk, lalu simpan tokennya. @@ -54,11 +54,11 @@ Status: siap produksi untuk DM bot + grup melalui grammY. Long polling adalah mo ``` Fallback env: `TELEGRAM_BOT_TOKEN=...` (hanya akun default). - Telegram **tidak** menggunakan `openclaw channels login telegram`; konfigurasikan token di config/env, lalu mulai gateway. + Telegram **tidak** menggunakan `openclaw channels login telegram`; konfigurasikan token di config/env, lalu jalankan gateway. - + ```bash openclaw gateway @@ -66,7 +66,7 @@ openclaw pairing list telegram openclaw pairing approve telegram ``` - Kode pairing kedaluwarsa setelah 1 jam. + Kode pemasangan kedaluwarsa setelah 1 jam. @@ -76,26 +76,26 @@ openclaw pairing approve telegram -Urutan resolusi token memperhitungkan akun. Dalam praktiknya, nilai config lebih diutamakan daripada fallback env, dan `TELEGRAM_BOT_TOKEN` hanya berlaku untuk akun default. +Urutan resolusi token bersifat sadar-akun. Dalam praktiknya, nilai config mengalahkan fallback env, dan `TELEGRAM_BOT_TOKEN` hanya berlaku untuk akun default. -## Pengaturan di sisi Telegram +## Pengaturan sisi Telegram Bot Telegram secara default menggunakan **Privacy Mode**, yang membatasi pesan grup yang mereka terima. - Jika bot harus dapat melihat semua pesan grup, lakukan salah satu dari berikut ini: + Jika bot harus melihat semua pesan grup, lakukan salah satu dari berikut: - - nonaktifkan privacy mode melalui `/setprivacy`, atau + - nonaktifkan mode privasi melalui `/setprivacy`, atau - jadikan bot sebagai admin grup. - Saat mengubah privacy mode, keluarkan lalu tambahkan kembali bot di setiap grup agar Telegram menerapkan perubahan tersebut. + Saat mengubah mode privasi, hapus lalu tambahkan kembali bot di setiap grup agar Telegram menerapkan perubahan tersebut. - Status admin dikendalikan dalam pengaturan grup Telegram. + Status admin dikendalikan di pengaturan grup Telegram. Bot admin menerima semua pesan grup, yang berguna untuk perilaku grup yang selalu aktif. @@ -117,20 +117,20 @@ Urutan resolusi token memperhitungkan akun. Dalam praktiknya, nilai config lebih - `pairing` (default) - `allowlist` (memerlukan setidaknya satu ID pengirim di `allowFrom`) - - `open` (mengharuskan `allowFrom` menyertakan `"*"`) + - `open` (memerlukan `allowFrom` untuk menyertakan `"*"`) - `disabled` - `channels.telegram.allowFrom` menerima ID pengguna Telegram numerik. Prefiks `telegram:` / `tg:` diterima dan dinormalisasi. + `channels.telegram.allowFrom` menerima ID pengguna Telegram numerik. Awalan `telegram:` / `tg:` diterima dan dinormalisasi. `dmPolicy: "allowlist"` dengan `allowFrom` kosong memblokir semua DM dan ditolak oleh validasi config. - Onboarding menerima input `@username` dan meresolusikannya ke ID numerik. - Jika Anda melakukan upgrade dan config Anda berisi entri allowlist `@username`, jalankan `openclaw doctor --fix` untuk meresolusikannya (best-effort; memerlukan token bot Telegram). + Penyiapan meminta hanya ID pengguna numerik. + Jika Anda melakukan upgrade dan config Anda berisi entri allowlist `@username`, jalankan `openclaw doctor --fix` untuk menyelesaikannya (upaya terbaik; memerlukan token bot Telegram). Jika sebelumnya Anda mengandalkan file allowlist pairing-store, `openclaw doctor --fix` dapat memulihkan entri ke `channels.telegram.allowFrom` dalam alur allowlist (misalnya saat `dmPolicy: "allowlist"` belum memiliki ID eksplisit). - Untuk bot dengan satu pemilik, gunakan `dmPolicy: "allowlist"` dengan ID `allowFrom` numerik yang eksplisit agar kebijakan akses tetap tahan lama di config (alih-alih bergantung pada persetujuan pairing sebelumnya). + Untuk bot dengan satu pemilik, gunakan `dmPolicy: "allowlist"` dengan ID `allowFrom` numerik yang eksplisit agar kebijakan akses tetap bertahan di config (alih-alih bergantung pada persetujuan pemasangan sebelumnya). - Kebingungan umum: persetujuan pairing DM tidak berarti "pengirim ini diotorisasi di mana saja". - Pairing hanya memberikan akses DM. Otorisasi pengirim grup tetap berasal dari allowlist config yang eksplisit. - Jika Anda ingin "saya diotorisasi sekali lalu baik DM maupun perintah grup berfungsi", masukkan ID pengguna Telegram numerik Anda ke `channels.telegram.allowFrom`. + Kebingungan yang umum: persetujuan pemasangan DM tidak berarti "pengirim ini diotorisasi di mana saja". + Pemasangan hanya memberikan akses DM. Otorisasi pengirim grup tetap berasal dari allowlist config yang eksplisit. + Jika Anda ingin "saya diotorisasi sekali dan DM maupun perintah grup sama-sama berfungsi", masukkan ID pengguna Telegram numerik Anda ke `channels.telegram.allowFrom`. ### Menemukan ID pengguna Telegram Anda @@ -151,7 +151,7 @@ curl "https://api.telegram.org/bot/getUpdates" - Dua kontrol diterapkan bersamaan: + Dua kontrol berlaku bersamaan: 1. **Grup mana yang diizinkan** (`channels.telegram.groups`) - tanpa config `groups`: @@ -159,20 +159,20 @@ curl "https://api.telegram.org/bot/getUpdates" - dengan `groupPolicy: "allowlist"` (default): grup diblokir sampai Anda menambahkan entri `groups` (atau `"*"`) - `groups` dikonfigurasi: bertindak sebagai allowlist (ID eksplisit atau `"*"`) - 2. **Pengirim mana yang diizinkan di grup** (`channels.telegram.groupPolicy`) + 2. **Pengirim mana yang diizinkan dalam grup** (`channels.telegram.groupPolicy`) - `open` - `allowlist` (default) - `disabled` - `groupAllowFrom` digunakan untuk pemfilteran pengirim grup. Jika tidak diatur, Telegram akan fallback ke `allowFrom`. - Entri `groupAllowFrom` harus berupa ID pengguna Telegram numerik (prefiks `telegram:` / `tg:` dinormalisasi). - Jangan masukkan ID chat grup atau supergroup Telegram ke dalam `groupAllowFrom`. ID chat negatif harus ditempatkan di bawah `channels.telegram.groups`. + `groupAllowFrom` digunakan untuk pemfilteran pengirim grup. Jika tidak diatur, Telegram akan menggunakan fallback ke `allowFrom`. + Entri `groupAllowFrom` harus berupa ID pengguna Telegram numerik (awalan `telegram:` / `tg:` dinormalisasi). + Jangan letakkan ID chat grup atau supergrup Telegram di `groupAllowFrom`. ID chat negatif harus ditempatkan di bawah `channels.telegram.groups`. Entri non-numerik diabaikan untuk otorisasi pengirim. - Batas keamanan (`2026.2.25+`): auth pengirim grup **tidak** mewarisi persetujuan pairing-store DM. - Pairing tetap hanya untuk DM. Untuk grup, atur `groupAllowFrom` atau `allowFrom` per-grup/per-topik. - Jika `groupAllowFrom` tidak diatur, Telegram fallback ke config `allowFrom`, bukan pairing store. - Pola praktis untuk bot satu pemilik: atur ID pengguna Anda di `channels.telegram.allowFrom`, biarkan `groupAllowFrom` tidak diatur, dan izinkan grup target di bawah `channels.telegram.groups`. - Catatan runtime: jika `channels.telegram` sama sekali tidak ada, default runtime adalah fail-closed `groupPolicy="allowlist"` kecuali `channels.defaults.groupPolicy` diatur secara eksplisit. + Batas keamanan (`2026.2.25+`): autentikasi pengirim grup **tidak** mewarisi persetujuan pairing-store DM. + Pemasangan tetap hanya untuk DM. Untuk grup, atur `groupAllowFrom` atau `allowFrom` per grup/per topik. + Jika `groupAllowFrom` tidak diatur, Telegram akan menggunakan fallback ke config `allowFrom`, bukan pairing store. + Pola praktis untuk bot dengan satu pemilik: atur ID pengguna Anda di `channels.telegram.allowFrom`, biarkan `groupAllowFrom` tidak diatur, dan izinkan grup target di `channels.telegram.groups`. + Catatan runtime: jika `channels.telegram` benar-benar tidak ada, default runtime adalah fail-closed `groupPolicy="allowlist"` kecuali `channels.defaults.groupPolicy` diatur secara eksplisit. Contoh: izinkan anggota mana pun di satu grup tertentu: @@ -211,9 +211,9 @@ curl "https://api.telegram.org/bot/getUpdates" Kesalahan umum: `groupAllowFrom` bukan allowlist grup Telegram. - - Tempatkan ID chat grup atau supergroup Telegram negatif seperti `-1001234567890` di bawah `channels.telegram.groups`. - - Tempatkan ID pengguna Telegram seperti `8734062810` di bawah `groupAllowFrom` saat Anda ingin membatasi orang mana di dalam grup yang diizinkan dapat memicu bot. - - Gunakan `groupAllowFrom: ["*"]` hanya ketika Anda ingin anggota mana pun dari grup yang diizinkan dapat berbicara dengan bot. + - Letakkan ID grup atau supergrup Telegram negatif seperti `-1001234567890` di bawah `channels.telegram.groups`. + - Letakkan ID pengguna Telegram seperti `8734062810` di bawah `groupAllowFrom` saat Anda ingin membatasi orang mana di dalam grup yang diizinkan yang dapat memicu bot. + - Gunakan `groupAllowFrom: ["*"]` hanya jika Anda ingin anggota mana pun dari grup yang diizinkan dapat berbicara dengan bot. @@ -233,7 +233,7 @@ curl "https://api.telegram.org/bot/getUpdates" - `/activation always` - `/activation mention` - Ini hanya memperbarui state sesi. Gunakan config untuk persistensi. + Ini hanya memperbarui status sesi. Gunakan config untuk persistensi. Contoh config persisten: @@ -253,7 +253,7 @@ curl "https://api.telegram.org/bot/getUpdates" - teruskan pesan grup ke `@userinfobot` / `@getidsbot` - atau baca `chat.id` dari `openclaw logs --follow` - - atau periksa `getUpdates` Bot API + - atau periksa Bot API `getUpdates` @@ -261,59 +261,59 @@ curl "https://api.telegram.org/bot/getUpdates" ## Perilaku runtime - Telegram dimiliki oleh proses gateway. -- Routing bersifat deterministik: balasan inbound Telegram kembali ke Telegram (model tidak memilih channel). -- Pesan inbound dinormalisasi ke envelope channel bersama dengan metadata balasan dan placeholder media. +- Routing bersifat deterministik: balasan masuk dari Telegram akan dibalas kembali ke Telegram (model tidak memilih channel). +- Pesan masuk dinormalisasi ke shared channel envelope dengan metadata balasan dan placeholder media. - Sesi grup diisolasi berdasarkan ID grup. Topik forum menambahkan `:topic:` agar topik tetap terisolasi. -- Pesan DM dapat membawa `message_thread_id`; OpenClaw merutekannya dengan kunci sesi yang sadar thread dan mempertahankan ID thread untuk balasan. -- Long polling menggunakan grammY runner dengan pengurutan per-chat/per-thread. Sink runner secara keseluruhan menggunakan konkurensi `agents.defaults.maxConcurrent`. +- Pesan DM dapat membawa `message_thread_id`; OpenClaw merutekannya dengan kunci sesi yang sadar-thread dan mempertahankan ID thread untuk balasan. +- Long polling menggunakan grammY runner dengan pengurutan per-chat/per-thread. Konkurensi sink runner secara keseluruhan menggunakan `agents.defaults.maxConcurrent`. - Telegram Bot API tidak memiliki dukungan tanda terima baca (`sendReadReceipts` tidak berlaku). ## Referensi fitur - + OpenClaw dapat melakukan streaming balasan parsial secara real time: - chat langsung: pesan pratinjau + `editMessageText` - grup/topik: pesan pratinjau + `editMessageText` - Syarat: + Persyaratan: - `channels.telegram.streaming` adalah `off | partial | block | progress` (default: `partial`) - - `progress` dipetakan ke `partial` di Telegram (kompatibel dengan penamaan lintas-channel) - - nilai lama `channels.telegram.streamMode` dan nilai boolean `streaming` dipetakan otomatis + - `progress` dipetakan ke `partial` di Telegram (kompatibel dengan penamaan lintas channel) + - nilai legacy `channels.telegram.streamMode` dan boolean `streaming` dipetakan secara otomatis - Untuk balasan teks saja: + Untuk balasan hanya teks: - - DM: OpenClaw mempertahankan pesan pratinjau yang sama dan melakukan edit final di tempatnya (tanpa pesan kedua) - - grup/topik: OpenClaw mempertahankan pesan pratinjau yang sama dan melakukan edit final di tempatnya (tanpa pesan kedua) + - DM: OpenClaw mempertahankan pesan pratinjau yang sama dan melakukan edit final di tempat (tanpa pesan kedua) + - grup/topik: OpenClaw mempertahankan pesan pratinjau yang sama dan melakukan edit final di tempat (tanpa pesan kedua) - Untuk balasan kompleks (misalnya payload media), OpenClaw fallback ke pengiriman final normal lalu membersihkan pesan pratinjau. + Untuk balasan kompleks (misalnya payload media), OpenClaw menggunakan fallback ke pengiriman final normal lalu membersihkan pesan pratinjau. - Preview streaming terpisah dari block streaming. Saat block streaming diaktifkan secara eksplisit untuk Telegram, OpenClaw melewati preview stream untuk menghindari double-streaming. + Streaming pratinjau terpisah dari block streaming. Saat block streaming diaktifkan secara eksplisit untuk Telegram, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda. - Jika transport draf native tidak tersedia/ditolak, OpenClaw otomatis fallback ke `sendMessage` + `editMessageText`. + Jika transport draf native tidak tersedia/ditolak, OpenClaw secara otomatis menggunakan fallback ke `sendMessage` + `editMessageText`. - Streaming reasoning khusus Telegram: + Stream reasoning khusus Telegram: - - `/reasoning stream` mengirim reasoning ke pratinjau live saat sedang menghasilkan + - `/reasoning stream` mengirim reasoning ke pratinjau langsung selama proses generasi - jawaban final dikirim tanpa teks reasoning - Teks outbound menggunakan Telegram `parse_mode: "HTML"`. + Teks keluar menggunakan Telegram `parse_mode: "HTML"`. - Teks bergaya Markdown dirender menjadi HTML aman untuk Telegram. - - HTML model mentah di-escape untuk mengurangi kegagalan parse Telegram. - - Jika Telegram menolak HTML yang telah diparse, OpenClaw mencoba ulang sebagai teks biasa. + - HTML mentah dari model di-escape untuk mengurangi kegagalan parse Telegram. + - Jika Telegram menolak HTML yang di-parse, OpenClaw mencoba lagi sebagai teks biasa. - Pratinjau tautan aktif secara default dan dapat dinonaktifkan dengan `channels.telegram.linkPreview: false`. + Pratinjau tautan diaktifkan secara default dan dapat dinonaktifkan dengan `channels.telegram.linkPreview: false`. - Registrasi menu perintah Telegram ditangani saat startup dengan `setMyCommands`. + Pendaftaran menu perintah Telegram ditangani saat startup dengan `setMyCommands`. Default perintah native: @@ -326,8 +326,8 @@ curl "https://api.telegram.org/bot/getUpdates" channels: { telegram: { customCommands: [ - { command: "backup", description: "Git backup" }, - { command: "generate", description: "Create an image" }, + { command: "backup", description: "Cadangan Git" }, + { command: "generate", description: "Buat gambar" }, ], }, }, @@ -339,42 +339,42 @@ curl "https://api.telegram.org/bot/getUpdates" - nama dinormalisasi (hapus `/` di depan, huruf kecil) - pola valid: `a-z`, `0-9`, `_`, panjang `1..32` - perintah kustom tidak dapat menimpa perintah native - - konflik/duplikasi dilewati dan dicatat di log + - konflik/duplikat dilewati dan dicatat ke log Catatan: - - perintah kustom hanya entri menu; tidak otomatis mengimplementasikan perilaku - - perintah plugin/skill tetap dapat berfungsi saat diketik meskipun tidak ditampilkan di menu Telegram + - perintah kustom hanyalah entri menu; mereka tidak otomatis mengimplementasikan perilaku + - perintah plugin/Skills tetap dapat berfungsi saat diketik meskipun tidak ditampilkan di menu Telegram Jika perintah native dinonaktifkan, built-in akan dihapus. Perintah kustom/plugin mungkin tetap terdaftar jika dikonfigurasi. - Kegagalan penyiapan umum: + Kegagalan penyiapan yang umum: - - `setMyCommands failed` dengan `BOT_COMMANDS_TOO_MUCH` berarti menu Telegram masih meluap setelah dipangkas; kurangi perintah plugin/skill/kustom atau nonaktifkan `channels.telegram.commands.native`. - - `setMyCommands failed` dengan kesalahan jaringan/fetch biasanya berarti DNS/HTTPS outbound ke `api.telegram.org` diblokir. + - `setMyCommands failed` dengan `BOT_COMMANDS_TOO_MUCH` berarti menu Telegram tetap meluap setelah dipangkas; kurangi perintah plugin/Skills/kustom atau nonaktifkan `channels.telegram.commands.native`. + - `setMyCommands failed` dengan error jaringan/fetch biasanya berarti DNS/HTTPS keluar ke `api.telegram.org` diblokir. - ### Perintah pairing perangkat (plugin `device-pair`) + ### Perintah pemasangan perangkat (plugin `device-pair`) Saat plugin `device-pair` terpasang: 1. `/pair` menghasilkan kode penyiapan - 2. tempelkan kode di aplikasi iOS - 3. `/pair pending` mencantumkan permintaan yang tertunda (termasuk role/scopes) - 4. setujui permintaannya: + 2. tempel kode di aplikasi iOS + 3. `/pair pending` menampilkan permintaan yang tertunda (termasuk peran/scope) + 4. setujui permintaan: - `/pair approve ` untuk persetujuan eksplisit - - `/pair approve` saat hanya ada satu permintaan tertunda + - `/pair approve` saat hanya ada satu permintaan yang tertunda - `/pair approve latest` untuk yang paling baru - Kode penyiapan membawa token bootstrap berumur pendek. Built-in bootstrap handoff menjaga token node utama pada `scopes: []`; token operator apa pun yang diserahkan tetap dibatasi pada `operator.approvals`, `operator.read`, `operator.talk.secrets`, dan `operator.write`. Pemeriksaan scope bootstrap berawalan role, sehingga allowlist operator tersebut hanya memenuhi permintaan operator; role non-operator tetap memerlukan scope di bawah prefiks role mereka sendiri. + Kode penyiapan membawa token bootstrap berumur pendek. Built-in bootstrap handoff menjaga token Node utama tetap pada `scopes: []`; token operator yang diserahkan tetap dibatasi pada `operator.approvals`, `operator.read`, `operator.talk.secrets`, dan `operator.write`. Pemeriksaan scope bootstrap menggunakan awalan peran, sehingga allowlist operator tersebut hanya memenuhi permintaan operator; peran non-operator tetap memerlukan scope di bawah awalan perannya sendiri. - Jika perangkat mencoba lagi dengan detail auth yang berubah (misalnya role/scopes/public key), permintaan tertunda sebelumnya akan digantikan dan permintaan baru menggunakan `requestId` yang berbeda. Jalankan kembali `/pair pending` sebelum menyetujui. + Jika sebuah perangkat mencoba lagi dengan detail auth yang berubah (misalnya peran/scope/kunci publik), permintaan tertunda sebelumnya akan digantikan dan permintaan baru menggunakan `requestId` yang berbeda. Jalankan kembali `/pair pending` sebelum menyetujui. - Detail selengkapnya: [Pairing](/id/channels/pairing#pair-via-telegram-recommended-for-ios). + Detail lebih lanjut: [Pemasangan](/id/channels/pairing#pair-via-telegram-recommended-for-ios). - Konfigurasikan cakupan keyboard inline: + Konfigurasikan scope keyboard inline: ```json5 { @@ -406,7 +406,7 @@ curl "https://api.telegram.org/bot/getUpdates" } ``` - Cakupan: + Scope: - `off` - `dm` @@ -414,7 +414,7 @@ curl "https://api.telegram.org/bot/getUpdates" - `all` - `allowlist` (default) - `capabilities: ["inlineButtons"]` lama dipetakan ke `inlineButtons: "all"`. + Legacy `capabilities: ["inlineButtons"]` dipetakan ke `inlineButtons: "all"`. Contoh aksi pesan: @@ -423,23 +423,23 @@ curl "https://api.telegram.org/bot/getUpdates" action: "send", channel: "telegram", to: "123456789", - message: "Choose an option:", + message: "Pilih satu opsi:", buttons: [ [ - { text: "Yes", callback_data: "yes" }, - { text: "No", callback_data: "no" }, + { text: "Ya", callback_data: "yes" }, + { text: "Tidak", callback_data: "no" }, ], - [{ text: "Cancel", callback_data: "cancel" }], + [{ text: "Batal", callback_data: "cancel" }], ], } ``` - Klik callback diteruskan ke agent sebagai teks: + Klik callback diteruskan ke agen sebagai teks: `callback_data: ` - + Aksi tool Telegram meliputi: - `sendMessage` (`to`, `content`, opsional `mediaUrl`, `replyToMessageId`, `messageThreadId`) @@ -448,44 +448,44 @@ curl "https://api.telegram.org/bot/getUpdates" - `editMessage` (`chatId`, `messageId`, `content`) - `createForumTopic` (`chatId`, `name`, opsional `iconColor`, `iconCustomEmojiId`) - Aksi pesan channel menyediakan alias ergonomis (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`). + Aksi pesan channel menyediakan alias yang ergonomis (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`). Kontrol gating: - `channels.telegram.actions.sendMessage` - `channels.telegram.actions.deleteMessage` - `channels.telegram.actions.reactions` - - `channels.telegram.actions.sticker` (default: dinonaktifkan) + - `channels.telegram.actions.sticker` (default: disabled) Catatan: `edit` dan `topic-create` saat ini diaktifkan secara default dan tidak memiliki toggle `channels.telegram.actions.*` terpisah. - Pengiriman runtime menggunakan snapshot config/secret yang aktif (startup/reload), sehingga jalur aksi tidak melakukan resolusi ulang SecretRef ad-hoc untuk setiap pengiriman. + Pengiriman runtime menggunakan snapshot config/secret yang aktif (startup/reload), sehingga jalur aksi tidak melakukan resolusi ulang SecretRef ad-hoc per pengiriman. - Semantik penghapusan reaction: [/tools/reactions](/tools/reactions) + Semantik penghapusan reaction: [/tools/reactions](/id/tools/reactions) - - Telegram mendukung tag reply threading eksplisit dalam output yang dihasilkan: + + Telegram mendukung tag threading balasan eksplisit dalam output yang dihasilkan: - `[[reply_to_current]]` membalas pesan yang memicu - `[[reply_to:]]` membalas ID pesan Telegram tertentu - `channels.telegram.replyToMode` mengontrol penanganannya: + `channels.telegram.replyToMode` mengontrol penanganan: - `off` (default) - `first` - `all` - Catatan: `off` menonaktifkan reply threading implisit. Tag `[[reply_to_*]]` eksplisit tetap dihormati. + Catatan: `off` menonaktifkan threading balasan implisit. Tag `[[reply_to_*]]` yang eksplisit tetap dipatuhi. - Supergroup forum: + Supergrup forum: - kunci sesi topik menambahkan `:topic:` - - balasan dan typing menargetkan thread topik - - jalur config topik: + - balasan dan indikator mengetik menargetkan thread topik + - path config topik: `channels.telegram.groups..topics.` Kasus khusus topik umum (`threadId=1`): @@ -494,9 +494,9 @@ curl "https://api.telegram.org/bot/getUpdates" - aksi mengetik tetap menyertakan `message_thread_id` Pewarisan topik: entri topik mewarisi pengaturan grup kecuali dioverride (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`). - `agentId` hanya untuk topik dan tidak mewarisi dari default grup. + `agentId` khusus topik dan tidak mewarisi dari default grup. - **Routing agent per-topik**: Setiap topik dapat dirutekan ke agent yang berbeda dengan menetapkan `agentId` di config topik. Ini memberi setiap topik workspace, memori, dan sesi terisolasi sendiri. Contoh: + **Routing agen per topik**: Setiap topik dapat merutekan ke agen yang berbeda dengan mengatur `agentId` di config topik. Ini memberi setiap topik workspace, memori, dan sesi terisolasi sendiri. Contoh: ```json5 { @@ -505,9 +505,9 @@ curl "https://api.telegram.org/bot/getUpdates" groups: { "-1001234567890": { topics: { - "1": { agentId: "main" }, // Topik umum → agent utama - "3": { agentId: "zu" }, // Topik dev → agent zu - "5": { agentId: "coder" } // Review kode → agent coder + "1": { agentId: "main" }, // Topik umum → agen utama + "3": { agentId: "zu" }, // Topik dev → agen zu + "5": { agentId: "coder" } // Tinjauan kode → agen coder } } } @@ -516,7 +516,7 @@ curl "https://api.telegram.org/bot/getUpdates" } ``` - Setiap topik kemudian memiliki kunci sesi sendiri: `agent:zu:telegram:group:-1001234567890:topic:3` + Setiap topik lalu memiliki kunci sesinya sendiri: `agent:zu:telegram:group:-1001234567890:topic:3` **Binding topik ACP persisten**: Topik forum dapat menyematkan sesi harness ACP melalui binding ACP bertipe tingkat atas: @@ -569,33 +569,33 @@ curl "https://api.telegram.org/bot/getUpdates" } ``` - Ini saat ini dibatasi untuk topik forum di grup dan supergroup. + Ini saat ini dibatasi pada topik forum di grup dan supergrup. - **Spawn ACP terikat thread dari chat**: + **Spawn ACP yang terikat thread dari chat**: - - `/acp spawn --thread here|auto` dapat membinding topik Telegram saat ini ke sesi ACP baru. + - `/acp spawn --thread here|auto` dapat mengikat topik Telegram saat ini ke sesi ACP baru. - Pesan topik lanjutan dirutekan langsung ke sesi ACP yang terikat (tidak perlu `/acp steer`). - OpenClaw menyematkan pesan konfirmasi spawn di dalam topik setelah binding berhasil. - Memerlukan `channels.telegram.threadBindings.spawnAcpSessions=true`. - Konteks template meliputi: + Konteks template mencakup: - `MessageThreadId` - `IsForum` Perilaku thread DM: - - chat privat dengan `message_thread_id` tetap menggunakan routing DM tetapi memakai kunci sesi/target balasan yang sadar thread. + - chat privat dengan `message_thread_id` tetap menggunakan routing DM tetapi memakai kunci sesi/target balasan yang sadar-thread. ### Pesan audio - Telegram membedakan voice note dan file audio. + Telegram membedakan catatan suara dan file audio. - default: perilaku file audio - - tag `[[audio_as_voice]]` di balasan agent untuk memaksa pengiriman sebagai voice note + - tag `[[audio_as_voice]]` dalam balasan agen untuk memaksa pengiriman sebagai catatan suara Contoh aksi pesan: @@ -625,11 +625,11 @@ curl "https://api.telegram.org/bot/getUpdates" } ``` - Video note tidak mendukung caption; teks pesan yang diberikan dikirim secara terpisah. + Video note tidak mendukung caption; teks pesan yang diberikan dikirim terpisah. ### Stiker - Penanganan stiker inbound: + Penanganan stiker masuk: - WEBP statis: diunduh dan diproses (placeholder ``) - TGS animasi: dilewati @@ -647,7 +647,7 @@ curl "https://api.telegram.org/bot/getUpdates" - `~/.openclaw/telegram/sticker-cache.json` - Stiker dideskripsikan sekali (jika memungkinkan) dan di-cache untuk mengurangi panggilan vision berulang. + Stiker dideskripsikan sekali (saat memungkinkan) dan di-cache untuk mengurangi panggilan vision berulang. Aktifkan aksi stiker: @@ -680,7 +680,7 @@ curl "https://api.telegram.org/bot/getUpdates" { action: "sticker-search", channel: "telegram", - query: "cat waving", + query: "kucing melambai", limit: 5, } ``` @@ -690,7 +690,7 @@ curl "https://api.telegram.org/bot/getUpdates" Reaction Telegram datang sebagai update `message_reaction` (terpisah dari payload pesan). - Saat diaktifkan, OpenClaw mengantrikan event sistem seperti: + Saat diaktifkan, OpenClaw memasukkan event sistem seperti: - `Telegram reaction added: 👍 by Alice (@alice) on msg 42` @@ -701,30 +701,30 @@ curl "https://api.telegram.org/bot/getUpdates" Catatan: - - `own` berarti hanya reaction pengguna terhadap pesan yang dikirim bot (best-effort melalui cache pesan terkirim). - - Event reaction tetap mematuhi kontrol akses Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); pengirim yang tidak diotorisasi dibuang. + - `own` berarti hanya reaction pengguna pada pesan yang dikirim bot (best-effort melalui cache pesan terkirim). + - Event reaction tetap mematuhi kontrol akses Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); pengirim yang tidak berwenang akan dibuang. - Telegram tidak menyediakan ID thread dalam update reaction. - grup non-forum dirutekan ke sesi chat grup - grup forum dirutekan ke sesi topik umum grup (`:topic:1`), bukan ke topik asal yang tepat - `allowed_updates` untuk polling/webhook otomatis menyertakan `message_reaction`. + `allowed_updates` untuk polling/webhook otomatis mencakup `message_reaction`. - `ackReaction` mengirim emoji pengakuan saat OpenClaw sedang memproses pesan inbound. + `ackReaction` mengirim emoji pengakuan saat OpenClaw sedang memproses pesan masuk. Urutan resolusi: - `channels.telegram.accounts..ackReaction` - `channels.telegram.ackReaction` - `messages.ackReaction` - - fallback emoji identitas agent (`agents.list[].identity.emoji`, jika tidak "👀") + - fallback emoji identitas agen (`agents.list[].identity.emoji`, atau "👀") Catatan: - Telegram mengharapkan emoji unicode (misalnya "👀"). - - Gunakan `""` untuk menonaktifkan reaction bagi suatu channel atau akun. + - Gunakan `""` untuk menonaktifkan reaction untuk sebuah channel atau akun. @@ -734,7 +734,7 @@ curl "https://api.telegram.org/bot/getUpdates" Penulisan yang dipicu Telegram meliputi: - event migrasi grup (`migrate_to_chat_id`) untuk memperbarui `channels.telegram.groups` - - `/config set` dan `/config unset` (memerlukan enablement perintah) + - `/config set` dan `/config unset` (memerlukan pengaktifan perintah) Nonaktifkan: @@ -756,32 +756,32 @@ curl "https://api.telegram.org/bot/getUpdates" Mode webhook: - atur `channels.telegram.webhookUrl` - - atur `channels.telegram.webhookSecret` (wajib saat webhook URL diatur) + - atur `channels.telegram.webhookSecret` (wajib saat URL webhook diatur) - opsional `channels.telegram.webhookPath` (default `/telegram-webhook`) - opsional `channels.telegram.webhookHost` (default `127.0.0.1`) - opsional `channels.telegram.webhookPort` (default `8787`) - Listener lokal default untuk mode webhook bind ke `127.0.0.1:8787`. + Listener lokal default untuk mode webhook melakukan bind ke `127.0.0.1:8787`. - Jika endpoint publik Anda berbeda, tempatkan reverse proxy di depan dan arahkan `webhookUrl` ke URL publik. - Atur `webhookHost` (misalnya `0.0.0.0`) saat Anda memang membutuhkan ingress eksternal. + Jika endpoint publik Anda berbeda, tempatkan reverse proxy di depannya dan arahkan `webhookUrl` ke URL publik tersebut. + Atur `webhookHost` (misalnya `0.0.0.0`) saat Anda memang memerlukan ingress eksternal. - default `channels.telegram.textChunkLimit` adalah 4000. - - `channels.telegram.chunkMode="newline"` lebih memilih batas paragraf (baris kosong) sebelum pemisahan berdasarkan panjang. - - `channels.telegram.mediaMaxMb` (default 100) membatasi ukuran media Telegram inbound dan outbound. + - `channels.telegram.chunkMode="newline"` mengutamakan batas paragraf (baris kosong) sebelum pemotongan berdasarkan panjang. + - `channels.telegram.mediaMaxMb` (default 100) membatasi ukuran media Telegram masuk dan keluar. - `channels.telegram.timeoutSeconds` menimpa timeout klien API Telegram (jika tidak diatur, default grammY berlaku). - riwayat konteks grup menggunakan `channels.telegram.historyLimit` atau `messages.groupChat.historyLimit` (default 50); `0` menonaktifkan. - konteks tambahan reply/quote/forward saat ini diteruskan sebagaimana diterima. - - allowlist Telegram terutama membatasi siapa yang dapat memicu agent, bukan batas penyuntingan penuh untuk konteks tambahan. + - allowlist Telegram terutama membatasi siapa yang dapat memicu agen, bukan batas redaksi konteks tambahan yang sepenuhnya. - kontrol riwayat DM: - `channels.telegram.dmHistoryLimit` - `channels.telegram.dms[""].historyLimit` - - config `channels.telegram.retry` berlaku untuk helper pengiriman Telegram (CLI/tools/actions) pada kesalahan API outbound yang dapat dipulihkan. + - config `channels.telegram.retry` berlaku untuk helper pengiriman Telegram (CLI/tools/actions) untuk error API keluar yang dapat dipulihkan. - Target pengiriman CLI dapat berupa ID chat numerik atau username: + Target kirim CLI dapat berupa ID chat numerik atau username: ```bash openclaw message send --channel telegram --target 123456789 --message "hi" @@ -808,69 +808,69 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \ Pengiriman Telegram juga mendukung: - `--buttons` untuk keyboard inline saat `channels.telegram.capabilities.inlineButtons` mengizinkannya - - `--force-document` untuk mengirim gambar dan GIF outbound sebagai dokumen alih-alih unggahan foto terkompresi atau media animasi + - `--force-document` untuk mengirim gambar dan GIF keluar sebagai dokumen alih-alih unggahan foto terkompresi atau media animasi Gating aksi: - - `channels.telegram.actions.sendMessage=false` menonaktifkan pesan Telegram outbound, termasuk poll - - `channels.telegram.actions.poll=false` menonaktifkan pembuatan poll Telegram sambil tetap membiarkan pengiriman reguler aktif + - `channels.telegram.actions.sendMessage=false` menonaktifkan pesan Telegram keluar, termasuk poll + - `channels.telegram.actions.poll=false` menonaktifkan pembuatan poll Telegram sambil tetap membiarkan pengiriman biasa aktif Telegram mendukung persetujuan exec di DM approver dan secara opsional dapat memposting prompt persetujuan di chat atau topik asal. - Jalur config: + Path config: - `channels.telegram.execApprovals.enabled` - - `channels.telegram.execApprovals.approvers` (opsional; fallback ke ID pemilik numerik yang diinferensikan dari `allowFrom` dan `defaultTo` langsung jika memungkinkan) + - `channels.telegram.execApprovals.approvers` (opsional; menggunakan fallback ke ID pemilik numerik yang disimpulkan dari `allowFrom` dan `defaultTo` pesan langsung bila memungkinkan) - `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) - `agentFilter`, `sessionFilter` - Approver harus berupa ID pengguna Telegram numerik. Telegram otomatis mengaktifkan persetujuan exec native ketika `enabled` tidak diatur atau `"auto"` dan setidaknya satu approver dapat diresolusikan, baik dari `execApprovals.approvers` maupun dari config pemilik numerik akun (`allowFrom` dan `defaultTo` direct-message). Atur `enabled: false` untuk menonaktifkan Telegram sebagai klien persetujuan native secara eksplisit. Jika tidak, permintaan persetujuan akan fallback ke rute persetujuan terkonfigurasi lainnya atau kebijakan fallback persetujuan exec. + Approver harus berupa ID pengguna Telegram numerik. Telegram secara otomatis mengaktifkan persetujuan exec native saat `enabled` tidak diatur atau `"auto"` dan setidaknya satu approver dapat di-resolve, baik dari `execApprovals.approvers` maupun dari config pemilik numerik akun (`allowFrom` dan `defaultTo` pesan langsung). Atur `enabled: false` untuk menonaktifkan Telegram sebagai klien persetujuan native secara eksplisit. Jika tidak, permintaan persetujuan akan menggunakan fallback ke rute persetujuan lain yang dikonfigurasi atau kebijakan fallback persetujuan exec. Telegram juga merender tombol persetujuan bersama yang digunakan oleh channel chat lain. Adapter Telegram native terutama menambahkan routing DM approver, fanout channel/topik, dan petunjuk mengetik sebelum pengiriman. Saat tombol tersebut ada, itulah UX persetujuan utama; OpenClaw - seharusnya hanya menyertakan perintah `/approve` manual ketika hasil tool menyatakan + hanya boleh menyertakan perintah manual `/approve` saat hasil tool menyatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur. Aturan pengiriman: - - `target: "dm"` hanya mengirim prompt persetujuan ke DM approver yang teresolusikan + - `target: "dm"` mengirim prompt persetujuan hanya ke DM approver yang di-resolve - `target: "channel"` mengirim prompt kembali ke chat/topik Telegram asal - `target: "both"` mengirim ke DM approver dan chat/topik asal - Hanya approver yang teresolusikan yang dapat menyetujui atau menolak. Non-approver tidak dapat menggunakan `/approve` dan tidak dapat menggunakan tombol persetujuan Telegram. + Hanya approver yang di-resolve yang dapat menyetujui atau menolak. Non-approver tidak dapat menggunakan `/approve` dan tidak dapat menggunakan tombol persetujuan Telegram. Perilaku resolusi persetujuan: - - ID berprefiks `plugin:` selalu diresolusikan melalui persetujuan plugin. - - ID persetujuan lainnya mencoba `exec.approval.resolve` terlebih dahulu. - - Jika Telegram juga diotorisasi untuk persetujuan plugin dan gateway mengatakan - persetujuan exec tidak dikenal/kedaluwarsa, Telegram mencoba ulang satu kali melalui + - ID dengan awalan `plugin:` selalu di-resolve melalui persetujuan plugin. + - ID persetujuan lain mencoba `exec.approval.resolve` terlebih dahulu. + - Jika Telegram juga diotorisasi untuk persetujuan plugin dan gateway menyatakan + persetujuan exec tidak dikenal/kedaluwarsa, Telegram mencoba lagi sekali melalui `plugin.approval.resolve`. - - Penolakan/kesalahan persetujuan exec yang nyata tidak diam-diam diteruskan ke resolusi + - Penolakan/error persetujuan exec yang nyata tidak diam-diam dialihkan ke resolusi persetujuan plugin. - Pengiriman channel menampilkan teks perintah di chat, jadi aktifkan `channel` atau `both` hanya di grup/topik tepercaya. Saat prompt mendarat di topik forum, OpenClaw mempertahankan topik tersebut baik untuk prompt persetujuan maupun tindak lanjut pasca-persetujuan. Persetujuan exec kedaluwarsa setelah 30 menit secara default. + Pengiriman ke channel menampilkan teks perintah di chat, jadi aktifkan `channel` atau `both` hanya di grup/topik tepercaya. Saat prompt masuk ke topik forum, OpenClaw mempertahankan topik tersebut baik untuk prompt persetujuan maupun tindak lanjut pasca-persetujuan. Persetujuan exec kedaluwarsa setelah 30 menit secara default. Tombol persetujuan inline juga bergantung pada `channels.telegram.capabilities.inlineButtons` yang mengizinkan permukaan target (`dm`, `group`, atau `all`). - Dokumentasi terkait: [Persetujuan exec](/tools/exec-approvals) + Dokumen terkait: [Persetujuan exec](/id/tools/exec-approvals) ## Kontrol balasan error -Saat agent mengalami error pengiriman atau provider, Telegram dapat membalas dengan teks error tersebut atau menekannya. Dua kunci config mengontrol perilaku ini: +Saat agen mengalami error pengiriman atau provider, Telegram dapat membalas dengan teks error atau menekannya. Dua kunci config mengontrol perilaku ini: -| Key | Values | Default | Description | -| ----------------------------------- | ----------------- | ------- | ----------------------------------------------------------------------------------------------- | -| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` mengirim pesan error yang ramah ke chat. `silent` sepenuhnya menekan balasan error. | -| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Waktu minimum antar balasan error ke chat yang sama. Mencegah spam error selama gangguan. | +| Key | Nilai | Default | Deskripsi | +| ----------------------------------- | ----------------- | ------- | ------------------------------------------------------------------------------------------------ | +| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` mengirim pesan error yang ramah ke chat. `silent` menekan balasan error sepenuhnya. | +| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Waktu minimum antar balasan error ke chat yang sama. Mencegah spam error saat terjadi gangguan. | -Override per-akun, per-grup, dan per-topik didukung (pewarisan yang sama seperti kunci config Telegram lainnya). +Override per akun, per grup, dan per topik didukung (pewarisan yang sama seperti key config Telegram lainnya). ```json5 { @@ -894,37 +894,37 @@ Override per-akun, per-grup, dan per-topik didukung (pewarisan yang sama seperti - Jika `requireMention=false`, mode privasi Telegram harus mengizinkan visibilitas penuh. - - BotFather: `/setprivacy` -> Disable - - lalu keluarkan + tambahkan kembali bot ke grup + - BotFather: `/setprivacy` -> Nonaktifkan + - lalu hapus + tambahkan kembali bot ke grup - `openclaw channels status` memberi peringatan saat config mengharapkan pesan grup tanpa mention. - `openclaw channels status --probe` dapat memeriksa ID grup numerik eksplisit; wildcard `"*"` tidak dapat diperiksa keanggotaannya. - - tes sesi cepat: `/activation always`. + - uji sesi cepat: `/activation always`. - - saat `channels.telegram.groups` ada, grup harus tercantum (atau menyertakan `"*"`) + - saat `channels.telegram.groups` ada, grup harus terdaftar (atau menyertakan `"*"`) - verifikasi keanggotaan bot di grup - - tinjau log: `openclaw logs --follow` untuk alasan dilewati + - tinjau log: `openclaw logs --follow` untuk alasan skip - + - otorisasi identitas pengirim Anda (pairing dan/atau `allowFrom` numerik) - otorisasi perintah tetap berlaku meskipun kebijakan grup adalah `open` - - `setMyCommands failed` dengan `BOT_COMMANDS_TOO_MUCH` berarti menu native memiliki terlalu banyak entri; kurangi perintah plugin/skill/kustom atau nonaktifkan menu native - - `setMyCommands failed` dengan kesalahan jaringan/fetch biasanya menunjukkan masalah keterjangkauan DNS/HTTPS ke `api.telegram.org` + - `setMyCommands failed` dengan `BOT_COMMANDS_TOO_MUCH` berarti menu native memiliki terlalu banyak entri; kurangi perintah plugin/Skills/kustom atau nonaktifkan menu native + - `setMyCommands failed` dengan error jaringan/fetch biasanya menunjukkan masalah keterjangkauan DNS/HTTPS ke `api.telegram.org` - Node 22+ + fetch/proxy kustom dapat memicu perilaku abort langsung jika tipe AbortSignal tidak cocok. - - Beberapa host meresolusikan `api.telegram.org` ke IPv6 terlebih dahulu; egress IPv6 yang rusak dapat menyebabkan kegagalan API Telegram yang intermiten. - - Jika log menyertakan `TypeError: fetch failed` atau `Network request for 'getUpdates' failed!`, OpenClaw kini mencoba ulang ini sebagai kesalahan jaringan yang dapat dipulihkan. - - Pada host VPS dengan egress/TLS langsung yang tidak stabil, rute panggilan API Telegram melalui `channels.telegram.proxy`: + - Beberapa host me-resolve `api.telegram.org` ke IPv6 terlebih dahulu; egress IPv6 yang rusak dapat menyebabkan kegagalan API Telegram yang intermiten. + - Jika log menyertakan `TypeError: fetch failed` atau `Network request for 'getUpdates' failed!`, OpenClaw kini mencoba ulang error ini sebagai error jaringan yang dapat dipulihkan. + - Pada host VPS dengan egress/TLS langsung yang tidak stabil, arahkan panggilan API Telegram melalui `channels.telegram.proxy`: ```yaml channels: @@ -932,8 +932,8 @@ channels: proxy: socks5://:@proxy-host:1080 ``` - - Default Node 22+ adalah `autoSelectFamily=true` (kecuali WSL2) dan `dnsResultOrder=ipv4first`. - - Jika host Anda adalah WSL2 atau memang bekerja lebih baik dengan perilaku hanya-IPv4, paksa pemilihan family: + - Node 22+ default ke `autoSelectFamily=true` (kecuali WSL2) dan `dnsResultOrder=ipv4first`. + - Jika host Anda adalah WSL2 atau secara eksplisit bekerja lebih baik dengan perilaku khusus IPv4, paksa pemilihan family: ```yaml channels: @@ -943,10 +943,10 @@ channels: ``` - Jawaban rentang benchmark RFC 2544 (`198.18.0.0/15`) sudah diizinkan - untuk unduhan media Telegram secara default. Jika proxy IP palsu atau - transparan tepercaya menulis ulang `api.telegram.org` ke alamat - private/internal/special-use lain saat unduhan media, Anda dapat memilih - bypass khusus Telegram berikut: + untuk unduhan media Telegram secara default. Jika fake-IP tepercaya atau + proxy transparan menulis ulang `api.telegram.org` ke alamat + private/internal/special-use lain selama unduhan media, Anda dapat memilih + bypass khusus Telegram ini: ```yaml channels: @@ -955,14 +955,14 @@ channels: dangerouslyAllowPrivateNetwork: true ``` - - Opsi ikut serta yang sama juga tersedia per akun di + - Opsi yang sama juga tersedia per akun di `channels.telegram.accounts..network.dangerouslyAllowPrivateNetwork`. - - Jika proxy Anda meresolusikan host media Telegram ke `198.18.x.x`, biarkan - flag berbahaya itu nonaktif terlebih dahulu. Media Telegram sudah mengizinkan rentang benchmark RFC 2544 + - Jika proxy Anda me-resolve host media Telegram ke `198.18.x.x`, biarkan + flag dangerous tetap nonaktif terlebih dahulu. Media Telegram sudah mengizinkan rentang benchmark RFC 2544 secara default. - `channels.telegram.network.dangerouslyAllowPrivateNetwork` melemahkan perlindungan SSRF media Telegram. Gunakan hanya untuk lingkungan proxy tepercaya yang dikendalikan operator seperti routing fake-IP Clash, Mihomo, atau Surge ketika mereka mensintesis jawaban private atau special-use di luar rentang benchmark RFC 2544 default. Biarkan tetap nonaktif untuk akses Telegram internet publik normal. + `channels.telegram.network.dangerouslyAllowPrivateNetwork` melemahkan perlindungan SSRF media Telegram. Gunakan hanya untuk lingkungan proxy tepercaya yang dikendalikan operator seperti Clash, Mihomo, atau routing fake-IP Surge saat mereka mensintesis jawaban private atau special-use di luar rentang benchmark RFC 2544. Biarkan nonaktif untuk akses Telegram internet publik normal. - Override environment (sementara): @@ -987,71 +987,71 @@ Referensi utama: - `channels.telegram.enabled`: aktifkan/nonaktifkan startup channel. - `channels.telegram.botToken`: token bot (BotFather). -- `channels.telegram.tokenFile`: baca token dari path file reguler. Symlink ditolak. +- `channels.telegram.tokenFile`: baca token dari path file biasa. Symlink ditolak. - `channels.telegram.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). -- `channels.telegram.allowFrom`: allowlist DM (ID pengguna Telegram numerik). `allowlist` memerlukan setidaknya satu ID pengirim. `open` mengharuskan `"*"`. `openclaw doctor --fix` dapat meresolusikan entri `@username` lama ke ID dan dapat memulihkan entri allowlist dari file pairing-store dalam alur migrasi allowlist. -- `channels.telegram.actions.poll`: aktifkan atau nonaktifkan pembuatan poll Telegram (default: aktif; tetap memerlukan `sendMessage`). -- `channels.telegram.defaultTo`: target Telegram default yang digunakan CLI `--deliver` ketika tidak ada `--reply-to` eksplisit. +- `channels.telegram.allowFrom`: allowlist DM (ID pengguna Telegram numerik). `allowlist` memerlukan setidaknya satu ID pengirim. `open` memerlukan `"*"`. `openclaw doctor --fix` dapat me-resolve entri legacy `@username` ke ID dan dapat memulihkan entri allowlist dari file pairing-store dalam alur migrasi allowlist. +- `channels.telegram.actions.poll`: aktifkan atau nonaktifkan pembuatan poll Telegram (default: enabled; tetap memerlukan `sendMessage`). +- `channels.telegram.defaultTo`: target Telegram default yang digunakan oleh CLI `--deliver` saat tidak ada `--reply-to` eksplisit. - `channels.telegram.groupPolicy`: `open | allowlist | disabled` (default: allowlist). -- `channels.telegram.groupAllowFrom`: allowlist pengirim grup (ID pengguna Telegram numerik). `openclaw doctor --fix` dapat meresolusikan entri `@username` lama ke ID. Entri non-numerik diabaikan saat auth. Auth grup tidak menggunakan fallback pairing-store DM (`2026.2.25+`). +- `channels.telegram.groupAllowFrom`: allowlist pengirim grup (ID pengguna Telegram numerik). `openclaw doctor --fix` dapat me-resolve entri legacy `@username` ke ID. Entri non-numerik diabaikan saat auth. Auth grup tidak menggunakan fallback pairing-store DM (`2026.2.25+`). - Prioritas multi-akun: - - Saat dua atau lebih ID akun dikonfigurasi, atur `channels.telegram.defaultAccount` (atau sertakan `channels.telegram.accounts.default`) untuk membuat routing default menjadi eksplisit. - - Jika keduanya tidak diatur, OpenClaw fallback ke ID akun pertama yang dinormalisasi dan `openclaw doctor` memberi peringatan. + - Saat dua atau lebih ID akun dikonfigurasi, atur `channels.telegram.defaultAccount` (atau sertakan `channels.telegram.accounts.default`) agar routing default eksplisit. + - Jika keduanya tidak diatur, OpenClaw menggunakan fallback ke ID akun pertama yang dinormalisasi dan `openclaw doctor` akan memberi peringatan. - `channels.telegram.accounts.default.allowFrom` dan `channels.telegram.accounts.default.groupAllowFrom` hanya berlaku untuk akun `default`. - Akun bernama mewarisi `channels.telegram.allowFrom` dan `channels.telegram.groupAllowFrom` saat nilai tingkat akun tidak diatur. - Akun bernama tidak mewarisi `channels.telegram.accounts.default.allowFrom` / `groupAllowFrom`. -- `channels.telegram.groups`: default per-grup + allowlist (gunakan `"*"` untuk default global). - - `channels.telegram.groups..groupPolicy`: override per-grup untuk groupPolicy (`open | allowlist | disabled`). +- `channels.telegram.groups`: default per grup + allowlist (gunakan `"*"` untuk default global). + - `channels.telegram.groups..groupPolicy`: override per grup untuk groupPolicy (`open | allowlist | disabled`). - `channels.telegram.groups..requireMention`: default gating mention. - - `channels.telegram.groups..skills`: filter skill (hilangkan = semua skill, kosong = tidak ada). - - `channels.telegram.groups..allowFrom`: override allowlist pengirim per-grup. + - `channels.telegram.groups..skills`: filter Skills (hilangkan = semua Skills, kosong = tidak ada). + - `channels.telegram.groups..allowFrom`: override allowlist pengirim per grup. - `channels.telegram.groups..systemPrompt`: system prompt tambahan untuk grup. - `channels.telegram.groups..enabled`: nonaktifkan grup saat `false`. - - `channels.telegram.groups..topics..*`: override per-topik (field grup + `agentId` khusus topik). - - `channels.telegram.groups..topics..agentId`: rute topik ini ke agent tertentu (menimpa routing tingkat grup dan binding). -- `channels.telegram.groups..topics..groupPolicy`: override per-topik untuk groupPolicy (`open | allowlist | disabled`). -- `channels.telegram.groups..topics..requireMention`: override gating mention per-topik. -- `bindings[]` tingkat atas dengan `type: "acp"` dan ID topik kanonis `chatId:topic:topicId` di `match.peer.id`: field binding topik ACP persisten (lihat [ACP Agents](/tools/acp-agents#channel-specific-settings)). -- `channels.telegram.direct..topics..agentId`: rute topik DM ke agent tertentu (perilaku sama seperti topik forum). + - `channels.telegram.groups..topics..*`: override per topik (field grup + `agentId` khusus topik). + - `channels.telegram.groups..topics..agentId`: rutekan topik ini ke agen tertentu (mengoverride routing tingkat grup dan binding). +- `channels.telegram.groups..topics..groupPolicy`: override per topik untuk groupPolicy (`open | allowlist | disabled`). +- `channels.telegram.groups..topics..requireMention`: override gating mention per topik. +- `bindings[]` tingkat atas dengan `type: "acp"` dan ID topik kanonis `chatId:topic:topicId` di `match.peer.id`: field binding topik ACP persisten (lihat [ACP Agents](/id/tools/acp-agents#channel-specific-settings)). +- `channels.telegram.direct..topics..agentId`: rutekan topik DM ke agen tertentu (perilaku sama seperti topik forum). - `channels.telegram.execApprovals.enabled`: aktifkan Telegram sebagai klien persetujuan exec berbasis chat untuk akun ini. - `channels.telegram.execApprovals.approvers`: ID pengguna Telegram yang diizinkan untuk menyetujui atau menolak permintaan exec. Opsional saat `channels.telegram.allowFrom` atau `channels.telegram.defaultTo` langsung sudah mengidentifikasi pemilik. -- `channels.telegram.execApprovals.target`: `dm | channel | both` (default: `dm`). `channel` dan `both` mempertahankan topik Telegram asal jika ada. -- `channels.telegram.execApprovals.agentFilter`: filter ID agent opsional untuk prompt persetujuan yang diteruskan. +- `channels.telegram.execApprovals.target`: `dm | channel | both` (default: `dm`). `channel` dan `both` mempertahankan topik Telegram asal saat ada. +- `channels.telegram.execApprovals.agentFilter`: filter ID agen opsional untuk prompt persetujuan yang diteruskan. - `channels.telegram.execApprovals.sessionFilter`: filter kunci sesi opsional (substring atau regex) untuk prompt persetujuan yang diteruskan. -- `channels.telegram.accounts..execApprovals`: override per-akun untuk routing persetujuan exec Telegram dan otorisasi approver. +- `channels.telegram.accounts..execApprovals`: override per akun untuk routing persetujuan exec Telegram dan otorisasi approver. - `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist). -- `channels.telegram.accounts..capabilities.inlineButtons`: override per-akun. -- `channels.telegram.commands.nativeSkills`: aktifkan/nonaktifkan perintah native skills Telegram. +- `channels.telegram.accounts..capabilities.inlineButtons`: override per akun. +- `channels.telegram.commands.nativeSkills`: aktifkan/nonaktifkan perintah Skills native Telegram. - `channels.telegram.replyToMode`: `off | first | all` (default: `off`). -- `channels.telegram.textChunkLimit`: ukuran potongan outbound (karakter). -- `channels.telegram.chunkMode`: `length` (default) atau `newline` untuk memisah pada baris kosong (batas paragraf) sebelum pemotongan berdasarkan panjang. -- `channels.telegram.linkPreview`: toggle pratinjau tautan untuk pesan outbound (default: true). -- `channels.telegram.streaming`: `off | partial | block | progress` (pratinjau live stream; default: `partial`; `progress` dipetakan ke `partial`; `block` adalah kompatibilitas mode pratinjau lama). Preview streaming Telegram menggunakan satu pesan pratinjau yang diedit di tempat. -- `channels.telegram.mediaMaxMb`: batas media Telegram inbound/outbound (MB, default: 100). -- `channels.telegram.retry`: kebijakan retry untuk helper pengiriman Telegram (CLI/tools/actions) pada kesalahan API outbound yang dapat dipulihkan (attempts, minDelayMs, maxDelayMs, jitter). -- `channels.telegram.network.autoSelectFamily`: timpa autoSelectFamily Node (true=aktifkan, false=nonaktifkan). Default aktif di Node 22+, dengan WSL2 default nonaktif. -- `channels.telegram.network.dnsResultOrder`: timpa urutan hasil DNS (`ipv4first` atau `verbatim`). Default `ipv4first` di Node 22+. -- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: opsi berbahaya untuk lingkungan fake-IP atau proxy transparan tepercaya di mana unduhan media Telegram meresolusikan `api.telegram.org` ke alamat private/internal/special-use di luar izin rentang benchmark RFC 2544 default. +- `channels.telegram.textChunkLimit`: ukuran chunk keluar (karakter). +- `channels.telegram.chunkMode`: `length` (default) atau `newline` untuk membagi pada baris kosong (batas paragraf) sebelum chunking berdasarkan panjang. +- `channels.telegram.linkPreview`: toggle pratinjau tautan untuk pesan keluar (default: true). +- `channels.telegram.streaming`: `off | partial | block | progress` (pratinjau stream langsung; default: `partial`; `progress` dipetakan ke `partial`; `block` adalah kompatibilitas mode pratinjau legacy). Streaming pratinjau Telegram menggunakan satu pesan pratinjau yang diedit di tempat. +- `channels.telegram.mediaMaxMb`: batas media Telegram masuk/keluar (MB, default: 100). +- `channels.telegram.retry`: kebijakan retry untuk helper pengiriman Telegram (CLI/tools/actions) pada error API keluar yang dapat dipulihkan (attempts, minDelayMs, maxDelayMs, jitter). +- `channels.telegram.network.autoSelectFamily`: override Node autoSelectFamily (true=aktifkan, false=nonaktifkan). Default aktif pada Node 22+, dengan default nonaktif pada WSL2. +- `channels.telegram.network.dnsResultOrder`: override urutan hasil DNS (`ipv4first` atau `verbatim`). Default ke `ipv4first` pada Node 22+. +- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: opt-in berbahaya untuk lingkungan fake-IP atau proxy transparan tepercaya saat unduhan media Telegram me-resolve `api.telegram.org` ke alamat private/internal/special-use di luar rentang benchmark RFC 2544 default yang diizinkan. - `channels.telegram.proxy`: URL proxy untuk panggilan Bot API (SOCKS/HTTP). -- `channels.telegram.webhookUrl`: aktifkan mode webhook (memerlukan `channels.telegram.webhookSecret`). -- `channels.telegram.webhookSecret`: secret webhook (wajib saat webhookUrl diatur). -- `channels.telegram.webhookPath`: path webhook lokal (default `/telegram-webhook`). -- `channels.telegram.webhookHost`: host bind webhook lokal (default `127.0.0.1`). -- `channels.telegram.webhookPort`: port bind webhook lokal (default `8787`). +- `channels.telegram.webhookUrl`: aktifkan mode Webhook (memerlukan `channels.telegram.webhookSecret`). +- `channels.telegram.webhookSecret`: secret Webhook (wajib saat webhookUrl diatur). +- `channels.telegram.webhookPath`: path Webhook lokal (default `/telegram-webhook`). +- `channels.telegram.webhookHost`: host bind Webhook lokal (default `127.0.0.1`). +- `channels.telegram.webhookPort`: port bind Webhook lokal (default `8787`). - `channels.telegram.actions.reactions`: gate reaction tool Telegram. - `channels.telegram.actions.sendMessage`: gate pengiriman pesan tool Telegram. - `channels.telegram.actions.deleteMessage`: gate penghapusan pesan tool Telegram. - `channels.telegram.actions.sticker`: gate aksi stiker Telegram — kirim dan cari (default: false). - `channels.telegram.reactionNotifications`: `off | own | all` — kontrol reaction mana yang memicu event sistem (default: `own` saat tidak diatur). -- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — kontrol kemampuan reaction agent (default: `minimal` saat tidak diatur). -- `channels.telegram.errorPolicy`: `reply | silent` — kontrol perilaku balasan error (default: `reply`). Override per-akun/grup/topik didukung. -- `channels.telegram.errorCooldownMs`: minimum ms antar balasan error ke chat yang sama (default: `60000`). Mencegah spam error selama gangguan. +- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — kontrol kemampuan reaction agen (default: `minimal` saat tidak diatur). +- `channels.telegram.errorPolicy`: `reply | silent` — kontrol perilaku balasan error (default: `reply`). Override per akun/grup/topik didukung. +- `channels.telegram.errorCooldownMs`: ms minimum antar balasan error ke chat yang sama (default: `60000`). Mencegah spam error saat terjadi gangguan. -- [Referensi konfigurasi - Telegram](/gateway/configuration-reference#telegram) +- [Referensi konfigurasi - Telegram](/id/gateway/configuration-reference#telegram) -Field Telegram khusus dengan sinyal tinggi: +Field sinyal tinggi khusus Telegram: -- startup/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` harus menunjuk ke file reguler; symlink ditolak) +- startup/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` harus menunjuk ke file biasa; symlink ditolak) - kontrol akses: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, `bindings[]` tingkat atas (`type: "acp"`) - persetujuan exec: `execApprovals`, `accounts.*.execApprovals` - perintah/menu: `commands.native`, `commands.nativeSkills`, `customCommands` @@ -1060,16 +1060,16 @@ Field Telegram khusus dengan sinyal tinggi: - pemformatan/pengiriman: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix` - media/jaringan: `mediaMaxMb`, `timeoutSeconds`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy` - webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost` -- aksi/kapabilitas: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker` +- actions/capabilities: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker` - reaction: `reactionNotifications`, `reactionLevel` - error: `errorPolicy`, `errorCooldownMs` - penulisan/riwayat: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` ## Terkait -- [Pairing](/id/channels/pairing) +- [Pemasangan](/id/channels/pairing) - [Grup](/id/channels/groups) -- [Keamanan](/gateway/security) +- [Keamanan](/id/gateway/security) - [Routing channel](/id/channels/channel-routing) -- [Routing multi-agent](/concepts/multi-agent) +- [Routing multi-agent](/id/concepts/multi-agent) - [Pemecahan masalah](/id/channels/troubleshooting) diff --git a/docs/id/channels/troubleshooting.md b/docs/id/channels/troubleshooting.md index 420e913ff..800a5f467 100644 --- a/docs/id/channels/troubleshooting.md +++ b/docs/id/channels/troubleshooting.md @@ -1,14 +1,14 @@ --- read_when: - Transport channel menunjukkan terhubung tetapi balasan gagal - - Anda memerlukan pemeriksaan khusus channel sebelum dokumentasi provider yang lebih mendalam -summary: Pemecahan masalah level channel dengan cepat menggunakan signature kegagalan dan perbaikan per channel -title: Channel Troubleshooting + - Anda memerlukan pemeriksaan khusus channel sebelum masuk ke dokumentasi provider yang mendalam +summary: Pemecahan masalah tingkat channel yang cepat dengan tanda kegagalan per channel dan perbaikannya +title: Pemecahan Masalah Channel x-i18n: - generated_at: "2026-04-05T13:44:43Z" + generated_at: "2026-04-20T09:27:34Z" model: gpt-5.4 provider: openai - source_hash: d45d8220505ea420d970b20bc66e65216c2d7024b5736db1936421ffc0676e1f + source_hash: 0aef31742cd5cc4af3fa3d3ea1acba51875ad4a1423c0e8c87372c3df31b0528 source_path: channels/troubleshooting.md workflow: 15 --- @@ -19,7 +19,7 @@ Gunakan halaman ini saat sebuah channel terhubung tetapi perilakunya salah. ## Urutan perintah -Jalankan ini terlebih dahulu secara berurutan: +Jalankan ini secara berurutan terlebih dahulu: ```bash openclaw status @@ -29,112 +29,113 @@ openclaw doctor openclaw channels status --probe ``` -Baseline sehat: +Baseline yang sehat: - `Runtime: running` -- `RPC probe: ok` +- `Connectivity probe: ok` +- `Capability: read-only`, `write-capable`, atau `admin-capable` - Probe channel menunjukkan transport terhubung dan, jika didukung, `works` atau `audit ok` ## WhatsApp -### Signature kegagalan WhatsApp +### Tanda kegagalan WhatsApp -| Gejala | Pemeriksaan tercepat | Perbaikan | -| ----------------------------- | -------------------------------------------------- | ------------------------------------------------------- | -| Terhubung tetapi tidak ada balasan DM | `openclaw pairing list whatsapp` | Setujui pengirim atau ubah kebijakan/allowlist DM. | -| Pesan grup diabaikan | Periksa `requireMention` + pola mention di konfigurasi | Mention bot atau longgarkan kebijakan mention untuk grup itu. | -| Putus sambung acak/loop login ulang | `openclaw channels status --probe` + log | Login ulang dan verifikasi direktori kredensial sehat. | +| Gejala | Pemeriksaan tercepat | Perbaikan | +| ------------------------------- | -------------------------------------------------- | -------------------------------------------------------- | +| Terhubung tetapi tidak ada balasan DM | `openclaw pairing list whatsapp` | Setujui pengirim atau ubah kebijakan DM/allowlist. | +| Pesan grup diabaikan | Periksa `requireMention` + pola mention di config | Mention bot atau longgarkan kebijakan mention untuk grup tersebut. | +| Putus sambung acak/perulangan login ulang | `openclaw channels status --probe` + log | Login ulang dan verifikasi direktori kredensial dalam kondisi sehat. | -Pemecahan masalah lengkap: [/channels/whatsapp#troubleshooting](/channels/whatsapp#troubleshooting) +Pemecahan masalah lengkap: [/channels/whatsapp#troubleshooting](/id/channels/whatsapp#troubleshooting) ## Telegram -### Signature kegagalan Telegram +### Tanda kegagalan Telegram | Gejala | Pemeriksaan tercepat | Perbaikan | | ----------------------------------- | --------------------------------------------- | --------------------------------------------------------------------------- | -| `/start` tetapi tidak ada alur balasan yang dapat digunakan | `openclaw pairing list telegram` | Setujui pairing atau ubah kebijakan DM. | +| `/start` tetapi tidak ada alur balasan yang dapat digunakan | `openclaw pairing list telegram` | Setujui pairing atau ubah kebijakan DM. | | Bot online tetapi grup tetap diam | Verifikasi persyaratan mention dan mode privasi bot | Nonaktifkan mode privasi untuk visibilitas grup atau mention bot. | -| Kegagalan kirim dengan kesalahan jaringan | Periksa log untuk kegagalan panggilan Telegram API | Perbaiki routing DNS/IPv6/proxy ke `api.telegram.org`. | -| `setMyCommands` ditolak saat startup | Periksa log untuk `BOT_COMMANDS_TOO_MUCH` | Kurangi perintah Telegram plugin/Skills/kustom atau nonaktifkan menu native. | -| Sudah upgrade dan allowlist memblokir Anda | `openclaw security audit` dan allowlist konfigurasi | Jalankan `openclaw doctor --fix` atau ganti `@username` dengan ID pengirim numerik. | +| Kegagalan pengiriman dengan error jaringan | Periksa log untuk kegagalan panggilan API Telegram | Perbaiki routing DNS/IPv6/proxy ke `api.telegram.org`. | +| `setMyCommands` ditolak saat startup | Periksa log untuk `BOT_COMMANDS_TOO_MUCH` | Kurangi perintah Telegram plugin/Skills/kustom atau nonaktifkan menu native. | +| Setelah upgrade allowlist memblokir Anda | `openclaw security audit` dan allowlist config | Jalankan `openclaw doctor --fix` atau ganti `@username` dengan ID pengirim numerik. | -Pemecahan masalah lengkap: [/channels/telegram#troubleshooting](/channels/telegram#troubleshooting) +Pemecahan masalah lengkap: [/channels/telegram#troubleshooting](/id/channels/telegram#troubleshooting) ## Discord -### Signature kegagalan Discord +### Tanda kegagalan Discord -| Gejala | Pemeriksaan tercepat | Perbaikan | -| ----------------------------- | --------------------------------- | --------------------------------------------------------- | -| Bot online tetapi tidak ada balasan guild | `openclaw channels status --probe` | Izinkan guild/channel dan verifikasi message content intent. | -| Pesan grup diabaikan | Periksa log untuk drop mention gating | Mention bot atau setel guild/channel `requireMention: false`. | -| Balasan DM tidak ada | `openclaw pairing list discord` | Setujui pairing DM atau sesuaikan kebijakan DM. | +| Gejala | Pemeriksaan tercepat | Perbaikan | +| ------------------------------- | --------------------------------- | --------------------------------------------------------- | +| Bot online tetapi tidak ada balasan guild | `openclaw channels status --probe` | Izinkan guild/channel dan verifikasi message content intent. | +| Pesan grup diabaikan | Periksa log untuk drop gating mention | Mention bot atau setel `requireMention: false` untuk guild/channel. | +| Balasan DM tidak ada | `openclaw pairing list discord` | Setujui pairing DM atau sesuaikan kebijakan DM. | -Pemecahan masalah lengkap: [/channels/discord#troubleshooting](/channels/discord#troubleshooting) +Pemecahan masalah lengkap: [/channels/discord#troubleshooting](/id/channels/discord#troubleshooting) ## Slack -### Signature kegagalan Slack +### Tanda kegagalan Slack | Gejala | Pemeriksaan tercepat | Perbaikan | | -------------------------------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| Socket mode terhubung tetapi tidak ada respons | `openclaw channels status --probe` | Verifikasi app token + bot token dan scope yang diperlukan; perhatikan `botTokenStatus` / `appTokenStatus = configured_unavailable` pada penyiapan berbasis SecretRef. | -| DM diblokir | `openclaw pairing list slack` | Setujui pairing atau longgarkan kebijakan DM. | +| Socket mode terhubung tetapi tidak ada respons | `openclaw channels status --probe` | Verifikasi app token + bot token dan scope yang diperlukan; perhatikan `botTokenStatus` / `appTokenStatus = configured_unavailable` pada setup berbasis SecretRef. | +| DM diblokir | `openclaw pairing list slack` | Setujui pairing atau longgarkan kebijakan DM. | | Pesan channel diabaikan | Periksa `groupPolicy` dan allowlist channel | Izinkan channel atau ubah kebijakan menjadi `open`. | -Pemecahan masalah lengkap: [/channels/slack#troubleshooting](/channels/slack#troubleshooting) +Pemecahan masalah lengkap: [/channels/slack#troubleshooting](/id/channels/slack#troubleshooting) ## iMessage dan BlueBubbles -### Signature kegagalan iMessage dan BlueBubbles +### Tanda kegagalan iMessage dan BlueBubbles -| Gejala | Pemeriksaan tercepat | Perbaikan | -| ------------------------------ | ------------------------------------------------------------------------- | ----------------------------------------------------- | -| Tidak ada event masuk | Verifikasi keterjangkauan webhook/server dan izin aplikasi | Perbaiki URL webhook atau status server BlueBubbles. | -| Bisa mengirim tetapi tidak menerima di macOS | Periksa izin privasi macOS untuk otomasi Messages | Berikan ulang izin TCC dan restart proses channel. | -| Pengirim DM diblokir | `openclaw pairing list imessage` atau `openclaw pairing list bluebubbles` | Setujui pairing atau perbarui allowlist. | +| Gejala | Pemeriksaan tercepat | Perbaikan | +| -------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- | +| Tidak ada event masuk | Verifikasi keterjangkauan webhook/server dan izin aplikasi | Perbaiki URL webhook atau status server BlueBubbles. | +| Bisa mengirim tetapi tidak bisa menerima di macOS | Periksa izin privasi macOS untuk otomasi Messages | Berikan ulang izin TCC dan mulai ulang proses channel. | +| Pengirim DM diblokir | `openclaw pairing list imessage` atau `openclaw pairing list bluebubbles` | Setujui pairing atau perbarui allowlist. | Pemecahan masalah lengkap: -- [/channels/imessage#troubleshooting](/channels/imessage#troubleshooting) -- [/channels/bluebubbles#troubleshooting](/channels/bluebubbles#troubleshooting) +- [/channels/imessage#troubleshooting](/id/channels/imessage#troubleshooting) +- [/channels/bluebubbles#troubleshooting](/id/channels/bluebubbles#troubleshooting) ## Signal -### Signature kegagalan Signal +### Tanda kegagalan Signal -| Gejala | Pemeriksaan tercepat | Perbaikan | -| ----------------------------- | ---------------------------------------- | -------------------------------------------------------- | -| Daemon dapat dijangkau tetapi bot diam | `openclaw channels status --probe` | Verifikasi URL/akun daemon `signal-cli` dan mode receive. | -| DM diblokir | `openclaw pairing list signal` | Setujui pengirim atau sesuaikan kebijakan DM. | -| Balasan grup tidak terpicu | Periksa allowlist grup dan pola mention | Tambahkan pengirim/grup atau longgarkan gating. | +| Gejala | Pemeriksaan tercepat | Perbaikan | +| ------------------------------- | ---------------------------------------- | -------------------------------------------------------- | +| Daemon dapat dijangkau tetapi bot diam | `openclaw channels status --probe` | Verifikasi URL/account daemon `signal-cli` dan mode receive. | +| DM diblokir | `openclaw pairing list signal` | Setujui pengirim atau sesuaikan kebijakan DM. | +| Balasan grup tidak terpicu | Periksa allowlist grup dan pola mention | Tambahkan pengirim/grup atau longgarkan gating. | -Pemecahan masalah lengkap: [/channels/signal#troubleshooting](/channels/signal#troubleshooting) +Pemecahan masalah lengkap: [/channels/signal#troubleshooting](/id/channels/signal#troubleshooting) ## QQ Bot -### Signature kegagalan QQ Bot +### Tanda kegagalan QQ Bot -| Gejala | Pemeriksaan tercepat | Perbaikan | -| ----------------------------- | ------------------------------------------------- | ---------------------------------------------------------------- | -| Bot membalas "gone to Mars" | Verifikasi `appId` dan `clientSecret` di konfigurasi | Setel kredensial atau restart gateway. | -| Tidak ada pesan masuk | `openclaw channels status --probe` | Verifikasi kredensial di QQ Open Platform. | -| Suara tidak ditranskripsikan | Periksa konfigurasi provider STT | Konfigurasikan `channels.qqbot.stt` atau `tools.media.audio`. | -| Pesan proaktif tidak sampai | Periksa persyaratan interaksi platform QQ | QQ mungkin memblokir pesan yang diprakarsai bot tanpa interaksi baru-baru ini. | +| Gejala | Pemeriksaan tercepat | Perbaikan | +| ------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------- | +| Bot membalas "gone to Mars" | Verifikasi `appId` dan `clientSecret` di config | Setel kredensial atau mulai ulang gateway. | +| Tidak ada pesan masuk | `openclaw channels status --probe` | Verifikasi kredensial di QQ Open Platform. | +| Suara tidak ditranskripsikan | Periksa config provider STT | Konfigurasikan `channels.qqbot.stt` atau `tools.media.audio`. | +| Pesan proaktif tidak sampai | Periksa persyaratan interaksi platform QQ | QQ dapat memblokir pesan yang diinisiasi bot tanpa interaksi terbaru. | -Pemecahan masalah lengkap: [/channels/qqbot#troubleshooting](/channels/qqbot#troubleshooting) +Pemecahan masalah lengkap: [/channels/qqbot#troubleshooting](/id/channels/qqbot#troubleshooting) ## Matrix -### Signature kegagalan Matrix +### Tanda kegagalan Matrix -| Gejala | Pemeriksaan tercepat | Perbaikan | -| ----------------------------------- | ------------------------------------- | ------------------------------------------------------------------------- | -| Sudah login tetapi mengabaikan pesan room | `openclaw channels status --probe` | Periksa `groupPolicy`, allowlist room, dan mention gating. | -| DM tidak diproses | `openclaw pairing list matrix` | Setujui pengirim atau sesuaikan kebijakan DM. | -| Room terenkripsi gagal | `openclaw matrix verify status` | Verifikasi ulang device, lalu periksa `openclaw matrix verify backup status`. | +| Gejala | Pemeriksaan tercepat | Perbaikan | +| ----------------------------------- | ----------------------------------- | ------------------------------------------------------------------------ | +| Sudah login tetapi mengabaikan pesan room | `openclaw channels status --probe` | Periksa `groupPolicy`, allowlist room, dan gating mention. | +| DM tidak diproses | `openclaw pairing list matrix` | Setujui pengirim atau sesuaikan kebijakan DM. | +| Room terenkripsi gagal | `openclaw matrix verify status` | Verifikasi ulang perangkat, lalu periksa `openclaw matrix verify backup status`. | | Pemulihan backup tertunda/rusak | `openclaw matrix verify backup status` | Jalankan `openclaw matrix verify backup restore` atau jalankan ulang dengan recovery key. | -| Cross-signing/bootstrap tampak salah | `openclaw matrix verify bootstrap` | Perbaiki status secret storage, cross-signing, dan backup dalam satu langkah. | +| Cross-signing/bootstrap terlihat salah | `openclaw matrix verify bootstrap` | Perbaiki secret storage, cross-signing, dan status backup dalam satu langkah. | -Penyiapan dan konfigurasi lengkap: [Matrix](/channels/matrix) +Setup dan config lengkap: [Matrix](/id/channels/matrix) diff --git a/docs/id/concepts/qa-e2e-automation.md b/docs/id/concepts/qa-e2e-automation.md index f6b31acf0..7b7c04add 100644 --- a/docs/id/concepts/qa-e2e-automation.md +++ b/docs/id/concepts/qa-e2e-automation.md @@ -1,33 +1,37 @@ --- read_when: - Memperluas qa-lab atau qa-channel - - Menambahkan skenario QA berbasis repo + - Menambahkan skenario QA yang didukung repo - Membangun otomasi QA dengan realisme lebih tinggi di sekitar dasbor Gateway -summary: Bentuk otomasi QA privat untuk qa-lab, qa-channel, skenario seed, dan laporan protokol -title: Otomasi QA E2E +summary: Bentuk otomasi QA privat untuk qa-lab, qa-channel, skenario yang di-seed, dan laporan protokol +title: Otomasi E2E QA x-i18n: - generated_at: "2026-04-18T09:05:48Z" + generated_at: "2026-04-20T09:27:34Z" model: gpt-5.4 provider: openai - source_hash: adf8c5f74e8fabdc8e9fd7ecd41afce8b60354c7dd24d92ac926d3c527927cd4 + source_hash: 34245ce871356caeab0d9e0eeeaa9fb4e408920a4a97ad27567fa365d8db17c7 source_path: concepts/qa-e2e-automation.md workflow: 15 --- -# Otomasi QA E2E +# Otomasi E2E QA -Stack QA privat dimaksudkan untuk menguji OpenClaw dengan cara yang lebih realistis dan berbentuk seperti channel dibandingkan yang dapat dilakukan oleh satu unit test. +Stack QA privat dimaksudkan untuk menguji OpenClaw dengan cara yang lebih realistis, +berbentuk kanal, dibandingkan yang bisa dilakukan oleh satu unit test. -Bagian saat ini: +Komponen saat ini: -- `extensions/qa-channel`: channel pesan sintetis dengan permukaan DM, channel, thread, reaction, edit, dan delete. -- `extensions/qa-lab`: UI debugger dan bus QA untuk mengamati transkrip, menyuntikkan pesan masuk, dan mengekspor laporan Markdown. -- `qa/`: aset seed berbasis repo untuk tugas kickoff dan skenario QA baseline. +- `extensions/qa-channel`: kanal pesan sintetis dengan permukaan DM, kanal, thread, + reaksi, edit, dan hapus. +- `extensions/qa-lab`: UI debugger dan bus QA untuk mengamati transkrip, + menyuntikkan pesan masuk, dan mengekspor laporan Markdown. +- `qa/`: aset seed yang didukung repo untuk tugas kickoff dan skenario QA + dasar. Alur operator QA saat ini adalah situs QA dua panel: - Kiri: dasbor Gateway (Control UI) dengan agen. -- Kanan: QA Lab, yang menampilkan transkrip bergaya Slack dan rencana skenario. +- Kanan: QA Lab, menampilkan transkrip bergaya Slack dan rencana skenario. Jalankan dengan: @@ -35,9 +39,13 @@ Jalankan dengan: pnpm qa:lab:up ``` -Perintah itu membangun situs QA, memulai lane gateway berbasis Docker, dan mengekspos halaman QA Lab tempat operator atau loop otomasi dapat memberi agen misi QA, mengamati perilaku channel nyata, dan mencatat apa yang berhasil, gagal, atau tetap terblokir. +Perintah itu membangun situs QA, memulai lane gateway berbasis Docker, dan membuka +halaman QA Lab tempat operator atau loop otomasi dapat memberi agen +misi QA, mengamati perilaku kanal nyata, dan mencatat apa yang berhasil, gagal, atau +tetap terblokir. -Untuk iterasi UI QA Lab yang lebih cepat tanpa membangun ulang image Docker setiap kali, mulai stack dengan bundle QA Lab yang di-bind-mount: +Untuk iterasi UI QA Lab yang lebih cepat tanpa membangun ulang image Docker setiap kali, +mulai stack dengan bundle QA Lab yang di-bind-mount: ```bash pnpm openclaw qa docker-build-image @@ -46,7 +54,9 @@ pnpm qa:lab:up:fast pnpm qa:lab:watch ``` -`qa:lab:up:fast` menjaga layanan Docker tetap berjalan pada image yang sudah dibangun sebelumnya dan melakukan bind-mount `extensions/qa-lab/web/dist` ke dalam container `qa-lab`. `qa:lab:watch` membangun ulang bundle tersebut saat ada perubahan, dan browser memuat ulang secara otomatis saat hash aset QA Lab berubah. +`qa:lab:up:fast` menjaga layanan Docker tetap berjalan pada image yang sudah dibangun dan melakukan bind-mount +`extensions/qa-lab/web/dist` ke dalam container `qa-lab`. `qa:lab:watch` +membangun ulang bundle tersebut saat ada perubahan, dan browser akan memuat ulang otomatis ketika hash aset QA Lab berubah. Untuk lane smoke Matrix dengan transport nyata, jalankan: @@ -54,7 +64,14 @@ Untuk lane smoke Matrix dengan transport nyata, jalankan: pnpm openclaw qa matrix ``` -Lane itu menyediakan homeserver Tuwunel sekali pakai di Docker, mendaftarkan pengguna driver, SUT, dan observer sementara, membuat satu room privat, lalu menjalankan plugin Matrix nyata di dalam child Gateway QA. Lane transport live menjaga konfigurasi child tetap dibatasi pada transport yang sedang diuji, sehingga Matrix berjalan tanpa `qa-channel` di konfigurasi child. Lane ini menulis artefak laporan terstruktur dan log stdout/stderr gabungan ke direktori output QA Matrix yang dipilih. Untuk juga menangkap output build/launcher luar dari `scripts/run-node.mjs`, set `OPENCLAW_RUN_NODE_OUTPUT_LOG=` ke file log lokal repo. +Lane itu memprovisikan homeserver Tuwunel sekali pakai di Docker, mendaftarkan +pengguna driver, SUT, dan observer sementara, membuat satu room privat, lalu menjalankan +Plugin Matrix nyata di dalam child gateway QA. Lane transport live menjaga config child +tetap terbatas pada transport yang sedang diuji, sehingga Matrix berjalan tanpa +`qa-channel` di config child. Lane ini menulis artefak laporan terstruktur dan +log gabungan stdout/stderr ke direktori output Matrix QA yang dipilih. Untuk +menangkap output build/launcher luar `scripts/run-node.mjs` juga, set +`OPENCLAW_RUN_NODE_OUTPUT_LOG=` ke file log lokal repo. Untuk lane smoke Telegram dengan transport nyata, jalankan: @@ -62,87 +79,121 @@ Untuk lane smoke Telegram dengan transport nyata, jalankan: pnpm openclaw qa telegram ``` -Lane itu menargetkan satu grup Telegram privat nyata alih-alih menyediakan server sekali pakai. Lane ini memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, serta dua bot berbeda dalam grup privat yang sama. Bot SUT harus memiliki username Telegram, dan observasi bot-ke-bot bekerja paling baik saat kedua bot mengaktifkan Bot-to-Bot Communication Mode di `@BotFather`. +Lane itu menargetkan satu grup Telegram privat nyata alih-alih memprovisikan server +sekali pakai. Lane ini memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, +`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan +`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, ditambah dua bot berbeda di grup +privat yang sama. Bot SUT harus memiliki username Telegram, dan observasi bot-ke-bot +bekerja paling baik saat kedua bot mengaktifkan Bot-to-Bot Communication Mode +di `@BotFather`. +Perintah akan keluar dengan status non-zero ketika ada skenario yang gagal. Gunakan `--allow-failures` ketika +Anda menginginkan artefak tanpa exit code gagal. -Lane transport live sekarang berbagi satu kontrak yang lebih kecil alih-alih masing-masing menciptakan bentuk daftar skenario sendiri: +Lane transport live sekarang berbagi satu kontrak yang lebih kecil alih-alih masing-masing +menciptakan bentuk daftar skenario sendiri: -`qa-channel` tetap menjadi suite perilaku produk sintetis yang luas dan bukan bagian dari matriks cakupan transport live. +`qa-channel` tetap menjadi suite perilaku produk sintetis yang luas dan tidak termasuk +dalam matriks cakupan transport live. -| Lane | Canary | Gating mention | Blokir allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaction | Perintah help | -| -------- | ------ | -------------- | ---------------- | -------------------- | ---------------------- | -------------------- | -------------- | ------------------ | ------------- | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| Lane | Canary | Penyaringan mention | Blok allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah help | +| -------- | ------ | ------------------- | -------------- | -------------------- | ---------------------- | -------------------- | -------------- | ---------------- | ------------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | -Ini menjaga `qa-channel` sebagai suite perilaku produk yang luas, sementara Matrix, Telegram, dan transport live di masa mendatang berbagi satu daftar periksa kontrak transport yang eksplisit. +Ini menjaga `qa-channel` tetap sebagai suite perilaku produk yang luas sementara Matrix, +Telegram, dan transport live di masa depan berbagi satu daftar pemeriksaan kontrak transport yang eksplisit. -Untuk lane VM Linux sekali pakai tanpa membawa Docker ke jalur QA, jalankan: +Untuk lane VM Linux sekali pakai tanpa membawa Docker ke dalam jalur QA, jalankan: ```bash pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline ``` -Ini menyalakan guest Multipass baru, memasang dependensi, membangun OpenClaw di dalam guest, menjalankan `qa suite`, lalu menyalin kembali laporan dan ringkasan QA normal ke `.artifacts/qa-e2e/...` di host. -Lane ini menggunakan kembali perilaku pemilihan skenario yang sama seperti `qa suite` di host. -Eksekusi suite di host dan Multipass menjalankan beberapa skenario terpilih secara paralel dengan worker Gateway terisolasi secara default, hingga 64 worker atau sebanyak jumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk eksekusi serial. -Eksekusi live meneruskan input auth QA yang didukung dan praktis untuk guest: key provider berbasis env, path konfigurasi provider live QA, dan `CODEX_HOME` jika ada. Pertahankan `--output-dir` di bawah root repo agar guest dapat menulis kembali melalui workspace yang di-mount. +Ini mem-boot guest Multipass baru, menginstal dependensi, membangun OpenClaw +di dalam guest, menjalankan `qa suite`, lalu menyalin kembali laporan dan +ringkasan QA normal ke `.artifacts/qa-e2e/...` di host. +Perintah ini menggunakan kembali perilaku pemilihan skenario yang sama seperti `qa suite` di host. +Eksekusi suite host dan Multipass menjalankan beberapa skenario terpilih secara paralel +dengan worker gateway terisolasi secara default. `qa-channel` default ke concurrency +4, dibatasi oleh jumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan +jumlah worker, atau `--concurrency 1` untuk eksekusi serial. +Perintah akan keluar dengan status non-zero ketika ada skenario yang gagal. Gunakan `--allow-failures` ketika +Anda menginginkan artefak tanpa exit code gagal. +Eksekusi live meneruskan input auth QA yang didukung dan praktis untuk +guest: key provider berbasis env, path config provider live QA, dan +`CODEX_HOME` bila ada. Pertahankan `--output-dir` di bawah root repo agar guest +dapat menulis kembali melalui workspace yang di-mount. -## Seed berbasis repo +## Seed yang didukung repo Aset seed berada di `qa/`: - `qa/scenarios/index.md` - `qa/scenarios//*.md` -Ini sengaja disimpan di git agar rencana QA terlihat baik oleh manusia maupun agen. +Ini sengaja disimpan di git agar rencana QA terlihat oleh manusia maupun +agen. -`qa-lab` harus tetap menjadi runner markdown generik. Setiap file markdown skenario adalah sumber kebenaran untuk satu eksekusi pengujian dan harus mendefinisikan: +`qa-lab` harus tetap menjadi runner markdown generik. Setiap file markdown skenario adalah +sumber kebenaran untuk satu eksekusi pengujian dan harus mendefinisikan: - metadata skenario -- metadata kategori, capability, lane, dan risk opsional -- referensi docs dan code +- metadata kategori, kapabilitas, lane, dan risiko opsional +- referensi docs dan kode - persyaratan Plugin opsional -- patch konfigurasi Gateway opsional +- patch config gateway opsional - `qa-flow` yang dapat dieksekusi -Permukaan runtime yang dapat digunakan ulang dan mendukung `qa-flow` boleh tetap generik dan lintas area. Misalnya, skenario markdown dapat menggabungkan helper sisi transport dengan helper sisi browser yang mengendalikan Control UI tersemat melalui seam Gateway `browser.request` tanpa menambahkan runner kasus khusus. +Permukaan runtime yang dapat digunakan ulang yang mendukung `qa-flow` boleh tetap generik +dan lintas bidang. Sebagai contoh, skenario markdown dapat menggabungkan helper sisi transport +dengan helper sisi browser yang menggerakkan Control UI tersemat melalui +seam Gateway `browser.request` tanpa menambahkan runner kasus khusus. -File skenario harus dikelompokkan berdasarkan capability produk, bukan folder pohon sumber. Pertahankan ID skenario tetap stabil saat file dipindahkan; gunakan `docsRefs` dan `codeRefs` untuk keterlacakan implementasi. +File skenario harus dikelompokkan berdasarkan kapabilitas produk, bukan folder +pohon sumber. Jaga ID skenario tetap stabil saat file dipindahkan; gunakan `docsRefs` dan `codeRefs` +untuk keterlacakan implementasi. -Daftar baseline harus tetap cukup luas untuk mencakup: +Daftar dasar harus tetap cukup luas untuk mencakup: -- chat DM dan channel +- DM dan chat kanal - perilaku thread - siklus hidup aksi pesan - callback Cron -- penarikan memori -- perpindahan model +- pemanggilan kembali memori +- pergantian model - handoff subagen -- membaca repo dan docs +- pembacaan repo dan pembacaan docs - satu tugas build kecil seperti Lobster Invaders ## Lane mock provider `qa suite` memiliki dua lane mock provider lokal: -- `mock-openai` adalah mock OpenClaw yang sadar skenario. Ini tetap menjadi lane mock deterministik default untuk QA berbasis repo dan gate paritas. -- `aimock` memulai server provider berbasis AIMock untuk cakupan protokol, fixture, record/replay, dan chaos yang eksperimental. Ini bersifat tambahan dan tidak menggantikan dispatcher skenario `mock-openai`. +- `mock-openai` adalah mock OpenClaw yang sadar skenario. Ini tetap menjadi + lane mock deterministik default untuk QA yang didukung repo dan gate paritas. +- `aimock` memulai server provider berbasis AIMock untuk cakupan protokol, + fixture, record/replay, dan chaos eksperimental. Ini bersifat tambahan dan tidak menggantikan dispatcher skenario `mock-openai`. Implementasi lane provider berada di `extensions/qa-lab/src/providers/`. -Setiap provider memiliki default, startup server lokal, konfigurasi model Gateway, kebutuhan staging auth-profile, dan flag capability live/mock masing-masing. Kode suite dan gateway bersama harus merutekan melalui registry provider alih-alih bercabang berdasarkan nama provider. +Setiap provider memiliki default, startup server lokal, config model gateway, +kebutuhan staging auth-profile, dan flag kapabilitas live/mock sendiri. Kode suite dan gateway +bersama harus merutekan melalui registry provider alih-alih bercabang berdasarkan +nama provider. -## Adapter transport +## Adaptor transport `qa-lab` memiliki seam transport generik untuk skenario QA markdown. -`qa-channel` adalah adapter pertama pada seam itu, tetapi target desainnya lebih luas: -channel nyata atau sintetis di masa mendatang harus dapat dipasang ke runner suite yang sama alih-alih menambahkan runner QA khusus transport. +`qa-channel` adalah adaptor pertama pada seam tersebut, tetapi target desainnya lebih luas: +kanal nyata atau sintetis di masa depan harus dapat dipasang ke runner suite yang sama +alih-alih menambahkan runner QA khusus transport. Pada tingkat arsitektur, pembagiannya adalah: -- `qa-lab` memiliki eksekusi skenario generik, konkurensi worker, penulisan artefak, dan pelaporan. -- adapter transport memiliki konfigurasi Gateway, kesiapan, observasi inbound dan outbound, aksi transport, dan status transport yang dinormalisasi. -- file skenario markdown di bawah `qa/scenarios/` mendefinisikan eksekusi pengujian; `qa-lab` menyediakan permukaan runtime yang dapat digunakan ulang yang mengeksekusinya. +- `qa-lab` memiliki eksekusi skenario generik, concurrency worker, penulisan artefak, dan pelaporan. +- adaptor transport memiliki config gateway, kesiapan, observasi masuk dan keluar, aksi transport, dan state transport yang dinormalisasi. +- file skenario markdown di bawah `qa/scenarios/` mendefinisikan eksekusi pengujian; `qa-lab` menyediakan permukaan runtime yang dapat digunakan ulang untuk mengeksekusinya. -Panduan adopsi untuk maintainer terkait adapter channel baru tersedia di +Panduan adopsi untuk adaptor kanal baru yang ditujukan bagi maintainer berada di [Testing](/id/help/testing#adding-a-channel-to-qa). ## Pelaporan @@ -155,7 +206,8 @@ Laporan tersebut harus menjawab: - Apa yang tetap terblokir - Skenario tindak lanjut apa yang layak ditambahkan -Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama di beberapa ref model live dan tulis laporan Markdown yang dinilai: +Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama di beberapa ref model live +dan tulis laporan Markdown yang dinilai: ```bash pnpm openclaw qa character-eval \ @@ -174,24 +226,41 @@ pnpm openclaw qa character-eval \ --judge-concurrency 16 ``` -Perintah tersebut menjalankan child process gateway QA lokal, bukan Docker. Skenario evaluasi karakter harus menetapkan persona melalui `SOUL.md`, lalu menjalankan giliran pengguna biasa seperti chat, bantuan workspace, dan tugas file kecil. Model kandidat tidak boleh diberi tahu bahwa model itu sedang dievaluasi. Perintah ini mempertahankan setiap transkrip lengkap, mencatat statistik dasar eksekusi, lalu meminta model juri dalam mode cepat dengan penalaran `xhigh` untuk memberi peringkat eksekusi berdasarkan naturalness, vibe, dan humor. -Gunakan `--blind-judge-models` saat membandingkan provider: prompt juri tetap mendapatkan setiap transkrip dan status eksekusi, tetapi ref kandidat diganti dengan label netral seperti `candidate-01`; laporan memetakan peringkat kembali ke ref nyata setelah parsing. -Eksekusi kandidat default menggunakan thinking `high`, dengan `xhigh` untuk model OpenAI yang mendukungnya. Override kandidat tertentu secara inline dengan -`--model provider/model,thinking=`. `--thinking ` tetap menetapkan fallback global, dan bentuk lama `--model-thinking ` dipertahankan untuk kompatibilitas. -Ref kandidat OpenAI default ke mode cepat sehingga pemrosesan prioritas digunakan saat provider mendukungnya. Tambahkan `,fast`, `,no-fast`, atau `,fast=false` secara inline saat satu kandidat atau juri memerlukan override. Berikan `--fast` hanya jika Anda ingin memaksa mode cepat aktif untuk setiap model kandidat. Durasi kandidat dan juri dicatat dalam laporan untuk analisis benchmark, tetapi prompt juri secara eksplisit mengatakan untuk tidak memberi peringkat berdasarkan kecepatan. -Eksekusi model kandidat dan juri sama-sama default ke konkurensi 16. Turunkan -`--concurrency` atau `--judge-concurrency` saat batas provider atau tekanan gateway lokal membuat eksekusi terlalu bising. +Perintah ini menjalankan proses child gateway QA lokal, bukan Docker. Skenario evaluasi karakter +harus menetapkan persona melalui `SOUL.md`, lalu menjalankan giliran pengguna biasa +seperti chat, bantuan workspace, dan tugas file kecil. Model kandidat +tidak boleh diberi tahu bahwa model tersebut sedang dievaluasi. Perintah ini mempertahankan setiap +transkrip lengkap, mencatat statistik dasar eksekusi, lalu meminta model penilai dalam mode fast dengan +penalaran `xhigh` untuk memberi peringkat eksekusi berdasarkan kealamian, vibe, dan humor. +Gunakan `--blind-judge-models` saat membandingkan provider: +prompt penilai tetap mendapatkan setiap transkrip dan status eksekusi, tetapi ref kandidat diganti +dengan label netral seperti `candidate-01`; laporan memetakan kembali peringkat ke ref nyata setelah +parsing. +Eksekusi kandidat default ke thinking `high`, dengan `xhigh` untuk model OpenAI yang +mendukungnya. Override kandidat tertentu secara inline dengan +`--model provider/model,thinking=`. `--thinking ` tetap menetapkan +fallback global, dan bentuk lama `--model-thinking ` tetap +dipertahankan untuk kompatibilitas. +Ref kandidat OpenAI default ke mode fast sehingga pemrosesan prioritas digunakan jika +provider mendukungnya. Tambahkan `,fast`, `,no-fast`, atau `,fast=false` secara inline ketika satu +kandidat atau penilai memerlukan override. Berikan `--fast` hanya jika Anda ingin +memaksa mode fast aktif untuk setiap model kandidat. Durasi kandidat dan penilai +dicatat dalam laporan untuk analisis benchmark, tetapi prompt penilai secara eksplisit mengatakan +untuk tidak memberi peringkat berdasarkan kecepatan. +Eksekusi model kandidat dan penilai keduanya default ke concurrency 16. Turunkan +`--concurrency` atau `--judge-concurrency` saat batas provider atau tekanan gateway lokal +membuat eksekusi terlalu bising. Saat tidak ada kandidat `--model` yang diberikan, evaluasi karakter akan default ke `openai/gpt-5.4`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`, `anthropic/claude-sonnet-4-6`, `zai/glm-5.1`, `moonshot/kimi-k2.5`, dan `google/gemini-3.1-pro-preview` saat tidak ada `--model` yang diberikan. -Saat tidak ada `--judge-model` yang diberikan, juri akan default ke +Saat tidak ada `--judge-model` yang diberikan, penilai akan default ke `openai/gpt-5.4,thinking=xhigh,fast` dan `anthropic/claude-opus-4-6,thinking=high`. -## Dokumen terkait +## Docs terkait - [Testing](/id/help/testing) - [QA Channel](/id/channels/qa-channel) -- [Dashboard](/web/dashboard) +- [Dasbor](/web/dashboard) diff --git a/docs/id/gateway/configuration-reference.md b/docs/id/gateway/configuration-reference.md index 713facecd..b47b30f38 100644 --- a/docs/id/gateway/configuration-reference.md +++ b/docs/id/gateway/configuration-reference.md @@ -1,41 +1,41 @@ --- read_when: - - Anda memerlukan semantik konfigurasi tingkat bidang atau nilai default yang tepat - - Anda sedang memvalidasi blok konfigurasi channel, model, gateway, atau tool + - Anda memerlukan semantik konfigurasi atau nilai default yang tepat di tingkat field + - Anda sedang memvalidasi blok konfigurasi channel, model, gateway, atau alat summary: Referensi konfigurasi Gateway untuk kunci inti OpenClaw, nilai default, dan tautan ke referensi subsistem khusus title: Referensi Konfigurasi x-i18n: - generated_at: "2026-04-18T09:05:47Z" + generated_at: "2026-04-20T09:27:35Z" model: gpt-5.4 provider: openai - source_hash: 4b504c9c6b47d7a327a0acf6934561c9b2606c01cc8ebe5526ccde73033d759f + source_hash: 22b10f1f133374cd29ef4a5ec4fb9c9938eb51184ad82e1aa2e5f6f7af58585e source_path: gateway/configuration-reference.md workflow: 15 --- # Referensi Konfigurasi -Referensi konfigurasi inti untuk `~/.openclaw/openclaw.json`. Untuk ikhtisar berbasis tugas, lihat [Konfigurasi](/id/gateway/configuration). +Referensi konfigurasi inti untuk `~/.openclaw/openclaw.json`. Untuk gambaran umum berbasis tugas, lihat [Konfigurasi](/id/gateway/configuration). -Halaman ini mencakup permukaan konfigurasi utama OpenClaw dan menyediakan tautan keluar saat suatu subsistem memiliki referensi mendalamnya sendiri. Halaman ini **tidak** mencoba menyisipkan setiap katalog perintah milik channel/plugin atau setiap knob memory/QMD mendalam dalam satu halaman. +Halaman ini mencakup permukaan konfigurasi utama OpenClaw dan menautkan ke luar saat suatu subsistem memiliki referensi lebih mendalamnya sendiri. Halaman ini **tidak** mencoba menyisipkan setiap katalog perintah milik channel/Plugin atau setiap knob mendalam memory/QMD dalam satu halaman. Sumber kebenaran kode: -- `openclaw config schema` menampilkan JSON Schema aktif yang digunakan untuk validasi dan UI Kontrol, dengan metadata bundled/plugin/channel digabungkan saat tersedia -- `config.schema.lookup` mengembalikan satu node schema yang dicakup jalur untuk alat penelusuran mendalam -- `pnpm config:docs:check` / `pnpm config:docs:gen` memvalidasi hash baseline dokumen konfigurasi terhadap permukaan schema saat ini +- `openclaw config schema` mencetak JSON Schema langsung yang digunakan untuk validasi dan Control UI, dengan metadata bundled/Plugin/channel digabungkan saat tersedia +- `config.schema.lookup` mengembalikan satu node skema yang dicakup path untuk alat penelusuran mendalam +- `pnpm config:docs:check` / `pnpm config:docs:gen` memvalidasi hash baseline dokumen konfigurasi terhadap permukaan skema saat ini Referensi mendalam khusus: - [Referensi konfigurasi Memory](/id/reference/memory-config) untuk `agents.defaults.memorySearch.*`, `memory.qmd.*`, `memory.citations`, dan konfigurasi dreaming di bawah `plugins.entries.memory-core.config.dreaming` -- [Slash Commands](/id/tools/slash-commands) untuk katalog perintah built-in + bundled saat ini -- halaman channel/plugin pemilik untuk permukaan perintah khusus channel +- [Slash Commands](/id/tools/slash-commands) untuk katalog perintah bawaan + bundled saat ini +- halaman channel/Plugin pemilik untuk permukaan perintah khusus channel -Format konfigurasi adalah **JSON5** (komentar + koma di akhir diperbolehkan). Semua bidang bersifat opsional — OpenClaw menggunakan nilai default yang aman jika dihilangkan. +Format konfigurasi adalah **JSON5** (komentar + trailing comma diperbolehkan). Semua field bersifat opsional — OpenClaw menggunakan nilai default aman saat dihilangkan. --- -## Channels +## Channel Setiap channel dimulai secara otomatis saat bagian konfigurasinya ada (kecuali `enabled: false`). @@ -43,28 +43,28 @@ Setiap channel dimulai secara otomatis saat bagian konfigurasinya ada (kecuali ` Semua channel mendukung kebijakan DM dan kebijakan grup: -| Kebijakan DM | Perilaku | -| ------------------- | --------------------------------------------------------------- | -| `pairing` (default) | Pengirim yang tidak dikenal mendapatkan kode pairing sekali pakai; owner harus menyetujui | -| `allowlist` | Hanya pengirim di `allowFrom` (atau paired allow store) | -| `open` | Izinkan semua DM masuk (memerlukan `allowFrom: ["*"]`) | -| `disabled` | Abaikan semua DM masuk | +| Kebijakan DM | Perilaku | +| ------------------- | ------------------------------------------------------------- | +| `pairing` (default) | Pengirim yang tidak dikenal mendapat kode pairing sekali pakai; pemilik harus menyetujui | +| `allowlist` | Hanya pengirim di `allowFrom` (atau paired allow store) | +| `open` | Izinkan semua DM masuk (memerlukan `allowFrom: ["*"]`) | +| `disabled` | Abaikan semua DM masuk | | Kebijakan grup | Perilaku | | --------------------- | ----------------------------------------------------- | | `allowlist` (default) | Hanya grup yang cocok dengan allowlist yang dikonfigurasi | -| `open` | Lewati allowlist grup (mention-gating tetap berlaku) | +| `open` | Lewati allowlist grup (pembatasan mention tetap berlaku) | | `disabled` | Blokir semua pesan grup/room | -`channels.defaults.groupPolicy` menetapkan default saat `groupPolicy` penyedia tidak disetel. +`channels.defaults.groupPolicy` menetapkan default saat `groupPolicy` provider tidak diatur. Kode pairing kedaluwarsa setelah 1 jam. Permintaan pairing DM yang tertunda dibatasi hingga **3 per channel**. -Jika blok penyedia tidak ada sama sekali (`channels.` tidak ada), kebijakan grup runtime kembali ke `allowlist` (fail-closed) dengan peringatan saat startup. +Jika blok provider tidak ada sama sekali (`channels.` tidak ada), kebijakan grup runtime akan fallback ke `allowlist` (fail-closed) dengan peringatan saat startup. ### Override model channel -Gunakan `channels.modelByChannel` untuk menetapkan ID channel tertentu ke sebuah model. Nilai menerima `provider/model` atau alias model yang dikonfigurasi. Pemetaan channel diterapkan saat sebuah sesi belum memiliki override model (misalnya, disetel melalui `/model`). +Gunakan `channels.modelByChannel` untuk menetapkan ID channel tertentu ke sebuah model. Nilai menerima `provider/model` atau alias model yang dikonfigurasi. Pemetaan channel diterapkan saat sesi belum memiliki override model (misalnya, diatur melalui `/model`). ```json5 { @@ -87,7 +87,7 @@ Gunakan `channels.modelByChannel` untuk menetapkan ID channel tertentu ke sebuah ### Default channel dan Heartbeat -Gunakan `channels.defaults` untuk perilaku kebijakan grup dan Heartbeat bersama di semua penyedia: +Gunakan `channels.defaults` untuk perilaku kebijakan grup dan Heartbeat bersama di seluruh provider: ```json5 { @@ -105,15 +105,15 @@ Gunakan `channels.defaults` untuk perilaku kebijakan grup dan Heartbeat bersama } ``` -- `channels.defaults.groupPolicy`: kebijakan grup fallback saat `groupPolicy` tingkat penyedia tidak disetel. -- `channels.defaults.contextVisibility`: mode visibilitas konteks tambahan default untuk semua channel. Nilai: `all` (default, sertakan semua konteks kutipan/thread/riwayat), `allowlist` (hanya sertakan konteks dari pengirim dalam allowlist), `allowlist_quote` (sama seperti allowlist tetapi pertahankan konteks kutipan/balasan eksplisit). Override per channel: `channels..contextVisibility`. +- `channels.defaults.groupPolicy`: kebijakan grup fallback saat `groupPolicy` tingkat provider tidak diatur. +- `channels.defaults.contextVisibility`: mode visibilitas konteks tambahan default untuk semua channel. Nilai: `all` (default, sertakan semua konteks kutipan/thread/riwayat), `allowlist` (hanya sertakan konteks dari pengirim yang ada di allowlist), `allowlist_quote` (sama seperti allowlist tetapi tetap pertahankan konteks kutipan/balasan eksplisit). Override per-channel: `channels..contextVisibility`. - `channels.defaults.heartbeat.showOk`: sertakan status channel yang sehat dalam output Heartbeat. -- `channels.defaults.heartbeat.showAlerts`: sertakan status menurun/error dalam output Heartbeat. -- `channels.defaults.heartbeat.useIndicator`: tampilkan output Heartbeat bergaya indikator yang ringkas. +- `channels.defaults.heartbeat.showAlerts`: sertakan status yang menurun/error dalam output Heartbeat. +- `channels.defaults.heartbeat.useIndicator`: render output Heartbeat bergaya indikator yang ringkas. ### WhatsApp -WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai secara otomatis saat sesi yang ditautkan ada. +WhatsApp berjalan melalui channel web Gateway (Baileys Web). Channel ini dimulai secara otomatis saat sesi yang ditautkan ada. ```json5 { @@ -164,10 +164,10 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai } ``` -- Perintah keluar secara default menggunakan akun `default` jika ada; jika tidak, ID akun terkonfigurasi pertama (diurutkan). +- Perintah keluar default menggunakan akun `default` jika ada; jika tidak, gunakan ID akun pertama yang dikonfigurasi (diurutkan). - `channels.whatsapp.defaultAccount` opsional menggantikan pemilihan akun default fallback tersebut saat cocok dengan ID akun yang dikonfigurasi. -- Direktori auth Baileys akun tunggal lama dimigrasikan oleh `openclaw doctor` ke `whatsapp/default`. -- Override per akun: `channels.whatsapp.accounts..sendReadReceipts`, `channels.whatsapp.accounts..dmPolicy`, `channels.whatsapp.accounts..allowFrom`. +- Direktori auth Baileys single-account lama dimigrasikan oleh `openclaw doctor` ke `whatsapp/default`. +- Override per-akun: `channels.whatsapp.accounts..sendReadReceipts`, `channels.whatsapp.accounts..dmPolicy`, `channels.whatsapp.accounts..allowFrom`. @@ -227,9 +227,9 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai - Token bot: `channels.telegram.botToken` atau `channels.telegram.tokenFile` (hanya file biasa; symlink ditolak), dengan `TELEGRAM_BOT_TOKEN` sebagai fallback untuk akun default. - `channels.telegram.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Dalam pengaturan multi-akun (2+ ID akun), setel default eksplisit (`channels.telegram.defaultAccount` atau `channels.telegram.accounts.default`) untuk menghindari perutean fallback; `openclaw doctor` akan memperingatkan jika ini tidak ada atau tidak valid. +- Dalam penyiapan multi-akun (2+ ID akun), atur default yang eksplisit (`channels.telegram.defaultAccount` atau `channels.telegram.accounts.default`) untuk menghindari routing fallback; `openclaw doctor` akan memberi peringatan saat ini tidak ada atau tidak valid. - `configWrites: false` memblokir penulisan konfigurasi yang dipicu Telegram (migrasi ID supergroup, `/config set|unset`). -- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk topik forum (gunakan `chatId:topic:topicId` kanonis di `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk topik forum (gunakan `chatId:topic:topicId` kanonis di `match.peer.id`). Semantik field dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). - Pratinjau stream Telegram menggunakan `sendMessage` + `editMessageText` (berfungsi di chat langsung dan grup). - Kebijakan retry: lihat [Kebijakan retry](/id/concepts/retry). @@ -286,7 +286,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai historyLimit: 20, textChunkLimit: 2000, chunkMode: "length", // length | newline - streaming: "off", // off | partial | block | progress (progress dipetakan ke partial di Discord) + streaming: "off", // off | partial | block | progress (progress maps to partial on Discord) maxLinesPerMessage: 17, ui: { components: { @@ -297,7 +297,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai enabled: true, idleHours: 24, maxAgeHours: 0, - spawnSubagentSessions: false, // opt-in untuk sessions_spawn({ thread: true }) + spawnSubagentSessions: false, // opt-in for sessions_spawn({ thread: true }) }, voice: { enabled: true, @@ -334,35 +334,35 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai ``` - Token: `channels.discord.token`, dengan `DISCORD_BOT_TOKEN` sebagai fallback untuk akun default. -- Panggilan outbound langsung yang memberikan `token` Discord eksplisit menggunakan token tersebut untuk panggilan; pengaturan retry/kebijakan akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. +- Panggilan keluar langsung yang menyediakan `token` Discord eksplisit menggunakan token tersebut untuk panggilan; pengaturan retry/kebijakan akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. - `channels.discord.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Gunakan `user:` (DM) atau `channel:` (channel guild) untuk target pengiriman; ID numerik polos ditolak. -- Slug guild menggunakan huruf kecil dengan spasi diganti `-`; kunci channel menggunakan nama yang sudah di-slug (tanpa `#`). Utamakan ID guild. -- Pesan yang ditulis bot diabaikan secara default. `allowBots: true` mengaktifkannya; gunakan `allowBots: "mentions"` agar hanya menerima pesan bot yang menyebut bot tersebut (pesan sendiri tetap difilter). -- `channels.discord.guilds..ignoreOtherMentions` (dan override channel) menghapus pesan yang menyebut pengguna atau role lain tetapi tidak menyebut bot (tidak termasuk @everyone/@here). +- Gunakan `user:` (DM) atau `channel:` (channel guild) untuk target pengiriman; ID numerik mentah ditolak. +- Slug guild menggunakan huruf kecil dengan spasi diganti `-`; key channel menggunakan nama yang sudah di-slug (tanpa `#`). Utamakan ID guild. +- Pesan yang ditulis bot diabaikan secara default. `allowBots: true` mengaktifkannya; gunakan `allowBots: "mentions"` untuk hanya menerima pesan bot yang menyebut bot (pesan sendiri tetap difilter). +- `channels.discord.guilds..ignoreOtherMentions` (dan override channel) membuang pesan yang menyebut pengguna atau role lain tetapi bukan bot (tidak termasuk @everyone/@here). - `maxLinesPerMessage` (default 17) membagi pesan yang tinggi bahkan saat masih di bawah 2000 karakter. -- `channels.discord.threadBindings` mengontrol perutean terikat thread Discord: - - `enabled`: override Discord untuk fitur sesi terikat thread (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, serta pengiriman/perutean terikat) +- `channels.discord.threadBindings` mengontrol routing terikat thread Discord: + - `enabled`: override Discord untuk fitur sesi terikat thread (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, dan pengiriman/routing terikat) - `idleHours`: override Discord untuk auto-unfocus karena tidak aktif dalam jam (`0` menonaktifkan) - `maxAgeHours`: override Discord untuk usia maksimum keras dalam jam (`0` menonaktifkan) - `spawnSubagentSessions`: sakelar opt-in untuk pembuatan/pengikatan thread otomatis `sessions_spawn({ thread: true })` -- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk channel dan thread (gunakan id channel/thread di `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk channel dan thread (gunakan id channel/thread di `match.peer.id`). Semantik field dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). - `channels.discord.ui.components.accentColor` menetapkan warna aksen untuk kontainer komponen Discord v2. - `channels.discord.voice` mengaktifkan percakapan channel suara Discord serta override auto-join + TTS opsional. -- `channels.discord.voice.daveEncryption` dan `channels.discord.voice.decryptionFailureTolerance` diteruskan ke opsi DAVE `@discordjs/voice` (`true` dan `24` secara default). -- OpenClaw juga mencoba pemulihan penerimaan suara dengan keluar/bergabung kembali ke sesi suara setelah kegagalan dekripsi berulang. -- `channels.discord.streaming` adalah kunci mode stream kanonis. Nilai lama `streamMode` dan nilai boolean `streaming` dimigrasikan otomatis. +- `channels.discord.voice.daveEncryption` dan `channels.discord.voice.decryptionFailureTolerance` diteruskan ke opsi DAVE `@discordjs/voice` (default `true` dan `24`). +- OpenClaw juga mencoba pemulihan penerimaan suara dengan keluar/bergabung ulang ke sesi suara setelah kegagalan dekripsi berulang. +- `channels.discord.streaming` adalah key mode stream kanonis. Nilai lama `streamMode` dan boolean `streaming` dimigrasikan otomatis. - `channels.discord.autoPresence` memetakan ketersediaan runtime ke presence bot (healthy => online, degraded => idle, exhausted => dnd) dan memungkinkan override teks status opsional. - `channels.discord.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan nama/tag yang dapat berubah (mode kompatibilitas break-glass). -- `channels.discord.execApprovals`: pengiriman persetujuan exec native Discord dan otorisasi penyetuju. - - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif saat penyetuju dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. - - `approvers`: ID pengguna Discord yang diizinkan menyetujui permintaan exec. Menggunakan `commands.ownerAllowFrom` sebagai fallback jika dihilangkan. - - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan persetujuan bagi semua agen. - - `sessionFilter`: pola kunci sesi opsional (substring atau regex). - - `target`: tempat mengirim prompt persetujuan. `"dm"` (default) mengirim ke DM penyetuju, `"channel"` mengirim ke channel asal, `"both"` mengirim ke keduanya. Saat target mencakup `"channel"`, tombol hanya dapat digunakan oleh penyetuju yang berhasil di-resolve. - - `cleanupAfterResolve`: saat `true`, menghapus DM persetujuan setelah disetujui, ditolak, atau timeout. +- `channels.discord.execApprovals`: pengiriman persetujuan exec native Discord dan otorisasi pemberi persetujuan. + - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif saat approver dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. + - `approvers`: ID pengguna Discord yang diizinkan menyetujui permintaan exec. Menggunakan fallback ke `commands.ownerAllowFrom` saat dihilangkan. + - `agentFilter`: allowlist ID agent opsional. Hilangkan untuk meneruskan persetujuan bagi semua agent. + - `sessionFilter`: pola key sesi opsional (substring atau regex). + - `target`: tempat mengirim prompt persetujuan. `"dm"` (default) mengirim ke DM approver, `"channel"` mengirim ke channel asal, `"both"` mengirim ke keduanya. Saat target mencakup `"channel"`, tombol hanya dapat digunakan oleh approver yang berhasil di-resolve. + - `cleanupAfterResolve`: saat `true`, menghapus DM persetujuan setelah persetujuan, penolakan, atau timeout. -**Mode notifikasi reaksi:** `off` (tidak ada), `own` (pesan bot, default), `all` (semua pesan), `allowlist` (dari `guilds..users` pada semua pesan). +**Mode notifikasi reaction:** `off` (tidak ada), `own` (pesan bot sendiri, default), `all` (semua pesan), `allowlist` (dari `guilds..users` pada semua pesan). ### Google Chat @@ -393,8 +393,8 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai } ``` -- JSON akun layanan: inline (`serviceAccount`) atau berbasis file (`serviceAccountFile`). -- SecretRef akun layanan juga didukung (`serviceAccountRef`). +- JSON service account: inline (`serviceAccount`) atau berbasis file (`serviceAccountFile`). +- SecretRef service account juga didukung (`serviceAccountRef`). - Fallback env: `GOOGLE_CHAT_SERVICE_ACCOUNT` atau `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`. - Gunakan `spaces/` atau `users/` untuk target pengiriman. - `channels.googlechat.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan principal email yang dapat berubah (mode kompatibilitas break-glass). @@ -465,29 +465,29 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai ``` - **Mode socket** memerlukan `botToken` dan `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` untuk fallback env akun default). -- **Mode HTTP** memerlukan `botToken` plus `signingSecret` (di root atau per akun). +- **Mode HTTP** memerlukan `botToken` plus `signingSecret` (di root atau per-akun). - `botToken`, `appToken`, `signingSecret`, dan `userToken` menerima string plaintext atau objek SecretRef. -- Snapshot akun Slack mengekspos bidang sumber/status per kredensial seperti `botTokenSource`, `botTokenStatus`, `appTokenStatus`, dan, dalam mode HTTP, `signingSecretStatus`. `configured_unavailable` berarti akun dikonfigurasi melalui SecretRef tetapi jalur perintah/runtime saat ini tidak dapat me-resolve nilai secret. +- Snapshot akun Slack mengekspos field sumber/status per-kredensial seperti `botTokenSource`, `botTokenStatus`, `appTokenStatus`, dan, dalam mode HTTP, `signingSecretStatus`. `configured_unavailable` berarti akun dikonfigurasi melalui SecretRef tetapi path perintah/runtime saat ini tidak dapat me-resolve nilai secret tersebut. - `configWrites: false` memblokir penulisan konfigurasi yang dipicu Slack. - `channels.slack.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- `channels.slack.streaming.mode` adalah kunci mode stream Slack kanonis. `channels.slack.streaming.nativeTransport` mengontrol transport streaming native Slack. Nilai lama `streamMode`, boolean `streaming`, dan `nativeStreaming` dimigrasikan otomatis. +- `channels.slack.streaming.mode` adalah key mode stream Slack kanonis. `channels.slack.streaming.nativeTransport` mengontrol transport streaming native Slack. Nilai lama `streamMode`, boolean `streaming`, dan `nativeStreaming` dimigrasikan otomatis. - Gunakan `user:` (DM) atau `channel:` untuk target pengiriman. -**Mode notifikasi reaksi:** `off`, `own` (default), `all`, `allowlist` (dari `reactionAllowlist`). +**Mode notifikasi reaction:** `off`, `own` (default), `all`, `allowlist` (dari `reactionAllowlist`). -**Isolasi sesi thread:** `thread.historyScope` berlaku per thread (default) atau dibagikan di seluruh channel. `thread.inheritParent` menyalin transkrip channel induk ke thread baru. +**Isolasi sesi thread:** `thread.historyScope` bersifat per-thread (default) atau dibagikan di seluruh channel. `thread.inheritParent` menyalin transkrip channel induk ke thread baru. -- Streaming native Slack plus status thread bergaya asisten Slack "is typing..." memerlukan target thread balasan. DM tingkat atas tetap di luar thread secara default, sehingga menggunakan `typingReaction` atau pengiriman normal alih-alih pratinjau bergaya thread. -- `typingReaction` menambahkan reaksi sementara ke pesan Slack masuk saat balasan sedang berjalan, lalu menghapusnya saat selesai. Gunakan shortcode emoji Slack seperti `"hourglass_flowing_sand"`. -- `channels.slack.execApprovals`: pengiriman persetujuan exec native Slack dan otorisasi penyetuju. Schema sama seperti Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (ID pengguna Slack), `agentFilter`, `sessionFilter`, dan `target` (`"dm"`, `"channel"`, atau `"both"`). +- Streaming native Slack plus status thread gaya asisten Slack "is typing..." memerlukan target thread balasan. DM tingkat atas tetap berada di luar thread secara default, jadi menggunakan `typingReaction` atau pengiriman normal alih-alih pratinjau bergaya thread. +- `typingReaction` menambahkan reaction sementara ke pesan Slack masuk saat balasan sedang berjalan, lalu menghapusnya setelah selesai. Gunakan shortcode emoji Slack seperti `"hourglass_flowing_sand"`. +- `channels.slack.execApprovals`: pengiriman persetujuan exec native Slack dan otorisasi pemberi persetujuan. Skema sama seperti Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (ID pengguna Slack), `agentFilter`, `sessionFilter`, dan `target` (`"dm"`, `"channel"`, atau `"both"`). -| Grup tindakan | Default | Catatan | -| ------------ | ------- | ---------------------- | -| reactions | aktif | React + daftar reaksi | -| messages | aktif | Baca/kirim/edit/hapus | -| pins | aktif | Sematkan/lepas/list | -| memberInfo | aktif | Info anggota | -| emojiList | aktif | Daftar emoji kustom | +| Grup aksi | Default | Catatan | +| ----------- | ------- | ------------------------ | +| reactions | enabled | React + daftar reaction | +| messages | enabled | Baca/kirim/edit/hapus | +| pins | enabled | Pin/unpin/daftar | +| memberInfo | enabled | Info anggota | +| emojiList | enabled | Daftar emoji kustom | ### Mattermost @@ -521,18 +521,18 @@ Mattermost dikirim sebagai Plugin: `openclaw plugins install @openclaw/mattermos } ``` -Mode chat: `oncall` (membalas pada @-mention, default), `onmessage` (setiap pesan), `onchar` (pesan yang dimulai dengan prefiks pemicu). +Mode chat: `oncall` (merespons pada @-mention, default), `onmessage` (setiap pesan), `onchar` (pesan yang dimulai dengan prefiks pemicu). Saat perintah native Mattermost diaktifkan: -- `commands.callbackPath` harus berupa path (misalnya `/api/channels/mattermost/command`), bukan URL penuh. +- `commands.callbackPath` harus berupa path (misalnya `/api/channels/mattermost/command`), bukan URL lengkap. - `commands.callbackUrl` harus me-resolve ke endpoint Gateway OpenClaw dan dapat dijangkau dari server Mattermost. -- Callback slash native diautentikasi dengan token per perintah yang dikembalikan Mattermost selama pendaftaran slash command. Jika pendaftaran gagal atau tidak ada perintah yang diaktifkan, OpenClaw menolak callback dengan `Unauthorized: invalid command token.` +- Callback slash native diautentikasi dengan token per-perintah yang dikembalikan oleh Mattermost selama pendaftaran slash command. Jika pendaftaran gagal atau tidak ada perintah yang diaktifkan, OpenClaw menolak callback dengan `Unauthorized: invalid command token.` - Untuk host callback private/tailnet/internal, Mattermost mungkin memerlukan `ServiceSettings.AllowedUntrustedInternalConnections` untuk menyertakan host/domain callback. - Gunakan nilai host/domain, bukan URL penuh. + Gunakan nilai host/domain, bukan URL lengkap. - `channels.mattermost.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu Mattermost. - `channels.mattermost.requireMention`: wajibkan `@mention` sebelum membalas di channel. -- `channels.mattermost.groups..requireMention`: override mention-gating per channel (`"*"` untuk default). +- `channels.mattermost.groups..requireMention`: override pembatasan mention per-channel (`"*"` untuk default). - `channels.mattermost.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. ### Signal @@ -554,7 +554,7 @@ Saat perintah native Mattermost diaktifkan: } ``` -**Mode notifikasi reaksi:** `off`, `own` (default), `all`, `allowlist` (dari `reactionAllowlist`). +**Mode notifikasi reaction:** `off`, `own` (default), `all`, `allowlist` (dari `reactionAllowlist`). - `channels.signal.account`: tetapkan startup channel ke identitas akun Signal tertentu. - `channels.signal.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu Signal. @@ -570,21 +570,21 @@ BlueBubbles adalah jalur iMessage yang direkomendasikan (didukung Plugin, dikonf bluebubbles: { enabled: true, dmPolicy: "pairing", - // serverUrl, password, webhookPath, kontrol grup, dan tindakan lanjutan: + // serverUrl, password, webhookPath, kontrol grup, dan aksi lanjutan: // lihat /channels/bluebubbles }, }, } ``` -- Jalur kunci inti yang dicakup di sini: `channels.bluebubbles`, `channels.bluebubbles.dmPolicy`. +- Jalur key inti yang dicakup di sini: `channels.bluebubbles`, `channels.bluebubbles.dmPolicy`. - `channels.bluebubbles.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Entri `bindings[]` tingkat atas dengan `type: "acp"` dapat mengikat percakapan BlueBubbles ke sesi ACP persisten. Gunakan handle atau string target BlueBubbles (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) di `match.peer.id`. Semantik bidang bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Entri `bindings[]` tingkat atas dengan `type: "acp"` dapat mengikat percakapan BlueBubbles ke sesi ACP persisten. Gunakan string handle atau target BlueBubbles (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) di `match.peer.id`. Semantik field bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). - Konfigurasi channel BlueBubbles lengkap didokumentasikan di [BlueBubbles](/id/channels/bluebubbles). ### iMessage -OpenClaw menjalankan `imsg rpc` (`JSON-RPC` melalui stdio). Tidak memerlukan daemon atau port. +OpenClaw menjalankan `imsg rpc` (JSON-RPC melalui stdio). Tidak memerlukan daemon atau port. ```json5 { @@ -611,12 +611,12 @@ OpenClaw menjalankan `imsg rpc` (`JSON-RPC` melalui stdio). Tidak memerlukan dae - `channels.imessage.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. - Memerlukan Full Disk Access ke DB Messages. -- Utamakan target `chat_id:`. Gunakan `imsg chats --limit 20` untuk menampilkan daftar chat. -- `cliPath` dapat menunjuk ke wrapper SSH; setel `remoteHost` (`host` atau `user@host`) untuk pengambilan lampiran SCP. +- Utamakan target `chat_id:`. Gunakan `imsg chats --limit 20` untuk mencantumkan chat. +- `cliPath` dapat menunjuk ke wrapper SSH; atur `remoteHost` (`host` atau `user@host`) untuk pengambilan lampiran SCP. - `attachmentRoots` dan `remoteAttachmentRoots` membatasi path lampiran masuk (default: `/Users/*/Library/Messages/Attachments`). -- SCP menggunakan pemeriksaan host-key yang ketat, jadi pastikan host key relay sudah ada di `~/.ssh/known_hosts`. +- SCP menggunakan pemeriksaan host-key ketat, jadi pastikan host key relay sudah ada di `~/.ssh/known_hosts`. - `channels.imessage.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu iMessage. -- Entri `bindings[]` tingkat atas dengan `type: "acp"` dapat mengikat percakapan iMessage ke sesi ACP persisten. Gunakan handle yang dinormalisasi atau target chat eksplisit (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) di `match.peer.id`. Semantik bidang bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Entri `bindings[]` tingkat atas dengan `type: "acp"` dapat mengikat percakapan iMessage ke sesi ACP persisten. Gunakan handle yang dinormalisasi atau target chat eksplisit (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) di `match.peer.id`. Semantik field bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). @@ -629,7 +629,7 @@ exec ssh -T gateway-host imsg "$@" ### Matrix -Matrix didukung extension dan dikonfigurasi di bawah `channels.matrix`. +Matrix didukung ekstensi dan dikonfigurasi di bawah `channels.matrix`. ```json5 { @@ -660,24 +660,24 @@ Matrix didukung extension dan dikonfigurasi di bawah `channels.matrix`. ``` - Auth token menggunakan `accessToken`; auth kata sandi menggunakan `userId` + `password`. -- `channels.matrix.proxy` merutekan lalu lintas HTTP Matrix melalui proxy HTTP(S) eksplisit. Akun bernama dapat menggantinya dengan `channels.matrix.accounts..proxy`. -- `channels.matrix.network.dangerouslyAllowPrivateNetwork` mengizinkan homeserver privat/internal. `proxy` dan opt-in jaringan ini adalah kontrol yang independen. -- `channels.matrix.defaultAccount` memilih akun yang diutamakan dalam pengaturan multi-akun. +- `channels.matrix.proxy` merutekan lalu lintas HTTP Matrix melalui proxy HTTP(S) eksplisit. Akun bernama dapat menimpanya dengan `channels.matrix.accounts..proxy`. +- `channels.matrix.network.dangerouslyAllowPrivateNetwork` mengizinkan homeserver private/internal. `proxy` dan opt-in jaringan ini adalah kontrol yang independen. +- `channels.matrix.defaultAccount` memilih akun yang diutamakan dalam penyiapan multi-akun. - `channels.matrix.autoJoin` default ke `off`, sehingga room yang diundang dan undangan bergaya DM baru diabaikan sampai Anda menetapkan `autoJoin: "allowlist"` dengan `autoJoinAllowlist` atau `autoJoin: "always"`. -- `channels.matrix.execApprovals`: pengiriman persetujuan exec native Matrix dan otorisasi penyetuju. - - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif saat penyetuju dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. +- `channels.matrix.execApprovals`: pengiriman persetujuan exec native Matrix dan otorisasi pemberi persetujuan. + - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif saat approver dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. - `approvers`: ID pengguna Matrix (mis. `@owner:example.org`) yang diizinkan menyetujui permintaan exec. - - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan persetujuan bagi semua agen. - - `sessionFilter`: pola kunci sesi opsional (substring atau regex). + - `agentFilter`: allowlist ID agent opsional. Hilangkan untuk meneruskan persetujuan bagi semua agent. + - `sessionFilter`: pola key sesi opsional (substring atau regex). - `target`: tempat mengirim prompt persetujuan. `"dm"` (default), `"channel"` (room asal), atau `"both"`. - - Override per akun: `channels.matrix.accounts..execApprovals`. -- `channels.matrix.dm.sessionScope` mengontrol cara DM Matrix dikelompokkan ke dalam sesi: `per-user` (default) berbagi berdasarkan peer yang dirutekan, sedangkan `per-room` mengisolasi setiap room DM. -- Probe status Matrix dan lookup direktori live menggunakan kebijakan proxy yang sama seperti lalu lintas runtime. + - Override per-akun: `channels.matrix.accounts..execApprovals`. +- `channels.matrix.dm.sessionScope` mengontrol cara DM Matrix dikelompokkan ke dalam sesi: `per-user` (default) dibagikan berdasarkan peer yang dirutekan, sedangkan `per-room` mengisolasi setiap room DM. +- Probe status Matrix dan lookup direktori langsung menggunakan kebijakan proxy yang sama seperti lalu lintas runtime. - Konfigurasi Matrix lengkap, aturan penargetan, dan contoh penyiapan didokumentasikan di [Matrix](/id/channels/matrix). ### Microsoft Teams -Microsoft Teams didukung extension dan dikonfigurasi di bawah `channels.msteams`. +Microsoft Teams didukung ekstensi dan dikonfigurasi di bawah `channels.msteams`. ```json5 { @@ -692,12 +692,12 @@ Microsoft Teams didukung extension dan dikonfigurasi di bawah `channels.msteams` } ``` -- Jalur kunci inti yang dicakup di sini: `channels.msteams`, `channels.msteams.configWrites`. -- Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, override per tim/per channel) didokumentasikan di [Microsoft Teams](/id/channels/msteams). +- Jalur key inti yang dicakup di sini: `channels.msteams`, `channels.msteams.configWrites`. +- Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, override per-tim/per-channel) didokumentasikan di [Microsoft Teams](/id/channels/msteams). ### IRC -IRC didukung extension dan dikonfigurasi di bawah `channels.irc`. +IRC didukung ekstensi dan dikonfigurasi di bawah `channels.irc`. ```json5 { @@ -718,9 +718,9 @@ IRC didukung extension dan dikonfigurasi di bawah `channels.irc`. } ``` -- Jalur kunci inti yang dicakup di sini: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`. +- Jalur key inti yang dicakup di sini: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`. - `channels.irc.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Konfigurasi channel IRC lengkap (host/port/TLS/channels/allowlist/mention gating) didokumentasikan di [IRC](/id/channels/irc). +- Konfigurasi channel IRC lengkap (host/port/TLS/channel/allowlist/pembatasan mention) didokumentasikan di [IRC](/id/channels/irc). ### Multi-akun (semua channel) @@ -747,26 +747,26 @@ Jalankan beberapa akun per channel (masing-masing dengan `accountId` sendiri): - `default` digunakan saat `accountId` dihilangkan (CLI + routing). - Token env hanya berlaku untuk akun **default**. -- Pengaturan channel dasar berlaku untuk semua akun kecuali diganti per akun. -- Gunakan `bindings[].match.accountId` untuk merutekan setiap akun ke agen yang berbeda. -- Jika Anda menambahkan akun non-default melalui `openclaw channels add` (atau onboarding channel) saat masih menggunakan konfigurasi channel tingkat atas akun tunggal, OpenClaw terlebih dahulu mempromosikan nilai akun tunggal tingkat atas yang dicakup akun ke dalam map akun channel agar akun asli tetap berfungsi. Sebagian besar channel memindahkannya ke `channels..accounts.default`; Matrix dapat mempertahankan target bernama/default yang sudah ada dan cocok. -- Binding khusus channel yang sudah ada (tanpa `accountId`) tetap cocok dengan akun default; binding yang dicakup akun tetap opsional. -- `openclaw doctor --fix` juga memperbaiki bentuk campuran dengan memindahkan nilai akun tunggal tingkat atas yang dicakup akun ke akun hasil promosi yang dipilih untuk channel tersebut. Sebagian besar channel menggunakan `accounts.default`; Matrix dapat mempertahankan target bernama/default yang sudah ada dan cocok. +- Pengaturan channel dasar berlaku untuk semua akun kecuali dioverride per akun. +- Gunakan `bindings[].match.accountId` untuk merutekan setiap akun ke agent yang berbeda. +- Jika Anda menambahkan akun non-default melalui `openclaw channels add` (atau onboarding channel) saat masih menggunakan konfigurasi channel tingkat atas single-account, OpenClaw terlebih dahulu mempromosikan nilai single-account tingkat atas yang dicakup akun ke dalam map akun channel sehingga akun asli tetap berfungsi. Sebagian besar channel memindahkannya ke `channels..accounts.default`; Matrix dapat mempertahankan target bernama/default yang cocok yang sudah ada. +- Binding yang sudah ada dan hanya khusus channel (tanpa `accountId`) tetap cocok dengan akun default; binding khusus akun tetap opsional. +- `openclaw doctor --fix` juga memperbaiki shape campuran dengan memindahkan nilai single-account tingkat atas yang dicakup akun ke akun yang dipromosikan yang dipilih untuk channel tersebut. Sebagian besar channel menggunakan `accounts.default`; Matrix dapat mempertahankan target bernama/default yang cocok yang sudah ada. -### Channel extension lainnya +### Channel ekstensi lainnya -Banyak channel extension dikonfigurasi sebagai `channels.` dan didokumentasikan di halaman channel khusus masing-masing (misalnya Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, dan Twitch). +Banyak channel ekstensi dikonfigurasi sebagai `channels.` dan didokumentasikan di halaman channel khusus masing-masing (misalnya Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, dan Twitch). Lihat indeks channel lengkap: [Channels](/id/channels). -### Mention gating chat grup +### Pembatasan mention chat grup -Pesan grup secara default **memerlukan mention** (mention metadata atau pola regex aman). Berlaku untuk chat grup WhatsApp, Telegram, Discord, Google Chat, dan iMessage. +Pesan grup default-nya **harus menyebut** (metadata mention atau pola regex aman). Berlaku untuk chat grup WhatsApp, Telegram, Discord, Google Chat, dan iMessage. **Jenis mention:** -- **Mention metadata**: @-mention native platform. Diabaikan dalam mode self-chat WhatsApp. -- **Pola teks**: Pola regex aman di `agents.list[].groupChat.mentionPatterns`. Pola tidak valid dan nested repetition yang tidak aman diabaikan. -- Mention gating diberlakukan hanya saat deteksi memungkinkan (mention native atau setidaknya satu pola). +- **Metadata mention**: @-mention native platform. Diabaikan dalam mode self-chat WhatsApp. +- **Pola teks**: pola regex aman di `agents.list[].groupChat.mentionPatterns`. Pola yang tidak valid dan pengulangan bertingkat yang tidak aman diabaikan. +- Pembatasan mention hanya diberlakukan saat deteksi dimungkinkan (mention native atau setidaknya satu pola). ```json5 { @@ -779,7 +779,7 @@ Pesan grup secara default **memerlukan mention** (mention metadata atau pola reg } ``` -`messages.groupChat.historyLimit` menetapkan default global. Channel dapat menggantinya dengan `channels..historyLimit` (atau per akun). Setel `0` untuk menonaktifkan. +`messages.groupChat.historyLimit` menetapkan default global. Channel dapat menimpanya dengan `channels..historyLimit` (atau per-akun). Tetapkan `0` untuk menonaktifkan. #### Batas riwayat DM @@ -796,7 +796,7 @@ Pesan grup secara default **memerlukan mention** (mention metadata atau pola reg } ``` -Resolusi: override per-DM → default penyedia → tanpa batas (semua dipertahankan). +Resolusi: override per-DM → default provider → tanpa batas (semua dipertahankan). Didukung: `telegram`, `whatsapp`, `discord`, `slack`, `signal`, `imessage`, `msteams`. @@ -828,8 +828,8 @@ Sertakan nomor Anda sendiri di `allowFrom` untuk mengaktifkan mode self-chat (me ```json5 { commands: { - native: "auto", // daftarkan perintah native saat didukung - nativeSkills: "auto", // daftarkan perintah skill native saat didukung + native: "auto", // daftarkan perintah native bila didukung + nativeSkills: "auto", // daftarkan perintah Skills native bila didukung text: true, // parse /commands dalam pesan chat bash: false, // izinkan ! (alias: /bash) bashForegroundMs: 2000, @@ -852,38 +852,38 @@ Sertakan nomor Anda sendiri di `allowFrom` untuk mengaktifkan mode self-chat (me -- Blok ini mengonfigurasi permukaan perintah. Untuk katalog perintah built-in + bundled saat ini, lihat [Slash Commands](/id/tools/slash-commands). -- Halaman ini adalah **referensi kunci konfigurasi**, bukan katalog perintah lengkap. Perintah milik channel/plugin seperti QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone`, dan Talk `/voice` didokumentasikan di halaman channel/plugin masing-masing serta [Slash Commands](/id/tools/slash-commands). +- Blok ini mengonfigurasi permukaan perintah. Untuk katalog perintah bawaan + bundled saat ini, lihat [Slash Commands](/id/tools/slash-commands). +- Halaman ini adalah **referensi key konfigurasi**, bukan katalog perintah lengkap. Perintah milik channel/Plugin seperti QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone`, dan Talk `/voice` didokumentasikan di halaman channel/Plugin masing-masing plus [Slash Commands](/id/tools/slash-commands). - Perintah teks harus berupa pesan **mandiri** dengan awalan `/`. - `native: "auto"` mengaktifkan perintah native untuk Discord/Telegram, dan membiarkan Slack nonaktif. -- `nativeSkills: "auto"` mengaktifkan perintah skill native untuk Discord/Telegram, dan membiarkan Slack nonaktif. +- `nativeSkills: "auto"` mengaktifkan perintah Skills native untuk Discord/Telegram, dan membiarkan Slack nonaktif. - Override per channel: `channels.discord.commands.native` (bool atau `"auto"`). `false` menghapus perintah yang sebelumnya terdaftar. - Override pendaftaran skill native per channel dengan `channels..commands.nativeSkills`. - `channels.telegram.customCommands` menambahkan entri menu bot Telegram tambahan. - `bash: true` mengaktifkan `! ` untuk shell host. Memerlukan `tools.elevated.enabled` dan pengirim ada di `tools.elevated.allowFrom.`. -- `config: true` mengaktifkan `/config` (membaca/menulis `openclaw.json`). Untuk klien Gateway `chat.send`, penulisan persisten `/config set|unset` juga memerlukan `operator.admin`; `/config show` yang hanya-baca tetap tersedia untuk klien operator biasa dengan cakupan tulis. +- `config: true` mengaktifkan `/config` (membaca/menulis `openclaw.json`). Untuk klien gateway `chat.send`, penulisan persisten `/config set|unset` juga memerlukan `operator.admin`; `/config show` baca-saja tetap tersedia untuk klien operator biasa dengan cakupan tulis. - `mcp: true` mengaktifkan `/mcp` untuk konfigurasi server MCP yang dikelola OpenClaw di bawah `mcp.servers`. -- `plugins: true` mengaktifkan `/plugins` untuk penemuan, instalasi, dan kontrol aktif/nonaktif Plugin. -- `channels..configWrites` mengatur mutasi konfigurasi per channel (default: true). -- Untuk channel multi-akun, `channels..accounts..configWrites` juga mengatur penulisan yang menargetkan akun tersebut (misalnya `/allowlist --config --account ` atau `/config set channels..accounts....`). -- `restart: false` menonaktifkan `/restart` dan tindakan alat restart Gateway. Default: `true`. -- `ownerAllowFrom` adalah allowlist owner eksplisit untuk perintah/alat yang hanya untuk owner. Ini terpisah dari `allowFrom`. -- `ownerDisplay: "hash"` melakukan hash pada ID owner di system prompt. Atur `ownerDisplaySecret` untuk mengontrol hashing. -- `allowFrom` bersifat per-provider. Saat disetel, ini adalah **satu-satunya** sumber otorisasi (allowlist/pairing channel dan `useAccessGroups` diabaikan). -- `useAccessGroups: false` memungkinkan perintah melewati kebijakan grup akses saat `allowFrom` tidak disetel. -- Peta dokumentasi perintah: - - katalog built-in + bundled: [Slash Commands](/id/tools/slash-commands) +- `plugins: true` mengaktifkan `/plugins` untuk penemuan Plugin, instalasi, dan kontrol aktif/nonaktif. +- `channels..configWrites` membatasi mutasi konfigurasi per channel (default: true). +- Untuk channel multi-akun, `channels..accounts..configWrites` juga membatasi penulisan yang menargetkan akun tersebut (misalnya `/allowlist --config --account ` atau `/config set channels..accounts....`). +- `restart: false` menonaktifkan `/restart` dan aksi alat restart gateway. Default: `true`. +- `ownerAllowFrom` adalah allowlist pemilik eksplisit untuk perintah/alat khusus pemilik. Ini terpisah dari `allowFrom`. +- `ownerDisplay: "hash"` melakukan hash pada ID pemilik di system prompt. Atur `ownerDisplaySecret` untuk mengontrol hashing. +- `allowFrom` bersifat per-provider. Jika diatur, ini adalah **satu-satunya** sumber otorisasi (allowlist/pairing channel dan `useAccessGroups` diabaikan). +- `useAccessGroups: false` memungkinkan perintah melewati kebijakan access-group saat `allowFrom` tidak diatur. +- Pemetaan dokumen perintah: + - katalog bawaan + bundled: [Slash Commands](/id/tools/slash-commands) - permukaan perintah khusus channel: [Channels](/id/channels) - perintah QQ Bot: [QQ Bot](/id/channels/qqbot) - perintah pairing: [Pairing](/id/channels/pairing) - perintah kartu LINE: [LINE](/id/channels/line) - - dreaming memory: [Dreaming](/id/concepts/dreaming) + - memory dreaming: [Dreaming](/id/concepts/dreaming) --- -## Default agen +## Default agent ### `agents.defaults.workspace` @@ -897,7 +897,7 @@ Default: `~/.openclaw/workspace`. ### `agents.defaults.repoRoot` -Root repositori opsional yang ditampilkan di baris Runtime pada system prompt. Jika tidak disetel, OpenClaw mendeteksi otomatis dengan menelusuri ke atas dari workspace. +Root repositori opsional yang ditampilkan di baris Runtime pada system prompt. Jika tidak diatur, OpenClaw mendeteksi otomatis dengan menelusuri ke atas dari workspace. ```json5 { @@ -907,7 +907,7 @@ Root repositori opsional yang ditampilkan di baris Runtime pada system prompt. J ### `agents.defaults.skills` -Allowlist Skills default opsional untuk agen yang tidak menetapkan +Allowlist skill default opsional untuk agent yang tidak mengatur `agents.list[].skills`. ```json5 @@ -923,10 +923,10 @@ Allowlist Skills default opsional untuk agen yang tidak menetapkan } ``` -- Hilangkan `agents.defaults.skills` untuk Skills tak terbatas secara default. +- Hilangkan `agents.defaults.skills` agar Skills tidak dibatasi secara default. - Hilangkan `agents.list[].skills` untuk mewarisi default. -- Setel `agents.list[].skills: []` untuk tanpa Skills. -- Daftar `agents.list[].skills` yang tidak kosong adalah set akhir untuk agen tersebut; daftar itu +- Atur `agents.list[].skills: []` untuk tanpa Skills. +- Daftar `agents.list[].skills` yang tidak kosong adalah set final untuk agent tersebut; daftar ini tidak digabungkan dengan default. ### `agents.defaults.skipBootstrap` @@ -941,9 +941,9 @@ Menonaktifkan pembuatan otomatis file bootstrap workspace (`AGENTS.md`, `SOUL.md ### `agents.defaults.contextInjection` -Mengontrol kapan file bootstrap workspace disuntikkan ke system prompt. Default: `"always"`. +Mengontrol kapan file bootstrap workspace disisipkan ke dalam system prompt. Default: `"always"`. -- `"continuation-skip"`: giliran lanjutan yang aman (setelah respons asisten selesai) melewati penyuntikan ulang bootstrap workspace, sehingga mengurangi ukuran prompt. Proses Heartbeat dan percobaan ulang pasca-Compaction tetap membangun ulang konteks. +- `"continuation-skip"`: giliran lanjutan yang aman (setelah respons assistant selesai) melewati penyisipan ulang bootstrap workspace, sehingga mengurangi ukuran prompt. Eksekusi Heartbeat dan percobaan ulang pasca-Compaction tetap membangun ulang konteks. ```json5 { @@ -963,7 +963,7 @@ Jumlah karakter maksimum per file bootstrap workspace sebelum dipotong. Default: ### `agents.defaults.bootstrapTotalMaxChars` -Jumlah karakter total maksimum yang disuntikkan di semua file bootstrap workspace. Default: `60000`. +Jumlah total karakter maksimum yang disisipkan di semua file bootstrap workspace. Default: `60000`. ```json5 { @@ -973,12 +973,12 @@ Jumlah karakter total maksimum yang disuntikkan di semua file bootstrap workspac ### `agents.defaults.bootstrapPromptTruncationWarning` -Mengontrol teks peringatan yang terlihat oleh agen saat konteks bootstrap dipotong. +Mengontrol teks peringatan yang terlihat oleh agent saat konteks bootstrap dipotong. Default: `"once"`. -- `"off"`: jangan pernah menyuntikkan teks peringatan ke system prompt. -- `"once"`: suntikkan peringatan sekali per tanda tangan pemotongan unik (direkomendasikan). -- `"always"`: suntikkan peringatan pada setiap eksekusi saat ada pemotongan. +- `"off"`: jangan pernah menyisipkan teks peringatan ke system prompt. +- `"once"`: sisipkan peringatan sekali per signature pemotongan unik (disarankan). +- `"always"`: sisipkan peringatan pada setiap eksekusi saat pemotongan ada. ```json5 { @@ -989,23 +989,23 @@ Default: `"once"`. ### Peta kepemilikan anggaran konteks OpenClaw memiliki beberapa anggaran prompt/konteks bervolume tinggi, dan anggaran ini -sengaja dipisahkan berdasarkan subsistem alih-alih semuanya mengalir melalui satu +secara sengaja dipisah per subsistem alih-alih semuanya melalui satu knob generik. - `agents.defaults.bootstrapMaxChars` / `agents.defaults.bootstrapTotalMaxChars`: - penyuntikan bootstrap workspace normal. + penyisipan bootstrap workspace normal. - `agents.defaults.startupContext.*`: - prelude startup sekali jalan untuk `/new` dan `/reset`, termasuk file + prelude startup sekali pakai untuk `/new` dan `/reset`, termasuk file `memory/*.md` harian terbaru. - `skills.limits.*`: - daftar Skills ringkas yang disuntikkan ke system prompt. + daftar Skills ringkas yang disisipkan ke system prompt. - `agents.defaults.contextLimits.*`: - kutipan runtime terbatas dan blok milik runtime yang disuntikkan. + kutipan runtime terbatas dan blok milik runtime yang disisipkan. - `memory.qmd.limits.*`: - ukuran snippet pencarian memory yang diindeks dan ukuran penyuntikan. + ukuran snippet pencarian Memory terindeks dan penyisipannya. -Gunakan override per agen yang sesuai hanya bila satu agen memerlukan +Gunakan override per-agent yang sesuai hanya bila satu agent memerlukan anggaran yang berbeda: - `agents.list[].skillsLimits.maxSkillsPromptChars` @@ -1013,7 +1013,7 @@ anggaran yang berbeda: #### `agents.defaults.startupContext` -Mengontrol prelude startup giliran pertama yang disuntikkan pada eksekusi `/new` dan `/reset` +Mengontrol prelude startup giliran pertama yang disisipkan pada eksekusi `/new` dan `/reset` tanpa konteks tambahan. ```json5 @@ -1035,7 +1035,7 @@ tanpa konteks tambahan. #### `agents.defaults.contextLimits` -Default bersama untuk permukaan konteks runtime terbatas. +Default bersama untuk permukaan konteks runtime yang dibatasi. ```json5 { @@ -1052,18 +1052,18 @@ Default bersama untuk permukaan konteks runtime terbatas. } ``` -- `memoryGetMaxChars`: batas kutipan `memory_get` default sebelum metadata - pemotongan dan pemberitahuan kelanjutan ditambahkan. -- `memoryGetDefaultLines`: jendela baris `memory_get` default saat `lines` +- `memoryGetMaxChars`: batas kutipan default `memory_get` sebelum metadata + pemotongan dan pemberitahuan lanjutan ditambahkan. +- `memoryGetDefaultLines`: jendela baris default `memory_get` saat `lines` dihilangkan. -- `toolResultMaxChars`: batas hasil alat langsung yang digunakan untuk hasil - persisten dan pemulihan overflow. -- `postCompactionMaxChars`: batas kutipan AGENTS.md yang digunakan selama penyuntikan - penyegaran pasca-Compaction. +- `toolResultMaxChars`: batas hasil alat langsung yang digunakan untuk hasil persisten dan + pemulihan overflow. +- `postCompactionMaxChars`: batas kutipan AGENTS.md yang digunakan selama penyisipan + refresh pasca-Compaction. #### `agents.list[].contextLimits` -Override per agen untuk knob `contextLimits` bersama. Bidang yang dihilangkan mewarisi +Override per-agent untuk knob `contextLimits` bersama. Field yang dihilangkan mewarisi dari `agents.defaults.contextLimits`. ```json5 @@ -1090,7 +1090,7 @@ dari `agents.defaults.contextLimits`. #### `skills.limits.maxSkillsPromptChars` -Batas global untuk daftar Skills ringkas yang disuntikkan ke system prompt. Ini +Batas global untuk daftar Skills ringkas yang disisipkan ke system prompt. Ini tidak memengaruhi pembacaan file `SKILL.md` sesuai permintaan. ```json5 @@ -1105,7 +1105,7 @@ tidak memengaruhi pembacaan file `SKILL.md` sesuai permintaan. #### `agents.list[].skillsLimits.maxSkillsPromptChars` -Override per agen untuk anggaran prompt Skills. +Override per-agent untuk anggaran prompt Skills. ```json5 { @@ -1124,7 +1124,7 @@ Override per agen untuk anggaran prompt Skills. ### `agents.defaults.imageMaxDimensionPx` -Ukuran piksel maksimum untuk sisi gambar terpanjang dalam blok gambar transkrip/alat sebelum panggilan penyedia. +Ukuran piksel maksimum untuk sisi gambar terpanjang dalam blok gambar transcript/alat sebelum pemanggilan provider. Default: `1200`. Nilai yang lebih rendah biasanya mengurangi penggunaan vision-token dan ukuran payload permintaan untuk eksekusi yang banyak screenshot. @@ -1138,7 +1138,7 @@ Nilai yang lebih tinggi mempertahankan lebih banyak detail visual. ### `agents.defaults.userTimezone` -Zona waktu untuk konteks system prompt (bukan timestamp pesan). Menggunakan zona waktu host sebagai fallback. +Zona waktu untuk konteks system prompt (bukan stempel waktu pesan). Fallback ke zona waktu host. ```json5 { @@ -1148,7 +1148,7 @@ Zona waktu untuk konteks system prompt (bukan timestamp pesan). Menggunakan zona ### `agents.defaults.timeFormat` -Format waktu dalam system prompt. Default: `auto` (preferensi OS). +Format waktu di system prompt. Default: `auto` (preferensi OS). ```json5 { @@ -1186,9 +1186,9 @@ Format waktu dalam system prompt. Default: `auto` (preferensi OS). primary: "anthropic/claude-opus-4-6", fallbacks: ["openai/gpt-5.4-mini"], }, - params: { cacheRetention: "long" }, // parameter penyedia default global + params: { cacheRetention: "long" }, // parameter provider default global embeddedHarness: { - runtime: "auto", // auto | pi | registered harness id, mis. codex + runtime: "auto", // auto | pi | registered harness id, e.g. codex fallback: "pi", // pi | none }, pdfMaxBytesMb: 10, @@ -1209,45 +1209,45 @@ Format waktu dalam system prompt. Default: `auto` (preferensi OS). - Bentuk string hanya menetapkan model utama. - Bentuk objek menetapkan model utama plus model failover berurutan. - `imageModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - - Digunakan oleh jalur alat `image` sebagai konfigurasi model vision-nya. - - Juga digunakan sebagai perutean fallback saat model yang dipilih/default tidak dapat menerima input gambar. + - Digunakan oleh path alat `image` sebagai konfigurasi model vision. + - Juga digunakan sebagai routing fallback saat model yang dipilih/default tidak dapat menerima input gambar. - `imageGenerationModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - - Digunakan oleh kapabilitas pembuatan gambar bersama dan permukaan alat/plugin masa depan apa pun yang menghasilkan gambar. + - Digunakan oleh kapabilitas pembuatan gambar bersama dan permukaan alat/Plugin mendatang yang menghasilkan gambar. - Nilai umum: `google/gemini-3.1-flash-image-preview` untuk pembuatan gambar Gemini native, `fal/fal-ai/flux/dev` untuk fal, atau `openai/gpt-image-1` untuk OpenAI Images. - - Jika Anda memilih `provider/model` secara langsung, konfigurasikan juga auth/API key penyedia yang sesuai (misalnya `GEMINI_API_KEY` atau `GOOGLE_API_KEY` untuk `google/*`, `OPENAI_API_KEY` untuk `openai/*`, `FAL_KEY` untuk `fal/*`). - - Jika dihilangkan, `image_generate` masih dapat menyimpulkan default penyedia yang didukung auth. Ia mencoba penyedia default saat ini terlebih dahulu, lalu sisa penyedia pembuatan gambar yang terdaftar dalam urutan ID penyedia. + - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/API key provider yang sesuai (misalnya `GEMINI_API_KEY` atau `GOOGLE_API_KEY` untuk `google/*`, `OPENAI_API_KEY` untuk `openai/*`, `FAL_KEY` untuk `fal/*`). + - Jika dihilangkan, `image_generate` masih dapat menyimpulkan default provider yang didukung auth. Alat ini mencoba provider default saat ini terlebih dahulu, lalu provider pembuatan gambar terdaftar lainnya dalam urutan provider-id. - `musicGenerationModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - - Digunakan oleh kapabilitas pembuatan musik bersama dan alat built-in `music_generate`. + - Digunakan oleh kapabilitas pembuatan musik bersama dan alat bawaan `music_generate`. - Nilai umum: `google/lyria-3-clip-preview`, `google/lyria-3-pro-preview`, atau `minimax/music-2.5+`. - - Jika dihilangkan, `music_generate` masih dapat menyimpulkan default penyedia yang didukung auth. Ia mencoba penyedia default saat ini terlebih dahulu, lalu sisa penyedia pembuatan musik yang terdaftar dalam urutan ID penyedia. - - Jika Anda memilih `provider/model` secara langsung, konfigurasikan juga auth/API key penyedia yang sesuai. + - Jika dihilangkan, `music_generate` masih dapat menyimpulkan default provider yang didukung auth. Alat ini mencoba provider default saat ini terlebih dahulu, lalu provider pembuatan musik terdaftar lainnya dalam urutan provider-id. + - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/API key provider yang sesuai. - `videoGenerationModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - - Digunakan oleh kapabilitas pembuatan video bersama dan alat built-in `video_generate`. + - Digunakan oleh kapabilitas pembuatan video bersama dan alat bawaan `video_generate`. - Nilai umum: `qwen/wan2.6-t2v`, `qwen/wan2.6-i2v`, `qwen/wan2.6-r2v`, `qwen/wan2.6-r2v-flash`, atau `qwen/wan2.7-r2v`. - - Jika dihilangkan, `video_generate` masih dapat menyimpulkan default penyedia yang didukung auth. Ia mencoba penyedia default saat ini terlebih dahulu, lalu sisa penyedia pembuatan video yang terdaftar dalam urutan ID penyedia. - - Jika Anda memilih `provider/model` secara langsung, konfigurasikan juga auth/API key penyedia yang sesuai. - - Penyedia pembuatan video Qwen yang dibundel mendukung hingga 1 video output, 1 gambar input, 4 video input, durasi 10 detik, serta opsi tingkat penyedia `size`, `aspectRatio`, `resolution`, `audio`, dan `watermark`. + - Jika dihilangkan, `video_generate` masih dapat menyimpulkan default provider yang didukung auth. Alat ini mencoba provider default saat ini terlebih dahulu, lalu provider pembuatan video terdaftar lainnya dalam urutan provider-id. + - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/API key provider yang sesuai. + - Provider pembuatan video Qwen bawaan mendukung hingga 1 video output, 1 gambar input, 4 video input, durasi 10 detik, serta opsi tingkat provider `size`, `aspectRatio`, `resolution`, `audio`, dan `watermark`. - `pdfModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - - Digunakan oleh alat `pdf` untuk perutean model. - - Jika dihilangkan, alat PDF fallback ke `imageModel`, lalu ke model sesi/default yang di-resolve. -- `pdfMaxBytesMb`: batas ukuran PDF default untuk alat `pdf` saat `maxBytesMb` tidak diberikan saat pemanggilan. + - Digunakan oleh alat `pdf` untuk routing model. + - Jika dihilangkan, alat PDF melakukan fallback ke `imageModel`, lalu ke model sesi/default yang di-resolve. +- `pdfMaxBytesMb`: batas ukuran PDF default untuk alat `pdf` saat `maxBytesMb` tidak diberikan pada waktu pemanggilan. - `pdfMaxPages`: jumlah halaman maksimum default yang dipertimbangkan oleh mode fallback ekstraksi di alat `pdf`. -- `verboseDefault`: tingkat verbose default untuk agen. Nilai: `"off"`, `"on"`, `"full"`. Default: `"off"`. -- `elevatedDefault`: tingkat output elevated default untuk agen. Nilai: `"off"`, `"on"`, `"ask"`, `"full"`. Default: `"on"`. -- `model.primary`: format `provider/model` (mis. `openai/gpt-5.4`). Jika Anda menghilangkan penyedia, OpenClaw mencoba alias terlebih dahulu, lalu kecocokan penyedia terkonfigurasi unik untuk ID model yang tepat itu, dan baru setelah itu fallback ke penyedia default terkonfigurasi (perilaku kompatibilitas lama yang sudah deprecated, jadi utamakan `provider/model` eksplisit). Jika penyedia itu tidak lagi mengekspos model default terkonfigurasi, OpenClaw fallback ke provider/model terkonfigurasi pertama alih-alih menampilkan default penyedia lama yang sudah dihapus. -- `models`: katalog model yang dikonfigurasi dan allowlist untuk `/model`. Setiap entri dapat menyertakan `alias` (shortcut) dan `params` (khusus penyedia, misalnya `temperature`, `maxTokens`, `cacheRetention`, `context1m`). -- `params`: parameter penyedia default global yang diterapkan ke semua model. Setel di `agents.defaults.params` (mis. `{ cacheRetention: "long" }`). -- Prioritas penggabungan `params` (konfigurasi): `agents.defaults.params` (dasar global) dioverride oleh `agents.defaults.models["provider/model"].params` (per model), lalu `agents.list[].params` (ID agen yang cocok) mengoverride per kunci. Lihat [Prompt Caching](/id/reference/prompt-caching) untuk detail. -- `embeddedHarness`: kebijakan runtime agen embedded tingkat rendah default. Gunakan `runtime: "auto"` agar harness plugin yang terdaftar dapat mengklaim model yang didukung, `runtime: "pi"` untuk memaksa harness PI built-in, atau ID harness terdaftar seperti `runtime: "codex"`. Setel `fallback: "none"` untuk menonaktifkan fallback PI otomatis. -- Penulis konfigurasi yang memutasi bidang ini (misalnya `/models set`, `/models set-image`, dan perintah tambah/hapus fallback) menyimpan bentuk objek kanonis dan mempertahankan daftar fallback yang ada bila memungkinkan. -- `maxConcurrent`: jumlah maksimum eksekusi agen paralel lintas sesi (setiap sesi tetap diserialkan). Default: 4. +- `verboseDefault`: level verbose default untuk agent. Nilai: `"off"`, `"on"`, `"full"`. Default: `"off"`. +- `elevatedDefault`: level output elevated default untuk agent. Nilai: `"off"`, `"on"`, `"ask"`, `"full"`. Default: `"on"`. +- `model.primary`: format `provider/model` (mis. `openai/gpt-5.4`). Jika Anda menghilangkan provider, OpenClaw mencoba alias terlebih dahulu, lalu kecocokan configured-provider unik untuk id model yang tepat itu, dan baru setelah itu fallback ke provider default yang dikonfigurasi (perilaku kompatibilitas lama, jadi lebih baik gunakan `provider/model` eksplisit). Jika provider tersebut tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw akan fallback ke provider/model pertama yang dikonfigurasi alih-alih menampilkan default provider lama yang sudah dihapus. +- `models`: katalog model yang dikonfigurasi dan allowlist untuk `/model`. Setiap entri dapat menyertakan `alias` (shortcut) dan `params` (khusus provider, misalnya `temperature`, `maxTokens`, `cacheRetention`, `context1m`). +- `params`: parameter provider default global yang diterapkan ke semua model. Atur di `agents.defaults.params` (mis. `{ cacheRetention: "long" }`). +- Prioritas penggabungan `params` (konfigurasi): `agents.defaults.params` (basis global) dioverride oleh `agents.defaults.models["provider/model"].params` (per-model), lalu `agents.list[].params` (ID agent yang cocok) mengoverride per key. Lihat [Prompt Caching](/id/reference/prompt-caching) untuk detail. +- `embeddedHarness`: kebijakan runtime agent embedded tingkat rendah default. Gunakan `runtime: "auto"` agar harness Plugin terdaftar dapat mengklaim model yang didukung, `runtime: "pi"` untuk memaksa harness PI bawaan, atau id harness terdaftar seperti `runtime: "codex"`. Atur `fallback: "none"` untuk menonaktifkan fallback PI otomatis. +- Penulis konfigurasi yang memutasi field ini (misalnya `/models set`, `/models set-image`, dan perintah tambah/hapus fallback) menyimpan bentuk objek kanonis dan mempertahankan daftar fallback yang ada bila memungkinkan. +- `maxConcurrent`: jumlah maksimum eksekusi agent paralel antar sesi (setiap sesi tetap diserialkan). Default: 4. ### `agents.defaults.embeddedHarness` -`embeddedHarness` mengontrol executor tingkat rendah yang menjalankan giliran agen embedded. +`embeddedHarness` mengontrol eksekutor tingkat rendah yang menjalankan giliran agent embedded. Sebagian besar deployment sebaiknya mempertahankan default `{ runtime: "auto", fallback: "pi" }`. -Gunakan ini saat plugin tepercaya menyediakan harness native, seperti harness app-server -Codex yang dibundel. +Gunakan ini saat Plugin tepercaya menyediakan harness native, seperti harness app-server +Codex bawaan. ```json5 { @@ -1263,13 +1263,13 @@ Codex yang dibundel. } ``` -- `runtime`: `"auto"`, `"pi"`, atau ID harness plugin yang terdaftar. Plugin Codex yang dibundel mendaftarkan `codex`. -- `fallback`: `"pi"` atau `"none"`. `"pi"` mempertahankan harness PI built-in sebagai fallback kompatibilitas. `"none"` membuat pemilihan harness plugin yang hilang atau tidak didukung gagal alih-alih diam-diam menggunakan PI. +- `runtime`: `"auto"`, `"pi"`, atau id harness Plugin terdaftar. Plugin Codex bawaan mendaftarkan `codex`. +- `fallback`: `"pi"` atau `"none"`. `"pi"` mempertahankan harness PI bawaan sebagai fallback kompatibilitas. `"none"` membuat pemilihan harness Plugin yang hilang atau tidak didukung gagal alih-alih diam-diam menggunakan PI. - Override environment: `OPENCLAW_AGENT_RUNTIME=` mengoverride `runtime`; `OPENCLAW_AGENT_HARNESS_FALLBACK=none` menonaktifkan fallback PI untuk proses tersebut. -- Untuk deployment khusus Codex, setel `model: "codex/gpt-5.4"`, `embeddedHarness.runtime: "codex"`, dan `embeddedHarness.fallback: "none"`. +- Untuk deployment khusus Codex, atur `model: "codex/gpt-5.4"`, `embeddedHarness.runtime: "codex"`, dan `embeddedHarness.fallback: "none"`. - Ini hanya mengontrol harness chat embedded. Pembuatan media, vision, PDF, musik, video, dan TTS tetap menggunakan pengaturan provider/model masing-masing. -**Singkatan alias built-in** (hanya berlaku saat model ada di `agents.defaults.models`): +**Singkatan alias bawaan** (hanya berlaku saat model ada di `agents.defaults.models`): | Alias | Model | | ------------------- | -------------------------------------- | @@ -1282,15 +1282,15 @@ Codex yang dibundel. | `gemini-flash` | `google/gemini-3-flash-preview` | | `gemini-flash-lite` | `google/gemini-3.1-flash-lite-preview` | -Alias yang Anda konfigurasikan selalu didahulukan daripada default. +Alias yang Anda konfigurasi selalu lebih diutamakan daripada default. -Model Z.AI GLM-4.x secara otomatis mengaktifkan mode thinking kecuali Anda menetapkan `--thinking off` atau mendefinisikan sendiri `agents.defaults.models["zai/"].params.thinking`. -Model Z.AI mengaktifkan `tool_stream` secara default untuk streaming pemanggilan alat. Setel `agents.defaults.models["zai/"].params.tool_stream` ke `false` untuk menonaktifkannya. -Model Anthropic Claude 4.6 default ke thinking `adaptive` saat tidak ada tingkat thinking eksplisit yang disetel. +Model Z.AI GLM-4.x otomatis mengaktifkan mode thinking kecuali Anda menetapkan `--thinking off` atau mendefinisikan sendiri `agents.defaults.models["zai/"].params.thinking`. +Model Z.AI mengaktifkan `tool_stream` secara default untuk streaming pemanggilan alat. Atur `agents.defaults.models["zai/"].params.tool_stream` ke `false` untuk menonaktifkannya. +Model Anthropic Claude 4.6 default ke thinking `adaptive` saat tidak ada level thinking eksplisit yang ditetapkan. ### `agents.defaults.cliBackends` -Backend CLI opsional untuk eksekusi fallback hanya-teks (tanpa pemanggilan alat). Berguna sebagai cadangan saat penyedia API gagal. +Backend CLI opsional untuk eksekusi fallback khusus teks (tanpa pemanggilan alat). Berguna sebagai cadangan saat provider API gagal. ```json5 { @@ -1318,13 +1318,13 @@ Backend CLI opsional untuk eksekusi fallback hanya-teks (tanpa pemanggilan alat) } ``` -- Backend CLI mengutamakan teks; alat selalu dinonaktifkan. -- Sesi didukung saat `sessionArg` disetel. +- Backend CLI bersifat text-first; alat selalu dinonaktifkan. +- Sesi didukung saat `sessionArg` diatur. - Pass-through gambar didukung saat `imageArg` menerima path file. ### `agents.defaults.systemPromptOverride` -Ganti seluruh system prompt yang dirakit OpenClaw dengan string tetap. Setel di level default (`agents.defaults.systemPromptOverride`) atau per agen (`agents.list[].systemPromptOverride`). Nilai per agen didahulukan; nilai kosong atau hanya whitespace diabaikan. Berguna untuk eksperimen prompt terkontrol. +Ganti seluruh system prompt yang dirakit OpenClaw dengan string tetap. Atur pada level default (`agents.defaults.systemPromptOverride`) atau per agent (`agents.list[].systemPromptOverride`). Nilai per-agent diprioritaskan; nilai kosong atau hanya whitespace diabaikan. Berguna untuk eksperimen prompt yang terkontrol. ```json5 { @@ -1365,15 +1365,15 @@ Eksekusi Heartbeat berkala. } ``` -- `every`: string durasi (ms/s/m/h). Default: `30m` (auth API-key) atau `1h` (auth OAuth). Setel ke `0m` untuk menonaktifkan. -- `includeSystemPromptSection`: saat false, menghilangkan bagian Heartbeat dari system prompt dan melewati penyuntikan `HEARTBEAT.md` ke konteks bootstrap. Default: `true`. +- `every`: string durasi (ms/s/m/h). Default: `30m` (auth API-key) atau `1h` (auth OAuth). Atur ke `0m` untuk menonaktifkan. +- `includeSystemPromptSection`: saat false, menghilangkan bagian Heartbeat dari system prompt dan melewati penyisipan `HEARTBEAT.md` ke konteks bootstrap. Default: `true`. - `suppressToolErrorWarnings`: saat true, menekan payload peringatan error alat selama eksekusi Heartbeat. -- `timeoutSeconds`: waktu maksimum dalam detik yang diizinkan untuk satu giliran agen Heartbeat sebelum dibatalkan. Biarkan tidak disetel untuk menggunakan `agents.defaults.timeoutSeconds`. -- `directPolicy`: kebijakan pengiriman langsung/DM. `allow` (default) mengizinkan pengiriman target langsung. `block` menekan pengiriman target langsung dan mengeluarkan `reason=dm-blocked`. +- `timeoutSeconds`: waktu maksimum dalam detik yang diizinkan untuk satu giliran agent Heartbeat sebelum dibatalkan. Biarkan tidak diatur untuk menggunakan `agents.defaults.timeoutSeconds`. +- `directPolicy`: kebijakan pengiriman langsung/DM. `allow` (default) mengizinkan pengiriman target langsung. `block` menekan pengiriman target langsung dan menghasilkan `reason=dm-blocked`. - `lightContext`: saat true, eksekusi Heartbeat menggunakan konteks bootstrap ringan dan hanya mempertahankan `HEARTBEAT.md` dari file bootstrap workspace. - `isolatedSession`: saat true, setiap Heartbeat berjalan dalam sesi baru tanpa riwayat percakapan sebelumnya. Pola isolasi yang sama seperti Cron `sessionTarget: "isolated"`. Mengurangi biaya token per Heartbeat dari ~100K menjadi ~2-5K token. -- Per agen: setel `agents.list[].heartbeat`. Saat agen mana pun mendefinisikan `heartbeat`, **hanya agen tersebut** yang menjalankan Heartbeat. -- Heartbeat menjalankan giliran agen penuh — interval yang lebih pendek menghabiskan lebih banyak token. +- Per-agent: atur `agents.list[].heartbeat`. Saat ada agent yang mendefinisikan `heartbeat`, **hanya agent tersebut** yang menjalankan Heartbeat. +- Heartbeat menjalankan giliran agent penuh — interval yang lebih pendek membakar lebih banyak token. ### `agents.defaults.compaction` @@ -1383,12 +1383,12 @@ Eksekusi Heartbeat berkala. defaults: { compaction: { mode: "safeguard", // default | safeguard - provider: "my-provider", // id dari plugin penyedia Compaction terdaftar (opsional) + provider: "my-provider", // id dari Plugin provider Compaction terdaftar (opsional) timeoutSeconds: 900, reserveTokensFloor: 24000, identifierPolicy: "strict", // strict | off | custom identifierInstructions: "Preserve deployment IDs, ticket IDs, and host:port pairs exactly.", // digunakan saat identifierPolicy=custom - postCompactionSections: ["Session Startup", "Red Lines"], // [] menonaktifkan penyuntikan ulang + postCompactionSections: ["Session Startup", "Red Lines"], // [] menonaktifkan penyisipan ulang model: "openrouter/anthropic/claude-sonnet-4-6", // override model khusus Compaction opsional notifyUser: true, // kirim pemberitahuan singkat saat Compaction dimulai (default: false) memoryFlush: { @@ -1404,14 +1404,14 @@ Eksekusi Heartbeat berkala. ``` - `mode`: `default` atau `safeguard` (ringkasan bertahap untuk riwayat panjang). Lihat [Compaction](/id/concepts/compaction). -- `provider`: id plugin penyedia Compaction terdaftar. Jika disetel, `summarize()` milik penyedia dipanggil alih-alih ringkasan LLM built-in. Fallback ke built-in saat gagal. Menyetel penyedia memaksa `mode: "safeguard"`. Lihat [Compaction](/id/concepts/compaction). +- `provider`: id dari Plugin provider Compaction terdaftar. Saat diatur, `summarize()` milik provider dipanggil alih-alih peringkasan LLM bawaan. Akan fallback ke bawaan jika gagal. Menetapkan provider memaksa `mode: "safeguard"`. Lihat [Compaction](/id/concepts/compaction). - `timeoutSeconds`: jumlah detik maksimum yang diizinkan untuk satu operasi Compaction sebelum OpenClaw membatalkannya. Default: `900`. -- `identifierPolicy`: `strict` (default), `off`, atau `custom`. `strict` menambahkan panduan retensi identifier opak built-in sebelum ringkasan Compaction. -- `identifierInstructions`: teks pelestarian identifier kustom opsional yang digunakan saat `identifierPolicy=custom`. -- `postCompactionSections`: nama bagian AGENTS.md H2/H3 opsional untuk disuntikkan ulang setelah Compaction. Default ke `["Session Startup", "Red Lines"]`; setel `[]` untuk menonaktifkan penyuntikan ulang. Saat tidak disetel atau secara eksplisit disetel ke pasangan default itu, heading lama `Every Session`/`Safety` juga diterima sebagai fallback lama. -- `model`: override `provider/model-id` opsional hanya untuk ringkasan Compaction. Gunakan ini saat sesi utama harus tetap menggunakan satu model tetapi ringkasan Compaction harus berjalan di model lain; saat tidak disetel, Compaction menggunakan model utama sesi. -- `notifyUser`: saat `true`, mengirim pemberitahuan singkat kepada pengguna saat Compaction dimulai (misalnya, "Compacting context..."). Nonaktif secara default agar Compaction tetap senyap. -- `memoryFlush`: giliran agentic senyap sebelum auto-Compaction untuk menyimpan memori yang tahan lama. Dilewati saat workspace hanya-baca. +- `identifierPolicy`: `strict` (default), `off`, atau `custom`. `strict` menambahkan panduan bawaan untuk mempertahankan identifier opak selama peringkasan Compaction. +- `identifierInstructions`: teks kustom opsional untuk pelestarian identifier yang digunakan saat `identifierPolicy=custom`. +- `postCompactionSections`: nama bagian H2/H3 AGENTS.md opsional untuk disisipkan ulang setelah Compaction. Default ke `["Session Startup", "Red Lines"]`; atur `[]` untuk menonaktifkan penyisipan ulang. Saat tidak diatur atau secara eksplisit diatur ke pasangan default tersebut, heading lama `Every Session`/`Safety` juga diterima sebagai fallback lama. +- `model`: override `provider/model-id` opsional khusus untuk peringkasan Compaction. Gunakan ini saat sesi utama harus tetap memakai satu model tetapi ringkasan Compaction harus dijalankan pada model lain; jika tidak diatur, Compaction menggunakan model utama sesi. +- `notifyUser`: saat `true`, mengirim pemberitahuan singkat kepada pengguna saat Compaction dimulai (misalnya, "Compacting context..."). Dinonaktifkan secara default agar Compaction tetap senyap. +- `memoryFlush`: giliran agentic senyap sebelum auto-Compaction untuk menyimpan Memory yang tahan lama. Dilewati saat workspace bersifat read-only. ### `agents.defaults.contextPruning` @@ -1439,9 +1439,9 @@ Memangkas **hasil alat lama** dari konteks dalam memori sebelum dikirim ke LLM. -- `mode: "cache-ttl"` mengaktifkan proses pruning. -- `ttl` mengontrol seberapa sering pruning dapat dijalankan lagi (setelah sentuhan cache terakhir). -- Pruning terlebih dahulu melakukan soft-trim pada hasil alat yang terlalu besar, lalu hard-clear pada hasil alat lama bila diperlukan. +- `mode: "cache-ttl"` mengaktifkan proses pemangkasan. +- `ttl` mengontrol seberapa sering pemangkasan dapat dijalankan lagi (setelah sentuhan cache terakhir). +- Pemangkasan terlebih dahulu melakukan soft-trim pada hasil alat yang terlalu besar, lalu hard-clear hasil alat yang lebih lama jika diperlukan. **Soft-trim** mempertahankan bagian awal + akhir dan menyisipkan `...` di tengah. @@ -1449,15 +1449,15 @@ Memangkas **hasil alat lama** dari konteks dalam memori sebelum dikirim ke LLM. Catatan: -- Blok gambar tidak pernah dipotong/dihapus. +- Blok gambar tidak pernah dipotong/dibersihkan. - Rasio berbasis karakter (perkiraan), bukan jumlah token yang tepat. -- Jika ada kurang dari `keepLastAssistants` pesan asisten, pruning dilewati. +- Jika ada kurang dari `keepLastAssistants` pesan assistant, pemangkasan dilewati. Lihat [Session Pruning](/id/concepts/session-pruning) untuk detail perilaku. -### Streaming blok +### Block streaming ```json5 { @@ -1474,12 +1474,12 @@ Lihat [Session Pruning](/id/concepts/session-pruning) untuk detail perilaku. ``` - Channel non-Telegram memerlukan `*.blockStreaming: true` eksplisit untuk mengaktifkan balasan blok. -- Override channel: `channels..blockStreamingCoalesce` (dan varian per akun). Signal/Slack/Discord/Google Chat default ke `minChars: 1500`. -- `humanDelay`: jeda acak di antara balasan blok. `natural` = 800–2500md. Override per agen: `agents.list[].humanDelay`. +- Override channel: `channels..blockStreamingCoalesce` (dan varian per-akun). Signal/Slack/Discord/Google Chat default `minChars: 1500`. +- `humanDelay`: jeda acak di antara balasan blok. `natural` = 800–2500 md. Override per-agent: `agents.list[].humanDelay`. -Lihat [Streaming](/id/concepts/streaming) untuk perilaku + detail chunking. +Lihat [Streaming](/id/concepts/streaming) untuk detail perilaku + chunking. -### Indikator pengetikan +### Indikator mengetik ```json5 { @@ -1493,7 +1493,7 @@ Lihat [Streaming](/id/concepts/streaming) untuk perilaku + detail chunking. ``` - Default: `instant` untuk chat langsung/mention, `message` untuk chat grup tanpa mention. -- Override per sesi: `session.typingMode`, `session.typingIntervalSeconds`. +- Override per-sesi: `session.typingMode`, `session.typingIntervalSeconds`. Lihat [Typing Indicators](/id/concepts/typing-indicators). @@ -1501,7 +1501,7 @@ Lihat [Typing Indicators](/id/concepts/typing-indicators). ### `agents.defaults.sandbox` -Sandboxing opsional untuk agen embedded. Lihat [Sandboxing](/id/gateway/sandboxing) untuk panduan lengkap. +Sandbox opsional untuk agent embedded. Lihat [Sandboxing](/id/gateway/sandboxing) untuk panduan lengkap. ```json5 { @@ -1612,36 +1612,36 @@ Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke - `target`: target SSH dalam bentuk `user@host[:port]` - `command`: perintah klien SSH (default: `ssh`) - `workspaceRoot`: root jarak jauh absolut yang digunakan untuk workspace per-scope -- `identityFile` / `certificateFile` / `knownHostsFile`: file lokal yang ada dan diteruskan ke OpenSSH +- `identityFile` / `certificateFile` / `knownHostsFile`: file lokal yang sudah ada dan diteruskan ke OpenSSH - `identityData` / `certificateData` / `knownHostsData`: konten inline atau SecretRef yang dimaterialisasikan OpenClaw ke file sementara saat runtime - `strictHostKeyChecking` / `updateHostKeys`: knob kebijakan host-key OpenSSH **Prioritas auth SSH:** -- `identityData` didahulukan atas `identityFile` -- `certificateData` didahulukan atas `certificateFile` -- `knownHostsData` didahulukan atas `knownHostsFile` -- Nilai `*Data` berbasis SecretRef di-resolve dari snapshot runtime secrets aktif sebelum sesi sandbox dimulai +- `identityData` lebih diutamakan daripada `identityFile` +- `certificateData` lebih diutamakan daripada `certificateFile` +- `knownHostsData` lebih diutamakan daripada `knownHostsFile` +- Nilai `*Data` berbasis SecretRef di-resolve dari snapshot runtime secret aktif sebelum sesi sandbox dimulai **Perilaku backend SSH:** -- melakukan seed workspace jarak jauh sekali setelah pembuatan atau pembuatan ulang +- menginisialisasi workspace jarak jauh sekali setelah pembuatan atau pembuatan ulang - lalu mempertahankan workspace SSH jarak jauh sebagai kanonis -- merutekan `exec`, alat file, dan jalur media melalui SSH +- merutekan `exec`, alat file, dan path media melalui SSH - tidak menyinkronkan perubahan jarak jauh kembali ke host secara otomatis - tidak mendukung container browser sandbox **Akses workspace:** - `none`: workspace sandbox per-scope di bawah `~/.openclaw/sandboxes` -- `ro`: workspace sandbox di `/workspace`, workspace agen dipasang hanya-baca di `/agent` -- `rw`: workspace agen dipasang baca/tulis di `/workspace` +- `ro`: workspace sandbox di `/workspace`, workspace agent di-mount read-only di `/agent` +- `rw`: workspace agent di-mount read/write di `/workspace` **Scope:** -- `session`: container + workspace per sesi -- `agent`: satu container + workspace per agen (default) -- `shared`: container dan workspace bersama (tanpa isolasi lintas sesi) +- `session`: container + workspace per-sesi +- `agent`: satu container + workspace per-agent (default) +- `shared`: container dan workspace bersama (tanpa isolasi antar-sesi) **Konfigurasi Plugin OpenShell:** @@ -1671,29 +1671,29 @@ Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke **Mode OpenShell:** -- `mirror`: seed jarak jauh dari lokal sebelum exec, sinkronkan kembali setelah exec; workspace lokal tetap kanonis +- `mirror`: seed jarak jauh dari lokal sebelum exec, sinkronkan balik setelah exec; workspace lokal tetap kanonis - `remote`: seed jarak jauh sekali saat sandbox dibuat, lalu pertahankan workspace jarak jauh sebagai kanonis -Dalam mode `remote`, edit lokal host yang dibuat di luar OpenClaw tidak disinkronkan ke sandbox secara otomatis setelah langkah seed. +Dalam mode `remote`, edit lokal di host yang dibuat di luar OpenClaw tidak disinkronkan ke sandbox secara otomatis setelah langkah seed. Transport menggunakan SSH ke sandbox OpenShell, tetapi Plugin memiliki siklus hidup sandbox dan sinkronisasi mirror opsional. -**`setupCommand`** dijalankan sekali setelah pembuatan container (melalui `sh -lc`). Memerlukan egress jaringan, root yang dapat ditulis, dan pengguna root. +**`setupCommand`** dijalankan sekali setelah container dibuat (melalui `sh -lc`). Memerlukan egress jaringan, root yang dapat ditulis, dan pengguna root. -**Container default ke `network: "none"`** — setel ke `"bridge"` (atau jaringan bridge kustom) jika agen memerlukan akses keluar. +**Container default ke `network: "none"`** — atur ke `"bridge"` (atau jaringan bridge kustom) jika agent memerlukan akses keluar. `"host"` diblokir. `"container:"` diblokir secara default kecuali Anda secara eksplisit menetapkan `sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` (break-glass). -**Lampiran masuk** ditempatkan ke `media/inbound/*` di workspace aktif. +**Lampiran masuk** dipentaskan ke `media/inbound/*` di workspace aktif. -**`docker.binds`** memasang direktori host tambahan; bind global dan per-agen digabungkan. +**`docker.binds`** me-mount direktori host tambahan; bind global dan per-agent digabungkan. -**Browser sandbox** (`sandbox.browser.enabled`): Chromium + CDP di dalam container. URL noVNC disuntikkan ke system prompt. Tidak memerlukan `browser.enabled` di `openclaw.json`. -Akses pengamat noVNC menggunakan auth VNC secara default dan OpenClaw mengeluarkan URL token berumur pendek (alih-alih mengekspos kata sandi di URL bersama). +**Browser sandbox** (`sandbox.browser.enabled`): Chromium + CDP dalam container. URL noVNC disisipkan ke system prompt. Tidak memerlukan `browser.enabled` di `openclaw.json`. +Akses observer noVNC menggunakan auth VNC secara default dan OpenClaw mengeluarkan URL token berumur pendek (alih-alih mengekspos kata sandi di URL bersama). - `allowHostControl: false` (default) memblokir sesi sandbox agar tidak menargetkan browser host. -- `network` default ke `openclaw-sandbox-browser` (jaringan bridge khusus). Setel ke `bridge` hanya jika Anda secara eksplisit menginginkan konektivitas bridge global. +- `network` default ke `openclaw-sandbox-browser` (jaringan bridge khusus). Atur ke `bridge` hanya bila Anda secara eksplisit menginginkan konektivitas bridge global. - `cdpSourceRange` secara opsional membatasi ingress CDP di tepi container ke rentang CIDR (misalnya `172.21.0.1/32`). -- `sandbox.browser.binds` memasang direktori host tambahan hanya ke container browser sandbox. Saat disetel (termasuk `[]`), nilai ini menggantikan `docker.binds` untuk container browser. +- `sandbox.browser.binds` me-mount direktori host tambahan hanya ke container browser sandbox. Saat diatur (termasuk `[]`), ini menggantikan `docker.binds` untuk container browser. - Default peluncuran didefinisikan di `scripts/sandbox-browser-entrypoint.sh` dan disetel untuk host container: - `--remote-debugging-address=127.0.0.1` - `--remote-debugging-port=` @@ -1711,31 +1711,31 @@ Akses pengamat noVNC menggunakan auth VNC secara default dan OpenClaw mengeluark - `--renderer-process-limit=2` - `--no-zygote` - `--metrics-recording-only` - - `--disable-extensions` (aktif secara default) - - `--disable-3d-apis`, `--disable-software-rasterizer`, dan `--disable-gpu` aktif - secara default dan dapat dinonaktifkan dengan + - `--disable-extensions` (default aktif) + - `--disable-3d-apis`, `--disable-software-rasterizer`, dan `--disable-gpu` diaktifkan secara + default dan dapat dinonaktifkan dengan `OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0` jika penggunaan WebGL/3D memerlukannya. - - `OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0` mengaktifkan kembali ekstensi jika alur kerja Anda + - `OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0` mengaktifkan kembali extension jika alur kerja Anda bergantung padanya. - `--renderer-process-limit=2` dapat diubah dengan - `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; setel `0` untuk menggunakan + `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; atur `0` untuk menggunakan batas proses default Chromium. - ditambah `--no-sandbox` dan `--disable-setuid-sandbox` saat `noSandbox` diaktifkan. - - Default ini adalah baseline image container; gunakan image browser kustom dengan entrypoint - kustom untuk mengubah default container. + - Default adalah baseline image container; gunakan image browser kustom dengan entrypoint kustom + untuk mengubah default container. Browser sandboxing dan `sandbox.docker.binds` hanya untuk Docker. -Bangun image: +Build image: ```bash scripts/sandbox-setup.sh # image sandbox utama scripts/sandbox-browser-setup.sh # image browser opsional ``` -### `agents.list` (override per agen) +### `agents.list` (override per-agent) ```json5 { @@ -1748,12 +1748,12 @@ scripts/sandbox-browser-setup.sh # image browser opsional workspace: "~/.openclaw/workspace", agentDir: "~/.openclaw/agents/main/agent", model: "anthropic/claude-opus-4-6", // atau { primary, fallbacks } - thinkingDefault: "high", // override tingkat thinking per agen - reasoningDefault: "on", // override visibilitas reasoning per agen - fastModeDefault: false, // override mode cepat per agen + thinkingDefault: "high", // override level thinking per-agent + reasoningDefault: "on", // override visibilitas reasoning per-agent + fastModeDefault: false, // override mode cepat per-agent embeddedHarness: { runtime: "auto", fallback: "pi" }, - params: { cacheRetention: "none" }, // mengoverride params defaults.models yang cocok per kunci - skills: ["docs-search"], // menggantikan agents.defaults.skills saat disetel + params: { cacheRetention: "none" }, // mengoverride key yang cocok dari defaults.models params + skills: ["docs-search"], // menggantikan agents.defaults.skills saat diatur identity: { name: "Samantha", theme: "helpful sloth", @@ -1784,27 +1784,27 @@ scripts/sandbox-browser-setup.sh # image browser opsional } ``` -- `id`: ID agen stabil (wajib). -- `default`: saat beberapa agen disetel, yang pertama menang (peringatan dicatat). Jika tidak ada yang disetel, entri daftar pertama menjadi default. +- `id`: id agent stabil (wajib). +- `default`: saat beberapa diatur, yang pertama menang (peringatan dicatat). Jika tidak ada yang diatur, entri daftar pertama menjadi default. - `model`: bentuk string hanya mengoverride `primary`; bentuk objek `{ primary, fallbacks }` mengoverride keduanya (`[]` menonaktifkan fallback global). Tugas Cron yang hanya mengoverride `primary` tetap mewarisi fallback default kecuali Anda menetapkan `fallbacks: []`. -- `params`: params stream per agen yang digabungkan di atas entri model terpilih di `agents.defaults.models`. Gunakan ini untuk override khusus agen seperti `cacheRetention`, `temperature`, atau `maxTokens` tanpa menduplikasi seluruh katalog model. -- `skills`: allowlist Skills opsional per agen. Jika dihilangkan, agen mewarisi `agents.defaults.skills` saat disetel; daftar eksplisit menggantikan default alih-alih digabungkan, dan `[]` berarti tanpa Skills. -- `thinkingDefault`: tingkat thinking default opsional per agen (`off | minimal | low | medium | high | xhigh | adaptive`). Mengoverride `agents.defaults.thinkingDefault` untuk agen ini saat tidak ada override per pesan atau sesi. -- `reasoningDefault`: visibilitas reasoning default opsional per agen (`on | off | stream`). Berlaku saat tidak ada override reasoning per pesan atau sesi. -- `fastModeDefault`: default opsional per agen untuk mode cepat (`true | false`). Berlaku saat tidak ada override mode cepat per pesan atau sesi. -- `embeddedHarness`: override kebijakan harness tingkat rendah opsional per agen. Gunakan `{ runtime: "codex", fallback: "none" }` untuk menjadikan satu agen hanya-Codex sementara agen lain tetap menggunakan fallback PI default. -- `runtime`: deskriptor runtime opsional per agen. Gunakan `type: "acp"` dengan default `runtime.acp` (`agent`, `backend`, `mode`, `cwd`) saat agen harus default ke sesi harness ACP. -- `identity.avatar`: path relatif-workspace, URL `http(s)`, atau URI `data:`. +- `params`: parameter stream per-agent yang digabungkan di atas entri model yang dipilih dalam `agents.defaults.models`. Gunakan ini untuk override khusus agent seperti `cacheRetention`, `temperature`, atau `maxTokens` tanpa menduplikasi seluruh katalog model. +- `skills`: allowlist skill opsional per-agent. Jika dihilangkan, agent mewarisi `agents.defaults.skills` saat diatur; daftar eksplisit menggantikan default alih-alih digabungkan, dan `[]` berarti tanpa Skills. +- `thinkingDefault`: level thinking default opsional per-agent (`off | minimal | low | medium | high | xhigh | adaptive`). Mengoverride `agents.defaults.thinkingDefault` untuk agent ini saat tidak ada override per-pesan atau sesi. +- `reasoningDefault`: visibilitas reasoning default opsional per-agent (`on | off | stream`). Berlaku saat tidak ada override reasoning per-pesan atau sesi. +- `fastModeDefault`: default opsional per-agent untuk mode cepat (`true | false`). Berlaku saat tidak ada override mode cepat per-pesan atau sesi. +- `embeddedHarness`: override kebijakan harness tingkat rendah opsional per-agent. Gunakan `{ runtime: "codex", fallback: "none" }` untuk membuat satu agent hanya-Codex sementara agent lain mempertahankan fallback PI default. +- `runtime`: deskriptor runtime opsional per-agent. Gunakan `type: "acp"` dengan default `runtime.acp` (`agent`, `backend`, `mode`, `cwd`) saat agent harus default ke sesi harness ACP. +- `identity.avatar`: path relatif workspace, URL `http(s)`, atau URI `data:`. - `identity` menurunkan default: `ackReaction` dari `emoji`, `mentionPatterns` dari `name`/`emoji`. -- `subagents.allowAgents`: allowlist ID agen untuk `sessions_spawn` (`["*"]` = apa saja; default: hanya agen yang sama). -- Pengaman pewarisan sandbox: jika sesi peminta berada dalam sandbox, `sessions_spawn` menolak target yang akan berjalan tanpa sandbox. +- `subagents.allowAgents`: allowlist id agent untuk `sessions_spawn` (`["*"]` = apa pun; default: hanya agent yang sama). +- Guard pewarisan sandbox: jika sesi peminta berada dalam sandbox, `sessions_spawn` menolak target yang akan berjalan tanpa sandbox. - `subagents.requireAgentId`: saat true, blokir panggilan `sessions_spawn` yang menghilangkan `agentId` (memaksa pemilihan profil eksplisit; default: false). --- -## Perutean multi-agen +## Routing multi-agent -Jalankan beberapa agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id/concepts/multi-agent). +Jalankan beberapa agent terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id/concepts/multi-agent). ```json5 { @@ -1821,9 +1821,9 @@ Jalankan beberapa agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id } ``` -### Bidang kecocokan binding +### Field kecocokan binding -- `type` (opsional): `route` untuk perutean normal (type yang hilang default ke route), `acp` untuk binding percakapan ACP persisten. +- `type` (opsional): `route` untuk routing normal (type yang tidak ada default ke route), `acp` untuk binding percakapan ACP persisten. - `match.channel` (wajib) - `match.accountId` (opsional; `*` = akun apa pun; dihilangkan = akun default) - `match.peer` (opsional; `{ kind: direct|group|channel, id }`) @@ -1836,14 +1836,14 @@ Jalankan beberapa agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id 2. `match.guildId` 3. `match.teamId` 4. `match.accountId` (tepat, tanpa peer/guild/team) -5. `match.accountId: "*"` (seluruh channel) -6. Agen default +5. `match.accountId: "*"` (cakupan channel) +6. Agent default Dalam setiap tingkat, entri `bindings` pertama yang cocok akan menang. Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan yang tepat (`match.channel` + akun + `match.peer.id`) dan tidak menggunakan urutan tingkat binding route di atas. -### Profil akses per agen +### Profil akses per-agent @@ -1863,7 +1863,7 @@ Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan - + ```json5 { @@ -1964,14 +1964,14 @@ Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk d }, resetTriggers: ["/new", "/reset"], store: "~/.openclaw/agents/{agentId}/sessions/sessions.json", - parentForkMaxTokens: 100000, // lewati fork thread induk di atas jumlah token ini (0 menonaktifkan) + parentForkMaxTokens: 100000, // lewati fork parent-thread di atas jumlah token ini (0 menonaktifkan) maintenance: { mode: "warn", // warn | enforce pruneAfter: "30d", maxEntries: 500, rotateBytes: "10mb", resetArchiveRetention: "30d", // durasi atau false - maxDiskBytes: "500mb", // anggaran keras opsional + maxDiskBytes: "500mb", // hard budget opsional highWaterBytes: "400mb", // target pembersihan opsional }, threadBindings: { @@ -1989,34 +1989,34 @@ Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk d } ``` - + -- **`scope`**: strategi pengelompokan Session dasar untuk konteks chat grup. - - `per-sender` (default): setiap pengirim mendapatkan Session terisolasi dalam konteks channel. - - `global`: semua peserta dalam konteks channel berbagi satu Session (gunakan hanya jika konteks bersama memang diinginkan). +- **`scope`**: strategi pengelompokan sesi dasar untuk konteks chat grup. + - `per-sender` (default): setiap pengirim mendapatkan sesi terisolasi dalam konteks channel. + - `global`: semua peserta dalam konteks channel berbagi satu sesi tunggal (gunakan hanya jika konteks bersama memang diinginkan). - **`dmScope`**: cara DM dikelompokkan. - - `main`: semua DM berbagi Session utama. - - `per-peer`: isolasi berdasarkan ID pengirim lintas channel. - - `per-channel-peer`: isolasi per channel + pengirim (direkomendasikan untuk inbox multi-pengguna). - - `per-account-channel-peer`: isolasi per akun + channel + pengirim (direkomendasikan untuk multi-akun). -- **`identityLinks`**: memetakan ID kanonis ke peer berprefiks provider untuk berbagi Session lintas channel. -- **`reset`**: kebijakan reset utama. `daily` mereset pada `atHour` waktu lokal; `idle` mereset setelah `idleMinutes`. Saat keduanya dikonfigurasi, yang kedaluwarsa lebih dulu akan menang. + - `main`: semua DM berbagi sesi utama. + - `per-peer`: isolasi berdasarkan id pengirim di seluruh channel. + - `per-channel-peer`: isolasi per channel + pengirim (disarankan untuk inbox multi-pengguna). + - `per-account-channel-peer`: isolasi per akun + channel + pengirim (disarankan untuk multi-akun). +- **`identityLinks`**: petakan id kanonis ke peer berawalan provider untuk berbagi sesi lintas channel. +- **`reset`**: kebijakan reset utama. `daily` mereset pada `atHour` waktu lokal; `idle` mereset setelah `idleMinutes`. Jika keduanya dikonfigurasi, yang lebih dulu kedaluwarsa akan menang. - **`resetByType`**: override per tipe (`direct`, `group`, `thread`). `dm` lama diterima sebagai alias untuk `direct`. -- **`parentForkMaxTokens`**: `totalTokens` Session induk maksimum yang diizinkan saat membuat Session thread bercabang (default `100000`). - - Jika `totalTokens` induk di atas nilai ini, OpenClaw memulai Session thread baru alih-alih mewarisi riwayat transkrip induk. - - Setel `0` untuk menonaktifkan pengaman ini dan selalu mengizinkan forking induk. -- **`mainKey`**: bidang lama. Runtime selalu menggunakan `"main"` untuk bucket chat langsung utama. -- **`agentToAgent.maxPingPongTurns`**: jumlah maksimum giliran balasan antar agen selama pertukaran antar agen (bilangan bulat, rentang: `0`–`5`). `0` menonaktifkan rantai ping-pong. -- **`sendPolicy`**: cocokkan berdasarkan `channel`, `chatType` (`direct|group|channel`, dengan alias lama `dm`), `keyPrefix`, atau `rawKeyPrefix`. Penolakan pertama menang. -- **`maintenance`**: pembersihan session-store + kontrol retensi. +- **`parentForkMaxTokens`**: jumlah maksimum `totalTokens` sesi induk yang diizinkan saat membuat sesi thread hasil fork (default `100000`). + - Jika `totalTokens` induk berada di atas nilai ini, OpenClaw memulai sesi thread baru alih-alih mewarisi riwayat transkrip sesi induk. + - Atur `0` untuk menonaktifkan guard ini dan selalu mengizinkan fork dari induk. +- **`mainKey`**: field lama. Runtime selalu menggunakan `"main"` untuk bucket chat langsung utama. +- **`agentToAgent.maxPingPongTurns`**: jumlah maksimum giliran balas-balik antar-agent selama pertukaran agent-ke-agent (integer, rentang: `0`–`5`). `0` menonaktifkan rangkaian ping-pong. +- **`sendPolicy`**: cocokkan berdasarkan `channel`, `chatType` (`direct|group|channel`, dengan alias lama `dm`), `keyPrefix`, atau `rawKeyPrefix`. Penolakan pertama yang cocok akan menang. +- **`maintenance`**: kontrol pembersihan + retensi session-store. - `mode`: `warn` hanya mengeluarkan peringatan; `enforce` menerapkan pembersihan. - - `pruneAfter`: batas usia untuk entri usang (default `30d`). - - `maxEntries`: jumlah maksimum entri dalam `sessions.json` (default `500`). + - `pruneAfter`: batas usia untuk entri basi (default `30d`). + - `maxEntries`: jumlah maksimum entri di `sessions.json` (default `500`). - `rotateBytes`: rotasi `sessions.json` saat melebihi ukuran ini (default `10mb`). - - `resetArchiveRetention`: retensi untuk arsip transkrip `*.reset.`. Default ke `pruneAfter`; setel `false` untuk menonaktifkan. - - `maxDiskBytes`: anggaran disk direktori sesi opsional. Dalam mode `warn`, ini mencatat peringatan; dalam mode `enforce`, ini menghapus artefak/sesi tertua terlebih dahulu. + - `resetArchiveRetention`: retensi untuk arsip transkrip `*.reset.`. Default mengikuti `pruneAfter`; atur `false` untuk menonaktifkan. + - `maxDiskBytes`: anggaran disk direktori sesi opsional. Dalam mode `warn` akan mencatat peringatan; dalam mode `enforce` akan menghapus artefak/sesi tertua terlebih dahulu. - `highWaterBytes`: target opsional setelah pembersihan anggaran. Default ke `80%` dari `maxDiskBytes`. -- **`threadBindings`**: default global untuk fitur Session terikat thread. +- **`threadBindings`**: default global untuk fitur sesi terikat thread. - `enabled`: sakelar default utama (provider dapat mengoverride; Discord menggunakan `channels.discord.threadBindings.enabled`) - `idleHours`: default auto-unfocus karena tidak aktif dalam jam (`0` menonaktifkan; provider dapat mengoverride) - `maxAgeHours`: default usia maksimum keras dalam jam (`0` menonaktifkan; provider dapat mengoverride) @@ -2057,36 +2057,36 @@ Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk d ### Prefiks respons -Override per channel/akun: `channels..responsePrefix`, `channels..accounts..responsePrefix`. +Override per-channel/akun: `channels..responsePrefix`, `channels..accounts..responsePrefix`. Resolusi (yang paling spesifik menang): akun → channel → global. `""` menonaktifkan dan menghentikan kaskade. `"auto"` menurunkan `[{identity.name}]`. -**Variabel template:** +**Variabel templat:** -| Variabel | Deskripsi | Contoh | +| Variable | Deskripsi | Contoh | | ----------------- | ---------------------- | --------------------------- | -| `{model}` | Nama model pendek | `claude-opus-4-6` | +| `{model}` | Nama model singkat | `claude-opus-4-6` | | `{modelFull}` | Identifier model penuh | `anthropic/claude-opus-4-6` | | `{provider}` | Nama provider | `anthropic` | -| `{thinkingLevel}` | Tingkat thinking saat ini | `high`, `low`, `off` | -| `{identity.name}` | Nama identitas agen | (sama seperti `"auto"`) | +| `{thinkingLevel}` | Level thinking saat ini | `high`, `low`, `off` | +| `{identity.name}` | Nama identitas agent | (sama seperti `"auto"`) | Variabel tidak peka huruf besar/kecil. `{think}` adalah alias untuk `{thinkingLevel}`. -### Reaksi ack +### Ack reaction -- Default ke `identity.emoji` agen aktif, jika tidak ada `"👀"`. Setel `""` untuk menonaktifkan. -- Override per channel: `channels..ackReaction`, `channels..accounts..ackReaction`. +- Default ke `identity.emoji` agent aktif, jika tidak `"👀"`. Atur `""` untuk menonaktifkan. +- Override per-channel: `channels..ackReaction`, `channels..accounts..ackReaction`. - Urutan resolusi: akun → channel → `messages.ackReaction` → fallback identitas. -- Scope: `group-mentions` (default), `group-all`, `direct`, `all`. +- Cakupan: `group-mentions` (default), `group-all`, `direct`, `all`. - `removeAckAfterReply`: menghapus ack setelah balasan di Slack, Discord, dan Telegram. -- `messages.statusReactions.enabled`: mengaktifkan reaksi status siklus hidup di Slack, Discord, dan Telegram. - Di Slack dan Discord, jika tidak disetel maka reaksi status tetap aktif saat reaksi ack aktif. - Di Telegram, setel ini secara eksplisit ke `true` untuk mengaktifkan reaksi status siklus hidup. +- `messages.statusReactions.enabled`: mengaktifkan reaction status siklus hidup di Slack, Discord, dan Telegram. + Di Slack dan Discord, nilai yang tidak diatur membuat reaction status tetap aktif saat ack reaction aktif. + Di Telegram, atur secara eksplisit ke `true` untuk mengaktifkan reaction status siklus hidup. -### Debounce inbound +### Debounce masuk -Menggabungkan pesan cepat hanya-teks dari pengirim yang sama menjadi satu giliran agen. Media/lampiran langsung memaksa flush. Perintah kontrol melewati debouncing. +Mengelompokkan pesan cepat berbasis teks dari pengirim yang sama menjadi satu giliran agent. Media/lampiran langsung memicu flush. Perintah kontrol melewati debounce. ### TTS (text-to-speech) @@ -2132,9 +2132,9 @@ Menggabungkan pesan cepat hanya-teks dari pengirim yang sama menjadi satu gilira - `auto` mengontrol mode auto-TTS default: `off`, `always`, `inbound`, atau `tagged`. `/tts on|off` dapat mengoverride preferensi lokal, dan `/tts status` menampilkan status efektif. - `summaryModel` mengoverride `agents.defaults.model.primary` untuk ringkasan otomatis. - `modelOverrides` aktif secara default; `modelOverrides.allowProvider` default ke `false` (opt-in). -- API key fallback ke `ELEVENLABS_API_KEY`/`XI_API_KEY` dan `OPENAI_API_KEY`. -- `openai.baseUrl` mengoverride endpoint TTS OpenAI. Urutan resolusi adalah konfigurasi, lalu `OPENAI_TTS_BASE_URL`, lalu `https://api.openai.com/v1`. -- Saat `openai.baseUrl` mengarah ke endpoint non-OpenAI, OpenClaw memperlakukannya sebagai server TTS yang kompatibel dengan OpenAI dan melonggarkan validasi model/voice. +- API key menggunakan fallback ke `ELEVENLABS_API_KEY`/`XI_API_KEY` dan `OPENAI_API_KEY`. +- `openai.baseUrl` mengoverride endpoint TTS OpenAI. Urutan resolusi adalah config, lalu `OPENAI_TTS_BASE_URL`, lalu `https://api.openai.com/v1`. +- Saat `openai.baseUrl` menunjuk ke endpoint non-OpenAI, OpenClaw memperlakukannya sebagai server TTS yang kompatibel dengan OpenAI dan melonggarkan validasi model/suara. --- @@ -2164,51 +2164,51 @@ Default untuk mode Talk (macOS/iOS/Android). } ``` -- `talk.provider` harus cocok dengan sebuah kunci di `talk.providers` saat beberapa provider Talk dikonfigurasi. -- Kunci Talk datar lama (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) hanya untuk kompatibilitas dan dimigrasikan otomatis ke `talk.providers.`. -- ID voice menggunakan fallback `ELEVENLABS_VOICE_ID` atau `SAG_VOICE_ID`. +- `talk.provider` harus cocok dengan key di `talk.providers` saat beberapa provider Talk dikonfigurasi. +- Key Talk datar lama (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) hanya untuk kompatibilitas dan dimigrasikan otomatis ke `talk.providers.`. +- Voice ID menggunakan fallback ke `ELEVENLABS_VOICE_ID` atau `SAG_VOICE_ID`. - `providers.*.apiKey` menerima string plaintext atau objek SecretRef. - Fallback `ELEVENLABS_API_KEY` hanya berlaku saat tidak ada API key Talk yang dikonfigurasi. - `providers.*.voiceAliases` memungkinkan direktif Talk menggunakan nama yang ramah. -- `silenceTimeoutMs` mengontrol berapa lama mode Talk menunggu setelah pengguna diam sebelum mengirim transkrip. Jika tidak disetel, jeda default platform tetap digunakan (`700 md di macOS dan Android, 900 md di iOS`). +- `silenceTimeoutMs` mengontrol berapa lama mode Talk menunggu setelah pengguna diam sebelum mengirim transkrip. Jika tidak diatur, jeda default platform tetap digunakan (`700 ms di macOS dan Android, 900 ms di iOS`). --- -## Tools +## Alat -### Profil tool +### Profil alat `tools.profile` menetapkan allowlist dasar sebelum `tools.allow`/`tools.deny`: -Onboarding lokal menetapkan default konfigurasi lokal baru ke `tools.profile: "coding"` saat tidak disetel (profil eksplisit yang sudah ada dipertahankan). +Onboarding lokal default mengatur konfigurasi lokal baru ke `tools.profile: "coding"` saat tidak diatur (profil eksplisit yang sudah ada dipertahankan). -| Profil | Mencakup | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------ | -| `minimal` | hanya `session_status` | +| Profil | Mencakup | +| ----------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `minimal` | hanya `session_status` | | `coding` | `group:fs`, `group:runtime`, `group:web`, `group:sessions`, `group:memory`, `cron`, `image`, `image_generate`, `video_generate` | -| `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` | -| `full` | Tanpa pembatasan (sama seperti tidak disetel) | +| `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` | +| `full` | Tanpa pembatasan (sama seperti tidak diatur) | -### Grup tool +### Grup alat -| Grup | Tools | -| ------------------ | ---------------------------------------------------------------------------------------------------------------------- | -| `group:runtime` | `exec`, `process`, `code_execution` (`bash` diterima sebagai alias untuk `exec`) | -| `group:fs` | `read`, `write`, `edit`, `apply_patch` | +| Grup | Alat | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| `group:runtime` | `exec`, `process`, `code_execution` (`bash` diterima sebagai alias untuk `exec`) | +| `group:fs` | `read`, `write`, `edit`, `apply_patch` | | `group:sessions` | `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`, `sessions_yield`, `subagents`, `session_status` | -| `group:memory` | `memory_search`, `memory_get` | -| `group:web` | `web_search`, `x_search`, `web_fetch` | -| `group:ui` | `browser`, `canvas` | -| `group:automation` | `cron`, `gateway` | -| `group:messaging` | `message` | -| `group:nodes` | `nodes` | -| `group:agents` | `agents_list` | -| `group:media` | `image`, `image_generate`, `video_generate`, `tts` | -| `group:openclaw` | Semua tool built-in (tidak termasuk plugin provider) | +| `group:memory` | `memory_search`, `memory_get` | +| `group:web` | `web_search`, `x_search`, `web_fetch` | +| `group:ui` | `browser`, `canvas` | +| `group:automation` | `cron`, `gateway` | +| `group:messaging` | `message` | +| `group:nodes` | `nodes` | +| `group:agents` | `agents_list` | +| `group:media` | `image`, `image_generate`, `video_generate`, `tts` | +| `group:openclaw` | Semua alat bawaan (tidak termasuk provider Plugin) | ### `tools.allow` / `tools.deny` -Kebijakan izin/tolak tool global (tolak menang). Tidak peka huruf besar/kecil, mendukung wildcard `*`. Diterapkan bahkan saat sandbox Docker nonaktif. +Kebijakan allow/deny alat global (deny menang). Tidak peka huruf besar/kecil, mendukung wildcard `*`. Diterapkan bahkan saat sandbox Docker nonaktif. ```json5 { @@ -2218,7 +2218,7 @@ Kebijakan izin/tolak tool global (tolak menang). Tidak peka huruf besar/kecil, m ### `tools.byProvider` -Lebih lanjut membatasi tool untuk provider atau model tertentu. Urutan: profil dasar → profil provider → allow/deny. +Membatasi alat lebih lanjut untuk provider atau model tertentu. Urutan: profil dasar → profil provider → allow/deny. ```json5 { @@ -2250,9 +2250,9 @@ Mengontrol akses exec elevated di luar sandbox: } ``` -- Override per agen (`agents.list[].tools.elevated`) hanya dapat membatasi lebih lanjut. +- Override per-agent (`agents.list[].tools.elevated`) hanya dapat membatasi lebih lanjut. - `/elevated on|off|ask|full` menyimpan status per sesi; direktif inline berlaku untuk satu pesan. -- `exec` elevated melewati sandboxing dan menggunakan jalur escape yang dikonfigurasi (`gateway` secara default, atau `node` saat target exec adalah `node`). +- `exec` elevated melewati sandboxing dan menggunakan escape path yang dikonfigurasi (`gateway` secara default, atau `node` saat target exec adalah `node`). ### `tools.exec` @@ -2276,8 +2276,8 @@ Mengontrol akses exec elevated di luar sandbox: ### `tools.loopDetection` -Pemeriksaan keamanan loop tool **dinonaktifkan secara default**. Setel `enabled: true` untuk mengaktifkan deteksi. -Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan dioverride per agen di `agents.list[].tools.loopDetection`. +Pemeriksaan keamanan loop alat **dinonaktifkan secara default**. Atur `enabled: true` untuk mengaktifkan deteksi. +Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan dioverride per-agent di `agents.list[].tools.loopDetection`. ```json5 { @@ -2298,13 +2298,13 @@ Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan diover } ``` -- `historySize`: riwayat maksimum pemanggilan tool yang dipertahankan untuk analisis loop. -- `warningThreshold`: ambang pola berulang tanpa progres untuk peringatan. +- `historySize`: riwayat maksimum pemanggilan alat yang disimpan untuk analisis loop. +- `warningThreshold`: ambang pola berulang tanpa kemajuan untuk peringatan. - `criticalThreshold`: ambang berulang yang lebih tinggi untuk memblokir loop kritis. -- `globalCircuitBreakerThreshold`: ambang penghentian keras untuk eksekusi tanpa progres apa pun. -- `detectors.genericRepeat`: peringatkan pada pemanggilan tool yang sama/argumen yang sama secara berulang. -- `detectors.knownPollNoProgress`: peringatkan/blokir pada tool polling yang dikenal (`process.poll`, `command_status`, dll.). -- `detectors.pingPong`: peringatkan/blokir pada pola pasangan bergantian tanpa progres. +- `globalCircuitBreakerThreshold`: ambang penghentian keras untuk eksekusi tanpa kemajuan apa pun. +- `detectors.genericRepeat`: peringatkan pada panggilan alat yang sama/argumen yang sama secara berulang. +- `detectors.knownPollNoProgress`: peringatkan/blokir pada alat polling yang dikenal (`process.poll`, `command_status`, dll.). +- `detectors.pingPong`: peringatkan/blokir pada pola pasangan bolak-balik tanpa kemajuan. - Jika `warningThreshold >= criticalThreshold` atau `criticalThreshold >= globalCircuitBreakerThreshold`, validasi gagal. ### `tools.web` @@ -2347,7 +2347,7 @@ Mengonfigurasi pemahaman media masuk (gambar/audio/video): media: { concurrency: 2, asyncCompletion: { - directSend: false, // opt-in: kirim music/video async yang selesai langsung ke channel + directSend: false, // opt-in: kirim musik/video async yang selesai langsung ke channel }, audio: { enabled: true, @@ -2371,31 +2371,31 @@ Mengonfigurasi pemahaman media masuk (gambar/audio/video): } ``` - + **Entri provider** (`type: "provider"` atau dihilangkan): -- `provider`: ID provider API (`openai`, `anthropic`, `google`/`gemini`, `groq`, dll.) -- `model`: override ID model +- `provider`: id provider API (`openai`, `anthropic`, `google`/`gemini`, `groq`, dll.) +- `model`: override id model - `profile` / `preferredProfile`: pemilihan profil `auth-profiles.json` **Entri CLI** (`type: "cli"`): -- `command`: executable yang dijalankan -- `args`: argumen bertemplat (mendukung `{{MediaPath}}`, `{{Prompt}}`, `{{MaxChars}}`, dll.) +- `command`: executable yang akan dijalankan +- `args`: arg bertemplat (mendukung `{{MediaPath}}`, `{{Prompt}}`, `{{MaxChars}}`, dll.) -**Bidang umum:** +**Field umum:** - `capabilities`: daftar opsional (`image`, `audio`, `video`). Default: `openai`/`anthropic`/`minimax` → image, `google` → image+audio+video, `groq` → audio. -- `prompt`, `maxChars`, `maxBytes`, `timeoutSeconds`, `language`: override per entri. +- `prompt`, `maxChars`, `maxBytes`, `timeoutSeconds`, `language`: override per-entri. - Kegagalan akan fallback ke entri berikutnya. Auth provider mengikuti urutan standar: `auth-profiles.json` → env vars → `models.providers.*.apiKey`. -**Bidang asyncCompletion:** +**Field penyelesaian async:** -- `asyncCompletion.directSend`: saat `true`, tugas `music_generate` - dan `video_generate` async yang selesai mencoba pengiriman channel langsung terlebih dahulu. Default: `false` +- `asyncCompletion.directSend`: saat `true`, tugas async `music_generate` + dan `video_generate` yang selesai mencoba pengiriman channel langsung terlebih dahulu. Default: `false` (jalur lama requester-session wake/model-delivery). @@ -2415,9 +2415,9 @@ Auth provider mengikuti urutan standar: `auth-profiles.json` → env vars → `m ### `tools.sessions` -Mengontrol sesi mana yang dapat ditargetkan oleh tool sesi (`sessions_list`, `sessions_history`, `sessions_send`). +Mengontrol sesi mana yang dapat ditargetkan oleh alat sesi (`sessions_list`, `sessions_history`, `sessions_send`). -Default: `tree` (sesi saat ini + sesi yang dibuat olehnya, seperti subagen). +Default: `tree` (sesi saat ini + sesi yang dihasilkan olehnya, seperti subagent). ```json5 { @@ -2432,11 +2432,11 @@ Default: `tree` (sesi saat ini + sesi yang dibuat olehnya, seperti subagen). Catatan: -- `self`: hanya kunci sesi saat ini. -- `tree`: sesi saat ini + sesi yang dibuat oleh sesi saat ini (subagen). -- `agent`: sesi apa pun yang dimiliki oleh ID agen saat ini (dapat mencakup pengguna lain jika Anda menjalankan sesi per pengirim di bawah ID agen yang sama). -- `all`: sesi apa pun. Penargetan lintas agen tetap memerlukan `tools.agentToAgent`. -- Pembatas sandbox: saat sesi saat ini berada dalam sandbox dan `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibilitas dipaksa ke `tree` bahkan jika `tools.sessions.visibility="all"`. +- `self`: hanya key sesi saat ini. +- `tree`: sesi saat ini + sesi yang dihasilkan oleh sesi saat ini (subagent). +- `agent`: sesi apa pun yang dimiliki oleh id agent saat ini (dapat mencakup pengguna lain jika Anda menjalankan sesi per-pengirim di bawah id agent yang sama). +- `all`: sesi apa pun. Penargetan lintas-agent tetap memerlukan `tools.agentToAgent`. +- Pembatas sandbox: saat sesi saat ini berada dalam sandbox dan `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibilitas dipaksa ke `tree` meskipun `tools.sessions.visibility="all"`. ### `tools.sessions_spawn` @@ -2448,7 +2448,7 @@ Mengontrol dukungan lampiran inline untuk `sessions_spawn`. sessions_spawn: { attachments: { enabled: false, // opt-in: setel true untuk mengizinkan lampiran file inline - maxTotalBytes: 5242880, // total 5 MB di semua file + maxTotalBytes: 5242880, // total 5 MB untuk semua file maxFiles: 50, maxFileBytes: 1048576, // 1 MB per file retainOnSessionKeep: false, // pertahankan lampiran saat cleanup="keep" @@ -2463,13 +2463,13 @@ Catatan: - Lampiran hanya didukung untuk `runtime: "subagent"`. Runtime ACP menolaknya. - File dimaterialisasikan ke workspace anak di `.openclaw/attachments//` dengan `.manifest.json`. - Konten lampiran otomatis disensor dari persistensi transkrip. -- Input base64 divalidasi dengan pemeriksaan alfabet/padding ketat dan pengaman ukuran sebelum decode. +- Input Base64 divalidasi dengan pemeriksaan alfabet/padding yang ketat dan guard ukuran sebelum decode. - Izin file adalah `0700` untuk direktori dan `0600` untuk file. - Pembersihan mengikuti kebijakan `cleanup`: `delete` selalu menghapus lampiran; `keep` hanya mempertahankannya saat `retainOnSessionKeep: true`. ### `tools.experimental` -Flag tool built-in eksperimental. Default nonaktif kecuali berlaku aturan auto-enable GPT-5 agentic-ketat. +Flag alat bawaan eksperimental. Default nonaktif kecuali berlaku aturan auto-enable GPT-5 strict-agentic. ```json5 { @@ -2483,9 +2483,9 @@ Flag tool built-in eksperimental. Default nonaktif kecuali berlaku aturan auto-e Catatan: -- `planTool`: mengaktifkan tool `update_plan` terstruktur untuk pelacakan pekerjaan multi-langkah yang tidak sepele. -- Default: `false` kecuali `agents.defaults.embeddedPi.executionContract` (atau override per agen) disetel ke `"strict-agentic"` untuk eksekusi keluarga GPT-5 OpenAI atau OpenAI Codex. Setel `true` untuk memaksa tool aktif di luar cakupan itu, atau `false` untuk tetap menonaktifkannya bahkan untuk eksekusi GPT-5 strict-agentic. -- Saat diaktifkan, system prompt juga menambahkan panduan penggunaan agar model hanya menggunakannya untuk pekerjaan yang substansial dan mempertahankan paling banyak satu langkah `in_progress`. +- `planTool`: mengaktifkan alat terstruktur `update_plan` untuk pelacakan pekerjaan multi-langkah yang tidak sepele. +- Default: `false` kecuali `agents.defaults.embeddedPi.executionContract` (atau override per-agent) diatur ke `"strict-agentic"` untuk eksekusi keluarga OpenAI atau OpenAI Codex GPT-5. Atur `true` untuk memaksa alat ini aktif di luar cakupan tersebut, atau `false` agar tetap nonaktif bahkan untuk eksekusi GPT-5 strict-agentic. +- Saat diaktifkan, system prompt juga menambahkan panduan penggunaan agar model hanya menggunakannya untuk pekerjaan substansial dan mempertahankan paling banyak satu langkah `in_progress`. ### `agents.defaults.subagents` @@ -2505,16 +2505,16 @@ Catatan: } ``` -- `model`: model default untuk subagen yang dibuat. Jika dihilangkan, subagen mewarisi model pemanggil. -- `allowAgents`: allowlist default ID agen target untuk `sessions_spawn` saat agen peminta tidak menetapkan `subagents.allowAgents` sendiri (`["*"]` = apa saja; default: hanya agen yang sama). -- `runTimeoutSeconds`: timeout default (detik) untuk `sessions_spawn` saat pemanggilan tool menghilangkan `runTimeoutSeconds`. `0` berarti tanpa timeout. -- Kebijakan tool per subagen: `tools.subagents.tools.allow` / `tools.subagents.tools.deny`. +- `model`: model default untuk sub-agent yang dihasilkan. Jika dihilangkan, sub-agent mewarisi model pemanggil. +- `allowAgents`: allowlist default id agent target untuk `sessions_spawn` saat agent peminta tidak menetapkan `subagents.allowAgents` sendiri (`["*"]` = apa pun; default: hanya agent yang sama). +- `runTimeoutSeconds`: timeout default (detik) untuk `sessions_spawn` saat pemanggilan alat menghilangkan `runTimeoutSeconds`. `0` berarti tanpa timeout. +- Kebijakan alat per-subagent: `tools.subagents.tools.allow` / `tools.subagents.tools.deny`. --- ## Provider kustom dan base URL -OpenClaw menggunakan katalog model built-in. Tambahkan provider kustom melalui `models.providers` di konfigurasi atau `~/.openclaw/agents//agent/models.json`. +OpenClaw menggunakan katalog model bawaan. Tambahkan provider kustom melalui `models.providers` di config atau `~/.openclaw/agents//agent/models.json`. ```json5 { @@ -2544,46 +2544,46 @@ OpenClaw menggunakan katalog model built-in. Tambahkan provider kustom melalui ` ``` - Gunakan `authHeader: true` + `headers` untuk kebutuhan auth kustom. -- Override root konfigurasi agen dengan `OPENCLAW_AGENT_DIR` (atau `PI_CODING_AGENT_DIR`, alias variabel environment lama). +- Override root config agent dengan `OPENCLAW_AGENT_DIR` (atau `PI_CODING_AGENT_DIR`, alias environment variable lama). - Prioritas penggabungan untuk ID provider yang cocok: - - Nilai `baseUrl` `models.json` agen yang tidak kosong didahulukan. - - Nilai `apiKey` agen yang tidak kosong didahulukan hanya saat provider tersebut tidak dikelola SecretRef dalam konteks konfigurasi/auth-profile saat ini. - - Nilai `apiKey` provider yang dikelola SecretRef disegarkan dari penanda sumber (`ENV_VAR_NAME` untuk ref env, `secretref-managed` untuk ref file/exec) alih-alih menyimpan secret yang sudah di-resolve. - - Nilai header provider yang dikelola SecretRef disegarkan dari penanda sumber (`secretref-env:ENV_VAR_NAME` untuk ref env, `secretref-managed` untuk ref file/exec). - - `apiKey`/`baseUrl` agen yang kosong atau tidak ada menggunakan fallback ke `models.providers` di konfigurasi. - - `contextWindow`/`maxTokens` model yang cocok menggunakan nilai yang lebih tinggi antara konfigurasi eksplisit dan nilai katalog implisit. - - `contextTokens` model yang cocok mempertahankan batas runtime eksplisit saat ada; gunakan ini untuk membatasi konteks efektif tanpa mengubah metadata model native. - - Gunakan `models.mode: "replace"` saat Anda ingin konfigurasi menulis ulang `models.json` sepenuhnya. - - Persistensi penanda bersifat source-authoritative: penanda ditulis dari snapshot konfigurasi sumber aktif (pra-resolusi), bukan dari nilai secret runtime yang sudah di-resolve. + - Nilai `baseUrl` `models.json` agent yang tidak kosong lebih diutamakan. + - Nilai `apiKey` agent yang tidak kosong lebih diutamakan hanya ketika provider tersebut tidak dikelola SecretRef dalam konteks config/auth-profile saat ini. + - Nilai `apiKey` provider yang dikelola SecretRef di-refresh dari penanda sumber (`ENV_VAR_NAME` untuk referensi env, `secretref-managed` untuk referensi file/exec) alih-alih menyimpan secret yang sudah di-resolve. + - Nilai header provider yang dikelola SecretRef di-refresh dari penanda sumber (`secretref-env:ENV_VAR_NAME` untuk referensi env, `secretref-managed` untuk referensi file/exec). + - `apiKey`/`baseUrl` agent yang kosong atau tidak ada menggunakan fallback ke `models.providers` di config. + - `contextWindow`/`maxTokens` model yang cocok menggunakan nilai yang lebih tinggi antara config eksplisit dan nilai katalog implisit. + - `contextTokens` model yang cocok mempertahankan batas runtime eksplisit jika ada; gunakan ini untuk membatasi konteks efektif tanpa mengubah metadata model native. + - Gunakan `models.mode: "replace"` saat Anda ingin config menulis ulang `models.json` sepenuhnya. + - Persistensi penanda bersifat source-authoritative: penanda ditulis dari snapshot config sumber aktif (pra-resolve), bukan dari nilai secret runtime yang sudah di-resolve. -### Detail bidang provider +### Detail field provider - `models.mode`: perilaku katalog provider (`merge` atau `replace`). -- `models.providers`: map provider kustom yang dikunci oleh ID provider. -- `models.providers.*.api`: adaptor permintaan (`openai-completions`, `openai-responses`, `anthropic-messages`, `google-generative-ai`, dll). +- `models.providers`: map provider kustom yang dikunci oleh id provider. +- `models.providers.*.api`: adapter permintaan (`openai-completions`, `openai-responses`, `anthropic-messages`, `google-generative-ai`, dll). - `models.providers.*.apiKey`: kredensial provider (utamakan substitusi SecretRef/env). - `models.providers.*.auth`: strategi auth (`api-key`, `token`, `oauth`, `aws-sdk`). - `models.providers.*.injectNumCtxForOpenAICompat`: untuk Ollama + `openai-completions`, suntikkan `options.num_ctx` ke dalam permintaan (default: `true`). -- `models.providers.*.authHeader`: paksa transport kredensial di header `Authorization` jika diperlukan. +- `models.providers.*.authHeader`: paksa transport kredensial di header `Authorization` bila diperlukan. - `models.providers.*.baseUrl`: base URL API upstream. -- `models.providers.*.headers`: header statis tambahan untuk perutean proxy/tenant. +- `models.providers.*.headers`: header statis tambahan untuk routing proxy/tenant. - `models.providers.*.request`: override transport untuk permintaan HTTP model-provider. - `request.headers`: header tambahan (digabungkan dengan default provider). Nilai menerima SecretRef. - - `request.auth`: override strategi auth. Mode: `"provider-default"` (gunakan auth built-in provider), `"authorization-bearer"` (dengan `token`), `"header"` (dengan `headerName`, `value`, `prefix` opsional). - - `request.proxy`: override proxy HTTP. Mode: `"env-proxy"` (gunakan env vars `HTTP_PROXY`/`HTTPS_PROXY`), `"explicit-proxy"` (dengan `url`). Kedua mode menerima sub-objek `tls` opsional. - - `request.tls`: override TLS untuk koneksi langsung. Bidang: `ca`, `cert`, `key`, `passphrase` (semuanya menerima SecretRef), `serverName`, `insecureSkipVerify`. - - `request.allowPrivateNetwork`: saat `true`, izinkan HTTPS ke `baseUrl` ketika DNS me-resolve ke rentang privat, CGNAT, atau rentang serupa, melalui pengaman fetch HTTP provider (opt-in operator untuk endpoint OpenAI-compatible self-hosted tepercaya). WebSocket menggunakan `request` yang sama untuk header/TLS tetapi tidak menggunakan gerbang SSRF fetch itu. Default `false`. + - `request.auth`: override strategi auth. Mode: `"provider-default"` (gunakan auth bawaan provider), `"authorization-bearer"` (dengan `token`), `"header"` (dengan `headerName`, `value`, `prefix` opsional). + - `request.proxy`: override proxy HTTP. Mode: `"env-proxy"` (gunakan env var `HTTP_PROXY`/`HTTPS_PROXY`), `"explicit-proxy"` (dengan `url`). Kedua mode menerima sub-objek `tls` opsional. + - `request.tls`: override TLS untuk koneksi langsung. Field: `ca`, `cert`, `key`, `passphrase` (semuanya menerima SecretRef), `serverName`, `insecureSkipVerify`. + - `request.allowPrivateNetwork`: saat `true`, izinkan HTTPS ke `baseUrl` ketika DNS di-resolve ke rentang private, CGNAT, atau serupa, melalui fetch guard HTTP provider (opt-in operator untuk endpoint OpenAI-compatible self-hosted tepercaya). WebSocket menggunakan `request` yang sama untuk header/TLS tetapi tidak untuk SSRF gate fetch tersebut. Default `false`. - `models.providers.*.models`: entri katalog model provider eksplisit. -- `models.providers.*.models.*.contextWindow`: metadata jendela konteks model native. +- `models.providers.*.models.*.contextWindow`: metadata context window model native. - `models.providers.*.models.*.contextTokens`: batas konteks runtime opsional. Gunakan ini saat Anda menginginkan anggaran konteks efektif yang lebih kecil daripada `contextWindow` native model. -- `models.providers.*.models.*.compat.supportsDeveloperRole`: petunjuk kompatibilitas opsional. Untuk `api: "openai-completions"` dengan `baseUrl` non-native yang tidak kosong (host bukan `api.openai.com`), OpenClaw memaksa ini menjadi `false` saat runtime. `baseUrl` kosong/dihilangkan mempertahankan perilaku default OpenAI. -- `models.providers.*.models.*.compat.requiresStringContent`: petunjuk kompatibilitas opsional untuk endpoint chat OpenAI-compatible yang hanya mendukung string. Saat `true`, OpenClaw meratakan array `messages[].content` yang hanya berisi teks menjadi string biasa sebelum mengirim permintaan. +- `models.providers.*.models.*.compat.supportsDeveloperRole`: petunjuk kompatibilitas opsional. Untuk `api: "openai-completions"` dengan `baseUrl` non-native yang tidak kosong (host bukan `api.openai.com`), OpenClaw memaksa ini ke `false` saat runtime. `baseUrl` kosong/tidak diatur mempertahankan perilaku default OpenAI. +- `models.providers.*.models.*.compat.requiresStringContent`: petunjuk kompatibilitas opsional untuk endpoint chat OpenAI-compatible yang hanya menerima string. Saat `true`, OpenClaw meratakan array `messages[].content` yang hanya berisi teks menjadi string biasa sebelum mengirim permintaan. - `plugins.entries.amazon-bedrock.config.discovery`: root pengaturan auto-discovery Bedrock. - `plugins.entries.amazon-bedrock.config.discovery.enabled`: aktifkan/nonaktifkan discovery implisit. - `plugins.entries.amazon-bedrock.config.discovery.region`: region AWS untuk discovery. -- `plugins.entries.amazon-bedrock.config.discovery.providerFilter`: filter ID provider opsional untuk discovery terarah. -- `plugins.entries.amazon-bedrock.config.discovery.refreshInterval`: interval polling untuk penyegaran discovery. -- `plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow`: jendela konteks fallback untuk model yang ditemukan. +- `plugins.entries.amazon-bedrock.config.discovery.providerFilter`: filter provider-id opsional untuk discovery yang ditargetkan. +- `plugins.entries.amazon-bedrock.config.discovery.refreshInterval`: interval polling untuk refresh discovery. +- `plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow`: context window fallback untuk model yang ditemukan. - `plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens`: token output maksimum fallback untuk model yang ditemukan. ### Contoh provider @@ -2639,7 +2639,7 @@ Gunakan `cerebras/zai-glm-4.7` untuk Cerebras; `zai/glm-4.7` untuk Z.AI langsung } ``` -Setel `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`). Gunakan referensi `opencode/...` untuk katalog Zen atau referensi `opencode-go/...` untuk katalog Go. Pintasan: `openclaw onboard --auth-choice opencode-zen` atau `openclaw onboard --auth-choice opencode-go`. +Atur `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`). Gunakan referensi `opencode/...` untuk katalog Zen atau referensi `opencode-go/...` untuk katalog Go. Pintasan: `openclaw onboard --auth-choice opencode-zen` atau `openclaw onboard --auth-choice opencode-go`. @@ -2656,7 +2656,7 @@ Setel `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`). Gunakan referensi `openc } ``` -Setel `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` adalah alias yang diterima. Pintasan: `openclaw onboard --auth-choice zai-api-key`. +Atur `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` diterima sebagai alias. Pintasan: `openclaw onboard --auth-choice zai-api-key`. - Endpoint umum: `https://api.z.ai/api/paas/v4` - Endpoint coding (default): `https://api.z.ai/api/coding/paas/v4` @@ -2702,8 +2702,8 @@ Setel `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` adalah alias yang diterima. Pintasan: Untuk endpoint China: `baseUrl: "https://api.moonshot.cn/v1"` atau `openclaw onboard --auth-choice moonshot-api-key-cn`. Endpoint Moonshot native mengiklankan kompatibilitas penggunaan streaming pada transport bersama -`openai-completions`, dan OpenClaw menguncinya pada kapabilitas endpoint -alih-alih hanya pada ID provider built-in. +`openai-completions`, dan OpenClaw menguncikannya pada kapabilitas endpoint +bukan hanya pada id provider bawaan. @@ -2721,7 +2721,7 @@ alih-alih hanya pada ID provider built-in. } ``` -Anthropic-compatible, provider built-in. Pintasan: `openclaw onboard --auth-choice kimi-code-api-key`. +Anthropic-compatible, provider bawaan. Pintasan: `openclaw onboard --auth-choice kimi-code-api-key`. @@ -2760,7 +2760,7 @@ Anthropic-compatible, provider built-in. Pintasan: `openclaw onboard --auth-choi } ``` -Base URL seharusnya tidak menyertakan `/v1` (klien Anthropic menambahkannya). Pintasan: `openclaw onboard --auth-choice synthetic-api-key`. +Base URL harus menghilangkan `/v1` (klien Anthropic akan menambahkannya). Pintasan: `openclaw onboard --auth-choice synthetic-api-key`. @@ -2800,11 +2800,11 @@ Base URL seharusnya tidak menyertakan `/v1` (klien Anthropic menambahkannya). Pi } ``` -Setel `MINIMAX_API_KEY`. Pintasan: +Atur `MINIMAX_API_KEY`. Pintasan: `openclaw onboard --auth-choice minimax-global-api` atau `openclaw onboard --auth-choice minimax-cn-api`. Katalog model default hanya ke M2.7. -Pada jalur streaming Anthropic-compatible, OpenClaw menonaktifkan thinking MiniMax +Pada path streaming Anthropic-compatible, OpenClaw menonaktifkan thinking MiniMax secara default kecuali Anda secara eksplisit menetapkan `thinking` sendiri. `/fast on` atau `params.fastMode: true` menulis ulang `MiniMax-M2.7` menjadi `MiniMax-M2.7-highspeed`. @@ -2813,7 +2813,7 @@ secara default kecuali Anda secara eksplisit menetapkan `thinking` sendiri. `/fa -Lihat [Local Models](/id/gateway/local-models). Singkatnya: jalankan model lokal besar melalui LM Studio Responses API pada perangkat keras serius; pertahankan model hosted tetap digabungkan untuk fallback. +Lihat [Model Lokal](/id/gateway/local-models). Singkatnya: jalankan model lokal besar melalui LM Studio Responses API pada perangkat keras yang memadai; pertahankan model hosted tetap tergabung untuk fallback. @@ -2844,18 +2844,17 @@ Lihat [Local Models](/id/gateway/local-models). Singkatnya: jalankan model lokal } ``` -- `allowBundled`: allowlist opsional hanya untuk Skills yang dibundel (Skills managed/workspace tidak terpengaruh). -- `load.extraDirs`: root Skills bersama tambahan (prioritas terendah). -- `install.preferBrew`: saat true, utamakan installer Homebrew saat `brew` - tersedia sebelum fallback ke jenis installer lain. +- `allowBundled`: allowlist opsional hanya untuk skill bundled (skill managed/workspace tidak terpengaruh). +- `load.extraDirs`: root skill bersama tambahan (prioritas terendah). +- `install.preferBrew`: saat true, utamakan installer Homebrew ketika `brew` tersedia sebelum fallback ke jenis installer lain. - `install.nodeManager`: preferensi installer node untuk spesifikasi `metadata.openclaw.install` (`npm` | `pnpm` | `yarn` | `bun`). -- `entries..enabled: false` menonaktifkan sebuah Skill meskipun dibundel/terinstal. -- `entries..apiKey`: kemudahan untuk Skills yang mendeklarasikan env var utama (string plaintext atau objek SecretRef). +- `entries..enabled: false` menonaktifkan skill meskipun bundled/terinstal. +- `entries..apiKey`: kemudahan untuk skill yang mendeklarasikan env var utama (string plaintext atau objek SecretRef). --- -## Plugins +## Plugin ```json5 { @@ -2880,42 +2879,42 @@ Lihat [Local Models](/id/gateway/local-models). Singkatnya: jalankan model lokal ``` - Dimuat dari `~/.openclaw/extensions`, `/.openclaw/extensions`, ditambah `plugins.load.paths`. -- Discovery menerima Plugin OpenClaw native plus bundle Codex dan bundle Claude yang kompatibel, termasuk bundle Claude tata letak default tanpa manifest. -- **Perubahan konfigurasi memerlukan restart Gateway.** +- Discovery menerima Plugin OpenClaw native plus bundle Codex yang kompatibel dan bundle Claude, termasuk bundle Claude tata letak default tanpa manifest. +- **Perubahan konfigurasi memerlukan restart gateway.** - `allow`: allowlist opsional (hanya Plugin yang terdaftar yang dimuat). `deny` menang. -- `plugins.entries..apiKey`: bidang kemudahan API key tingkat Plugin (saat didukung oleh Plugin). +- `plugins.entries..apiKey`: field kemudahan API key tingkat Plugin (saat didukung oleh Plugin). - `plugins.entries..env`: map env var yang dicakup Plugin. -- `plugins.entries..hooks.allowPromptInjection`: saat `false`, core memblokir `before_prompt_build` dan mengabaikan bidang yang memutasi prompt dari `before_agent_start` lama, sambil mempertahankan `modelOverride` dan `providerOverride` lama. Berlaku untuk hook Plugin native dan direktori hook yang disediakan bundle yang didukung. -- `plugins.entries..subagent.allowModelOverride`: secara eksplisit mempercayai Plugin ini untuk meminta override `provider` dan `model` per eksekusi untuk eksekusi subagen latar belakang. -- `plugins.entries..subagent.allowedModels`: allowlist opsional target `provider/model` kanonis untuk override subagen tepercaya. Gunakan `"*"` hanya saat Anda memang ingin mengizinkan model apa pun. -- `plugins.entries..config`: objek konfigurasi yang didefinisikan Plugin (divalidasi oleh schema Plugin OpenClaw native saat tersedia). +- `plugins.entries..hooks.allowPromptInjection`: saat `false`, inti memblokir `before_prompt_build` dan mengabaikan field yang memutasi prompt dari `before_agent_start` lama, sambil mempertahankan `modelOverride` dan `providerOverride` lama. Berlaku untuk hook Plugin native dan direktori hook yang disediakan bundle yang didukung. +- `plugins.entries..subagent.allowModelOverride`: secara eksplisit mempercayai Plugin ini untuk meminta override `provider` dan `model` per-eksekusi untuk eksekusi subagent latar belakang. +- `plugins.entries..subagent.allowedModels`: allowlist opsional target `provider/model` kanonis untuk override subagent tepercaya. Gunakan `"*"` hanya bila Anda memang ingin mengizinkan model apa pun. +- `plugins.entries..config`: objek konfigurasi yang didefinisikan Plugin (divalidasi oleh skema Plugin OpenClaw native saat tersedia). - `plugins.entries.firecrawl.config.webFetch`: pengaturan provider web-fetch Firecrawl. - - `apiKey`: API key Firecrawl (menerima SecretRef). Menggunakan fallback ke `plugins.entries.firecrawl.config.webSearch.apiKey`, `tools.web.fetch.firecrawl.apiKey` lama, atau env var `FIRECRAWL_API_KEY`. + - `apiKey`: API key Firecrawl (menerima SecretRef). Fallback ke `plugins.entries.firecrawl.config.webSearch.apiKey`, `tools.web.fetch.firecrawl.apiKey` lama, atau env var `FIRECRAWL_API_KEY`. - `baseUrl`: base URL API Firecrawl (default: `https://api.firecrawl.dev`). - `onlyMainContent`: ekstrak hanya konten utama dari halaman (default: `true`). - `maxAgeMs`: usia cache maksimum dalam milidetik (default: `172800000` / 2 hari). - `timeoutSeconds`: timeout permintaan scrape dalam detik (default: `60`). -- `plugins.entries.xai.config.xSearch`: pengaturan X Search xAI (pencarian web Grok). +- `plugins.entries.xai.config.xSearch`: pengaturan xAI X Search (pencarian web Grok). - `enabled`: aktifkan provider X Search. - - `model`: model Grok yang digunakan untuk pencarian (misalnya `"grok-4-1-fast"`). + - `model`: model Grok yang digunakan untuk pencarian (mis. `"grok-4-1-fast"`). - `plugins.entries.memory-core.config.dreaming`: pengaturan dreaming memory. Lihat [Dreaming](/id/concepts/dreaming) untuk fase dan ambang. - `enabled`: sakelar dreaming utama (default `false`). - - `frequency`: cadence Cron untuk setiap sweep dreaming penuh (default `"0 3 * * *"`). - - kebijakan fase dan ambang adalah detail implementasi (bukan kunci konfigurasi yang ditujukan untuk pengguna). + - `frequency`: cadence Cron untuk setiap sapuan dreaming penuh (default `"0 3 * * *"`). + - kebijakan fase dan ambang adalah detail implementasi (bukan key konfigurasi yang ditujukan untuk pengguna). - Konfigurasi memory lengkap ada di [Referensi konfigurasi Memory](/id/reference/memory-config): - `agents.defaults.memorySearch.*` - `memory.backend` - `memory.citations` - `memory.qmd.*` - `plugins.entries.memory-core.config.dreaming` -- Plugin bundle Claude yang diaktifkan juga dapat menyumbangkan default Pi embedded dari `settings.json`; OpenClaw menerapkannya sebagai pengaturan agen yang sudah disanitasi, bukan sebagai patch konfigurasi OpenClaw mentah. -- `plugins.slots.memory`: pilih ID Plugin memory aktif, atau `"none"` untuk menonaktifkan Plugin memory. -- `plugins.slots.contextEngine`: pilih ID Plugin context engine aktif; default ke `"legacy"` kecuali Anda menginstal dan memilih engine lain. +- Plugin bundle Claude yang diaktifkan juga dapat menyumbangkan default Pi embedded dari `settings.json`; OpenClaw menerapkannya sebagai pengaturan agent yang sudah disanitasi, bukan sebagai patch config OpenClaw mentah. +- `plugins.slots.memory`: pilih id Plugin memory aktif, atau `"none"` untuk menonaktifkan Plugin memory. +- `plugins.slots.contextEngine`: pilih id Plugin context engine aktif; default ke `"legacy"` kecuali Anda menginstal dan memilih engine lain. - `plugins.installs`: metadata instalasi yang dikelola CLI dan digunakan oleh `openclaw plugins update`. - Mencakup `source`, `spec`, `sourcePath`, `installPath`, `version`, `resolvedName`, `resolvedVersion`, `resolvedSpec`, `integrity`, `shasum`, `resolvedAt`, `installedAt`. - - Perlakukan `plugins.installs.*` sebagai status terkelola; utamakan perintah CLI dibanding edit manual. + - Perlakukan `plugins.installs.*` sebagai state yang dikelola; utamakan perintah CLI daripada edit manual. -Lihat [Plugins](/id/tools/plugin). +Lihat [Plugin](/id/tools/plugin). --- @@ -2928,7 +2927,7 @@ Lihat [Plugins](/id/tools/plugin). evaluateEnabled: true, defaultProfile: "user", ssrfPolicy: { - // dangerouslyAllowPrivateNetwork: true, // opt in hanya untuk akses jaringan privat tepercaya + // dangerouslyAllowPrivateNetwork: true, // opt in hanya untuk akses private-network tepercaya // allowPrivateNetwork: true, // alias lama // hostnameAllowlist: ["*.example.com", "example.com"], // allowedHostnames: ["localhost"], @@ -2956,27 +2955,28 @@ Lihat [Plugins](/id/tools/plugin). ``` - `evaluateEnabled: false` menonaktifkan `act:evaluate` dan `wait --fn`. -- `ssrfPolicy.dangerouslyAllowPrivateNetwork` dinonaktifkan saat tidak disetel, sehingga navigasi browser tetap ketat secara default. -- Setel `ssrfPolicy.dangerouslyAllowPrivateNetwork: true` hanya saat Anda memang mempercayai navigasi browser jaringan privat. -- Dalam mode ketat, endpoint profil CDP jarak jauh (`profiles.*.cdpUrl`) tunduk pada pemblokiran jaringan privat yang sama selama pemeriksaan keterjangkauan/discovery. +- `ssrfPolicy.dangerouslyAllowPrivateNetwork` dinonaktifkan saat tidak diatur, sehingga navigasi browser tetap ketat secara default. +- Atur `ssrfPolicy.dangerouslyAllowPrivateNetwork: true` hanya bila Anda secara sengaja mempercayai navigasi browser private-network. +- Dalam mode ketat, endpoint profil CDP jarak jauh (`profiles.*.cdpUrl`) tunduk pada pemblokiran private-network yang sama selama pemeriksaan keterjangkauan/discovery. - `ssrfPolicy.allowPrivateNetwork` tetap didukung sebagai alias lama. - Dalam mode ketat, gunakan `ssrfPolicy.hostnameAllowlist` dan `ssrfPolicy.allowedHostnames` untuk pengecualian eksplisit. - Profil jarak jauh bersifat attach-only (start/stop/reset dinonaktifkan). - `profiles.*.cdpUrl` menerima `http://`, `https://`, `ws://`, dan `wss://`. - Gunakan HTTP(S) saat Anda ingin OpenClaw menemukan `/json/version`; gunakan WS(S) + Gunakan HTTP(S) bila Anda ingin OpenClaw menemukan `/json/version`; gunakan WS(S) saat provider Anda memberi URL WebSocket DevTools langsung. -- Profil `existing-session` hanya-host dan menggunakan Chrome MCP alih-alih CDP. +- Profil `existing-session` menggunakan Chrome MCP alih-alih CDP dan dapat attach pada + host yang dipilih atau melalui browser Node yang terhubung. - Profil `existing-session` dapat menetapkan `userDataDir` untuk menargetkan profil browser berbasis Chromium tertentu seperti Brave atau Edge. - Profil `existing-session` mempertahankan batas rute Chrome MCP saat ini: - tindakan berbasis snapshot/ref alih-alih penargetan CSS selector, hook upload satu file, - tanpa override timeout dialog, dan tanpa `wait --load networkidle`, - `responsebody`, ekspor PDF, intersepsi unduhan, atau tindakan batch. -- Profil `openclaw` terkelola lokal secara otomatis menetapkan `cdpPort` dan `cdpUrl`; hanya - setel `cdpUrl` secara eksplisit untuk CDP jarak jauh. + aksi berbasis snapshot/ref alih-alih penargetan CSS-selector, hook upload satu file, + tanpa override timeout dialog, tanpa `wait --load networkidle`, dan tanpa + `responsebody`, ekspor PDF, intersepsi unduhan, atau aksi batch. +- Profil `openclaw` lokal yang dikelola otomatis menetapkan `cdpPort` dan `cdpUrl`; hanya + atur `cdpUrl` secara eksplisit untuk CDP jarak jauh. - Urutan deteksi otomatis: browser default jika berbasis Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary. - Layanan kontrol: hanya loopback (port diturunkan dari `gateway.port`, default `18791`). -- `extraArgs` menambahkan flag peluncuran ekstra ke startup Chromium lokal (misalnya +- `extraArgs` menambahkan flag peluncuran tambahan ke startup Chromium lokal (misalnya `--disable-gpu`, ukuran jendela, atau flag debug). --- @@ -2989,14 +2989,14 @@ Lihat [Plugins](/id/tools/plugin). seamColor: "#FF4500", assistant: { name: "OpenClaw", - avatar: "CB", // emoji, teks pendek, URL gambar, atau URI data + avatar: "CB", // emoji, teks singkat, URL gambar, atau data URI }, }, } ``` -- `seamColor`: warna aksen untuk chrome UI aplikasi native (warna bubble Mode Talk, dll.). -- `assistant`: override identitas UI Kontrol. Menggunakan fallback ke identitas agen aktif. +- `seamColor`: warna aksen untuk chrome UI aplikasi native (warna bubble Talk Mode, dll.). +- `assistant`: override identitas Control UI. Fallback ke identitas agent aktif. --- @@ -3031,8 +3031,8 @@ Lihat [Plugins](/id/tools/plugin). // root: "dist/control-ui", // embedSandbox: "scripts", // strict | scripts | trusted // allowExternalEmbedUrls: false, // berbahaya: izinkan URL embed http(s) eksternal absolut - // allowedOrigins: ["https://control.example.com"], // wajib untuk UI Kontrol non-loopback - // dangerouslyAllowHostHeaderOriginFallback: false, // berbahaya: mode fallback origin Host-header + // allowedOrigins: ["https://control.example.com"], // wajib untuk Control UI non-loopback + // dangerouslyAllowHostHeaderOriginFallback: false, // mode fallback origin Host-header yang berbahaya // allowInsecureAuth: false, // dangerouslyDisableDeviceAuth: false, }, @@ -3048,7 +3048,7 @@ Lihat [Plugins](/id/tools/plugin). tools: { // Penolakan HTTP /tools/invoke tambahan deny: ["browser"], - // Hapus tool dari daftar tolak HTTP default + // Hapus alat dari daftar deny HTTP default allow: ["gateway"], }, push: { @@ -3063,66 +3063,66 @@ Lihat [Plugins](/id/tools/plugin). } ``` - + -- `mode`: `local` (jalankan Gateway) atau `remote` (terhubung ke Gateway jarak jauh). Gateway menolak untuk mulai kecuali `local`. -- `port`: port multiplex tunggal untuk WS + HTTP. Prioritas: `--port` > `OPENCLAW_GATEWAY_PORT` > `gateway.port` > `18789`. +- `mode`: `local` (jalankan gateway) atau `remote` (terhubung ke gateway jarak jauh). Gateway menolak untuk mulai kecuali `local`. +- `port`: port tunggal multipleks untuk WS + HTTP. Prioritas: `--port` > `OPENCLAW_GATEWAY_PORT` > `gateway.port` > `18789`. - `bind`: `auto`, `loopback` (default), `lan` (`0.0.0.0`), `tailnet` (hanya IP Tailscale), atau `custom`. - **Alias bind lama**: gunakan nilai mode bind di `gateway.bind` (`auto`, `loopback`, `lan`, `tailnet`, `custom`), bukan alias host (`0.0.0.0`, `127.0.0.1`, `localhost`, `::`, `::1`). -- **Catatan Docker**: bind `loopback` default mendengarkan di `127.0.0.1` di dalam container. Dengan jaringan bridge Docker (`-p 18789:18789`), lalu lintas datang di `eth0`, sehingga Gateway tidak dapat dijangkau. Gunakan `--network host`, atau setel `bind: "lan"` (atau `bind: "custom"` dengan `customBindHost: "0.0.0.0"`) agar mendengarkan di semua antarmuka. -- **Auth**: wajib secara default. Bind non-loopback memerlukan auth Gateway. Dalam praktiknya ini berarti token/kata sandi bersama atau reverse proxy yang sadar identitas dengan `gateway.auth.mode: "trusted-proxy"`. Wizard onboarding menghasilkan token secara default. -- Jika `gateway.auth.token` dan `gateway.auth.password` keduanya dikonfigurasi (termasuk SecretRef), setel `gateway.auth.mode` secara eksplisit ke `token` atau `password`. Startup dan alur instalasi/perbaikan layanan gagal saat keduanya dikonfigurasi dan mode tidak disetel. -- `gateway.auth.mode: "none"`: mode tanpa auth yang eksplisit. Gunakan hanya untuk pengaturan local loopback tepercaya; ini sengaja tidak ditawarkan oleh prompt onboarding. -- `gateway.auth.mode: "trusted-proxy"`: delegasikan auth ke reverse proxy yang sadar identitas dan percayai header identitas dari `gateway.trustedProxies` (lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth)). Mode ini mengharapkan sumber proxy **non-loopback**; reverse proxy loopback pada host yang sama tidak memenuhi auth trusted-proxy. -- `gateway.auth.allowTailscale`: saat `true`, header identitas Tailscale Serve dapat memenuhi auth UI Kontrol/WebSocket (diverifikasi melalui `tailscale whois`). Endpoint HTTP API **tidak** menggunakan auth header Tailscale itu; mereka mengikuti mode auth HTTP normal Gateway. Alur tanpa token ini mengasumsikan host Gateway tepercaya. Default ke `true` saat `tailscale.mode = "serve"`. +- **Catatan Docker**: bind default `loopback` mendengarkan di `127.0.0.1` di dalam container. Dengan Docker bridge networking (`-p 18789:18789`), lalu lintas datang ke `eth0`, sehingga gateway tidak dapat dijangkau. Gunakan `--network host`, atau atur `bind: "lan"` (atau `bind: "custom"` dengan `customBindHost: "0.0.0.0"`) agar mendengarkan di semua interface. +- **Auth**: wajib secara default. Bind non-loopback memerlukan auth gateway. Dalam praktiknya, ini berarti token/password bersama atau reverse proxy yang sadar identitas dengan `gateway.auth.mode: "trusted-proxy"`. Wizard onboarding menghasilkan token secara default. +- Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi (termasuk SecretRef), atur `gateway.auth.mode` secara eksplisit ke `token` atau `password`. Startup dan alur instalasi/perbaikan service gagal saat keduanya dikonfigurasi dan mode tidak diatur. +- `gateway.auth.mode: "none"`: mode tanpa auth eksplisit. Gunakan hanya untuk penyiapan local loopback tepercaya; ini sengaja tidak ditawarkan oleh prompt onboarding. +- `gateway.auth.mode: "trusted-proxy"`: delegasikan auth ke reverse proxy yang sadar identitas dan percayai header identitas dari `gateway.trustedProxies` (lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth)). Mode ini mengharapkan sumber proxy **non-loopback**; reverse proxy loopback di host yang sama tidak memenuhi auth trusted-proxy. +- `gateway.auth.allowTailscale`: saat `true`, header identitas Tailscale Serve dapat memenuhi auth Control UI/WebSocket (diverifikasi melalui `tailscale whois`). Endpoint HTTP API **tidak** menggunakan auth header Tailscale tersebut; endpoint tetap mengikuti mode auth HTTP gateway normal. Alur tanpa token ini mengasumsikan host gateway tepercaya. Default ke `true` saat `tailscale.mode = "serve"`. - `gateway.auth.rateLimit`: limiter auth gagal opsional. Berlaku per IP klien dan per cakupan auth (shared-secret dan device-token dilacak secara independen). Percobaan yang diblokir mengembalikan `429` + `Retry-After`. - - Pada jalur UI Kontrol Tailscale Serve async, percobaan gagal untuk `{scope, clientIp}` yang sama diserialkan sebelum penulisan kegagalan. Karena itu percobaan buruk serentak dari klien yang sama dapat memicu limiter pada permintaan kedua alih-alih keduanya lolos sebagai ketidakcocokan biasa. - - `gateway.auth.rateLimit.exemptLoopback` default ke `true`; setel `false` saat Anda memang ingin lalu lintas localhost juga dibatasi lajunya (untuk pengaturan pengujian atau deployment proxy yang ketat). -- Percobaan auth WS yang berasal dari browser selalu di-throttle dengan pengecualian loopback dinonaktifkan (defense-in-depth terhadap brute force localhost berbasis browser). -- Pada loopback, lockout asal-browser tersebut diisolasi per nilai `Origin` + - Pada path Control UI Tailscale Serve async, percobaan gagal untuk `{scope, clientIp}` yang sama diserialkan sebelum penulisan kegagalan. Karena itu, percobaan buruk serentak dari klien yang sama dapat memicu limiter pada permintaan kedua alih-alih keduanya lolos sebagai mismatch biasa. + - `gateway.auth.rateLimit.exemptLoopback` default ke `true`; atur `false` saat Anda sengaja ingin lalu lintas localhost juga terkena rate limit (untuk penyiapan test atau deployment proxy yang ketat). +- Percobaan auth WS yang berasal dari browser selalu dibatasi dengan pengecualian loopback dinonaktifkan (defense-in-depth terhadap brute force localhost berbasis browser). +- Pada loopback, lockout asal browser tersebut diisolasi per nilai `Origin` yang dinormalisasi, sehingga kegagalan berulang dari satu origin localhost tidak otomatis mengunci origin yang berbeda. - `tailscale.mode`: `serve` (hanya tailnet, bind loopback) atau `funnel` (publik, memerlukan auth). - `controlUi.allowedOrigins`: allowlist origin browser eksplisit untuk koneksi WebSocket Gateway. Wajib saat klien browser diharapkan berasal dari origin non-loopback. -- `controlUi.dangerouslyAllowHostHeaderOriginFallback`: mode berbahaya yang mengaktifkan fallback origin Host-header untuk deployment yang memang bergantung pada kebijakan origin Host-header. -- `remote.transport`: `ssh` (default) atau `direct` (ws/wss). Untuk `direct`, `remote.url` harus berupa `ws://` atau `wss://`. -- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1`: override break-glass sisi klien yang mengizinkan `ws://` plaintext ke IP jaringan privat tepercaya; default tetap hanya-loopback untuk plaintext. -- `gateway.remote.token` / `.password` adalah bidang kredensial klien jarak jauh. Keduanya tidak dengan sendirinya mengonfigurasi auth Gateway. -- `gateway.push.apns.relay.baseUrl`: base HTTPS URL untuk relay APNs eksternal yang digunakan oleh build iOS resmi/TestFlight setelah memublikasikan pendaftaran berbasis relay ke Gateway. URL ini harus cocok dengan URL relay yang dikompilasi ke build iOS. -- `gateway.push.apns.relay.timeoutMs`: timeout pengiriman Gateway-ke-relay dalam milidetik. Default ke `10000`. -- Pendaftaran berbasis relay didelegasikan ke identitas Gateway tertentu. Aplikasi iOS yang dipasangkan mengambil `gateway.identity.get`, menyertakan identitas tersebut dalam pendaftaran relay, dan meneruskan grant kirim yang dicakup pendaftaran ke Gateway. Gateway lain tidak dapat menggunakan ulang pendaftaran yang tersimpan itu. +- `controlUi.dangerouslyAllowHostHeaderOriginFallback`: mode berbahaya yang mengaktifkan fallback origin Host-header untuk deployment yang secara sengaja mengandalkan kebijakan origin Host-header. +- `remote.transport`: `ssh` (default) atau `direct` (ws/wss). Untuk `direct`, `remote.url` harus `ws://` atau `wss://`. +- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1`: override break-glass sisi klien yang mengizinkan `ws://` plaintext ke IP private-network tepercaya; default tetap hanya loopback untuk plaintext. +- `gateway.remote.token` / `.password` adalah field kredensial klien remote. Field ini tidak mengonfigurasi auth gateway dengan sendirinya. +- `gateway.push.apns.relay.baseUrl`: base HTTPS URL untuk relay APNs eksternal yang digunakan oleh build iOS resmi/TestFlight setelah memublikasikan registrasi berbasis relay ke gateway. URL ini harus cocok dengan URL relay yang dikompilasi ke build iOS. +- `gateway.push.apns.relay.timeoutMs`: timeout pengiriman gateway-ke-relay dalam milidetik. Default ke `10000`. +- Registrasi berbasis relay didelegasikan ke identitas gateway tertentu. Aplikasi iOS yang dipasangkan mengambil `gateway.identity.get`, menyertakan identitas tersebut dalam registrasi relay, dan meneruskan grant pengiriman yang dicakup registrasi ke gateway. Gateway lain tidak dapat menggunakan ulang registrasi tersimpan itu. - `OPENCLAW_APNS_RELAY_BASE_URL` / `OPENCLAW_APNS_RELAY_TIMEOUT_MS`: override env sementara untuk konfigurasi relay di atas. -- `OPENCLAW_APNS_RELAY_ALLOW_HTTP=true`: escape hatch khusus pengembangan untuk URL relay HTTP loopback. URL relay produksi harus tetap menggunakan HTTPS. -- `gateway.channelHealthCheckMinutes`: interval monitor kesehatan channel dalam menit. Setel `0` untuk menonaktifkan restart monitor kesehatan secara global. Default: `5`. -- `gateway.channelStaleEventThresholdMinutes`: ambang socket usang dalam menit. Pertahankan nilai ini lebih besar dari atau sama dengan `gateway.channelHealthCheckMinutes`. Default: `30`. +- `OPENCLAW_APNS_RELAY_ALLOW_HTTP=true`: escape hatch khusus pengembangan untuk URL relay HTTP loopback. URL relay produksi harus tetap memakai HTTPS. +- `gateway.channelHealthCheckMinutes`: interval monitor kesehatan channel dalam menit. Atur `0` untuk menonaktifkan restart monitor kesehatan secara global. Default: `5`. +- `gateway.channelStaleEventThresholdMinutes`: ambang stale-socket dalam menit. Pertahankan nilai ini lebih besar atau sama dengan `gateway.channelHealthCheckMinutes`. Default: `30`. - `gateway.channelMaxRestartsPerHour`: jumlah maksimum restart monitor kesehatan per channel/akun dalam satu jam berjalan. Default: `10`. -- `channels..healthMonitor.enabled`: opt-out per channel untuk restart monitor kesehatan sambil tetap mengaktifkan monitor global. -- `channels..accounts..healthMonitor.enabled`: override per akun untuk channel multi-akun. Saat disetel, ini didahulukan atas override tingkat channel. -- Jalur panggilan Gateway lokal dapat menggunakan fallback `gateway.remote.*` hanya saat `gateway.auth.*` tidak disetel. -- Jika `gateway.auth.token` / `gateway.auth.password` secara eksplisit dikonfigurasi melalui SecretRef dan tidak dapat di-resolve, resolusi gagal tertutup (tanpa fallback jarak jauh yang menutupi). -- `trustedProxies`: IP reverse proxy yang menghentikan TLS atau menyuntikkan header klien-terusan. Cantumkan hanya proxy yang Anda kendalikan. Entri loopback tetap valid untuk pengaturan proxy pada host yang sama/deteksi lokal (misalnya Tailscale Serve atau reverse proxy lokal), tetapi entri itu **tidak** membuat permintaan loopback memenuhi syarat untuk `gateway.auth.mode: "trusted-proxy"`. -- `allowRealIpFallback`: saat `true`, Gateway menerima `X-Real-IP` jika `X-Forwarded-For` tidak ada. Default `false` untuk perilaku fail-closed. -- `gateway.tools.deny`: nama tool tambahan yang diblokir untuk HTTP `POST /tools/invoke` (memperluas daftar tolak default). -- `gateway.tools.allow`: hapus nama tool dari daftar tolak HTTP default. +- `channels..healthMonitor.enabled`: opt-out per-channel untuk restart monitor kesehatan sambil tetap mempertahankan monitor global aktif. +- `channels..accounts..healthMonitor.enabled`: override per-akun untuk channel multi-akun. Jika diatur, nilainya lebih diutamakan daripada override tingkat channel. +- Path panggilan gateway lokal dapat menggunakan fallback `gateway.remote.*` hanya saat `gateway.auth.*` tidak diatur. +- Jika `gateway.auth.token` / `gateway.auth.password` secara eksplisit dikonfigurasi melalui SecretRef dan belum di-resolve, resolusi gagal secara fail-closed (tanpa fallback remote yang menutupi). +- `trustedProxies`: IP reverse proxy yang mengakhiri TLS atau menyuntikkan header forwarded-client. Cantumkan hanya proxy yang Anda kendalikan. Entri loopback tetap valid untuk penyiapan proxy di host yang sama/deteksi lokal (misalnya Tailscale Serve atau reverse proxy lokal), tetapi entri ini **tidak** membuat permintaan loopback memenuhi syarat untuk `gateway.auth.mode: "trusted-proxy"`. +- `allowRealIpFallback`: saat `true`, gateway menerima `X-Real-IP` jika `X-Forwarded-For` tidak ada. Default `false` untuk perilaku fail-closed. +- `gateway.tools.deny`: nama alat tambahan yang diblokir untuk HTTP `POST /tools/invoke` (memperluas daftar deny default). +- `gateway.tools.allow`: hapus nama alat dari daftar deny HTTP default. ### Endpoint OpenAI-compatible -- Chat Completions: nonaktif secara default. Aktifkan dengan `gateway.http.endpoints.chatCompletions.enabled: true`. +- Chat Completions: dinonaktifkan secara default. Aktifkan dengan `gateway.http.endpoints.chatCompletions.enabled: true`. - Responses API: `gateway.http.endpoints.responses.enabled`. - Hardening input URL Responses: - `gateway.http.endpoints.responses.maxUrlParts` - `gateway.http.endpoints.responses.files.urlAllowlist` - `gateway.http.endpoints.responses.images.urlAllowlist` - Allowlist kosong diperlakukan sebagai tidak disetel; gunakan `gateway.http.endpoints.responses.files.allowUrl=false` + Allowlist kosong diperlakukan sebagai tidak diatur; gunakan `gateway.http.endpoints.responses.files.allowUrl=false` dan/atau `gateway.http.endpoints.responses.images.allowUrl=false` untuk menonaktifkan pengambilan URL. - Header hardening respons opsional: - - `gateway.http.securityHeaders.strictTransportSecurity` (setel hanya untuk origin HTTPS yang Anda kendalikan; lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth#tls-termination-and-hsts)) + - `gateway.http.securityHeaders.strictTransportSecurity` (atur hanya untuk origin HTTPS yang Anda kendalikan; lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth#tls-termination-and-hsts)) ### Isolasi multi-instance -Jalankan beberapa Gateway pada satu host dengan port dan direktori state unik: +Jalankan beberapa gateway pada satu host dengan port dan direktori state unik: ```bash OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \ @@ -3150,8 +3150,8 @@ Lihat [Multiple Gateways](/id/gateway/multiple-gateways). } ``` -- `enabled`: mengaktifkan terminasi TLS di listener Gateway (HTTPS/WSS) (default: `false`). -- `autoGenerate`: membuat pasangan sertifikat/kunci self-signed lokal secara otomatis saat file eksplisit tidak dikonfigurasi; hanya untuk penggunaan lokal/dev. +- `enabled`: mengaktifkan terminasi TLS pada listener gateway (HTTPS/WSS) (default: `false`). +- `autoGenerate`: menghasilkan otomatis pasangan cert/key self-signed lokal saat file eksplisit tidak dikonfigurasi; hanya untuk penggunaan lokal/dev. - `certPath`: path filesystem ke file sertifikat TLS. - `keyPath`: path filesystem ke file private key TLS; pertahankan dengan izin terbatas. - `caPath`: path bundle CA opsional untuk verifikasi klien atau rantai kepercayaan kustom. @@ -3170,13 +3170,13 @@ Lihat [Multiple Gateways](/id/gateway/multiple-gateways). } ``` -- `mode`: mengontrol cara edit konfigurasi diterapkan saat runtime. - - `"off"`: abaikan edit live; perubahan memerlukan restart eksplisit. - - `"restart"`: selalu restart proses Gateway saat konfigurasi berubah. +- `mode`: mengontrol bagaimana edit config diterapkan saat runtime. + - `"off"`: abaikan edit langsung; perubahan memerlukan restart eksplisit. + - `"restart"`: selalu restart proses gateway saat config berubah. - `"hot"`: terapkan perubahan di dalam proses tanpa restart. - - `"hybrid"` (default): coba hot reload terlebih dahulu; fallback ke restart jika diperlukan. -- `debounceMs`: jendela debounce dalam md sebelum perubahan konfigurasi diterapkan (bilangan bulat non-negatif). -- `deferralTimeoutMs`: waktu maksimum dalam md untuk menunggu operasi yang sedang berjalan sebelum memaksa restart (default: `300000` = 5 menit). + - `"hybrid"` (default): coba hot reload terlebih dahulu; fallback ke restart bila diperlukan. +- `debounceMs`: jendela debounce dalam md sebelum perubahan config diterapkan (integer non-negatif). +- `deferralTimeoutMs`: waktu maksimum dalam md untuk menunggu operasi yang masih berjalan sebelum memaksa restart (default: `300000` = 5 menit). --- @@ -3232,18 +3232,18 @@ Catatan validasi dan keamanan: -- `match.path` mencocokkan subpath setelah `/hooks` (mis. `/hooks/gmail` → `gmail`). -- `match.source` mencocokkan field payload untuk path generik. -- Template seperti `{{messages[0].subject}}` membaca dari payload. +- `match.path` cocok dengan sub-path setelah `/hooks` (mis. `/hooks/gmail` → `gmail`). +- `match.source` cocok dengan field payload untuk path generik. +- Templat seperti `{{messages[0].subject}}` membaca dari payload. - `transform` dapat menunjuk ke modul JS/TS yang mengembalikan aksi hook. - `transform.module` harus berupa path relatif dan tetap berada di dalam `hooks.transformsDir` (path absolut dan traversal ditolak). -- `agentId` merutekan ke agen tertentu; ID yang tidak dikenal menggunakan fallback ke default. -- `allowedAgentIds`: membatasi perutean eksplisit (`*` atau dihilangkan = izinkan semua, `[]` = tolak semua). -- `defaultSessionKey`: kunci sesi tetap opsional untuk eksekusi agen hook tanpa `sessionKey` eksplisit. +- `agentId` merutekan ke agent tertentu; ID yang tidak dikenal menggunakan fallback ke default. +- `allowedAgentIds`: membatasi routing eksplisit (`*` atau dihilangkan = izinkan semua, `[]` = tolak semua). +- `defaultSessionKey`: key sesi tetap opsional untuk eksekusi agent hook tanpa `sessionKey` eksplisit. - `allowRequestSessionKey`: izinkan pemanggil `/hooks/agent` menetapkan `sessionKey` (default: `false`). -- `allowedSessionKeyPrefixes`: allowlist prefiks opsional untuk nilai `sessionKey` eksplisit (permintaan + mapping), mis. `["hook:"]`. -- `deliver: true` mengirim balasan akhir ke sebuah channel; `channel` default ke `last`. -- `model` mengoverride LLM untuk eksekusi hook ini (harus diizinkan jika katalog model disetel). +- `allowedSessionKeyPrefixes`: allowlist prefiks opsional untuk nilai `sessionKey` eksplisit (request + mapping), mis. `["hook:"]`. +- `deliver: true` mengirim balasan akhir ke channel; `channel` default ke `last`. +- `model` mengoverride LLM untuk eksekusi hook ini (harus diizinkan jika katalog model diatur). @@ -3270,7 +3270,7 @@ Catatan validasi dan keamanan: } ``` -- Gateway otomatis memulai `gog gmail watch serve` saat boot ketika dikonfigurasi. Setel `OPENCLAW_SKIP_GMAIL_WATCHER=1` untuk menonaktifkan. +- Gateway otomatis memulai `gog gmail watch serve` saat boot ketika dikonfigurasi. Atur `OPENCLAW_SKIP_GMAIL_WATCHER=1` untuk menonaktifkannya. - Jangan menjalankan `gog gmail watch serve` terpisah bersamaan dengan Gateway. --- @@ -3287,17 +3287,17 @@ Catatan validasi dan keamanan: } ``` -- Menyajikan HTML/CSS/JS yang dapat diedit agen dan A2UI melalui HTTP di bawah port Gateway: +- Menyajikan HTML/CSS/JS yang dapat diedit agent dan A2UI melalui HTTP di bawah port Gateway: - `http://:/__openclaw__/canvas/` - `http://:/__openclaw__/a2ui/` -- Hanya lokal: pertahankan `gateway.bind: "loopback"` (default). -- Bind non-loopback: rute canvas memerlukan auth Gateway (token/password/trusted-proxy), sama seperti permukaan HTTP Gateway lainnya. -- Node WebViews biasanya tidak mengirim header auth; setelah sebuah node dipasangkan dan terhubung, Gateway mengiklankan URL kapabilitas yang dicakup node untuk akses canvas/A2UI. -- URL kapabilitas terikat ke sesi WS node aktif dan cepat kedaluwarsa. Fallback berbasis IP tidak digunakan. -- Menyuntikkan klien live-reload ke HTML yang disajikan. -- Membuat `index.html` awal secara otomatis saat kosong. +- Khusus lokal: pertahankan `gateway.bind: "loopback"` (default). +- Bind non-loopback: route canvas memerlukan auth Gateway (token/password/trusted-proxy), sama seperti permukaan HTTP Gateway lainnya. +- WebView Node biasanya tidak mengirim header auth; setelah sebuah Node dipasangkan dan terhubung, Gateway mengiklankan URL kapabilitas bercakupan-Node untuk akses canvas/A2UI. +- URL kapabilitas terikat ke sesi WS Node aktif dan cepat kedaluwarsa. Fallback berbasis IP tidak digunakan. +- Menyisipkan klien live-reload ke HTML yang disajikan. +- Membuat otomatis `index.html` awal saat kosong. - Juga menyajikan A2UI di `/__openclaw__/a2ui/`. -- Perubahan memerlukan restart Gateway. +- Perubahan memerlukan restart gateway. - Nonaktifkan live reload untuk direktori besar atau error `EMFILE`. --- @@ -3316,7 +3316,7 @@ Catatan validasi dan keamanan: } ``` -- `minimal` (default): hilangkan `cliPath` + `sshPort` dari catatan TXT. +- `minimal` (default): hilangkan `cliPath` + `sshPort` dari record TXT. - `full`: sertakan `cliPath` + `sshPort`. - Hostname default ke `openclaw`. Override dengan `OPENCLAW_MDNS_HOSTNAME`. @@ -3330,7 +3330,7 @@ Catatan validasi dan keamanan: } ``` -Menulis zona DNS-SD unicast di bawah `~/.openclaw/dns/`. Untuk discovery lintas jaringan, pasangkan dengan server DNS (CoreDNS direkomendasikan) + split DNS Tailscale. +Menulis zona DNS-SD unicast di bawah `~/.openclaw/dns/`. Untuk discovery lintas jaringan, pasangkan dengan server DNS (CoreDNS direkomendasikan) + Tailscale split DNS. Penyiapan: `openclaw dns setup --apply`. @@ -3338,7 +3338,7 @@ Penyiapan: `openclaw dns setup --apply`. ## Environment -### `env` (env vars inline) +### `env` (env var inline) ```json5 { @@ -3355,14 +3355,14 @@ Penyiapan: `openclaw dns setup --apply`. } ``` -- Env var inline hanya diterapkan jika env proses tidak memiliki kunci tersebut. -- File `.env`: CWD `.env` + `~/.openclaw/.env` (keduanya tidak mengoverride variabel yang sudah ada). -- `shellEnv`: mengimpor kunci yang diharapkan tetapi belum ada dari profil login shell Anda. +- Env var inline hanya diterapkan jika env proses tidak memiliki key tersebut. +- File `.env`: `.env` CWD + `~/.openclaw/.env` (keduanya tidak mengoverride variabel yang sudah ada). +- `shellEnv`: mengimpor key yang diharapkan tetapi belum ada dari profil shell login Anda. - Lihat [Environment](/id/help/environment) untuk prioritas lengkap. ### Substitusi env var -Rujuk env var dalam string konfigurasi mana pun dengan `${VAR_NAME}`: +Rujuk env var di string konfigurasi apa pun dengan `${VAR_NAME}`: ```json5 { @@ -3372,20 +3372,20 @@ Rujuk env var dalam string konfigurasi mana pun dengan `${VAR_NAME}`: } ``` -- Hanya nama huruf besar yang cocok: `[A-Z_][A-Z0-9_]*`. -- Variabel yang tidak ada/kosong melempar error saat pemuatan konfigurasi. +- Hanya nama huruf besar yang dicocokkan: `[A-Z_][A-Z0-9_]*`. +- Variabel yang hilang/kosong memunculkan error saat pemuatan config. - Escape dengan `$${VAR}` untuk `${VAR}` literal. -- Berfungsi dengan `$include`. +- Bekerja dengan `$include`. --- ## Secrets -Ref secret bersifat aditif: nilai plaintext tetap berfungsi. +Referensi secret bersifat aditif: nilai plaintext tetap berfungsi. ### `SecretRef` -Gunakan satu bentuk objek: +Gunakan satu shape objek: ```json5 { source: "env" | "file" | "exec", provider: "default", id: "..." } @@ -3395,15 +3395,15 @@ Validasi: - Pola `provider`: `^[a-z][a-z0-9_-]{0,63}$` - Pola id `source: "env"`: `^[A-Z][A-Z0-9_]{0,127}$` -- id `source: "file"`: pointer JSON absolut (misalnya `"/providers/openai/apiKey"`) +- `source: "file"` id: pointer JSON absolut (mis. `"/providers/openai/apiKey"`) - Pola id `source: "exec"`: `^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$` -- id `source: "exec"` tidak boleh mengandung segmen path yang dipisahkan garis miring berupa `.` atau `..` (misalnya `a/../b` ditolak) +- Id `source: "exec"` tidak boleh mengandung segmen path `.` atau `..` yang dipisahkan slash (mis. `a/../b` ditolak) ### Permukaan kredensial yang didukung - Matriks kanonis: [Permukaan Kredensial SecretRef](/id/reference/secretref-credential-surface) - `secrets apply` menargetkan path kredensial `openclaw.json` yang didukung. -- Ref `auth-profiles.json` disertakan dalam resolusi runtime dan cakupan audit. +- Referensi `auth-profiles.json` disertakan dalam resolusi runtime dan cakupan audit. ### Konfigurasi provider secret @@ -3436,12 +3436,12 @@ Validasi: Catatan: - Provider `file` mendukung `mode: "json"` dan `mode: "singleValue"` (`id` harus `"value"` dalam mode singleValue). -- Provider `exec` memerlukan path `command` absolut dan menggunakan payload protokol pada stdin/stdout. -- Secara default, path command symlink ditolak. Setel `allowSymlinkCommand: true` untuk mengizinkan path symlink sambil memvalidasi path target yang sudah di-resolve. -- Jika `trustedDirs` dikonfigurasi, pemeriksaan direktori tepercaya berlaku pada path target yang sudah di-resolve. +- Provider `exec` memerlukan path `command` absolut dan menggunakan payload protokol di stdin/stdout. +- Secara default, path perintah symlink ditolak. Atur `allowSymlinkCommand: true` untuk mengizinkan path symlink sambil memvalidasi path target yang di-resolve. +- Jika `trustedDirs` dikonfigurasi, pemeriksaan direktori tepercaya berlaku ke path target yang di-resolve. - Environment child `exec` minimal secara default; teruskan variabel yang diperlukan secara eksplisit dengan `passEnv`. -- Ref secret di-resolve saat waktu aktivasi menjadi snapshot dalam memori, lalu jalur permintaan hanya membaca snapshot tersebut. -- Pemfilteran permukaan aktif berlaku saat aktivasi: ref yang tidak dapat di-resolve pada permukaan aktif menyebabkan startup/reload gagal, sedangkan permukaan tidak aktif dilewati dengan diagnostik. +- Referensi secret di-resolve pada waktu aktivasi ke snapshot dalam memori, lalu path permintaan hanya membaca snapshot tersebut. +- Pemfilteran permukaan aktif diterapkan selama aktivasi: referensi yang belum di-resolve pada permukaan yang aktif menyebabkan startup/reload gagal, sementara permukaan tidak aktif dilewati dengan diagnostik. --- @@ -3463,13 +3463,13 @@ Catatan: } ``` -- Profil per agen disimpan di `/auth-profiles.json`. -- `auth-profiles.json` mendukung ref tingkat nilai (`keyRef` untuk `api_key`, `tokenRef` untuk `token`) untuk mode kredensial statis. +- Profil per-agent disimpan di `/auth-profiles.json`. +- `auth-profiles.json` mendukung referensi tingkat nilai (`keyRef` untuk `api_key`, `tokenRef` untuk `token`) untuk mode kredensial statis. - Profil mode OAuth (`auth.profiles..mode = "oauth"`) tidak mendukung kredensial auth-profile berbasis SecretRef. -- Kredensial runtime statis berasal dari snapshot yang sudah di-resolve dalam memori; entri `auth.json` statis lama dibersihkan saat ditemukan. +- Kredensial runtime statis berasal dari snapshot dalam memori yang sudah di-resolve; entri `auth.json` statis lama dibersihkan saat ditemukan. - Impor OAuth lama dari `~/.openclaw/credentials/oauth.json`. - Lihat [OAuth](/id/concepts/oauth). -- Perilaku runtime Secrets serta alat `audit/configure/apply`: [Manajemen Secrets](/id/gateway/secrets). +- Perilaku runtime secret dan alat `audit/configure/apply`: [Manajemen Secrets](/id/gateway/secrets). ### `auth.cooldowns` @@ -3491,14 +3491,14 @@ Catatan: } ``` -- `billingBackoffHours`: backoff dasar dalam jam saat sebuah profil gagal karena error penagihan/kredit tidak cukup yang nyata (default: `5`). Teks penagihan eksplisit masih dapat masuk ke sini bahkan pada respons `401`/`403`, tetapi pencocok teks khusus provider tetap dibatasi pada provider yang memilikinya (misalnya OpenRouter `Key limit exceeded`). Pesan retryable `402` usage-window atau batas pengeluaran organisasi/workspace tetap berada di jalur `rate_limit`. -- `billingBackoffHoursByProvider`: override opsional per provider untuk jam backoff penagihan. -- `billingMaxHours`: batas maksimum dalam jam untuk pertumbuhan eksponensial backoff penagihan (default: `24`). +- `billingBackoffHours`: backoff dasar dalam jam saat suatu profil gagal karena error penagihan/kredit tidak cukup yang nyata (default: `5`). Teks penagihan eksplisit masih dapat masuk ke sini bahkan pada respons `401`/`403`, tetapi pencocok teks khusus provider tetap dibatasi pada provider yang memilikinya (misalnya OpenRouter `Key limit exceeded`). Pesan jendela penggunaan HTTP `402` yang dapat dicoba lagi atau batas pengeluaran organisasi/workspace tetap masuk ke jalur `rate_limit`. +- `billingBackoffHoursByProvider`: override per-provider opsional untuk jam backoff penagihan. +- `billingMaxHours`: batas dalam jam untuk pertumbuhan eksponensial backoff penagihan (default: `24`). - `authPermanentBackoffMinutes`: backoff dasar dalam menit untuk kegagalan `auth_permanent` dengan keyakinan tinggi (default: `10`). -- `authPermanentMaxMinutes`: batas maksimum dalam menit untuk pertumbuhan backoff `auth_permanent` (default: `60`). -- `failureWindowHours`: jendela berjalan dalam jam yang digunakan untuk penghitung backoff (default: `24`). -- `overloadedProfileRotations`: jumlah maksimum rotasi auth-profile provider yang sama untuk error overloaded sebelum beralih ke fallback model (default: `1`). Bentuk provider-busy seperti `ModelNotReadyException` masuk ke sini. -- `overloadedBackoffMs`: jeda tetap sebelum mencoba lagi rotasi provider/profil yang overloaded (default: `0`). +- `authPermanentMaxMinutes`: batas dalam menit untuk pertumbuhan backoff `auth_permanent` (default: `60`). +- `failureWindowHours`: jendela bergulir dalam jam yang digunakan untuk penghitung backoff (default: `24`). +- `overloadedProfileRotations`: jumlah maksimum rotasi auth-profile provider yang sama untuk error overload sebelum beralih ke fallback model (default: `1`). Bentuk provider-busy seperti `ModelNotReadyException` masuk ke sini. +- `overloadedBackoffMs`: penundaan tetap sebelum mencoba lagi rotasi provider/profil yang overload (default: `0`). - `rateLimitedProfileRotations`: jumlah maksimum rotasi auth-profile provider yang sama untuk error rate-limit sebelum beralih ke fallback model (default: `1`). Bucket rate-limit itu mencakup teks berbentuk provider seperti `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, `workers_ai ... quota limit exceeded`, dan `resource exhausted`. --- @@ -3519,13 +3519,13 @@ Catatan: ``` - File log default: `/tmp/openclaw/openclaw-YYYY-MM-DD.log`. -- Setel `logging.file` untuk path yang stabil. +- Atur `logging.file` untuk path yang stabil. - `consoleLevel` naik ke `debug` saat `--verbose`. -- `maxFileBytes`: ukuran maksimum file log dalam byte sebelum penulisan ditekan (bilangan bulat positif; default: `524288000` = 500 MB). Gunakan rotasi log eksternal untuk deployment produksi. +- `maxFileBytes`: ukuran file log maksimum dalam byte sebelum penulisan ditekan (integer positif; default: `524288000` = 500 MB). Gunakan rotasi log eksternal untuk deployment produksi. --- -## Diagnostics +## Diagnostik ```json5 { @@ -3559,16 +3559,16 @@ Catatan: ``` - `enabled`: sakelar utama untuk output instrumentasi (default: `true`). -- `flags`: array string flag yang mengaktifkan output log terarah (mendukung wildcard seperti `"telegram.*"` atau `"*"`). -- `stuckSessionWarnMs`: ambang usia dalam md untuk mengeluarkan peringatan sesi macet saat sesi tetap berada dalam status pemrosesan. +- `flags`: array string flag yang mengaktifkan output log bertarget (mendukung wildcard seperti `"telegram.*"` atau `"*"`). +- `stuckSessionWarnMs`: ambang usia dalam md untuk mengeluarkan peringatan sesi macet saat sesi tetap dalam status pemrosesan. - `otel.enabled`: mengaktifkan pipeline ekspor OpenTelemetry (default: `false`). -- `otel.endpoint`: URL kolektor untuk ekspor OTel. +- `otel.endpoint`: URL collector untuk ekspor OTel. - `otel.protocol`: `"http/protobuf"` (default) atau `"grpc"`. - `otel.headers`: header metadata HTTP/gRPC tambahan yang dikirim bersama permintaan ekspor OTel. - `otel.serviceName`: nama layanan untuk atribut resource. - `otel.traces` / `otel.metrics` / `otel.logs`: aktifkan ekspor trace, metrics, atau log. - `otel.sampleRate`: laju sampling trace `0`–`1`. -- `otel.flushIntervalMs`: interval flush telemetri berkala dalam md. +- `otel.flushIntervalMs`: interval flush telemetri periodik dalam md. - `cacheTrace.enabled`: catat snapshot jejak cache untuk eksekusi embedded (default: `false`). - `cacheTrace.filePath`: path output untuk JSONL jejak cache (default: `$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl`). - `cacheTrace.includeMessages` / `includePrompt` / `includeSystem`: mengontrol apa yang disertakan dalam output jejak cache (semuanya default: `true`). @@ -3594,11 +3594,11 @@ Catatan: ``` - `channel`: channel rilis untuk instalasi npm/git — `"stable"`, `"beta"`, atau `"dev"`. -- `checkOnStart`: periksa pembaruan npm saat Gateway dimulai (default: `true`). -- `auto.enabled`: aktifkan auto-update latar belakang untuk instalasi paket (default: `false`). +- `checkOnStart`: periksa pembaruan npm saat gateway dimulai (default: `true`). +- `auto.enabled`: aktifkan auto-update latar belakang untuk instalasi package (default: `false`). - `auto.stableDelayHours`: penundaan minimum dalam jam sebelum auto-apply channel stable (default: `6`; maks: `168`). - `auto.stableJitterHours`: jendela penyebaran rollout channel stable tambahan dalam jam (default: `12`; maks: `168`). -- `auto.betaCheckIntervalHours`: seberapa sering pemeriksaan channel beta dijalankan dalam jam (default: `1`; maks: `24`). +- `auto.betaCheckIntervalHours`: seberapa sering pemeriksaan channel beta berjalan dalam jam (default: `1`; maks: `24`). --- @@ -3631,22 +3631,22 @@ Catatan: } ``` -- `enabled`: gerbang fitur ACP global (default: `false`). -- `dispatch.enabled`: gerbang independen untuk dispatch giliran sesi ACP (default: `true`). Setel `false` agar perintah ACP tetap tersedia sambil memblokir eksekusi. -- `backend`: ID backend runtime ACP default (harus cocok dengan Plugin runtime ACP terdaftar). -- `defaultAgent`: ID agen target ACP fallback saat spawn tidak menentukan target eksplisit. -- `allowedAgents`: allowlist ID agen yang diizinkan untuk sesi runtime ACP; kosong berarti tidak ada pembatasan tambahan. +- `enabled`: feature gate ACP global (default: `false`). +- `dispatch.enabled`: gate independen untuk dispatch giliran sesi ACP (default: `true`). Atur `false` agar perintah ACP tetap tersedia sambil memblokir eksekusi. +- `backend`: id backend runtime ACP default (harus cocok dengan Plugin runtime ACP terdaftar). +- `defaultAgent`: id agent target ACP fallback saat spawn tidak menentukan target eksplisit. +- `allowedAgents`: allowlist id agent yang diizinkan untuk sesi runtime ACP; kosong berarti tanpa pembatasan tambahan. - `maxConcurrentSessions`: jumlah maksimum sesi ACP aktif secara bersamaan. - `stream.coalesceIdleMs`: jendela flush idle dalam md untuk teks yang di-stream. -- `stream.maxChunkChars`: ukuran chunk maksimum sebelum proyeksi blok yang di-stream dipecah. -- `stream.repeatSuppression`: tekan baris status/tool berulang per giliran (default: `true`). -- `stream.deliveryMode`: `"live"` melakukan streaming secara bertahap; `"final_only"` menahan hingga peristiwa terminal giliran. -- `stream.hiddenBoundarySeparator`: pemisah sebelum teks terlihat setelah peristiwa tool tersembunyi (default: `"paragraph"`). -- `stream.maxOutputChars`: jumlah karakter output asisten maksimum yang diproyeksikan per giliran ACP. -- `stream.maxSessionUpdateChars`: jumlah karakter maksimum untuk baris status/pembaruan ACP yang diproyeksikan. +- `stream.maxChunkChars`: ukuran chunk maksimum sebelum membagi proyeksi blok yang di-stream. +- `stream.repeatSuppression`: tekan pengulangan baris status/alat per giliran (default: `true`). +- `stream.deliveryMode`: `"live"` melakukan streaming bertahap; `"final_only"` melakukan buffer sampai peristiwa terminal giliran. +- `stream.hiddenBoundarySeparator`: pemisah sebelum teks terlihat setelah peristiwa alat tersembunyi (default: `"paragraph"`). +- `stream.maxOutputChars`: jumlah maksimum karakter output assistant yang diproyeksikan per giliran ACP. +- `stream.maxSessionUpdateChars`: jumlah maksimum karakter untuk baris status/pembaruan ACP yang diproyeksikan. - `stream.tagVisibility`: catatan nama tag ke override visibilitas boolean untuk peristiwa yang di-stream. -- `runtime.ttlMinutes`: TTL idle dalam menit untuk worker sesi ACP sebelum memenuhi syarat untuk pembersihan. -- `runtime.installCommand`: perintah instalasi opsional yang dijalankan saat mem-bootstrap environment runtime ACP. +- `runtime.ttlMinutes`: TTL idle dalam menit untuk worker sesi ACP sebelum memenuhi syarat untuk dibersihkan. +- `runtime.installCommand`: perintah instalasi opsional yang dijalankan saat melakukan bootstrap lingkungan runtime ACP. --- @@ -3666,7 +3666,7 @@ Catatan: - `"random"` (default): tagline lucu/musiman yang bergilir. - `"default"`: tagline netral tetap (`All your chats, one OpenClaw.`). - `"off"`: tanpa teks tagline (judul/versi banner tetap ditampilkan). -- Untuk menyembunyikan seluruh banner (bukan hanya tagline), setel env `OPENCLAW_HIDE_BANNER=1`. +- Untuk menyembunyikan seluruh banner (bukan hanya tagline), atur env `OPENCLAW_HIDE_BANNER=1`. --- @@ -3690,13 +3690,13 @@ Metadata yang ditulis oleh alur penyiapan terpandu CLI (`onboard`, `configure`, ## Identity -Lihat bidang identitas `agents.list` di bawah [Default agen](#agent-defaults). +Lihat field identity `agents.list` di bawah [Default agent](#agent-defaults). --- ## Bridge (lama, dihapus) -Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui WebSocket Gateway. Kunci `bridge.*` tidak lagi menjadi bagian dari schema konfigurasi (validasi gagal sampai dihapus; `openclaw doctor --fix` dapat menghapus kunci yang tidak dikenal). +Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui WebSocket Gateway. Key `bridge.*` tidak lagi menjadi bagian dari skema konfigurasi (validasi gagal sampai dihapus; `openclaw doctor --fix` dapat menghapus key yang tidak dikenal). @@ -3725,8 +3725,8 @@ Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui WebSock cron: { enabled: true, maxConcurrentRuns: 2, - webhook: "https://example.invalid/legacy", // fallback deprecated untuk job tersimpan notify:true - webhookToken: "replace-with-dedicated-token", // bearer token opsional untuk auth webhook outbound + webhook: "https://example.invalid/legacy", // fallback deprecated untuk pekerjaan notify:true yang tersimpan + webhookToken: "replace-with-dedicated-token", // token bearer opsional untuk auth webhook keluar sessionRetention: "24h", // string durasi atau false runLog: { maxBytes: "2mb", // default 2_000_000 byte @@ -3736,11 +3736,11 @@ Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui WebSock } ``` -- `sessionRetention`: berapa lama menyimpan sesi eksekusi cron terisolasi yang sudah selesai sebelum dipangkas dari `sessions.json`. Juga mengontrol pembersihan transkrip cron yang dihapus dan diarsipkan. Default: `24h`; setel `false` untuk menonaktifkan. +- `sessionRetention`: berapa lama menyimpan sesi eksekusi Cron terisolasi yang sudah selesai sebelum dipangkas dari `sessions.json`. Juga mengontrol pembersihan transkrip Cron yang dihapus dan diarsipkan. Default: `24h`; atur `false` untuk menonaktifkan. - `runLog.maxBytes`: ukuran maksimum per file log eksekusi (`cron/runs/.jsonl`) sebelum dipangkas. Default: `2_000_000` byte. - `runLog.keepLines`: baris terbaru yang dipertahankan saat pemangkasan run-log dipicu. Default: `2000`. -- `webhookToken`: bearer token yang digunakan untuk pengiriman POST webhook Cron (`delivery.mode = "webhook"`), jika dihilangkan tidak ada header auth yang dikirim. -- `webhook`: URL webhook fallback lama yang sudah deprecated (http/https) dan hanya digunakan untuk job tersimpan yang masih memiliki `notify: true`. +- `webhookToken`: token bearer yang digunakan untuk pengiriman POST webhook Cron (`delivery.mode = "webhook"`), jika dihilangkan tidak ada header auth yang dikirim. +- `webhook`: URL webhook fallback lama yang deprecated (http/https) yang digunakan hanya untuk pekerjaan tersimpan yang masih memiliki `notify: true`. ### `cron.retry` @@ -3756,11 +3756,11 @@ Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui WebSock } ``` -- `maxAttempts`: jumlah retry maksimum untuk job one-shot pada error transien (default: `3`; rentang: `0`–`10`). +- `maxAttempts`: retry maksimum untuk pekerjaan one-shot pada error sementara (default: `3`; rentang: `0`–`10`). - `backoffMs`: array penundaan backoff dalam md untuk setiap percobaan retry (default: `[30000, 60000, 300000]`; 1–10 entri). -- `retryOn`: jenis error yang memicu retry — `"rate_limit"`, `"overloaded"`, `"network"`, `"timeout"`, `"server_error"`. Hilangkan untuk me-retry semua jenis transien. +- `retryOn`: tipe error yang memicu retry — `"rate_limit"`, `"overloaded"`, `"network"`, `"timeout"`, `"server_error"`. Hilangkan untuk melakukan retry pada semua tipe sementara. -Berlaku hanya untuk job cron one-shot. Job berulang menggunakan penanganan kegagalan terpisah. +Hanya berlaku untuk pekerjaan Cron one-shot. Pekerjaan berulang menggunakan penanganan kegagalan terpisah. ### `cron.failureAlert` @@ -3778,11 +3778,11 @@ Berlaku hanya untuk job cron one-shot. Job berulang menggunakan penanganan kegag } ``` -- `enabled`: aktifkan peringatan kegagalan untuk job Cron (default: `false`). -- `after`: jumlah kegagalan beruntun sebelum peringatan dipicu (bilangan bulat positif, min: `1`). -- `cooldownMs`: milidetik minimum antar peringatan berulang untuk job yang sama (bilangan bulat non-negatif). -- `mode`: mode pengiriman — `"announce"` mengirim melalui pesan channel; `"webhook"` melakukan POST ke webhook yang dikonfigurasi. -- `accountId`: ID akun atau channel opsional untuk mencakup pengiriman peringatan. +- `enabled`: aktifkan peringatan kegagalan untuk pekerjaan Cron (default: `false`). +- `after`: jumlah kegagalan berturut-turut sebelum peringatan dikirim (integer positif, min: `1`). +- `cooldownMs`: milidetik minimum antara peringatan berulang untuk pekerjaan yang sama (integer non-negatif). +- `mode`: mode pengiriman — `"announce"` mengirim melalui pesan channel; `"webhook"` mem-post ke webhook yang dikonfigurasi. +- `accountId`: id akun atau channel opsional untuk mencakup pengiriman peringatan. ### `cron.failureDestination` @@ -3799,51 +3799,51 @@ Berlaku hanya untuk job cron one-shot. Job berulang menggunakan penanganan kegag } ``` -- Tujuan default untuk notifikasi kegagalan Cron di semua job. +- Tujuan default untuk notifikasi kegagalan Cron di semua pekerjaan. - `mode`: `"announce"` atau `"webhook"`; default ke `"announce"` saat data target yang cukup tersedia. - `channel`: override channel untuk pengiriman announce. `"last"` menggunakan ulang channel pengiriman terakhir yang diketahui. - `to`: target announce eksplisit atau URL webhook. Wajib untuk mode webhook. - `accountId`: override akun opsional untuk pengiriman. -- `delivery.failureDestination` per job mengoverride default global ini. -- Saat tujuan kegagalan global maupun per job tidak disetel, job yang sudah mengirim melalui `announce` menggunakan fallback ke target announce utama tersebut saat gagal. -- `delivery.failureDestination` hanya didukung untuk job `sessionTarget="isolated"` kecuali `delivery.mode` utama job adalah `"webhook"`. +- `delivery.failureDestination` per-pekerjaan mengoverride default global ini. +- Saat tujuan kegagalan global maupun per-pekerjaan tidak diatur, pekerjaan yang sudah mengirim melalui `announce` akan fallback ke target announce utama tersebut saat gagal. +- `delivery.failureDestination` hanya didukung untuk pekerjaan `sessionTarget="isolated"` kecuali `delivery.mode` utama pekerjaan tersebut adalah `"webhook"`. -Lihat [Cron Jobs](/id/automation/cron-jobs). Eksekusi cron terisolasi dilacak sebagai [tugas latar belakang](/id/automation/tasks). +Lihat [Cron Jobs](/id/automation/cron-jobs). Eksekusi Cron terisolasi dilacak sebagai [background tasks](/id/automation/tasks). --- -## Variabel template model media +## Variabel templat model media -Placeholder template yang diperluas di `tools.media.models[].args`: +Placeholder templat yang diperluas di `tools.media.models[].args`: -| Variabel | Deskripsi | -| ------------------ | -------------------------------------------------- | -| `{{Body}}` | Isi pesan masuk lengkap | -| `{{RawBody}}` | Isi mentah (tanpa pembungkus riwayat/pengirim) | -| `{{BodyStripped}}` | Isi dengan mention grup dihapus | -| `{{From}}` | Identifier pengirim | -| `{{To}}` | Identifier tujuan | -| `{{MessageSid}}` | ID pesan channel | -| `{{SessionId}}` | UUID Session saat ini | -| `{{IsNewSession}}` | `"true"` saat Session baru dibuat | -| `{{MediaUrl}}` | pseudo-URL media masuk | -| `{{MediaPath}}` | path media lokal | -| `{{MediaType}}` | Jenis media (image/audio/document/…) | -| `{{Transcript}}` | transkrip audio | -| `{{Prompt}}` | prompt media yang di-resolve untuk entri CLI | +| Variable | Deskripsi | +| ------------------ | ----------------------------------------------- | +| `{{Body}}` | Isi pesan masuk penuh | +| `{{RawBody}}` | Isi mentah (tanpa wrapper riwayat/pengirim) | +| `{{BodyStripped}}` | Isi dengan mention grup dihapus | +| `{{From}}` | Identifier pengirim | +| `{{To}}` | Identifier tujuan | +| `{{MessageSid}}` | id pesan channel | +| `{{SessionId}}` | UUID sesi saat ini | +| `{{IsNewSession}}` | `"true"` saat sesi baru dibuat | +| `{{MediaUrl}}` | pseudo-URL media masuk | +| `{{MediaPath}}` | path media lokal | +| `{{MediaType}}` | tipe media (image/audio/document/…) | +| `{{Transcript}}` | transkrip audio | +| `{{Prompt}}` | prompt media yang di-resolve untuk entri CLI | | `{{MaxChars}}` | jumlah karakter output maksimum yang di-resolve untuk entri CLI | -| `{{ChatType}}` | `"direct"` atau `"group"` | -| `{{GroupSubject}}` | subjek grup (best effort) | -| `{{GroupMembers}}` | pratinjau anggota grup (best effort) | -| `{{SenderName}}` | nama tampilan pengirim (best effort) | -| `{{SenderE164}}` | nomor telepon pengirim (best effort) | +| `{{ChatType}}` | `"direct"` atau `"group"` | +| `{{GroupSubject}}` | subjek grup (upaya terbaik) | +| `{{GroupMembers}}` | pratinjau anggota grup (upaya terbaik) | +| `{{SenderName}}` | nama tampilan pengirim (upaya terbaik) | +| `{{SenderE164}}` | nomor telepon pengirim (upaya terbaik) | | `{{Provider}}` | petunjuk provider (whatsapp, telegram, discord, dll.) | --- ## Include konfigurasi (`$include`) -Pisahkan konfigurasi ke beberapa file: +Pisahkan config ke beberapa file: ```json5 // ~/.openclaw/openclaw.json @@ -3856,13 +3856,13 @@ Pisahkan konfigurasi ke beberapa file: } ``` -**Perilaku merge:** +**Perilaku penggabungan:** -- Satu file: menggantikan objek yang memuatnya. -- Array file: di-deep-merge secara berurutan (yang belakangan mengoverride yang sebelumnya). -- Kunci saudara: digabungkan setelah include (mengoverride nilai yang di-include). +- File tunggal: menggantikan objek yang memuatnya. +- Array file: di-deep-merge secara berurutan (yang lebih akhir mengoverride yang lebih awal). +- Key saudara: digabungkan setelah include (mengoverride nilai yang disertakan). - Include bertingkat: hingga 10 level kedalaman. -- Path: di-resolve relatif terhadap file yang meng-include, tetapi harus tetap berada di dalam direktori konfigurasi tingkat atas (`dirname` dari `openclaw.json`). Bentuk absolut/`../` hanya diizinkan bila tetap me-resolve di dalam batas tersebut. +- Path: di-resolve relatif terhadap file yang menyertakan, tetapi harus tetap berada di dalam direktori config tingkat atas (`dirname` dari `openclaw.json`). Bentuk absolut/`../` hanya diizinkan bila tetap di-resolve di dalam batas tersebut. - Error: pesan yang jelas untuk file yang hilang, error parse, dan include melingkar. --- diff --git a/docs/id/gateway/doctor.md b/docs/id/gateway/doctor.md index 4415e3dd4..db43c5665 100644 --- a/docs/id/gateway/doctor.md +++ b/docs/id/gateway/doctor.md @@ -1,14 +1,14 @@ --- read_when: - Menambahkan atau mengubah migrasi doctor - - Memperkenalkan perubahan konfigurasi yang breaking -summary: 'Perintah Doctor: pemeriksaan kesehatan, migrasi konfigurasi, dan langkah perbaikan' + - Memperkenalkan perubahan konfigurasi yang merusak +summary: 'Perintah doctor: pemeriksaan kesehatan, migrasi konfigurasi, dan langkah perbaikan' title: Doctor x-i18n: - generated_at: "2026-04-09T01:28:58Z" + generated_at: "2026-04-20T09:27:33Z" model: gpt-5.4 provider: openai - source_hash: 75d321bd1ad0e16c29f2382e249c51edfc3a8d33b55bdceea39e7dbcd4901fce + source_hash: 61a5e01a306058c49be6095f7c8082d779a55d63cf3b5f4c4096173943faf51b source_path: gateway/doctor.md workflow: 15 --- @@ -16,8 +16,7 @@ x-i18n: # Doctor `openclaw doctor` adalah alat perbaikan + migrasi untuk OpenClaw. Alat ini memperbaiki -konfigurasi/status yang usang, memeriksa kesehatan, dan menyediakan langkah -perbaikan yang dapat ditindaklanjuti. +konfigurasi/status yang usang, memeriksa kesehatan, dan menyediakan langkah perbaikan yang dapat ditindaklanjuti. ## Mulai cepat @@ -31,13 +30,13 @@ openclaw doctor openclaw doctor --yes ``` -Terima default tanpa prompt (termasuk langkah perbaikan restart/layanan/sandbox bila berlaku). +Terima nilai default tanpa prompt (termasuk langkah perbaikan restart/layanan/sandbox jika berlaku). ```bash openclaw doctor --repair ``` -Terapkan perbaikan yang direkomendasikan tanpa prompt (perbaikan + restart bila aman). +Terapkan perbaikan yang direkomendasikan tanpa prompt (perbaikan + restart jika aman). ```bash openclaw doctor --repair --force @@ -49,7 +48,7 @@ Terapkan juga perbaikan agresif (menimpa konfigurasi supervisor kustom). openclaw doctor --non-interactive ``` -Jalankan tanpa prompt dan hanya terapkan migrasi yang aman (normalisasi konfigurasi + pemindahan status di disk). Melewati tindakan restart/layanan/sandbox yang memerlukan konfirmasi manusia. +Jalankan tanpa prompt dan hanya terapkan migrasi aman (normalisasi konfigurasi + pemindahan status di disk). Melewati tindakan restart/layanan/sandbox yang memerlukan konfirmasi manusia. Migrasi status lama berjalan otomatis saat terdeteksi. ```bash @@ -64,89 +63,88 @@ Jika Anda ingin meninjau perubahan sebelum menulis, buka file konfigurasi terleb cat ~/.openclaw/openclaw.json ``` -## Apa yang dilakukan (ringkasan) +## Apa yang dilakukannya (ringkasan) -- Pembaruan pre-flight opsional untuk instalasi git (hanya interaktif). -- Pemeriksaan kesegaran protokol UI (membangun ulang Control UI bila skema protokol lebih baru). +- Pembaruan pra-penerbangan opsional untuk instalasi git (hanya interaktif). +- Pemeriksaan kebaruan protokol UI (membangun ulang Control UI saat skema protokol lebih baru). - Pemeriksaan kesehatan + prompt restart. -- Ringkasan status Skills (eligible/missing/blocked) dan status plugin. +- Ringkasan status Skills (memenuhi syarat/tidak ada/terblokir) dan status plugin. - Normalisasi konfigurasi untuk nilai lama. -- Migrasi konfigurasi Talk dari field datar lama `talk.*` ke `talk.provider` + `talk.providers.`. +- Migrasi konfigurasi Talk dari field datar `talk.*` lama ke `talk.provider` + `talk.providers.`. - Pemeriksaan migrasi browser untuk konfigurasi ekstensi Chrome lama dan kesiapan Chrome MCP. - Peringatan override provider OpenCode (`models.providers.opencode` / `models.providers.opencode-go`). -- Peringatan shadowing Codex OAuth (`models.providers.openai-codex`). -- Pemeriksaan prasyarat OAuth TLS untuk profil OpenAI Codex OAuth. -- Migrasi status lama di disk (sesi/dir agen/auth WhatsApp). +- Peringatan shadowing OAuth Codex (`models.providers.openai-codex`). +- Pemeriksaan prasyarat TLS OAuth untuk profil OAuth OpenAI Codex. +- Migrasi status lama di disk (sesi/direktori agent/autentikasi WhatsApp). - Migrasi kunci kontrak manifest plugin lama (`speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`, `webSearchProviders` → `contracts`). -- Migrasi penyimpanan cron lama (`jobId`, `schedule.cron`, field delivery/payload tingkat atas, payload `provider`, pekerjaan fallback webhook `notify: true` sederhana). -- Inspeksi file lock sesi dan pembersihan lock usang. -- Pemeriksaan integritas dan izin status (sessions, transcripts, state dir). -- Pemeriksaan izin file konfigurasi (chmod 600) saat berjalan secara lokal. -- Kesehatan auth model: memeriksa kedaluwarsa OAuth, dapat me-refresh token yang akan kedaluwarsa, dan melaporkan status cooldown/nonaktif profil auth. -- Deteksi dir workspace tambahan (`~/openclaw`). +- Migrasi penyimpanan Cron lama (`jobId`, `schedule.cron`, field delivery/payload tingkat atas, payload `provider`, pekerjaan fallback Webhook sederhana `notify: true`). +- Inspeksi file kunci sesi dan pembersihan kunci usang. +- Pemeriksaan integritas dan izin status (sesi, transkrip, direktori status). +- Pemeriksaan izin file konfigurasi (`chmod 600`) saat berjalan secara lokal. +- Kesehatan autentikasi model: memeriksa kedaluwarsa OAuth, dapat menyegarkan token yang akan kedaluwarsa, dan melaporkan status cooldown/nonaktif profil autentikasi. +- Deteksi direktori workspace tambahan (`~/openclaw`). - Perbaikan image sandbox saat sandboxing diaktifkan. - Migrasi layanan lama dan deteksi gateway tambahan. -- Migrasi status lama kanal Matrix (dalam mode `--fix` / `--repair`). -- Pemeriksaan runtime gateway (layanan terpasang tetapi tidak berjalan; label launchd yang di-cache). -- Peringatan status kanal (diprobe dari gateway yang berjalan). +- Migrasi status lama channel Matrix (dalam mode `--fix` / `--repair`). +- Pemeriksaan runtime Gateway (layanan terpasang tetapi tidak berjalan; label launchd yang di-cache). +- Peringatan status channel (diprobe dari gateway yang sedang berjalan). - Audit konfigurasi supervisor (launchd/systemd/schtasks) dengan perbaikan opsional. -- Pemeriksaan best practice runtime gateway (Node vs Bun, path version manager). -- Diagnostik benturan port gateway (default `18789`). +- Pemeriksaan praktik terbaik runtime Gateway (Node vs Bun, path version manager). +- Diagnostik benturan port Gateway (default `18789`). - Peringatan keamanan untuk kebijakan DM terbuka. -- Pemeriksaan auth gateway untuk mode token lokal (menawarkan pembuatan token saat tidak ada sumber token; tidak menimpa konfigurasi token SecretRef). +- Pemeriksaan autentikasi Gateway untuk mode token lokal (menawarkan pembuatan token saat tidak ada sumber token; tidak menimpa konfigurasi token SecretRef). +- Deteksi masalah pairing perangkat (permintaan pair pertama kali yang tertunda, peningkatan role/scope yang tertunda, drift cache token perangkat lokal yang usang, dan drift autentikasi paired-record). - Pemeriksaan linger systemd di Linux. -- Pemeriksaan ukuran file bootstrap workspace (peringatan pemotongan/hampir batas untuk file konteks). -- Pemeriksaan status shell completion dan auto-install/upgrade. -- Pemeriksaan kesiapan provider embedding memory search (model lokal, kunci API jarak jauh, atau biner QMD). -- Pemeriksaan instalasi sumber (ketidakcocokan workspace pnpm, aset UI hilang, biner tsx hilang). -- Menulis konfigurasi yang diperbarui + metadata wizard. +- Pemeriksaan ukuran file bootstrap workspace (peringatan pemotongan/mendekati batas untuk file konteks). +- Pemeriksaan status shell completion serta instalasi/peningkatan otomatis. +- Pemeriksaan kesiapan provider embedding pencarian memori (model lokal, kunci API jarak jauh, atau biner QMD). +- Pemeriksaan instalasi source (ketidakcocokan workspace pnpm, aset UI yang hilang, biner tsx yang hilang). +- Menulis konfigurasi + metadata wizard yang diperbarui. ## Backfill dan reset UI Dreams Scene Dreams di Control UI mencakup tindakan **Backfill**, **Reset**, dan **Clear Grounded** untuk alur grounded dreaming. Tindakan ini menggunakan metode RPC -bergaya gateway doctor, tetapi **bukan** bagian dari perbaikan/migrasi CLI -`openclaw doctor`. +bergaya doctor gateway, tetapi tindakan ini **bukan** bagian dari perbaikan/migrasi CLI `openclaw doctor`. Yang dilakukan: -- **Backfill** memindai file `memory/YYYY-MM-DD.md` historis di - workspace aktif, menjalankan pass diary REM grounded, dan menulis entri - backfill yang dapat dibalik ke `DREAMS.md`. -- **Reset** hanya menghapus entri diary backfill bertanda tersebut dari `DREAMS.md`. -- **Clear Grounded** hanya menghapus entri jangka pendek staged khusus grounded yang - berasal dari replay historis dan belum mengakumulasi recall live atau dukungan - harian. +- **Backfill** memindai file `memory/YYYY-MM-DD.md` historis di workspace + aktif, menjalankan proses diary REM grounded, dan menulis entri backfill yang dapat dibalik ke `DREAMS.md`. +- **Reset** hanya menghapus entri diary backfill yang ditandai tersebut dari `DREAMS.md`. +- **Clear Grounded** hanya menghapus entri jangka pendek khusus grounded yang ditahap + yang berasal dari replay historis dan belum mengumpulkan recall langsung atau + dukungan harian. -Yang **tidak** dilakukan dengan sendirinya: +Yang **tidak** dilakukan sendiri oleh tindakan ini: -- tindakan tersebut tidak mengedit `MEMORY.md` -- tindakan tersebut tidak menjalankan migrasi doctor penuh -- tindakan tersebut tidak otomatis men-stage kandidat grounded ke dalam penyimpanan - promosi jangka pendek live kecuali Anda secara eksplisit menjalankan path CLI staged terlebih dahulu +- tindakan ini tidak mengedit `MEMORY.md` +- tindakan ini tidak menjalankan migrasi doctor penuh +- tindakan ini tidak otomatis menahapkan kandidat grounded ke penyimpanan promosi jangka pendek langsung + kecuali Anda secara eksplisit menjalankan jalur CLI yang ditahap terlebih dahulu -Jika Anda ingin replay historis grounded memengaruhi lane deep promotion -normal, gunakan alur CLI berikut: +Jika Anda ingin replay historis grounded memengaruhi jalur promosi mendalam normal, +gunakan alur CLI sebagai gantinya: ```bash openclaw memory rem-backfill --path ./memory --stage-short-term ``` -Perintah itu men-stage kandidat durable grounded ke penyimpanan dreaming jangka pendek sambil -tetap menjadikan `DREAMS.md` sebagai permukaan peninjauan. +Itu menahapkan kandidat durable grounded ke penyimpanan dreaming jangka pendek sambil +menjaga `DREAMS.md` sebagai permukaan tinjauan. ## Perilaku dan alasan terperinci ### 0) Pembaruan opsional (instalasi git) -Jika ini adalah checkout git dan doctor berjalan secara interaktif, doctor menawarkan untuk +Jika ini adalah checkout git dan doctor berjalan secara interaktif, doctor akan menawarkan untuk memperbarui (fetch/rebase/build) sebelum menjalankan doctor. ### 1) Normalisasi konfigurasi Jika konfigurasi berisi bentuk nilai lama (misalnya `messages.ackReaction` -tanpa override spesifik kanal), doctor menormalisasikannya ke dalam skema -saat ini. +tanpa override khusus channel), doctor menormalkannya ke +skema saat ini. Itu termasuk field datar Talk lama. Konfigurasi Talk publik saat ini adalah `talk.provider` + `talk.providers.`. Doctor menulis ulang bentuk lama @@ -155,18 +153,18 @@ Itu termasuk field datar Talk lama. Konfigurasi Talk publik saat ini adalah ### 2) Migrasi kunci konfigurasi lama -Saat konfigurasi berisi kunci yang sudah deprecated, perintah lain menolak berjalan dan meminta +Saat konfigurasi berisi kunci yang sudah usang, perintah lain akan menolak berjalan dan meminta Anda menjalankan `openclaw doctor`. Doctor akan: - Menjelaskan kunci lama mana yang ditemukan. -- Menampilkan migrasi yang diterapkannya. +- Menampilkan migrasi yang diterapkan. - Menulis ulang `~/.openclaw/openclaw.json` dengan skema yang diperbarui. Gateway juga otomatis menjalankan migrasi doctor saat startup ketika mendeteksi format konfigurasi lama, sehingga konfigurasi usang diperbaiki tanpa intervensi manual. -Migrasi penyimpanan pekerjaan cron ditangani oleh `openclaw doctor --fix`. +Migrasi penyimpanan pekerjaan Cron ditangani oleh `openclaw doctor --fix`. Migrasi saat ini: @@ -190,7 +188,7 @@ Migrasi saat ini: - `plugins.entries.voice-call.config.streaming.openaiApiKey|sttModel|silenceDurationMs|vadThreshold` → `plugins.entries.voice-call.config.streaming.providers.openai.*` - `bindings[].match.accountID` → `bindings[].match.accountId` -- Untuk kanal dengan `accounts` bernama tetapi masih memiliki nilai kanal tingkat atas akun tunggal, pindahkan nilai yang dicakup akun tersebut ke akun yang dipromosikan dan dipilih untuk kanal itu (`accounts.default` untuk sebagian besar kanal; Matrix dapat mempertahankan target bernama/default yang sudah cocok) +- Untuk channel dengan `accounts` bernama tetapi masih memiliki nilai channel tingkat atas akun tunggal, pindahkan nilai yang dicakup akun tersebut ke akun yang dipromosikan yang dipilih untuk channel tersebut (`accounts.default` untuk sebagian besar channel; Matrix dapat mempertahankan target bernama/default yang cocok yang sudah ada) - `identity` → `agents.list[].identity` - `agent.*` → `agents.defaults` + `tools.*` (tools/elevated/exec/sandbox/subagents) - `agent.model`/`allowedModels`/`modelAliases`/`modelFallbacks`/`imageModelFallbacks` @@ -199,32 +197,31 @@ Migrasi saat ini: - `browser.profiles.*.driver: "extension"` → `"existing-session"` - hapus `browser.relayBindHost` (pengaturan relay ekstensi lama) -Peringatan doctor juga mencakup panduan account-default untuk kanal multi-akun: +Peringatan doctor juga mencakup panduan default akun untuk channel multi-akun: -- Jika dua atau lebih entri `channels..accounts` dikonfigurasi tanpa `channels..defaultAccount` atau `accounts.default`, doctor memperingatkan bahwa fallback routing dapat memilih akun yang tidak terduga. +- Jika dua atau lebih entri `channels..accounts` dikonfigurasi tanpa `channels..defaultAccount` atau `accounts.default`, doctor memperingatkan bahwa routing fallback dapat memilih akun yang tidak diharapkan. - Jika `channels..defaultAccount` diatur ke ID akun yang tidak dikenal, doctor memperingatkan dan mencantumkan ID akun yang dikonfigurasi. ### 2b) Override provider OpenCode Jika Anda menambahkan `models.providers.opencode`, `opencode-zen`, atau `opencode-go` -secara manual, itu akan menimpa katalog OpenCode bawaan dari `@mariozechner/pi-ai`. -Hal itu dapat memaksa model ke API yang salah atau men-nol-kan biaya. Doctor memperingatkan agar Anda -dapat menghapus override dan memulihkan perutean API + biaya per model. +secara manual, itu akan meng-override katalog OpenCode bawaan dari `@mariozechner/pi-ai`. +Ini dapat memaksa model ke API yang salah atau membuat biaya menjadi nol. Doctor memperingatkan agar Anda +dapat menghapus override tersebut dan memulihkan routing API per-model + biaya. ### 2c) Migrasi browser dan kesiapan Chrome MCP -Jika konfigurasi browser Anda masih menunjuk ke path ekstensi Chrome yang sudah dihapus, doctor -menormalisasikannya ke model attach Chrome MCP host-lokal saat ini: +Jika konfigurasi browser Anda masih menunjuk ke jalur ekstensi Chrome yang telah dihapus, doctor +menormalkannya ke model attach Chrome MCP host-lokal saat ini: - `browser.profiles.*.driver: "extension"` menjadi `"existing-session"` - `browser.relayBindHost` dihapus -Doctor juga mengaudit path Chrome MCP host-lokal saat Anda menggunakan `defaultProfile: +Doctor juga mengaudit jalur Chrome MCP host-lokal saat Anda menggunakan `defaultProfile: "user"` atau profil `existing-session` yang dikonfigurasi: -- memeriksa apakah Google Chrome terinstal pada host yang sama untuk profil - auto-connect default -- memeriksa versi Chrome yang terdeteksi dan memperingatkan bila di bawah Chrome 144 +- memeriksa apakah Google Chrome terpasang pada host yang sama untuk profil auto-connect default +- memeriksa versi Chrome yang terdeteksi dan memperingatkan jika di bawah Chrome 144 - mengingatkan Anda untuk mengaktifkan remote debugging di halaman inspect browser (misalnya `chrome://inspect/#remote-debugging`, `brave://inspect/#remote-debugging`, atau `edge://inspect/#remote-debugging`) @@ -237,91 +234,90 @@ tetap memerlukan: - remote debugging diaktifkan di browser tersebut - menyetujui prompt persetujuan attach pertama di browser -Kesiapan di sini hanya tentang prasyarat attach lokal. Existing-session mempertahankan -batas route Chrome MCP saat ini; route lanjutan seperti `responsebody`, ekspor PDF, -intersepsi unduhan, dan tindakan batch tetap memerlukan browser yang dikelola +Kesiapan di sini hanya terkait prasyarat attach lokal. Existing-session mempertahankan +batas rute Chrome MCP saat ini; rute lanjutan seperti `responsebody`, ekspor PDF, +intersepsi unduhan, dan tindakan batch tetap memerlukan browser terkelola atau profil CDP mentah. -Pemeriksaan ini **tidak** berlaku untuk Docker, sandbox, remote-browser, atau alur -headless lainnya. Semua itu tetap menggunakan CDP mentah. +Pemeriksaan ini **tidak** berlaku untuk Docker, sandbox, remote-browser, atau alur headless lainnya. Alur tersebut tetap menggunakan CDP mentah. -### 2d) Prasyarat OAuth TLS +### 2d) Prasyarat TLS OAuth -Saat profil OpenAI Codex OAuth dikonfigurasi, doctor mem-probe endpoint -otorisasi OpenAI untuk memverifikasi bahwa stack TLS Node/OpenSSL lokal dapat -memvalidasi rantai sertifikat. Jika probe gagal dengan kesalahan sertifikat (misalnya -`UNABLE_TO_GET_ISSUER_CERT_LOCALLY`, sertifikat kedaluwarsa, atau self-signed cert), -doctor mencetak panduan perbaikan spesifik platform. Di macOS dengan Homebrew Node, -perbaikannya biasanya `brew postinstall ca-certificates`. Dengan `--deep`, probe berjalan +Saat profil OAuth OpenAI Codex dikonfigurasi, doctor memeriksa endpoint otorisasi OpenAI +untuk memverifikasi bahwa stack TLS Node/OpenSSL lokal dapat +memvalidasi rantai sertifikat. Jika pemeriksaan gagal dengan kesalahan sertifikat (misalnya +`UNABLE_TO_GET_ISSUER_CERT_LOCALLY`, sertifikat kedaluwarsa, atau sertifikat self-signed), +doctor mencetak panduan perbaikan khusus platform. Di macOS dengan Node Homebrew, +perbaikannya biasanya `brew postinstall ca-certificates`. Dengan `--deep`, pemeriksaan berjalan bahkan jika gateway sehat. -### 2c) Override provider Codex OAuth +### 2c) Override provider OAuth Codex -Jika sebelumnya Anda menambahkan pengaturan transport OpenAI lama di bawah -`models.providers.openai-codex`, pengaturan itu dapat membayangi path provider Codex OAuth -bawaan yang digunakan otomatis oleh rilis yang lebih baru. Doctor memperingatkan saat melihat -pengaturan transport lama tersebut bersama Codex OAuth agar Anda dapat menghapus atau menulis ulang -override transport usang dan mendapatkan kembali perilaku routing/fallback bawaan. -Proxy kustom dan override hanya-header tetap didukung dan tidak +Jika Anda sebelumnya menambahkan pengaturan transport OpenAI lama di bawah +`models.providers.openai-codex`, pengaturan tersebut dapat membayangi jalur provider +OAuth Codex bawaan yang digunakan otomatis oleh rilis yang lebih baru. Doctor memperingatkan saat melihat +pengaturan transport lama tersebut bersamaan dengan OAuth Codex agar Anda dapat menghapus atau menulis ulang +override transport usang tersebut dan mendapatkan kembali perilaku routing/fallback +bawaan. Proxy kustom dan override khusus header tetap didukung dan tidak memicu peringatan ini. -### 3) Migrasi status lama (layout disk) +### 3) Migrasi status lama (tata letak disk) -Doctor dapat memigrasikan layout lama di disk ke struktur saat ini: +Doctor dapat memigrasikan tata letak lama di disk ke struktur saat ini: - Penyimpanan sesi + transkrip: - dari `~/.openclaw/sessions/` ke `~/.openclaw/agents//sessions/` -- Dir agen: +- Direktori agent: - dari `~/.openclaw/agent/` ke `~/.openclaw/agents//agent/` -- Status auth WhatsApp (Baileys): +- Status autentikasi WhatsApp (Baileys): - dari `~/.openclaw/credentials/*.json` lama (kecuali `oauth.json`) - ke `~/.openclaw/credentials/whatsapp//...` (ID akun default: `default`) Migrasi ini bersifat best-effort dan idempoten; doctor akan mengeluarkan peringatan saat -meninggalkan folder lama sebagai cadangan. Gateway/CLI juga memigrasikan otomatis -sesi lama + dir agen saat startup sehingga riwayat/auth/model berada di -path per-agen tanpa perlu menjalankan doctor secara manual. Auth WhatsApp sengaja hanya -dimigrasikan melalui `openclaw doctor`. Normalisasi provider/peta provider Talk kini -membandingkan berdasarkan kesetaraan struktural, sehingga perbedaan urutan kunci saja tidak lagi -memicu perubahan no-op `doctor --fix` yang berulang. +meninggalkan folder lama sebagai cadangan. Gateway/CLI juga otomatis memigrasikan +sesi lama + direktori agent saat startup sehingga riwayat/autentikasi/model masuk ke +path per-agent tanpa perlu menjalankan doctor secara manual. Autentikasi WhatsApp sengaja hanya +dimigrasikan melalui `openclaw doctor`. Normalisasi provider/peta provider Talk sekarang +membandingkan berdasarkan kesetaraan struktural, sehingga perbedaan urutan kunci saja tidak lagi memicu +perubahan no-op `doctor --fix` berulang. ### 3a) Migrasi manifest plugin lama -Doctor memindai semua manifest plugin yang terinstal untuk kunci kapabilitas tingkat atas -yang sudah deprecated (`speechProviders`, `realtimeTranscriptionProviders`, +Doctor memindai semua manifest plugin yang terinstal untuk mencari capability tingkat atas yang sudah usang +(`speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`, `webSearchProviders`). Saat ditemukan, doctor menawarkan untuk memindahkannya ke objek `contracts` dan menulis ulang file manifest di tempat. Migrasi ini idempoten; -jika kunci `contracts` sudah memiliki nilai yang sama, kunci lama dihapus +jika kunci `contracts` sudah memiliki nilai yang sama, kunci lama akan dihapus tanpa menduplikasi data. -### 3b) Migrasi penyimpanan cron lama +### 3b) Migrasi penyimpanan Cron lama -Doctor juga memeriksa penyimpanan pekerjaan cron (`~/.openclaw/cron/jobs.json` secara default, -atau `cron.store` jika di-override) untuk bentuk pekerjaan lama yang masih diterima -scheduler demi kompatibilitas. +Doctor juga memeriksa penyimpanan pekerjaan Cron (`~/.openclaw/cron/jobs.json` secara default, +atau `cron.store` jika dioverride) untuk bentuk pekerjaan lama yang masih +diterima scheduler demi kompatibilitas. -Pembersihan cron saat ini mencakup: +Pembersihan Cron saat ini mencakup: - `jobId` → `id` - `schedule.cron` → `schedule.expr` - field payload tingkat atas (`message`, `model`, `thinking`, ...) → `payload` - field delivery tingkat atas (`deliver`, `channel`, `to`, `provider`, ...) → `delivery` - alias delivery `provider` pada payload → `delivery.channel` eksplisit -- pekerjaan fallback webhook lama `notify: true` sederhana → `delivery.mode="webhook"` eksplisit dengan `delivery.to=cron.webhook` +- pekerjaan fallback Webhook `notify: true` lama yang sederhana → `delivery.mode="webhook"` eksplisit dengan `delivery.to=cron.webhook` -Doctor hanya otomatis memigrasikan pekerjaan `notify: true` bila hal itu dapat dilakukan tanpa -mengubah perilaku. Jika suatu pekerjaan menggabungkan fallback notify lama dengan mode -delivery non-webhook yang sudah ada, doctor memperingatkan dan membiarkan pekerjaan tersebut untuk ditinjau manual. +Doctor hanya memigrasikan otomatis pekerjaan `notify: true` saat dapat melakukannya tanpa +mengubah perilaku. Jika sebuah pekerjaan menggabungkan fallback notify lama dengan mode delivery +non-webhook yang sudah ada, doctor akan memperingatkan dan membiarkan pekerjaan tersebut untuk ditinjau secara manual. -### 3c) Pembersihan lock sesi +### 3c) Pembersihan kunci sesi -Doctor memindai setiap direktori sesi agen untuk file write-lock usang — file yang tertinggal -saat suatu sesi keluar secara abnormal. Untuk setiap file lock yang ditemukan, doctor melaporkan: -path, PID, apakah PID masih hidup, usia lock, dan apakah lock tersebut -dianggap usang (PID mati atau lebih tua dari 30 menit). Dalam mode `--fix` / `--repair` -doctor menghapus file lock usang secara otomatis; jika tidak, doctor mencetak catatan dan +Doctor memindai setiap direktori sesi agent untuk file kunci tulis usang — file yang tertinggal +saat sebuah sesi keluar secara tidak normal. Untuk setiap file kunci yang ditemukan, doctor melaporkan: +path, PID, apakah PID masih hidup, usia kunci, dan apakah kunci tersebut +dianggap usang (PID mati atau lebih lama dari 30 menit). Dalam mode `--fix` / `--repair`, +doctor menghapus file kunci usang secara otomatis; jika tidak, doctor mencetak catatan dan menginstruksikan Anda untuk menjalankan ulang dengan `--fix`. ### 4) Pemeriksaan integritas status (persistensi sesi, routing, dan keamanan) @@ -331,116 +327,144 @@ sesi, kredensial, log, dan konfigurasi (kecuali Anda memiliki cadangan di tempat Doctor memeriksa: -- **State dir hilang**: memperingatkan kehilangan status yang katastrofik, meminta untuk membuat ulang +- **Direktori status hilang**: memperingatkan tentang kehilangan status yang katastrofik, meminta untuk membuat ulang direktori, dan mengingatkan bahwa doctor tidak dapat memulihkan data yang hilang. -- **Izin state dir**: memverifikasi dapat ditulis; menawarkan untuk memperbaiki izin +- **Izin direktori status**: memverifikasi bahwa direktori dapat ditulis; menawarkan perbaikan izin (dan mengeluarkan petunjuk `chown` saat terdeteksi ketidakcocokan owner/group). -- **State dir tersinkron cloud di macOS**: memperingatkan saat status ter-resolve di bawah iCloud Drive +- **Direktori status macOS yang disinkronkan cloud**: memperingatkan saat status berada di bawah iCloud Drive (`~/Library/Mobile Documents/com~apple~CloudDocs/...`) atau - `~/Library/CloudStorage/...` karena path yang didukung sinkronisasi dapat menyebabkan I/O lebih lambat - dan race lock/sinkronisasi. -- **State dir Linux di SD atau eMMC**: memperingatkan saat status ter-resolve ke sumber mount `mmcblk*`, - karena random I/O yang didukung SD atau eMMC bisa lebih lambat dan lebih cepat aus - di bawah penulisan sesi dan kredensial. -- **Dir sesi hilang**: `sessions/` dan direktori penyimpanan sesi + `~/Library/CloudStorage/...` karena path yang didukung sinkronisasi dapat menyebabkan I/O + lebih lambat dan race lock/sinkronisasi. +- **Direktori status Linux pada SD atau eMMC**: memperingatkan saat status berada pada sumber mount `mmcblk*`, + karena I/O acak yang didukung SD atau eMMC bisa lebih lambat dan lebih cepat aus + saat penulisan sesi dan kredensial. +- **Direktori sesi hilang**: `sessions/` dan direktori penyimpanan sesi diperlukan untuk mempertahankan riwayat dan menghindari crash `ENOENT`. - **Ketidakcocokan transkrip**: memperingatkan saat entri sesi terbaru memiliki file transkrip yang hilang. -- **Sesi utama “1-line JSONL”**: menandai saat transkrip utama hanya memiliki satu +- **Sesi utama “JSONL 1 baris”**: menandai saat transkrip utama hanya memiliki satu baris (riwayat tidak terakumulasi). -- **Beberapa state dir**: memperingatkan saat beberapa folder `~/.openclaw` ada di berbagai +- **Beberapa direktori status**: memperingatkan saat ada beberapa folder `~/.openclaw` di berbagai direktori home atau saat `OPENCLAW_STATE_DIR` menunjuk ke tempat lain (riwayat dapat - terpecah antar instalasi). + terpecah di beberapa instalasi). - **Pengingat mode remote**: jika `gateway.mode=remote`, doctor mengingatkan Anda untuk menjalankannya di host remote (status berada di sana). -- **Izin file konfigurasi**: memperingatkan jika `~/.openclaw/openclaw.json` dapat - dibaca group/world dan menawarkan untuk memperketat ke `600`. +- **Izin file konfigurasi**: memperingatkan jika `~/.openclaw/openclaw.json` dapat dibaca + oleh group/dunia dan menawarkan untuk memperketatnya menjadi `600`. -### 5) Kesehatan auth model (kedaluwarsa OAuth) +### 5) Kesehatan autentikasi model (kedaluwarsa OAuth) -Doctor memeriksa profil OAuth di penyimpanan auth, memperingatkan saat token akan -kedaluwarsa/sudah kedaluwarsa, dan dapat me-refresh token saat aman. Jika profil -OAuth/token Anthropic usang, doctor menyarankan Anthropic API key atau path -setup-token Anthropic. -Prompt refresh hanya muncul saat berjalan secara interaktif (TTY); `--non-interactive` -melewati upaya refresh. +Doctor memeriksa profil OAuth di penyimpanan autentikasi, memperingatkan saat token +akan kedaluwarsa/sudah kedaluwarsa, dan dapat menyegarkannya jika aman. Jika profil +OAuth/token Anthropic usang, doctor menyarankan API key Anthropic atau +jalur setup-token Anthropic. +Prompt penyegaran hanya muncul saat berjalan secara interaktif (TTY); `--non-interactive` +melewati upaya penyegaran. -Saat refresh OAuth gagal permanen (misalnya `refresh_token_reused`, -`invalid_grant`, atau provider memberi tahu Anda untuk sign in lagi), doctor melaporkan -bahwa re-auth diperlukan dan mencetak perintah `openclaw models auth login --provider ...` +Saat penyegaran OAuth gagal secara permanen (misalnya `refresh_token_reused`, +`invalid_grant`, atau provider memberi tahu Anda untuk masuk lagi), doctor melaporkan +bahwa autentikasi ulang diperlukan dan mencetak perintah `openclaw models auth login --provider ...` yang tepat untuk dijalankan. -Doctor juga melaporkan profil auth yang sementara tidak dapat digunakan karena: +Doctor juga melaporkan profil autentikasi yang sementara tidak dapat digunakan karena: -- cooldown singkat (rate limit/timeout/kegagalan auth) -- penonaktifan lebih lama (kegagalan billing/kredit) +- cooldown singkat (batas laju/timeout/kegagalan autentikasi) +- penonaktifan yang lebih lama (kegagalan billing/kredit) ### 6) Validasi model hooks Jika `hooks.gmail.model` diatur, doctor memvalidasi referensi model terhadap -katalog dan allowlist serta memperingatkan saat referensi itu tidak akan ter-resolve atau tidak diizinkan. +katalog dan allowlist serta memperingatkan jika referensi tersebut tidak akan ter-resolve atau tidak diizinkan. ### 7) Perbaikan image sandbox Saat sandboxing diaktifkan, doctor memeriksa image Docker dan menawarkan untuk membangun atau -beralih ke nama lama jika image saat ini hilang. +beralih ke nama lama jika image saat ini tidak ada. ### 7b) Dependensi runtime plugin bawaan -Doctor memverifikasi bahwa dependensi runtime plugin bawaan (misalnya paket -runtime plugin Discord) ada di root instalasi OpenClaw. +Doctor memverifikasi bahwa dependensi runtime plugin bawaan (misalnya paket runtime plugin +Discord) ada di root instalasi OpenClaw. Jika ada yang hilang, doctor melaporkan paket tersebut dan menginstalnya dalam mode `openclaw doctor --fix` / `openclaw doctor --repair`. -### 8) Migrasi layanan gateway dan petunjuk pembersihan +### 8) Migrasi layanan Gateway dan petunjuk pembersihan Doctor mendeteksi layanan gateway lama (launchd/systemd/schtasks) dan -menawarkan untuk menghapusnya serta memasang layanan OpenClaw menggunakan port gateway -saat ini. Doctor juga dapat memindai layanan mirip gateway tambahan dan mencetak petunjuk pembersihan. -Layanan gateway OpenClaw bernama profil dianggap first-class dan tidak +menawarkan untuk menghapusnya serta menginstal layanan OpenClaw menggunakan port gateway +saat ini. Doctor juga dapat memindai layanan tambahan yang menyerupai gateway dan mencetak petunjuk pembersihan. +Layanan gateway OpenClaw bernama profil dianggap sebagai kelas utama dan tidak ditandai sebagai "tambahan". -### 8b) Migrasi startup Matrix +### 8b) Migrasi Matrix saat startup -Saat akun kanal Matrix memiliki migrasi status lama yang tertunda atau dapat ditindaklanjuti, +Saat akun channel Matrix memiliki migrasi status lama yang tertunda atau dapat ditindaklanjuti, doctor (dalam mode `--fix` / `--repair`) membuat snapshot pra-migrasi lalu menjalankan langkah migrasi best-effort: migrasi status Matrix lama dan persiapan -status terenkripsi lama. Kedua langkah bersifat non-fatal; kesalahan dicatat dan -startup berlanjut. Dalam mode baca-saja (`openclaw doctor` tanpa `--fix`) pemeriksaan ini +status terenkripsi lama. Kedua langkah tidak fatal; kesalahan dicatat dalam log dan +startup tetap berlanjut. Dalam mode hanya-baca (`openclaw doctor` tanpa `--fix`) pemeriksaan ini dilewati sepenuhnya. +### 8c) Pairing perangkat dan drift autentikasi + +Doctor sekarang memeriksa status pairing perangkat sebagai bagian dari pemeriksaan kesehatan normal. + +Yang dilaporkan: + +- permintaan pairing pertama kali yang tertunda +- peningkatan role yang tertunda untuk perangkat yang sudah dipair +- peningkatan scope yang tertunda untuk perangkat yang sudah dipair +- perbaikan ketidakcocokan kunci publik saat ID perangkat masih cocok tetapi identitas + perangkat tidak lagi cocok dengan catatan yang disetujui +- catatan pairing yang tidak memiliki token aktif untuk role yang disetujui +- token pairing yang scopenya menyimpang di luar baseline pairing yang disetujui +- entri token perangkat cache lokal untuk mesin saat ini yang lebih lama dari + rotasi token sisi gateway atau membawa metadata scope yang usang + +Doctor tidak otomatis menyetujui permintaan pairing atau otomatis merotasi token perangkat. Doctor +mencetak langkah berikutnya yang tepat: + +- periksa permintaan yang tertunda dengan `openclaw devices list` +- setujui permintaan yang tepat dengan `openclaw devices approve ` +- rotasi token baru dengan `openclaw devices rotate --device --role ` +- hapus dan setujui ulang catatan usang dengan `openclaw devices remove ` + +Ini menutup celah umum "sudah dipair tetapi masih mendapat pairing required": +doctor kini membedakan pairing pertama kali dari peningkatan role/scope yang tertunda +dan dari drift token/identitas perangkat yang usang. + ### 9) Peringatan keamanan -Doctor mengeluarkan peringatan saat suatu provider terbuka untuk DM tanpa allowlist, atau -saat suatu kebijakan dikonfigurasi dengan cara yang berbahaya. +Doctor mengeluarkan peringatan saat sebuah provider terbuka untuk DM tanpa allowlist, atau +saat sebuah kebijakan dikonfigurasi dengan cara yang berbahaya. -### 10) systemd linger (Linux) +### 10) Linger systemd (Linux) Jika berjalan sebagai layanan pengguna systemd, doctor memastikan lingering diaktifkan agar gateway tetap hidup setelah logout. -### 11) Status workspace (Skills, plugin, dan dir lama) +### 11) Status workspace (Skills, plugin, dan direktori lama) -Doctor mencetak ringkasan status workspace untuk agen default: +Doctor mencetak ringkasan status workspace untuk agent default: -- **Status Skills**: menghitung Skills yang eligible, missing-requirements, dan allowlist-blocked. -- **Dir workspace lama**: memperingatkan saat `~/openclaw` atau direktori workspace lama lain +- **Status Skills**: menghitung Skills yang memenuhi syarat, tidak memiliki persyaratan, dan diblokir oleh allowlist. +- **Direktori workspace lama**: memperingatkan saat `~/openclaw` atau direktori workspace lama lainnya ada bersama workspace saat ini. -- **Status plugin**: menghitung plugin loaded/disabled/errored; mencantumkan ID plugin untuk - error apa pun; melaporkan kapabilitas bundle plugin. +- **Status plugin**: menghitung plugin yang dimuat/dinonaktifkan/error; mencantumkan ID plugin untuk setiap + error; melaporkan capability plugin bundel. - **Peringatan kompatibilitas plugin**: menandai plugin yang memiliki masalah kompatibilitas dengan runtime saat ini. -- **Diagnostik plugin**: menampilkan peringatan atau error saat load yang dikeluarkan oleh - registry plugin. +- **Diagnostik plugin**: menampilkan peringatan atau error waktu muat yang dikeluarkan oleh + registri plugin. ### 11b) Ukuran file bootstrap Doctor memeriksa apakah file bootstrap workspace (misalnya `AGENTS.md`, -`CLAUDE.md`, atau file konteks injeksi lainnya) mendekati atau melebihi budget karakter -yang dikonfigurasi. Doctor melaporkan jumlah karakter mentah vs. yang diinjeksi per file, persentase -pemotongan, penyebab pemotongan (`max/file` atau `max/total`), dan total karakter -yang diinjeksi sebagai fraksi dari total budget. Saat file dipotong atau mendekati -batas, doctor mencetak tips untuk menyetel `agents.defaults.bootstrapMaxChars` +`CLAUDE.md`, atau file konteks lain yang diinjeksi) mendekati atau melebihi +anggaran karakter yang dikonfigurasi. Doctor melaporkan jumlah karakter mentah vs. yang diinjeksi per file, persentase +pemotongan, penyebab pemotongan (`max/file` atau `max/total`), dan total karakter yang diinjeksi +sebagai fraksi dari total anggaran. Saat file dipotong atau mendekati +batas, doctor mencetak tips untuk menyesuaikan `agents.defaults.bootstrapMaxChars` dan `agents.defaults.bootstrapTotalMaxChars`. ### 11c) Shell completion @@ -448,68 +472,68 @@ dan `agents.defaults.bootstrapTotalMaxChars`. Doctor memeriksa apakah tab completion terinstal untuk shell saat ini (zsh, bash, fish, atau PowerShell): -- Jika profil shell menggunakan pola dynamic completion yang lambat +- Jika profil shell menggunakan pola completion dinamis yang lambat (`source <(openclaw completion ...)`), doctor meningkatkannya ke varian file cache yang lebih cepat. - Jika completion dikonfigurasi di profil tetapi file cache hilang, doctor meregenerasi cache secara otomatis. -- Jika tidak ada completion yang dikonfigurasi sama sekali, doctor meminta untuk menginstalnya +- Jika completion sama sekali tidak dikonfigurasi, doctor meminta untuk menginstalnya (hanya mode interaktif; dilewati dengan `--non-interactive`). Jalankan `openclaw completion --write-state` untuk meregenerasi cache secara manual. -### 12) Pemeriksaan auth gateway (token lokal) +### 12) Pemeriksaan autentikasi Gateway (token lokal) -Doctor memeriksa kesiapan auth token gateway lokal. +Doctor memeriksa kesiapan autentikasi token gateway lokal. - Jika mode token memerlukan token dan tidak ada sumber token, doctor menawarkan untuk membuatnya. -- Jika `gateway.auth.token` dikelola SecretRef tetapi tidak tersedia, doctor memperingatkan dan tidak menimpanya dengan plaintext. -- `openclaw doctor --generate-gateway-token` memaksa pembuatan hanya saat tidak ada token SecretRef yang dikonfigurasi. +- Jika `gateway.auth.token` dikelola oleh SecretRef tetapi tidak tersedia, doctor memperingatkan dan tidak menimpanya dengan teks biasa. +- `openclaw doctor --generate-gateway-token` memaksa pembuatan hanya jika tidak ada SecretRef token yang dikonfigurasi. -### 12b) Perbaikan sadar-SecretRef baca-saja +### 12b) Perbaikan hanya-baca yang sadar SecretRef -Beberapa alur perbaikan perlu memeriksa kredensial yang dikonfigurasi tanpa melemahkan perilaku fail-fast saat runtime. +Beberapa alur perbaikan perlu memeriksa kredensial yang dikonfigurasi tanpa melemahkan perilaku fail-fast runtime. -- `openclaw doctor --fix` sekarang menggunakan model ringkasan SecretRef baca-saja yang sama seperti keluarga perintah status untuk perbaikan konfigurasi yang terarah. -- Contoh: perbaikan Telegram `allowFrom` / `groupAllowFrom` `@username` mencoba menggunakan kredensial bot yang dikonfigurasi bila tersedia. -- Jika token bot Telegram dikonfigurasi melalui SecretRef tetapi tidak tersedia dalam path perintah saat ini, doctor melaporkan bahwa kredensial tersebut dikonfigurasi-tetapi-tidak-tersedia dan melewati auto-resolution alih-alih crash atau salah melaporkan token sebagai hilang. +- `openclaw doctor --fix` sekarang menggunakan model ringkasan SecretRef hanya-baca yang sama seperti perintah keluarga status untuk perbaikan konfigurasi yang ditargetkan. +- Contoh: perbaikan Telegram `allowFrom` / `groupAllowFrom` `@username` mencoba menggunakan kredensial bot yang dikonfigurasi jika tersedia. +- Jika token bot Telegram dikonfigurasi melalui SecretRef tetapi tidak tersedia pada jalur perintah saat ini, doctor melaporkan bahwa kredensial tersebut dikonfigurasi-tetapi-tidak-tersedia dan melewati resolusi otomatis alih-alih crash atau salah melaporkan token sebagai hilang. -### 13) Pemeriksaan kesehatan gateway + restart +### 13) Pemeriksaan kesehatan Gateway + restart -Doctor menjalankan pemeriksaan kesehatan dan menawarkan untuk merestart gateway saat terlihat -tidak sehat. +Doctor menjalankan pemeriksaan kesehatan dan menawarkan untuk me-restart gateway saat +terlihat tidak sehat. -### 13b) Kesiapan memory search +### 13b) Kesiapan pencarian memori -Doctor memeriksa apakah provider embedding memory search yang dikonfigurasi siap -untuk agen default. Perilakunya bergantung pada backend dan provider yang dikonfigurasi: +Doctor memeriksa apakah provider embedding pencarian memori yang dikonfigurasi siap +untuk agent default. Perilakunya bergantung pada backend dan provider yang dikonfigurasi: -- **Backend QMD**: mem-probe apakah biner `qmd` tersedia dan dapat dijalankan. +- **Backend QMD**: memeriksa apakah biner `qmd` tersedia dan dapat dijalankan. Jika tidak, doctor mencetak panduan perbaikan termasuk paket npm dan opsi path biner manual. -- **Provider lokal eksplisit**: memeriksa file model lokal atau URL model - remote/dapat-diunduh yang dikenali. Jika hilang, doctor menyarankan beralih ke provider remote. +- **Provider lokal eksplisit**: memeriksa file model lokal atau URL model remote/yang dapat diunduh + yang dikenali. Jika tidak ada, doctor menyarankan beralih ke provider remote. - **Provider remote eksplisit** (`openai`, `voyage`, dll.): memverifikasi bahwa API key - ada di environment atau penyimpanan auth. Mencetak petunjuk perbaikan yang dapat ditindaklanjuti jika hilang. -- **Provider auto**: memeriksa ketersediaan model lokal terlebih dahulu, lalu mencoba setiap - provider remote dalam urutan auto-selection. + ada di environment atau penyimpanan autentikasi. Mencetak petunjuk perbaikan yang dapat ditindaklanjuti jika tidak ada. +- **Provider otomatis**: memeriksa ketersediaan model lokal terlebih dahulu, lalu mencoba setiap provider remote + sesuai urutan auto-selection. Saat hasil probe gateway tersedia (gateway sehat pada saat -pemeriksaan), doctor melakukan cross-reference hasilnya dengan konfigurasi yang terlihat oleh CLI dan mencatat +pemeriksaan), doctor mencocokkan hasilnya dengan konfigurasi yang terlihat oleh CLI dan mencatat setiap ketidaksesuaian. Gunakan `openclaw memory status --deep` untuk memverifikasi kesiapan embedding saat runtime. -### 14) Peringatan status kanal +### 14) Peringatan status channel -Jika gateway sehat, doctor menjalankan probe status kanal dan melaporkan +Jika gateway sehat, doctor menjalankan probe status channel dan melaporkan peringatan dengan perbaikan yang disarankan. ### 15) Audit konfigurasi supervisor + perbaikan -Doctor memeriksa konfigurasi supervisor yang terpasang (launchd/systemd/schtasks) untuk -default yang hilang atau usang (misalnya dependensi systemd network-online dan -restart delay). Saat menemukan ketidakcocokan, doctor merekomendasikan pembaruan dan dapat -menulis ulang file/task layanan ke default saat ini. +Doctor memeriksa konfigurasi supervisor terinstal (launchd/systemd/schtasks) untuk +default yang hilang atau usang (misalnya dependensi network-online systemd dan +delay restart). Saat menemukan ketidaksesuaian, doctor merekomendasikan pembaruan dan dapat +menulis ulang file layanan/tugas ke default saat ini. Catatan: @@ -517,36 +541,36 @@ Catatan: - `openclaw doctor --yes` menerima prompt perbaikan default. - `openclaw doctor --repair` menerapkan perbaikan yang direkomendasikan tanpa prompt. - `openclaw doctor --repair --force` menimpa konfigurasi supervisor kustom. -- Jika auth token memerlukan token dan `gateway.auth.token` dikelola SecretRef, install/perbaikan layanan doctor memvalidasi SecretRef tetapi tidak menyimpan nilai token plaintext yang telah di-resolve ke metadata environment layanan supervisor. -- Jika auth token memerlukan token dan token SecretRef yang dikonfigurasi tidak ter-resolve, doctor memblokir path install/perbaikan dengan panduan yang dapat ditindaklanjuti. -- Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi dan `gateway.auth.mode` tidak diatur, doctor memblokir install/perbaikan sampai mode diatur secara eksplisit. -- Untuk unit user-systemd Linux, pemeriksaan drift token doctor kini mencakup sumber `Environment=` dan `EnvironmentFile=` saat membandingkan metadata auth layanan. +- Jika autentikasi token memerlukan token dan `gateway.auth.token` dikelola oleh SecretRef, jalur instalasi/perbaikan layanan doctor memvalidasi SecretRef tetapi tidak menyimpan nilai token teks biasa yang telah di-resolve ke metadata environment layanan supervisor. +- Jika autentikasi token memerlukan token dan SecretRef token yang dikonfigurasi tidak ter-resolve, doctor memblokir jalur instalasi/perbaikan dengan panduan yang dapat ditindaklanjuti. +- Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi dan `gateway.auth.mode` tidak diatur, doctor memblokir instalasi/perbaikan sampai mode diatur secara eksplisit. +- Untuk unit user-systemd Linux, pemeriksaan drift token doctor sekarang mencakup sumber `Environment=` dan `EnvironmentFile=` saat membandingkan metadata autentikasi layanan. - Anda selalu dapat memaksa penulisan ulang penuh melalui `openclaw gateway install --force`. -### 16) Diagnostik runtime + port gateway +### 16) Diagnostik runtime + port Gateway -Doctor memeriksa runtime layanan (PID, status exit terakhir) dan memperingatkan saat -layanan terpasang tetapi sebenarnya tidak berjalan. Doctor juga memeriksa benturan port +Doctor memeriksa runtime layanan (PID, status keluar terakhir) dan memperingatkan saat +layanan terinstal tetapi sebenarnya tidak berjalan. Doctor juga memeriksa benturan port pada port gateway (default `18789`) dan melaporkan kemungkinan penyebabnya (gateway sudah berjalan, tunnel SSH). -### 17) Best practice runtime gateway +### 17) Praktik terbaik runtime Gateway -Doctor memperingatkan saat layanan gateway berjalan di Bun atau path Node yang dikelola version manager -(`nvm`, `fnm`, `volta`, `asdf`, dll.). Kanal WhatsApp + Telegram memerlukan Node, +Doctor memperingatkan saat layanan gateway berjalan di Bun atau pada path Node yang dikelola version manager +(`nvm`, `fnm`, `volta`, `asdf`, dll.). Channel WhatsApp + Telegram memerlukan Node, dan path version manager dapat rusak setelah upgrade karena layanan tidak -memuat init shell Anda. Doctor menawarkan untuk memigrasikan ke instalasi Node sistem bila +memuat init shell Anda. Doctor menawarkan untuk memigrasikan ke instalasi Node sistem jika tersedia (Homebrew/apt/choco). ### 18) Penulisan konfigurasi + metadata wizard -Doctor menyimpan setiap perubahan konfigurasi dan memberi cap metadata wizard untuk mencatat -run doctor. +Doctor menyimpan semua perubahan konfigurasi dan memberi cap metadata wizard untuk mencatat +jalannya doctor. ### 19) Tips workspace (cadangan + sistem memori) -Doctor menyarankan sistem memori workspace jika belum ada dan mencetak tip cadangan +Doctor menyarankan sistem memori workspace jika belum ada dan mencetak tip pencadangan jika workspace belum berada di bawah git. Lihat [/concepts/agent-workspace](/id/concepts/agent-workspace) untuk panduan lengkap tentang -struktur workspace dan cadangan git (disarankan GitHub atau GitLab privat). +struktur workspace dan pencadangan git (disarankan GitHub atau GitLab privat). diff --git a/docs/id/gateway/index.md b/docs/id/gateway/index.md index 1046208cc..48dbf8f54 100644 --- a/docs/id/gateway/index.md +++ b/docs/id/gateway/index.md @@ -1,33 +1,33 @@ --- read_when: - - Menjalankan atau melakukan debug proses gateway -summary: Runbook untuk layanan Gateway, siklus hidup, dan operasional + - Menjalankan atau men-debug proses gateway +summary: Runbook untuk layanan Gateway, siklus hidup, dan operasi title: Runbook Gateway x-i18n: - generated_at: "2026-04-07T09:14:29Z" + generated_at: "2026-04-20T09:27:31Z" model: gpt-5.4 provider: openai - source_hash: fd2c21036e88612861ef2195b8ff7205aca31386bb11558614ade8d1a54fdebd + source_hash: e1004cdd43b1db6794f3ca83da38dbdb231a1976329d9d6d851e2b02405278d8 source_path: gateway/index.md workflow: 15 --- # Runbook Gateway -Gunakan halaman ini untuk startup hari pertama dan operasional hari kedua dari layanan Gateway. +Gunakan halaman ini untuk startup hari pertama dan operasi hari kedua dari layanan Gateway. Diagnostik berbasis gejala dengan urutan perintah yang tepat dan signature log. - Panduan penyiapan berbasis tugas + referensi konfigurasi lengkap. + Panduan penyiapan berorientasi tugas + referensi konfigurasi lengkap. - Kontrak SecretRef, perilaku snapshot runtime, serta operasi migrasi/muat ulang. + Kontrak SecretRef, perilaku snapshot runtime, dan operasi migrasi/muat ulang. - Aturan target/path `secrets apply` yang tepat dan perilaku profil auth hanya-ref. + Aturan target/path `secrets apply` yang tepat dan perilaku auth-profile hanya-ref. @@ -40,7 +40,7 @@ Gunakan halaman ini untuk startup hari pertama dan operasional hari kedua dari l openclaw gateway --port 18789 # debug/trace dicerminkan ke stdio openclaw gateway --port 18789 --verbose -# paksa mematikan listener pada port yang dipilih, lalu mulai +# paksa matikan listener pada port yang dipilih, lalu mulai openclaw gateway --force ``` @@ -54,36 +54,36 @@ openclaw status openclaw logs --follow ``` -Baseline sehat: `Runtime: running` dan `RPC probe: ok`. +Baseline sehat: `Runtime: running`, `Connectivity probe: ok`, dan `Capability: ...` yang sesuai dengan yang Anda harapkan. Gunakan `openclaw gateway status --require-rpc` saat Anda memerlukan bukti RPC cakupan baca, bukan sekadar keterjangkauan. - + ```bash openclaw channels status --probe ``` -Dengan gateway yang dapat dijangkau, ini menjalankan probe channel per akun secara live dan audit opsional. -Jika gateway tidak dapat dijangkau, CLI akan fallback ke ringkasan channel berbasis konfigurasi saja +Dengan gateway yang dapat dijangkau, ini menjalankan probe channel per-akun secara live dan audit opsional. +Jika gateway tidak dapat dijangkau, CLI akan kembali ke ringkasan channel berbasis konfigurasi saja alih-alih output probe live. -Muat ulang konfigurasi Gateway memantau path file konfigurasi aktif (diselesaikan dari default profile/state, atau `OPENCLAW_CONFIG_PATH` saat disetel). +Reload konfigurasi Gateway memantau path file konfigurasi aktif (di-resolve dari default profile/state, atau `OPENCLAW_CONFIG_PATH` jika disetel). Mode default adalah `gateway.reload.mode="hybrid"`. -Setelah pemuatan pertama berhasil, proses yang berjalan melayani snapshot konfigurasi dalam memori yang aktif; muat ulang yang berhasil menukar snapshot tersebut secara atomik. +Setelah pemuatan berhasil pertama, proses yang berjalan menyajikan snapshot konfigurasi aktif di memori; reload yang berhasil menukar snapshot tersebut secara atomik. ## Model runtime -- Satu proses selalu aktif untuk perutean, control plane, dan koneksi channel. +- Satu proses yang selalu aktif untuk routing, control plane, dan koneksi channel. - Satu port termultipleks untuk: - - control/RPC WebSocket - - API HTTP, kompatibel dengan OpenAI (`/v1/models`, `/v1/embeddings`, `/v1/chat/completions`, `/v1/responses`, `/tools/invoke`) - - Control UI dan hooks + - WebSocket control/RPC + - HTTP API, kompatibel OpenAI (`/v1/models`, `/v1/embeddings`, `/v1/chat/completions`, `/v1/responses`, `/tools/invoke`) + - Control UI dan hook - Mode bind default: `loopback`. - Auth diwajibkan secara default. Penyiapan shared-secret menggunakan `gateway.auth.token` / `gateway.auth.password` (atau @@ -92,7 +92,7 @@ Setelah pemuatan pertama berhasil, proses yang berjalan melayani snapshot konfig ## Endpoint kompatibel OpenAI -Permukaan kompatibilitas OpenClaw dengan leverage tertinggi sekarang adalah: +Surface kompatibilitas dengan leverage tertinggi OpenClaw saat ini adalah: - `GET /v1/models` - `GET /v1/models/{id}` @@ -100,37 +100,37 @@ Permukaan kompatibilitas OpenClaw dengan leverage tertinggi sekarang adalah: - `POST /v1/chat/completions` - `POST /v1/responses` -Mengapa kumpulan ini penting: +Mengapa set ini penting: -- Sebagian besar integrasi Open WebUI, LobeChat, dan LibreChat memprobe `/v1/models` terlebih dahulu. +- Sebagian besar integrasi Open WebUI, LobeChat, dan LibreChat melakukan probe ke `/v1/models` terlebih dahulu. - Banyak pipeline RAG dan memori mengharapkan `/v1/embeddings`. - Klien native agent semakin memilih `/v1/responses`. Catatan perencanaan: - `/v1/models` bersifat agent-first: endpoint ini mengembalikan `openclaw`, `openclaw/default`, dan `openclaw/`. -- `openclaw/default` adalah alias stabil yang selalu memetakan ke agent default yang dikonfigurasi. -- Gunakan `x-openclaw-model` saat Anda menginginkan override provider/model backend; jika tidak, penyiapan model dan embedding normal dari agent yang dipilih tetap mengendalikan. +- `openclaw/default` adalah alias stabil yang selalu dipetakan ke agent default yang dikonfigurasi. +- Gunakan `x-openclaw-model` saat Anda menginginkan override provider/model backend; jika tidak, pengaturan model dan embedding normal milik agent yang dipilih tetap mengendalikan. -Semua ini berjalan pada port Gateway utama dan menggunakan batas auth operator tepercaya yang sama seperti sisa API HTTP Gateway. +Semua ini berjalan pada port utama Gateway dan menggunakan batas auth operator tepercaya yang sama seperti bagian lain dari HTTP API Gateway. ### Prioritas port dan bind -| Pengaturan | Urutan resolusi | -| ------------ | ------------------------------------------------------------ | +| Setting | Urutan resolusi | +| ------------ | ------------------------------------------------------------- | | Port Gateway | `--port` → `OPENCLAW_GATEWAY_PORT` → `gateway.port` → `18789` | -| Mode bind | CLI/override → `gateway.bind` → `loopback` | +| Mode bind | CLI/override → `gateway.bind` → `loopback` | ### Mode hot reload | `gateway.reload.mode` | Perilaku | | --------------------- | ----------------------------------------- | -| `off` | Tidak ada muat ulang konfigurasi | -| `hot` | Terapkan hanya perubahan yang aman untuk hot | -| `restart` | Mulai ulang pada perubahan yang memerlukan reload | -| `hybrid` (default) | Terapkan hot saat aman, mulai ulang saat diperlukan | +| `off` | Tidak ada reload konfigurasi | +| `hot` | Terapkan hanya perubahan yang aman-hot | +| `restart` | Restart pada perubahan yang memerlukan reload | +| `hybrid` (default) | Terapkan secara hot saat aman, restart saat diperlukan | -## Kumpulan perintah operator +## Set perintah operator ```bash openclaw gateway status @@ -144,14 +144,15 @@ openclaw logs --follow openclaw doctor ``` -`gateway status --deep` ditujukan untuk penemuan layanan tambahan (LaunchDaemons/unit sistem systemd/schtasks), bukan probe kesehatan RPC yang lebih mendalam. +`gateway status --deep` digunakan untuk penemuan layanan tambahan (unit +LaunchDaemons/systemd system/schtasks), bukan probe kesehatan RPC yang lebih mendalam. ## Beberapa gateway (host yang sama) Sebagian besar instalasi sebaiknya menjalankan satu gateway per mesin. Satu gateway dapat menampung beberapa agent dan channel. -Anda hanya memerlukan beberapa gateway saat Anda sengaja menginginkan isolasi atau bot penyelamat. +Anda hanya memerlukan beberapa gateway saat Anda sengaja menginginkan isolasi atau rescue bot. Pemeriksaan yang berguna: @@ -160,20 +161,20 @@ openclaw gateway status --deep openclaw gateway probe ``` -Yang perlu diharapkan: +Yang diharapkan: - `gateway status --deep` dapat melaporkan `Other gateway-like services detected (best effort)` - dan mencetak petunjuk pembersihan ketika instalasi launchd/systemd/schtasks lama masih ada. + dan menampilkan petunjuk pembersihan saat instalasi launchd/systemd/schtasks lama masih ada. - `gateway probe` dapat memperingatkan tentang `multiple reachable gateways` saat lebih dari satu target merespons. -- Jika itu disengaja, isolasikan port, config/state, dan root workspace per gateway. +- Jika itu memang disengaja, isolasikan root port, config/state, dan workspace untuk tiap gateway. Penyiapan terperinci: [/gateway/multiple-gateways](/id/gateway/multiple-gateways). ## Akses jarak jauh -Disarankan: Tailscale/VPN. -Fallback: tunnel SSH. +Yang disarankan: Tailscale/VPN. +Cadangan: tunnel SSH. ```bash ssh -N -L 18789:127.0.0.1:18789 user@host @@ -191,7 +192,7 @@ Lihat: [Gateway Jarak Jauh](/id/gateway/remote), [Autentikasi](/id/gateway/authe ## Supervisi dan siklus hidup layanan -Gunakan run yang disupervisi untuk keandalan setingkat produksi. +Gunakan proses yang disupervisi untuk keandalan yang menyerupai produksi. @@ -215,13 +216,13 @@ systemctl --user enable --now openclaw-gateway[-].service openclaw gateway status ``` -Untuk persistensi setelah logout, aktifkan lingering: +Agar tetap berjalan setelah logout, aktifkan lingering: ```bash sudo loginctl enable-linger ``` -Contoh unit pengguna manual saat Anda memerlukan path instalasi kustom: +Contoh user-unit manual saat Anda memerlukan path instalasi kustom: ```ini [Unit] @@ -255,7 +256,7 @@ openclaw gateway stop Startup terkelola Windows native menggunakan Scheduled Task bernama `OpenClaw Gateway` (atau `OpenClaw Gateway ()` untuk profile bernama). Jika pembuatan Scheduled Task -ditolak, OpenClaw melakukan fallback ke launcher folder Startup per pengguna +ditolak, OpenClaw akan beralih ke launcher Startup-folder per-pengguna yang menunjuk ke `gateway.cmd` di dalam direktori state. @@ -269,7 +270,7 @@ sudo systemctl daemon-reload sudo systemctl enable --now openclaw-gateway[-].service ``` -Gunakan isi layanan yang sama seperti unit pengguna, tetapi instal di bawah +Gunakan body layanan yang sama seperti user unit, tetapi instal di bawah `/etc/systemd/system/openclaw-gateway[-].service` dan sesuaikan `ExecStart=` jika biner `openclaw` Anda berada di lokasi lain. @@ -279,7 +280,7 @@ Gunakan isi layanan yang sama seperti unit pengguna, tetapi instal di bawah ## Beberapa gateway pada satu host Sebagian besar penyiapan sebaiknya menjalankan **satu** Gateway. -Gunakan beberapa hanya untuk isolasi/redundansi yang ketat (misalnya profile penyelamat). +Gunakan beberapa hanya untuk isolasi/redundansi ketat (misalnya profile rescue). Checklist per instance: @@ -305,25 +306,25 @@ openclaw --dev gateway --allow-unconfigured openclaw --dev status ``` -Default mencakup state/config terisolasi dan port gateway dasar `19001`. +Default mencakup state/config yang terisolasi dan port dasar gateway `19001`. -## Referensi cepat protokol (sudut pandang operator) +## Referensi cepat protokol (tampilan operator) -- Frame klien pertama harus `connect`. +- Frame klien pertama harus berupa `connect`. - Gateway mengembalikan snapshot `hello-ok` (`presence`, `health`, `stateVersion`, `uptimeMs`, limits/policy). -- `hello-ok.features.methods` / `events` adalah daftar penemuan konservatif, bukan - dump yang dihasilkan dari setiap rute helper yang dapat dipanggil. -- Permintaan: `req(method, params)` → `res(ok/payload|error)`. +- `hello-ok.features.methods` / `events` adalah daftar discovery konservatif, bukan + dump yang dihasilkan dari setiap helper route yang dapat dipanggil. +- Request: `req(method, params)` → `res(ok/payload|error)`. - Event umum mencakup `connect.challenge`, `agent`, `chat`, `session.message`, `session.tool`, `sessions.changed`, `presence`, `tick`, `health`, `heartbeat`, event siklus hidup pairing/approval, dan `shutdown`. Run agent terdiri dari dua tahap: -1. Ack accepted langsung (`status:"accepted"`) -2. Respons penyelesaian final (`status:"ok"|"error"`), dengan event `agent` yang di-stream di antaranya. +1. Ack penerimaan langsung (`status:"accepted"`) +2. Respons penyelesaian akhir (`status:"ok"|"error"`), dengan event `agent` yang di-stream di antaranya. -Lihat dokumen protokol lengkap: [Protokol Gateway](/id/gateway/protocol). +Lihat dokumentasi protokol lengkap: [Protokol Gateway](/id/gateway/protocol). ## Pemeriksaan operasional @@ -342,24 +343,24 @@ openclaw health ### Pemulihan gap -Event tidak diputar ulang. Pada gap urutan, segarkan state (`health`, `system-presence`) sebelum melanjutkan. +Event tidak diputar ulang. Pada gap sequence, segarkan state (`health`, `system-presence`) sebelum melanjutkan. ## Signature kegagalan umum -| Signature | Masalah yang mungkin | -| -------------------------------------------------------------- | -------------------------------------------------------------------------------- | -| `refusing to bind gateway ... without auth` | Bind non-loopback tanpa jalur auth gateway yang valid | -| `another gateway instance is already listening` / `EADDRINUSE` | Konflik port | -| `Gateway start blocked: set gateway.mode=local` | Konfigurasi disetel ke mode remote, atau cap mode lokal hilang dari konfigurasi yang rusak | -| `unauthorized` during connect | Ketidakcocokan auth antara klien dan gateway | +| Signature | Kemungkinan masalah | +| -------------------------------------------------------------- | --------------------------------------------------------------------------------- | +| `refusing to bind gateway ... without auth` | Bind non-loopback tanpa jalur auth gateway yang valid | +| `another gateway instance is already listening` / `EADDRINUSE` | Konflik port | +| `Gateway start blocked: set gateway.mode=local` | Konfigurasi disetel ke mode remote, atau stamp mode lokal hilang dari konfigurasi yang rusak | +| `unauthorized` during connect | Ketidakcocokan auth antara klien dan gateway | Untuk urutan diagnosis lengkap, gunakan [Pemecahan Masalah Gateway](/id/gateway/troubleshooting). ## Jaminan keamanan -- Klien protokol Gateway gagal cepat ketika Gateway tidak tersedia (tanpa fallback channel langsung implisit). +- Klien protokol Gateway gagal cepat saat Gateway tidak tersedia (tanpa fallback direct-channel implisit). - Frame pertama yang tidak valid/bukan-connect ditolak dan koneksi ditutup. -- Shutdown yang graceful memancarkan event `shutdown` sebelum socket ditutup. +- Shutdown graceful mengirim event `shutdown` sebelum socket ditutup. --- @@ -368,6 +369,6 @@ Terkait: - [Pemecahan Masalah](/id/gateway/troubleshooting) - [Proses Latar Belakang](/id/gateway/background-process) - [Konfigurasi](/id/gateway/configuration) -- [Kesehatan](/id/gateway/health) +- [Health](/id/gateway/health) - [Doctor](/id/gateway/doctor) - [Autentikasi](/id/gateway/authentication) diff --git a/docs/id/gateway/troubleshooting.md b/docs/id/gateway/troubleshooting.md index ac0d1bf68..0407b12e4 100644 --- a/docs/id/gateway/troubleshooting.md +++ b/docs/id/gateway/troubleshooting.md @@ -1,14 +1,14 @@ --- read_when: - - Hub pemecahan masalah mengarahkan Anda ke sini untuk diagnosis yang lebih mendalam + - Pusat pemecahan masalah mengarahkan Anda ke sini untuk diagnosis yang lebih mendalam - Anda memerlukan bagian runbook berbasis gejala yang stabil dengan perintah yang tepat -summary: Runbook pemecahan masalah mendalam untuk gateway, channel, otomasi, node, dan browser +summary: Runbook pemecahan masalah mendalam untuk gateway, channel, otomatisasi, node, dan browser title: Pemecahan masalah x-i18n: - generated_at: "2026-04-11T02:45:10Z" + generated_at: "2026-04-20T09:27:35Z" model: gpt-5.4 provider: openai - source_hash: 7ef2faccba26ede307861504043a6415bc1f12dc64407771106f63ddc5b107f5 + source_hash: d93a82407dbb1314b91a809ff9433114e1e9a3b56d46547ef53a8196bac06260 source_path: gateway/troubleshooting.md workflow: 15 --- @@ -18,7 +18,7 @@ x-i18n: Halaman ini adalah runbook mendalam. Mulai dari [/help/troubleshooting](/id/help/troubleshooting) jika Anda ingin alur triase cepat terlebih dahulu. -## Tingkatan perintah +## Tangga perintah Jalankan ini terlebih dahulu, dalam urutan berikut: @@ -32,12 +32,12 @@ openclaw channels status --probe Sinyal sehat yang diharapkan: -- `openclaw gateway status` menampilkan `Runtime: running` dan `RPC probe: ok`. -- `openclaw doctor` melaporkan tidak ada masalah config/layanan yang memblokir. +- `openclaw gateway status` menampilkan `Runtime: running`, `Connectivity probe: ok`, dan baris `Capability: ...`. +- `openclaw doctor` melaporkan tidak ada masalah konfigurasi/layanan yang memblokir. - `openclaw channels status --probe` menampilkan status transport per akun secara live dan, jika didukung, hasil probe/audit seperti `works` atau `audit ok`. -## Anthropic 429 extra usage required for long context +## Anthropic 429 memerlukan penggunaan tambahan untuk konteks panjang Gunakan ini saat log/error mencakup: `HTTP 429: rate_limit_error: Extra usage is required for long context requests`. @@ -48,17 +48,17 @@ openclaw models status openclaw config get agents.defaults.models ``` -Perhatikan: +Periksa: - Model Anthropic Opus/Sonnet yang dipilih memiliki `params.context1m: true`. - Kredensial Anthropic saat ini tidak memenuhi syarat untuk penggunaan konteks panjang. -- Permintaan gagal hanya pada sesi panjang/eksekusi model yang memerlukan jalur beta 1M. +- Permintaan gagal hanya pada sesi panjang/jalankan model yang memerlukan jalur beta 1M. Opsi perbaikan: 1. Nonaktifkan `context1m` untuk model tersebut agar kembali ke jendela konteks normal. 2. Gunakan kredensial Anthropic yang memenuhi syarat untuk permintaan konteks panjang, atau beralih ke Anthropic API key. -3. Konfigurasikan model fallback agar eksekusi tetap berlanjut saat permintaan konteks panjang Anthropic ditolak. +3. Konfigurasikan model fallback agar proses tetap berjalan saat permintaan konteks panjang Anthropic ditolak. Terkait: @@ -66,13 +66,13 @@ Terkait: - [/reference/token-use](/id/reference/token-use) - [/help/faq#why-am-i-seeing-http-429-ratelimiterror-from-anthropic](/id/help/faq#why-am-i-seeing-http-429-ratelimiterror-from-anthropic) -## Backend lokal yang kompatibel dengan OpenAI lolos probe langsung tetapi eksekusi agen gagal +## Backend lokal yang kompatibel dengan OpenAI lolos probe langsung tetapi jalankan agent gagal Gunakan ini saat: - `curl ... /v1/models` berfungsi -- pemanggilan langsung kecil ke `/v1/chat/completions` berfungsi -- eksekusi model OpenClaw gagal hanya pada giliran agen normal +- panggilan `/v1/chat/completions` langsung yang kecil berfungsi +- jalankan model OpenClaw gagal hanya pada giliran agent normal ```bash curl http://127.0.0.1:1234/v1/models @@ -83,33 +83,34 @@ openclaw infer model run --model --prompt "hi" --json openclaw logs --follow ``` -Perhatikan: +Periksa: -- pemanggilan langsung kecil berhasil, tetapi eksekusi OpenClaw gagal hanya pada prompt yang lebih besar +- panggilan langsung kecil berhasil, tetapi jalankan OpenClaw gagal hanya pada prompt yang lebih besar - error backend tentang `messages[].content` yang mengharapkan string -- crash backend yang hanya muncul pada jumlah token prompt yang lebih besar atau prompt runtime agen penuh +- crash backend yang hanya muncul dengan jumlah token prompt yang lebih besar atau prompt runtime agent penuh -Tanda umum: +Ciri umum: - `messages[...].content: invalid type: sequence, expected a string` → backend - menolak bagian konten Chat Completions terstruktur. Perbaikan: atur + menolak bagian konten Chat Completions yang terstruktur. Perbaikan: tetapkan `models.providers..models[].compat.requiresStringContent: true`. -- permintaan langsung kecil berhasil, tetapi eksekusi agen OpenClaw gagal dengan crash backend/model - (misalnya Gemma pada beberapa build `inferrs`) → transport OpenClaw - kemungkinan sudah benar; backend gagal pada bentuk prompt runtime agen yang lebih besar. -- kegagalan berkurang setelah tools dinonaktifkan tetapi tidak hilang → schema tool memang - menjadi bagian dari tekanan, tetapi masalah yang tersisa tetap merupakan keterbatasan model/server upstream - atau bug backend. +- permintaan langsung kecil berhasil, tetapi jalankan agent OpenClaw gagal dengan crash + backend/model (misalnya Gemma pada beberapa build `inferrs`) → transport OpenClaw + kemungkinan sudah benar; backend gagal pada bentuk prompt runtime agent yang lebih besar. +- kegagalan berkurang setelah menonaktifkan tools tetapi tidak hilang → skema tool + merupakan bagian dari tekanan, tetapi masalah yang tersisa tetap kapasitas model/server + upstream atau bug backend. Opsi perbaikan: -1. Atur `compat.requiresStringContent: true` untuk backend Chat Completions yang hanya menerima string. -2. Atur `compat.supportsTools: false` untuk model/backend yang tidak dapat menangani - permukaan schema tool OpenClaw secara andal. -3. Kurangi tekanan prompt bila memungkinkan: bootstrap workspace yang lebih kecil, riwayat - sesi yang lebih pendek, model lokal yang lebih ringan, atau backend dengan dukungan konteks panjang yang lebih kuat. -4. Jika permintaan langsung kecil terus berhasil sementara giliran agen OpenClaw masih crash - di dalam backend, anggap ini sebagai keterbatasan server/model upstream dan ajukan +1. Tetapkan `compat.requiresStringContent: true` untuk backend Chat Completions yang hanya mendukung string. +2. Tetapkan `compat.supportsTools: false` untuk model/backend yang tidak dapat menangani + permukaan skema tool OpenClaw secara andal. +3. Kurangi tekanan prompt jika memungkinkan: bootstrap workspace yang lebih kecil, riwayat + sesi yang lebih pendek, model lokal yang lebih ringan, atau backend dengan dukungan + konteks panjang yang lebih kuat. +4. Jika permintaan langsung kecil terus lolos sementara giliran agent OpenClaw tetap crash + di dalam backend, anggap ini sebagai keterbatasan server/model upstream dan buat repro di sana dengan bentuk payload yang diterima. Terkait: @@ -120,7 +121,7 @@ Terkait: ## Tidak ada balasan -Jika channel aktif tetapi tidak ada yang membalas, periksa routing dan kebijakan sebelum menyambungkan ulang apa pun. +Jika channel aktif tetapi tidak ada yang menjawab, periksa routing dan kebijakan sebelum menyambungkan ulang apa pun. ```bash openclaw status @@ -130,16 +131,16 @@ openclaw config get channels openclaw logs --follow ``` -Perhatikan: +Periksa: - Pairing tertunda untuk pengirim DM. -- Pengaturan mention grup (`requireMention`, `mentionPatterns`). +- Pembatasan mention grup (`requireMention`, `mentionPatterns`). - Ketidakcocokan allowlist channel/grup. -Tanda umum: +Ciri umum: - `drop guild message (mention required` → pesan grup diabaikan sampai ada mention. -- `pairing request` → pengirim memerlukan persetujuan. +- `pairing request` → pengirim perlu persetujuan. - `blocked` / `allowlist` → pengirim/channel difilter oleh kebijakan. Terkait: @@ -148,9 +149,9 @@ Terkait: - [/channels/pairing](/id/channels/pairing) - [/channels/groups](/id/channels/groups) -## Konektivitas dashboard control ui +## Konektivitas control UI dashboard -Saat dashboard/control UI tidak dapat terhubung, validasi URL, mode auth, dan asumsi secure context. +Saat dashboard/control UI tidak dapat terhubung, validasi URL, mode auth, dan asumsi konteks aman. ```bash openclaw gateway status @@ -160,13 +161,13 @@ openclaw doctor openclaw gateway status --json ``` -Perhatikan: +Periksa: - URL probe dan URL dashboard sudah benar. - Ketidakcocokan mode auth/token antara klien dan gateway. -- Penggunaan HTTP saat identitas perangkat diperlukan. +- Penggunaan HTTP ketika identitas perangkat diperlukan. -Tanda umum: +Ciri umum: - `device identity required` → konteks tidak aman atau auth perangkat tidak ada. - `origin not allowed` → `Origin` browser tidak ada di `gateway.controlUi.allowedOrigins` @@ -174,33 +175,35 @@ Tanda umum: allowlist eksplisit). - `device nonce required` / `device nonce mismatch` → klien tidak menyelesaikan alur auth perangkat berbasis challenge (`connect.challenge` + `device.nonce`). -- `device signature invalid` / `device signature expired` → klien menandatangani payload yang salah - (atau timestamp basi) untuk handshake saat ini. +- `device signature invalid` / `device signature expired` → klien menandatangani payload + yang salah (atau timestamp lama) untuk handshake saat ini. - `AUTH_TOKEN_MISMATCH` dengan `canRetryWithDeviceToken=true` → klien dapat melakukan satu kali retry tepercaya dengan token perangkat yang di-cache. -- Retry token cache itu menggunakan kembali kumpulan scope yang di-cache dan disimpan bersama - token perangkat yang telah dipasangkan. Pemanggil `deviceToken` eksplisit / `scopes` eksplisit mempertahankan +- Retry token yang di-cache tersebut menggunakan kembali kumpulan scope yang di-cache dan disimpan bersama + token perangkat yang telah dipasangkan. Pemanggil `deviceToken` eksplisit / `scopes` eksplisit tetap mempertahankan kumpulan scope yang diminta. -- Di luar jalur retry itu, prioritas auth connect bersifat eksplisit: - shared token/password terlebih dahulu, lalu `deviceToken` eksplisit, lalu token perangkat tersimpan, - lalu bootstrap token. +- Di luar jalur retry itu, prioritas auth connect adalah shared + token/password eksplisit terlebih dahulu, lalu `deviceToken` eksplisit, lalu token perangkat tersimpan, + lalu token bootstrap. - Pada jalur async Tailscale Serve Control UI, upaya gagal untuk - `{scope, ip}` yang sama diserialkan sebelum limiter mencatat kegagalan. Oleh karena itu, dua retry bersamaan yang buruk dari klien yang sama dapat menampilkan `retry later` - pada percobaan kedua alih-alih dua ketidakcocokan biasa. -- `too many failed authentication attempts (retry later)` dari klien loopback browser-origin - → kegagalan berulang dari `Origin` ternormalisasi yang sama dikunci sementara; origin localhost lain menggunakan bucket terpisah. -- `unauthorized` berulang setelah retry tersebut → shared token/device token berubah; segarkan config token dan setujui ulang/rotasi token perangkat bila perlu. + `{scope, ip}` yang sama diserialkan sebelum limiter mencatat kegagalan. Karena itu, dua retry buruk yang + bersamaan dari klien yang sama dapat memunculkan `retry later` + pada percobaan kedua, bukan dua mismatch biasa. +- `too many failed authentication attempts (retry later)` dari klien loopback + origin browser → kegagalan berulang dari `Origin` yang sama yang telah dinormalisasi akan + diblokir sementara; origin localhost lain menggunakan bucket terpisah. +- `unauthorized` berulang setelah retry itu → shared token/token perangkat drift; segarkan konfigurasi token dan setujui ulang/putar token perangkat jika diperlukan. - `gateway connect failed:` → target host/port/url salah. ### Peta cepat kode detail auth Gunakan `error.details.code` dari respons `connect` yang gagal untuk memilih tindakan berikutnya: -| Kode detail | Arti | Tindakan yang direkomendasikan | -| ---------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `AUTH_TOKEN_MISSING` | Klien tidak mengirim shared token yang diperlukan. | Tempel/atur token di klien lalu coba lagi. Untuk jalur dashboard: `openclaw config get gateway.auth.token` lalu tempel ke pengaturan Control UI. | -| `AUTH_TOKEN_MISMATCH` | Shared token tidak cocok dengan token auth gateway. | Jika `canRetryWithDeviceToken=true`, izinkan satu retry tepercaya. Retry token cache menggunakan kembali scope yang disetujui dan disimpan; pemanggil `deviceToken` / `scopes` eksplisit mempertahankan scope yang diminta. Jika masih gagal, jalankan [daftar periksa pemulihan token drift](/cli/devices#token-drift-recovery-checklist). | -| `AUTH_DEVICE_TOKEN_MISMATCH` | Token per-perangkat yang di-cache sudah basi atau dicabut. | Putar/setujui ulang token perangkat menggunakan [devices CLI](/cli/devices), lalu sambungkan kembali. | -| `PAIRING_REQUIRED` | Identitas perangkat diketahui tetapi belum disetujui untuk peran ini. | Setujui permintaan tertunda: `openclaw devices list` lalu `openclaw devices approve `. | +| Kode detail | Arti | Tindakan yang direkomendasikan | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `AUTH_TOKEN_MISSING` | Klien tidak mengirim shared token yang diwajibkan. | Tempel/tetapkan token di klien lalu coba lagi. Untuk jalur dashboard: `openclaw config get gateway.auth.token` lalu tempel ke pengaturan Control UI. | +| `AUTH_TOKEN_MISMATCH` | Shared token tidak cocok dengan token auth gateway. | Jika `canRetryWithDeviceToken=true`, izinkan satu retry tepercaya. Retry token yang di-cache menggunakan kembali scope yang disetujui dan disimpan; pemanggil `deviceToken` / `scopes` eksplisit mempertahankan scope yang diminta. Jika masih gagal, jalankan [checklist pemulihan drift token](/cli/devices#token-drift-recovery-checklist). | +| `AUTH_DEVICE_TOKEN_MISMATCH` | Token per-perangkat yang di-cache sudah usang atau dicabut. | Putar/setujui ulang token perangkat menggunakan [devices CLI](/cli/devices), lalu sambungkan kembali. | +| `PAIRING_REQUIRED` | Identitas perangkat memerlukan persetujuan. Periksa `error.details.reason` untuk `not-paired`, `scope-upgrade`, `role-upgrade`, atau `metadata-upgrade`, dan gunakan `requestId` / `remediationHint` jika ada. | Setujui permintaan tertunda: `openclaw devices list` lalu `openclaw devices approve `. Peningkatan scope/peran menggunakan alur yang sama setelah Anda meninjau akses yang diminta. | Pemeriksaan migrasi auth perangkat v2: @@ -213,12 +216,12 @@ openclaw gateway status Jika log menampilkan error nonce/signature, perbarui klien yang terhubung dan verifikasi bahwa klien: 1. menunggu `connect.challenge` -2. menandatangani payload yang terikat pada challenge +2. menandatangani payload yang terikat ke challenge 3. mengirim `connect.params.device.nonce` dengan nonce challenge yang sama -Jika `openclaw devices rotate` / `revoke` / `remove` ditolak secara tak terduga: +Jika `openclaw devices rotate` / `revoke` / `remove` ditolak secara tidak terduga: -- sesi token paired-device hanya dapat mengelola **perangkatnya sendiri** kecuali +- sesi token paired-device hanya dapat mengelola **perangkat mereka sendiri** kecuali pemanggil juga memiliki `operator.admin` - `openclaw devices rotate --scope ...` hanya dapat meminta scope operator yang sudah dimiliki oleh sesi pemanggil @@ -233,7 +236,7 @@ Terkait: ## Layanan gateway tidak berjalan -Gunakan ini saat layanan sudah terinstal tetapi proses tidak tetap berjalan. +Gunakan ini saat layanan terpasang tetapi proses tidak tetap berjalan. ```bash openclaw gateway status @@ -243,20 +246,20 @@ openclaw doctor openclaw gateway status --deep # juga memindai layanan tingkat sistem ``` -Perhatikan: +Periksa: - `Runtime: stopped` dengan petunjuk exit. -- Ketidakcocokan config layanan (`Config (cli)` vs `Config (service)`). +- Ketidakcocokan konfigurasi layanan (`Config (cli)` vs `Config (service)`). - Konflik port/listener. - Instalasi launchd/systemd/schtasks tambahan saat `--deep` digunakan. - Petunjuk pembersihan `Other gateway-like services detected (best effort)`. -Tanda umum: +Ciri umum: -- `Gateway start blocked: set gateway.mode=local` atau `existing config is missing gateway.mode` → mode gateway lokal tidak diaktifkan, atau file config tertimpa dan kehilangan `gateway.mode`. Perbaikan: atur `gateway.mode="local"` dalam config Anda, atau jalankan ulang `openclaw onboard --mode local` / `openclaw setup` untuk menulis ulang config mode lokal yang diharapkan. Jika Anda menjalankan OpenClaw melalui Podman, jalur config default adalah `~/.openclaw/openclaw.json`. +- `Gateway start blocked: set gateway.mode=local` atau `existing config is missing gateway.mode` → mode gateway lokal tidak diaktifkan, atau file konfigurasi tertimpa dan kehilangan `gateway.mode`. Perbaikan: tetapkan `gateway.mode="local"` di konfigurasi Anda, atau jalankan kembali `openclaw onboard --mode local` / `openclaw setup` untuk menerapkan ulang konfigurasi mode lokal yang diharapkan. Jika Anda menjalankan OpenClaw melalui Podman, path konfigurasi default adalah `~/.openclaw/openclaw.json`. - `refusing to bind gateway ... without auth` → bind non-loopback tanpa jalur auth gateway yang valid (token/password, atau trusted-proxy jika dikonfigurasi). - `another gateway instance is already listening` / `EADDRINUSE` → konflik port. -- `Other gateway-like services detected (best effort)` → unit launchd/systemd/schtasks yang basi atau paralel masih ada. Sebagian besar setup sebaiknya mempertahankan satu gateway per mesin; jika Anda memang memerlukan lebih dari satu, isolasikan port + config/status/workspace. Lihat [/gateway#multiple-gateways-same-host](/id/gateway#multiple-gateways-same-host). +- `Other gateway-like services detected (best effort)` → unit launchd/systemd/schtasks yang usang atau paralel masih ada. Sebagian besar setup sebaiknya mempertahankan satu gateway per mesin; jika Anda memang memerlukan lebih dari satu, pisahkan port + konfigurasi/state/workspace. Lihat [/gateway#multiple-gateways-same-host](/id/gateway#multiple-gateways-same-host). Terkait: @@ -264,9 +267,9 @@ Terkait: - [/gateway/configuration](/id/gateway/configuration) - [/gateway/doctor](/id/gateway/doctor) -## Peringatan probe Gateway +## Peringatan probe gateway -Gunakan ini saat `openclaw gateway probe` mencapai sesuatu, tetapi tetap menampilkan blok peringatan. +Gunakan ini saat `openclaw gateway probe` menjangkau sesuatu, tetapi masih menampilkan blok peringatan. ```bash openclaw gateway probe @@ -274,16 +277,17 @@ openclaw gateway probe --json openclaw gateway probe --ssh user@gateway-host ``` -Perhatikan: +Periksa: - `warnings[].code` dan `primaryTargetId` dalam output JSON. -- Apakah peringatannya tentang fallback SSH, beberapa gateway, scope yang hilang, atau auth ref yang tidak terselesaikan. +- Apakah peringatannya tentang fallback SSH, beberapa gateway, scope yang hilang, atau referensi auth yang tidak terselesaikan. -Tanda umum: +Ciri umum: -- `SSH tunnel failed to start; falling back to direct probes.` → penyiapan SSH gagal, tetapi perintah tetap mencoba target langsung yang dikonfigurasi/loopback. -- `multiple reachable gateways detected` → lebih dari satu target merespons. Biasanya ini berarti setup multi-gateway yang disengaja atau listener yang basi/duplikat. -- `Probe diagnostics are limited by gateway scopes (missing operator.read)` → connect berhasil, tetapi detail RPC dibatasi oleh scope; pasangkan identitas perangkat atau gunakan kredensial dengan `operator.read`. +- `SSH tunnel failed to start; falling back to direct probes.` → setup SSH gagal, tetapi perintah tetap mencoba target langsung yang dikonfigurasi/loopback. +- `multiple reachable gateways detected` → lebih dari satu target merespons. Biasanya ini berarti setup multi-gateway yang disengaja atau listener yang usang/duplikat. +- `Read-probe diagnostics are limited by gateway scopes (missing operator.read)` → koneksi berhasil, tetapi detail RPC dibatasi oleh scope; pasangkan identitas perangkat atau gunakan kredensial dengan `operator.read`. +- `Capability: pairing-pending` atau `gateway closed (1008): pairing required` → gateway merespons, tetapi klien ini masih memerlukan pairing/persetujuan sebelum akses operator normal. - teks peringatan SecretRef `gateway.auth.*` / `gateway.remote.*` yang tidak terselesaikan → materi auth tidak tersedia di jalur perintah ini untuk target yang gagal. Terkait: @@ -292,9 +296,9 @@ Terkait: - [/gateway#multiple-gateways-same-host](/id/gateway#multiple-gateways-same-host) - [/gateway/remote](/id/gateway/remote) -## Pesan channel terhubung tetapi tidak mengalir +## Channel terhubung tetapi pesan tidak mengalir -Jika status channel terhubung tetapi aliran pesan mati, fokuslah pada kebijakan, izin, dan aturan pengiriman spesifik channel. +Jika status channel terhubung tetapi aliran pesan mati, fokus pada kebijakan, izin, dan aturan pengiriman khusus channel. ```bash openclaw channels status --probe @@ -304,13 +308,13 @@ openclaw logs --follow openclaw config get channels ``` -Perhatikan: +Periksa: - Kebijakan DM (`pairing`, `allowlist`, `open`, `disabled`). - Allowlist grup dan persyaratan mention. - Izin/scope API channel yang hilang. -Tanda umum: +Ciri umum: - `mention required` → pesan diabaikan oleh kebijakan mention grup. - jejak `pairing` / persetujuan tertunda → pengirim belum disetujui. @@ -323,9 +327,9 @@ Terkait: - [/channels/telegram](/id/channels/telegram) - [/channels/discord](/id/channels/discord) -## Pengiriman cron dan heartbeat +## Pengiriman Cron dan Heartbeat -Jika cron atau heartbeat tidak berjalan atau tidak terkirim, verifikasi status scheduler terlebih dahulu, lalu target pengirimannya. +Jika Cron atau Heartbeat tidak berjalan atau tidak terkirim, verifikasi status scheduler terlebih dahulu, lalu target pengiriman. ```bash openclaw cron status @@ -335,21 +339,21 @@ openclaw system heartbeat last openclaw logs --follow ``` -Perhatikan: +Periksa: -- Cron diaktifkan dan waktu bangun berikutnya ada. +- Cron diaktifkan dan waktu bangun berikutnya tersedia. - Status riwayat eksekusi job (`ok`, `skipped`, `error`). -- Alasan heartbeat dilewati (`quiet-hours`, `requests-in-flight`, `alerts-disabled`, `empty-heartbeat-file`, `no-tasks-due`). +- Alasan Heartbeat dilewati (`quiet-hours`, `requests-in-flight`, `alerts-disabled`, `empty-heartbeat-file`, `no-tasks-due`). -Tanda umum: +Ciri umum: -- `cron: scheduler disabled; jobs will not run automatically` → cron dinonaktifkan. -- `cron: timer tick failed` → tick scheduler gagal; periksa file/log/error runtime. +- `cron: scheduler disabled; jobs will not run automatically` → Cron dinonaktifkan. +- `cron: timer tick failed` → tick scheduler gagal; periksa error file/log/runtime. - `heartbeat skipped` dengan `reason=quiet-hours` → di luar jendela jam aktif. -- `heartbeat skipped` dengan `reason=empty-heartbeat-file` → `HEARTBEAT.md` ada tetapi hanya berisi baris kosong / heading markdown, sehingga OpenClaw melewati pemanggilan model. -- `heartbeat skipped` dengan `reason=no-tasks-due` → `HEARTBEAT.md` berisi blok `tasks:`, tetapi tidak ada tugas yang jatuh tempo pada tick ini. -- `heartbeat: unknown accountId` → account id tidak valid untuk target pengiriman heartbeat. -- `heartbeat skipped` dengan `reason=dm-blocked` → target heartbeat terselesaikan ke tujuan bergaya DM sementara `agents.defaults.heartbeat.directPolicy` (atau override per agen) diatur ke `block`. +- `heartbeat skipped` dengan `reason=empty-heartbeat-file` → `HEARTBEAT.md` ada tetapi hanya berisi baris kosong / heading markdown, sehingga OpenClaw melewati panggilan model. +- `heartbeat skipped` dengan `reason=no-tasks-due` → `HEARTBEAT.md` berisi blok `tasks:`, tetapi tidak ada task yang jatuh tempo pada tick ini. +- `heartbeat: unknown accountId` → account id tidak valid untuk target pengiriman Heartbeat. +- `heartbeat skipped` dengan `reason=dm-blocked` → target Heartbeat terurai menjadi tujuan bergaya DM sementara `agents.defaults.heartbeat.directPolicy` (atau override per-agent) disetel ke `block`. Terkait: @@ -359,7 +363,7 @@ Terkait: ## Tool node berpasangan gagal -Jika sebuah node sudah dipasangkan tetapi tool gagal, isolasi status foreground, izin, dan persetujuan. +Jika sebuah node sudah dipasangkan tetapi tools gagal, pisahkan kondisi foreground, izin, dan persetujuan. ```bash openclaw nodes status @@ -369,16 +373,16 @@ openclaw logs --follow openclaw status ``` -Perhatikan: +Periksa: -- Node online dengan kapabilitas yang diharapkan. +- Node online dengan capability yang diharapkan. - Pemberian izin OS untuk kamera/mikrofon/lokasi/layar. -- Persetujuan exec dan status allowlist. +- Status persetujuan exec dan allowlist. -Tanda umum: +Ciri umum: - `NODE_BACKGROUND_UNAVAILABLE` → aplikasi node harus berada di foreground. -- `*_PERMISSION_REQUIRED` / `LOCATION_PERMISSION_REQUIRED` → izin OS tidak ada. +- `*_PERMISSION_REQUIRED` / `LOCATION_PERMISSION_REQUIRED` → izin OS belum diberikan. - `SYSTEM_RUN_DENIED: approval required` → persetujuan exec tertunda. - `SYSTEM_RUN_DENIED: allowlist miss` → perintah diblokir oleh allowlist. @@ -390,7 +394,7 @@ Terkait: ## Tool browser gagal -Gunakan ini saat aksi tool browser gagal meskipun gateway sendiri sehat. +Gunakan ini saat aksi tool browser gagal meskipun gateway itu sendiri sehat. ```bash openclaw browser status @@ -400,29 +404,29 @@ openclaw logs --follow openclaw doctor ``` -Perhatikan: +Periksa: -- Apakah `plugins.allow` diatur dan menyertakan `browser`. -- Jalur executable browser valid. +- Apakah `plugins.allow` disetel dan menyertakan `browser`. +- Path executable browser valid. - Keterjangkauan profil CDP. - Ketersediaan Chrome lokal untuk profil `existing-session` / `user`. -Tanda umum: +Ciri umum: -- `unknown command "browser"` atau `unknown command 'browser'` → plugin browser bawaan dikecualikan oleh `plugins.allow`. -- tool browser hilang / tidak tersedia saat `browser.enabled=true` → `plugins.allow` mengecualikan `browser`, sehingga plugin tidak pernah dimuat. -- `Failed to start Chrome CDP on port` → proses browser gagal dijalankan. -- `browser.executablePath not found` → jalur yang dikonfigurasi tidak valid. +- `unknown command "browser"` atau `unknown command 'browser'` → Plugin browser bawaan dikecualikan oleh `plugins.allow`. +- tool browser hilang / tidak tersedia saat `browser.enabled=true` → `plugins.allow` mengecualikan `browser`, sehingga Plugin tidak pernah dimuat. +- `Failed to start Chrome CDP on port` → proses browser gagal diluncurkan. +- `browser.executablePath not found` → path yang dikonfigurasi tidak valid. - `browser.cdpUrl must be http(s) or ws(s)` → URL CDP yang dikonfigurasi menggunakan skema yang tidak didukung seperti `file:` atau `ftp:`. - `browser.cdpUrl has invalid port` → URL CDP yang dikonfigurasi memiliki port yang buruk atau di luar rentang. -- `No Chrome tabs found for profile="user"` → profil attach Chrome MCP tidak memiliki tab Chrome lokal yang terbuka. +- `No Chrome tabs found for profile="user"` → profil lampiran Chrome MCP tidak memiliki tab Chrome lokal yang terbuka. - `Remote CDP for profile "" is not reachable` → endpoint CDP remote yang dikonfigurasi tidak dapat dijangkau dari host gateway. - `Browser attachOnly is enabled ... not reachable` atau `Browser attachOnly is enabled and CDP websocket ... is not reachable` → profil attach-only tidak memiliki target yang dapat dijangkau, atau endpoint HTTP merespons tetapi WebSocket CDP tetap tidak dapat dibuka. -- `Playwright is not available in this gateway build; '' is unsupported.` → instalasi gateway saat ini tidak memiliki paket Playwright lengkap; snapshot ARIA dan screenshot halaman dasar masih dapat berfungsi, tetapi navigasi, snapshot AI, screenshot elemen pemilih CSS, dan ekspor PDF tetap tidak tersedia. +- `Playwright is not available in this gateway build; '' is unsupported.` → instalasi gateway saat ini tidak memiliki paket Playwright penuh; snapshot ARIA dan screenshot halaman dasar masih dapat berfungsi, tetapi navigasi, snapshot AI, screenshot elemen dengan selektor CSS, dan ekspor PDF tetap tidak tersedia. - `fullPage is not supported for element screenshots` → permintaan screenshot mencampurkan `--full-page` dengan `--ref` atau `--element`. -- `element screenshots are not supported for existing-session profiles; use ref from snapshot.` → pemanggilan screenshot Chrome MCP / `existing-session` harus menggunakan pengambilan halaman atau `--ref` dari snapshot, bukan CSS `--element`. -- `existing-session file uploads do not support element selectors; use ref/inputRef.` → hook upload Chrome MCP memerlukan ref snapshot, bukan selector CSS. -- `existing-session file uploads currently support one file at a time.` → kirim satu upload per pemanggilan pada profil Chrome MCP. +- `element screenshots are not supported for existing-session profiles; use ref from snapshot.` → panggilan screenshot Chrome MCP / `existing-session` harus menggunakan page capture atau `--ref` dari snapshot, bukan CSS `--element`. +- `existing-session file uploads do not support element selectors; use ref/inputRef.` → hook unggah Chrome MCP memerlukan ref snapshot, bukan selektor CSS. +- `existing-session file uploads currently support one file at a time.` → kirim satu unggahan per panggilan pada profil Chrome MCP. - `existing-session dialog handling does not support timeoutMs.` → hook dialog pada profil Chrome MCP tidak mendukung override timeout. - `response body is not supported for existing-session profiles yet.` → `responsebody` masih memerlukan browser terkelola atau profil CDP mentah. - override viewport / dark-mode / locale / offline yang basi pada profil attach-only atau CDP remote → jalankan `openclaw browser stop --browser-profile ` untuk menutup sesi kontrol aktif dan melepaskan status emulasi Playwright/CDP tanpa me-restart seluruh gateway. @@ -434,7 +438,7 @@ Terkait: ## Jika Anda melakukan upgrade dan sesuatu tiba-tiba rusak -Sebagian besar kerusakan setelah upgrade adalah config drift atau default yang lebih ketat yang sekarang diberlakukan. +Sebagian besar kerusakan setelah upgrade disebabkan oleh drift konfigurasi atau default yang lebih ketat yang kini diberlakukan. ### 1) Perilaku override auth dan URL berubah @@ -445,12 +449,12 @@ openclaw config get gateway.remote.url openclaw config get gateway.auth.mode ``` -Yang perlu diperiksa: +Yang harus diperiksa: -- Jika `gateway.mode=remote`, pemanggilan CLI mungkin menargetkan remote sementara layanan lokal Anda baik-baik saja. -- Pemanggilan `--url` eksplisit tidak melakukan fallback ke kredensial yang tersimpan. +- Jika `gateway.mode=remote`, panggilan CLI mungkin menargetkan remote sementara layanan lokal Anda baik-baik saja. +- Panggilan `--url` eksplisit tidak melakukan fallback ke kredensial yang tersimpan. -Tanda umum: +Ciri umum: - `gateway connect failed:` → target URL salah. - `unauthorized` → endpoint dapat dijangkau tetapi auth salah. @@ -465,15 +469,15 @@ openclaw gateway status openclaw logs --follow ``` -Yang perlu diperiksa: +Yang harus diperiksa: - Bind non-loopback (`lan`, `tailnet`, `custom`) memerlukan jalur auth gateway yang valid: auth shared token/password, atau deployment `trusted-proxy` non-loopback yang dikonfigurasi dengan benar. - Kunci lama seperti `gateway.token` tidak menggantikan `gateway.auth.token`. -Tanda umum: +Ciri umum: - `refusing to bind gateway ... without auth` → bind non-loopback tanpa jalur auth gateway yang valid. -- `RPC probe: failed` saat runtime berjalan → gateway hidup tetapi tidak dapat diakses dengan auth/url saat ini. +- `Connectivity probe: failed` saat runtime berjalan → gateway hidup tetapi tidak dapat diakses dengan auth/url saat ini. ### 3) Status pairing dan identitas perangkat berubah @@ -484,17 +488,17 @@ openclaw logs --follow openclaw doctor ``` -Yang perlu diperiksa: +Yang harus diperiksa: -- Persetujuan perangkat tertunda untuk dashboard/node. +- Persetujuan perangkat tertunda untuk dashboard/nodes. - Persetujuan pairing DM tertunda setelah perubahan kebijakan atau identitas. -Tanda umum: +Ciri umum: -- `device identity required` → auth perangkat tidak terpenuhi. +- `device identity required` → auth perangkat belum terpenuhi. - `pairing required` → pengirim/perangkat harus disetujui. -Jika config layanan dan runtime masih tidak cocok setelah pemeriksaan, instal ulang metadata layanan dari direktori profil/status yang sama: +Jika konfigurasi layanan dan runtime masih tidak sesuai setelah pemeriksaan, instal ulang metadata layanan dari profil/direktori state yang sama: ```bash openclaw gateway install --force diff --git a/docs/id/help/faq.md b/docs/id/help/faq.md index 5f87e15aa..f4d2cc223 100644 --- a/docs/id/help/faq.md +++ b/docs/id/help/faq.md @@ -1,21 +1,21 @@ --- read_when: - Menjawab pertanyaan umum tentang penyiapan, instalasi, onboarding, atau dukungan runtime - - Menilai masalah yang dilaporkan pengguna sebelum debug yang lebih mendalam + - Melakukan triase masalah yang dilaporkan pengguna sebelum debugging lebih lanjut summary: Pertanyaan yang sering diajukan tentang penyiapan, konfigurasi, dan penggunaan OpenClaw -title: Pertanyaan umum +title: FAQ x-i18n: - generated_at: "2026-04-19T09:06:53Z" + generated_at: "2026-04-20T09:28:04Z" model: gpt-5.4 provider: openai - source_hash: f569fb0412797314a11c41a1bbfa14f5892d2d368544fa67800823a6457000e6 + source_hash: ae8efda399e34f59f22f6ea8ce218eaf7b872e4117d8596ec19c09891d70813b source_path: help/faq.md workflow: 15 --- -# Pertanyaan umum +# FAQ -Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia nyata (dev lokal, VPS, multi-agent, kunci OAuth/API, failover model). Untuk diagnostik runtime, lihat [Troubleshooting](/id/gateway/troubleshooting). Untuk referensi konfigurasi lengkap, lihat [Configuration](/id/gateway/configuration). +Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia nyata (local dev, VPS, multi-agent, OAuth/API key, failover model). Untuk diagnostik runtime, lihat [Troubleshooting](/id/gateway/troubleshooting). Untuk referensi konfigurasi lengkap, lihat [Configuration](/id/gateway/configuration). ## 60 detik pertama jika ada yang rusak @@ -25,15 +25,15 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw status ``` - Ringkasan lokal cepat: OS + pembaruan, keterjangkauan gateway/service, agents/sessions, konfigurasi provider + masalah runtime (saat gateway dapat dijangkau). + Ringkasan lokal cepat: OS + pembaruan, keterjangkauan gateway/layanan, agent/sesi, konfigurasi provider + masalah runtime (saat gateway dapat dijangkau). -2. **Laporan yang bisa ditempel (aman untuk dibagikan)** +2. **Laporan yang bisa dibagikan dengan aman** ```bash openclaw status --all ``` - Diagnosis baca-saja dengan ekor log (token disamarkan). + Diagnosis read-only dengan log tail (token disamarkan). 3. **Status daemon + port** @@ -41,7 +41,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw gateway status ``` - Menampilkan runtime supervisor vs keterjangkauan RPC, URL target probe, dan konfigurasi mana yang kemungkinan digunakan service. + Menampilkan runtime supervisor vs keterjangkauan RPC, URL target probe, dan konfigurasi mana yang kemungkinan digunakan layanan. 4. **Probe mendalam** @@ -49,7 +49,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw status --deep ``` - Menjalankan probe kesehatan gateway langsung, termasuk probe channel saat didukung + Menjalankan probe health gateway langsung, termasuk probe channel bila didukung (memerlukan gateway yang dapat dijangkau). Lihat [Health](/id/gateway/health). 5. **Ikuti log terbaru** @@ -58,13 +58,13 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw logs --follow ``` - Jika RPC tidak aktif, gunakan cadangan ini: + Jika RPC tidak aktif, gunakan alternatif berikut: ```bash tail -f "$(ls -t /tmp/openclaw/openclaw-*.log | head -1)" ``` - Log file terpisah dari log service; lihat [Logging](/id/logging) dan [Troubleshooting](/id/gateway/troubleshooting). + Log file terpisah dari log layanan; lihat [Logging](/id/logging) dan [Troubleshooting](/id/gateway/troubleshooting). 6. **Jalankan doctor (perbaikan)** @@ -72,48 +72,48 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw doctor ``` - Memperbaiki/memigrasikan konfigurasi/status + menjalankan pemeriksaan kesehatan. Lihat [Doctor](/id/gateway/doctor). + Memperbaiki/memigrasikan konfigurasi/status + menjalankan pemeriksaan health. Lihat [Doctor](/id/gateway/doctor). 7. **Snapshot Gateway** ```bash openclaw health --json - openclaw health --verbose # menampilkan URL target + jalur config saat terjadi error + openclaw health --verbose # menampilkan URL target + path konfigurasi saat terjadi error ``` - Meminta snapshot lengkap dari gateway yang sedang berjalan (khusus WS). Lihat [Health](/id/gateway/health). + Meminta snapshot penuh dari gateway yang sedang berjalan (khusus WS). Lihat [Health](/id/gateway/health). -## Mulai cepat dan penyiapan pertama kali +## Mulai cepat dan penyiapan saat pertama kali dijalankan - - Gunakan agent AI lokal yang dapat **melihat mesin Anda**. Itu jauh lebih efektif daripada bertanya - di Discord, karena sebagian besar kasus "saya terjebak" adalah **masalah konfigurasi atau lingkungan lokal** yang - tidak dapat diperiksa oleh penolong jarak jauh. + + Gunakan agent AI lokal yang bisa **melihat mesin Anda**. Itu jauh lebih efektif daripada bertanya + di Discord, karena sebagian besar kasus "saya buntu" adalah **masalah konfigurasi lokal atau lingkungan** + yang tidak bisa diperiksa oleh orang yang membantu dari jarak jauh. - **Claude Code**: [https://www.anthropic.com/claude-code/](https://www.anthropic.com/claude-code/) - **OpenAI Codex**: [https://openai.com/codex/](https://openai.com/codex/) Alat-alat ini dapat membaca repo, menjalankan perintah, memeriksa log, dan membantu memperbaiki penyiapan - di tingkat mesin Anda (PATH, services, permissions, file auth). Berikan kepada mereka **checkout source lengkap** melalui - instalasi yang dapat diutak-atik (git): + di tingkat mesin Anda (PATH, layanan, izin, file auth). Berikan **checkout source lengkap** + melalui instalasi hackable (git): ```bash curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git ``` - Ini menginstal OpenClaw **dari checkout git**, sehingga agent dapat membaca kode + docs dan - menalar versi persis yang sedang Anda jalankan. Anda selalu dapat beralih kembali ke stable nanti + Ini memasang OpenClaw **dari checkout git**, sehingga agent dapat membaca kode + dokumentasi dan + menalar versi persis yang sedang Anda jalankan. Anda selalu bisa kembali ke stable nanti dengan menjalankan ulang installer tanpa `--install-method git`. - Tip: minta agent untuk **merencanakan dan mengawasi** perbaikannya (langkah demi langkah), lalu jalankan hanya + Tip: minta agent untuk **merencanakan dan mengawasi** perbaikannya (langkah demi langkah), lalu mengeksekusi hanya perintah yang diperlukan. Itu membuat perubahan tetap kecil dan lebih mudah diaudit. - Jika Anda menemukan bug atau perbaikan nyata, silakan buat issue GitHub atau kirim PR: + Jika Anda menemukan bug atau perbaikan yang nyata, silakan buat issue GitHub atau kirim PR: [https://github.com/openclaw/openclaw/issues](https://github.com/openclaw/openclaw/issues) [https://github.com/openclaw/openclaw/pulls](https://github.com/openclaw/openclaw/pulls) - Mulailah dengan perintah-perintah ini (bagikan output-nya saat meminta bantuan): + Mulailah dengan perintah berikut (bagikan output-nya saat meminta bantuan): ```bash openclaw status @@ -123,19 +123,19 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n Fungsinya: - - `openclaw status`: snapshot cepat kesehatan gateway/agent + konfigurasi dasar. + - `openclaw status`: snapshot cepat health gateway/agent + konfigurasi dasar. - `openclaw models status`: memeriksa auth provider + ketersediaan model. - - `openclaw doctor`: memvalidasi dan memperbaiki masalah umum konfigurasi/status. + - `openclaw doctor`: memvalidasi dan memperbaiki masalah umum pada konfigurasi/status. Pemeriksaan CLI lain yang berguna: `openclaw status --all`, `openclaw logs --follow`, `openclaw gateway status`, `openclaw health --verbose`. - Siklus debug cepat: [60 detik pertama jika ada yang rusak](#60-detik-pertama-jika-ada-yang-rusak). - Dokumen instalasi: [Install](/id/install), [Installer flags](/id/install/installer), [Updating](/id/install/updating). + Loop debug cepat: [60 detik pertama jika ada yang rusak](#60-detik-pertama-jika-ada-yang-rusak). + Dokumentasi instalasi: [Install](/id/install), [Installer flags](/id/install/installer), [Updating](/id/install/updating). - + Alasan skip Heartbeat yang umum: - `quiet-hours`: di luar jendela active-hours yang dikonfigurasi @@ -143,14 +143,14 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - `no-tasks-due`: mode tugas `HEARTBEAT.md` aktif tetapi belum ada interval tugas yang jatuh tempo - `alerts-disabled`: semua visibilitas heartbeat dinonaktifkan (`showOk`, `showAlerts`, dan `useIndicator` semuanya nonaktif) - Dalam mode tugas, cap waktu jatuh tempo hanya dimajukan setelah Heartbeat yang nyata - selesai dijalankan. Proses yang dilewati tidak menandai tugas sebagai selesai. + Dalam mode tugas, timestamp jatuh tempo hanya dimajukan setelah Heartbeat yang nyata + selesai dijalankan. Run yang dilewati tidak menandai tugas sebagai selesai. - Dokumen: [Heartbeat](/id/gateway/heartbeat), [Automation & Tasks](/id/automation). + Dokumentasi: [Heartbeat](/id/gateway/heartbeat), [Automation & Tasks](/id/automation). - + Repo merekomendasikan menjalankan dari source dan menggunakan onboarding: ```bash @@ -176,7 +176,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - Wizard membuka browser Anda dengan URL dashboard yang bersih (tanpa token) tepat setelah onboarding dan juga mencetak tautan di ringkasan. Biarkan tab itu tetap terbuka; jika tidak diluncurkan, salin/tempel URL yang dicetak pada mesin yang sama. + Wizard membuka browser Anda dengan URL dashboard yang bersih (tanpa token) tepat setelah onboarding dan juga mencetak tautannya di ringkasan. Biarkan tab itu tetap terbuka; jika tidak terbuka, salin/tempel URL yang dicetak di mesin yang sama. @@ -190,11 +190,11 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n **Bukan di localhost:** - - **Tailscale Serve** (direkomendasikan): tetap gunakan bind loopback, jalankan `openclaw gateway --tailscale serve`, buka `https:///`. Jika `gateway.auth.allowTailscale` bernilai `true`, header identitas memenuhi auth Control UI/WebSocket (tanpa menempel shared secret, mengasumsikan host gateway tepercaya); HTTP API tetap memerlukan auth shared-secret kecuali Anda sengaja menggunakan private-ingress `none` atau auth HTTP trusted-proxy. - Upaya auth Serve bersamaan yang buruk dari klien yang sama diserialkan sebelum pembatas failed-auth mencatatnya, sehingga percobaan buruk kedua sudah bisa menampilkan `retry later`. - - **Bind tailnet**: jalankan `openclaw gateway --bind tailnet --token ""` (atau konfigurasi auth kata sandi), buka `http://:18789/`, lalu tempel shared secret yang sesuai di pengaturan dashboard. - - **Reverse proxy yang sadar identitas**: biarkan Gateway berada di belakang trusted proxy non-loopback, konfigurasikan `gateway.auth.mode: "trusted-proxy"`, lalu buka URL proxy tersebut. - - **Tunnel SSH**: `ssh -N -L 18789:127.0.0.1:18789 user@host` lalu buka `http://127.0.0.1:18789/`. Auth shared-secret tetap berlaku melalui tunnel; tempel token atau kata sandi yang dikonfigurasi jika diminta. + - **Tailscale Serve** (direkomendasikan): tetap gunakan bind loopback, jalankan `openclaw gateway --tailscale serve`, buka `https:///`. Jika `gateway.auth.allowTailscale` bernilai `true`, header identitas akan memenuhi auth Control UI/WebSocket (tanpa menempelkan shared secret, dengan asumsi host gateway tepercaya); API HTTP tetap memerlukan auth shared-secret kecuali Anda sengaja menggunakan private-ingress `none` atau auth HTTP trusted-proxy. + Upaya auth Serve bersamaan yang buruk dari klien yang sama diserialkan sebelum limiter gagal-auth mencatatnya, sehingga retry buruk kedua bisa langsung menampilkan `retry later`. + - **Bind Tailnet**: jalankan `openclaw gateway --bind tailnet --token ""` (atau konfigurasikan auth kata sandi), buka `http://:18789/`, lalu tempel shared secret yang cocok di pengaturan dashboard. + - **Reverse proxy yang sadar identitas**: simpan Gateway di belakang trusted proxy non-loopback, konfigurasikan `gateway.auth.mode: "trusted-proxy"`, lalu buka URL proxy. + - **Tunneling SSH**: `ssh -N -L 18789:127.0.0.1:18789 user@host` lalu buka `http://127.0.0.1:18789/`. Auth shared-secret tetap berlaku melalui tunnel; tempel token atau kata sandi yang dikonfigurasi jika diminta. Lihat [Dashboard](/web/dashboard) dan [Web surfaces](/web) untuk detail mode bind dan auth. @@ -204,59 +204,59 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n Keduanya mengendalikan lapisan yang berbeda: - `approvals.exec`: meneruskan prompt persetujuan ke tujuan chat - - `channels..execApprovals`: membuat channel itu bertindak sebagai klien persetujuan native untuk persetujuan exec + - `channels..execApprovals`: membuat channel tersebut bertindak sebagai klien persetujuan native untuk persetujuan exec - Kebijakan exec host tetap menjadi gerbang persetujuan yang sebenarnya. Konfigurasi chat hanya mengendalikan di mana prompt persetujuan - muncul dan bagaimana orang dapat menjawabnya. + Kebijakan exec host tetap menjadi gerbang persetujuan yang sebenarnya. Konfigurasi chat hanya mengendalikan ke mana prompt persetujuan + muncul dan bagaimana orang bisa menjawabnya. - Dalam sebagian besar penyiapan, Anda **tidak** memerlukan keduanya: + Dalam sebagian besar penyiapan Anda **tidak** memerlukan keduanya: - - Jika chat sudah mendukung perintah dan balasan, `/approve` di chat yang sama berfungsi melalui jalur bersama. - - Jika channel native yang didukung dapat menyimpulkan approver dengan aman, OpenClaw sekarang mengaktifkan persetujuan native DM-first secara otomatis saat `channels..execApprovals.enabled` tidak disetel atau `"auto"`. - - Saat kartu/tombol persetujuan native tersedia, UI native itu adalah jalur utama; agent hanya boleh menyertakan perintah `/approve` manual jika hasil alat mengatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur. - - Gunakan `approvals.exec` hanya jika prompt juga harus diteruskan ke chat lain atau ruang ops eksplisit. - - Gunakan `channels..execApprovals.target: "channel"` atau `"both"` hanya saat Anda secara eksplisit ingin prompt persetujuan diposting kembali ke room/topic asal. - - Persetujuan Plugin terpisah lagi: secara default mereka menggunakan `/approve` di chat yang sama, penerusan `approvals.plugin` opsional, dan hanya beberapa channel native yang tetap menambahkan penanganan native persetujuan Plugin di atasnya. + - Jika chat sudah mendukung perintah dan balasan, `/approve` di chat yang sama bekerja melalui jalur bersama. + - Jika channel native yang didukung dapat menyimpulkan approver dengan aman, OpenClaw sekarang mengaktifkan otomatis persetujuan native DM-first saat `channels..execApprovals.enabled` tidak disetel atau bernilai `"auto"`. + - Saat kartu/tombol persetujuan native tersedia, UI native tersebut adalah jalur utama; agent hanya boleh menyertakan perintah `/approve` manual jika hasil alat menyatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur. + - Gunakan `approvals.exec` hanya saat prompt juga harus diteruskan ke chat lain atau ruang ops eksplisit. + - Gunakan `channels..execApprovals.target: "channel"` atau `"both"` hanya jika Anda secara eksplisit ingin prompt persetujuan diposting kembali ke room/topik asal. + - Persetujuan Plugin terpisah lagi: secara default menggunakan `/approve` di chat yang sama, penerusan `approvals.plugin` opsional, dan hanya beberapa channel native yang tetap menangani plugin approval native di atasnya. - Versi singkatnya: penerusan adalah untuk routing, konfigurasi klien native adalah untuk UX khusus channel yang lebih kaya. + Versi singkatnya: forwarding untuk perutean, konfigurasi klien native untuk UX yang lebih kaya dan spesifik per channel. Lihat [Exec Approvals](/id/tools/exec-approvals). - Node **>= 22** diperlukan. `pnpm` direkomendasikan. Bun **tidak direkomendasikan** untuk Gateway. + Node **>= 22** wajib. `pnpm` direkomendasikan. Bun **tidak direkomendasikan** untuk Gateway. - Ya. Gateway ringan - dokumen menyebutkan **512MB-1GB RAM**, **1 core**, dan sekitar **500MB** - disk sudah cukup untuk penggunaan pribadi, dan mencatat bahwa **Raspberry Pi 4 dapat menjalankannya**. + Ya. Gateway bersifat ringan - dokumentasi mencantumkan **512MB-1GB RAM**, **1 core**, dan sekitar **500MB** + disk sebagai cukup untuk penggunaan pribadi, dan menyebutkan bahwa **Raspberry Pi 4 dapat menjalankannya**. - Jika Anda menginginkan ruang lebih (log, media, service lain), **2GB direkomendasikan**, tetapi itu - bukan minimum yang keras. + Jika Anda ingin ruang tambahan (log, media, layanan lain), **2GB direkomendasikan**, tetapi + bukan minimum yang wajib. - Tip: Pi/VPS kecil dapat meng-host Gateway, dan Anda dapat memasangkan **Node** di laptop/ponsel Anda untuk + Tip: Pi/VPS kecil dapat meng-host Gateway, dan Anda dapat mem-pairing **node** di laptop/ponsel untuk screen/camera/canvas lokal atau eksekusi perintah. Lihat [Nodes](/id/nodes). - Versi singkat: ini berfungsi, tetapi bersiaplah menghadapi beberapa sisi kasar. + Versi singkat: bisa, tetapi harapkan ada beberapa kendala. - - Gunakan OS **64-bit** dan tetap gunakan Node >= 22. - - Pilih instalasi **hackable (git)** agar Anda dapat melihat log dan memperbarui dengan cepat. - - Mulai tanpa channels/Skills, lalu tambahkan satu per satu. - - Jika Anda menemui masalah biner yang aneh, biasanya itu adalah masalah **kompatibilitas ARM**. + - Gunakan OS **64-bit** dan pertahankan Node >= 22. + - Pilih **instalasi hackable (git)** agar Anda bisa melihat log dan memperbarui dengan cepat. + - Mulailah tanpa channel/Skills, lalu tambahkan satu per satu. + - Jika Anda mengalami masalah binary yang aneh, biasanya itu adalah masalah **kompatibilitas ARM**. - Dokumen: [Linux](/id/platforms/linux), [Install](/id/install). + Dokumentasi: [Linux](/id/platforms/linux), [Install](/id/install). - + Layar itu bergantung pada Gateway yang dapat dijangkau dan diautentikasi. TUI juga mengirim - "Wake up, my friend!" secara otomatis pada hatch pertama. Jika Anda melihat baris itu dengan **tanpa balasan** - dan token tetap 0, agent tidak pernah berjalan. + "Wake up, my friend!" secara otomatis saat hatch pertama. Jika Anda melihat baris itu tanpa **balasan** + dan token tetap 0, berarti agent tidak pernah berjalan. - 1. Restart Gateway: + 1. Mulai ulang Gateway: ```bash openclaw gateway restart @@ -276,29 +276,29 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw doctor ``` - Jika Gateway berada di remote, pastikan koneksi tunnel/Tailscale aktif dan UI - mengarah ke Gateway yang benar. Lihat [Remote access](/id/gateway/remote). + Jika Gateway bersifat remote, pastikan koneksi tunnel/Tailscale aktif dan UI + diarahkan ke Gateway yang benar. Lihat [Remote access](/id/gateway/remote). - - Ya. Salin **direktori state** dan **workspace**, lalu jalankan Doctor sekali. Ini + + Ya. Salin **direktori status** dan **workspace**, lalu jalankan Doctor sekali. Ini menjaga bot Anda "tetap sama persis" (memori, riwayat sesi, auth, dan - status channel) selama Anda menyalin **kedua** lokasi tersebut: + status channel) selama Anda menyalin **kedua** lokasi berikut: - 1. Instal OpenClaw di mesin baru. + 1. Pasang OpenClaw di mesin baru. 2. Salin `$OPENCLAW_STATE_DIR` (default: `~/.openclaw`) dari mesin lama. 3. Salin workspace Anda (default: `~/.openclaw/workspace`). - 4. Jalankan `openclaw doctor` dan restart service Gateway. + 4. Jalankan `openclaw doctor` dan mulai ulang layanan Gateway. - Itu mempertahankan config, profil auth, kredensial WhatsApp, sesi, dan memori. Jika Anda berada dalam - mode remote, ingat bahwa host gateway memiliki session store dan workspace. + Itu mempertahankan konfigurasi, profil auth, kredensial WhatsApp, sesi, dan memori. Jika Anda berada dalam + mode remote, ingat bahwa host gateway memiliki penyimpanan sesi dan workspace. - **Penting:** jika Anda hanya commit/push workspace Anda ke GitHub, Anda mencadangkan - **memori + file bootstrap**, tetapi **bukan** riwayat sesi atau auth. Keduanya berada + **Penting:** jika Anda hanya commit/push workspace Anda ke GitHub, Anda sedang mencadangkan + **memori + file bootstrap**, tetapi **bukan** riwayat sesi atau auth. Semuanya itu berada di bawah `~/.openclaw/` (misalnya `~/.openclaw/agents//sessions/`). - Terkait: [Migrating](/id/install/migrating), [Tempat berbagai hal disimpan di disk](#tempat-berbagai-hal-disimpan-di-disk), + Terkait: [Migrating](/id/install/migrating), [Lokasi penyimpanan di disk](#where-things-live-on-disk), [Workspace agent](/id/concepts/agent-workspace), [Doctor](/id/gateway/doctor), [Mode remote](/id/gateway/remote). @@ -308,18 +308,18 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n Periksa changelog GitHub: [https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md](https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md) - Entri terbaru ada di bagian atas. Jika bagian teratas ditandai **Unreleased**, bagian bertanggal berikutnya - adalah versi rilis terbaru. Entri dikelompokkan berdasarkan **Highlights**, **Changes**, dan + Entri terbaru ada di bagian atas. Jika bagian paling atas ditandai **Unreleased**, maka bagian + bertanggal berikutnya adalah versi terbaru yang sudah dirilis. Entri dikelompokkan berdasarkan **Highlights**, **Changes**, dan **Fixes** (ditambah bagian docs/lainnya bila diperlukan). - Beberapa koneksi Comcast/Xfinity salah memblokir `docs.openclaw.ai` melalui Xfinity - Advanced Security. Nonaktifkan fitur itu atau tambahkan `docs.openclaw.ai` ke allowlist, lalu coba lagi. - Mohon bantu kami membuka blokirnya dengan melapor di sini: [https://spa.xfinity.com/check_url_status](https://spa.xfinity.com/check_url_status). + Beberapa koneksi Comcast/Xfinity secara keliru memblokir `docs.openclaw.ai` melalui Xfinity + Advanced Security. Nonaktifkan fitur itu atau masukkan `docs.openclaw.ai` ke allowlist, lalu coba lagi. + Tolong bantu kami membuka blokirnya dengan melapor di sini: [https://spa.xfinity.com/check_url_status](https://spa.xfinity.com/check_url_status). - Jika Anda masih tidak bisa menjangkau situs tersebut, docs dicerminkan di GitHub: + Jika Anda masih tidak dapat mengakses situs tersebut, dokumentasinya dicerminkan di GitHub: [https://github.com/openclaw/openclaw/tree/main/docs](https://github.com/openclaw/openclaw/tree/main/docs) @@ -332,7 +332,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n Biasanya, rilis stable masuk ke **beta** terlebih dahulu, lalu langkah promosi eksplisit memindahkan versi yang sama itu ke `latest`. Maintainer juga dapat - menerbitkan langsung ke `latest` bila diperlukan. Itulah sebabnya beta dan stable dapat + memublikasikan langsung ke `latest` bila diperlukan. Itulah sebabnya beta dan stable dapat menunjuk ke **versi yang sama** setelah promosi. Lihat apa yang berubah: @@ -342,9 +342,9 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - + **Beta** adalah npm dist-tag `beta` (dapat sama dengan `latest` setelah promosi). - **Dev** adalah head bergerak dari `main` (git); saat dipublikasikan, ia menggunakan npm dist-tag `dev`. + **Dev** adalah head yang terus bergerak dari `main` (git); saat dipublikasikan, ia menggunakan npm dist-tag `dev`. One-liner (macOS/Linux): @@ -372,7 +372,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw update --channel dev ``` - Ini beralih ke branch `main` dan memperbarui dari source. + Ini akan beralih ke branch `main` dan memperbarui dari source. 2. **Instalasi hackable (dari situs installer):** @@ -380,7 +380,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git ``` - Itu memberi Anda repo lokal yang bisa Anda edit, lalu perbarui melalui git. + Itu memberi Anda repo lokal yang dapat Anda edit, lalu perbarui melalui git. Jika Anda lebih suka clone bersih secara manual, gunakan: @@ -391,23 +391,23 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n pnpm build ``` - Dokumen: [Update](/cli/update), [Development channels](/id/install/development-channels), + Dokumentasi: [Update](/cli/update), [Development channels](/id/install/development-channels), [Install](/id/install). - - Panduan kasar: + + Perkiraan kasar: - **Instalasi:** 2-5 menit - - **Onboarding:** 5-15 menit tergantung berapa banyak channels/models yang Anda konfigurasi + - **Onboarding:** 5-15 menit tergantung berapa banyak channel/model yang Anda konfigurasi Jika macet, gunakan [Installer stuck](#quick-start-and-first-run-setup) - dan siklus debug cepat di [Saya terjebak](#quick-start-and-first-run-setup). + dan loop debug cepat di [Saya buntu](#quick-start-and-first-run-setup). - + Jalankan ulang installer dengan **output verbose**: ```bash @@ -440,11 +440,11 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - Dua masalah Windows yang umum: + Dua masalah umum di Windows: **1) error npm spawn git / git tidak ditemukan** - - Instal **Git for Windows** dan pastikan `git` ada di PATH Anda. + - Pasang **Git for Windows** dan pastikan `git` ada di PATH Anda. - Tutup dan buka kembali PowerShell, lalu jalankan ulang installer. **2) openclaw tidak dikenali setelah instalasi** @@ -456,20 +456,20 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n npm config get prefix ``` - - Tambahkan direktori itu ke PATH pengguna Anda (di Windows tidak perlu sufiks `\bin`; pada kebanyakan sistem itu adalah `%AppData%\npm`). + - Tambahkan direktori tersebut ke PATH pengguna Anda (tidak perlu akhiran `\bin` di Windows; pada sebagian besar sistem path-nya adalah `%AppData%\npm`). - Tutup dan buka kembali PowerShell setelah memperbarui PATH. Jika Anda menginginkan penyiapan Windows yang paling mulus, gunakan **WSL2** alih-alih Windows native. - Dokumen: [Windows](/id/platforms/windows). + Dokumentasi: [Windows](/id/platforms/windows). - + Biasanya ini adalah ketidakcocokan code page konsol pada shell Windows native. Gejala: - - Output `system.run`/`exec` merender teks Mandarin sebagai mojibake + - output `system.run`/`exec` menampilkan karakter China sebagai mojibake - Perintah yang sama terlihat baik-baik saja di profil terminal lain Solusi cepat di PowerShell: @@ -481,7 +481,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n $OutputEncoding = [System.Text.UTF8Encoding]::new($false) ``` - Lalu restart Gateway dan coba lagi perintah Anda: + Lalu mulai ulang Gateway dan coba lagi perintah Anda: ```powershell openclaw gateway restart @@ -493,9 +493,9 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - - Gunakan **instalasi hackable (git)** agar Anda memiliki source dan docs lengkap secara lokal, lalu tanyakan - bot Anda (atau Claude/Codex) _dari folder itu_ sehingga ia dapat membaca repo dan menjawab dengan tepat. + + Gunakan **instalasi hackable (git)** agar Anda memiliki source dan dokumentasi lengkap secara lokal, lalu tanyakan + kepada bot Anda (atau Claude/Codex) _dari folder tersebut_ agar ia dapat membaca repo dan menjawab dengan tepat. ```bash curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git @@ -505,17 +505,17 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - + Jawaban singkat: ikuti panduan Linux, lalu jalankan onboarding. - - Jalur cepat Linux + instalasi service: [Linux](/id/platforms/linux). + - Jalur cepat Linux + instalasi layanan: [Linux](/id/platforms/linux). - Panduan lengkap: [Getting Started](/id/start/getting-started). - Installer + pembaruan: [Install & updates](/id/install/updating). - - Linux VPS apa pun bisa digunakan. Instal di server, lalu gunakan SSH/Tailscale untuk menjangkau Gateway. + + VPS Linux apa pun bisa digunakan. Pasang di server, lalu gunakan SSH/Tailscale untuk mengakses Gateway. Panduan: [exe.dev](/id/install/exe-dev), [Hetzner](/id/install/hetzner), [Fly.io](/id/install/fly). Akses remote: [Gateway remote](/id/gateway/remote). @@ -523,7 +523,7 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - Kami menyimpan **pusat hosting** dengan provider yang umum. Pilih salah satu dan ikuti panduannya: + Kami menyediakan **pusat hosting** dengan provider yang umum. Pilih salah satu dan ikuti panduannya: - [VPS hosting](/id/vps) (semua provider di satu tempat) - [Fly.io](/id/install/fly) @@ -531,22 +531,22 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n - [exe.dev](/id/install/exe-dev) Cara kerjanya di cloud: **Gateway berjalan di server**, dan Anda mengaksesnya - dari laptop/ponsel Anda melalui Control UI (atau Tailscale/SSH). State + workspace Anda - berada di server, jadi perlakukan host sebagai sumber kebenaran dan buat cadangannya. + dari laptop/ponsel melalui Control UI (atau Tailscale/SSH). Status + workspace Anda + berada di server, jadi perlakukan host sebagai sumber kebenaran dan lakukan backup. - Anda dapat memasangkan **Node** (Mac/iOS/Android/headless) ke Gateway cloud tersebut untuk mengakses - screen/camera/canvas lokal atau menjalankan perintah di laptop Anda sambil tetap menjaga - Gateway berada di cloud. + Anda dapat mem-pairing **node** (Mac/iOS/Android/headless) ke Gateway cloud tersebut untuk mengakses + screen/camera/canvas lokal atau menjalankan perintah di laptop Anda sambil tetap menempatkan + Gateway di cloud. Pusat: [Platforms](/id/platforms). Akses remote: [Gateway remote](/id/gateway/remote). - Nodes: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes). + Node: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes). - - Jawaban singkat: **mungkin, tetapi tidak direkomendasikan**. Alur pembaruan dapat me-restart - Gateway (yang memutus sesi aktif), mungkin memerlukan checkout git yang bersih, dan - dapat meminta konfirmasi. Lebih aman: jalankan pembaruan dari shell sebagai operator. + + Jawaban singkat: **mungkin, tetapi tidak direkomendasikan**. Alur pembaruan dapat memulai ulang + Gateway (yang akan memutus sesi aktif), mungkin memerlukan checkout git yang bersih, dan + dapat meminta konfirmasi. Yang lebih aman: jalankan pembaruan dari shell sebagai operator. Gunakan CLI: @@ -558,66 +558,66 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n openclaw update --no-restart ``` - Jika Anda harus mengotomatiskannya dari agent: + Jika Anda harus mengotomatiskan dari agent: ```bash openclaw update --yes --no-restart openclaw gateway restart ``` - Dokumen: [Update](/cli/update), [Updating](/id/install/updating). + Dokumentasi: [Update](/cli/update), [Updating](/id/install/updating). - - `openclaw onboard` adalah jalur penyiapan yang direkomendasikan. Dalam **mode lokal** ini memandu Anda melalui: + + `openclaw onboard` adalah jalur penyiapan yang direkomendasikan. Dalam **mode lokal** ia memandu Anda melalui: - - **Penyiapan model/auth** (OAuth provider, kunci API, setup-token Anthropic, plus opsi model lokal seperti LM Studio) + - **Penyiapan model/auth** (OAuth provider, API key, setup-token Anthropic, ditambah opsi model lokal seperti LM Studio) - Lokasi **workspace** + file bootstrap - **Pengaturan Gateway** (bind/port/auth/tailscale) - - **Channels** (WhatsApp, Telegram, Discord, Mattermost, Signal, iMessage, plus Plugin channel bawaan seperti QQ Bot) - - **Instalasi daemon** (LaunchAgent di macOS; unit pengguna systemd di Linux/WSL2) - - **Pemeriksaan kesehatan** dan pemilihan **Skills** + - **Channel** (WhatsApp, Telegram, Discord, Mattermost, Signal, iMessage, ditambah plugin channel bawaan seperti QQ Bot) + - **Instalasi daemon** (LaunchAgent di macOS; unit systemd user di Linux/WSL2) + - Pemeriksaan **health** dan pemilihan **Skills** - Ini juga memperingatkan jika model yang Anda konfigurasi tidak dikenal atau auth-nya hilang. + Ini juga memberi peringatan jika model yang Anda konfigurasi tidak dikenal atau auth-nya tidak ada. - Tidak. Anda dapat menjalankan OpenClaw dengan **kunci API** (Anthropic/OpenAI/lainnya) atau dengan + Tidak. Anda dapat menjalankan OpenClaw dengan **API key** (Anthropic/OpenAI/lainnya) atau dengan **model lokal saja** sehingga data Anda tetap berada di perangkat Anda. Langganan (Claude Pro/Max atau OpenAI Codex) adalah cara opsional untuk mengautentikasi provider tersebut. Untuk Anthropic di OpenClaw, pembagian praktisnya adalah: - - **Kunci API Anthropic**: penagihan API Anthropic normal + - **API key Anthropic**: penagihan API Anthropic biasa - **Claude CLI / auth langganan Claude di OpenClaw**: staf Anthropic memberi tahu kami bahwa penggunaan ini diizinkan lagi, dan OpenClaw memperlakukan penggunaan `claude -p` - sebagai sesuatu yang disetujui untuk integrasi ini kecuali Anthropic menerbitkan kebijakan + sebagai sesuatu yang diizinkan untuk integrasi ini kecuali Anthropic memublikasikan kebijakan baru - Untuk host Gateway yang berumur panjang, kunci API Anthropic tetap menjadi - penyiapan yang lebih dapat diprediksi. OpenAI Codex OAuth secara eksplisit didukung untuk - alat eksternal seperti OpenClaw. + Untuk host gateway jangka panjang, API key Anthropic tetap merupakan + penyiapan yang lebih dapat diprediksi. OAuth OpenAI Codex didukung secara eksplisit untuk alat + eksternal seperti OpenClaw. - OpenClaw juga mendukung opsi lain bergaya langganan yang di-host termasuk + OpenClaw juga mendukung opsi berbasis langganan lain yang di-host termasuk **Qwen Cloud Coding Plan**, **MiniMax Coding Plan**, dan **Z.AI / GLM Coding Plan**. - Dokumen: [Anthropic](/id/providers/anthropic), [OpenAI](/id/providers/openai), + Dokumentasi: [Anthropic](/id/providers/anthropic), [OpenAI](/id/providers/openai), [Qwen Cloud](/id/providers/qwen), [MiniMax](/id/providers/minimax), [GLM Models](/id/providers/glm), [Local models](/id/gateway/local-models), [Models](/id/concepts/models). - + Ya. - Staf Anthropic memberi tahu kami bahwa penggunaan Claude CLI gaya OpenClaw diizinkan lagi, jadi - OpenClaw memperlakukan auth langganan Claude dan penggunaan `claude -p` sebagai sesuatu yang disetujui - untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. Jika Anda menginginkan - penyiapan sisi server yang paling dapat diprediksi, gunakan kunci API Anthropic sebagai gantinya. + Staf Anthropic memberi tahu kami bahwa penggunaan Claude CLI ala OpenClaw diizinkan lagi, jadi + OpenClaw memperlakukan auth langganan Claude dan penggunaan `claude -p` sebagai sesuatu yang diizinkan + untuk integrasi ini kecuali Anthropic memublikasikan kebijakan baru. Jika Anda menginginkan + penyiapan sisi server yang paling dapat diprediksi, gunakan API key Anthropic sebagai gantinya. @@ -625,13 +625,13 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n Ya. Staf Anthropic memberi tahu kami bahwa penggunaan ini diizinkan lagi, jadi OpenClaw memperlakukan - penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai sesuatu yang disetujui untuk integrasi ini - kecuali Anthropic menerbitkan kebijakan baru. + penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai sesuatu yang diizinkan untuk integrasi ini + kecuali Anthropic memublikasikan kebijakan baru. Setup-token Anthropic masih tersedia sebagai jalur token OpenClaw yang didukung, tetapi OpenClaw sekarang lebih memilih penggunaan ulang Claude CLI dan `claude -p` bila tersedia. - Untuk beban kerja produksi atau multi-pengguna, auth kunci API Anthropic tetap menjadi - pilihan yang lebih aman dan lebih dapat diprediksi. Jika Anda menginginkan opsi host bergaya langganan lainnya - di OpenClaw, lihat [OpenAI](/id/providers/openai), [Qwen / Model + Untuk workload produksi atau multi-pengguna, auth API key Anthropic tetap merupakan + pilihan yang lebih aman dan lebih dapat diprediksi. Jika Anda menginginkan opsi + lain yang di-host dan bergaya langganan di OpenClaw, lihat [OpenAI](/id/providers/openai), [Qwen / Model Cloud](/id/providers/qwen), [MiniMax](/id/providers/minimax), dan [GLM Models](/id/providers/glm). @@ -640,70 +640,70 @@ Jawaban cepat plus pemecahan masalah yang lebih mendalam untuk penyiapan dunia n Itu berarti **kuota/batas laju Anthropic** Anda habis untuk jendela saat ini. Jika Anda -menggunakan **Claude CLI**, tunggu sampai jendela direset atau tingkatkan paket Anda. Jika Anda -menggunakan **kunci API Anthropic**, periksa Anthropic Console -untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. +menggunakan **Claude CLI**, tunggu hingga jendela di-reset atau tingkatkan paket Anda. Jika Anda +menggunakan **API key Anthropic**, periksa Anthropic Console +untuk penggunaan/penagihan dan naikkan batas jika diperlukan. Jika pesannya secara spesifik adalah: - `Extra usage is required for long context requests`, permintaan tersebut mencoba menggunakan - beta konteks 1M Anthropic (`context1m: true`). Itu hanya berfungsi ketika - kredensial Anda memenuhi syarat untuk penagihan konteks panjang (penagihan kunci API atau - jalur login Claude OpenClaw dengan Extra Usage diaktifkan). + `Extra usage is required for long context requests`, berarti permintaan itu mencoba menggunakan + beta konteks 1M milik Anthropic (`context1m: true`). Itu hanya berfungsi jika + kredensial Anda memenuhi syarat untuk penagihan konteks panjang (penagihan API key atau + jalur login-Claude OpenClaw dengan Extra Usage diaktifkan). - Tip: tetapkan **fallback model** agar OpenClaw dapat tetap membalas saat sebuah provider terkena rate limit. + Tip: tetapkan **model fallback** agar OpenClaw dapat tetap membalas saat sebuah provider terkena rate limit. Lihat [Models](/cli/models), [OAuth](/id/concepts/oauth), dan [/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-context](/id/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-context). - Ya. OpenClaw memiliki provider bawaan **Amazon Bedrock (Converse)**. Dengan penanda env AWS yang ada, OpenClaw dapat menemukan secara otomatis katalog Bedrock streaming/teks dan menggabungkannya sebagai provider implisit `amazon-bedrock`; jika tidak, Anda dapat secara eksplisit mengaktifkan `plugins.entries.amazon-bedrock.config.discovery.enabled` atau menambahkan entri provider manual. Lihat [Amazon Bedrock](/id/providers/bedrock) dan [Model providers](/id/providers/models). Jika Anda lebih memilih alur kunci terkelola, proxy yang kompatibel dengan OpenAI di depan Bedrock tetap merupakan opsi yang valid. + Ya. OpenClaw memiliki provider bawaan **Amazon Bedrock (Converse)**. Dengan marker env AWS yang ada, OpenClaw dapat secara otomatis menemukan katalog Bedrock streaming/teks dan menggabungkannya sebagai provider implisit `amazon-bedrock`; jika tidak, Anda dapat secara eksplisit mengaktifkan `plugins.entries.amazon-bedrock.config.discovery.enabled` atau menambahkan entri provider manual. Lihat [Amazon Bedrock](/id/providers/bedrock) dan [Model providers](/id/providers/models). Jika Anda lebih memilih alur managed key, proxy yang kompatibel dengan OpenAI di depan Bedrock tetap merupakan opsi yang valid. - + OpenClaw mendukung **OpenAI Code (Codex)** melalui OAuth (login ChatGPT). Onboarding dapat menjalankan alur OAuth dan akan menetapkan model default ke `openai-codex/gpt-5.4` bila sesuai. Lihat [Model providers](/id/concepts/model-providers) dan [Onboarding (CLI)](/id/start/wizard). - OpenClaw memperlakukan dua jalur itu secara terpisah: + OpenClaw memperlakukan kedua jalur tersebut secara terpisah: - `openai-codex/gpt-5.4` = OAuth ChatGPT/Codex - `openai/gpt-5.4` = API Platform OpenAI langsung - Di OpenClaw, login ChatGPT/Codex dihubungkan ke rute `openai-codex/*`, - bukan rute langsung `openai/*`. Jika Anda menginginkan jalur API langsung di + Di OpenClaw, login ChatGPT/Codex dihubungkan ke jalur `openai-codex/*`, + bukan ke jalur `openai/*` langsung. Jika Anda menginginkan jalur API langsung di OpenClaw, setel `OPENAI_API_KEY` (atau konfigurasi provider OpenAI yang setara). Jika Anda menginginkan login ChatGPT/Codex di OpenClaw, gunakan `openai-codex/*`. - `openai-codex/*` menggunakan rute OAuth Codex, dan jendela kuota yang dapat digunakan - dikelola oleh OpenAI dan bergantung pada paket. Dalam praktiknya, batas-batas itu dapat berbeda dari - pengalaman situs web/aplikasi ChatGPT, bahkan ketika keduanya terikat ke akun yang sama. + `openai-codex/*` menggunakan jalur OAuth Codex, dan jendela kuota yang dapat digunakannya + dikelola oleh OpenAI dan bergantung pada paket. Dalam praktiknya, batas tersebut dapat berbeda dari + pengalaman situs web/aplikasi ChatGPT, meskipun keduanya terikat ke akun yang sama. OpenClaw dapat menampilkan jendela penggunaan/kuota provider yang saat ini terlihat di - `openclaw models status`, tetapi tidak mengada-ada atau menormalkan - hak akses web ChatGPT menjadi akses API langsung. Jika Anda menginginkan jalur - penagihan/batas Platform OpenAI langsung, gunakan `openai/*` dengan kunci API. + `openclaw models status`, tetapi tidak mengada-ada atau menormalkan entitlement web-ChatGPT + menjadi akses API langsung. Jika Anda menginginkan jalur penagihan/batas Platform OpenAI + langsung, gunakan `openai/*` dengan API key. Ya. OpenClaw sepenuhnya mendukung **OAuth langganan OpenAI Code (Codex)**. - OpenAI secara eksplisit mengizinkan penggunaan OAuth langganan dalam alat/alur kerja eksternal + OpenAI secara eksplisit mengizinkan penggunaan OAuth langganan di alat/alur kerja eksternal seperti OpenClaw. Onboarding dapat menjalankan alur OAuth untuk Anda. Lihat [OAuth](/id/concepts/oauth), [Model providers](/id/concepts/model-providers), dan [Onboarding (CLI)](/id/start/wizard). - + Gemini CLI menggunakan **alur auth Plugin**, bukan client id atau secret di `openclaw.json`. Langkah-langkah: - 1. Instal Gemini CLI secara lokal agar `gemini` ada di `PATH` + 1. Pasang Gemini CLI secara lokal agar `gemini` ada di `PATH` - Homebrew: `brew install gemini-cli` - npm: `npm install -g @google/gemini-cli` 2. Aktifkan Plugin: `openclaw plugins enable google` @@ -711,54 +711,54 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. 4. Model default setelah login: `google-gemini-cli/gemini-3-flash-preview` 5. Jika permintaan gagal, setel `GOOGLE_CLOUD_PROJECT` atau `GOOGLE_CLOUD_PROJECT_ID` pada host gateway - Ini menyimpan token OAuth dalam profil auth pada host gateway. Detail: [Model providers](/id/concepts/model-providers). + Ini menyimpan token OAuth dalam profil auth di host gateway. Detail: [Model providers](/id/concepts/model-providers). - Biasanya tidak. OpenClaw membutuhkan konteks besar + keamanan yang kuat; kartu kecil akan memotong dan bocor. Jika terpaksa, jalankan build model **terbesar** yang bisa Anda jalankan secara lokal (LM Studio) dan lihat [/gateway/local-models](/id/gateway/local-models). Model yang lebih kecil/terkuantisasi meningkatkan risiko prompt injection - lihat [Security](/id/gateway/security). + Biasanya tidak. OpenClaw memerlukan konteks besar + keamanan yang kuat; kartu kecil akan memotong konteks dan bocor. Jika terpaksa, jalankan build model **terbesar** yang bisa Anda jalankan secara lokal (LM Studio) dan lihat [/gateway/local-models](/id/gateway/local-models). Model yang lebih kecil/terkuantisasi meningkatkan risiko prompt injection - lihat [Security](/id/gateway/security). - Pilih endpoint yang dikunci ke wilayah tertentu. OpenRouter menyediakan opsi yang di-host di AS untuk MiniMax, Kimi, dan GLM; pilih varian yang di-host di AS agar data tetap berada di wilayah tersebut. Anda tetap dapat mencantumkan Anthropic/OpenAI di samping ini dengan menggunakan `models.mode: "merge"` agar fallback tetap tersedia sambil tetap menghormati provider per wilayah yang Anda pilih. + Pilih endpoint yang dipatok ke wilayah. OpenRouter menyediakan opsi yang di-host di AS untuk MiniMax, Kimi, dan GLM; pilih varian yang di-host di AS untuk menjaga data tetap berada di wilayah tersebut. Anda tetap dapat mencantumkan Anthropic/OpenAI bersama ini dengan menggunakan `models.mode: "merge"` agar fallback tetap tersedia sambil tetap menghormati provider berwilayah yang Anda pilih. - - Tidak. OpenClaw berjalan di macOS atau Linux (Windows melalui WSL2). Mac mini bersifat opsional - beberapa orang - membelinya sebagai host yang selalu aktif, tetapi VPS kecil, server rumahan, atau perangkat setara Raspberry Pi juga bisa digunakan. + + Tidak. OpenClaw berjalan di macOS atau Linux (Windows melalui WSL2). Mac mini bersifat opsional - sebagian orang + membelinya sebagai host yang selalu aktif, tetapi VPS kecil, server rumahan, atau mesin setara Raspberry Pi juga bisa. - Anda hanya memerlukan Mac **untuk alat khusus macOS**. Untuk iMessage, gunakan [BlueBubbles](/id/channels/bluebubbles) (direkomendasikan) - server BlueBubbles berjalan di Mac apa pun, dan Gateway dapat berjalan di Linux atau di tempat lain. Jika Anda menginginkan alat khusus macOS lainnya, jalankan Gateway di Mac atau pasangkan node macOS. + Anda hanya memerlukan Mac **untuk alat yang khusus macOS**. Untuk iMessage, gunakan [BlueBubbles](/id/channels/bluebubbles) (direkomendasikan) - server BlueBubbles berjalan di Mac apa pun, dan Gateway dapat berjalan di Linux atau di tempat lain. Jika Anda menginginkan alat khusus macOS lainnya, jalankan Gateway di Mac atau pairing node macOS. - Dokumen: [BlueBubbles](/id/channels/bluebubbles), [Nodes](/id/nodes), [Mac remote mode](/id/platforms/mac/remote). + Dokumentasi: [BlueBubbles](/id/channels/bluebubbles), [Nodes](/id/nodes), [Mac remote mode](/id/platforms/mac/remote). - Anda memerlukan **perangkat macOS** yang masuk ke Messages. Itu **tidak** harus Mac mini - + Anda memerlukan **perangkat macOS apa pun** yang login ke Messages. Itu **tidak** harus Mac mini - Mac apa pun bisa. **Gunakan [BlueBubbles](/id/channels/bluebubbles)** (direkomendasikan) untuk iMessage - server BlueBubbles berjalan di macOS, sementara Gateway dapat berjalan di Linux atau di tempat lain. Penyiapan umum: - - Jalankan Gateway di Linux/VPS, dan jalankan server BlueBubbles di Mac apa pun yang masuk ke Messages. + - Jalankan Gateway di Linux/VPS, dan jalankan server BlueBubbles di Mac apa pun yang login ke Messages. - Jalankan semuanya di Mac jika Anda menginginkan penyiapan satu mesin yang paling sederhana. - Dokumen: [BlueBubbles](/id/channels/bluebubbles), [Nodes](/id/nodes), + Dokumentasi: [BlueBubbles](/id/channels/bluebubbles), [Nodes](/id/nodes), [Mac remote mode](/id/platforms/mac/remote). Ya. **Mac mini dapat menjalankan Gateway**, dan MacBook Pro Anda dapat terhubung sebagai - **Node** (perangkat pendamping). Node tidak menjalankan Gateway - mereka menyediakan - kemampuan tambahan seperti screen/camera/canvas dan `system.run` di perangkat tersebut. + **node** (perangkat pendamping). Node tidak menjalankan Gateway - mereka menyediakan + kemampuan tambahan seperti screen/camera/canvas dan `system.run` pada perangkat itu. Pola umum: - Gateway di Mac mini (selalu aktif). - - MacBook Pro menjalankan aplikasi macOS atau host node dan dipasangkan ke Gateway. + - MacBook Pro menjalankan aplikasi macOS atau host node dan pairing ke Gateway. - Gunakan `openclaw nodes status` / `openclaw nodes list` untuk melihatnya. - Dokumen: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes). + Dokumentasi: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes). @@ -771,10 +771,10 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - - `channels.telegram.allowFrom` adalah **ID pengguna Telegram pengirim manusia** (numerik). Itu bukan username bot. + + `channels.telegram.allowFrom` adalah **ID pengguna Telegram milik manusia pengirim** (numerik). Itu bukan username bot. - Onboarding menerima input `@username` dan mengubahnya menjadi ID numerik, tetapi otorisasi OpenClaw hanya menggunakan ID numerik. + Penyiapan meminta ID pengguna numerik saja. Jika Anda sudah memiliki entri `@username` lama di konfigurasi, `openclaw doctor --fix` dapat mencoba menyelesaikannya. Lebih aman (tanpa bot pihak ketiga): @@ -793,11 +793,11 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Ya, melalui **routing multi-agent**. Ikat setiap **DM** WhatsApp pengirim (peer `kind: "direct"`, pengirim E.164 seperti `+15551234567`) ke `agentId` yang berbeda, sehingga setiap orang mendapatkan workspace dan session store mereka sendiri. Balasan tetap berasal dari **akun WhatsApp yang sama**, dan kontrol akses DM (`channels.whatsapp.dmPolicy` / `channels.whatsapp.allowFrom`) bersifat global per akun WhatsApp. Lihat [Multi-Agent Routing](/id/concepts/multi-agent) dan [WhatsApp](/id/channels/whatsapp). + Ya, melalui **multi-agent routing**. Ikat **DM** WhatsApp milik setiap pengirim (peer `kind: "direct"`, pengirim E.164 seperti `+15551234567`) ke `agentId` yang berbeda, sehingga setiap orang mendapatkan workspace dan penyimpanan sesi mereka sendiri. Balasan tetap berasal dari **akun WhatsApp yang sama**, dan kontrol akses DM (`channels.whatsapp.dmPolicy` / `channels.whatsapp.allowFrom`) bersifat global per akun WhatsApp. Lihat [Multi-Agent Routing](/id/concepts/multi-agent) dan [WhatsApp](/id/channels/whatsapp). - - Ya. Gunakan routing multi-agent: beri setiap agent model default-nya sendiri, lalu ikat rute masuk (akun provider atau peer tertentu) ke masing-masing agent. Contoh konfigurasi ada di [Multi-Agent Routing](/id/concepts/multi-agent). Lihat juga [Models](/id/concepts/models) dan [Configuration](/id/gateway/configuration). + + Ya. Gunakan multi-agent routing: beri setiap agent model defaultnya sendiri, lalu ikat rute masuk (akun provider atau peer tertentu) ke masing-masing agent. Contoh konfigurasi ada di [Multi-Agent Routing](/id/concepts/multi-agent). Lihat juga [Models](/id/concepts/models) dan [Configuration](/id/gateway/configuration). @@ -810,24 +810,24 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. brew install ``` - Jika Anda menjalankan OpenClaw melalui systemd, pastikan PATH service menyertakan `/home/linuxbrew/.linuxbrew/bin` (atau prefiks brew Anda) agar alat yang diinstal dengan `brew` dapat di-resolve dalam shell non-login. - Build terbaru juga menambahkan di awal direktori bin pengguna umum pada Linux systemd services (misalnya `~/.local/bin`, `~/.npm-global/bin`, `~/.local/share/pnpm`, `~/.bun/bin`) dan menghormati `PNPM_HOME`, `NPM_CONFIG_PREFIX`, `BUN_INSTALL`, `VOLTA_HOME`, `ASDF_DATA_DIR`, `NVM_DIR`, dan `FNM_DIR` jika disetel. + Jika Anda menjalankan OpenClaw melalui systemd, pastikan PATH layanan menyertakan `/home/linuxbrew/.linuxbrew/bin` (atau prefix brew Anda) agar alat yang dipasang dengan `brew` dapat di-resolve dalam shell non-login. + Build terbaru juga menambahkan lebih dulu direktori bin pengguna umum pada layanan Linux systemd (misalnya `~/.local/bin`, `~/.npm-global/bin`, `~/.local/share/pnpm`, `~/.bun/bin`) dan menghormati `PNPM_HOME`, `NPM_CONFIG_PREFIX`, `BUN_INSTALL`, `VOLTA_HOME`, `ASDF_DATA_DIR`, `NVM_DIR`, dan `FNM_DIR` bila disetel. - - **Instalasi hackable (git):** checkout source penuh, dapat diedit, terbaik untuk kontributor. - Anda menjalankan build secara lokal dan dapat menambal kode/docs. + - **Instalasi git hackable:** checkout source lengkap, dapat diedit, terbaik untuk kontributor. + Anda menjalankan build secara lokal dan dapat mem-patch kode/dokumentasi. - **npm install:** instalasi CLI global, tanpa repo, terbaik untuk "langsung jalankan." Pembaruan berasal dari npm dist-tag. - Dokumen: [Getting started](/id/start/getting-started), [Updating](/id/install/updating). + Dokumentasi: [Getting started](/id/start/getting-started), [Updating](/id/install/updating). - Ya. Instal varian lainnya, lalu jalankan Doctor agar service gateway mengarah ke entrypoint baru. - Ini **tidak menghapus data Anda** - ini hanya mengubah instalasi kode OpenClaw. State Anda + Ya. Pasang varian lainnya, lalu jalankan Doctor agar layanan gateway mengarah ke entrypoint baru. + Ini **tidak menghapus data Anda** - ini hanya mengubah instalasi kode OpenClaw. Status Anda (`~/.openclaw`) dan workspace (`~/.openclaw/workspace`) tetap tidak tersentuh. Dari npm ke git: @@ -849,9 +849,9 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw gateway restart ``` - Doctor mendeteksi ketidakcocokan entrypoint service gateway dan menawarkan untuk menulis ulang konfigurasi service agar cocok dengan instalasi saat ini (gunakan `--repair` dalam otomatisasi). + Doctor mendeteksi ketidakcocokan entrypoint layanan gateway dan menawarkan untuk menulis ulang konfigurasi layanan agar cocok dengan instalasi saat ini (gunakan `--repair` dalam otomatisasi). - Tips pencadangan: lihat [Strategi pencadangan](#where-things-live-on-disk). + Tips backup: lihat [Strategi backup](#where-things-live-on-disk). @@ -862,50 +862,50 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. **Laptop (Gateway lokal)** - **Kelebihan:** tidak ada biaya server, akses langsung ke file lokal, jendela browser langsung. - - **Kekurangan:** sleep/jaringan terputus = koneksi terputus, pembaruan/reboot OS mengganggu, harus tetap menyala. + - **Kekurangan:** sleep/drop jaringan = terputus, pembaruan/reboot OS mengganggu, mesin harus tetap aktif. **VPS / cloud** - - **Kelebihan:** selalu aktif, jaringan stabil, tidak ada masalah sleep laptop, lebih mudah dijaga tetap berjalan. - - **Kekurangan:** sering berjalan headless (gunakan screenshot), akses file hanya remote, Anda harus SSH untuk pembaruan. + - **Kelebihan:** selalu aktif, jaringan stabil, tidak ada masalah sleep laptop, lebih mudah untuk tetap berjalan. + - **Kekurangan:** sering berjalan headless (gunakan screenshot), hanya akses file remote, Anda harus SSH untuk pembaruan. - **Catatan khusus OpenClaw:** WhatsApp/Telegram/Slack/Mattermost/Discord semuanya bekerja dengan baik dari VPS. Satu-satunya trade-off nyata adalah **browser headless** vs jendela yang terlihat. Lihat [Browser](/id/tools/browser). + **Catatan khusus OpenClaw:** WhatsApp/Telegram/Slack/Mattermost/Discord semuanya berfungsi baik dari VPS. Satu-satunya trade-off nyata adalah **browser headless** vs jendela yang terlihat. Lihat [Browser](/id/tools/browser). - **Default yang direkomendasikan:** VPS jika Anda pernah mengalami gateway terputus sebelumnya. Lokal sangat cocok saat Anda aktif menggunakan Mac dan menginginkan akses file lokal atau otomatisasi UI dengan browser yang terlihat. + **Default yang direkomendasikan:** VPS jika Anda pernah mengalami gateway terputus sebelumnya. Lokal sangat bagus saat Anda aktif menggunakan Mac dan menginginkan akses file lokal atau otomatisasi UI dengan browser yang terlihat. Tidak wajib, tetapi **direkomendasikan untuk keandalan dan isolasi**. - - **Host khusus (VPS/Mac mini/Pi):** selalu aktif, lebih sedikit gangguan sleep/reboot, izin lebih bersih, lebih mudah dijaga tetap berjalan. - - **Laptop/desktop bersama:** sepenuhnya baik untuk pengujian dan penggunaan aktif, tetapi bersiaplah untuk jeda saat mesin sleep atau diperbarui. + - **Host khusus (VPS/Mac mini/Pi):** selalu aktif, lebih sedikit gangguan sleep/reboot, izin lebih bersih, lebih mudah untuk tetap berjalan. + - **Laptop/desktop bersama:** sepenuhnya baik untuk pengujian dan penggunaan aktif, tetapi perkirakan ada jeda saat mesin sleep atau diperbarui. - Jika Anda menginginkan yang terbaik dari keduanya, simpan Gateway di host khusus dan pasangkan laptop Anda sebagai **Node** untuk alat screen/camera/exec lokal. Lihat [Nodes](/id/nodes). + Jika Anda menginginkan yang terbaik dari keduanya, simpan Gateway di host khusus dan pairing laptop Anda sebagai **node** untuk alat screen/camera/exec lokal. Lihat [Nodes](/id/nodes). Untuk panduan keamanan, baca [Security](/id/gateway/security). - OpenClaw ringan. Untuk Gateway dasar + satu channel chat: + OpenClaw bersifat ringan. Untuk Gateway dasar + satu channel chat: - - **Minimum mutlak:** 1 vCPU, 1GB RAM, ~500MB disk. - - **Direkomendasikan:** 1-2 vCPU, RAM 2GB atau lebih untuk ruang tambahan (log, media, banyak channel). Alat Node dan otomatisasi browser bisa memakan banyak sumber daya. + - **Minimum absolut:** 1 vCPU, 1GB RAM, ~500MB disk. + - **Direkomendasikan:** 1-2 vCPU, RAM 2GB atau lebih untuk ruang tambahan (log, media, beberapa channel). Alat Node dan otomatisasi browser dapat membutuhkan banyak resource. - OS: gunakan **Ubuntu LTS** (atau Debian/Ubuntu modern lainnya). Jalur instalasi Linux paling teruji di sana. + OS: gunakan **Ubuntu LTS** (atau Debian/Ubuntu modern apa pun). Jalur instalasi Linux paling banyak diuji di sana. - Dokumen: [Linux](/id/platforms/linux), [VPS hosting](/id/vps). + Dokumentasi: [Linux](/id/platforms/linux), [VPS hosting](/id/vps). Ya. Perlakukan VM sama seperti VPS: VM harus selalu aktif, dapat dijangkau, dan memiliki - RAM yang cukup untuk Gateway serta channel apa pun yang Anda aktifkan. + RAM yang cukup untuk Gateway dan channel apa pun yang Anda aktifkan. Panduan dasar: - - **Minimum mutlak:** 1 vCPU, 1GB RAM. - - **Direkomendasikan:** RAM 2GB atau lebih jika Anda menjalankan banyak channel, otomatisasi browser, atau alat media. + - **Minimum absolut:** 1 vCPU, 1GB RAM. + - **Direkomendasikan:** RAM 2GB atau lebih jika Anda menjalankan beberapa channel, otomatisasi browser, atau alat media. - **OS:** Ubuntu LTS atau Debian/Ubuntu modern lainnya. Jika Anda menggunakan Windows, **WSL2 adalah penyiapan bergaya VM yang paling mudah** dan memiliki kompatibilitas @@ -919,40 +919,40 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - OpenClaw adalah asisten AI pribadi yang Anda jalankan di perangkat Anda sendiri. OpenClaw membalas di permukaan pesan yang sudah Anda gunakan (WhatsApp, Telegram, Slack, Mattermost, Discord, Google Chat, Signal, iMessage, WebChat, dan Plugin channel bawaan seperti QQ Bot) dan juga dapat melakukan suara + Canvas langsung di platform yang didukung. **Gateway** adalah control plane yang selalu aktif; asistennya adalah produknya. + OpenClaw adalah asisten AI pribadi yang Anda jalankan di perangkat Anda sendiri. OpenClaw membalas di permukaan pesan yang sudah Anda gunakan (WhatsApp, Telegram, Slack, Mattermost, Discord, Google Chat, Signal, iMessage, WebChat, dan plugin channel bawaan seperti QQ Bot) dan juga dapat melakukan suara + Canvas langsung di platform yang didukung. **Gateway** adalah control plane yang selalu aktif; asistennya adalah produknya. - OpenClaw bukan "sekadar pembungkus Claude." OpenClaw adalah **control plane yang local-first** yang memungkinkan Anda menjalankan - asisten yang andal di **perangkat keras milik Anda sendiri**, dapat dijangkau dari aplikasi chat yang sudah Anda gunakan, dengan - sesi stateful, memori, dan alat - tanpa menyerahkan kendali alur kerja Anda ke + OpenClaw bukan "sekadar wrapper Claude." OpenClaw adalah **control plane local-first** yang memungkinkan Anda menjalankan + asisten yang mumpuni di **perangkat keras Anda sendiri**, dapat dijangkau dari aplikasi chat yang sudah Anda gunakan, dengan + sesi stateful, memori, dan alat - tanpa menyerahkan kontrol alur kerja Anda ke SaaS yang di-host. Sorotan: - - **Perangkat Anda, data Anda:** jalankan Gateway di mana pun Anda inginkan (Mac, Linux, VPS) dan simpan + - **Perangkat Anda, data Anda:** jalankan Gateway di mana pun Anda mau (Mac, Linux, VPS) dan simpan workspace + riwayat sesi secara lokal. - **Channel nyata, bukan sandbox web:** WhatsApp/Telegram/Slack/Discord/Signal/iMessage/dll, - ditambah suara seluler dan Canvas di platform yang didukung. - - **Agnostik model:** gunakan Anthropic, OpenAI, MiniMax, OpenRouter, dll., dengan routing - dan failover per-agent. + plus voice seluler dan Canvas di platform yang didukung. + - **Agnostik terhadap model:** gunakan Anthropic, OpenAI, MiniMax, OpenRouter, dll., dengan per-agent routing + dan failover. - **Opsi lokal saja:** jalankan model lokal sehingga **semua data dapat tetap berada di perangkat Anda** jika Anda mau. - - **Routing multi-agent:** pisahkan agent per channel, akun, atau tugas, masing-masing dengan - workspace dan default-nya sendiri. + - **Multi-agent routing:** agent terpisah per channel, akun, atau tugas, masing-masing dengan + workspace dan default sendiri. - **Open source dan hackable:** periksa, perluas, dan self-host tanpa vendor lock-in. - Dokumen: [Gateway](/id/gateway), [Channels](/id/channels), [Multi-agent](/id/concepts/multi-agent), + Dokumentasi: [Gateway](/id/gateway), [Channels](/id/channels), [Multi-agent](/id/concepts/multi-agent), [Memory](/id/concepts/memory). - - Proyek awal yang bagus: + + Proyek pertama yang bagus: - - Bangun situs web (WordPress, Shopify, atau situs statis sederhana). - - Buat prototipe aplikasi seluler (kerangka, layar, rencana API). - - Atur file dan folder (pembersihan, penamaan, penandaan). - - Hubungkan Gmail dan otomatisasikan ringkasan atau tindak lanjut. + - Membangun situs web (WordPress, Shopify, atau situs statis sederhana). + - Membuat prototipe aplikasi seluler (kerangka, layar, rencana API). + - Mengatur file dan folder (pembersihan, penamaan, penandaan). + - Menghubungkan Gmail dan mengotomatiskan ringkasan atau tindak lanjut. OpenClaw dapat menangani tugas besar, tetapi bekerja paling baik saat Anda membaginya ke dalam beberapa fase dan menggunakan sub-agent untuk pekerjaan paralel. @@ -960,40 +960,40 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Keuntungan harian biasanya terlihat seperti ini: + Kegunaan sehari-hari biasanya terlihat seperti ini: - - **Ringkasan pribadi:** ringkasan kotak masuk, kalender, dan berita yang Anda pedulikan. - - **Riset dan penyusunan:** riset cepat, ringkasan, dan draf awal untuk email atau dokumen. - - **Pengingat dan tindak lanjut:** dorongan dan daftar periksa berbasis Cron atau Heartbeat. + - **Briefing pribadi:** ringkasan inbox, kalender, dan berita yang Anda pedulikan. + - **Riset dan drafting:** riset cepat, ringkasan, dan draf awal untuk email atau dokumen. + - **Pengingat dan tindak lanjut:** dorongan dan checklist yang digerakkan oleh Cron atau Heartbeat. - **Otomatisasi browser:** mengisi formulir, mengumpulkan data, dan mengulang tugas web. - **Koordinasi lintas perangkat:** kirim tugas dari ponsel Anda, biarkan Gateway menjalankannya di server, dan dapatkan hasilnya kembali di chat. - - Ya untuk **riset, kualifikasi, dan penyusunan**. OpenClaw dapat memindai situs, membuat daftar pendek, + + Ya untuk **riset, kualifikasi, dan drafting**. OpenClaw dapat memindai situs, membuat shortlist, merangkum prospek, dan menulis draf outreach atau copy iklan. - Untuk **outreach atau penayangan iklan**, pertahankan manusia dalam loop. Hindari spam, ikuti hukum lokal dan + Untuk **outreach atau penayangan iklan**, pertahankan manusia di dalam loop. Hindari spam, patuhi hukum lokal dan kebijakan platform, serta tinjau apa pun sebelum dikirim. Pola paling aman adalah membiarkan OpenClaw membuat draf dan Anda yang menyetujuinya. - Dokumen: [Security](/id/gateway/security). + Dokumentasi: [Security](/id/gateway/security). - + OpenClaw adalah **asisten pribadi** dan lapisan koordinasi, bukan pengganti IDE. Gunakan - Claude Code atau Codex untuk siklus coding langsung tercepat di dalam repo. Gunakan OpenClaw saat Anda + Claude Code atau Codex untuk loop coding langsung tercepat di dalam repo. Gunakan OpenClaw saat Anda menginginkan memori yang tahan lama, akses lintas perangkat, dan orkestrasi alat. - Keunggulan: + Kelebihan: - - **Memori + workspace persisten** antar sesi + - **Memori + workspace persisten** di seluruh sesi - **Akses multi-platform** (WhatsApp, Telegram, TUI, WebChat) - - **Orkestrasi alat** (browser, file, penjadwalan, hooks) + - **Orkestrasi alat** (browser, file, penjadwalan, hook) - **Gateway yang selalu aktif** (jalankan di VPS, berinteraksi dari mana saja) - - **Nodes** untuk browser/screen/camera/exec lokal + - **Node** untuk browser/screen/camera/exec lokal Showcase: [https://openclaw.ai/showcase](https://openclaw.ai/showcase) @@ -1004,11 +1004,11 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Gunakan override terkelola alih-alih mengedit salinan repo. Simpan perubahan Anda di `~/.openclaw/skills//SKILL.md` (atau tambahkan folder melalui `skills.load.extraDirs` di `~/.openclaw/openclaw.json`). Prioritasnya adalah `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → bawaan → `skills.load.extraDirs`, jadi override terkelola tetap menang atas Skills bawaan tanpa menyentuh git. Jika Anda perlu Skill diinstal secara global tetapi hanya terlihat oleh beberapa agent, simpan salinan bersama di `~/.openclaw/skills` dan kendalikan visibilitas dengan `agents.defaults.skills` dan `agents.list[].skills`. Hanya edit yang layak di-upstream yang seharusnya tinggal di repo dan dikirim sebagai PR. + Gunakan override terkelola alih-alih mengedit salinan repo. Letakkan perubahan Anda di `~/.openclaw/skills//SKILL.md` (atau tambahkan folder melalui `skills.load.extraDirs` di `~/.openclaw/openclaw.json`). Prioritasnya adalah `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → bawaan → `skills.load.extraDirs`, sehingga override terkelola tetap menang atas Skills bawaan tanpa menyentuh git. Jika Anda memerlukan Skill terpasang secara global tetapi hanya terlihat oleh beberapa agent, simpan salinan bersama di `~/.openclaw/skills` dan kendalikan visibilitas dengan `agents.defaults.skills` dan `agents.list[].skills`. Hanya edit yang layak di-upstream yang sebaiknya hidup di repo dan dikirim sebagai PR. - Ya. Tambahkan direktori ekstra melalui `skills.load.extraDirs` di `~/.openclaw/openclaw.json` (prioritas terendah). Prioritas default adalah `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → bawaan → `skills.load.extraDirs`. `clawhub` menginstal ke `./skills` secara default, yang diperlakukan OpenClaw sebagai `/skills` pada sesi berikutnya. Jika Skill hanya boleh terlihat oleh agent tertentu, pasangkan itu dengan `agents.defaults.skills` atau `agents.list[].skills`. + Ya. Tambahkan direktori tambahan melalui `skills.load.extraDirs` di `~/.openclaw/openclaw.json` (prioritas terendah). Prioritas default adalah `/skills` → `/.agents/skills` → `~/.agents/skills` → `~/.openclaw/skills` → bawaan → `skills.load.extraDirs`. `clawhub` memasang ke `./skills` secara default, yang diperlakukan OpenClaw sebagai `/skills` pada sesi berikutnya. Jika Skill hanya boleh terlihat oleh agent tertentu, padukan itu dengan `agents.defaults.skills` atau `agents.list[].skills`. @@ -1023,47 +1023,47 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Gunakan **sub-agent** untuk tugas yang panjang atau paralel. Sub-agent berjalan di sesi mereka sendiri, + Gunakan **sub-agent** untuk tugas yang panjang atau paralel. Sub-agent berjalan dalam sesi mereka sendiri, mengembalikan ringkasan, dan menjaga chat utama Anda tetap responsif. - Minta bot Anda untuk "memunculkan sub-agent untuk tugas ini" atau gunakan `/subagents`. - Gunakan `/status` di chat untuk melihat apa yang sedang dilakukan Gateway saat ini (dan apakah sedang sibuk). + Minta bot Anda untuk "spawn sub-agent untuk tugas ini" atau gunakan `/subagents`. + Gunakan `/status` di chat untuk melihat apa yang sedang dilakukan Gateway sekarang (dan apakah sedang sibuk). - Tip token: tugas panjang dan sub-agent sama-sama mengonsumsi token. Jika biaya menjadi perhatian, setel + Tip token: tugas panjang dan sub-agent sama-sama mengonsumsi token. Jika biaya menjadi perhatian, tetapkan model yang lebih murah untuk sub-agent melalui `agents.defaults.subagents.model`. - Dokumen: [Sub-agents](/id/tools/subagents), [Background Tasks](/id/automation/tasks). + Dokumentasi: [Sub-agents](/id/tools/subagents), [Background Tasks](/id/automation/tasks). - Gunakan binding thread. Anda dapat mengikat thread Discord ke target subagent atau sesi sehingga pesan tindak lanjut di thread tersebut tetap berada pada sesi yang terikat itu. + Gunakan pengikatan thread. Anda dapat mengikat thread Discord ke target subagent atau sesi sehingga pesan tindak lanjut di thread tersebut tetap berada pada sesi yang terikat itu. Alur dasar: - - Munculkan dengan `sessions_spawn` menggunakan `thread: true` (dan opsional `mode: "session"` untuk tindak lanjut persisten). + - Spawn dengan `sessions_spawn` menggunakan `thread: true` (dan opsional `mode: "session"` untuk tindak lanjut persisten). - Atau ikat secara manual dengan `/focus `. - - Gunakan `/agents` untuk memeriksa status binding. - - Gunakan `/session idle ` dan `/session max-age ` untuk mengendalikan auto-unfocus. + - Gunakan `/agents` untuk memeriksa status pengikatan. + - Gunakan `/session idle ` dan `/session max-age ` untuk mengendalikan pelepasan fokus otomatis. - Gunakan `/unfocus` untuk melepaskan thread. Konfigurasi yang diperlukan: - Default global: `session.threadBindings.enabled`, `session.threadBindings.idleHours`, `session.threadBindings.maxAgeHours`. - Override Discord: `channels.discord.threadBindings.enabled`, `channels.discord.threadBindings.idleHours`, `channels.discord.threadBindings.maxAgeHours`. - - Auto-bind saat spawn: setel `channels.discord.threadBindings.spawnSubagentSessions: true`. + - Ikat otomatis saat spawn: setel `channels.discord.threadBindings.spawnSubagentSessions: true`. - Dokumen: [Sub-agents](/id/tools/subagents), [Discord](/id/channels/discord), [Configuration Reference](/id/gateway/configuration-reference), [Slash commands](/id/tools/slash-commands). + Dokumentasi: [Sub-agents](/id/tools/subagents), [Discord](/id/channels/discord), [Configuration Reference](/id/gateway/configuration-reference), [Slash commands](/id/tools/slash-commands). - + Periksa rute peminta yang telah di-resolve terlebih dahulu: - - Pengiriman sub-agent mode penyelesaian lebih mengutamakan thread terikat atau rute percakapan apa pun jika ada. - - Jika asal penyelesaian hanya membawa channel, OpenClaw akan menggunakan fallback ke rute tersimpan sesi peminta (`lastChannel` / `lastTo` / `lastAccountId`) sehingga pengiriman langsung tetap bisa berhasil. - - Jika tidak ada rute terikat maupun rute tersimpan yang dapat digunakan, pengiriman langsung dapat gagal dan hasilnya akan menggunakan fallback ke pengiriman sesi yang diantrikan alih-alih langsung memposting ke chat. - - Target yang tidak valid atau kedaluwarsa masih dapat memaksa fallback antrean atau kegagalan pengiriman akhir. + - Pengiriman sub-agent mode penyelesaian lebih memilih thread atau rute percakapan yang terikat jika ada. + - Jika asal penyelesaian hanya membawa channel, OpenClaw akan fallback ke rute tersimpan sesi peminta (`lastChannel` / `lastTo` / `lastAccountId`) agar pengiriman langsung tetap bisa berhasil. + - Jika tidak ada rute terikat maupun rute tersimpan yang dapat digunakan, pengiriman langsung bisa gagal dan hasilnya akan fallback ke pengiriman sesi yang diantrekan alih-alih langsung diposting ke chat. + - Target yang tidak valid atau usang masih dapat memaksa fallback antrean atau kegagalan pengiriman akhir. - Jika balasan asisten terakhir yang terlihat dari child adalah token senyap persis `NO_REPLY` / `no_reply`, atau persis `ANNOUNCE_SKIP`, OpenClaw sengaja menekan pengumuman alih-alih memposting progres lama yang basi. - Jika child timeout setelah hanya melakukan pemanggilan alat, pengumuman dapat merangkum itu menjadi ringkasan progres parsial singkat alih-alih memutar ulang output alat mentah. @@ -1073,19 +1073,19 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw tasks show ``` - Dokumen: [Sub-agents](/id/tools/subagents), [Background Tasks](/id/automation/tasks), [Session Tools](/id/concepts/session-tool). + Dokumentasi: [Sub-agents](/id/tools/subagents), [Background Tasks](/id/automation/tasks), [Session Tools](/id/concepts/session-tool). Cron berjalan di dalam proses Gateway. Jika Gateway tidak berjalan terus-menerus, - job terjadwal tidak akan berjalan. + job terjadwal tidak akan dijalankan. - Daftar periksa: + Checklist: - Konfirmasikan Cron diaktifkan (`cron.enabled`) dan `OPENCLAW_SKIP_CRON` tidak disetel. - Periksa bahwa Gateway berjalan 24/7 (tanpa sleep/restart). - - Verifikasi pengaturan zona waktu untuk job tersebut (`--tz` vs zona waktu host). + - Verifikasi pengaturan zona waktu untuk job (`--tz` vs zona waktu host). Debug: @@ -1094,7 +1094,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw cron runs --id --limit 50 ``` - Dokumen: [Cron jobs](/id/automation/cron-jobs), [Automation & Tasks](/id/automation). + Dokumentasi: [Cron jobs](/id/automation/cron-jobs), [Automation & Tasks](/id/automation). @@ -1103,13 +1103,13 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - `--no-deliver` / `delivery.mode: "none"` berarti tidak ada pesan eksternal yang diharapkan. - Target pengumuman yang hilang atau tidak valid (`channel` / `to`) berarti runner melewati pengiriman keluar. - - Kegagalan auth channel (`unauthorized`, `Forbidden`) berarti runner mencoba mengirim, tetapi kredensial memblokirnya. - - Hasil terisolasi yang senyap (`NO_REPLY` / `no_reply` saja) diperlakukan sebagai memang sengaja tidak dapat dikirim, sehingga runner juga menekan pengiriman fallback terantri. + - Kegagalan auth channel (`unauthorized`, `Forbidden`) berarti runner mencoba mengirim tetapi kredensial memblokirnya. + - Hasil terisolasi yang senyap (`NO_REPLY` / `no_reply` saja) diperlakukan sebagai sengaja tidak dapat dikirim, sehingga runner juga menekan pengiriman fallback yang diantrekan. - Untuk Cron jobs terisolasi, runner memiliki pengiriman akhir. Agent diharapkan - mengembalikan ringkasan teks biasa agar runner dapat mengirimkannya. `--no-deliver` menjaga - hasil itu tetap internal; itu tidak membuat agent dapat mengirim langsung dengan - alat pesan sebagai gantinya. + Untuk Cron job terisolasi, runner memiliki pengiriman akhir. Agent diharapkan + mengembalikan ringkasan plain-text untuk dikirim oleh runner. `--no-deliver` menjaga + hasil tersebut tetap internal; itu tidak membiarkan agent mengirim langsung dengan + message tool sebagai gantinya. Debug: @@ -1118,27 +1118,27 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw tasks show ``` - Dokumen: [Cron jobs](/id/automation/cron-jobs), [Background Tasks](/id/automation/tasks). + Dokumentasi: [Cron jobs](/id/automation/cron-jobs), [Background Tasks](/id/automation/tasks). - - Itu biasanya adalah jalur pergantian model langsung, bukan penjadwalan ganda. + + Itu biasanya adalah jalur peralihan model langsung, bukan penjadwalan duplikat. - Cron terisolasi dapat mempertahankan handoff model runtime dan mencoba ulang saat eksekusi aktif + Cron terisolasi dapat mempertahankan handoff model runtime dan mencoba ulang saat run aktif melempar `LiveSessionModelSwitchError`. Percobaan ulang mempertahankan - provider/model yang sudah dialihkan, dan jika pergantian itu membawa override profil auth baru, Cron + provider/model yang telah dialihkan, dan jika peralihan itu membawa override profil auth baru, Cron juga mempertahankannya sebelum mencoba ulang. Aturan pemilihan terkait: - Override model hook Gmail menang terlebih dahulu jika berlaku. - - Lalu `model` per-job. + - Lalu `model` per job. - Lalu override model sesi Cron yang tersimpan. - Lalu pemilihan model agent/default normal. - Loop percobaan ulang dibatasi. Setelah percobaan awal plus 2 kali percobaan ulang karena pergantian, - Cron dibatalkan alih-alih berulang tanpa akhir. + Loop retry dibatasi. Setelah percobaan awal plus 2 retry peralihan, + Cron dihentikan alih-alih loop tanpa akhir. Debug: @@ -1147,11 +1147,11 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw tasks show ``` - Dokumen: [Cron jobs](/id/automation/cron-jobs), [cron CLI](/cli/cron). + Dokumentasi: [Cron jobs](/id/automation/cron-jobs), [Cron CLI](/cli/cron). - + Gunakan perintah native `openclaw skills` atau letakkan Skills ke workspace Anda. UI Skills macOS tidak tersedia di Linux. Jelajahi Skills di [https://clawhub.ai](https://clawhub.ai). @@ -1167,40 +1167,40 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. ``` `openclaw skills install` native menulis ke direktori `skills/` - workspace aktif. Instal CLI `clawhub` terpisah hanya jika Anda ingin menerbitkan atau - menyinkronkan Skills Anda sendiri. Untuk instalasi bersama lintas agent, letakkan Skill di bawah + workspace aktif. Pasang CLI `clawhub` terpisah hanya jika Anda ingin memublikasikan atau + menyinkronkan Skills Anda sendiri. Untuk instalasi bersama lintas agent, letakkan Skill di `~/.openclaw/skills` dan gunakan `agents.defaults.skills` atau - `agents.list[].skills` jika Anda ingin membatasi agent mana yang dapat melihatnya. + `agents.list[].skills` jika Anda ingin mempersempit agent mana yang dapat melihatnya. - - Ya. Gunakan penjadwal Gateway: + + Ya. Gunakan scheduler Gateway: - - **Cron jobs** untuk tugas terjadwal atau berulang (bertahan setelah restart). + - **Cron jobs** untuk tugas terjadwal atau berulang (bertahan melewati restart). - **Heartbeat** untuk pemeriksaan berkala "sesi utama". - - **Job terisolasi** untuk agent otonom yang memposting ringkasan atau mengirim ke chat. + - **Isolated jobs** untuk agent otonom yang memposting ringkasan atau mengirim ke chat. - Dokumen: [Cron jobs](/id/automation/cron-jobs), [Automation & Tasks](/id/automation), + Dokumentasi: [Cron jobs](/id/automation/cron-jobs), [Automation & Tasks](/id/automation), [Heartbeat](/id/gateway/heartbeat). - - Tidak secara langsung. Skills macOS dibatasi oleh `metadata.openclaw.os` ditambah biner yang diperlukan, dan Skills hanya muncul di system prompt saat memenuhi syarat pada **host Gateway**. Di Linux, Skills khusus `darwin` (seperti `apple-notes`, `apple-reminders`, `things-mac`) tidak akan dimuat kecuali Anda mengganti aturan pembatasannya. + + Tidak secara langsung. Skills macOS dibatasi oleh `metadata.openclaw.os` plus binary yang diperlukan, dan Skills hanya muncul dalam system prompt saat memenuhi syarat di **host Gateway**. Di Linux, Skills khusus `darwin` (seperti `apple-notes`, `apple-reminders`, `things-mac`) tidak akan dimuat kecuali Anda menimpa pembatasan tersebut. Ada tiga pola yang didukung: **Opsi A - jalankan Gateway di Mac (paling sederhana).** - Jalankan Gateway di tempat biner macOS tersedia, lalu hubungkan dari Linux dalam [mode remote](#gateway-ports-already-running-and-remote-mode) atau melalui Tailscale. Skills dimuat secara normal karena host Gateway adalah macOS. + Jalankan Gateway di tempat binary macOS tersedia, lalu hubungkan dari Linux dalam [mode remote](#gateway-ports-already-running-and-remote-mode) atau melalui Tailscale. Skills dimuat secara normal karena host Gateway adalah macOS. **Opsi B - gunakan node macOS (tanpa SSH).** - Jalankan Gateway di Linux, pasangkan node macOS (aplikasi menubar), dan setel **Node Run Commands** ke "Always Ask" atau "Always Allow" di Mac. OpenClaw dapat memperlakukan Skills khusus macOS sebagai memenuhi syarat saat biner yang diperlukan ada di node. Agent menjalankan Skills tersebut melalui alat `nodes`. Jika Anda memilih "Always Ask", menyetujui "Always Allow" pada prompt akan menambahkan perintah itu ke allowlist. + Jalankan Gateway di Linux, pairing node macOS (aplikasi menubar), dan setel **Node Run Commands** ke "Always Ask" atau "Always Allow" di Mac. OpenClaw dapat memperlakukan Skills khusus macOS sebagai memenuhi syarat saat binary yang diperlukan ada di node. Agent menjalankan Skills tersebut melalui tool `nodes`. Jika Anda memilih "Always Ask", menyetujui "Always Allow" di prompt akan menambahkan perintah tersebut ke allowlist. - **Opsi C - proxikan biner macOS melalui SSH (lanjutan).** - Biarkan Gateway tetap di Linux, tetapi buat CLI biner yang diperlukan di-resolve ke wrapper SSH yang berjalan di Mac. Lalu override Skill agar mengizinkan Linux sehingga tetap memenuhi syarat. + **Opsi C - proxy binary macOS melalui SSH (lanjutan).** + Simpan Gateway di Linux, tetapi buat binary CLI yang diperlukan di-resolve ke wrapper SSH yang berjalan di Mac. Lalu override Skill agar mengizinkan Linux sehingga tetap memenuhi syarat. - 1. Buat wrapper SSH untuk biner tersebut (contoh: `memo` untuk Apple Notes): + 1. Buat wrapper SSH untuk binary tersebut (contoh: `memo` untuk Apple Notes): ```bash #!/usr/bin/env bash @@ -1208,13 +1208,13 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. exec ssh -T user@mac-host /opt/homebrew/bin/memo "$@" ``` - 2. Letakkan wrapper itu di `PATH` pada host Linux (misalnya `~/bin/memo`). - 3. Override metadata Skill (workspace atau `~/.openclaw/skills`) untuk mengizinkan Linux: + 2. Letakkan wrapper di `PATH` pada host Linux (misalnya `~/bin/memo`). + 3. Override metadata Skill (workspace atau `~/.openclaw/skills`) agar mengizinkan Linux: ```markdown --- name: apple-notes - description: Manage Apple Notes via the memo CLI on macOS. + description: Kelola Apple Notes melalui CLI memo di macOS. metadata: { "openclaw": { "os": ["darwin", "linux"], "requires": { "bins": ["memo"] } } } --- ``` @@ -1228,25 +1228,25 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Opsi: - - **Skill / Plugin kustom:** terbaik untuk akses API yang andal (Notion/HeyGen sama-sama memiliki API). + - **Skill / Plugin kustom:** terbaik untuk akses API yang andal (Notion/HeyGen keduanya memiliki API). - **Otomatisasi browser:** berfungsi tanpa kode tetapi lebih lambat dan lebih rapuh. - Jika Anda ingin mempertahankan konteks per klien (alur kerja agensi), pola yang sederhana adalah: + Jika Anda ingin menjaga konteks per klien (alur kerja agensi), pola sederhananya adalah: - Satu halaman Notion per klien (konteks + preferensi + pekerjaan aktif). - - Minta agent mengambil halaman itu di awal sesi. + - Minta agent mengambil halaman tersebut di awal sesi. Jika Anda menginginkan integrasi native, buka permintaan fitur atau bangun Skill yang menargetkan API tersebut. - Instal Skills: + Pasang Skills: ```bash openclaw skills install openclaw skills update --all ``` - Instalasi native ditempatkan di direktori `skills/` workspace aktif. Untuk Skills bersama lintas agent, letakkan di `~/.openclaw/skills//SKILL.md`. Jika hanya beberapa agent yang boleh melihat instalasi bersama, konfigurasikan `agents.defaults.skills` atau `agents.list[].skills`. Beberapa Skills mengharapkan biner yang diinstal melalui Homebrew; di Linux itu berarti Linuxbrew (lihat entri FAQ Homebrew Linux di atas). Lihat [Skills](/id/tools/skills), [Skills config](/id/tools/skills-config), dan [ClawHub](/id/tools/clawhub). + Instalasi native ditempatkan di direktori `skills/` workspace aktif. Untuk Skills bersama lintas agent, letakkan di `~/.openclaw/skills//SKILL.md`. Jika hanya beberapa agent yang boleh melihat instalasi bersama, konfigurasikan `agents.defaults.skills` atau `agents.list[].skills`. Beberapa Skill mengharapkan binary yang dipasang melalui Homebrew; di Linux itu berarti Linuxbrew (lihat entri FAQ Homebrew Linux di atas). Lihat [Skills](/id/tools/skills), [Skills config](/id/tools/skills-config), dan [ClawHub](/id/tools/clawhub). @@ -1258,20 +1258,20 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw browser --browser-profile user snapshot ``` - Jika Anda menginginkan nama kustom, buat profil MCP eksplisit: + Jika Anda menginginkan nama khusus, buat profil MCP eksplisit: ```bash openclaw browser create-profile --name chrome-live --driver existing-session openclaw browser --browser-profile chrome-live tabs ``` - Jalur ini bersifat lokal ke host. Jika Gateway berjalan di tempat lain, jalankan host node di mesin browser atau gunakan CDP remote sebagai gantinya. + Jalur ini dapat menggunakan browser host lokal atau node browser yang terhubung. Jika Gateway berjalan di tempat lain, jalankan host node di mesin browser atau gunakan CDP remote sebagai gantinya. - Batasan saat ini pada `existing-session` / `user`: + Batas saat ini pada `existing-session` / `user`: - - aksi berbasis ref, bukan berbasis selector CSS - - upload memerlukan `ref` / `inputRef` dan saat ini hanya mendukung satu file dalam satu waktu - - `responsebody`, ekspor PDF, intersepsi unduhan, dan aksi batch masih memerlukan browser terkelola atau profil CDP mentah + - tindakan berbasis ref, bukan berbasis CSS selector + - upload memerlukan `ref` / `inputRef` dan saat ini hanya mendukung satu file sekaligus + - `responsebody`, ekspor PDF, intersepsi unduhan, dan tindakan batch masih memerlukan browser terkelola atau profil CDP mentah @@ -1279,109 +1279,109 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. ## Sandboxing dan memori - - Ya. Lihat [Sandboxing](/id/gateway/sandboxing). Untuk penyiapan khusus Docker (gateway penuh di Docker atau image sandbox), lihat [Docker](/id/install/docker). + + Ya. Lihat [Sandboxing](/id/gateway/sandboxing). Untuk penyiapan khusus Docker (Gateway penuh di Docker atau image sandbox), lihat [Docker](/id/install/docker). - Image default mengutamakan keamanan dan berjalan sebagai pengguna `node`, jadi tidak - menyertakan paket sistem, Homebrew, atau browser bawaan. Untuk penyiapan yang lebih lengkap: + Image default mengutamakan keamanan dan berjalan sebagai pengguna `node`, jadi image tersebut tidak + menyertakan package sistem, Homebrew, atau browser bawaan. Untuk penyiapan yang lebih lengkap: - - Pertahankan `/home/node` dengan `OPENCLAW_HOME_VOLUME` agar cache tetap tersimpan. - - Panggang dependensi sistem ke dalam image dengan `OPENCLAW_DOCKER_APT_PACKAGES`. - - Instal browser Playwright melalui CLI bawaan: + - Persist `/home/node` dengan `OPENCLAW_HOME_VOLUME` agar cache tetap tersimpan. + - Bake dependensi sistem ke dalam image dengan `OPENCLAW_DOCKER_APT_PACKAGES`. + - Pasang browser Playwright melalui CLI bawaan: `node /app/node_modules/playwright-core/cli.js install chromium` - - Setel `PLAYWRIGHT_BROWSERS_PATH` dan pastikan jalurnya disimpan secara persisten. + - Setel `PLAYWRIGHT_BROWSERS_PATH` dan pastikan path tersebut dipersist. - Dokumen: [Docker](/id/install/docker), [Browser](/id/tools/browser). + Dokumentasi: [Docker](/id/install/docker), [Browser](/id/tools/browser). - + Ya - jika lalu lintas privat Anda adalah **DM** dan lalu lintas publik Anda adalah **grup**. - Gunakan `agents.defaults.sandbox.mode: "non-main"` agar sesi grup/channel (kunci non-utama) berjalan di Docker, sementara sesi DM utama tetap di host. Lalu batasi alat apa saja yang tersedia dalam sesi tersandbox melalui `tools.sandbox.tools`. + Gunakan `agents.defaults.sandbox.mode: "non-main"` agar sesi grup/channel (kunci non-main) berjalan di Docker, sementara sesi DM utama tetap di host. Lalu batasi tool apa saja yang tersedia dalam sesi tersandbox melalui `tools.sandbox.tools`. - Panduan penyiapan + contoh config: [Groups: personal DMs + public groups](/id/channels/groups#pattern-personal-dms-public-groups-single-agent) + Panduan penyiapan + contoh konfigurasi: [Grup: DM pribadi + grup publik](/id/channels/groups#pattern-personal-dms-public-groups-single-agent) - Referensi config utama: [Gateway configuration](/id/gateway/configuration-reference#agentsdefaultssandbox) + Referensi konfigurasi utama: [Gateway configuration](/id/gateway/configuration-reference#agentsdefaultssandbox) - Setel `agents.defaults.sandbox.docker.binds` ke `["host:path:mode"]` (misalnya `"/home/user/src:/src:ro"`). Ikatan global + per-agent digabungkan; ikatan per-agent diabaikan saat `scope: "shared"`. Gunakan `:ro` untuk apa pun yang sensitif dan ingat bahwa bind melewati dinding filesystem sandbox. + Setel `agents.defaults.sandbox.docker.binds` ke `["host:path:mode"]` (misalnya `"/home/user/src:/src:ro"`). Bind global + per-agent akan digabung; bind per-agent diabaikan saat `scope: "shared"`. Gunakan `:ro` untuk apa pun yang sensitif dan ingat bahwa bind melewati batas filesystem sandbox. - OpenClaw memvalidasi sumber bind terhadap jalur yang dinormalisasi dan jalur kanonis yang di-resolve melalui leluhur terdalam yang sudah ada. Itu berarti escape melalui parent symlink tetap gagal secara fail-closed bahkan ketika segmen jalur terakhir belum ada, dan pemeriksaan allowed-root tetap berlaku setelah resolusi symlink. + OpenClaw memvalidasi sumber bind terhadap path yang dinormalisasi dan juga path kanonis yang di-resolve melalui ancestor terdalam yang sudah ada. Itu berarti pelarian melalui parent symlink tetap gagal tertutup bahkan ketika segmen path terakhir belum ada, dan pemeriksaan allowed-root tetap berlaku setelah resolusi symlink. Lihat [Sandboxing](/id/gateway/sandboxing#custom-bind-mounts) dan [Sandbox vs Tool Policy vs Elevated](/id/gateway/sandbox-vs-tool-policy-vs-elevated#bind-mounts-security-quick-check) untuk contoh dan catatan keamanan. - + Memori OpenClaw hanyalah file Markdown di workspace agent: - Catatan harian di `memory/YYYY-MM-DD.md` - - Catatan jangka panjang yang dikurasi di `MEMORY.md` (hanya sesi utama/pribadi) + - Catatan jangka panjang yang dikurasi di `MEMORY.md` (khusus sesi utama/pribadi) - OpenClaw juga menjalankan **flush memori pra-Compaction yang senyap** untuk mengingatkan model - agar menulis catatan yang tahan lama sebelum auto-Compaction. Ini hanya berjalan ketika workspace - dapat ditulis (sandbox baca-saja melewatinya). Lihat [Memory](/id/concepts/memory). + OpenClaw juga menjalankan **silent pre-Compaction memory flush** untuk mengingatkan model + agar menulis catatan yang tahan lama sebelum Compaction otomatis. Ini hanya berjalan saat workspace + dapat ditulisi (sandbox read-only melewatinya). Lihat [Memory](/id/concepts/memory). - - Minta bot untuk **menulis fakta itu ke memori**. Catatan jangka panjang masuk ke `MEMORY.md`, + + Minta bot untuk **menulis fakta itu ke memori**. Catatan jangka panjang seharusnya masuk ke `MEMORY.md`, konteks jangka pendek masuk ke `memory/YYYY-MM-DD.md`. - Ini masih merupakan area yang terus kami tingkatkan. Akan membantu jika Anda mengingatkan model untuk menyimpan memori; - model akan tahu apa yang harus dilakukan. Jika terus lupa, verifikasi bahwa Gateway menggunakan - workspace yang sama pada setiap eksekusi. + Ini masih merupakan area yang terus kami tingkatkan. Membantu jika Anda mengingatkan model untuk menyimpan memori; + model akan tahu apa yang harus dilakukan. Jika masih terus lupa, verifikasi bahwa Gateway menggunakan + workspace yang sama pada setiap run. - Dokumen: [Memory](/id/concepts/memory), [Agent workspace](/id/concepts/agent-workspace). + Dokumentasi: [Memory](/id/concepts/memory), [Workspace agent](/id/concepts/agent-workspace). - - File memori hidup di disk dan bertahan sampai Anda menghapusnya. Batasnya adalah + + File memori berada di disk dan bertahan sampai Anda menghapusnya. Batasnya adalah penyimpanan Anda, bukan model. **Konteks sesi** tetap dibatasi oleh jendela konteks - model, sehingga percakapan panjang dapat mengalami Compaction atau pemotongan. Itulah sebabnya + model, jadi percakapan yang panjang bisa mengalami Compaction atau pemotongan. Itulah sebabnya pencarian memori ada - fitur itu hanya menarik kembali bagian yang relevan ke dalam konteks. - Dokumen: [Memory](/id/concepts/memory), [Context](/id/concepts/context). + Dokumentasi: [Memory](/id/concepts/memory), [Context](/id/concepts/context). - - Hanya jika Anda menggunakan **embedding OpenAI**. OAuth Codex mencakup chat/completion dan - **tidak** memberikan akses embedding, jadi **login dengan Codex (OAuth atau - login Codex CLI)** tidak membantu untuk pencarian memori semantik. Embedding OpenAI - tetap memerlukan kunci API asli (`OPENAI_API_KEY` atau `models.providers.openai.apiKey`). + + Hanya jika Anda menggunakan **embedding OpenAI**. OAuth Codex mencakup chat/completions dan + **tidak** memberikan akses embeddings, jadi **login dengan Codex (OAuth atau + login CLI Codex)** tidak membantu untuk pencarian memori semantik. Embedding OpenAI + tetap memerlukan API key sungguhan (`OPENAI_API_KEY` atau `models.providers.openai.apiKey`). - Jika Anda tidak menetapkan provider secara eksplisit, OpenClaw memilih provider secara otomatis ketika - dapat me-resolve kunci API (profil auth, `models.providers.*.apiKey`, atau env vars). - OpenClaw lebih memilih OpenAI jika kunci OpenAI dapat di-resolve, jika tidak Gemini jika kunci Gemini - dapat di-resolve, lalu Voyage, lalu Mistral. Jika tidak ada kunci remote yang tersedia, pencarian memori - tetap dinonaktifkan sampai Anda mengonfigurasinya. Jika Anda memiliki jalur model lokal - yang dikonfigurasi dan tersedia, OpenClaw - lebih memilih `local`. Ollama didukung saat Anda secara eksplisit menetapkan + Jika Anda tidak menetapkan provider secara eksplisit, OpenClaw memilih provider secara otomatis saat + dapat me-resolve API key (profil auth, `models.providers.*.apiKey`, atau env var). + OpenClaw lebih memilih OpenAI jika OpenAI key dapat di-resolve, jika tidak Gemini jika Gemini key + dapat di-resolve, lalu Voyage, lalu Mistral. Jika tidak ada remote key yang tersedia, pencarian memori + tetap dinonaktifkan sampai Anda mengonfigurasinya. Jika Anda telah mengonfigurasi path model lokal + dan path tersebut ada, OpenClaw + lebih memilih `local`. Ollama didukung ketika Anda secara eksplisit menetapkan `memorySearch.provider = "ollama"`. - Jika Anda lebih suka tetap lokal, setel `memorySearch.provider = "local"` (dan opsional + Jika Anda lebih memilih tetap lokal, setel `memorySearch.provider = "local"` (dan opsional `memorySearch.fallback = "none"`). Jika Anda menginginkan embedding Gemini, setel - `memorySearch.provider = "gemini"` dan berikan `GEMINI_API_KEY` (atau + `memorySearch.provider = "gemini"` dan sediakan `GEMINI_API_KEY` (atau `memorySearch.remote.apiKey`). Kami mendukung model embedding **OpenAI, Gemini, Voyage, Mistral, Ollama, atau local** - lihat [Memory](/id/concepts/memory) untuk detail penyiapannya. -## Tempat berbagai hal disimpan di disk +## Lokasi penyimpanan di disk - Tidak - **state OpenClaw bersifat lokal**, tetapi **layanan eksternal tetap melihat apa yang Anda kirim ke mereka**. + Tidak - **status OpenClaw bersifat lokal**, tetapi **layanan eksternal tetap melihat apa yang Anda kirimkan kepada mereka**. - - **Lokal secara default:** sesi, file memori, config, dan workspace berada di host Gateway + - **Lokal secara default:** sesi, file memori, konfigurasi, dan workspace berada di host Gateway (`~/.openclaw` + direktori workspace Anda). - **Remote karena kebutuhan:** pesan yang Anda kirim ke provider model (Anthropic/OpenAI/dll.) dikirim ke API mereka, dan platform chat (WhatsApp/Telegram/Slack/dll.) menyimpan data pesan di @@ -1389,26 +1389,26 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - **Anda mengendalikan jejaknya:** menggunakan model lokal menjaga prompt tetap di mesin Anda, tetapi lalu lintas channel tetap melewati server milik channel tersebut. - Terkait: [Agent workspace](/id/concepts/agent-workspace), [Memory](/id/concepts/memory). + Terkait: [Workspace agent](/id/concepts/agent-workspace), [Memory](/id/concepts/memory). - Semuanya berada di bawah `$OPENCLAW_STATE_DIR` (default: `~/.openclaw`): + Semua berada di bawah `$OPENCLAW_STATE_DIR` (default: `~/.openclaw`): | Path | Tujuan | | --------------------------------------------------------------- | ------------------------------------------------------------------ | - | `$OPENCLAW_STATE_DIR/openclaw.json` | Config utama (JSON5) | - | `$OPENCLAW_STATE_DIR/credentials/oauth.json` | Impor OAuth lama (disalin ke profil auth saat pertama digunakan) | - | `$OPENCLAW_STATE_DIR/agents//agent/auth-profiles.json` | Profil auth (OAuth, kunci API, dan `keyRef`/`tokenRef` opsional) | + | `$OPENCLAW_STATE_DIR/openclaw.json` | Konfigurasi utama (JSON5) | + | `$OPENCLAW_STATE_DIR/credentials/oauth.json` | Impor OAuth lama (disalin ke profil auth saat pertama kali digunakan) | + | `$OPENCLAW_STATE_DIR/agents//agent/auth-profiles.json` | Profil auth (OAuth, API key, dan `keyRef`/`tokenRef` opsional) | | `$OPENCLAW_STATE_DIR/secrets.json` | Payload secret opsional berbasis file untuk provider SecretRef `file` | | `$OPENCLAW_STATE_DIR/agents//agent/auth.json` | File kompatibilitas lama (entri `api_key` statis dibersihkan) | - | `$OPENCLAW_STATE_DIR/credentials/` | State provider (mis. `whatsapp//creds.json`) | - | `$OPENCLAW_STATE_DIR/agents/` | State per-agent (agentDir + sesi) | - | `$OPENCLAW_STATE_DIR/agents//sessions/` | Riwayat & state percakapan (per agent) | + | `$OPENCLAW_STATE_DIR/credentials/` | Status provider (misalnya `whatsapp//creds.json`) | + | `$OPENCLAW_STATE_DIR/agents/` | Status per-agent (agentDir + sesi) | + | `$OPENCLAW_STATE_DIR/agents//sessions/` | Riwayat percakapan & status (per agent) | | `$OPENCLAW_STATE_DIR/agents//sessions/sessions.json` | Metadata sesi (per agent) | - Jalur lama agent tunggal: `~/.openclaw/agent/*` (dimigrasikan oleh `openclaw doctor`). + Path single-agent lama: `~/.openclaw/agent/*` (dimigrasikan oleh `openclaw doctor`). **Workspace** Anda (AGENTS.md, file memori, Skills, dll.) terpisah dan dikonfigurasi melalui `agents.defaults.workspace` (default: `~/.openclaw/workspace`). @@ -1419,8 +1419,8 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - **Workspace (per agent)**: `AGENTS.md`, `SOUL.md`, `IDENTITY.md`, `USER.md`, `MEMORY.md` (atau fallback lama `memory.md` saat `MEMORY.md` tidak ada), - `memory/YYYY-MM-DD.md`, opsional `HEARTBEAT.md`. - - **Direktori state (`~/.openclaw`)**: config, state channel/provider, profil auth, sesi, log, + `memory/YYYY-MM-DD.md`, `HEARTBEAT.md` opsional. + - **Direktori status (`~/.openclaw`)**: konfigurasi, status channel/provider, profil auth, sesi, log, dan Skills bersama (`~/.openclaw/skills`). Workspace default adalah `~/.openclaw/workspace`, dapat dikonfigurasi melalui: @@ -1435,23 +1435,23 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. workspace yang sama pada setiap peluncuran (dan ingat: mode remote menggunakan **workspace milik host gateway**, bukan laptop lokal Anda). - Tip: jika Anda menginginkan perilaku atau preferensi yang tahan lama, minta bot untuk **menuliskannya ke + Tip: jika Anda menginginkan perilaku atau preferensi yang tahan lama, minta bot untuk **menuliskannya ke dalam AGENTS.md atau MEMORY.md** daripada mengandalkan riwayat chat. - Lihat [Agent workspace](/id/concepts/agent-workspace) dan [Memory](/id/concepts/memory). + Lihat [Workspace agent](/id/concepts/agent-workspace) dan [Memory](/id/concepts/memory). - - Simpan **workspace agent** Anda di repo git **private** dan cadangkan di tempat - privat (misalnya GitHub private). Ini menangkap memori + file AGENTS/SOUL/USER + + Simpan **workspace agent** Anda di repo git **privat** dan backup ke tempat + yang privat (misalnya GitHub private). Ini menangkap memori + file AGENTS/SOUL/USER dan memungkinkan Anda memulihkan "pikiran" asisten nanti. **Jangan** commit apa pun di bawah `~/.openclaw` (kredensial, sesi, token, atau payload secret terenkripsi). - Jika Anda memerlukan pemulihan penuh, cadangkan workspace dan direktori state + Jika Anda memerlukan pemulihan penuh, backup workspace dan direktori status secara terpisah (lihat pertanyaan migrasi di atas). - Dokumen: [Agent workspace](/id/concepts/agent-workspace). + Dokumentasi: [Workspace agent](/id/concepts/agent-workspace). @@ -1461,12 +1461,12 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Ya. Workspace adalah **cwd default** dan jangkar memori, bukan sandbox keras. - Jalur relatif di-resolve di dalam workspace, tetapi jalur absolut dapat mengakses lokasi + Path relatif di-resolve di dalam workspace, tetapi path absolut dapat mengakses lokasi host lain kecuali sandboxing diaktifkan. Jika Anda memerlukan isolasi, gunakan [`agents.defaults.sandbox`](/id/gateway/sandboxing) atau pengaturan sandbox per-agent. Jika Anda - ingin repo menjadi direktori kerja default, arahkan `workspace` - agent itu ke root repo. Repo OpenClaw hanyalah source code; simpan - workspace secara terpisah kecuali Anda memang ingin agent bekerja di dalamnya. + ingin sebuah repo menjadi direktori kerja default, arahkan `workspace` agent tersebut + ke root repo. Repo OpenClaw hanyalah source code; simpan + workspace terpisah kecuali Anda memang sengaja ingin agent bekerja di dalamnya. Contoh (repo sebagai cwd default): @@ -1482,16 +1482,16 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - - State sesi dimiliki oleh **host gateway**. Jika Anda berada dalam mode remote, session store yang penting bagi Anda ada di mesin remote, bukan di laptop lokal Anda. Lihat [Session management](/id/concepts/session). + + Status sesi dimiliki oleh **host gateway**. Jika Anda berada dalam mode remote, penyimpanan sesi yang penting bagi Anda berada di mesin remote, bukan di laptop lokal Anda. Lihat [Session management](/id/concepts/session). -## Dasar-dasar config +## Dasar-dasar konfigurasi - - OpenClaw membaca config **JSON5** opsional dari `$OPENCLAW_CONFIG_PATH` (default: `~/.openclaw/openclaw.json`): + + OpenClaw membaca konfigurasi **JSON5** opsional dari `$OPENCLAW_CONFIG_PATH` (default: `~/.openclaw/openclaw.json`): ``` $OPENCLAW_CONFIG_PATH @@ -1522,31 +1522,31 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Catatan: - `gateway.remote.token` / `.password` **tidak** mengaktifkan auth gateway lokal dengan sendirinya. - - Jalur pemanggilan lokal dapat menggunakan `gateway.remote.*` sebagai fallback hanya ketika `gateway.auth.*` tidak disetel. + - Jalur pemanggilan lokal dapat menggunakan `gateway.remote.*` sebagai fallback hanya saat `gateway.auth.*` tidak disetel. - Untuk auth kata sandi, setel `gateway.auth.mode: "password"` plus `gateway.auth.password` (atau `OPENCLAW_GATEWAY_PASSWORD`) sebagai gantinya. - - Jika `gateway.auth.token` / `gateway.auth.password` secara eksplisit dikonfigurasi melalui SecretRef dan tidak dapat di-resolve, resolusi akan gagal secara fail-closed (tanpa masking fallback remote). - - Penyiapan Control UI dengan shared-secret melakukan autentikasi melalui `connect.params.auth.token` atau `connect.params.auth.password` (disimpan di pengaturan aplikasi/UI). Mode pembawa identitas seperti Tailscale Serve atau `trusted-proxy` menggunakan header permintaan sebagai gantinya. Hindari menaruh shared secret di URL. - - Dengan `gateway.auth.mode: "trusted-proxy"`, reverse proxy loopback pada host yang sama tetap **tidak** memenuhi auth trusted-proxy. Trusted proxy harus berupa sumber non-loopback yang dikonfigurasi. + - Jika `gateway.auth.token` / `gateway.auth.password` dikonfigurasi secara eksplisit melalui SecretRef dan tidak dapat di-resolve, resolusi gagal tertutup (tidak ada fallback remote yang menutupi). + - Penyiapan shared-secret Control UI mengautentikasi melalui `connect.params.auth.token` atau `connect.params.auth.password` (disimpan di pengaturan app/UI). Mode berbasis identitas seperti Tailscale Serve atau `trusted-proxy` menggunakan header permintaan sebagai gantinya. Hindari menaruh shared secret di URL. + - Dengan `gateway.auth.mode: "trusted-proxy"`, reverse proxy loopback pada host yang sama tetap **tidak** memenuhi auth trusted-proxy. Trusted proxy harus merupakan sumber non-loopback yang dikonfigurasi. - - OpenClaw menegakkan auth gateway secara default, termasuk loopback. Pada jalur default normal itu berarti auth token: jika tidak ada jalur auth eksplisit yang dikonfigurasi, startup gateway akan me-resolve ke mode token dan menghasilkan token secara otomatis, lalu menyimpannya ke `gateway.auth.token`, sehingga **klien WS lokal harus diautentikasi**. Ini memblokir proses lokal lain untuk memanggil Gateway. + + OpenClaw menegakkan auth gateway secara default, termasuk loopback. Pada jalur default normal, itu berarti auth token: jika tidak ada jalur auth eksplisit yang dikonfigurasi, startup gateway akan di-resolve ke mode token dan membuat token secara otomatis, lalu menyimpannya ke `gateway.auth.token`, sehingga **klien WS lokal harus mengautentikasi**. Ini memblokir proses lokal lain agar tidak bisa memanggil Gateway. - Jika Anda lebih memilih jalur auth yang berbeda, Anda dapat secara eksplisit memilih mode kata sandi (atau, untuk reverse proxy sadar identitas non-loopback, `trusted-proxy`). Jika Anda **benar-benar** ingin loopback terbuka, setel `gateway.auth.mode: "none"` secara eksplisit di config Anda. Doctor dapat membuat token untuk Anda kapan saja: `openclaw doctor --generate-gateway-token`. + Jika Anda lebih memilih jalur auth yang berbeda, Anda dapat secara eksplisit memilih mode kata sandi (atau, untuk reverse proxy sadar identitas non-loopback, `trusted-proxy`). Jika Anda **benar-benar** menginginkan loopback terbuka, setel `gateway.auth.mode: "none"` secara eksplisit di konfigurasi Anda. Doctor dapat membuat token untuk Anda kapan saja: `openclaw doctor --generate-gateway-token`. - - Gateway mengawasi config dan mendukung hot-reload: + + Gateway memantau konfigurasi dan mendukung hot-reload: - - `gateway.reload.mode: "hybrid"` (default): terapkan perubahan yang aman secara hot, restart untuk yang kritis + - `gateway.reload.mode: "hybrid"` (default): hot-apply perubahan yang aman, restart untuk perubahan yang kritis - `hot`, `restart`, `off` juga didukung - Setel `cli.banner.taglineMode` di config: + Setel `cli.banner.taglineMode` di konfigurasi: ```json5 { @@ -1558,21 +1558,21 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. } ``` - - `off`: menyembunyikan teks tagline tetapi tetap mempertahankan baris judul/versi banner. + - `off`: menyembunyikan teks tagline tetapi tetap menampilkan baris judul/versi banner. - `default`: selalu menggunakan `All your chats, one OpenClaw.`. - `random`: tagline lucu/musiman yang bergilir (perilaku default). - - Jika Anda tidak ingin ada banner sama sekali, setel env `OPENCLAW_HIDE_BANNER=1`. + - Jika Anda tidak ingin banner sama sekali, setel env `OPENCLAW_HIDE_BANNER=1`. - - `web_fetch` berfungsi tanpa kunci API. `web_search` bergantung pada + + `web_fetch` berfungsi tanpa API key. `web_search` bergantung pada provider yang Anda pilih: - - Provider berbasis API seperti Brave, Exa, Firecrawl, Gemini, Grok, Kimi, MiniMax Search, Perplexity, dan Tavily memerlukan penyiapan kunci API normal mereka. - - Ollama Web Search tidak memerlukan kunci, tetapi menggunakan host Ollama yang telah Anda konfigurasi dan memerlukan `ollama signin`. - - DuckDuckGo tidak memerlukan kunci, tetapi merupakan integrasi tidak resmi berbasis HTML. - - SearXNG tidak memerlukan kunci/self-hosted; konfigurasikan `SEARXNG_BASE_URL` atau `plugins.entries.searxng.config.webSearch.baseUrl`. + - Provider berbasis API seperti Brave, Exa, Firecrawl, Gemini, Grok, Kimi, MiniMax Search, Perplexity, dan Tavily memerlukan penyiapan API key normal mereka. + - Ollama Web Search tidak memerlukan key, tetapi menggunakan host Ollama yang Anda konfigurasi dan memerlukan `ollama signin`. + - DuckDuckGo tidak memerlukan key, tetapi merupakan integrasi tidak resmi berbasis HTML. + - SearXNG tidak memerlukan key/self-hosted; konfigurasikan `SEARXNG_BASE_URL` atau `plugins.entries.searxng.config.webSearch.baseUrl`. **Direkomendasikan:** jalankan `openclaw configure --section web` dan pilih provider. Alternatif env: @@ -1610,66 +1610,66 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. }, fetch: { enabled: true, - provider: "firecrawl", // opsional; hilangkan untuk deteksi otomatis + provider: "firecrawl", // opsional; hapus untuk deteksi otomatis }, }, }, } ``` - Config pencarian web khusus provider sekarang berada di bawah `plugins.entries..config.webSearch.*`. - Jalur provider lama `tools.web.search.*` masih dimuat sementara demi kompatibilitas, tetapi tidak boleh digunakan untuk config baru. - Config fallback pengambilan web Firecrawl berada di bawah `plugins.entries.firecrawl.config.webFetch.*`. + Konfigurasi web-search khusus provider sekarang berada di bawah `plugins.entries..config.webSearch.*`. + Jalur provider lama `tools.web.search.*` masih dimuat sementara untuk kompatibilitas, tetapi tidak seharusnya digunakan untuk konfigurasi baru. + Konfigurasi fallback web-fetch Firecrawl berada di bawah `plugins.entries.firecrawl.config.webFetch.*`. Catatan: - Jika Anda menggunakan allowlist, tambahkan `web_search`/`web_fetch`/`x_search` atau `group:web`. - `web_fetch` diaktifkan secara default (kecuali dinonaktifkan secara eksplisit). - Jika `tools.web.fetch.provider` dihilangkan, OpenClaw mendeteksi otomatis provider fallback fetch siap pertama dari kredensial yang tersedia. Saat ini provider bawaannya adalah Firecrawl. - - Daemon membaca env vars dari `~/.openclaw/.env` (atau environment service). + - Daemon membaca env var dari `~/.openclaw/.env` (atau environment layanan). - Dokumen: [Web tools](/id/tools/web). + Dokumentasi: [Web tools](/id/tools/web). - - `config.apply` menggantikan **seluruh config**. Jika Anda mengirim objek parsial, semua yang + + `config.apply` mengganti **seluruh konfigurasi**. Jika Anda mengirim objek parsial, semua yang lain akan dihapus. Pemulihan: - - Pulihkan dari cadangan (git atau salinan `~/.openclaw/openclaw.json`). - - Jika Anda tidak punya cadangan, jalankan ulang `openclaw doctor` dan konfigurasi ulang channels/models. - - Jika ini tidak terduga, buat bug dan sertakan config terakhir yang Anda ketahui atau cadangan apa pun. - - Agent coding lokal sering kali dapat merekonstruksi config yang berfungsi dari log atau riwayat. + - Pulihkan dari backup (git atau salinan `~/.openclaw/openclaw.json`). + - Jika Anda tidak punya backup, jalankan ulang `openclaw doctor` dan konfigurasikan ulang channel/model. + - Jika ini tidak terduga, buat bug report dan sertakan konfigurasi terakhir yang Anda ketahui atau backup apa pun. + - Agent coding lokal sering kali dapat merekonstruksi konfigurasi yang berfungsi dari log atau riwayat. - Hindari ini: + Cara menghindarinya: - Gunakan `openclaw config set` untuk perubahan kecil. - Gunakan `openclaw configure` untuk edit interaktif. - - Gunakan `config.schema.lookup` terlebih dahulu saat Anda tidak yakin tentang path atau bentuk field yang tepat; perintah ini mengembalikan node skema dangkal plus ringkasan child langsung untuk penelusuran lebih lanjut. - - Gunakan `config.patch` untuk edit RPC parsial; simpan `config.apply` hanya untuk penggantian config penuh. - - Jika Anda menggunakan alat `gateway` khusus owner dari eksekusi agent, alat itu tetap akan menolak penulisan ke `tools.exec.ask` / `tools.exec.security` (termasuk alias lama `tools.bash.*` yang dinormalisasi ke jalur exec terlindungi yang sama). + - Gunakan `config.schema.lookup` terlebih dahulu saat Anda tidak yakin tentang path atau bentuk field yang tepat; ini mengembalikan node schema dangkal plus ringkasan child langsung untuk drill-down. + - Gunakan `config.patch` untuk edit RPC parsial; simpan `config.apply` hanya untuk penggantian konfigurasi penuh. + - Jika Anda menggunakan tool `gateway` yang hanya untuk owner dari run agent, tool tersebut tetap akan menolak penulisan ke `tools.exec.ask` / `tools.exec.security` (termasuk alias lama `tools.bash.*` yang dinormalisasi ke path exec terlindungi yang sama). - Dokumen: [Config](/cli/config), [Configure](/cli/configure), [Doctor](/id/gateway/doctor). + Dokumentasi: [Config](/cli/config), [Configure](/cli/configure), [Doctor](/id/gateway/doctor). - Pola umumnya adalah **satu Gateway** (mis. Raspberry Pi) plus **Node** dan **agent**: + Pola yang umum adalah **satu Gateway** (misalnya Raspberry Pi) plus **node** dan **agent**: - - **Gateway (pusat):** memiliki channels (Signal/WhatsApp), routing, dan sesi. - - **Nodes (perangkat):** Mac/iOS/Android terhubung sebagai periferal dan mengekspos alat lokal (`system.run`, `canvas`, `camera`). - - **Agents (worker):** otak/workspace terpisah untuk peran khusus (mis. "Hetzner ops", "Personal data"). - - **Sub-agents:** munculkan pekerjaan latar belakang dari agent utama saat Anda menginginkan paralelisme. - - **TUI:** hubungkan ke Gateway dan ganti agent/sesi. + - **Gateway (pusat):** memiliki channel (Signal/WhatsApp), routing, dan sesi. + - **Node (perangkat):** Mac/iOS/Android terhubung sebagai periferal dan mengekspos tool lokal (`system.run`, `canvas`, `camera`). + - **Agent (worker):** otak/workspace terpisah untuk peran khusus (misalnya "Hetzner ops", "Data pribadi"). + - **Sub-agent:** memunculkan pekerjaan latar belakang dari agent utama saat Anda menginginkan paralelisme. + - **TUI:** terhubung ke Gateway dan berpindah agent/sesi. - Dokumen: [Nodes](/id/nodes), [Remote access](/id/gateway/remote), [Multi-Agent Routing](/id/concepts/multi-agent), [Sub-agents](/id/tools/subagents), [TUI](/web/tui). + Dokumentasi: [Nodes](/id/nodes), [Remote access](/id/gateway/remote), [Multi-Agent Routing](/id/concepts/multi-agent), [Sub-agents](/id/tools/subagents), [TUI](/web/tui). - Ya. Ini adalah opsi config: + Ya. Itu adalah opsi konfigurasi: ```json5 { @@ -1693,17 +1693,17 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Setel `browser.executablePath` ke biner Brave Anda (atau browser berbasis Chromium lainnya) dan restart Gateway. - Lihat contoh config lengkap di [Browser](/id/tools/browser#use-brave-or-another-chromium-based-browser). + Setel `browser.executablePath` ke binary Brave Anda (atau browser berbasis Chromium lainnya) dan restart Gateway. + Lihat contoh konfigurasi lengkap di [Browser](/id/tools/browser#use-brave-or-another-chromium-based-browser). -## Gateway remote dan Node +## Gateway remote dan node - + Pesan Telegram ditangani oleh **gateway**. Gateway menjalankan agent dan - baru kemudian memanggil Node melalui **Gateway WebSocket** saat alat node diperlukan: + baru kemudian memanggil node melalui **Gateway WebSocket** saat tool node diperlukan: Telegram → Gateway → Agent → `node.*` → Node → Gateway → Telegram @@ -1712,59 +1712,59 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Jawaban singkat: **pasangkan komputer Anda sebagai Node**. Gateway berjalan di tempat lain, tetapi dapat - memanggil alat `node.*` (layar, kamera, sistem) di mesin lokal Anda melalui Gateway WebSocket. + Jawaban singkat: **pairing komputer Anda sebagai node**. Gateway berjalan di tempat lain, tetapi dapat + memanggil tool `node.*` (screen, camera, system) di mesin lokal Anda melalui Gateway WebSocket. - Penyiapan yang umum: + Penyiapan umum: 1. Jalankan Gateway di host yang selalu aktif (VPS/server rumahan). - 2. Tempatkan host Gateway + komputer Anda pada tailnet yang sama. - 3. Pastikan Gateway WS dapat dijangkau (bind tailnet atau tunnel SSH). + 2. Tempatkan host Gateway + komputer Anda di tailnet yang sama. + 3. Pastikan WS Gateway dapat dijangkau (bind tailnet atau SSH tunnel). 4. Buka aplikasi macOS secara lokal dan hubungkan dalam mode **Remote over SSH** (atau tailnet langsung) - sehingga aplikasi tersebut dapat mendaftar sebagai Node. - 5. Setujui Node di Gateway: + agar dapat terdaftar sebagai node. + 5. Setujui node di Gateway: ```bash openclaw devices list openclaw devices approve ``` - Tidak diperlukan bridge TCP terpisah; Nodes terhubung melalui Gateway WebSocket. + Tidak diperlukan bridge TCP terpisah; node terhubung melalui Gateway WebSocket. - Pengingat keamanan: memasangkan Node macOS memungkinkan `system.run` di mesin itu. Hanya - pasangkan perangkat yang Anda percayai, dan tinjau [Security](/id/gateway/security). + Pengingat keamanan: pairing node macOS memungkinkan `system.run` di mesin tersebut. Hanya + pairing perangkat yang Anda percayai, dan tinjau [Security](/id/gateway/security). - Dokumen: [Nodes](/id/nodes), [Gateway protocol](/id/gateway/protocol), [macOS remote mode](/id/platforms/mac/remote), [Security](/id/gateway/security). + Dokumentasi: [Nodes](/id/nodes), [Gateway protocol](/id/gateway/protocol), [macOS remote mode](/id/platforms/mac/remote), [Security](/id/gateway/security). - Periksa hal-hal dasarnya: + Periksa dasar-dasarnya: - Gateway berjalan: `openclaw gateway status` - - Kesehatan Gateway: `openclaw status` - - Kesehatan channel: `openclaw channels status` + - Health Gateway: `openclaw status` + - Health channel: `openclaw channels status` Lalu verifikasi auth dan routing: - Jika Anda menggunakan Tailscale Serve, pastikan `gateway.auth.allowTailscale` disetel dengan benar. - - Jika Anda terhubung melalui tunnel SSH, pastikan tunnel lokal aktif dan mengarah ke port yang benar. + - Jika Anda terhubung melalui SSH tunnel, pastikan tunnel lokal aktif dan mengarah ke port yang benar. - Pastikan allowlist Anda (DM atau grup) mencakup akun Anda. - Dokumen: [Tailscale](/id/gateway/tailscale), [Remote access](/id/gateway/remote), [Channels](/id/channels). + Dokumentasi: [Tailscale](/id/gateway/tailscale), [Remote access](/id/gateway/remote), [Channels](/id/channels). - + Ya. Tidak ada bridge "bot-ke-bot" bawaan, tetapi Anda dapat menghubungkannya dengan beberapa cara yang andal: - **Paling sederhana:** gunakan channel chat normal yang bisa diakses kedua bot (Telegram/Slack/WhatsApp). + **Paling sederhana:** gunakan channel chat normal yang dapat diakses kedua bot (Telegram/Slack/WhatsApp). Minta Bot A mengirim pesan ke Bot B, lalu biarkan Bot B membalas seperti biasa. - **CLI bridge (generik):** jalankan skrip yang memanggil Gateway lain dengan + **Bridge CLI (generik):** jalankan skrip yang memanggil Gateway lain dengan `openclaw agent --message ... --deliver`, menargetkan chat tempat bot lain - mendengarkan. Jika satu bot berada di VPS remote, arahkan CLI Anda ke Gateway remote itu + mendengarkan. Jika salah satu bot berada di VPS remote, arahkan CLI Anda ke Gateway remote tersebut melalui SSH/Tailscale (lihat [Remote access](/id/gateway/remote)). Contoh pola (jalankan dari mesin yang dapat menjangkau Gateway target): @@ -1773,63 +1773,63 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. openclaw agent --message "Hello from local bot" --deliver --channel telegram --reply-to ``` - Tip: tambahkan guardrail agar kedua bot tidak berulang tanpa akhir (hanya saat disebut, channel - allowlist, atau aturan "jangan balas pesan bot"). + Tip: tambahkan guardrail agar kedua bot tidak berulang tanpa henti (hanya bila disebut, channel + allowlist, atau aturan "jangan membalas pesan bot"). - Dokumen: [Remote access](/id/gateway/remote), [Agent CLI](/cli/agent), [Agent send](/id/tools/agent-send). + Dokumentasi: [Remote access](/id/gateway/remote), [Agent CLI](/cli/agent), [Agent send](/id/tools/agent-send). - - Tidak. Satu Gateway dapat menampung beberapa agent, masing-masing dengan workspace, default model, - dan routing-nya sendiri. Itulah penyiapan normal dan jauh lebih murah serta lebih sederhana daripada menjalankan + + Tidak. Satu Gateway dapat meng-host beberapa agent, masing-masing dengan workspace, model default, + dan routing sendiri. Itu adalah penyiapan normal dan jauh lebih murah serta lebih sederhana daripada menjalankan satu VPS per agent. - Gunakan VPS terpisah hanya ketika Anda memerlukan isolasi keras (batas keamanan) atau config yang sangat - berbeda yang tidak ingin Anda bagikan. Selain itu, pertahankan satu Gateway dan + Gunakan VPS terpisah hanya saat Anda memerlukan isolasi yang kuat (batas keamanan) atau konfigurasi yang sangat + berbeda yang tidak ingin Anda bagikan. Jika tidak, pertahankan satu Gateway dan gunakan beberapa agent atau sub-agent. - - Ya - Nodes adalah cara utama untuk menjangkau laptop Anda dari Gateway remote, dan mereka + + Ya - node adalah cara kelas satu untuk menjangkau laptop Anda dari Gateway remote, dan mereka membuka lebih dari sekadar akses shell. Gateway berjalan di macOS/Linux (Windows melalui WSL2) dan - ringan (VPS kecil atau perangkat setara Raspberry Pi sudah cukup; RAM 4 GB lebih dari cukup), jadi penyiapan yang umum - adalah host yang selalu aktif ditambah laptop Anda sebagai Node. + bersifat ringan (VPS kecil atau mesin setara Raspberry Pi sudah cukup; RAM 4 GB lebih dari cukup), jadi penyiapan + yang umum adalah host yang selalu aktif plus laptop Anda sebagai node. - - **Tidak perlu SSH masuk.** Nodes terhubung keluar ke Gateway WebSocket dan menggunakan pairing perangkat. - - **Kontrol eksekusi yang lebih aman.** `system.run` dibatasi oleh allowlist/persetujuan node di laptop itu. - - **Lebih banyak alat perangkat.** Nodes mengekspos `canvas`, `camera`, dan `screen` selain `system.run`. - - **Otomatisasi browser lokal.** Simpan Gateway di VPS, tetapi jalankan Chrome secara lokal melalui host node di laptop, atau sambungkan ke Chrome lokal di host melalui Chrome MCP. + - **Tidak perlu SSH masuk.** Node terhubung keluar ke Gateway WebSocket dan menggunakan pairing perangkat. + - **Kontrol eksekusi lebih aman.** `system.run` dibatasi oleh allowlist/persetujuan node di laptop tersebut. + - **Lebih banyak tool perangkat.** Node mengekspos `canvas`, `camera`, dan `screen` selain `system.run`. + - **Otomatisasi browser lokal.** Simpan Gateway di VPS, tetapi jalankan Chrome secara lokal melalui host node di laptop, atau lampirkan ke Chrome lokal di host melalui Chrome MCP. - SSH baik untuk akses shell ad hoc, tetapi Nodes lebih sederhana untuk alur kerja agent yang berkelanjutan dan + SSH tidak masalah untuk akses shell ad-hoc, tetapi node lebih sederhana untuk alur kerja agent yang berkelanjutan dan otomatisasi perangkat. - Dokumen: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes), [Browser](/id/tools/browser). + Dokumentasi: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes), [Browser](/id/tools/browser). - - Tidak. Hanya **satu gateway** yang seharusnya berjalan per host kecuali Anda sengaja menjalankan profil terisolasi (lihat [Multiple gateways](/id/gateway/multiple-gateways)). Nodes adalah periferal yang terhubung - ke gateway (Node iOS/Android, atau "mode node" macOS di aplikasi menubar). Untuk host node headless + + Tidak. Hanya **satu gateway** yang seharusnya berjalan per host kecuali Anda sengaja menjalankan profil terisolasi (lihat [Multiple gateways](/id/gateway/multiple-gateways)). Node adalah periferal yang terhubung + ke gateway (node iOS/Android, atau "mode node" macOS di aplikasi menubar). Untuk host node headless dan kontrol CLI, lihat [Node host CLI](/cli/node). Restart penuh diperlukan untuk perubahan `gateway`, `discovery`, dan `canvasHost`. - + Ya. - - `config.schema.lookup`: periksa satu subtree config dengan node skema dangkalnya, petunjuk UI yang cocok, dan ringkasan child langsung sebelum menulis + - `config.schema.lookup`: periksa satu subtree konfigurasi dengan node schema dangkalnya, hint UI yang cocok, dan ringkasan child langsung sebelum menulis - `config.get`: ambil snapshot + hash saat ini - - `config.patch`: pembaruan parsial aman (lebih disukai untuk sebagian besar edit RPC); hot-reload bila memungkinkan dan restart bila diperlukan - - `config.apply`: validasi + ganti seluruh config; hot-reload bila memungkinkan dan restart bila diperlukan - - Alat runtime `gateway` khusus owner tetap menolak penulisan ulang `tools.exec.ask` / `tools.exec.security`; alias lama `tools.bash.*` dinormalisasi ke jalur exec terlindungi yang sama + - `config.patch`: pembaruan parsial yang aman (lebih disukai untuk sebagian besar edit RPC); hot-reload bila memungkinkan dan restart bila diperlukan + - `config.apply`: validasi + ganti konfigurasi penuh; hot-reload bila memungkinkan dan restart bila diperlukan + - Tool runtime `gateway` yang hanya untuk owner tetap menolak penulisan ulang `tools.exec.ask` / `tools.exec.security`; alias lama `tools.bash.*` dinormalisasi ke path exec terlindungi yang sama - + ```json5 { agents: { defaults: { workspace: "~/.openclaw/workspace" } }, @@ -1844,15 +1844,15 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Langkah minimal: - 1. **Instal + login di VPS** + 1. **Pasang + login di VPS** ```bash curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up ``` - 2. **Instal + login di Mac Anda** - - Gunakan aplikasi Tailscale dan masuk ke tailnet yang sama. + 2. **Pasang + login di Mac Anda** + - Gunakan aplikasi Tailscale dan login ke tailnet yang sama. 3. **Aktifkan MagicDNS (direkomendasikan)** - Di konsol admin Tailscale, aktifkan MagicDNS agar VPS memiliki nama yang stabil. 4. **Gunakan hostname tailnet** @@ -1869,49 +1869,49 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - - Serve mengekspos **Gateway Control UI + WS**. Nodes terhubung melalui endpoint Gateway WS yang sama. + + Serve mengekspos **Gateway Control UI + WS**. Node terhubung melalui endpoint Gateway WS yang sama. Penyiapan yang direkomendasikan: 1. **Pastikan VPS + Mac berada di tailnet yang sama**. - 2. **Gunakan aplikasi macOS dalam mode Remote** (target SSH bisa berupa hostname tailnet). - Aplikasi akan membuat tunnel port Gateway dan terhubung sebagai Node. - 3. **Setujui Node** di gateway: + 2. **Gunakan aplikasi macOS dalam mode Remote** (target SSH dapat berupa hostname tailnet). + Aplikasi akan men-tunnel port Gateway dan terhubung sebagai node. + 3. **Setujui node** di gateway: ```bash openclaw devices list openclaw devices approve ``` - Dokumen: [Gateway protocol](/id/gateway/protocol), [Discovery](/id/gateway/discovery), [macOS remote mode](/id/platforms/mac/remote). + Dokumentasi: [Gateway protocol](/id/gateway/protocol), [Discovery](/id/gateway/discovery), [macOS remote mode](/id/platforms/mac/remote). - - Jika Anda hanya membutuhkan **alat lokal** (screen/camera/exec) di laptop kedua, tambahkan sebagai - **Node**. Itu mempertahankan satu Gateway dan menghindari duplikasi config. Alat node lokal + + Jika Anda hanya memerlukan **tool lokal** (screen/camera/exec) di laptop kedua, tambahkan saja sebagai + **node**. Itu mempertahankan satu Gateway dan menghindari konfigurasi ganda. Tool node lokal saat ini hanya untuk macOS, tetapi kami berencana memperluasnya ke OS lain. - Instal Gateway kedua hanya ketika Anda memerlukan **isolasi keras** atau dua bot yang benar-benar terpisah. + Pasang Gateway kedua hanya saat Anda memerlukan **isolasi yang kuat** atau dua bot yang sepenuhnya terpisah. - Dokumen: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes), [Multiple gateways](/id/gateway/multiple-gateways). + Dokumentasi: [Nodes](/id/nodes), [Nodes CLI](/cli/nodes), [Multiple gateways](/id/gateway/multiple-gateways). -## Env vars dan pemuatan .env +## Env var dan pemuatan .env - - OpenClaw membaca env vars dari proses induk (shell, launchd/systemd, CI, dll.) dan juga memuat: + + OpenClaw membaca env var dari proses induk (shell, launchd/systemd, CI, dll.) dan juga memuat: - - `.env` dari direktori kerja saat ini + - `.env` dari current working directory - fallback `.env` global dari `~/.openclaw/.env` (alias `$OPENCLAW_STATE_DIR/.env`) - Tidak satu pun file `.env` menimpa env vars yang sudah ada. + Tidak ada file `.env` yang menimpa env var yang sudah ada. - Anda juga dapat mendefinisikan env vars inline di config (diterapkan hanya jika tidak ada dari env proses): + Anda juga dapat mendefinisikan env var inline di konfigurasi (hanya diterapkan jika hilang dari env proses): ```json5 { @@ -1926,11 +1926,11 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - + Dua perbaikan umum: - 1. Masukkan kunci yang hilang ke `~/.openclaw/.env` agar tetap diambil bahkan ketika service tidak mewarisi env shell Anda. - 2. Aktifkan impor shell (kemudahan opsional): + 1. Masukkan key yang hilang ke `~/.openclaw/.env` agar tetap diambil meskipun layanan tidak mewarisi env shell Anda. + 2. Aktifkan import shell (kemudahan opsional): ```json5 { @@ -1943,18 +1943,18 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. } ``` - Ini menjalankan login shell Anda dan hanya mengimpor kunci yang diharapkan tetapi hilang (tidak pernah menimpa). Padanan env var: + Ini menjalankan login shell Anda dan hanya mengimpor key yang diharapkan dan hilang (tidak pernah menimpa). Padanan env var: `OPENCLAW_LOAD_SHELL_ENV=1`, `OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000`. - - `openclaw models status` melaporkan apakah **impor env shell** diaktifkan. "Shell env: off" - **tidak** berarti env vars Anda hilang - itu hanya berarti OpenClaw tidak akan memuat + + `openclaw models status` melaporkan apakah **import env shell** diaktifkan. "Shell env: off" + **tidak** berarti env var Anda hilang - itu hanya berarti OpenClaw tidak akan memuat login shell Anda secara otomatis. - Jika Gateway berjalan sebagai service (launchd/systemd), Gateway tidak akan mewarisi env - shell Anda. Perbaiki dengan salah satu cara berikut: + Jika Gateway berjalan sebagai layanan (launchd/systemd), Gateway tidak akan mewarisi + environment shell Anda. Perbaiki dengan melakukan salah satu dari ini: 1. Masukkan token ke `~/.openclaw/.env`: @@ -1962,8 +1962,8 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. COPILOT_GITHUB_TOKEN=... ``` - 2. Atau aktifkan impor shell (`env.shellEnv.enabled: true`). - 3. Atau tambahkan ke blok `env` config Anda (diterapkan hanya jika hilang). + 2. Atau aktifkan import shell (`env.shellEnv.enabled: true`). + 3. Atau tambahkan ke blok `env` konfigurasi Anda (hanya berlaku jika hilang). Lalu restart gateway dan periksa ulang: @@ -1984,10 +1984,10 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Kirim `/new` atau `/reset` sebagai pesan mandiri. Lihat [Session management](/id/concepts/session). - + Sesi dapat kedaluwarsa setelah `session.idleMinutes`, tetapi ini **dinonaktifkan secara default** (default **0**). - Setel ke nilai positif untuk mengaktifkan kedaluwarsa saat idle. Saat diaktifkan, pesan **berikutnya** - setelah masa idle akan memulai ID sesi baru untuk kunci chat tersebut. + Setel ke nilai positif untuk mengaktifkan kedaluwarsa idle. Saat diaktifkan, pesan **berikutnya** + setelah periode idle akan memulai ID sesi baru untuk kunci chat tersebut. Ini tidak menghapus transkrip - hanya memulai sesi baru. ```json5 @@ -2000,21 +2000,21 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - - Ya, melalui **routing multi-agent** dan **sub-agent**. Anda dapat membuat satu agent + + Ya, melalui **multi-agent routing** dan **sub-agent**. Anda dapat membuat satu agent koordinator dan beberapa agent pekerja dengan workspace dan model mereka sendiri. - Meskipun begitu, ini paling baik dianggap sebagai **eksperimen yang menyenangkan**. Ini memakan banyak token dan sering - kali kurang efisien daripada menggunakan satu bot dengan sesi terpisah. Model tipikal yang - kami bayangkan adalah satu bot yang Anda ajak bicara, dengan sesi yang berbeda untuk pekerjaan paralel. Bot itu + Meski begitu, ini sebaiknya dilihat sebagai **eksperimen yang menyenangkan**. Ini memakan banyak token dan sering kali + kurang efisien daripada menggunakan satu bot dengan sesi terpisah. Model umum yang kami + bayangkan adalah satu bot yang Anda ajak bicara, dengan sesi berbeda untuk pekerjaan paralel. Bot itu juga dapat memunculkan sub-agent saat diperlukan. - Dokumen: [Multi-agent routing](/id/concepts/multi-agent), [Sub-agents](/id/tools/subagents), [Agents CLI](/cli/agents). + Dokumentasi: [Multi-agent routing](/id/concepts/multi-agent), [Sub-agents](/id/tools/subagents), [Agents CLI](/cli/agents). - Konteks sesi dibatasi oleh jendela model. Chat yang panjang, output alat yang besar, atau banyak + Konteks sesi dibatasi oleh jendela model. Chat panjang, output tool besar, atau banyak file dapat memicu Compaction atau pemotongan. Yang membantu: @@ -2027,7 +2027,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - + Gunakan perintah reset: ```bash @@ -2048,22 +2048,22 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Catatan: - - Onboarding juga menawarkan **Reset** jika melihat config yang ada. Lihat [Onboarding (CLI)](/id/start/wizard). - - Jika Anda menggunakan profil (`--profile` / `OPENCLAW_PROFILE`), reset setiap direktori state (default adalah `~/.openclaw-`). - - Reset dev: `openclaw gateway --dev --reset` (khusus dev; menghapus config dev + kredensial + sesi + workspace). + - Onboarding juga menawarkan **Reset** jika melihat konfigurasi yang sudah ada. Lihat [Onboarding (CLI)](/id/start/wizard). + - Jika Anda menggunakan profil (`--profile` / `OPENCLAW_PROFILE`), reset setiap direktori status (default adalah `~/.openclaw-`). + - Reset dev: `openclaw gateway --dev --reset` (khusus dev; menghapus konfigurasi dev + kredensial + sesi + workspace). - + Gunakan salah satu dari ini: - - **Compact** (tetap mempertahankan percakapan tetapi merangkum giliran lama): + - **Compact** (mempertahankan percakapan tetapi merangkum giliran yang lebih lama): ``` /compact ``` - atau `/compact ` untuk memandu ringkasannya. + atau `/compact ` untuk memandu ringkasan. - **Reset** (ID sesi baru untuk kunci chat yang sama): @@ -2074,17 +2074,17 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Jika ini terus terjadi: - - Aktifkan atau sesuaikan **session pruning** (`agents.defaults.contextPruning`) untuk memangkas output alat lama. + - Aktifkan atau sesuaikan **session pruning** (`agents.defaults.contextPruning`) untuk memangkas output tool lama. - Gunakan model dengan jendela konteks yang lebih besar. - Dokumen: [Compaction](/id/concepts/compaction), [Session pruning](/id/concepts/session-pruning), [Session management](/id/concepts/session). + Dokumentasi: [Compaction](/id/concepts/compaction), [Session pruning](/id/concepts/session-pruning), [Session management](/id/concepts/session). - Ini adalah error validasi provider: model mengeluarkan blok `tool_use` tanpa `input` yang diperlukan. - Biasanya itu berarti riwayat sesi basi atau rusak (sering setelah thread panjang - atau perubahan alat/skema). + Ini adalah error validasi provider: model mengeluarkan blok `tool_use` tanpa + `input` yang diwajibkan. Biasanya berarti riwayat sesi sudah basi atau rusak (sering setelah thread panjang + atau perubahan tool/schema). Perbaikan: mulai sesi baru dengan `/new` (pesan mandiri). @@ -2105,19 +2105,19 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. } ``` - Jika `HEARTBEAT.md` ada tetapi pada dasarnya kosong (hanya baris kosong dan header - markdown seperti `# Heading`), OpenClaw melewati eksekusi heartbeat untuk menghemat panggilan API. - Jika file itu tidak ada, heartbeat tetap berjalan dan model memutuskan apa yang harus dilakukan. + Jika `HEARTBEAT.md` ada tetapi secara efektif kosong (hanya baris kosong dan header + markdown seperti `# Heading`), OpenClaw melewati run Heartbeat untuk menghemat panggilan API. + Jika file tidak ada, Heartbeat tetap berjalan dan model memutuskan apa yang harus dilakukan. - Override per-agent menggunakan `agents.list[].heartbeat`. Dokumen: [Heartbeat](/id/gateway/heartbeat). + Override per-agent menggunakan `agents.list[].heartbeat`. Dokumentasi: [Heartbeat](/id/gateway/heartbeat). - Tidak. OpenClaw berjalan di **akun Anda sendiri**, jadi jika Anda berada di grup itu, OpenClaw dapat melihatnya. + Tidak. OpenClaw berjalan di **akun Anda sendiri**, jadi jika Anda ada di grup itu, OpenClaw dapat melihatnya. Secara default, balasan grup diblokir sampai Anda mengizinkan pengirim (`groupPolicy: "allowlist"`). - Jika Anda ingin hanya **Anda** yang dapat memicu balasan grup: + Jika Anda hanya ingin **Anda** yang dapat memicu balasan grup: ```json5 { @@ -2142,13 +2142,13 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Cari `chatId` (atau `from`) yang berakhiran `@g.us`, seperti: `1234567890-1234567890@g.us`. - Opsi 2 (jika sudah dikonfigurasi/di-allowlist): daftar grup dari config: + Opsi 2 (jika sudah dikonfigurasi/di-allowlist): daftar grup dari konfigurasi: ```bash openclaw directory groups list --channel whatsapp ``` - Dokumen: [WhatsApp](/id/channels/whatsapp), [Directory](/cli/directory), [Logs](/cli/logs). + Dokumentasi: [WhatsApp](/id/channels/whatsapp), [Directory](/cli/directory), [Logs](/cli/logs). @@ -2163,7 +2163,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Chat langsung secara default runtuh ke sesi utama. Grup/channel memiliki kunci sesi mereka sendiri, dan topik Telegram / thread Discord adalah sesi terpisah. Lihat [Groups](/id/channels/groups) dan [Group messages](/id/channels/group-messages). + Chat langsung collapse ke sesi utama secara default. Grup/channel memiliki kunci sesi sendiri, dan topik Telegram / thread Discord adalah sesi terpisah. Lihat [Groups](/id/channels/groups) dan [Group messages](/id/channels/group-messages). @@ -2173,7 +2173,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - **Biaya token:** lebih banyak agent berarti lebih banyak penggunaan model secara bersamaan. - **Overhead operasional:** profil auth, workspace, dan routing channel per-agent. - Tips: + Tip: - Pertahankan satu workspace **aktif** per agent (`agents.defaults.workspace`). - Pangkas sesi lama (hapus entri JSONL atau store) jika disk membesar. @@ -2181,11 +2181,11 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - + Ya. Gunakan **Multi-Agent Routing** untuk menjalankan beberapa agent terisolasi dan merutekan pesan masuk berdasarkan channel/akun/peer. Slack didukung sebagai channel dan dapat diikat ke agent tertentu. - Akses browser sangat kuat tetapi bukan "bisa melakukan apa pun yang bisa dilakukan manusia" - anti-bot, CAPTCHA, dan MFA tetap + Akses browser sangat kuat tetapi bukan berarti "bisa melakukan apa pun yang bisa dilakukan manusia" - anti-bot, CAPTCHA, dan MFA tetap dapat memblokir otomatisasi. Untuk kontrol browser yang paling andal, gunakan Chrome MCP lokal di host, atau gunakan CDP di mesin yang benar-benar menjalankan browser. @@ -2193,35 +2193,35 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Host Gateway yang selalu aktif (VPS/Mac mini). - Satu agent per peran (binding). - - Channel Slack terikat ke agent-agent tersebut. - - Browser lokal melalui Chrome MCP atau Node saat diperlukan. + - Channel Slack yang diikat ke agent tersebut. + - Browser lokal melalui Chrome MCP atau node jika diperlukan. - Dokumen: [Multi-Agent Routing](/id/concepts/multi-agent), [Slack](/id/channels/slack), + Dokumentasi: [Multi-Agent Routing](/id/concepts/multi-agent), [Slack](/id/channels/slack), [Browser](/id/tools/browser), [Nodes](/id/nodes). -## Models: default, pemilihan, alias, peralihan +## Model: default, pemilihan, alias, peralihan - - Model default OpenClaw adalah apa pun yang Anda tetapkan sebagai: + + Model default OpenClaw adalah apa pun yang Anda setel sebagai: ``` agents.defaults.model.primary ``` - Models direferensikan sebagai `provider/model` (contoh: `openai/gpt-5.4`). Jika Anda menghilangkan provider, OpenClaw pertama-tama mencoba alias, lalu kecocokan provider terkonfigurasi yang unik untuk ID model persis itu, dan baru setelah itu menggunakan fallback ke provider default yang dikonfigurasi sebagai jalur kompatibilitas usang. Jika provider itu tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw menggunakan fallback ke provider/model terkonfigurasi pertama alih-alih menampilkan default provider usang yang sudah dihapus. Anda tetap sebaiknya **secara eksplisit** menetapkan `provider/model`. + Model dirujuk sebagai `provider/model` (contoh: `openai/gpt-5.4`). Jika Anda menghilangkan provider, OpenClaw pertama-tama mencoba alias, lalu kecocokan configured-provider unik untuk ID model yang tepat, dan baru kemudian fallback ke provider default yang dikonfigurasi sebagai jalur kompatibilitas lama. Jika provider itu tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw akan fallback ke provider/model pertama yang dikonfigurasi alih-alih menampilkan default provider yang sudah usang dan dihapus. Anda tetap sebaiknya **secara eksplisit** menetapkan `provider/model`. - **Default yang direkomendasikan:** gunakan model generasi terbaru terkuat yang tersedia dalam tumpukan provider Anda. - **Untuk agent dengan alat aktif atau input yang tidak tepercaya:** prioritaskan kekuatan model daripada biaya. - **Untuk chat rutin/berisiko rendah:** gunakan model fallback yang lebih murah dan rute berdasarkan peran agent. + **Default yang direkomendasikan:** gunakan model generasi terbaru terkuat yang tersedia dalam stack provider Anda. + **Untuk agent dengan tool atau input yang tidak tepercaya:** prioritaskan kekuatan model daripada biaya. + **Untuk chat rutin/berisiko rendah:** gunakan model fallback yang lebih murah dan rutekan berdasarkan peran agent. - MiniMax memiliki dokumennya sendiri: [MiniMax](/id/providers/minimax) dan + MiniMax memiliki dokumentasi sendiri: [MiniMax](/id/providers/minimax) dan [Local models](/id/gateway/local-models). Aturan praktis: gunakan **model terbaik yang mampu Anda bayar** untuk pekerjaan berisiko tinggi, dan model yang lebih murah @@ -2230,38 +2230,38 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. [Sub-agents](/id/tools/subagents). Peringatan keras: model yang lebih lemah/terlalu terkuantisasi lebih rentan terhadap prompt - injection dan perilaku tidak aman. Lihat [Security](/id/gateway/security). + injection dan perilaku yang tidak aman. Lihat [Security](/id/gateway/security). Konteks lebih lanjut: [Models](/id/concepts/models). - - Gunakan **perintah model** atau edit hanya field **model**. Hindari penggantian config penuh. + + Gunakan **perintah model** atau edit hanya field **model**. Hindari penggantian konfigurasi penuh. Opsi aman: - `/model` di chat (cepat, per sesi) - - `openclaw models set ...` (hanya memperbarui config model) + - `openclaw models set ...` (hanya memperbarui konfigurasi model) - `openclaw configure --section model` (interaktif) - edit `agents.defaults.model` di `~/.openclaw/openclaw.json` - Hindari `config.apply` dengan objek parsial kecuali Anda memang ingin mengganti seluruh config. - Untuk edit RPC, periksa dulu dengan `config.schema.lookup` dan lebih pilih `config.patch`. Payload lookup memberi Anda path yang dinormalisasi, dokumentasi/kendala skema dangkal, dan ringkasan child langsung + Hindari `config.apply` dengan objek parsial kecuali Anda memang ingin mengganti seluruh konfigurasi. + Untuk edit RPC, periksa terlebih dahulu dengan `config.schema.lookup` dan pilih `config.patch`. Payload lookup memberi Anda path yang dinormalisasi, dokumentasi/kendala schema dangkal, dan ringkasan child langsung. untuk pembaruan parsial. - Jika Anda memang menimpa config, pulihkan dari cadangan atau jalankan ulang `openclaw doctor` untuk memperbaikinya. + Jika Anda memang menimpa konfigurasi, pulihkan dari backup atau jalankan ulang `openclaw doctor` untuk memperbaikinya. - Dokumen: [Models](/id/concepts/models), [Configure](/cli/configure), [Config](/cli/config), [Doctor](/id/gateway/doctor). + Dokumentasi: [Models](/id/concepts/models), [Configure](/cli/configure), [Config](/cli/config), [Doctor](/id/gateway/doctor). - Ya. Ollama adalah jalur termudah untuk model lokal. + Ya. Ollama adalah jalur paling mudah untuk model lokal. Penyiapan tercepat: - 1. Instal Ollama dari `https://ollama.com/download` - 2. Tarik model lokal seperti `ollama pull gemma4` + 1. Pasang Ollama dari `https://ollama.com/download` + 2. Pull model lokal seperti `ollama pull gemma4` 3. Jika Anda juga menginginkan model cloud, jalankan `ollama signin` 4. Jalankan `openclaw onboard` dan pilih `Ollama` 5. Pilih `Local` atau `Cloud + Local` @@ -2273,19 +2273,19 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - untuk peralihan manual, gunakan `openclaw models list` dan `openclaw models set ollama/` Catatan keamanan: model yang lebih kecil atau sangat terkuantisasi lebih rentan terhadap prompt - injection. Kami sangat merekomendasikan **model besar** untuk bot apa pun yang dapat menggunakan alat. - Jika Anda tetap menginginkan model kecil, aktifkan sandboxing dan allowlist alat yang ketat. + injection. Kami sangat merekomendasikan **model besar** untuk bot apa pun yang dapat menggunakan tool. + Jika Anda tetap ingin model kecil, aktifkan sandboxing dan allowlist tool yang ketat. - Dokumen: [Ollama](/id/providers/ollama), [Local models](/id/gateway/local-models), + Dokumentasi: [Ollama](/id/providers/ollama), [Local models](/id/gateway/local-models), [Model providers](/id/concepts/model-providers), [Security](/id/gateway/security), [Sandboxing](/id/gateway/sandboxing). - - Deployment ini bisa berbeda dan dapat berubah dari waktu ke waktu; tidak ada rekomendasi provider yang tetap. - - Periksa pengaturan runtime saat ini pada setiap gateway dengan `openclaw models status`. - - Untuk agent yang sensitif terhadap keamanan/dengan alat aktif, gunakan model generasi terbaru terkuat yang tersedia. + - Deployment ini bisa berbeda dan dapat berubah seiring waktu; tidak ada rekomendasi provider yang tetap. + - Periksa pengaturan runtime saat ini di setiap gateway dengan `openclaw models status`. + - Untuk agent yang sensitif terhadap keamanan/menggunakan tool, gunakan model generasi terbaru terkuat yang tersedia. @@ -2303,7 +2303,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Ini adalah alias bawaan. Alias kustom dapat ditambahkan melalui `agents.defaults.models`. - Anda dapat mencantumkan model yang tersedia dengan `/model`, `/model list`, atau `/model status`. + Anda dapat melihat daftar model yang tersedia dengan `/model`, `/model list`, atau `/model status`. `/model` (dan `/model list`) menampilkan pemilih ringkas bernomor. Pilih berdasarkan nomor: @@ -2318,27 +2318,27 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. /model opus@anthropic:work ``` - Tip: `/model status` menampilkan agent mana yang aktif, file `auth-profiles.json` mana yang sedang digunakan, dan profil auth mana yang akan dicoba berikutnya. - Perintah ini juga menampilkan endpoint provider yang dikonfigurasi (`baseUrl`) dan mode API (`api`) bila tersedia. + Tip: `/model status` menampilkan agent mana yang aktif, file `auth-profiles.json` mana yang digunakan, dan profil auth mana yang akan dicoba berikutnya. + Ini juga menampilkan endpoint provider yang dikonfigurasi (`baseUrl`) dan mode API (`api`) bila tersedia. - **Bagaimana cara melepas pin profil yang saya setel dengan @profile?** + **Bagaimana cara melepaskan pin profil yang saya setel dengan @profile?** - Jalankan kembali `/model` **tanpa** sufiks `@profile`: + Jalankan ulang `/model` **tanpa** akhiran `@profile`: ``` /model anthropic/claude-opus-4-6 ``` Jika Anda ingin kembali ke default, pilih dari `/model` (atau kirim `/model `). - Gunakan `/model status` untuk mengonfirmasi profil auth mana yang aktif. + Gunakan `/model status` untuk memastikan profil auth mana yang aktif. - Ya. Tetapkan salah satu sebagai default dan ganti sesuai kebutuhan: + Ya. Tetapkan satu sebagai default dan ganti sesuai kebutuhan: - - **Peralihan cepat (per sesi):** `/model gpt-5.4` untuk tugas harian, `/model openai-codex/gpt-5.4` untuk coding dengan Codex OAuth. - - **Default + ganti:** setel `agents.defaults.model.primary` ke `openai/gpt-5.4`, lalu ganti ke `openai-codex/gpt-5.4` saat coding (atau sebaliknya). + - **Peralihan cepat (per sesi):** `/model gpt-5.4` untuk tugas harian, `/model openai-codex/gpt-5.4` untuk coding dengan OAuth Codex. + - **Default + peralihan:** setel `agents.defaults.model.primary` ke `openai/gpt-5.4`, lalu ganti ke `openai-codex/gpt-5.4` saat coding (atau sebaliknya). - **Sub-agent:** rute tugas coding ke sub-agent dengan model default yang berbeda. Lihat [Models](/id/concepts/models) dan [Slash commands](/id/tools/slash-commands). @@ -2346,11 +2346,11 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Gunakan toggle sesi atau default config: + Gunakan toggle sesi atau default konfigurasi: - **Per sesi:** kirim `/fast on` saat sesi menggunakan `openai/gpt-5.4` atau `openai-codex/gpt-5.4`. - **Default per model:** setel `agents.defaults.models["openai/gpt-5.4"].params.fastMode` ke `true`. - - **Juga untuk Codex OAuth:** jika Anda juga menggunakan `openai-codex/gpt-5.4`, setel flag yang sama di sana. + - **OAuth Codex juga:** jika Anda juga menggunakan `openai-codex/gpt-5.4`, setel flag yang sama di sana. Contoh: @@ -2375,39 +2375,39 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. } ``` - Untuk OpenAI, fast mode dipetakan ke `service_tier = "priority"` pada permintaan Responses native yang didukung. Override sesi `/fast` mengalahkan default config. + Untuk OpenAI, fast mode dipetakan ke `service_tier = "priority"` pada permintaan Responses native yang didukung. Override sesi `/fast` mengalahkan default konfigurasi. Lihat [Thinking and fast mode](/id/tools/thinking) dan [OpenAI fast mode](/id/providers/openai#openai-fast-mode). - Jika `agents.defaults.models` disetel, itu menjadi **allowlist** untuk `/model` dan semua - override sesi. Memilih model yang tidak ada dalam daftar itu akan mengembalikan: + Jika `agents.defaults.models` disetel, itu menjadi **allowlist** untuk `/model` dan override + sesi apa pun. Memilih model yang tidak ada dalam daftar itu akan mengembalikan: ``` Model "provider/model" is not allowed. Use /model to list available models. ``` - Error itu dikembalikan **sebagai pengganti** balasan normal. Perbaikan: tambahkan model ke + Error itu dikembalikan **sebagai pengganti** balasan normal. Perbaikan: tambahkan model tersebut ke `agents.defaults.models`, hapus allowlist, atau pilih model dari `/model list`. - Ini berarti **provider belum dikonfigurasi** (tidak ditemukan config provider MiniMax atau + Ini berarti **provider belum dikonfigurasi** (tidak ditemukan konfigurasi provider MiniMax atau profil auth), sehingga model tidak dapat di-resolve. - Daftar periksa perbaikan: + Checklist perbaikan: 1. Upgrade ke rilis OpenClaw terbaru (atau jalankan dari source `main`), lalu restart gateway. 2. Pastikan MiniMax dikonfigurasi (wizard atau JSON), atau auth MiniMax - ada di env/profil auth sehingga provider yang cocok dapat disuntikkan + ada di env/profil auth sehingga provider yang cocok bisa diinjeksi (`MINIMAX_API_KEY` untuk `minimax`, `MINIMAX_OAUTH_TOKEN` atau MiniMax - OAuth tersimpan untuk `minimax-portal`). - 3. Gunakan ID model yang tepat (peka huruf besar-kecil) untuk jalur auth Anda: + OAuth yang tersimpan untuk `minimax-portal`). + 3. Gunakan ID model yang tepat (peka huruf besar/kecil) untuk jalur auth Anda: `minimax/MiniMax-M2.7` atau `minimax/MiniMax-M2.7-highspeed` untuk penyiapan - kunci API, atau `minimax-portal/MiniMax-M2.7` / + API key, atau `minimax-portal/MiniMax-M2.7` / `minimax-portal/MiniMax-M2.7-highspeed` untuk penyiapan OAuth. 4. Jalankan: @@ -2423,7 +2423,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Ya. Gunakan **MiniMax sebagai default** dan ganti model **per sesi** saat diperlukan. - Fallback adalah untuk **error**, bukan "tugas sulit", jadi gunakan `/model` atau agent terpisah. + Fallback untuk **error**, bukan "tugas sulit", jadi gunakan `/model` atau agent terpisah. **Opsi A: ganti per sesi** @@ -2454,12 +2454,12 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - Default Agent B: OpenAI - Rute berdasarkan agent atau gunakan `/agent` untuk beralih - Dokumen: [Models](/id/concepts/models), [Multi-Agent Routing](/id/concepts/multi-agent), [MiniMax](/id/providers/minimax), [OpenAI](/id/providers/openai). + Dokumentasi: [Models](/id/concepts/models), [Multi-Agent Routing](/id/concepts/multi-agent), [MiniMax](/id/providers/minimax), [OpenAI](/id/providers/openai). - Ya. OpenClaw menyediakan beberapa singkatan default (hanya diterapkan saat model tersebut ada di `agents.defaults.models`): + Ya. OpenClaw menyediakan beberapa shorthand default (hanya diterapkan saat model tersebut ada di `agents.defaults.models`): - `opus` → `anthropic/claude-opus-4-6` - `sonnet` → `anthropic/claude-sonnet-4-6` @@ -2470,7 +2470,7 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. - `gemini-flash` → `google/gemini-3-flash-preview` - `gemini-flash-lite` → `google/gemini-3.1-flash-lite-preview` - Jika Anda menetapkan alias sendiri dengan nama yang sama, nilai Anda yang menang. + Jika Anda menetapkan alias sendiri dengan nama yang sama, nilai Anda yang akan menang. @@ -2525,9 +2525,9 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. } ``` - Jika Anda mereferensikan provider/model tetapi kunci provider yang diperlukan tidak ada, Anda akan mendapatkan error auth runtime (mis. `No API key found for provider "zai"`). + Jika Anda merujuk provider/model tetapi key provider yang diperlukan tidak ada, Anda akan mendapatkan error auth runtime (misalnya `No API key found for provider "zai"`). - **Tidak ada kunci API yang ditemukan untuk provider setelah menambahkan agent baru** + **No API key found for provider setelah menambahkan agent baru** Ini biasanya berarti **agent baru** memiliki penyimpanan auth kosong. Auth bersifat per-agent dan disimpan di: @@ -2538,109 +2538,109 @@ untuk penggunaan/penagihan dan naikkan batas sesuai kebutuhan. Opsi perbaikan: - - Jalankan `openclaw agents add ` dan konfigurasi auth selama wizard. + - Jalankan `openclaw agents add ` dan konfigurasikan auth selama wizard. - Atau salin `auth-profiles.json` dari `agentDir` agent utama ke `agentDir` agent baru. - **Jangan** gunakan ulang `agentDir` di beberapa agent; ini menyebabkan bentrokan auth/sesi. + **Jangan** menggunakan kembali `agentDir` di beberapa agent; itu menyebabkan benturan auth/sesi. -## Failover model dan "All models failed" +## Model failover dan "All models failed" - + Failover terjadi dalam dua tahap: - 1. **Rotasi profil auth** dalam provider yang sama. + 1. **Rotasi profil auth** di dalam provider yang sama. 2. **Fallback model** ke model berikutnya di `agents.defaults.model.fallbacks`. - Cooldown berlaku untuk profil yang gagal (exponential backoff), sehingga OpenClaw dapat terus merespons bahkan saat provider terkena rate limit atau sementara gagal. + Cooldown berlaku untuk profil yang gagal (exponential backoff), sehingga OpenClaw dapat tetap membalas bahkan saat provider terkena rate limit atau gagal sementara. Bucket rate limit mencakup lebih dari sekadar respons `429`. OpenClaw juga memperlakukan pesan seperti `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, `workers_ai ... quota limit exceeded`, `resource exhausted`, dan batas - jendela penggunaan berkala (`weekly/monthly limit reached`) sebagai rate limit - yang layak untuk failover. + jendela penggunaan berkala (`weekly/monthly limit reached`) sebagai + rate limit yang layak untuk failover. Beberapa respons yang tampak seperti penagihan bukan `402`, dan beberapa respons HTTP `402` juga tetap berada dalam bucket sementara itu. Jika provider mengembalikan - teks penagihan eksplisit pada `401` atau `403`, OpenClaw tetap dapat menjaga itu - di jalur penagihan, tetapi matcher teks khusus provider tetap dibatasi pada - provider yang memilikinya (misalnya OpenRouter `Key limit exceeded`). Jika pesan `402` + teks penagihan eksplisit pada `401` atau `403`, OpenClaw masih bisa menyimpannya di + jalur penagihan, tetapi pencocok teks khusus provider tetap dibatasi pada + provider yang memilikinya (misalnya OpenRouter `Key limit exceeded`). Jika sebuah pesan `402` justru tampak seperti jendela penggunaan yang bisa dicoba ulang atau - batas belanja organisasi/workspace (`daily limit reached, resets tomorrow`, + batas pengeluaran organisasi/workspace (`daily limit reached, resets tomorrow`, `organization spending limit exceeded`), OpenClaw memperlakukannya sebagai `rate_limit`, bukan penonaktifan penagihan jangka panjang. - Error luapan konteks berbeda: signature seperti + Error overflow konteks berbeda: signature seperti `request_too_large`, `input exceeds the maximum number of tokens`, `input token count exceeds the maximum number of input tokens`, `input is too long for the model`, atau `ollama error: context length - exceeded` tetap berada di jalur Compaction/coba ulang alih-alih memajukan + exceeded` tetap berada pada jalur Compaction/retry alih-alih memajukan fallback model. Teks error server generik sengaja dibuat lebih sempit daripada "apa pun yang - memuat unknown/error". OpenClaw memang memperlakukan bentuk sementara yang dibatasi provider - seperti `An unknown error occurred` polos dari Anthropic, `Provider returned error` - polos dari OpenRouter, error stop-reason seperti `Unhandled stop reason: + mengandung unknown/error". OpenClaw memang memperlakukan bentuk sementara yang terikat ke provider + seperti bare Anthropic `An unknown error occurred`, bare OpenRouter + `Provider returned error`, error stop-reason seperti `Unhandled stop reason: error`, payload JSON `api_error` dengan teks server sementara (`internal server error`, `unknown error, 520`, `upstream error`, `backend - error`), dan error provider sibuk seperti `ModelNotReadyException` sebagai - sinyal timeout/kelebihan beban yang layak untuk failover saat konteks provider + error`), dan error provider-sibuk seperti `ModelNotReadyException` sebagai + sinyal timeout/overload yang layak untuk failover saat konteks provider cocok. Teks fallback internal generik seperti `LLM request failed with an unknown - error.` tetap konservatif dan tidak memicu fallback model sendirian. + error.` tetap konservatif dan tidak memicu fallback model dengan sendirinya. - Itu berarti sistem mencoba menggunakan ID profil auth `anthropic:default`, tetapi tidak dapat menemukan kredensial untuk profil itu di penyimpanan auth yang diharapkan. + Artinya sistem mencoba menggunakan ID profil auth `anthropic:default`, tetapi tidak dapat menemukan kredensial untuk profil tersebut di penyimpanan auth yang diharapkan. - **Daftar periksa perbaikan:** + **Checklist perbaikan:** - - **Konfirmasi lokasi profil auth** (jalur baru vs lama) + - **Konfirmasi lokasi profil auth** (path baru vs lama) - Saat ini: `~/.openclaw/agents//agent/auth-profiles.json` - Lama: `~/.openclaw/agent/*` (dimigrasikan oleh `openclaw doctor`) - **Konfirmasi env var Anda dimuat oleh Gateway** - Jika Anda menetapkan `ANTHROPIC_API_KEY` di shell tetapi menjalankan Gateway melalui systemd/launchd, Gateway mungkin tidak mewarisinya. Masukkan ke `~/.openclaw/.env` atau aktifkan `env.shellEnv`. - - **Pastikan Anda mengedit agent yang benar** + - **Pastikan Anda sedang mengedit agent yang benar** - Penyiapan multi-agent berarti bisa ada beberapa file `auth-profiles.json`. - - **Pemeriksaan kewarasan status model/auth** - - Gunakan `openclaw models status` untuk melihat model yang dikonfigurasi dan apakah provider sudah diautentikasi. + - **Periksa kewarasan status model/auth** + - Gunakan `openclaw models status` untuk melihat model yang dikonfigurasi dan apakah provider telah diautentikasi. - **Daftar periksa perbaikan untuk "No credentials found for profile anthropic"** + **Checklist perbaikan untuk "No credentials found for profile anthropic"** - Ini berarti eksekusi dipin ke profil auth Anthropic, tetapi Gateway + Ini berarti run dipin ke profil auth Anthropic, tetapi Gateway tidak dapat menemukannya di penyimpanan auth. - **Gunakan Claude CLI** - - Jalankan `openclaw models auth login --provider anthropic --method cli --set-default` pada host gateway. - - **Jika Anda ingin menggunakan kunci API sebagai gantinya** - - Masukkan `ANTHROPIC_API_KEY` ke `~/.openclaw/.env` pada **host gateway**. - - Hapus urutan terpin yang memaksa profil yang hilang: + - Jalankan `openclaw models auth login --provider anthropic --method cli --set-default` di host gateway. + - **Jika Anda ingin menggunakan API key sebagai gantinya** + - Masukkan `ANTHROPIC_API_KEY` ke `~/.openclaw/.env` di **host gateway**. + - Hapus urutan pin apa pun yang memaksa profil yang hilang: ```bash openclaw models auth order clear --provider anthropic ``` - - **Konfirmasi Anda menjalankan perintah di host gateway** + - **Pastikan Anda menjalankan perintah di host gateway** - Dalam mode remote, profil auth berada di mesin gateway, bukan di laptop Anda. - Jika config model Anda menyertakan Google Gemini sebagai fallback (atau Anda beralih ke shorthand Gemini), OpenClaw akan mencobanya saat fallback model. Jika Anda belum mengonfigurasi kredensial Google, Anda akan melihat `No API key found for provider "google"`. + Jika konfigurasi model Anda menyertakan Google Gemini sebagai fallback (atau Anda beralih ke shorthand Gemini), OpenClaw akan mencobanya selama fallback model. Jika Anda belum mengonfigurasi kredensial Google, Anda akan melihat `No API key found for provider "google"`. Perbaikan: sediakan auth Google, atau hapus/hindari model Google di `agents.defaults.model.fallbacks` / alias agar fallback tidak diarahkan ke sana. **LLM request rejected: thinking signature required (Google Antigravity)** - Penyebab: riwayat sesi berisi **blok thinking tanpa signature** (sering dari - stream yang dibatalkan/parsial). Google Antigravity memerlukan signature untuk blok thinking. + Penyebab: riwayat sesi berisi **thinking block tanpa signature** (sering dari + stream yang dibatalkan/sebagian). Google Antigravity memerlukan signature untuk thinking block. - Perbaikan: OpenClaw sekarang menghapus blok thinking tanpa signature untuk Google Antigravity Claude. Jika masih muncul, mulai **sesi baru** atau setel `/thinking off` untuk agent tersebut. + Perbaikan: OpenClaw sekarang menghapus thinking block tanpa signature untuk Claude Google Antigravity. Jika masih muncul, mulai **sesi baru** atau setel `/thinking off` untuk agent tersebut. @@ -2651,7 +2651,7 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p - Profil auth adalah rekaman kredensial bernama (OAuth atau kunci API) yang terikat ke provider. Profil hidup di: + Profil auth adalah catatan kredensial bernama (OAuth atau API key) yang terikat ke provider. Profil berada di: ``` ~/.openclaw/agents//agent/auth-profiles.json @@ -2659,34 +2659,34 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p - - OpenClaw menggunakan ID dengan awalan provider seperti: + + OpenClaw menggunakan ID berawalan provider seperti: - `anthropic:default` (umum saat tidak ada identitas email) - `anthropic:` untuk identitas OAuth - - ID kustom yang Anda pilih (mis. `anthropic:work`) + - ID kustom yang Anda pilih (misalnya `anthropic:work`) - Ya. Config mendukung metadata opsional untuk profil dan urutan per provider (`auth.order.`). Ini **tidak** menyimpan secret; hanya memetakan ID ke provider/mode dan menetapkan urutan rotasi. + Ya. Konfigurasi mendukung metadata opsional untuk profil dan urutan per provider (`auth.order.`). Ini **tidak** menyimpan secret; ini memetakan ID ke provider/mode dan menetapkan urutan rotasi. - OpenClaw dapat sementara melewati profil jika profil tersebut berada dalam **cooldown** singkat (rate limit/timeout/kegagalan auth) atau status **disabled** yang lebih lama (penagihan/kredit tidak cukup). Untuk memeriksanya, jalankan `openclaw models status --json` dan periksa `auth.unusableProfiles`. Penyetelan: `auth.cooldowns.billingBackoffHours*`. + OpenClaw dapat sementara melewati sebuah profil jika berada dalam **cooldown** singkat (rate limit/timeout/kegagalan auth) atau status **disabled** yang lebih panjang (penagihan/kredit tidak cukup). Untuk memeriksa ini, jalankan `openclaw models status --json` dan periksa `auth.unusableProfiles`. Penyesuaian: `auth.cooldowns.billingBackoffHours*`. - Cooldown rate limit dapat dibatasi pada model tertentu. Profil yang sedang cooldown + Cooldown rate limit dapat dibatasi ke model. Profil yang sedang cooldown untuk satu model masih bisa digunakan untuk model saudara pada provider yang sama, sementara jendela penagihan/disabled tetap memblokir seluruh profil. - Anda juga dapat menetapkan override urutan **per-agent** (disimpan di `auth-state.json` agent itu) melalui CLI: + Anda juga dapat menetapkan override urutan **per-agent** (disimpan di `auth-state.json` milik agent tersebut) melalui CLI: ```bash # Default ke agent default yang dikonfigurasi (hilangkan --agent) openclaw models auth order get --provider anthropic - # Kunci rotasi ke satu profil saja (coba hanya yang ini) + # Kunci rotasi ke satu profil (hanya coba yang ini) openclaw models auth order set --provider anthropic anthropic:default - # Atau tetapkan urutan eksplisit (fallback dalam provider) + # Atau tetapkan urutan eksplisit (fallback di dalam provider) openclaw models auth order set --provider anthropic anthropic:work anthropic:default # Hapus override (fallback ke config auth.order / round-robin) @@ -2705,18 +2705,18 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw models status --probe ``` - Jika profil tersimpan dihilangkan dari urutan eksplisit, probe melaporkan + Jika sebuah profil yang tersimpan dihilangkan dari urutan eksplisit, probe akan melaporkan `excluded_by_auth_order` untuk profil tersebut alih-alih mencobanya secara diam-diam. - + OpenClaw mendukung keduanya: - - **OAuth** sering memanfaatkan akses langganan (bila berlaku). - - **Kunci API** menggunakan penagihan bayar per token. + - **OAuth** sering memanfaatkan akses langganan (jika berlaku). + - **API key** menggunakan penagihan bayar per token. - Wizard secara eksplisit mendukung Anthropic Claude CLI, OpenAI Codex OAuth, dan kunci API. + Wizard secara eksplisit mendukung Anthropic Claude CLI, OpenAI Codex OAuth, dan API key. @@ -2725,7 +2725,7 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p - `gateway.port` mengontrol port tunggal yang dimultipleks untuk WebSocket + HTTP (Control UI, hooks, dll.). + `gateway.port` mengontrol satu port multipleks untuk WebSocket + HTTP (Control UI, hook, dll.). Prioritas: @@ -2735,19 +2735,19 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p - - Karena "running" adalah pandangan **supervisor** (launchd/systemd/schtasks). RPC probe adalah CLI yang benar-benar terhubung ke Gateway WebSocket dan memanggil `status`. + + Karena "running" adalah tampilan **supervisor** (launchd/systemd/schtasks). Connectivity probe adalah CLI yang benar-benar terhubung ke Gateway WebSocket. Gunakan `openclaw gateway status` dan percayai baris-baris ini: - `Probe target:` (URL yang benar-benar digunakan probe) - - `Listening:` (apa yang benar-benar terikat pada port) - - `Last gateway error:` (akar penyebab umum saat proses hidup tetapi port tidak listen) + - `Listening:` (apa yang benar-benar terikat di port) + - `Last gateway error:` (akar masalah umum saat proses hidup tetapi port tidak listen) - - Anda sedang mengedit satu file config sementara service menjalankan file lain (sering kali karena ketidakcocokan `--profile` / `OPENCLAW_STATE_DIR`). + + Anda sedang mengedit satu file konfigurasi sementara layanan menjalankan file yang lain (sering kali karena ketidakcocokan `--profile` / `OPENCLAW_STATE_DIR`). Perbaikan: @@ -2755,14 +2755,14 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw gateway install --force ``` - Jalankan itu dari `--profile` / environment yang sama yang Anda ingin service gunakan. + Jalankan itu dari `--profile` / environment yang sama yang ingin Anda gunakan untuk layanan. - OpenClaw menegakkan runtime lock dengan langsung melakukan bind pada listener WebSocket saat startup (default `ws://127.0.0.1:18789`). Jika bind gagal dengan `EADDRINUSE`, OpenClaw melempar `GatewayLockError` yang menunjukkan instance lain sudah sedang listen. + OpenClaw menegakkan runtime lock dengan langsung bind listener WebSocket saat startup (default `ws://127.0.0.1:18789`). Jika bind gagal dengan `EADDRINUSE`, OpenClaw akan melempar `GatewayLockError` yang menandakan instance lain sudah listen. - Perbaikan: hentikan instance lain, bebaskan port, atau jalankan dengan `openclaw gateway --port `. + Perbaikan: hentikan instance lain, kosongkan port, atau jalankan dengan `openclaw gateway --port `. @@ -2784,78 +2784,78 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Catatan: - - `openclaw gateway` hanya mulai saat `gateway.mode` adalah `local` (atau Anda melewatkan flag override). - - Aplikasi macOS mengawasi file config dan berpindah mode secara langsung saat nilai-nilai ini berubah. - - `gateway.remote.token` / `.password` hanyalah kredensial remote sisi klien; keduanya tidak mengaktifkan auth gateway lokal dengan sendirinya. + - `openclaw gateway` hanya mulai saat `gateway.mode` adalah `local` (atau Anda memberikan flag override). + - Aplikasi macOS memantau file konfigurasi dan mengganti mode secara langsung saat nilai-nilai ini berubah. + - `gateway.remote.token` / `.password` adalah kredensial remote sisi klien saja; keduanya tidak mengaktifkan auth gateway lokal dengan sendirinya. - + Jalur auth gateway Anda dan metode auth UI tidak cocok. Fakta (dari kode): - - Control UI menyimpan token di `sessionStorage` untuk sesi tab browser saat ini dan URL gateway yang dipilih, sehingga refresh di tab yang sama tetap berfungsi tanpa mengembalikan persistensi token `localStorage` jangka panjang. - - Pada `AUTH_TOKEN_MISMATCH`, klien tepercaya dapat mencoba satu kali retry terbatas dengan token perangkat yang di-cache saat gateway mengembalikan petunjuk retry (`canRetryWithDeviceToken=true`, `recommendedNextStep=retry_with_device_token`). - - Retry token ter-cache itu sekarang menggunakan kembali scope yang disetujui dan disimpan bersama token perangkat. Pemanggil `deviceToken` eksplisit / `scopes` eksplisit tetap mempertahankan set scope yang diminta alih-alih mewarisi scope ter-cache. - - Di luar jalur retry itu, prioritas auth koneksi adalah shared token/password eksplisit terlebih dahulu, lalu `deviceToken` eksplisit, lalu token perangkat tersimpan, lalu bootstrap token. - - Pemeriksaan scope bootstrap token memiliki prefiks per peran. Allowlist operator bootstrap bawaan hanya memenuhi permintaan operator; peran node atau peran non-operator lainnya tetap memerlukan scope di bawah prefiks peran mereka sendiri. + - Control UI menyimpan token di `sessionStorage` untuk sesi tab browser saat ini dan URL gateway yang dipilih, sehingga refresh di tab yang sama tetap berfungsi tanpa memulihkan persistensi token localStorage jangka panjang. + - Pada `AUTH_TOKEN_MISMATCH`, klien tepercaya dapat mencoba satu retry terbatas dengan device token yang di-cache saat gateway mengembalikan hint retry (`canRetryWithDeviceToken=true`, `recommendedNextStep=retry_with_device_token`). + - Retry token-cache itu sekarang menggunakan kembali scope yang disetujui dan di-cache yang disimpan bersama device token. Pemanggil `deviceToken` eksplisit / `scopes` eksplisit tetap mempertahankan kumpulan scope yang diminta alih-alih mewarisi scope cache. + - Di luar jalur retry itu, prioritas auth connect adalah shared token/password eksplisit terlebih dahulu, lalu `deviceToken` eksplisit, lalu device token tersimpan, lalu bootstrap token. + - Pemeriksaan scope bootstrap menggunakan prefiks role. Allowlist operator bootstrap bawaan hanya memenuhi permintaan operator; node atau role non-operator lain tetap memerlukan scope di bawah prefiks role mereka sendiri. Perbaikan: - - Paling cepat: `openclaw dashboard` (mencetak + menyalin URL dashboard, mencoba membuka; menampilkan petunjuk SSH jika headless). + - Paling cepat: `openclaw dashboard` (mencetak + menyalin URL dashboard, mencoba membukanya; menampilkan petunjuk SSH jika headless). - Jika Anda belum memiliki token: `openclaw doctor --generate-gateway-token`. - Jika remote, buat tunnel dulu: `ssh -N -L 18789:127.0.0.1:18789 user@host` lalu buka `http://127.0.0.1:18789/`. - Mode shared-secret: setel `gateway.auth.token` / `OPENCLAW_GATEWAY_TOKEN` atau `gateway.auth.password` / `OPENCLAW_GATEWAY_PASSWORD`, lalu tempel secret yang cocok di pengaturan Control UI. - Mode Tailscale Serve: pastikan `gateway.auth.allowTailscale` diaktifkan dan Anda membuka URL Serve, bukan URL loopback/tailnet mentah yang melewati header identitas Tailscale. - - Mode trusted-proxy: pastikan Anda masuk melalui proxy sadar identitas non-loopback yang dikonfigurasi, bukan proxy loopback pada host yang sama atau URL gateway mentah. - - Jika ketidakcocokan tetap ada setelah satu retry, rotasi/setujui ulang token perangkat yang dipasangkan: + - Mode trusted-proxy: pastikan Anda masuk melalui proxy sadar identitas non-loopback yang dikonfigurasi, bukan proxy loopback host yang sama atau URL gateway mentah. + - Jika ketidakcocokan tetap ada setelah satu retry, putar/setujui ulang paired device token: - `openclaw devices list` - `openclaw devices rotate --device --role operator` - Jika panggilan rotate itu mengatakan ditolak, periksa dua hal: - - sesi perangkat yang dipasangkan hanya dapat merotasi **perangkatnya sendiri** kecuali juga memiliki `operator.admin` - - nilai `--scope` eksplisit tidak boleh melebihi scope operator saat ini milik pemanggil + - sesi paired-device hanya dapat memutar **device miliknya sendiri** kecuali juga memiliki `operator.admin` + - nilai `--scope` eksplisit tidak boleh melebihi scope operator milik pemanggil saat ini - Masih buntu? Jalankan `openclaw status --all` dan ikuti [Troubleshooting](/id/gateway/troubleshooting). Lihat [Dashboard](/web/dashboard) untuk detail auth. - Bind `tailnet` memilih IP Tailscale dari antarmuka jaringan Anda (100.64.0.0/10). Jika mesin tidak berada di Tailscale (atau antarmukanya mati), tidak ada yang bisa di-bind. + Bind `tailnet` memilih IP Tailscale dari interface jaringan Anda (100.64.0.0/10). Jika mesin tidak berada di Tailscale (atau interfacenya mati), tidak ada yang bisa di-bind. Perbaikan: - - Jalankan Tailscale di host tersebut (agar memiliki alamat 100.x), atau - - Beralih ke `gateway.bind: "loopback"` / `"lan"`. + - Mulai Tailscale di host tersebut (agar memiliki alamat 100.x), atau + - Ganti ke `gateway.bind: "loopback"` / `"lan"`. Catatan: `tailnet` bersifat eksplisit. `auto` lebih memilih loopback; gunakan `gateway.bind: "tailnet"` saat Anda menginginkan bind khusus tailnet. - Biasanya tidak - satu Gateway dapat menjalankan beberapa messaging channel dan agent. Gunakan beberapa Gateway hanya ketika Anda membutuhkan redundansi (mis.: bot penyelamat) atau isolasi keras. + Biasanya tidak - satu Gateway dapat menjalankan beberapa channel pesan dan agent. Gunakan beberapa Gateway hanya saat Anda memerlukan redundansi (mis: bot penyelamat) atau isolasi yang kuat. Ya, tetapi Anda harus mengisolasi: - - `OPENCLAW_CONFIG_PATH` (config per instance) - - `OPENCLAW_STATE_DIR` (state per instance) + - `OPENCLAW_CONFIG_PATH` (konfigurasi per-instance) + - `OPENCLAW_STATE_DIR` (status per-instance) - `agents.defaults.workspace` (isolasi workspace) - `gateway.port` (port unik) Penyiapan cepat (direkomendasikan): - Gunakan `openclaw --profile ...` per instance (otomatis membuat `~/.openclaw-`). - - Setel `gateway.port` unik di setiap config profil (atau berikan `--port` untuk eksekusi manual). - - Instal service per profil: `openclaw --profile gateway install`. + - Setel `gateway.port` yang unik di setiap konfigurasi profil (atau berikan `--port` untuk run manual). + - Pasang layanan per-profil: `openclaw --profile gateway install`. - Profil juga memberi sufiks pada nama service (`ai.openclaw.`; lama `com.openclaw.*`, `openclaw-gateway-.service`, `OpenClaw Gateway ()`). + Profil juga menambahkan sufiks pada nama layanan (`ai.openclaw.`; legacy `com.openclaw.*`, `openclaw-gateway-.service`, `OpenClaw Gateway ()`). Panduan lengkap: [Multiple gateways](/id/gateway/multiple-gateways). - - Gateway adalah **server WebSocket**, dan mengharapkan pesan pertama - berupa frame `connect`. Jika menerima hal lain, Gateway menutup koneksi - dengan **code 1008** (pelanggaran kebijakan). + + Gateway adalah **server WebSocket**, dan Gateway mengharapkan pesan pertama + berupa frame `connect`. Jika Gateway menerima hal lain, Gateway menutup koneksi + dengan **kode 1008** (pelanggaran kebijakan). Penyebab umum: @@ -2867,9 +2867,9 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p 1. Gunakan URL WS: `ws://:18789` (atau `wss://...` jika HTTPS). 2. Jangan buka port WS di tab browser biasa. - 3. Jika auth aktif, sertakan token/kata sandi dalam frame `connect`. + 3. Jika auth aktif, sertakan token/password di frame `connect`. - Jika Anda menggunakan CLI atau TUI, URL-nya seharusnya terlihat seperti: + Jika Anda menggunakan CLI atau TUI, URL seharusnya terlihat seperti: ``` openclaw tui --url ws://:18789 --token @@ -2890,25 +2890,25 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p /tmp/openclaw/openclaw-YYYY-MM-DD.log ``` - Anda dapat menetapkan jalur stabil melalui `logging.file`. Level log file dikendalikan oleh `logging.level`. Verbositas konsol dikendalikan oleh `--verbose` dan `logging.consoleLevel`. + Anda dapat menetapkan path yang stabil melalui `logging.file`. Level log file dikendalikan oleh `logging.level`. Verbositas konsol dikendalikan oleh `--verbose` dan `logging.consoleLevel`. - Ikuti log tercepat: + Mengikuti log tercepat: ```bash openclaw logs --follow ``` - Log service/supervisor (saat gateway berjalan melalui launchd/systemd): + Log layanan/supervisor (saat gateway berjalan melalui launchd/systemd): - macOS: `$OPENCLAW_STATE_DIR/logs/gateway.log` dan `gateway.err.log` (default: `~/.openclaw/logs/...`; profil menggunakan `~/.openclaw-/logs/...`) - Linux: `journalctl --user -u openclaw-gateway[-].service -n 200 --no-pager` - Windows: `schtasks /Query /TN "OpenClaw Gateway ()" /V /FO LIST` - Lihat [Troubleshooting](/id/gateway/troubleshooting) untuk lebih lanjut. + Lihat [Troubleshooting](/id/gateway/troubleshooting) untuk informasi lebih lanjut. - + Gunakan helper gateway: ```bash @@ -2916,11 +2916,11 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw gateway restart ``` - Jika Anda menjalankan gateway secara manual, `openclaw gateway --force` dapat mengambil alih kembali port. Lihat [Gateway](/id/gateway). + Jika Anda menjalankan gateway secara manual, `openclaw gateway --force` dapat mengambil kembali port. Lihat [Gateway](/id/gateway). - + Ada **dua mode instalasi Windows**: **1) WSL2 (direkomendasikan):** Gateway berjalan di dalam Linux. @@ -2933,7 +2933,7 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw gateway restart ``` - Jika Anda tidak pernah menginstal service, mulai di foreground: + Jika Anda belum pernah memasang layanan, mulai di foreground: ```bash openclaw gateway run @@ -2948,18 +2948,18 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw gateway restart ``` - Jika Anda menjalankannya secara manual (tanpa service), gunakan: + Jika Anda menjalankannya secara manual (tanpa layanan), gunakan: ```powershell openclaw gateway run ``` - Dokumen: [Windows (WSL2)](/id/platforms/windows), [Gateway service runbook](/id/gateway). + Dokumentasi: [Windows (WSL2)](/id/platforms/windows), [Gateway service runbook](/id/gateway). - Mulailah dengan pemeriksaan kesehatan cepat: + Mulailah dengan sapuan health cepat: ```bash openclaw status @@ -2971,18 +2971,18 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Penyebab umum: - Auth model tidak dimuat di **host gateway** (periksa `models status`). - - Pairing/allowlist channel memblokir balasan (periksa config channel + log). - - WebChat/Dashboard terbuka tanpa token yang benar. + - Pairing/allowlist channel memblokir balasan (periksa konfigurasi channel + log). + - WebChat/Dashboard dibuka tanpa token yang benar. - Jika Anda berada di remote, pastikan koneksi tunnel/Tailscale aktif dan + Jika Anda remote, pastikan tunnel/koneksi Tailscale aktif dan bahwa Gateway WebSocket dapat dijangkau. - Dokumen: [Channels](/id/channels), [Troubleshooting](/id/gateway/troubleshooting), [Remote access](/id/gateway/remote). + Dokumentasi: [Channels](/id/channels), [Troubleshooting](/id/gateway/troubleshooting), [Remote access](/id/gateway/remote). - Biasanya ini berarti UI kehilangan koneksi WebSocket. Periksa: + Ini biasanya berarti UI kehilangan koneksi WebSocket. Periksa: 1. Apakah Gateway berjalan? `openclaw gateway status` 2. Apakah Gateway sehat? `openclaw status` @@ -2995,11 +2995,11 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw logs --follow ``` - Dokumen: [Dashboard](/web/dashboard), [Remote access](/id/gateway/remote), [Troubleshooting](/id/gateway/troubleshooting). + Dokumentasi: [Dashboard](/web/dashboard), [Remote access](/id/gateway/remote), [Troubleshooting](/id/gateway/troubleshooting). - + Mulailah dengan log dan status channel: ```bash @@ -3009,17 +3009,17 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Lalu cocokkan error-nya: - - `BOT_COMMANDS_TOO_MUCH`: menu Telegram memiliki terlalu banyak entri. OpenClaw sudah memangkas hingga batas Telegram dan mencoba ulang dengan lebih sedikit perintah, tetapi beberapa entri menu tetap perlu dibuang. Kurangi perintah plugin/skill/kustom, atau nonaktifkan `channels.telegram.commands.native` jika Anda tidak memerlukan menu itu. + - `BOT_COMMANDS_TOO_MUCH`: menu Telegram memiliki terlalu banyak entri. OpenClaw sudah memangkasnya ke batas Telegram dan mencoba ulang dengan perintah yang lebih sedikit, tetapi beberapa entri menu masih perlu dihapus. Kurangi perintah plugin/skill/kustom, atau nonaktifkan `channels.telegram.commands.native` jika Anda tidak memerlukan menu. - `TypeError: fetch failed`, `Network request for 'setMyCommands' failed!`, atau error jaringan serupa: jika Anda berada di VPS atau di belakang proxy, pastikan HTTPS keluar diizinkan dan DNS berfungsi untuk `api.telegram.org`. - Jika Gateway berada di remote, pastikan Anda melihat log di host Gateway. + Jika Gateway bersifat remote, pastikan Anda melihat log di host Gateway. - Dokumen: [Telegram](/id/channels/telegram), [Channel troubleshooting](/id/channels/troubleshooting). + Dokumentasi: [Telegram](/id/channels/telegram), [Channel troubleshooting](/id/channels/troubleshooting). - Pertama, pastikan Gateway dapat dijangkau dan agent bisa berjalan: + Pertama pastikan Gateway dapat dijangkau dan agent dapat berjalan: ```bash openclaw status @@ -3027,22 +3027,22 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw logs --follow ``` - Di TUI, gunakan `/status` untuk melihat keadaan saat ini. Jika Anda mengharapkan balasan di channel - chat, pastikan pengiriman diaktifkan (`/deliver on`). + Di TUI, gunakan `/status` untuk melihat status saat ini. Jika Anda mengharapkan balasan di channel + chat, pastikan delivery diaktifkan (`/deliver on`). - Dokumen: [TUI](/web/tui), [Slash commands](/id/tools/slash-commands). + Dokumentasi: [TUI](/web/tui), [Slash commands](/id/tools/slash-commands). - Jika Anda menginstal service: + Jika Anda memasang layanan: ```bash openclaw gateway stop openclaw gateway start ``` - Ini menghentikan/memulai **service yang diawasi** (launchd di macOS, systemd di Linux). + Ini menghentikan/memulai **layanan yang disupervisi** (launchd di macOS, systemd di Linux). Gunakan ini saat Gateway berjalan di latar belakang sebagai daemon. Jika Anda menjalankannya di foreground, hentikan dengan Ctrl-C, lalu: @@ -3051,21 +3051,21 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw gateway run ``` - Dokumen: [Gateway service runbook](/id/gateway). + Dokumentasi: [Gateway service runbook](/id/gateway). - - `openclaw gateway restart`: me-restart **service latar belakang** (launchd/systemd). + - `openclaw gateway restart`: memulai ulang **layanan latar belakang** (launchd/systemd). - `openclaw gateway`: menjalankan gateway **di foreground** untuk sesi terminal ini. - Jika Anda menginstal service, gunakan perintah gateway. Gunakan `openclaw gateway` saat - Anda menginginkan satu eksekusi foreground. + Jika Anda telah memasang layanannya, gunakan perintah gateway. Gunakan `openclaw gateway` saat + Anda menginginkan run foreground satu kali. - Mulai Gateway dengan `--verbose` untuk mendapatkan detail konsol lebih banyak. Lalu periksa file log untuk auth channel, routing model, dan error RPC. + Mulai Gateway dengan `--verbose` untuk mendapatkan detail konsol yang lebih banyak. Lalu periksa file log untuk auth channel, routing model, dan error RPC. @@ -3084,9 +3084,9 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Periksa juga: - Channel target mendukung media keluar dan tidak diblokir oleh allowlist. - - File berada dalam batas ukuran provider (gambar diubah ukurannya menjadi maksimum 2048px). - - `tools.fs.workspaceOnly=true` menjaga pengiriman jalur lokal tetap terbatas pada workspace, temp/media-store, dan file yang divalidasi sandbox. - - `tools.fs.workspaceOnly=false` membuat `MEDIA:` dapat mengirim file lokal host yang sudah dapat dibaca agent, tetapi hanya untuk media plus tipe dokumen aman (gambar, audio, video, PDF, dan dokumen Office). File teks biasa dan file mirip secret tetap diblokir. + - File berada dalam batas ukuran provider (gambar diubah ukurannya menjadi maksimal 2048px). + - `tools.fs.workspaceOnly=true` menjaga pengiriman path lokal tetap dibatasi ke workspace, temp/media-store, dan file yang tervalidasi sandbox. + - `tools.fs.workspaceOnly=false` memungkinkan `MEDIA:` mengirim file lokal host yang sudah dapat dibaca agent, tetapi hanya untuk media plus jenis dokumen aman (gambar, audio, video, PDF, dan dokumen Office). File teks biasa dan file yang mirip secret tetap diblokir. Lihat [Images](/id/nodes/images). @@ -3100,9 +3100,9 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Perlakukan DM masuk sebagai input yang tidak tepercaya. Default dirancang untuk mengurangi risiko: - Perilaku default pada channel yang mendukung DM adalah **pairing**: - - Pengirim yang tidak dikenal menerima kode pairing; bot tidak memproses pesan mereka. + - Pengirim yang tidak dikenal menerima kode pairing; bot tidak memproses pesannya. - Setujui dengan: `openclaw pairing approve --channel [--account ] ` - - Permintaan tertunda dibatasi hingga **3 per channel**; periksa `openclaw pairing list --channel [--account ]` jika kode tidak sampai. + - Permintaan tertunda dibatasi hingga **3 per channel**; periksa `openclaw pairing list --channel [--account ]` jika kode tidak datang. - Membuka DM secara publik memerlukan opt-in eksplisit (`dmPolicy: "open"` dan allowlist `"*"`). Jalankan `openclaw doctor` untuk menampilkan kebijakan DM yang berisiko. @@ -3112,56 +3112,56 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Tidak. Prompt injection berkaitan dengan **konten yang tidak tepercaya**, bukan hanya siapa yang bisa mengirim DM ke bot. Jika asisten Anda membaca konten eksternal (web search/fetch, halaman browser, email, - docs, lampiran, log yang ditempel), konten itu dapat menyertakan instruksi yang mencoba + dokumen, lampiran, log yang ditempel), konten itu bisa menyertakan instruksi yang mencoba membajak model. Ini bisa terjadi bahkan jika **Anda adalah satu-satunya pengirim**. - Risiko terbesar muncul saat alat diaktifkan: model dapat ditipu untuk - mengekstrak konteks atau memanggil alat atas nama Anda. Kurangi radius ledakan dengan: + Risiko terbesar muncul saat tool diaktifkan: model bisa ditipu untuk + mengekstrak konteks atau memanggil tool atas nama Anda. Kurangi blast radius dengan: - - menggunakan agent "reader" baca-saja atau tanpa alat untuk merangkum konten yang tidak tepercaya - - menjaga `web_search` / `web_fetch` / `browser` tetap mati untuk agent dengan alat aktif - - memperlakukan teks file/dokumen yang telah didekode juga sebagai tidak tepercaya: OpenResponses - `input_file` dan ekstraksi lampiran media sama-sama membungkus teks yang diekstrak dalam + - menggunakan agent "pembaca" read-only atau tanpa tool untuk merangkum konten yang tidak tepercaya + - membiarkan `web_search` / `web_fetch` / `browser` nonaktif untuk agent yang mengaktifkan tool + - memperlakukan teks file/dokumen yang didekodekan juga sebagai tidak tepercaya: OpenResponses + `input_file` dan ekstraksi media-attachment keduanya membungkus teks yang diekstrak di dalam penanda batas konten eksternal yang eksplisit alih-alih meneruskan teks file mentah - - sandboxing dan allowlist alat yang ketat + - sandboxing dan allowlist tool yang ketat Detail: [Security](/id/gateway/security). - + Ya, untuk sebagian besar penyiapan. Mengisolasi bot dengan akun dan nomor telepon terpisah - mengurangi radius ledakan jika terjadi sesuatu yang salah. Ini juga memudahkan untuk merotasi + mengurangi blast radius jika terjadi kesalahan. Ini juga mempermudah untuk memutar kredensial atau mencabut akses tanpa memengaruhi akun pribadi Anda. - Mulailah dari yang kecil. Beri akses hanya ke alat dan akun yang benar-benar Anda butuhkan, lalu perluas - nanti jika diperlukan. + Mulailah dari yang kecil. Berikan akses hanya ke tool dan akun yang benar-benar Anda perlukan, lalu perluas + nanti jika dibutuhkan. - Dokumen: [Security](/id/gateway/security), [Pairing](/id/channels/pairing). + Dokumentasi: [Security](/id/gateway/security), [Pairing](/id/channels/pairing). - Kami **tidak** merekomendasikan otonomi penuh atas pesan pribadi Anda. Pola paling aman adalah: + Kami **tidak** merekomendasikan otonomi penuh atas pesan pribadi Anda. Pola yang paling aman adalah: - Pertahankan DM dalam **mode pairing** atau allowlist yang ketat. - Gunakan **nomor atau akun terpisah** jika Anda ingin bot mengirim pesan atas nama Anda. - Biarkan bot membuat draf, lalu **setujui sebelum mengirim**. - Jika Anda ingin bereksperimen, lakukan itu pada akun khusus dan tetap isolasikan. Lihat + Jika Anda ingin bereksperimen, lakukan di akun khusus dan tetap jaga tetap terisolasi. Lihat [Security](/id/gateway/security). - Ya, **jika** agent hanya untuk chat dan input-nya tepercaya. Tingkatan yang lebih kecil - lebih rentan terhadap pembajakan instruksi, jadi hindari untuk agent dengan alat aktif + Ya, **jika** agent hanya untuk chat dan inputnya tepercaya. Tier yang lebih kecil + lebih rentan terhadap pembajakan instruksi, jadi hindari untuk agent yang mengaktifkan tool atau saat membaca konten yang tidak tepercaya. Jika Anda harus menggunakan model yang lebih kecil, kunci - alat dan jalankan di dalam sandbox. Lihat [Security](/id/gateway/security). + tool dan jalankan di dalam sandbox. Lihat [Security](/id/gateway/security). - - Kode pairing dikirim **hanya** ketika pengirim yang tidak dikenal mengirim pesan ke bot dan + + Kode pairing dikirim **hanya** saat pengirim yang tidak dikenal mengirim pesan ke bot dan `dmPolicy: "pairing"` diaktifkan. `/start` sendiri tidak menghasilkan kode. Periksa permintaan tertunda: @@ -3170,13 +3170,13 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw pairing list telegram ``` - Jika Anda ingin akses langsung, masukkan sender id Anda ke allowlist atau setel `dmPolicy: "open"` + Jika Anda ingin akses segera, masukkan sender id Anda ke allowlist atau setel `dmPolicy: "open"` untuk akun tersebut. - - Tidak. Kebijakan DM WhatsApp default adalah **pairing**. Pengirim yang tidak dikenal hanya mendapat kode pairing dan pesan mereka **tidak diproses**. OpenClaw hanya membalas chat yang diterimanya atau pengiriman eksplisit yang Anda picu. + + Tidak. Kebijakan DM WhatsApp default adalah **pairing**. Pengirim yang tidak dikenal hanya mendapatkan kode pairing dan pesan mereka **tidak diproses**. OpenClaw hanya membalas chat yang diterimanya atau pengiriman eksplisit yang Anda picu. Setujui pairing dengan: @@ -3190,16 +3190,16 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p openclaw pairing list whatsapp ``` - Prompt nomor telepon di wizard: ini digunakan untuk menetapkan **allowlist/owner** Anda sehingga DM Anda sendiri diizinkan. Ini tidak digunakan untuk pengiriman otomatis. Jika Anda menjalankan pada nomor WhatsApp pribadi Anda, gunakan nomor itu dan aktifkan `channels.whatsapp.selfChatMode`. + Prompt nomor telepon wizard: nomor itu digunakan untuk menetapkan **allowlist/owner** Anda sehingga DM Anda sendiri diizinkan. Itu tidak digunakan untuk pengiriman otomatis. Jika Anda menjalankan di nomor WhatsApp pribadi Anda, gunakan nomor itu dan aktifkan `channels.whatsapp.selfChatMode`. -## Perintah chat, membatalkan tugas, dan "tidak mau berhenti" +## Perintah chat, membatalkan tugas, dan "bot tidak mau berhenti" - Sebagian besar pesan internal atau alat hanya muncul ketika **verbose**, **trace**, atau **reasoning** diaktifkan + Sebagian besar pesan internal atau tool hanya muncul saat **verbose**, **trace**, atau **reasoning** diaktifkan untuk sesi tersebut. Perbaiki di chat tempat Anda melihatnya: @@ -3212,9 +3212,9 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p Jika masih berisik, periksa pengaturan sesi di Control UI dan setel verbose ke **inherit**. Pastikan juga Anda tidak menggunakan profil bot dengan `verboseDefault` yang disetel - ke `on` di config. + ke `on` di konfigurasi. - Dokumen: [Thinking and verbose](/id/tools/thinking), [Security](/id/gateway/security#reasoning-verbose-output-in-groups). + Dokumentasi: [Thinking and verbose](/id/tools/thinking), [Security](/id/gateway/security#reasoning-verbose-output-in-groups). @@ -3243,25 +3243,25 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p interrupt ``` - Ini adalah pemicu pembatalan (bukan slash command). + Ini adalah pemicu abort (bukan slash command). - Untuk proses latar belakang (dari alat exec), Anda dapat meminta agent menjalankan: + Untuk proses latar belakang (dari exec tool), Anda dapat meminta agent menjalankan: ``` process action:kill sessionId:XXX ``` - Ikhtisar slash command: lihat [Slash commands](/id/tools/slash-commands). + Gambaran umum slash command: lihat [Slash commands](/id/tools/slash-commands). - Sebagian besar perintah harus dikirim sebagai **pesan mandiri** yang diawali dengan `/`, tetapi beberapa shortcut (seperti `/status`) juga berfungsi inline untuk pengirim yang ada di allowlist. + Sebagian besar perintah harus dikirim sebagai pesan **mandiri** yang dimulai dengan `/`, tetapi beberapa shortcut (seperti `/status`) juga berfungsi inline untuk pengirim yang ada di allowlist. - OpenClaw memblokir pengiriman pesan **lintas-provider** secara default. Jika pemanggilan alat terikat - ke Telegram, OpenClaw tidak akan mengirim ke Discord kecuali Anda secara eksplisit mengizinkannya. + OpenClaw memblokir pengiriman pesan **lintas provider** secara default. Jika panggilan tool terikat + ke Telegram, OpenClaw tidak akan mengirim ke Discord kecuali Anda mengizinkannya secara eksplisit. - Aktifkan pengiriman lintas-provider untuk agent: + Aktifkan pengiriman lintas provider untuk agent: ```json5 { @@ -3276,18 +3276,18 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p } ``` - Restart gateway setelah mengedit config. + Restart gateway setelah mengedit konfigurasi. - - Mode antrean mengontrol bagaimana pesan baru berinteraksi dengan eksekusi yang sedang berjalan. Gunakan `/queue` untuk mengubah mode: + + Mode antrean mengontrol bagaimana pesan baru berinteraksi dengan run yang sedang berlangsung. Gunakan `/queue` untuk mengubah mode: - - `steer` - pesan baru mengalihkan tugas saat ini + - `steer` - pesan baru mengarahkan ulang tugas saat ini - `followup` - jalankan pesan satu per satu - - `collect` - kumpulkan pesan dan balas sekali (default) - - `steer-backlog` - alihkan sekarang, lalu proses backlog - - `interrupt` - batalkan eksekusi saat ini dan mulai dari awal + - `collect` - batch pesan dan balas sekali (default) + - `steer-backlog` - arahkan sekarang, lalu proses backlog + - `interrupt` - batalkan run saat ini dan mulai dari awal Anda dapat menambahkan opsi seperti `debounce:2s cap:25 drop:summarize` untuk mode followup. @@ -3297,8 +3297,8 @@ Terkait: [/concepts/oauth](/id/concepts/oauth) (alur OAuth, penyimpanan token, p ## Lain-lain - - Di OpenClaw, kredensial dan pemilihan model dipisahkan. Menetapkan `ANTHROPIC_API_KEY` (atau menyimpan kunci API Anthropic dalam profil auth) mengaktifkan autentikasi, tetapi model default yang sebenarnya adalah apa pun yang Anda konfigurasikan di `agents.defaults.model.primary` (misalnya, `anthropic/claude-sonnet-4-6` atau `anthropic/claude-opus-4-6`). Jika Anda melihat `No credentials found for profile "anthropic:default"`, artinya Gateway tidak dapat menemukan kredensial Anthropic di `auth-profiles.json` yang diharapkan untuk agent yang sedang berjalan. + + Di OpenClaw, kredensial dan pemilihan model terpisah. Menetapkan `ANTHROPIC_API_KEY` (atau menyimpan API key Anthropic dalam profil auth) mengaktifkan autentikasi, tetapi model default yang sebenarnya adalah apa pun yang Anda konfigurasi di `agents.defaults.model.primary` (misalnya, `anthropic/claude-sonnet-4-6` atau `anthropic/claude-opus-4-6`). Jika Anda melihat `No credentials found for profile "anthropic:default"`, artinya Gateway tidak dapat menemukan kredensial Anthropic di `auth-profiles.json` yang diharapkan untuk agent yang sedang berjalan. diff --git a/docs/id/help/testing.md b/docs/id/help/testing.md index a8605a95a..7287987eb 100644 --- a/docs/id/help/testing.md +++ b/docs/id/help/testing.md @@ -2,14 +2,14 @@ read_when: - Menjalankan pengujian secara lokal atau di CI - Menambahkan regresi untuk bug model/provider - - Men-debug perilaku gateway + agen + - Men-debug perilaku Gateway + agen summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan cakupan masing-masing pengujian' title: Pengujian x-i18n: - generated_at: "2026-04-18T09:05:48Z" + generated_at: "2026-04-20T09:28:04Z" model: gpt-5.4 provider: openai - source_hash: 7cdd2048ba58e606fd68703977c2b33000abdb1826b6589ce25a35c53468726a + source_hash: 88457038e2e2c7940d0348762d0ece187111a8c61fa9bad54b39eade4217ddbc source_path: help/testing.md workflow: 15 --- @@ -20,31 +20,31 @@ OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sejumlah kec Dokumen ini adalah panduan “cara kami menguji”: -- Apa yang dicakup setiap suite (dan apa yang dengan sengaja _tidak_ dicakup) -- Perintah mana yang dijalankan untuk alur kerja umum (lokal, pra-push, debugging) -- Bagaimana pengujian live menemukan kredensial dan memilih model/provider +- Apa yang dicakup oleh tiap suite (dan apa yang secara sengaja _tidak_ dicakup) +- Perintah mana yang dijalankan untuk alur kerja umum (lokal, sebelum push, debugging) +- Bagaimana pengujian live menemukan kredensial serta memilih model/provider - Cara menambahkan regresi untuk masalah model/provider di dunia nyata ## Mulai cepat -Sebagian besar hari: +Kebanyakan hari: - Gate penuh (diharapkan sebelum push): `pnpm build && pnpm check && pnpm test` -- Menjalankan suite penuh lokal yang lebih cepat di mesin yang lapang: `pnpm test:max` +- Menjalankan full-suite lokal yang lebih cepat pada mesin yang lega: `pnpm test:max` - Loop watch Vitest langsung: `pnpm test:watch` -- Penargetan file langsung sekarang juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- Utamakan menjalankan target yang spesifik terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. +- Penargetan file langsung kini juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` +- Utamakan menjalankan pengujian yang ditargetkan terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. - Situs QA berbasis Docker: `pnpm qa:lab:up` -- Jalur QA berbasis Linux VM: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` +- Lane QA berbasis VM Linux: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` -Saat Anda menyentuh pengujian atau ingin keyakinan tambahan: +Saat Anda menyentuh pengujian atau ingin keyakinan ekstra: - Gate cakupan: `pnpm test:coverage` - Suite E2E: `pnpm test:e2e` Saat men-debug provider/model nyata (memerlukan kredensial nyata): -- Suite live (probe model + gateway tool/image): `pnpm test:live` +- Suite live (probe model + tool/image Gateway): `pnpm test:live` - Targetkan satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` Tip: saat Anda hanya memerlukan satu kasus gagal, sebaiknya persempit pengujian live melalui env var allowlist yang dijelaskan di bawah. @@ -54,53 +54,54 @@ Tip: saat Anda hanya memerlukan satu kasus gagal, sebaiknya persempit pengujian Perintah-perintah ini berada di samping suite pengujian utama saat Anda memerlukan realisme QA-lab: - `pnpm openclaw qa suite` - - Menjalankan skenario QA berbasis repo langsung di host. - - Menjalankan beberapa skenario yang dipilih secara paralel secara default dengan worker gateway yang terisolasi, hingga 64 worker atau sejumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk jalur serial lama. + - Menjalankan skenario QA berbasis repo secara langsung di host. + - Menjalankan beberapa skenario terpilih secara paralel secara default dengan worker gateway yang terisolasi. `qa-channel` default ke konkurensi 4 (dibatasi oleh jumlah skenario yang dipilih). Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk lane serial yang lebih lama. + - Keluar dengan status non-zero saat ada skenario yang gagal. Gunakan `--allow-failures` saat Anda menginginkan artefak tanpa exit code gagal. - Mendukung mode provider `live-frontier`, `mock-openai`, dan `aimock`. - `aimock` memulai server provider berbasis AIMock lokal untuk cakupan fixture dan mock protokol eksperimental tanpa menggantikan jalur `mock-openai` yang sadar skenario. + `aimock` memulai server provider lokal berbasis AIMock untuk cakupan fixture eksperimental dan protocol-mock tanpa menggantikan lane `mock-openai` yang sadar skenario. - `pnpm openclaw qa suite --runner multipass` - Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai. - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` di host. - - Menggunakan kembali flag pemilihan provider/model yang sama seperti `qa suite`. - - Jalur live meneruskan input auth QA yang didukung dan praktis untuk guest: - kunci provider berbasis env, path konfigurasi provider live QA, dan `CODEX_HOME` bila ada. + - Menggunakan ulang flag pemilihan provider/model yang sama seperti `qa suite`. + - Run live meneruskan input auth QA yang didukung dan praktis untuk guest: + key provider berbasis env, path config provider live QA, dan `CODEX_HOME` bila ada. - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis kembali melalui workspace yang di-mount. - - Menulis laporan + ringkasan QA normal serta log Multipass di bawah + - Menulis report + ringkasan QA normal serta log Multipass di bawah `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - Memulai situs QA berbasis Docker untuk pekerjaan QA gaya operator. - `pnpm openclaw qa aimock` - - Hanya memulai server provider AIMock lokal untuk pengujian asap protokol langsung. + - Hanya memulai server provider AIMock lokal untuk smoke testing protokol secara langsung. - `pnpm openclaw qa matrix` - - Menjalankan jalur QA live Matrix terhadap homeserver Tuwunel berbasis Docker sekali pakai. + - Menjalankan lane QA live Matrix terhadap homeserver Tuwunel berbasis Docker yang sekali pakai. - Host QA ini saat ini hanya untuk repo/dev. Instalasi OpenClaw terpaket tidak menyertakan `qa-lab`, jadi tidak mengekspos `openclaw qa`. - Checkout repo memuat runner bundel secara langsung; tidak diperlukan langkah instalasi plugin terpisah. - - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) ditambah satu room privat, lalu memulai child gateway QA dengan plugin Matrix nyata sebagai transport SUT. - - Menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1` secara default. Override dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` saat Anda perlu menguji image yang berbeda. - - Matrix tidak mengekspos flag sumber kredensial bersama karena jalur ini menyediakan pengguna sekali pakai secara lokal. - - Menulis laporan QA Matrix, ringkasan, artefak observed-events, dan log output gabungan stdout/stderr di bawah `.artifacts/qa-e2e/...`. + - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) plus satu room privat, lalu memulai child gateway QA dengan plugin Matrix nyata sebagai transport SUT. + - Secara default menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1`. Override dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` saat Anda perlu menguji image lain. + - Matrix tidak mengekspos flag sumber kredensial bersama karena lane ini menyediakan pengguna sekali pakai secara lokal. + - Menulis report QA Matrix, ringkasan, artefak observed-events, dan log gabungan stdout/stderr di bawah `.artifacts/qa-e2e/...`. - `pnpm openclaw qa telegram` - - Menjalankan jalur QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. - - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa ID chat Telegram numerik. - - Mendukung `--credential-source convex` untuk kredensial gabungan bersama. Gunakan mode env secara default, atau set `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk memilih lease gabungan. - - Memerlukan dua bot berbeda di grup privat yang sama, dengan bot SUT mengekspos username Telegram. - - Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. - - Menulis laporan QA Telegram, ringkasan, dan artefak observed-messages di bawah `.artifacts/qa-e2e/...`. + - Menjalankan lane QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. + - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa chat id Telegram numerik. + - Mendukung `--credential-source convex` untuk kredensial bersama yang dipool. Gunakan mode env secara default, atau setel `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk memilih lease pool. + - Keluar dengan status non-zero saat ada skenario yang gagal. Gunakan `--allow-failures` saat Anda menginginkan artefak tanpa exit code gagal. + - Memerlukan dua bot yang berbeda dalam grup privat yang sama, dengan bot SUT mengekspos username Telegram. + - Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot di grup. + - Menulis report QA Telegram, ringkasan, dan artefak observed-messages di bawah `.artifacts/qa-e2e/...`. -Jalur transport live berbagi satu kontrak standar agar transport baru tidak menyimpang: +Lane transport live berbagi satu kontrak standar agar transport baru tidak menyimpang: `qa-channel` tetap menjadi suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live. -| Jalur | Canary | Mention gating | Blokir allowlist | Balasan tingkat atas | Lanjutkan setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah bantuan | -| -------- | ------ | -------------- | ---------------- | -------------------- | ------------------------- | -------------------- | -------------- | ---------------- | ---------------- | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| Lane | Canary | Gating mention | Blokir allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah help | +| -------- | ------ | -------------- | ---------------- | -------------------- | ---------------------- | -------------------- | -------------- | ---------------- | ------------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | ### Kredensial Telegram bersama melalui Convex (v1) Saat `--credential-source convex` (atau `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) diaktifkan untuk -`openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool berbasis Convex, mengirim Heartbeat -untuk lease tersebut selama jalur berjalan, dan melepaskan lease saat shutdown. +`openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool berbasis Convex, mengirim Heartbeat untuk lease tersebut selama lane berjalan, dan melepaskan lease saat shutdown. Scaffold proyek Convex referensi: @@ -108,13 +109,13 @@ Scaffold proyek Convex referensi: Env var yang diperlukan: -- `OPENCLAW_QA_CONVEX_SITE_URL` (contohnya `https://your-deployment.convex.site`) -- Satu secret untuk role yang dipilih: +- `OPENCLAW_QA_CONVEX_SITE_URL` (misalnya `https://your-deployment.convex.site`) +- Satu secret untuk peran yang dipilih: - `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` untuk `maintainer` - `OPENCLAW_QA_CONVEX_SECRET_CI` untuk `ci` -- Pemilihan role kredensial: +- Pemilihan peran kredensial: - CLI: `--credential-role maintainer|ci` - - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default ke `maintainer`) + - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default `ci` di CI, selain itu `maintainer`) Env var opsional: @@ -124,9 +125,9 @@ Env var opsional: - `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (default `15000`) - `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (default `/qa-credentials/v1`) - `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (ID pelacakan opsional) -- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex `http://` loopback untuk pengembangan lokal saja. +- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex loopback `http://` untuk pengembangan lokal saja. -`OPENCLAW_QA_CONVEX_SITE_URL` sebaiknya menggunakan `https://` dalam operasi normal. +`OPENCLAW_QA_CONVEX_SITE_URL` seharusnya menggunakan `https://` dalam operasi normal. Perintah admin maintainer (tambah/hapus/daftar pool) memerlukan `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` secara khusus. @@ -144,31 +145,31 @@ Gunakan `--json` untuk output yang dapat dibaca mesin dalam skrip dan utilitas C Kontrak endpoint default (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): - `POST /acquire` - - Permintaan: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` + - Request: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` - Berhasil: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` - Habis/dapat dicoba ulang: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` - `POST /heartbeat` - - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` + - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) - `POST /release` - - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken }` + - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken }` - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) -- `POST /admin/add` (hanya secret maintainer) - - Permintaan: `{ kind, actorId, payload, note?, status? }` +- `POST /admin/add` (khusus secret maintainer) + - Request: `{ kind, actorId, payload, note?, status? }` - Berhasil: `{ status: "ok", credential }` -- `POST /admin/remove` (hanya secret maintainer) - - Permintaan: `{ credentialId, actorId }` +- `POST /admin/remove` (khusus secret maintainer) + - Request: `{ credentialId, actorId }` - Berhasil: `{ status: "ok", changed, credential }` - Pengaman lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` -- `POST /admin/list` (hanya secret maintainer) - - Permintaan: `{ kind?, status?, includePayload?, limit? }` +- `POST /admin/list` (khusus secret maintainer) + - Request: `{ kind?, status?, includePayload?, limit? }` - Berhasil: `{ status: "ok", credentials, count }` Bentuk payload untuk jenis Telegram: - `{ groupId: string, driverToken: string, sutToken: string }` -- `groupId` harus berupa string ID chat Telegram numerik. -- `admin/add` memvalidasi bentuk ini untuk `kind: "telegram"` dan menolak payload yang tidak valid. +- `groupId` harus berupa string chat id Telegram numerik. +- `admin/add` memvalidasi bentuk ini untuk `kind: "telegram"` dan menolak payload yang malformed. ### Menambahkan channel ke QA @@ -177,8 +178,8 @@ Menambahkan channel ke sistem QA markdown memerlukan tepat dua hal: 1. Adapter transport untuk channel tersebut. 2. Paket skenario yang menjalankan kontrak channel. -Jangan menambahkan root perintah QA tingkat atas baru ketika host bersama `qa-lab` dapat -memiliki alurnya. +Jangan tambahkan root perintah QA tingkat atas baru saat host `qa-lab` bersama dapat +memiliki alur tersebut. `qa-lab` memiliki mekanisme host bersama: @@ -186,7 +187,7 @@ memiliki alurnya. - startup dan teardown suite - konkurensi worker - penulisan artefak -- pembuatan laporan +- pembuatan report - eksekusi skenario - alias kompatibilitas untuk skenario `qa-channel` yang lebih lama @@ -197,9 +198,9 @@ Plugin runner memiliki kontrak transport: - bagaimana kesiapan diperiksa - bagaimana event masuk diinjeksikan - bagaimana pesan keluar diamati -- bagaimana transkrip dan status transport yang dinormalisasi diekspos +- bagaimana transkrip dan status transport ternormalisasi diekspos - bagaimana tindakan berbasis transport dijalankan -- bagaimana reset atau pembersihan khusus transport ditangani +- bagaimana reset atau cleanup khusus transport ditangani Batas adopsi minimum untuk channel baru adalah: @@ -207,18 +208,18 @@ Batas adopsi minimum untuk channel baru adalah: 2. Implementasikan runner transport pada seam host `qa-lab` bersama. 3. Simpan mekanisme khusus transport di dalam plugin runner atau harness channel. 4. Pasang runner sebagai `openclaw qa ` alih-alih mendaftarkan root perintah pesaing. - Plugin runner harus mendeklarasikan `qaRunners` di `openclaw.plugin.json` dan mengekspor array `qaRunnerCliRegistrations` yang cocok dari `runtime-api.ts`. - Jaga `runtime-api.ts` tetap ringan; eksekusi CLI dan runner lazy harus tetap berada di balik entrypoint terpisah. + Plugin runner harus mendeklarasikan `qaRunners` di `openclaw.plugin.json` dan mengekspor array `qaRunnerCliRegistrations` yang sesuai dari `runtime-api.ts`. + Jaga `runtime-api.ts` tetap ringan; CLI lazy dan eksekusi runner harus tetap berada di balik entrypoint terpisah. 5. Tulis atau adaptasi skenario markdown di bawah direktori bertema `qa/scenarios/`. 6. Gunakan helper skenario generik untuk skenario baru. -7. Pertahankan alias kompatibilitas yang ada agar tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja. +7. Pastikan alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja. -Aturan pengambilan keputusan bersifat ketat: +Aturan keputusannya ketat: - Jika perilaku dapat diekspresikan satu kali di `qa-lab`, letakkan di `qa-lab`. - Jika perilaku bergantung pada satu transport channel, simpan di plugin runner atau harness plugin tersebut. -- Jika skenario membutuhkan kapabilitas baru yang dapat digunakan oleh lebih dari satu channel, tambahkan helper generik alih-alih percabangan khusus channel di `suite.ts`. -- Jika sebuah perilaku hanya bermakna untuk satu transport, pertahankan skenario tersebut khusus transport dan buat itu eksplisit dalam kontrak skenario. +- Jika sebuah skenario memerlukan kapabilitas baru yang dapat digunakan oleh lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. +- Jika sebuah perilaku hanya bermakna untuk satu transport, pertahankan skenario tersebut tetap khusus transport dan nyatakan itu secara eksplisit dalam kontrak skenario. Nama helper generik yang disarankan untuk skenario baru adalah: @@ -243,85 +244,85 @@ Alias kompatibilitas tetap tersedia untuk skenario yang ada, termasuk: - `formatConversationTranscript` - `resetBus` -Pekerjaan channel baru sebaiknya menggunakan nama helper generik. -Alias kompatibilitas ada untuk menghindari migrasi serentak, bukan sebagai model untuk +Pekerjaan channel baru harus menggunakan nama helper generik. +Alias kompatibilitas ada untuk menghindari migrasi sekaligus dalam satu hari, bukan sebagai model untuk penulisan skenario baru. -## Suite pengujian (apa yang dijalankan di mana) +## Suite pengujian (apa yang berjalan di mana) -Anggap suite ini sebagai “realisme yang makin meningkat” (dan flakiness/biaya yang juga meningkat): +Anggap suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang meningkat): ### Unit / integrasi (default) - Perintah: `pnpm test` -- Konfigurasi: sepuluh shard run berurutan (`vitest.full-*.config.ts`) di atas project Vitest terskop yang ada +- Config: sepuluh run shard berurutan (`vitest.full-*.config.ts`) di atas project Vitest terlingkup yang ada - File: inventaris core/unit di bawah `src/**/*.test.ts`, `packages/**/*.test.ts`, `test/**/*.test.ts`, dan pengujian node `ui` yang di-whitelist yang dicakup oleh `vitest.unit.config.ts` - Cakupan: - Pengujian unit murni - Pengujian integrasi in-process (auth gateway, routing, tooling, parsing, config) - - Regresi deterministik untuk bug yang diketahui + - Regresi deterministik untuk bug yang sudah diketahui - Ekspektasi: - Berjalan di CI - - Tidak memerlukan kunci nyata + - Tidak memerlukan key nyata - Harus cepat dan stabil - Catatan project: - - `pnpm test` tanpa target sekarang menjalankan sebelas konfigurasi shard yang lebih kecil (`core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang besar. Ini mengurangi puncak RSS pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension membuat suite lain kelaparan sumber daya. - - `pnpm test --watch` tetap menggunakan grafik project native root `vitest.config.ts`, karena loop watch multi-shard tidak praktis. - - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui jalur terskop terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` menghindari biaya startup penuh root project. - - `pnpm test:changed` memperluas path git yang berubah ke jalur terskop yang sama saat diff hanya menyentuh file source/test yang dapat dirutekan; edit config/setup tetap fallback ke rerun root-project yang luas. - - Pengujian unit ringan-impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui jalur `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file stateful/runtime-heavy tetap di jalur yang ada. - - Sejumlah file source helper `plugin-sdk` dan `commands` yang dipilih juga memetakan changed-mode run ke pengujian sibling eksplisit di jalur ringan tersebut, sehingga edit helper menghindari rerun suite berat penuh untuk direktori itu. - - `auto-reply` sekarang memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness reply terberat tetap terpisah dari pengujian status/chunk/token yang murah. + - `pnpm test` tanpa target sekarang menjalankan sebelas config shard yang lebih kecil (`core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang sangat besar. Ini mengurangi puncak RSS pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension menghambat suite yang tidak terkait. + - `pnpm test --watch` masih menggunakan graph project `vitest.config.ts` root native, karena loop watch multi-shard tidak praktis. + - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane terlingkup terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` tidak perlu membayar biaya startup penuh root project. + - `pnpm test:changed` memperluas path git yang berubah ke lane terlingkup yang sama ketika diff hanya menyentuh file source/test yang dapat dirutekan; pengeditan config/setup tetap fallback ke rerun root-project yang luas. + - Pengujian unit ringan impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file yang stateful/berat pada runtime tetap berada di lane yang ada. + - Sejumlah file source helper `plugin-sdk` dan `commands` juga memetakan run mode changed ke pengujian sibling eksplisit di lane ringan tersebut, sehingga pengeditan helper tidak perlu menjalankan ulang suite berat penuh untuk direktori itu. + - `auto-reply` kini memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness balasan terberat tetap jauh dari pengujian status/chunk/token yang murah. - Catatan embedded runner: - - Saat Anda mengubah input penemuan message-tool atau konteks runtime Compaction, + - Saat Anda mengubah input discovery message-tool atau konteks runtime Compaction, pertahankan kedua tingkat cakupan. - Tambahkan regresi helper yang terfokus untuk batas routing/normalisasi murni. - - Juga pertahankan suite integrasi embedded runner tetap sehat: + - Juga pastikan suite integrasi embedded runner tetap sehat: `src/agents/pi-embedded-runner/compact.hooks.test.ts`, `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`, dan `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - Suite tersebut memverifikasi bahwa scoped id dan perilaku Compaction tetap mengalir + - Suite tersebut memverifikasi bahwa ID terlingkup dan perilaku Compaction tetap mengalir melalui path `run.ts` / `compact.ts` yang nyata; pengujian helper saja bukan pengganti yang memadai untuk path integrasi tersebut. - Catatan pool: - - Konfigurasi dasar Vitest sekarang default ke `threads`. - - Konfigurasi Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh root project, config e2e, dan live. - - Jalur UI root mempertahankan setup dan optimizer `jsdom`-nya, tetapi sekarang juga berjalan pada runner non-isolated bersama. - - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari konfigurasi Vitest bersama. - - Launcher bersama `scripts/run-vitest.mjs` sekarang juga menambahkan `--no-maglev` untuk proses child Node Vitest secara default guna mengurangi churn kompilasi V8 selama run lokal besar. Set `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan dengan perilaku V8 standar. + - Config dasar Vitest sekarang default ke `threads`. + - Config Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh config root project, e2e, dan live. + - Lane UI root mempertahankan setup dan optimizer `jsdom`-nya, tetapi kini juga berjalan pada runner non-isolated bersama. + - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari config Vitest bersama. + - Launcher bersama `scripts/run-vitest.mjs` kini juga menambahkan `--no-maglev` untuk proses child Node Vitest secara default guna mengurangi compile churn V8 selama run lokal besar. Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan dengan perilaku V8 bawaan. - Catatan iterasi lokal cepat: - - `pnpm test:changed` merutekan melalui jalur terskop saat path yang berubah terpetakan dengan rapi ke suite yang lebih kecil. + - `pnpm test:changed` merutekan melalui lane terlingkup ketika path yang berubah dapat dipetakan dengan bersih ke suite yang lebih kecil. - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku routing yang sama, hanya dengan batas worker yang lebih tinggi. - - Auto-scaling worker lokal sekarang memang sengaja konservatif dan juga mengurangi laju saat load average host sudah tinggi, sehingga beberapa run Vitest bersamaan secara default mengurangi dampak buruk. - - Konfigurasi dasar Vitest menandai file project/config sebagai `forceRerunTriggers` agar rerun changed-mode tetap benar saat wiring pengujian berubah. - - Konfigurasi tetap mengaktifkan `OPENCLAW_VITEST_FS_MODULE_CACHE` pada host yang didukung; set `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda ingin satu lokasi cache eksplisit untuk profiling langsung. -- Catatan perf-debug: + - Auto-scaling worker lokal kini sengaja lebih konservatif dan juga mundur ketika load average host sudah tinggi, sehingga beberapa run Vitest bersamaan secara default menimbulkan dampak yang lebih kecil. + - Config dasar Vitest menandai file project/config sebagai `forceRerunTriggers` agar rerun mode changed tetap benar saat wiring pengujian berubah. + - Config mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. +- Catatan debug performa: - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest plus output rincian impor. - - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke file yang berubah sejak `origin/main`. -- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan terhadap path native root-project untuk diff commit tersebut dan mencetak wall time plus RSS maksimum macOS. -- `pnpm test:perf:changed:bench -- --worktree` membenchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi root Vitest. - - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk overhead startup dan transform Vitest/Vite. + - `pnpm test:perf:imports:changed` melingkupi tampilan profiling yang sama ke file yang berubah sejak `origin/main`. +- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan terhadap path root-project native untuk diff yang sudah di-commit tersebut dan mencetak wall time plus max RSS macOS. +- `pnpm test:perf:changed:bench -- --worktree` membenchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan config root Vitest. + - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk startup dan overhead transform Vitest/Vite. - `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk suite unit dengan paralelisme file dinonaktifkan. -### E2E (gateway smoke) +### E2E (smoke gateway) - Perintah: `pnpm test:e2e` -- Konfigurasi: `vitest.e2e.config.ts` +- Config: `vitest.e2e.config.ts` - File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts` - Default runtime: - - Menggunakan `threads` Vitest dengan `isolate: false`, sama seperti bagian repo lainnya. + - Menggunakan Vitest `threads` dengan `isolate: false`, selaras dengan repo lainnya. - Menggunakan worker adaptif (CI: hingga 2, lokal: 1 secara default). - - Berjalan dalam mode senyap secara default untuk mengurangi overhead I/O konsol. + - Berjalan dalam mode silent secara default untuk mengurangi overhead I/O konsol. - Override yang berguna: - - `OPENCLAW_E2E_WORKERS=` untuk memaksa jumlah worker (dibatasi hingga 16). + - `OPENCLAW_E2E_WORKERS=` untuk memaksa jumlah worker (dibatasi sampai 16). - `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali output konsol verbose. - Cakupan: - - Perilaku end-to-end gateway multi-instans - - Surface WebSocket/HTTP, pairing node, dan jaringan yang lebih berat + - Perilaku end-to-end gateway multi-instance + - Surface WebSocket/HTTP, pairing node, dan networking yang lebih berat - Ekspektasi: - Berjalan di CI (saat diaktifkan di pipeline) - - Tidak memerlukan kunci nyata - - Lebih banyak bagian bergerak daripada pengujian unit (bisa lebih lambat) + - Tidak memerlukan key nyata + - Lebih banyak komponen bergerak dibanding pengujian unit (bisa lebih lambat) ### E2E: smoke backend OpenShell @@ -330,7 +331,7 @@ Anggap suite ini sebagai “realisme yang makin meningkat” (dan flakiness/biay - Cakupan: - Memulai gateway OpenShell terisolasi di host melalui Docker - Membuat sandbox dari Dockerfile lokal sementara - - Menjalankan backend OpenShell OpenClaw melalui `sandbox ssh-config` + eksekusi SSH yang nyata + - Menjalankan backend OpenShell OpenClaw melalui `sandbox ssh-config` + eksekusi SSH nyata - Memverifikasi perilaku filesystem remote-canonical melalui bridge fs sandbox - Ekspektasi: - Hanya opt-in; bukan bagian dari run default `pnpm test:e2e` @@ -338,122 +339,122 @@ Anggap suite ini sebagai “realisme yang makin meningkat” (dan flakiness/biay - Menggunakan `HOME` / `XDG_CONFIG_HOME` yang terisolasi, lalu menghancurkan gateway dan sandbox pengujian - Override yang berguna: - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manual - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI non-default atau skrip wrapper + - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke binary CLI non-default atau skrip wrapper ### Live (provider nyata + model nyata) - Perintah: `pnpm test:live` -- Konfigurasi: `vitest.live.config.ts` +- Config: `vitest.live.config.ts` - File: `src/**/*.live.test.ts` -- Default: **diaktifkan** oleh `pnpm test:live` (menetapkan `OPENCLAW_LIVE_TEST=1`) +- Default: **diaktifkan** oleh `pnpm test:live` (menyetel `OPENCLAW_LIVE_TEST=1`) - Cakupan: - “Apakah provider/model ini benar-benar berfungsi _hari ini_ dengan kredensial nyata?” - - Menangkap perubahan format provider, keanehan pemanggilan tool, masalah auth, dan perilaku rate limit + - Menangkap perubahan format provider, keunikan pemanggilan tool, masalah auth, dan perilaku rate limit - Ekspektasi: - - Memang tidak stabil untuk CI secara desain (jaringan nyata, kebijakan provider nyata, kuota, outage) + - Secara desain tidak stabil untuk CI (jaringan nyata, kebijakan provider nyata, kuota, outage) - Menghabiskan biaya / menggunakan rate limit - - Lebih baik menjalankan subset yang dipersempit daripada “semuanya” -- Run live mengambil sumber dari `~/.profile` untuk mendapatkan API key yang hilang. -- Secara default, run live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara agar fixture unit tidak dapat memodifikasi `~/.openclaw` asli Anda. -- Set `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang ingin pengujian live menggunakan direktori home asli Anda. -- `pnpm test:live` sekarang default ke mode yang lebih senyap: tetap mempertahankan output progres `[live] ...`, tetapi menekan notifikasi `~/.profile` tambahan dan membisukan log bootstrap gateway/chatter Bonjour. Set `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali. -- Rotasi API key (khusus provider): set `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (contohnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian akan mencoba ulang saat menerima respons rate limit. + - Sebaiknya jalankan subset yang dipersempit, bukan “semuanya” +- Run live mengambil source `~/.profile` untuk mengambil API key yang belum ada. +- Secara default, run live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara agar fixture unit tidak dapat mengubah `~/.openclaw` nyata Anda. +- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya ketika Anda sengaja memerlukan pengujian live menggunakan direktori home nyata Anda. +- `pnpm test:live` kini default ke mode yang lebih senyap: tetap mempertahankan output progres `[live] ...`, tetapi menekan notifikasi tambahan `~/.profile` dan membisukan log bootstrap gateway/obrolan Bonjour. Setel `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali. +- Rotasi API key (khusus provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian mencoba ulang pada respons rate limit. - Output progres/Heartbeat: - - Suite live sekarang mengeluarkan baris progres ke stderr sehingga panggilan provider yang panjang terlihat aktif bahkan saat penangkapan konsol Vitest senyap. - - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway mengalir segera selama run live. - - Atur Heartbeat direct-model dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. - - Atur Heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - Suite live kini mengirim baris progres ke stderr sehingga panggilan provider yang lama terlihat aktif bahkan saat penangkapan konsol Vitest sedang senyap. + - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway langsung mengalir selama run live. + - Sesuaikan Heartbeat direct-model dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. + - Sesuaikan Heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. ## Suite mana yang harus saya jalankan? Gunakan tabel keputusan ini: - Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda banyak mengubah) -- Menyentuh jaringan gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` +- Menyentuh networking gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` - Men-debug “bot saya down” / kegagalan khusus provider / pemanggilan tool: jalankan `pnpm test:live` yang dipersempit -## Live: sapuan kapabilitas node Android +## Live: penyapuan kapabilitas node Android - Pengujian: `src/gateway/android-node.capabilities.live.test.ts` - Skrip: `pnpm android:test:integration` -- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh node Android yang terhubung dan memverifikasi perilaku kontrak perintah. +- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh node Android yang terhubung dan mengasert perilaku kontrak perintah. - Cakupan: - - Setup manual/prakondisi (suite ini tidak memasang/menjalankan/melakukan pairing aplikasi). - - Validasi gateway `node.invoke` per perintah untuk node Android yang dipilih. -- Pra-setup yang diperlukan: + - Setup manual/prasyarat (suite ini tidak menginstal/menjalankan/melakukan pairing aplikasi). + - Validasi `node.invoke` gateway per perintah untuk node Android yang dipilih. +- Pra-setup wajib: - Aplikasi Android sudah terhubung + dipairing ke gateway. - Aplikasi tetap berada di foreground. - - Izin/persetujuan capture diberikan untuk kapabilitas yang Anda harapkan lolos. + - Izin/persetujuan capture diberikan untuk kapabilitas yang Anda harapkan lulus. - Override target opsional: - `OPENCLAW_ANDROID_NODE_ID` atau `OPENCLAW_ANDROID_NODE_NAME`. - `OPENCLAW_ANDROID_GATEWAY_URL` / `OPENCLAW_ANDROID_GATEWAY_TOKEN` / `OPENCLAW_ANDROID_GATEWAY_PASSWORD`. -- Detail setup Android lengkap: [Aplikasi Android](/id/platforms/android) +- Detail setup Android lengkap: [Android App](/id/platforms/android) -## Live: smoke model (kunci profil) +## Live: smoke model (key profil) -Pengujian live dibagi menjadi dua lapisan agar kita bisa mengisolasi kegagalan: +Pengujian live dibagi menjadi dua lapisan agar kita dapat mengisolasi kegagalan: -- “Direct model” memberi tahu kita bahwa provider/model dapat merespons sama sekali dengan kunci yang diberikan. -- “Gateway smoke” memberi tahu kita bahwa pipeline gateway+agent penuh berfungsi untuk model tersebut (sesi, riwayat, tools, kebijakan sandbox, dan sebagainya). +- “Direct model” memberi tahu kita apakah provider/model dapat menjawab sama sekali dengan key yang diberikan. +- “Gateway smoke” memberi tahu kita apakah pipeline gateway+agen penuh berfungsi untuk model tersebut (sesi, histori, tool, kebijakan sandbox, dll.). ### Lapisan 1: penyelesaian model langsung (tanpa gateway) - Pengujian: `src/agents/models.profiles.live.test.ts` - Tujuan: - - Menginventarisasi model yang ditemukan + - Mengenumerasi model yang ditemukan - Menggunakan `getApiKeyForModel` untuk memilih model yang Anda miliki kredensialnya - Menjalankan completion kecil per model (dan regresi yang ditargetkan bila diperlukan) - Cara mengaktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) -- Set `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini akan dilewati agar `pnpm test:live` tetap fokus pada gateway smoke +- Setel `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini akan dilewati agar `pnpm test:live` tetap fokus pada gateway smoke - Cara memilih model: - `OPENCLAW_LIVE_MODELS=modern` untuk menjalankan allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_MODELS=all` adalah alias untuk allowlist modern - atau `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist dipisahkan koma) - - Sapuan modern/all default ke batas kurasi bernilai sinyal tinggi; set `OPENCLAW_LIVE_MAX_MODELS=0` untuk sapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Penyapuan modern/all secara default menggunakan batas kurasi dengan sinyal tinggi; setel `OPENCLAW_LIVE_MAX_MODELS=0` untuk penyapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. - Cara memilih provider: - `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist dipisahkan koma) -- Dari mana kunci berasal: - - Secara default: profile store dan fallback env - - Set `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa **profile store** saja -- Mengapa ini ada: - - Memisahkan “API provider rusak / kunci tidak valid” dari “pipeline agent gateway rusak” +- Sumber key: + - Default: profile store dan fallback env + - Setel `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk menegakkan hanya **profile store** +- Alasan ini ada: + - Memisahkan “API provider rusak / key tidak valid” dari “pipeline agen gateway rusak” - Menampung regresi kecil dan terisolasi (contoh: replay reasoning OpenAI Responses/Codex Responses + alur tool-call) -### Lapisan 2: Gateway + smoke agen dev (apa yang sebenarnya dilakukan "@openclaw") +### Lapisan 2: smoke Gateway + agen dev (apa yang sebenarnya dilakukan `@openclaw`) - Pengujian: `src/gateway/gateway-models.profiles.live.test.ts` - Tujuan: - - Memutar gateway in-process + - Menyalakan gateway in-process - Membuat/menambal sesi `agent:dev:*` (override model per run) - - Mengiterasi model-dengan-kunci dan memverifikasi: + - Mengiterasi model-dengan-key dan memastikan: - respons yang “bermakna” (tanpa tools) - - satu pemanggilan tool nyata berfungsi (probe read) - - probe tool tambahan opsional (probe exec+read) + - satu pemanggilan tool nyata berfungsi (probe baca) + - probe tool ekstra opsional (probe exec+baca) - path regresi OpenAI (hanya-tool-call → tindak lanjut) tetap berfungsi - Detail probe (agar Anda dapat menjelaskan kegagalan dengan cepat): - - probe `read`: pengujian menulis file nonce di workspace dan meminta agen untuk `read` file tersebut serta mengembalikan nonce. - - probe `exec+read`: pengujian meminta agen untuk menulis nonce ke file sementara melalui `exec`, lalu `read` kembali. - - probe image: pengujian melampirkan PNG yang dibuat (kucing + kode yang diacak) dan mengharapkan model mengembalikan `cat `. + - probe `read`: pengujian menulis file nonce di workspace dan meminta agen untuk `read` file tersebut lalu menggemakan nonce kembali. + - probe `exec+read`: pengujian meminta agen untuk menulis nonce ke file sementara dengan `exec`, lalu `read` kembali. + - probe image: pengujian melampirkan PNG yang dibuat (kucing + kode acak) dan mengharapkan model mengembalikan `cat `. - Referensi implementasi: `src/gateway/gateway-models.profiles.live.test.ts` dan `src/gateway/live-image-probe.ts`. - Cara mengaktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - Cara memilih model: - Default: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_GATEWAY_MODELS=all` adalah alias untuk allowlist modern - - Atau set `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit - - Sapuan gateway modern/all default ke batas kurasi bernilai sinyal tinggi; set `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Atau setel `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit + - Penyapuan gateway modern/all secara default menggunakan batas kurasi dengan sinyal tinggi; setel `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk penyapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. - Cara memilih provider (hindari “semua OpenRouter”): - `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"` (allowlist dipisahkan koma) - Probe tool + image selalu aktif dalam pengujian live ini: - probe `read` + probe `exec+read` (stress tool) - - probe image berjalan ketika model mengiklankan dukungan input image + - probe image berjalan saat model mengiklankan dukungan input image - Alur (tingkat tinggi): - - Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) + - Pengujian membuat PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) - Mengirimkannya melalui `agent` `attachments: [{ mimeType: "image/png", content: "" }]` - - Gateway mengurai lampiran menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) - - Agen tersemat meneruskan pesan pengguna multimodal ke model - - Verifikasi: balasan mengandung `cat` + kode tersebut (toleransi OCR: kesalahan kecil diperbolehkan) + - Gateway mem-parse lampiran menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) + - Agen embedded meneruskan pesan pengguna multimodal ke model + - Asersi: balasan berisi `cat` + kodenya (toleransi OCR: kesalahan kecil diperbolehkan) Tip: untuk melihat apa yang dapat Anda uji di mesin Anda (dan ID `provider/model` yang tepat), jalankan: @@ -466,7 +467,7 @@ openclaw models list --json - Pengujian: `src/gateway/gateway-cli-backend.live.test.ts` - Tujuan: memvalidasi pipeline Gateway + agen menggunakan backend CLI lokal, tanpa menyentuh config default Anda. -- Default smoke khusus backend berada di definisi `cli-backend.ts` milik extension yang memiliki backend tersebut. +- Default smoke khusus backend berada di definisi `cli-backend.ts` milik extension yang memilikinya. - Aktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - `OPENCLAW_LIVE_CLI_BACKEND=1` @@ -478,10 +479,10 @@ openclaw models list --json - `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"` - `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'` - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran image nyata (path disuntikkan ke prompt). - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path file image sebagai argumen CLI alih-alih injeksi prompt. - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol bagaimana argumen image diteruskan saat `IMAGE_ARG` diatur. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk mengirim path file image sebagai argumen CLI alih-alih injeksi prompt. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengendalikan cara argumen image dikirim saat `IMAGE_ARG` disetel. - `OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1` untuk mengirim giliran kedua dan memvalidasi alur resume. - - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas sesi yang sama Claude Sonnet -> Opus bawaan (set ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). + - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas sesi yang sama Claude Sonnet -> Opus default (setel ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). Contoh: @@ -509,27 +510,27 @@ pnpm test:docker:live-cli-backend:gemini Catatan: - Runner Docker berada di `scripts/test-live-cli-backend-docker.sh`. -- Runner ini menjalankan smoke CLI-backend live di dalam image Docker repo sebagai pengguna `node` non-root. -- Runner ini me-resolve metadata smoke CLI dari extension yang memilikinya, lalu memasang paket CLI Linux yang cocok (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`). -- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth subscription Claude Code portabel melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Runner ini mula-mula membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env API key Anthropic. Jalur subscription ini menonaktifkan probe Claude MCP/tool dan image secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas paket subscription normal. -- Smoke CLI-backend live sekarang menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI gateway. +- Runner ini menjalankan smoke CLI-backend live di dalam image Docker repo sebagai pengguna non-root `node`. +- Runner ini menyelesaikan metadata smoke CLI dari extension yang memilikinya, lalu memasang paket CLI Linux yang sesuai (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`). +- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth langganan portable Claude Code melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Perintah ini pertama-tama membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env API key Anthropic. Lane langganan ini menonaktifkan probe Claude MCP/tool dan image secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui tagihan extra-usage alih-alih batas paket langganan normal. +- Smoke CLI-backend live kini menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI gateway. - Smoke default Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi sesi yang dilanjutkan masih mengingat catatan sebelumnya. -## Live: ACP bind smoke (`/acp spawn ... --bind here`) +## Live: smoke ACP bind (`/acp spawn ... --bind here`) - Pengujian: `src/gateway/gateway-acp-bind.live.test.ts` - Tujuan: memvalidasi alur bind percakapan ACP nyata dengan agen ACP live: - kirim `/acp spawn --bind here` - - bind percakapan channel-pesan sintetis di tempat + - bind percakapan channel pesan sintetis di tempat - kirim tindak lanjut normal pada percakapan yang sama - - verifikasi tindak lanjut masuk ke transkrip sesi ACP yang dibind + - verifikasi bahwa tindak lanjut masuk ke transkrip sesi ACP yang terikat - Aktifkan: - `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts` - `OPENCLAW_LIVE_ACP_BIND=1` - Default: - Agen ACP di Docker: `claude,codex,gemini` - Agen ACP untuk `pnpm test:live ...` langsung: `claude` - - Channel sintetis: konteks percakapan bergaya DM Slack + - Channel sintetis: konteks percakapan gaya Slack DM - Backend ACP: `acpx` - Override: - `OPENCLAW_LIVE_ACP_BIND_AGENT=claude` @@ -538,8 +539,8 @@ Catatan: - `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini` - `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@'` - Catatan: - - Jalur ini menggunakan surface `chat.send` gateway dengan field originating-route sintetis khusus admin sehingga pengujian dapat melampirkan konteks channel pesan tanpa berpura-pura mengirim secara eksternal. - - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak diatur, pengujian menggunakan registri agen bawaan plugin `acpx` tersemat untuk agen harness ACP yang dipilih. + - Lane ini menggunakan surface `chat.send` gateway dengan field originating-route sintetis khusus admin sehingga pengujian dapat melampirkan konteks channel pesan tanpa berpura-pura mengirim secara eksternal. + - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak disetel, pengujian menggunakan registry agen bawaan plugin embedded `acpx` untuk agen harness ACP yang dipilih. Contoh: @@ -566,29 +567,29 @@ pnpm test:docker:live-acp-bind:gemini Catatan Docker: - Runner Docker berada di `scripts/test-live-acp-bind-docker.sh`. -- Secara default, runner ini menjalankan ACP bind smoke terhadap semua agen CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. +- Secara default, runner ini menjalankan smoke ACP bind terhadap semua agen CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. - Gunakan `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude`, `OPENCLAW_LIVE_ACP_BIND_AGENTS=codex`, atau `OPENCLAW_LIVE_ACP_BIND_AGENTS=gemini` untuk mempersempit matriks. -- Runner ini mengambil sumber dari `~/.profile`, menyiapkan materi auth CLI yang sesuai ke dalam container, memasang `acpx` ke prefix npm yang writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. -- Di dalam Docker, runner mengatur `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` sehingga acpx menjaga env var provider dari profile yang di-source tetap tersedia bagi CLI harness child. +- Runner ini mengambil source `~/.profile`, men-stage materi auth CLI yang sesuai ke dalam container, memasang `acpx` ke prefix npm writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. +- Di dalam Docker, runner menyetel `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx mempertahankan env provider dari profile yang di-source tetap tersedia untuk CLI harness child. ## Live: smoke harness app-server Codex -- Tujuan: memvalidasi harness Codex milik plugin melalui method `agent` - gateway normal: - - memuat plugin `codex` yang dibundel +- Tujuan: memvalidasi harness Codex milik plugin melalui method + `agent` gateway normal: + - memuat plugin bundel `codex` - memilih `OPENCLAW_AGENT_RUNTIME=codex` - mengirim giliran agen gateway pertama ke `codex/gpt-5.4` - mengirim giliran kedua ke sesi OpenClaw yang sama dan memverifikasi thread app-server dapat dilanjutkan - - menjalankan `/codex status` dan `/codex models` melalui path perintah gateway - yang sama + - menjalankan `/codex status` dan `/codex models` melalui path perintah + gateway yang sama - Pengujian: `src/gateway/gateway-codex-harness.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_CODEX_HARNESS=1` - Model default: `codex/gpt-5.4` - Probe image opsional: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` - Probe MCP/tool opsional: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` -- Smoke ini menetapkan `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex - yang rusak tidak dapat lolos dengan diam-diam fallback ke PI. +- Smoke ini menyetel `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex + yang rusak tidak bisa lolos dengan diam-diam fallback ke Pi. - Auth: `OPENAI_API_KEY` dari shell/profile, ditambah salinan opsional `~/.codex/auth.json` dan `~/.codex/config.toml` @@ -613,19 +614,19 @@ pnpm test:docker:live-codex-harness Catatan Docker: - Runner Docker berada di `scripts/test-live-codex-harness-docker.sh`. -- Runner ini mengambil sumber dari `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file auth CLI Codex - saat tersedia, memasang `@openai/codex` ke prefix npm yang writable dan di-mount, - menyiapkan source tree, lalu hanya menjalankan pengujian live Codex-harness. -- Docker mengaktifkan probe image dan MCP/tool secara default. Set +- Runner ini mengambil source `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file auth CLI Codex + saat tersedia, memasang `@openai/codex` ke prefix npm writable yang di-mount, + men-stage source tree, lalu hanya menjalankan pengujian live Codex-harness. +- Docker mengaktifkan probe image dan MCP/tool secara default. Setel `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0` atau - `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` saat Anda memerlukan debug run yang lebih sempit. -- Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, sesuai dengan konfigurasi - pengujian live sehingga fallback `openai-codex/*` atau PI tidak dapat menyembunyikan regresi + `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` saat Anda memerlukan run debug yang lebih sempit. +- Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, selaras dengan config + pengujian live sehingga fallback `openai-codex/*` atau Pi tidak dapat menyembunyikan regresi harness Codex. ### Resep live yang direkomendasikan -Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling minim flakiness: +Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling sedikit flakiness-nya: - Satu model, langsung (tanpa gateway): - `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts` @@ -633,7 +634,7 @@ Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling minim flakin - Satu model, gateway smoke: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -- Tool calling di beberapa provider: +- Pemanggilan tool di beberapa provider: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` - Fokus Google (API key Gemini + Antigravity): @@ -642,16 +643,16 @@ Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling minim flakin Catatan: -- `google/...` menggunakan API Gemini (API key). -- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agen bergaya Cloud Code Assist). -- `google-gemini-cli/...` menggunakan CLI Gemini lokal di mesin Anda (auth terpisah + keanehan tooling). -- API Gemini vs CLI Gemini: - - API: OpenClaw memanggil API Gemini ter-host milik Google melalui HTTP (API key / auth profil); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”. - - CLI: OpenClaw menjalankan biner `gemini` lokal; CLI ini memiliki auth sendiri dan dapat berperilaku berbeda (streaming/dukungan tool/perbedaan versi). +- `google/...` menggunakan Gemini API (API key). +- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agen gaya Cloud Code Assist). +- `google-gemini-cli/...` menggunakan Gemini CLI lokal di mesin Anda (auth terpisah + keunikan tooling). +- Gemini API vs Gemini CLI: + - API: OpenClaw memanggil Gemini API ter-host milik Google melalui HTTP (API key / auth profil); ini yang dimaksud sebagian besar pengguna dengan “Gemini”. + - CLI: OpenClaw menjalankan binary `gemini` lokal; ini memiliki auth sendiri dan dapat berperilaku berbeda (streaming/dukungan tool/version skew). ## Live: matriks model (apa yang kami cakup) -Tidak ada “daftar model CI” yang tetap (live bersifat opt-in), tetapi ini adalah model-model **yang direkomendasikan** untuk dicakup secara rutin di mesin dev dengan kunci. +Tidak ada “daftar model CI” tetap (live bersifat opt-in), tetapi ini adalah model-model **yang direkomendasikan** untuk dicakup secara rutin pada mesin dev dengan key. ### Set smoke modern (tool calling + image) @@ -660,7 +661,7 @@ Ini adalah run “model umum” yang kami harapkan tetap berfungsi: - OpenAI (non-Codex): `openai/gpt-5.4` (opsional: `openai/gpt-5.4-mini`) - OpenAI Codex: `openai-codex/gpt-5.4` - Anthropic: `anthropic/claude-opus-4-6` (atau `anthropic/claude-sonnet-4-6`) -- Google (API Gemini): `google/gemini-3.1-pro-preview` dan `google/gemini-3-flash-preview` (hindari model Gemini 2.x yang lebih lama) +- Google (Gemini API): `google/gemini-3.1-pro-preview` dan `google/gemini-3-flash-preview` (hindari model Gemini 2.x yang lebih lama) - Google (Antigravity): `google-antigravity/claude-opus-4-6-thinking` dan `google-antigravity/gemini-3-flash` - Z.AI (GLM): `zai/glm-4.7` - MiniMax: `minimax/MiniMax-M2.7` @@ -668,7 +669,7 @@ Ini adalah run “model umum” yang kami harapkan tetap berfungsi: Jalankan gateway smoke dengan tools + image: `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -### Baseline: tool calling (Read + Exec opsional) +### Baseline: pemanggilan tool (Read + Exec opsional) Pilih setidaknya satu per keluarga provider: @@ -681,17 +682,17 @@ Pilih setidaknya satu per keluarga provider: Cakupan tambahan opsional (bagus untuk dimiliki): - xAI: `xai/grok-4` (atau versi terbaru yang tersedia) -- Mistral: `mistral/`… (pilih satu model yang mampu `tools` yang telah Anda aktifkan) -- Cerebras: `cerebras/`… (jika Anda punya akses) -- LM Studio: `lmstudio/`… (lokal; tool calling bergantung pada mode API) +- Mistral: `mistral/`… (pilih satu model yang mampu `tools` yang Anda aktifkan) +- Cerebras: `cerebras/`… (jika Anda memiliki akses) +- LM Studio: `lmstudio/`… (lokal; pemanggilan tool bergantung pada mode API) -### Vision: pengiriman image (lampiran → pesan multimodal) +### Vision: kirim image (lampiran → pesan multimodal) -Sertakan setidaknya satu model yang mampu image di `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dan sebagainya) untuk menjalankan probe image. +Sertakan setidaknya satu model yang mendukung image dalam `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dll.) untuk menjalankan probe image. -### Agregator / gateway alternatif +### Aggregator / gateway alternatif -Jika Anda mengaktifkan kunci yang sesuai, kami juga mendukung pengujian melalui: +Jika Anda mengaktifkan key, kami juga mendukung pengujian melalui: - OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mampu tool+image) - OpenCode: `opencode/...` untuk Zen dan `opencode-go/...` untuk Go (auth melalui `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) @@ -699,23 +700,23 @@ Jika Anda mengaktifkan kunci yang sesuai, kami juga mendukung pengujian melalui: Provider lain yang dapat Anda sertakan dalam matriks live (jika Anda memiliki kredensial/config): - Bawaan: `openai`, `openai-codex`, `anthropic`, `google`, `google-vertex`, `google-antigravity`, `google-gemini-cli`, `zai`, `openrouter`, `opencode`, `opencode-go`, `xai`, `groq`, `cerebras`, `mistral`, `github-copilot` -- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), plus proxy yang kompatibel dengan OpenAI/Anthropic apa pun (LM Studio, vLLM, LiteLLM, dan sebagainya) +- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), plus proxy yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.) -Tip: jangan mencoba meng-hardcode “semua model” di dokumentasi. Daftar yang otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + kunci apa pun yang tersedia. +Tip: jangan mencoba melakukan hardcode “semua model” di dokumentasi. Daftar yang otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + key apa pun yang tersedia. ## Kredensial (jangan pernah commit) -Pengujian live menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktis: +Pengujian live menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktisnya: -- Jika CLI berfungsi, pengujian live seharusnya menemukan kunci yang sama. -- Jika pengujian live mengatakan “tidak ada kredensial”, debug-lah dengan cara yang sama seperti saat Anda men-debug `openclaw models list` / pemilihan model. +- Jika CLI berfungsi, pengujian live seharusnya menemukan key yang sama. +- Jika pengujian live mengatakan “no creds”, debug dengan cara yang sama seperti saat Anda men-debug `openclaw models list` / pemilihan model. -- Profil auth per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud dengan “profile keys” di pengujian live) +- Profil auth per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud dengan “profile keys” dalam pengujian live) - Config: `~/.openclaw/openclaw.json` (atau `OPENCLAW_CONFIG_PATH`) -- Direktori status lama: `~/.openclaw/credentials/` (disalin ke home live yang disiapkan saat tersedia, tetapi bukan penyimpanan utama profile-key) -- Run lokal live secara default menyalin config aktif, file `auth-profiles.json` per agen, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara; home live yang disiapkan melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap tidak menyentuh workspace host asli Anda. +- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live yang di-stage saat tersedia, tetapi bukan profile-key store utama) +- Run lokal live menyalin config aktif, file `auth-profiles.json` per agen, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara secara default; home live yang di-stage melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap berada di luar workspace host nyata Anda. -Jika Anda ingin mengandalkan env key (misalnya yang diekspor di `~/.profile`), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (runner tersebut dapat me-mount `~/.profile` ke dalam container). +Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile`), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (runner ini dapat me-mount `~/.profile` ke dalam container). ## Live Deepgram (transkripsi audio) @@ -733,9 +734,9 @@ Jika Anda ingin mengandalkan env key (misalnya yang diekspor di `~/.profile`), j - Pengujian: `extensions/comfy/comfy.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts` - Cakupan: - - Menjalankan path image, video, dan `music_generate` comfy yang dibundel - - Melewati setiap kapabilitas kecuali `models.providers.comfy.` dikonfigurasi - - Berguna setelah mengubah pengiriman workflow comfy, polling, unduhan, atau pendaftaran plugin + - Menjalankan path image, video, dan `music_generate` Comfy yang dibundel + - Melewati tiap kapabilitas kecuali `models.providers.comfy.` dikonfigurasi + - Berguna setelah mengubah pengiriman workflow Comfy, polling, download, atau registrasi plugin ## Live pembuatan image @@ -743,11 +744,11 @@ Jika Anda ingin mengandalkan env key (misalnya yang diekspor di `~/.profile`), j - Perintah: `pnpm test:live src/image-generation/runtime.live.test.ts` - Harness: `pnpm test:live:media image` - Cakupan: - - Menginventarisasi setiap plugin provider pembuatan image yang terdaftar - - Memuat env var provider yang hilang dari shell login Anda (`~/.profile`) sebelum probing - - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga kunci pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell asli + - Mengenumerasi setiap plugin provider pembuatan image yang terdaftar + - Memuat env var provider yang belum ada dari shell login Anda (`~/.profile`) sebelum probing + - Menggunakan API key live/env lebih dulu daripada profil auth yang tersimpan secara default, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell nyata - Melewati provider tanpa auth/profil/model yang dapat digunakan - - Menjalankan varian pembuatan image stok melalui kapabilitas runtime bersama: + - Menjalankan varian pembuatan image bawaan melalui kapabilitas runtime bersama: - `google:flash-generate` - `google:pro-generate` - `google:pro-edit` @@ -771,15 +772,15 @@ Jika Anda ingin mengandalkan env key (misalnya yang diekspor di `~/.profile`), j - Menjalankan path provider pembuatan musik bundel bersama - Saat ini mencakup Google dan MiniMax - Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing - - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga kunci pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell asli + - Menggunakan API key live/env lebih dulu daripada profil auth yang tersimpan secara default, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell nyata - Melewati provider tanpa auth/profil/model yang dapat digunakan - Menjalankan kedua mode runtime yang dideklarasikan saat tersedia: - - `generate` dengan input prompt saja + - `generate` dengan input hanya prompt - `edit` saat provider mendeklarasikan `capabilities.edit.enabled` - - Cakupan jalur bersama saat ini: + - Cakupan lane bersama saat ini: - `google`: `generate`, `edit` - `minimax`: `generate` - - `comfy`: file live Comfy terpisah, bukan sapuan bersama ini + - `comfy`: file live Comfy terpisah, bukan penyapuan bersama ini - Penyempitan opsional: - `OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"` - `OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"` @@ -793,31 +794,31 @@ Jika Anda ingin mengandalkan env key (misalnya yang diekspor di `~/.profile`), j - Harness: `pnpm test:live:media video` - Cakupan: - Menjalankan path provider pembuatan video bundel bersama - - Secara default menggunakan path smoke yang aman untuk rilis: provider non-FAL, satu permintaan text-to-video per provider, prompt lobster satu detik, dan batas operasi per provider dari `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` secara default) + - Default ke path smoke yang aman untuk rilis: provider non-FAL, satu permintaan text-to-video per provider, prompt lobster satu detik, dan batas operasi per provider dari `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` secara default) - Melewati FAL secara default karena latensi antrean di sisi provider dapat mendominasi waktu rilis; berikan `--video-providers fal` atau `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"` untuk menjalankannya secara eksplisit - Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing - - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga kunci pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell asli + - Menggunakan API key live/env lebih dulu daripada profil auth yang tersimpan secara default, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell nyata - Melewati provider tanpa auth/profil/model yang dapat digunakan - - Secara default hanya menjalankan `generate` - - Set `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` untuk juga menjalankan mode transform yang dideklarasikan saat tersedia: - - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input image lokal berbasis buffer dalam sapuan bersama - - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam sapuan bersama - - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: + - Hanya menjalankan `generate` secara default + - Setel `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` untuk juga menjalankan mode transform yang dideklarasikan saat tersedia: + - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input image lokal berbasis buffer dalam penyapuan bersama + - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam penyapuan bersama + - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam penyapuan bersama: - `vydra` karena `veo3` bundel hanya mendukung teks dan `kling` bundel memerlukan URL image jarak jauh - Cakupan Vydra khusus provider: - `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts` - - file tersebut menjalankan `veo3` text-to-video plus jalur `kling` yang secara default menggunakan fixture URL image jarak jauh + - file tersebut menjalankan `veo3` text-to-video ditambah lane `kling` yang secara default menggunakan fixture URL image jarak jauh - Cakupan live `videoToVideo` saat ini: - - `runway` hanya saat model yang dipilih adalah `runway/gen4_aleph` - - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: + - hanya `runway` saat model yang dipilih adalah `runway/gen4_aleph` + - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam penyapuan bersama: - `alibaba`, `qwen`, `xai` karena path tersebut saat ini memerlukan URL referensi `http(s)` / MP4 jarak jauh - - `google` karena jalur Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan path tersebut tidak diterima dalam sapuan bersama - - `openai` karena jalur bersama saat ini tidak memiliki jaminan akses inpaint/remix video khusus org + - `google` karena lane Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan path itu tidak diterima dalam penyapuan bersama + - `openai` karena lane bersama saat ini tidak memiliki jaminan akses video inpaint/remix khusus org - Penyempitan opsional: - `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="google,openai,runway"` - `OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"` - - `OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""` untuk menyertakan setiap provider dalam sapuan default, termasuk FAL - - `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000` untuk mengurangi batas operasi setiap provider demi smoke run yang agresif + - `OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""` untuk menyertakan setiap provider dalam penyapuan default, termasuk FAL + - `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000` untuk mengurangi batas operasi tiap provider untuk run smoke yang agresif - Perilaku auth opsional: - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override yang hanya berasal dari env @@ -826,79 +827,79 @@ Jika Anda ingin mengandalkan env key (misalnya yang diekspor di `~/.profile`), j - Perintah: `pnpm test:live:media` - Tujuan: - Menjalankan suite live image, musik, dan video bersama melalui satu entrypoint native repo - - Memuat otomatis env var provider yang hilang dari `~/.profile` - - Secara otomatis mempersempit setiap suite ke provider yang saat ini memiliki auth yang dapat digunakan secara default - - Menggunakan kembali `scripts/test-live.mjs`, sehingga perilaku Heartbeat dan mode senyap tetap konsisten + - Memuat otomatis env var provider yang belum ada dari `~/.profile` + - Mempersempit otomatis tiap suite ke provider yang saat ini memiliki auth yang dapat digunakan secara default + - Menggunakan ulang `scripts/test-live.mjs`, sehingga perilaku Heartbeat dan mode senyap tetap konsisten - Contoh: - `pnpm test:live:media` - `pnpm test:live:media image video --providers openai,google,minimax` - `pnpm test:live:media video --video-providers openai,runway --all-providers` - `pnpm test:live:media music --quiet` -## Runner Docker (opsional untuk pemeriksaan "berfungsi di Linux") +## Runner Docker (opsional "berfungsi di Linux" checks) Runner Docker ini terbagi menjadi dua kelompok: -- Runner model live: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config lokal dan workspace Anda (serta mengambil sumber `~/.profile` jika di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. -- Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar sapuan Docker penuh tetap praktis: - `test:docker:live-models` secara default menetapkan `OPENCLAW_LIVE_MAX_MODELS=12`, dan - `test:docker:live-gateway` secara default menetapkan `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, +- Runner model live: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config dan workspace lokal Anda (serta mengambil source `~/.profile` jika di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. +- Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar penyapuan Docker penuh tetap praktis: + `test:docker:live-models` default ke `OPENCLAW_LIVE_MAX_MODELS=12`, dan + `test:docker:live-gateway` default ke `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`, `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`, dan `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override env var tersebut saat Anda secara eksplisit menginginkan pemindaian menyeluruh yang lebih besar. -- `test:docker:all` membangun image live Docker satu kali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua jalur live Docker. +- `test:docker:all` membangun image Docker live sekali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane Docker live. - Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` menyalakan satu atau lebih container nyata dan memverifikasi path integrasi tingkat lebih tinggi. -Runner Docker model live juga melakukan bind-mount hanya pada home auth CLI yang diperlukan (atau semua yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run sehingga OAuth CLI eksternal dapat menyegarkan token tanpa memodifikasi penyimpanan auth host: +Runner Docker model live juga bind-mount hanya home auth CLI yang diperlukan (atau semuanya yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run sehingga OAuth CLI eksternal dapat menyegarkan token tanpa mengubah auth store host: - Model langsung: `pnpm test:docker:live-models` (skrip: `scripts/test-live-models-docker.sh`) -- ACP bind smoke: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`) +- Smoke ACP bind: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`) - Smoke backend CLI: `pnpm test:docker:live-cli-backend` (skrip: `scripts/test-live-cli-backend-docker.sh`) - Smoke harness app-server Codex: `pnpm test:docker:live-codex-harness` (skrip: `scripts/test-live-codex-harness-docker.sh`) - Gateway + agen dev: `pnpm test:docker:live-gateway` (skrip: `scripts/test-live-gateway-models-docker.sh`) - Smoke live Open WebUI: `pnpm test:docker:openwebui` (skrip: `scripts/e2e/openwebui-docker.sh`) - Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (skrip: `scripts/e2e/onboard-docker.sh`) -- Jaringan gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) -- Bridge channel MCP (Gateway ber-seed + bridge stdio + smoke frame notifikasi Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) -- Plugin (smoke install + alias `/plugin` + semantik restart bundel Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) +- Networking gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) +- Bridge channel MCP (Gateway ber-seed + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) +- Plugins (smoke install + alias `/plugin` + semantik restart bundel Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) -Runner Docker model live juga melakukan bind-mount checkout saat ini sebagai read-only dan -menyiapkannya ke workdir sementara di dalam container. Ini menjaga image runtime +Runner Docker model live juga bind-mount checkout saat ini sebagai read-only dan +men-stage-nya ke workdir sementara di dalam container. Ini menjaga image runtime tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang persis. -Langkah penyiapan melewati cache lokal besar dan output build aplikasi seperti -`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, dan direktori output `.build` atau -Gradle lokal aplikasi sehingga run live Docker tidak menghabiskan waktu ber menit-menit menyalin +Langkah staging ini melewati cache lokal besar dan output build aplikasi seperti +`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, dan direktori output `.build` lokal aplikasi atau +Gradle sehingga run live Docker tidak menghabiskan beberapa menit untuk menyalin artefak khusus mesin. -Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` sehingga probe live gateway tidak memulai -worker channel Telegram/Discord/dll. yang nyata di dalam container. -`test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan juga -`OPENCLAW_LIVE_GATEWAY_*` saat Anda perlu mempersempit atau mengecualikan cakupan live -gateway dari jalur Docker tersebut. -`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: runner ini memulai +Runner ini juga menyetel `OPENCLAW_SKIP_CHANNELS=1` sehingga probe live gateway tidak memulai +worker channel nyata Telegram/Discord/dll. di dalam container. +`test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan +`OPENCLAW_LIVE_GATEWAY_*` juga saat Anda perlu mempersempit atau mengecualikan cakupan live gateway +dari lane Docker tersebut. +`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ini memulai container gateway OpenClaw dengan endpoint HTTP yang kompatibel dengan OpenAI diaktifkan, memulai container Open WebUI yang dipin terhadap gateway tersebut, masuk melalui Open WebUI, memverifikasi `/api/models` mengekspos `openclaw/default`, lalu mengirim permintaan chat nyata melalui proxy `/api/chat/completions` milik Open WebUI. Run pertama bisa terasa lebih lambat karena Docker mungkin perlu menarik -image Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start miliknya sendiri. -Jalur ini mengharapkan kunci model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` -(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam run yang di-Docker-kan. +image Open WebUI dan Open WebUI mungkin perlu menyelesaikan cold-start setup-nya sendiri. +Lane ini mengharapkan key model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` +(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam run berbasis Docker. Run yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": "openclaw/default", ... }`. `test:docker:mcp-channels` sengaja dibuat deterministik dan tidak memerlukan -akun Telegram, Discord, atau iMessage nyata. Runner ini menyalakan Gateway ber-seed -container, memulai container kedua yang menjalankan `openclaw mcp serve`, lalu -memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, +akun Telegram, Discord, atau iMessage nyata. Ini menyalakan container Gateway +ber-seed, memulai container kedua yang menjalankan `openclaw mcp serve`, lalu +memverifikasi discovery percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, perilaku antrean event live, routing pengiriman keluar, dan notifikasi channel + -izin bergaya Claude melalui bridge MCP stdio yang nyata. Pemeriksaan notifikasi -memeriksa frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang -benar-benar dipancarkan oleh bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. +izin gaya Claude melalui bridge MCP stdio yang nyata. Pemeriksaan notifikasi +menginspeksi frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang +benar-benar dipancarkan oleh bridge, bukan hanya apa yang kebetulan ditampilkan oleh SDK client tertentu. -Smoke thread bahasa alami ACP manual (bukan CI): +Smoke thread plain-language ACP manual (bukan CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- Simpan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin akan diperlukan lagi untuk validasi routing thread ACP, jadi jangan hapus. +- Simpan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin diperlukan lagi untuk validasi routing thread ACP, jadi jangan hapus. Env var yang berguna: @@ -910,52 +911,52 @@ Env var yang berguna: - Direktori/file auth CLI eksternal di bawah `$HOME` di-mount read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum pengujian dimulai - Direktori default: `.minimax` - File default: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` - - Run provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang disimpulkan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - Override secara manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` + - Run provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang diinferensikan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` - `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit run - `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter provider di dalam container -- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan kembali image `openclaw:local-live` yang sudah ada untuk rerun yang tidak memerlukan rebuild +- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan ulang image `openclaw:local-live` yang sudah ada untuk rerun yang tidak memerlukan rebuild - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memastikan kredensial berasal dari profile store (bukan env) -- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos gateway untuk smoke Open WebUI +- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh gateway untuk smoke Open WebUI - `OPENCLAW_OPENWEBUI_PROMPT=...` untuk meng-override prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI - `OPENWEBUI_IMAGE=...` untuk meng-override tag image Open WebUI yang dipin -## Kesehatan dokumentasi +## Pemeriksaan kewarasan docs -Jalankan pemeriksaan dokumen setelah mengedit dokumen: `pnpm check:docs`. +Jalankan pemeriksaan docs setelah pengeditan docs: `pnpm check:docs`. Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading di dalam halaman: `pnpm docs:check-links:anchors`. ## Regresi offline (aman untuk CI) Ini adalah regresi “pipeline nyata” tanpa provider nyata: -- Tool calling gateway (mock OpenAI, gateway + loop agen nyata): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- Pemanggilan tool gateway (mock OpenAI, gateway + loop agen nyata): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Wizard gateway (WS `wizard.start`/`wizard.next`, menulis config + auth ditegakkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") ## Evaluasi keandalan agen (Skills) -Kami sudah memiliki beberapa pengujian aman-CI yang berperilaku seperti “evaluasi keandalan agen”: +Kami sudah memiliki beberapa pengujian aman-untuk-CI yang berperilaku seperti “evaluasi keandalan agen”: - Mock tool-calling melalui gateway + loop agen nyata (`src/gateway/gateway.test.ts`). - Alur wizard end-to-end yang memvalidasi wiring sesi dan efek config (`src/gateway/gateway.test.ts`). -Yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): +Apa yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): -- **Pengambilan keputusan:** saat Skills tercantum dalam prompt, apakah agen memilih Skill yang tepat (atau menghindari yang tidak relevan)? -- **Kepatuhan:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? -- **Kontrak alur kerja:** skenario multi-giliran yang memverifikasi urutan tool, carryover riwayat sesi, dan batas sandbox. +- **Decisioning:** saat Skills dicantumkan dalam prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)? +- **Compliance:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? +- **Kontrak alur kerja:** skenario multi-turn yang mengasert urutan tool, carryover riwayat sesi, dan batas sandbox. Evaluasi mendatang sebaiknya tetap deterministik terlebih dahulu: -- Runner skenario yang menggunakan provider mock untuk memverifikasi pemanggilan tool + urutan, pembacaan file skill, dan wiring sesi. +- Runner skenario yang menggunakan provider mock untuk mengasert pemanggilan tool + urutannya, pembacaan file skill, dan wiring sesi. - Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, prompt injection). -- Evaluasi live opsional (opt-in, digating oleh env) hanya setelah suite aman-CI tersedia. +- Evaluasi live opsional (opt-in, di-gate env) hanya setelah suite yang aman untuk CI tersedia. ## Pengujian kontrak (bentuk plugin dan channel) Pengujian kontrak memverifikasi bahwa setiap plugin dan channel yang terdaftar sesuai dengan -kontrak antarmukanya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan serangkaian -verifikasi bentuk dan perilaku. Jalur unit default `pnpm test` dengan sengaja +kontrak antarmukanya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan suite +asersi bentuk dan perilaku. Lane unit `pnpm test` default dengan sengaja melewati file seam bersama dan smoke ini; jalankan perintah kontrak secara eksplisit saat Anda menyentuh surface channel atau provider bersama. @@ -969,7 +970,7 @@ saat Anda menyentuh surface channel atau provider bersama. Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: -- **plugin** - Bentuk plugin dasar (id, nama, kapabilitas) +- **plugin** - Bentuk plugin dasar (id, name, capabilities) - **setup** - Kontrak wizard setup - **session-binding** - Perilaku pengikatan sesi - **outbound-payload** - Struktur payload pesan @@ -984,7 +985,7 @@ Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: Terletak di `src/plugins/contracts/*.contract.test.ts`. - **status** - Probe status channel -- **registry** - Bentuk registri plugin +- **registry** - Bentuk registry plugin ### Kontrak provider @@ -1003,19 +1004,19 @@ Terletak di `src/plugins/contracts/*.contract.test.ts`: - Setelah mengubah ekspor atau subpath plugin-sdk - Setelah menambahkan atau memodifikasi plugin channel atau provider -- Setelah merombak pendaftaran atau penemuan plugin +- Setelah melakukan refactor registrasi atau discovery plugin Pengujian kontrak berjalan di CI dan tidak memerlukan API key nyata. ## Menambahkan regresi (panduan) -Saat Anda memperbaiki masalah provider/model yang ditemukan secara live: +Saat Anda memperbaiki masalah provider/model yang ditemukan di live: -- Tambahkan regresi aman-CI jika memungkinkan (provider mock/stub, atau tangkap transformasi bentuk permintaan yang persis) +- Tambahkan regresi yang aman untuk CI jika memungkinkan (provider mock/stub, atau tangkap transformasi bentuk request yang tepat) - Jika masalah tersebut secara inheren hanya live (rate limit, kebijakan auth), pertahankan pengujian live tetap sempit dan opt-in melalui env var -- Pilih lapisan terkecil yang menangkap bug: - - bug konversi/replay permintaan provider → pengujian model langsung - - bug pipeline sesi/riwayat/tool gateway → gateway live smoke atau pengujian mock gateway aman-CI +- Utamakan menargetkan lapisan terkecil yang menangkap bug: + - bug konversi/replay request provider → pengujian model langsung + - bug pipeline sesi/riwayat/tool gateway → gateway live smoke atau pengujian mock gateway yang aman untuk CI - Guardrail traversal SecretRef: - - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registri (`listSecretTargetRegistryEntries()`), lalu memverifikasi bahwa exec id segmen traversal ditolak. - - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian tersebut. Pengujian ini sengaja gagal pada target id yang tidak diklasifikasikan agar kelas baru tidak dapat dilewati secara diam-diam. + - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registry (`listSecretTargetRegistryEntries()`), lalu memastikan traversal-segment exec ID ditolak. + - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian tersebut. Pengujian ini sengaja gagal pada target ID yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam. diff --git a/docs/id/help/troubleshooting.md b/docs/id/help/troubleshooting.md index 68176ac92..22561f064 100644 --- a/docs/id/help/troubleshooting.md +++ b/docs/id/help/troubleshooting.md @@ -1,14 +1,14 @@ --- read_when: - - OpenClaw tidak berfungsi dan Anda memerlukan jalur tercepat menuju perbaikan - - Anda ingin alur triase sebelum mendalami runbook yang lebih mendalam -summary: Pusat pemecahan masalah berbasis gejala terlebih dahulu untuk OpenClaw + - OpenClaw tidak berfungsi dan Anda membutuhkan jalur tercepat menuju perbaikan + - Anda menginginkan alur triase sebelum masuk ke runbook mendalam +summary: Hub pemecahan masalah berbasis gejala untuk OpenClaw title: Pemecahan Masalah Umum x-i18n: - generated_at: "2026-04-11T02:45:14Z" + generated_at: "2026-04-20T09:28:16Z" model: gpt-5.4 provider: openai - source_hash: 16b38920dbfdc8d4a79bbb5d6fab2c67c9f218a97c36bb4695310d7db9c4614a + source_hash: cc5d8c9f804084985c672c5a003ce866e8142ab99fe81abb7a0d38e22aea4b88 source_path: help/troubleshooting.md workflow: 15 --- @@ -33,47 +33,47 @@ openclaw logs --follow Output yang baik dalam satu baris: -- `openclaw status` → menampilkan saluran yang dikonfigurasi dan tidak ada error auth yang jelas. +- `openclaw status` → menampilkan channel yang dikonfigurasi dan tidak ada error auth yang jelas. - `openclaw status --all` → laporan lengkap tersedia dan dapat dibagikan. -- `openclaw gateway probe` → target gateway yang diharapkan dapat dijangkau (`Reachable: yes`). `RPC: limited - missing scope: operator.read` adalah diagnostik yang terdegradasi, bukan kegagalan koneksi. -- `openclaw gateway status` → `Runtime: running` dan `RPC probe: ok`. -- `openclaw doctor` → tidak ada error config/layanan yang memblokir. +- `openclaw gateway probe` → target gateway yang diharapkan dapat dijangkau (`Reachable: yes`). `Capability: ...` memberi tahu tingkat auth apa yang dapat dibuktikan probe, dan `Read probe: limited - missing scope: operator.read` adalah diagnostik yang menurun, bukan kegagalan koneksi. +- `openclaw gateway status` → `Runtime: running`, `Connectivity probe: ok`, dan baris `Capability: ...` yang masuk akal. Gunakan `--require-rpc` jika Anda juga memerlukan bukti RPC cakupan baca. +- `openclaw doctor` → tidak ada error konfigurasi/layanan yang memblokir. - `openclaw channels status --probe` → gateway yang dapat dijangkau mengembalikan - status transport live per akun plus hasil probe/audit seperti `works` atau `audit ok`; jika - gateway tidak dapat dijangkau, perintah akan fallback ke ringkasan berbasis config saja. -- `openclaw logs --follow` → aktivitas stabil, tidak ada error fatal yang berulang. + status transport per-akun secara live beserta hasil probe/audit seperti `works` atau `audit ok`; jika + gateway tidak dapat dijangkau, perintah kembali ke ringkasan berbasis konfigurasi saja. +- `openclaw logs --follow` → aktivitas stabil, tanpa error fatal yang berulang. -## 429 konteks panjang Anthropic +## Anthropic long context 429 Jika Anda melihat: `HTTP 429: rate_limit_error: Extra usage is required for long context requests`, buka [/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-context](/id/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-context). -## Backend lokal yang kompatibel dengan OpenAI bekerja langsung tetapi gagal di OpenClaw +## Backend lokal yang kompatibel OpenAI bekerja secara langsung tetapi gagal di OpenClaw Jika backend `/v1` lokal atau self-hosted Anda merespons probe langsung -`/v1/chat/completions` yang kecil tetapi gagal pada `openclaw infer model run` atau giliran -agen normal: +`/v1/chat/completions` kecil tetapi gagal pada `openclaw infer model run` atau turn +agent normal: 1. Jika error menyebut `messages[].content` mengharapkan string, setel `models.providers..models[].compat.requiresStringContent: true`. -2. Jika backend masih gagal hanya pada giliran agen OpenClaw, setel +2. Jika backend masih gagal hanya pada turn agent OpenClaw, setel `models.providers..models[].compat.supportsTools: false` lalu coba lagi. -3. Jika panggilan langsung kecil masih berfungsi tetapi prompt OpenClaw yang lebih besar membuat - backend crash, anggap sisa masalah sebagai keterbatasan model/server upstream dan +3. Jika panggilan langsung yang kecil tetap bekerja tetapi prompt OpenClaw yang lebih besar membuat + backend crash, anggap masalah yang tersisa sebagai keterbatasan model/server upstream dan lanjutkan ke runbook mendalam: [/gateway/troubleshooting#local-openai-compatible-backend-passes-direct-probes-but-agent-runs-fail](/id/gateway/troubleshooting#local-openai-compatible-backend-passes-direct-probes-but-agent-runs-fail) -## Instal plugin gagal karena ekstensi openclaw tidak ada +## Instalasi Plugin gagal dengan ekstensi openclaw yang hilang -Jika instalasi gagal dengan `package.json missing openclaw.extensions`, paket plugin -menggunakan bentuk lama yang tidak lagi diterima OpenClaw. +Jika instalasi gagal dengan `package.json missing openclaw.extensions`, paket Plugin +menggunakan bentuk lama yang tidak lagi diterima oleh OpenClaw. -Perbaiki di paket plugin: +Perbaiki di paket Plugin: 1. Tambahkan `openclaw.extensions` ke `package.json`. 2. Arahkan entri ke file runtime hasil build (biasanya `./dist/index.js`). -3. Publikasikan ulang plugin lalu jalankan `openclaw plugins install ` lagi. +3. Publikasikan ulang Plugin lalu jalankan `openclaw plugins install ` lagi. Contoh: @@ -87,7 +87,7 @@ Contoh: } ``` -Referensi: [Arsitektur plugin](/id/plugins/architecture) +Referensi: [Arsitektur Plugin](/id/plugins/architecture) ## Pohon keputusan @@ -95,19 +95,19 @@ Referensi: [Arsitektur plugin](/id/plugins/architecture) flowchart TD A[OpenClaw tidak berfungsi] --> B{Apa yang pertama kali rusak} B --> C[Tidak ada balasan] - B --> D[Dashboard atau UI Kontrol tidak dapat terhubung] - B --> E[Gateway tidak dapat dimulai atau layanan tidak berjalan] - B --> F[Saluran terhubung tetapi pesan tidak mengalir] - B --> G[Cron atau heartbeat tidak berjalan atau tidak terkirim] - B --> H[Node sudah dipasangkan tetapi exec layar kanvas kamera gagal] - B --> I[Alat browser gagal] + B --> D[Dashboard atau Control UI tidak dapat terhubung] + B --> E[Gateway tidak dapat mulai atau layanan tidak berjalan] + B --> F[Channel terhubung tetapi pesan tidak mengalir] + B --> G[Cron atau Heartbeat tidak berjalan atau tidak terkirim] + B --> H[Node sudah dipasangkan tetapi exec layar canvas kamera gagal] + B --> I[Tool browser gagal] C --> C1[/Bagian tidak ada balasan/] - D --> D1[/Bagian UI Kontrol/] + D --> D1[/Bagian Control UI/] E --> E1[/Bagian Gateway/] - F --> F1[/Bagian alur saluran/] - G --> G1[/Bagian otomasi/] - H --> H1[/Bagian alat node/] + F --> F1[/Bagian alur channel/] + G --> G1[/Bagian otomatisasi/] + H --> H1[/Bagian tool Node/] I --> I1[/Bagian browser/] ``` @@ -121,18 +121,19 @@ flowchart TD openclaw logs --follow ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - `Runtime: running` - - `RPC probe: ok` - - Saluran Anda menunjukkan transport terhubung dan, jika didukung, `works` atau `audit ok` di `channels status --probe` - - Pengirim tampak disetujui (atau kebijakan DM terbuka/allowlist) + - `Connectivity probe: ok` + - `Capability: read-only`, `write-capable`, atau `admin-capable` + - Channel Anda menunjukkan transport terhubung dan, jika didukung, `works` atau `audit ok` di `channels status --probe` + - Pengirim terlihat disetujui (atau kebijakan DM terbuka/allowlist) - Tanda log yang umum: + Signature log umum: - - `drop guild message (mention required` → gerbang mention memblokir pesan di Discord. - - `pairing request` → pengirim belum disetujui dan menunggu persetujuan pairing DM. - - `blocked` / `allowlist` di log saluran → pengirim, room, atau grup difilter. + - `drop guild message (mention required` → gating mention memblokir pesan di Discord. + - `pairing request` → pengirim belum disetujui dan sedang menunggu persetujuan pairing DM. + - `blocked` / `allowlist` di log channel → pengirim, room, atau grup difilter. Halaman mendalam: @@ -142,7 +143,7 @@ flowchart TD - + ```bash openclaw status openclaw gateway status @@ -151,24 +152,28 @@ flowchart TD openclaw channels status --probe ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - `Dashboard: http://...` ditampilkan di `openclaw gateway status` - - `RPC probe: ok` + - `Connectivity probe: ok` + - `Capability: read-only`, `write-capable`, atau `admin-capable` - Tidak ada loop auth di log - Tanda log yang umum: + Signature log umum: - - `device identity required` → konteks HTTP/non-aman tidak dapat menyelesaikan auth perangkat. - - `origin not allowed` → `Origin` browser tidak diizinkan untuk - target gateway UI Kontrol. - - `AUTH_TOKEN_MISMATCH` dengan petunjuk percobaan ulang (`canRetryWithDeviceToken=true`) → satu percobaan ulang token perangkat tepercaya dapat terjadi secara otomatis. - - Percobaan ulang token cache itu menggunakan kembali set scope cache yang disimpan bersama token perangkat yang dipasangkan. Pemanggil `deviceToken` eksplisit / `scopes` eksplisit tetap memakai set scope yang diminta. - - Pada jalur UI Kontrol Tailscale Serve async, upaya gagal untuk + - `device identity required` → HTTP/konteks non-aman tidak dapat menyelesaikan auth perangkat. + - `origin not allowed` → browser `Origin` tidak diizinkan untuk target gateway + Control UI. + - `AUTH_TOKEN_MISMATCH` dengan petunjuk retry (`canRetryWithDeviceToken=true`) → satu retry device-token tepercaya dapat terjadi secara otomatis. + - Retry token cache itu menggunakan kembali kumpulan scope cache yang disimpan bersama + token perangkat yang dipasangkan. Pemanggil `deviceToken` eksplisit / `scopes` eksplisit mempertahankan + kumpulan scope yang mereka minta. + - Pada jalur async Tailscale Serve Control UI, upaya gagal untuk `{scope, ip}` yang sama diserialkan sebelum limiter mencatat kegagalan, sehingga - percobaan ulang buruk kedua yang bersamaan sudah bisa menampilkan `retry later`. - - `too many failed authentication attempts (retry later)` dari origin browser localhost → kegagalan berulang dari `Origin` yang sama untuk sementara dikunci; origin localhost lain memakai bucket terpisah. - - `repeated unauthorized` setelah percobaan ulang itu → token/password salah, mode auth tidak cocok, atau token perangkat pasangan yang sudah usang. + retry buruk kedua yang bersamaan sudah bisa menampilkan `retry later`. + - `too many failed authentication attempts (retry later)` dari origin browser localhost + → kegagalan berulang dari `Origin` yang sama dikunci sementara; origin localhost lain menggunakan bucket terpisah. + - `unauthorized` berulang setelah retry itu → token/password salah, mode auth tidak cocok, atau token perangkat yang dipasangkan sudah usang. - `gateway connect failed:` → UI menargetkan URL/port yang salah atau gateway tidak dapat dijangkau. Halaman mendalam: @@ -179,7 +184,7 @@ flowchart TD - + ```bash openclaw status openclaw gateway status @@ -188,17 +193,18 @@ flowchart TD openclaw channels status --probe ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - `Service: ... (loaded)` - `Runtime: running` - - `RPC probe: ok` + - `Connectivity probe: ok` + - `Capability: read-only`, `write-capable`, atau `admin-capable` - Tanda log yang umum: + Signature log umum: - - `Gateway start blocked: set gateway.mode=local` atau `existing config is missing gateway.mode` → mode gateway adalah remote, atau file config tidak memiliki penanda local-mode dan harus diperbaiki. + - `Gateway start blocked: set gateway.mode=local` atau `existing config is missing gateway.mode` → mode gateway adalah remote, atau file konfigurasi tidak memiliki stamp mode lokal dan harus diperbaiki. - `refusing to bind gateway ... without auth` → bind non-loopback tanpa jalur auth gateway yang valid (token/password, atau trusted-proxy jika dikonfigurasi). - - `another gateway instance is already listening` atau `EADDRINUSE` → port sudah dipakai. + - `another gateway instance is already listening` atau `EADDRINUSE` → port sudah digunakan. Halaman mendalam: @@ -208,7 +214,7 @@ flowchart TD - + ```bash openclaw status openclaw gateway status @@ -217,17 +223,17 @@ flowchart TD openclaw channels status --probe ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - - Transport saluran terhubung. + - Transport channel terhubung. - Pemeriksaan pairing/allowlist lolos. - Mention terdeteksi jika diwajibkan. - Tanda log yang umum: + Signature log umum: - - `mention required` → gerbang mention memblokir pemrosesan grup. + - `mention required` → gating mention grup memblokir pemrosesan. - `pairing` / `pending` → pengirim DM belum disetujui. - - `not_in_channel`, `missing_scope`, `Forbidden`, `401/403` → masalah token izin saluran. + - `not_in_channel`, `missing_scope`, `Forbidden`, `401/403` → masalah token izin channel. Halaman mendalam: @@ -236,7 +242,7 @@ flowchart TD - + ```bash openclaw status openclaw gateway status @@ -246,21 +252,21 @@ flowchart TD openclaw logs --follow ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - `cron.status` menunjukkan aktif dengan wake berikutnya. - `cron runs` menunjukkan entri `ok` terbaru. - Heartbeat aktif dan tidak berada di luar jam aktif. - Tanda log yang umum: + Signature log umum: - - `cron: scheduler disabled; jobs will not run automatically` → cron dinonaktifkan. + - `cron: scheduler disabled; jobs will not run automatically` → Cron dinonaktifkan. - `heartbeat skipped` dengan `reason=quiet-hours` → di luar jam aktif yang dikonfigurasi. - - `heartbeat skipped` dengan `reason=empty-heartbeat-file` → `HEARTBEAT.md` ada tetapi hanya berisi scaffold kosong/header saja. + - `heartbeat skipped` dengan `reason=empty-heartbeat-file` → `HEARTBEAT.md` ada tetapi hanya berisi scaffolding kosong/header-only. - `heartbeat skipped` dengan `reason=no-tasks-due` → mode tugas `HEARTBEAT.md` aktif tetapi belum ada interval tugas yang jatuh tempo. - `heartbeat skipped` dengan `reason=alerts-disabled` → semua visibilitas heartbeat dinonaktifkan (`showOk`, `showAlerts`, dan `useIndicator` semuanya mati). - - `requests-in-flight` → lajur utama sibuk; wake heartbeat ditunda. - - `unknown accountId` → account target pengiriman heartbeat tidak ada. + - `requests-in-flight` → lane utama sibuk; wake heartbeat ditunda. + - `unknown accountId` → target pengiriman heartbeat account tidak ada. Halaman mendalam: @@ -270,7 +276,7 @@ flowchart TD - + ```bash openclaw status openclaw gateway status @@ -279,17 +285,17 @@ flowchart TD openclaw logs --follow ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - - Node tercantum sebagai terhubung dan sudah dipasangkan untuk peran `node`. - - Kapabilitas tersedia untuk perintah yang Anda panggil. - - Status izin diberikan untuk alat tersebut. + - Node terdaftar sebagai terhubung dan dipasangkan untuk peran `node`. + - Capability ada untuk perintah yang Anda jalankan. + - Status izin diberikan untuk tool tersebut. - Tanda log yang umum: + Signature log umum: - `NODE_BACKGROUND_UNAVAILABLE` → bawa aplikasi node ke foreground. - `*_PERMISSION_REQUIRED` → izin OS ditolak/tidak ada. - - `SYSTEM_RUN_DENIED: approval required` → persetujuan exec sedang menunggu. + - `SYSTEM_RUN_DENIED: approval required` → persetujuan exec masih tertunda. - `SYSTEM_RUN_DENIED: allowlist miss` → perintah tidak ada di allowlist exec. Halaman mendalam: @@ -308,14 +314,14 @@ flowchart TD openclaw gateway restart ``` - Yang berubah: + Apa yang berubah: - Jika `tools.exec.host` tidak disetel, default-nya adalah `auto`. - - `host=auto` di-resolve menjadi `sandbox` saat runtime sandbox aktif, dan `gateway` jika tidak. - - `host=auto` hanya untuk perutean; perilaku tanpa prompt "YOLO" berasal dari `security=full` plus `ask=off` pada gateway/node. - - Pada `gateway` dan `node`, `tools.exec.security` yang tidak disetel default-nya `full`. - - `tools.exec.ask` yang tidak disetel default-nya `off`. - - Hasilnya: jika Anda melihat persetujuan, beberapa kebijakan lokal-host atau per-sesi telah memperketat exec dari default saat ini. + - `host=auto` akan di-resolve ke `sandbox` saat runtime sandbox aktif, dan ke `gateway` jika tidak. + - `host=auto` hanya untuk routing; perilaku "YOLO" tanpa prompt berasal dari `security=full` plus `ask=off` pada gateway/node. + - Pada `gateway` dan `node`, `tools.exec.security` yang tidak disetel default-nya adalah `full`. + - `tools.exec.ask` yang tidak disetel default-nya adalah `off`. + - Hasilnya: jika Anda melihat permintaan persetujuan, ada kebijakan lokal-host atau per-sesi yang memperketat exec dari default saat ini. Pulihkan perilaku tanpa persetujuan sesuai default saat ini: @@ -328,14 +334,14 @@ flowchart TD Alternatif yang lebih aman: - - Setel hanya `tools.exec.host=gateway` jika Anda hanya ingin perutean host yang stabil. - - Gunakan `security=allowlist` dengan `ask=on-miss` jika Anda ingin exec host tetapi tetap ingin peninjauan saat ada miss pada allowlist. - - Aktifkan mode sandbox jika Anda ingin `host=auto` di-resolve kembali ke `sandbox`. + - Setel hanya `tools.exec.host=gateway` jika Anda hanya menginginkan routing host yang stabil. + - Gunakan `security=allowlist` dengan `ask=on-miss` jika Anda menginginkan host exec tetapi tetap ingin peninjauan saat terjadi miss pada allowlist. + - Aktifkan mode sandbox jika Anda ingin `host=auto` kembali di-resolve ke `sandbox`. - Tanda log yang umum: + Signature log umum: - `Approval required.` → perintah sedang menunggu `/approve ...`. - - `SYSTEM_RUN_DENIED: approval required` → persetujuan exec host-node sedang menunggu. + - `SYSTEM_RUN_DENIED: approval required` → persetujuan exec host-node masih tertunda. - `exec host=sandbox requires a sandbox runtime for this session` → pemilihan sandbox implisit/eksplisit tetapi mode sandbox nonaktif. Halaman mendalam: @@ -346,7 +352,7 @@ flowchart TD - + ```bash openclaw status openclaw gateway status @@ -355,22 +361,22 @@ flowchart TD openclaw doctor ``` - Output yang baik terlihat seperti ini: + Output yang baik terlihat seperti: - Status browser menunjukkan `running: true` dan browser/profile yang dipilih. - - `openclaw` dimulai, atau `user` dapat melihat tab Chrome lokal. + - `openclaw` berhasil mulai, atau `user` dapat melihat tab Chrome lokal. - Tanda log yang umum: + Signature log umum: - - `unknown command "browser"` atau `unknown command 'browser'` → `plugins.allow` disetel dan tidak menyertakan `browser`. + - `unknown command "browser"` atau `unknown command 'browser'` → `plugins.allow` disetel dan tidak mencakup `browser`. - `Failed to start Chrome CDP on port` → peluncuran browser lokal gagal. - `browser.executablePath not found` → path biner yang dikonfigurasi salah. - `browser.cdpUrl must be http(s) or ws(s)` → URL CDP yang dikonfigurasi menggunakan skema yang tidak didukung. - `browser.cdpUrl has invalid port` → URL CDP yang dikonfigurasi memiliki port yang buruk atau di luar rentang. - - `No Chrome tabs found for profile="user"` → profile lampiran Chrome MCP tidak memiliki tab Chrome lokal yang terbuka. - - `Remote CDP for profile "" is not reachable` → endpoint CDP jarak jauh yang dikonfigurasi tidak dapat dijangkau dari host ini. + - `No Chrome tabs found for profile="user"` → profile attach Chrome MCP tidak memiliki tab Chrome lokal yang terbuka. + - `Remote CDP for profile "" is not reachable` → endpoint CDP remote yang dikonfigurasi tidak dapat dijangkau dari host ini. - `Browser attachOnly is enabled ... not reachable` atau `Browser attachOnly is enabled and CDP websocket ... is not reachable` → profile attach-only tidak memiliki target CDP live. - - override viewport / mode gelap / locale / offline yang usang pada profile attach-only atau CDP jarak jauh → jalankan `openclaw browser stop --browser-profile ` untuk menutup sesi kontrol aktif dan melepaskan state emulasi tanpa memulai ulang gateway. + - override viewport / dark-mode / locale / offline yang stale pada profile attach-only atau remote CDP → jalankan `openclaw browser stop --browser-profile ` untuk menutup sesi kontrol aktif dan melepaskan state emulasi tanpa me-restart gateway. Halaman mendalam: @@ -388,5 +394,5 @@ flowchart TD - [FAQ](/id/help/faq) — pertanyaan yang sering diajukan - [Pemecahan Masalah Gateway](/id/gateway/troubleshooting) — masalah khusus gateway - [Doctor](/id/gateway/doctor) — pemeriksaan kesehatan dan perbaikan otomatis -- [Pemecahan Masalah Saluran](/id/channels/troubleshooting) — masalah konektivitas saluran -- [Pemecahan Masalah Otomasi](/id/automation/cron-jobs#troubleshooting) — masalah cron dan heartbeat +- [Pemecahan Masalah Channel](/id/channels/troubleshooting) — masalah konektivitas channel +- [Pemecahan Masalah Otomatisasi](/id/automation/cron-jobs#troubleshooting) — masalah Cron dan Heartbeat diff --git a/docs/id/tools/browser.md b/docs/id/tools/browser.md index cae7a092c..c03525d5e 100644 --- a/docs/id/tools/browser.md +++ b/docs/id/tools/browser.md @@ -1,41 +1,41 @@ --- read_when: - - Menambahkan otomatisasi browser yang dikendalikan agen + - Menambahkan otomasi browser yang dikendalikan agen - Men-debug mengapa openclaw mengganggu Chrome Anda sendiri - - Menerapkan pengaturan browser + siklus hidup di aplikasi macOS -summary: Layanan kontrol browser terintegrasi + perintah aksi + - Menerapkan pengaturan dan siklus hidup browser di aplikasi macOS +summary: Layanan kontrol browser terintegrasi + perintah tindakan title: Browser (dikelola OpenClaw) x-i18n: - generated_at: "2026-04-14T09:14:20Z" + generated_at: "2026-04-20T09:28:17Z" model: gpt-5.4 provider: openai - source_hash: ae9ef725f544d4236d229f498c7187871c69bd18d31069b30a7e67fac53166a2 + source_hash: 3f7d37b34ba48dc7c38f8c2e77f8bb97af987eac6a874ebfc921f950fb59de4b source_path: tools/browser.md workflow: 15 --- # Browser (dikelola openclaw) -OpenClaw dapat menjalankan **profil Chrome/Brave/Edge/Chromium khusus** yang dikendalikan oleh agen. -Ini terisolasi dari browser pribadi Anda dan dikelola melalui layanan kontrol lokal kecil -di dalam Gateway (hanya loopback). +OpenClaw dapat menjalankan **profil Chrome/Brave/Edge/Chromium khusus** yang dikendalikan agen. +Profil ini terisolasi dari browser pribadi Anda dan dikelola melalui layanan kontrol +lokal kecil di dalam Gateway (hanya loopback). -Tampilan untuk pemula: +Tampilan pemula: -- Anggap ini sebagai **browser terpisah, khusus agen**. +- Anggap ini sebagai **browser terpisah yang hanya untuk agen**. - Profil `openclaw` **tidak** menyentuh profil browser pribadi Anda. - Agen dapat **membuka tab, membaca halaman, mengeklik, dan mengetik** di jalur yang aman. -- Profil bawaan `user` terhubung ke sesi Chrome nyata Anda yang sudah login melalui Chrome MCP. +- Profil bawaan `user` terhubung ke sesi Chrome Anda yang nyata dan sudah login melalui Chrome MCP. ## Yang Anda dapatkan - Profil browser terpisah bernama **openclaw** (aksen oranye secara default). -- Kontrol tab yang deterministik (daftar/buka/fokus/tutup). -- Aksi agen (klik/ketik/seret/pilih), snapshot, screenshot, PDF. +- Kontrol tab deterministik (daftar/buka/fokus/tutup). +- Tindakan agen (klik/ketik/seret/pilih), snapshot, screenshot, PDF. - Dukungan multi-profil opsional (`openclaw`, `work`, `remote`, ...). Browser ini **bukan** browser harian Anda. Ini adalah permukaan yang aman dan terisolasi untuk -otomatisasi dan verifikasi agen. +otomasi dan verifikasi agen. ## Mulai cepat @@ -46,17 +46,17 @@ openclaw browser --browser-profile openclaw open https://example.com openclaw browser --browser-profile openclaw snapshot ``` -Jika Anda mendapatkan “Browser dinonaktifkan”, aktifkan di konfigurasi (lihat di bawah) dan mulai ulang +Jika Anda mendapatkan “Browser dinonaktifkan”, aktifkan di config (lihat di bawah) dan restart Gateway. -Jika `openclaw browser` sama sekali tidak ada, atau agen mengatakan alat browser -tidak tersedia, langsung ke [Perintah atau alat browser tidak ada](/id/tools/browser#missing-browser-command-or-tool). +Jika `openclaw browser` benar-benar tidak ada, atau agen mengatakan tool browser +tidak tersedia, langsung ke [Perintah atau tool browser hilang](/id/tools/browser#missing-browser-command-or-tool). ## Kontrol Plugin -Alat `browser` default sekarang adalah Plugin bawaan yang dikirim dalam keadaan aktif +Tool `browser` default sekarang adalah Plugin bawaan yang dikirim dalam keadaan aktif secara default. Artinya Anda dapat menonaktifkan atau menggantinya tanpa menghapus sisa -sistem plugin OpenClaw: +sistem Plugin OpenClaw: ```json5 { @@ -71,32 +71,31 @@ sistem plugin OpenClaw: ``` Nonaktifkan Plugin bawaan sebelum memasang Plugin lain yang menyediakan -nama alat `browser` yang sama. Pengalaman browser default memerlukan keduanya: +nama tool `browser` yang sama. Pengalaman browser default memerlukan keduanya: - `plugins.entries.browser.enabled` tidak dinonaktifkan - `browser.enabled=true` Jika Anda hanya mematikan Plugin, CLI browser bawaan (`openclaw browser`), -metode gateway (`browser.request`), alat agen, dan layanan kontrol browser default -semuanya hilang bersama. Konfigurasi `browser.*` Anda tetap utuh agar dapat digunakan ulang oleh -Plugin pengganti. +metode gateway (`browser.request`), tool agen, dan layanan kontrol browser default +semuanya hilang sekaligus. Config `browser.*` Anda tetap utuh agar dapat digunakan kembali +oleh Plugin pengganti. -Plugin browser bawaan kini juga memiliki implementasi runtime browser. -Core hanya menyimpan helper Plugin SDK bersama serta re-export kompatibilitas untuk -jalur import internal lama. Dalam praktiknya, menghapus atau mengganti paket Plugin browser -akan menghapus rangkaian fitur browser alih-alih meninggalkan runtime kedua yang masih dimiliki -core. +Plugin browser bawaan sekarang juga memiliki implementasi runtime browser. +Core hanya menyimpan helper Plugin SDK bersama ditambah re-export kompatibilitas untuk +path import internal lama. Dalam praktiknya, menghapus atau mengganti paket Plugin browser +akan menghapus rangkaian fitur browser alih-alih menyisakan runtime kedua milik core di belakangnya. -Perubahan konfigurasi browser tetap memerlukan restart Gateway agar Plugin bawaan +Perubahan config browser tetap memerlukan restart Gateway agar Plugin bawaan dapat mendaftarkan ulang layanan browser-nya dengan pengaturan baru. -## Perintah atau alat browser tidak ada +## Perintah atau tool browser hilang Jika `openclaw browser` tiba-tiba menjadi perintah yang tidak dikenal setelah upgrade, atau -agen melaporkan bahwa alat browser hilang, penyebab paling umum adalah daftar -`plugins.allow` yang terlalu ketat dan tidak menyertakan `browser`. +agen melaporkan bahwa tool browser hilang, penyebab yang paling umum adalah +daftar `plugins.allow` yang ketat dan tidak menyertakan `browser`. -Contoh konfigurasi yang rusak: +Contoh config yang rusak: ```json5 { @@ -118,30 +117,30 @@ Perbaiki dengan menambahkan `browser` ke allowlist Plugin: Catatan penting: -- `browser.enabled=true` saja tidak cukup ketika `plugins.allow` disetel. -- `plugins.entries.browser.enabled=true` saja juga tidak cukup ketika `plugins.allow` disetel. -- `tools.alsoAllow: ["browser"]` **tidak** memuat Plugin browser bawaan. Itu hanya menyesuaikan kebijakan alat setelah Plugin sudah dimuat. -- Jika Anda tidak membutuhkan allowlist Plugin yang ketat, menghapus `plugins.allow` juga mengembalikan perilaku browser bawaan default. +- `browser.enabled=true` saja tidak cukup saat `plugins.allow` diatur. +- `plugins.entries.browser.enabled=true` saja juga tidak cukup saat `plugins.allow` diatur. +- `tools.alsoAllow: ["browser"]` **tidak** memuat Plugin browser bawaan. Itu hanya menyesuaikan kebijakan tool setelah Plugin sudah dimuat. +- Jika Anda tidak memerlukan allowlist Plugin yang ketat, menghapus `plugins.allow` juga akan memulihkan perilaku browser bawaan default. -Gejala umum: +Gejala yang umum: - `openclaw browser` adalah perintah yang tidak dikenal. - `browser.request` tidak ada. -- Agen melaporkan alat browser tidak tersedia atau hilang. +- Agen melaporkan tool browser tidak tersedia atau hilang. ## Profil: `openclaw` vs `user` - `openclaw`: browser terkelola dan terisolasi (tidak memerlukan ekstensi). -- `user`: profil attach Chrome MCP bawaan untuk sesi **Chrome asli Anda yang sudah login**. +- `user`: profil attach Chrome MCP bawaan untuk **sesi Chrome nyata Anda yang sudah login**. -Untuk pemanggilan alat browser agen: +Untuk pemanggilan tool browser oleh agen: - Default: gunakan browser `openclaw` yang terisolasi. -- Gunakan `profile="user"` jika sesi login yang sudah ada penting dan pengguna - sedang berada di depan komputer untuk mengeklik/menyetujui prompt attach apa pun. +- Pilih `profile="user"` saat sesi login yang sudah ada penting dan pengguna + berada di depan komputer untuk mengklik/menyetujui prompt attach apa pun. - `profile` adalah override eksplisit saat Anda menginginkan mode browser tertentu. -Setel `browser.defaultProfile: "openclaw"` jika Anda ingin mode terkelola secara default. +Set `browser.defaultProfile: "openclaw"` jika Anda ingin mode terkelola sebagai default. ## Konfigurasi @@ -152,12 +151,12 @@ Pengaturan browser berada di `~/.openclaw/openclaw.json`. browser: { enabled: true, // default: true ssrfPolicy: { - // dangerouslyAllowPrivateNetwork: true, // ikut serta hanya untuk akses jaringan privat tepercaya + // dangerouslyAllowPrivateNetwork: true, // aktifkan hanya untuk akses jaringan privat tepercaya // allowPrivateNetwork: true, // alias lama // hostnameAllowlist: ["*.example.com", "example.com"], // allowedHostnames: ["localhost"], }, - // cdpUrl: "http://127.0.0.1:18792", // override profil tunggal lama + // cdpUrl: "http://127.0.0.1:18792", // override lama satu profil remoteCdpTimeoutMs: 1500, // timeout HTTP CDP jarak jauh (ms) remoteCdpHandshakeTimeoutMs: 3000, // timeout handshake WebSocket CDP jarak jauh (ms) defaultProfile: "openclaw", @@ -188,31 +187,31 @@ Pengaturan browser berada di `~/.openclaw/openclaw.json`. Catatan: -- Layanan kontrol browser melakukan bind ke loopback pada port yang diturunkan dari `gateway.port` +- Layanan kontrol browser bind ke loopback pada port yang diturunkan dari `gateway.port` (default: `18791`, yaitu gateway + 2). - Jika Anda meng-override port Gateway (`gateway.port` atau `OPENCLAW_GATEWAY_PORT`), port browser turunan akan bergeser agar tetap berada dalam “keluarga” yang sama. -- `cdpUrl` secara default mengarah ke port CDP lokal terkelola saat tidak disetel. +- `cdpUrl` secara default menggunakan port CDP lokal terkelola saat tidak diatur. - `remoteCdpTimeoutMs` berlaku untuk pemeriksaan keterjangkauan CDP jarak jauh (non-loopback). -- `remoteCdpHandshakeTimeoutMs` berlaku untuk pemeriksaan keterjangkauan handshake WebSocket CDP jarak jauh. -- Navigasi browser/buka-tab dilindungi SSRF sebelum navigasi dan diperiksa ulang sebisa mungkin pada URL akhir `http(s)` setelah navigasi. +- `remoteCdpHandshakeTimeoutMs` berlaku untuk pemeriksaan keterjangkauan WebSocket CDP jarak jauh. +- Navigasi/buka-tab browser dilindungi SSRF sebelum navigasi dan diperiksa ulang sebisa mungkin pada URL akhir `http(s)` setelah navigasi. - Dalam mode SSRF ketat, discovery/probe endpoint CDP jarak jauh (`cdpUrl`, termasuk lookup `/json/version`) juga diperiksa. -- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` dinonaktifkan secara default. Setel ke `true` hanya jika Anda memang memercayai akses browser ke jaringan privat. +- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` nonaktif secara default. Set ke `true` hanya saat Anda memang mempercayai akses browser jaringan privat. - `browser.ssrfPolicy.allowPrivateNetwork` tetap didukung sebagai alias lama untuk kompatibilitas. -- `attachOnly: true` berarti “jangan pernah meluncurkan browser lokal; hanya attach jika browser sudah berjalan.” -- `color` + `color` per profil memberi warna UI browser agar Anda dapat melihat profil mana yang aktif. +- `attachOnly: true` berarti “jangan pernah meluncurkan browser lokal; hanya attach jika browser itu sudah berjalan.” +- `color` + `color` per profil memberi warna pada UI browser agar Anda dapat melihat profil mana yang aktif. - Profil default adalah `openclaw` (browser mandiri yang dikelola OpenClaw). Gunakan `defaultProfile: "user"` untuk memilih browser pengguna yang sudah login. -- Urutan deteksi otomatis: browser default sistem jika berbasis Chromium; jika tidak, Chrome → Brave → Edge → Chromium → Chrome Canary. -- Profil `openclaw` lokal otomatis menetapkan `cdpPort`/`cdpUrl` — setel itu hanya untuk CDP jarak jauh. -- `driver: "existing-session"` menggunakan Chrome DevTools MCP, bukan CDP mentah. Jangan - setel `cdpUrl` untuk driver tersebut. -- Setel `browser.profiles..userDataDir` saat profil existing-session +- Urutan deteksi otomatis: browser default sistem jika berbasis Chromium; jika tidak maka Chrome → Brave → Edge → Chromium → Chrome Canary. +- Profil `openclaw` lokal otomatis menetapkan `cdpPort`/`cdpUrl` — set itu hanya untuk CDP jarak jauh. +- `driver: "existing-session"` menggunakan Chrome DevTools MCP alih-alih CDP mentah. Jangan + set `cdpUrl` untuk driver tersebut. +- Set `browser.profiles..userDataDir` saat profil existing-session harus attach ke profil pengguna Chromium non-default seperti Brave atau Edge. -## Gunakan Brave (atau browser berbasis Chromium lainnya) +## Gunakan Brave (atau browser berbasis Chromium lain) Jika browser **default sistem** Anda berbasis Chromium (Chrome/Brave/Edge/dll), -OpenClaw akan menggunakannya secara otomatis. Setel `browser.executablePath` untuk meng-override +OpenClaw menggunakannya secara otomatis. Set `browser.executablePath` untuk meng-override deteksi otomatis: Contoh CLI: @@ -247,50 +246,50 @@ openclaw config set browser.executablePath "/usr/bin/google-chrome" ## Kontrol lokal vs jarak jauh - **Kontrol lokal (default):** Gateway memulai layanan kontrol loopback dan dapat meluncurkan browser lokal. -- **Kontrol jarak jauh (host node):** jalankan host node di mesin yang memiliki browser; Gateway mem-proxy aksi browser ke sana. -- **CDP jarak jauh:** setel `browser.profiles..cdpUrl` (atau `browser.cdpUrl`) untuk +- **Kontrol jarak jauh (host node):** jalankan host node di mesin yang memiliki browser; Gateway mem-proxy tindakan browser ke host itu. +- **CDP jarak jauh:** set `browser.profiles..cdpUrl` (atau `browser.cdpUrl`) untuk attach ke browser berbasis Chromium jarak jauh. Dalam kasus ini, OpenClaw tidak akan meluncurkan browser lokal. Perilaku penghentian berbeda menurut mode profil: -- profil lokal terkelola: `openclaw browser stop` menghentikan proses browser yang - diluncurkan oleh OpenClaw -- profil attach-only dan CDP jarak jauh: `openclaw browser stop` menutup sesi - kontrol aktif dan melepaskan override emulasi Playwright/CDP (viewport, - skema warna, lokal, zona waktu, mode offline, dan status serupa), meskipun +- profil terkelola lokal: `openclaw browser stop` menghentikan proses browser yang + diluncurkan OpenClaw +- profil attach-only dan CDP jarak jauh: `openclaw browser stop` menutup sesi kontrol + aktif dan melepaskan override emulasi Playwright/CDP (viewport, + skema warna, locale, zona waktu, mode offline, dan state serupa), meskipun tidak ada proses browser yang diluncurkan oleh OpenClaw -URL CDP jarak jauh dapat menyertakan autentikasi: +URL CDP jarak jauh dapat menyertakan auth: -- Token query (mis. `https://provider.example?token=`) -- HTTP Basic auth (mis. `https://user:pass@provider.example`) +- Token kueri (misalnya `https://provider.example?token=`) +- HTTP Basic auth (misalnya `https://user:pass@provider.example`) -OpenClaw mempertahankan autentikasi saat memanggil endpoint `/json/*` dan saat terhubung -ke WebSocket CDP. Gunakan environment variable atau pengelola secret untuk -token alih-alih meng-commit-nya ke file konfigurasi. +OpenClaw mempertahankan auth saat memanggil endpoint `/json/*` dan saat terhubung +ke WebSocket CDP. Lebih baik gunakan environment variable atau secrets manager untuk +token daripada meng-commit-nya ke file config. -## Proksi browser node (default tanpa konfigurasi) +## Proxy browser Node (default tanpa config) -Jika Anda menjalankan **host node** di mesin yang memiliki browser Anda, OpenClaw dapat -secara otomatis merutekan pemanggilan alat browser ke node tersebut tanpa konfigurasi browser tambahan. -Ini adalah jalur default untuk Gateway jarak jauh. +Jika Anda menjalankan **host node** pada mesin yang memiliki browser Anda, OpenClaw dapat +secara otomatis merutekan pemanggilan tool browser ke node itu tanpa config browser tambahan. +Ini adalah jalur default untuk gateway jarak jauh. Catatan: - Host node mengekspos server kontrol browser lokalnya melalui **perintah proxy**. -- Profil berasal dari konfigurasi `browser.profiles` milik node itu sendiri (sama seperti lokal). -- `nodeHost.browserProxy.allowProfiles` bersifat opsional. Biarkan kosong untuk perilaku lama/default: semua profil yang dikonfigurasi tetap dapat dijangkau melalui proksi, termasuk rute buat/hapus profil. -- Jika Anda menyetel `nodeHost.browserProxy.allowProfiles`, OpenClaw memperlakukannya sebagai batas least-privilege: hanya profil yang di-allowlist yang dapat ditargetkan, dan rute buat/hapus profil persisten diblokir pada permukaan proksi. +- Profil berasal dari config `browser.profiles` milik node itu sendiri (sama seperti lokal). +- `nodeHost.browserProxy.allowProfiles` bersifat opsional. Biarkan kosong untuk perilaku lama/default: semua profil yang dikonfigurasi tetap dapat dijangkau melalui proxy, termasuk route buat/hapus profil. +- Jika Anda set `nodeHost.browserProxy.allowProfiles`, OpenClaw memperlakukannya sebagai batas least-privilege: hanya profil dalam allowlist yang dapat ditargetkan, dan route buat/hapus profil persisten diblokir pada permukaan proxy. - Nonaktifkan jika Anda tidak menginginkannya: - Pada node: `nodeHost.browserProxy.enabled=false` - Pada gateway: `gateway.nodes.browser.mode="off"` -## Browserless (CDP jarak jauh terhosting) +## Browserless (CDP jarak jauh yang di-host) -[Browserless](https://browserless.io) adalah layanan Chromium terhosting yang mengekspos -URL koneksi CDP melalui HTTPS dan WebSocket. OpenClaw dapat menggunakan salah satu bentuk tersebut, tetapi -untuk profil browser jarak jauh, opsi paling sederhana adalah URL WebSocket langsung -dari dokumentasi koneksi Browserless. +[Browserless](https://browserless.io) adalah layanan Chromium yang di-host dan mengekspos +URL koneksi CDP melalui HTTPS dan WebSocket. OpenClaw dapat menggunakan keduanya, tetapi +untuk profil browser jarak jauh opsi yang paling sederhana adalah URL WebSocket langsung +dari dokumen koneksi Browserless. Contoh: @@ -313,29 +312,43 @@ Contoh: Catatan: -- Ganti `` dengan token Browserless Anda yang sebenarnya. -- Pilih endpoint region yang sesuai dengan akun Browserless Anda (lihat dokumentasi mereka). -- Jika Browserless memberi Anda URL dasar HTTPS, Anda dapat mengubahnya menjadi +- Ganti `` dengan token Browserless nyata Anda. +- Pilih endpoint region yang sesuai dengan akun Browserless Anda (lihat dokumen mereka). +- Jika Browserless memberi Anda URL dasar HTTPS, Anda dapat mengubahnya ke `wss://` untuk koneksi CDP langsung atau tetap menggunakan URL HTTPS dan membiarkan OpenClaw menemukan `/json/version`. -## Penyedia CDP WebSocket langsung +## Provider CDP WebSocket langsung -Beberapa layanan browser terhosting mengekspos endpoint **WebSocket langsung** alih-alih -discovery CDP berbasis HTTP standar (`/json/version`). OpenClaw mendukung keduanya: +Beberapa layanan browser yang di-host mengekspos endpoint **WebSocket langsung** alih-alih +discovery CDP berbasis HTTP standar (`/json/version`). OpenClaw menerima tiga +bentuk URL CDP dan secara otomatis memilih strategi koneksi yang tepat: -- **Endpoint HTTP(S)** — OpenClaw memanggil `/json/version` untuk menemukan - URL debugger WebSocket, lalu terhubung. -- **Endpoint WebSocket** (`ws://` / `wss://`) — OpenClaw terhubung secara langsung, - melewati `/json/version`. Gunakan ini untuk layanan seperti - [Browserless](https://browserless.io), - [Browserbase](https://www.browserbase.com), atau penyedia apa pun yang memberi Anda - URL WebSocket. +- **Discovery HTTP(S)** — `http://host[:port]` atau `https://host[:port]`. + OpenClaw memanggil `/json/version` untuk menemukan URL debugger WebSocket, lalu + terhubung. Tidak ada fallback WebSocket. +- **Endpoint WebSocket langsung** — `ws://host[:port]/devtools//` atau + `wss://...` dengan path `/devtools/browser|page|worker|shared_worker|service_worker/`. + OpenClaw terhubung langsung melalui handshake WebSocket dan melewati + `/json/version` sepenuhnya. +- **Root WebSocket polos** — `ws://host[:port]` atau `wss://host[:port]` tanpa + path `/devtools/...` (misalnya [Browserless](https://browserless.io), + [Browserbase](https://www.browserbase.com)). OpenClaw mencoba discovery HTTP + `/json/version` terlebih dahulu (menormalkan skema ke `http`/`https`); + jika discovery mengembalikan `webSocketDebuggerUrl`, URL itu digunakan, jika tidak OpenClaw + akan fallback ke handshake WebSocket langsung pada root polos. Ini mencakup + baik port debug jarak jauh gaya Chrome maupun provider yang hanya WebSocket. + +`ws://host:port` / `wss://host:port` polos tanpa path `/devtools/...` +yang diarahkan ke instance Chrome lokal didukung melalui fallback +discovery-first — Chrome hanya menerima upgrade WebSocket pada path spesifik per-browser +atau per-target yang dikembalikan oleh `/json/version`, jadi handshake bare-root saja +akan gagal. ### Browserbase [Browserbase](https://www.browserbase.com) adalah platform cloud untuk menjalankan -browser headless dengan pemecahan CAPTCHA bawaan, mode stealth, dan proxy +browser headless dengan CAPTCHA solving bawaan, mode stealth, dan proxy residensial. ```json5 @@ -357,51 +370,51 @@ residensial. Catatan: -- [Daftar](https://www.browserbase.com/sign-up) dan salin **API Key** - Anda dari [dashboard Overview](https://www.browserbase.com/overview). -- Ganti `` dengan API key Browserbase Anda yang sebenarnya. -- Browserbase otomatis membuat sesi browser saat terhubung ke WebSocket, jadi tidak - diperlukan langkah pembuatan sesi manual. -- Tingkat gratis memungkinkan satu sesi bersamaan dan satu jam browser per bulan. - Lihat [harga](https://www.browserbase.com/pricing) untuk batas paket berbayar. -- Lihat [dokumentasi Browserbase](https://docs.browserbase.com) untuk referensi API +- [Daftar](https://www.browserbase.com/sign-up) dan salin **API Key** Anda + dari [dasbor Overview](https://www.browserbase.com/overview). +- Ganti `` dengan API key Browserbase Anda yang asli. +- Browserbase otomatis membuat sesi browser saat koneksi WebSocket dibuat, jadi + tidak diperlukan langkah pembuatan sesi manual. +- Tier gratis memungkinkan satu sesi bersamaan dan satu jam browser per bulan. + Lihat [pricing](https://www.browserbase.com/pricing) untuk batas paket berbayar. +- Lihat [docs Browserbase](https://docs.browserbase.com) untuk referensi API lengkap, panduan SDK, dan contoh integrasi. ## Keamanan Ide utama: -- Kontrol browser hanya loopback; akses mengalir melalui autentikasi Gateway atau pairing node. -- API HTTP browser loopback mandiri hanya menggunakan **autentikasi shared-secret**: - autentikasi bearer token gateway, `x-openclaw-password`, atau HTTP Basic auth dengan - kata sandi gateway yang dikonfigurasi. -- Header identitas Tailscale Serve dan `gateway.auth.mode: "trusted-proxy"` - **tidak** mengautentikasi API browser loopback mandiri ini. -- Jika kontrol browser diaktifkan dan tidak ada autentikasi shared-secret yang dikonfigurasi, OpenClaw - otomatis membuat `gateway.auth.token` saat startup dan menyimpannya ke konfigurasi. -- OpenClaw **tidak** otomatis membuat token tersebut ketika `gateway.auth.mode` sudah +- Kontrol browser hanya loopback; akses mengalir melalui auth Gateway atau pairing node. +- API HTTP browser loopback mandiri menggunakan **hanya auth shared-secret**: + bearer auth token gateway, `x-openclaw-password`, atau HTTP Basic auth dengan + password gateway yang dikonfigurasi. +- Header identitas Tailscale Serve dan `gateway.auth.mode: "trusted-proxy"` **tidak** + mengautentikasi API browser loopback mandiri ini. +- Jika kontrol browser diaktifkan dan tidak ada auth shared-secret yang dikonfigurasi, OpenClaw + otomatis menghasilkan `gateway.auth.token` saat startup dan menyimpannya ke config. +- OpenClaw **tidak** otomatis menghasilkan token itu ketika `gateway.auth.mode` sudah `password`, `none`, atau `trusted-proxy`. - Simpan Gateway dan host node apa pun di jaringan privat (Tailscale); hindari eksposur publik. -- Perlakukan URL/token CDP jarak jauh sebagai secret; gunakan environment variable atau pengelola secret. +- Perlakukan URL/token CDP jarak jauh sebagai rahasia; lebih baik gunakan env var atau secrets manager. Tips CDP jarak jauh: -- Gunakan endpoint terenkripsi (HTTPS atau WSS) dan token berumur pendek jika memungkinkan. -- Hindari menyematkan token berumur panjang langsung di file konfigurasi. +- Jika memungkinkan, pilih endpoint terenkripsi (HTTPS atau WSS) dan token berumur pendek. +- Hindari menyematkan token berumur panjang langsung di file config. ## Profil (multi-browser) -OpenClaw mendukung beberapa profil bernama (konfigurasi routing). Profil dapat berupa: +OpenClaw mendukung beberapa profil bernama (config perutean). Profil dapat berupa: -- **dikelola openclaw**: instance browser berbasis Chromium khusus dengan direktori data pengguna + port CDP-nya sendiri +- **dikelola openclaw**: instance browser berbasis Chromium khusus dengan direktori data pengguna + port CDP sendiri - **jarak jauh**: URL CDP eksplisit (browser berbasis Chromium yang berjalan di tempat lain) -- **sesi yang sudah ada**: profil Chrome Anda yang sudah ada melalui koneksi otomatis Chrome DevTools MCP +- **sesi yang sudah ada**: profil Chrome Anda yang sudah ada melalui auto-connect Chrome DevTools MCP Default: - Profil `openclaw` dibuat otomatis jika tidak ada. -- Profil `user` bawaan tersedia untuk attach existing-session Chrome MCP. -- Profil existing-session bersifat opt-in di luar `user`; buat dengan `--driver existing-session`. +- Profil `user` adalah bawaan untuk attach existing-session Chrome MCP. +- Profil existing-session bersifat opt-in selain `user`; buat dengan `--driver existing-session`. - Port CDP lokal dialokasikan dari **18800–18899** secara default. - Menghapus profil akan memindahkan direktori data lokalnya ke Trash. @@ -410,10 +423,10 @@ Semua endpoint kontrol menerima `?profile=`; CLI menggunakan `--browser-pr ## Existing-session melalui Chrome DevTools MCP OpenClaw juga dapat attach ke profil browser berbasis Chromium yang sedang berjalan melalui -server MCP Chrome DevTools resmi. Ini menggunakan kembali tab dan status login +server Chrome DevTools MCP resmi. Ini menggunakan kembali tab dan status login yang sudah terbuka di profil browser tersebut. -Latar belakang resmi dan referensi penyiapan: +Referensi latar belakang dan setup resmi: - [Chrome for Developers: Use Chrome DevTools MCP with your browser session](https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session) - [Chrome DevTools MCP README](https://github.com/ChromeDevTools/chrome-devtools-mcp) @@ -427,7 +440,7 @@ nama, warna, atau direktori data browser yang berbeda. Perilaku default: -- Profil `user` bawaan menggunakan koneksi otomatis Chrome MCP, yang menargetkan +- Profil bawaan `user` menggunakan auto-connect Chrome MCP, yang menargetkan profil Google Chrome lokal default. Gunakan `userDataDir` untuk Brave, Edge, Chromium, atau profil Chrome non-default: @@ -447,19 +460,19 @@ Gunakan `userDataDir` untuk Brave, Edge, Chromium, atau profil Chrome non-defaul } ``` -Lalu pada browser yang sesuai: +Lalu di browser yang sesuai: 1. Buka halaman inspect browser tersebut untuk remote debugging. 2. Aktifkan remote debugging. -3. Biarkan browser tetap berjalan dan setujui prompt koneksi saat OpenClaw melakukan attach. +3. Biarkan browser tetap berjalan dan setujui prompt koneksi saat OpenClaw attach. -Halaman inspect umum: +Halaman inspect yang umum: - Chrome: `chrome://inspect/#remote-debugging` - Brave: `brave://inspect/#remote-debugging` - Edge: `edge://inspect/#remote-debugging` -Uji smoke attach langsung: +Uji smoke attach live: ```bash openclaw browser --browser-profile user start @@ -468,49 +481,50 @@ openclaw browser --browser-profile user tabs openclaw browser --browser-profile user snapshot --format ai ``` -Seperti apa hasil yang berhasil: +Tanda bahwa ini berhasil: - `status` menampilkan `driver: existing-session` - `status` menampilkan `transport: chrome-mcp` - `status` menampilkan `running: true` -- `tabs` menampilkan tab browser Anda yang sudah terbuka +- `tabs` mencantumkan tab browser Anda yang sudah terbuka - `snapshot` mengembalikan ref dari tab live yang dipilih Yang perlu diperiksa jika attach tidak berfungsi: - browser berbasis Chromium target memiliki versi `144+` -- remote debugging diaktifkan pada halaman inspect browser tersebut +- remote debugging diaktifkan di halaman inspect browser tersebut - browser menampilkan prompt persetujuan attach dan Anda menerimanya -- `openclaw doctor` memigrasikan konfigurasi browser lama berbasis ekstensi dan memeriksa bahwa - Chrome terpasang secara lokal untuk profil default auto-connect, tetapi tidak dapat +- `openclaw doctor` memigrasikan config browser berbasis ekstensi lama dan memeriksa bahwa + Chrome terpasang secara lokal untuk profil auto-connect default, tetapi tidak dapat mengaktifkan remote debugging di sisi browser untuk Anda Penggunaan agen: - Gunakan `profile="user"` saat Anda memerlukan status browser pengguna yang sudah login. -- Jika Anda menggunakan profil existing-session kustom, kirim nama profil eksplisit tersebut. -- Pilih mode ini hanya ketika pengguna berada di depan komputer untuk menyetujui prompt +- Jika Anda menggunakan profil existing-session kustom, berikan nama profil eksplisit itu. +- Pilih mode ini hanya saat pengguna berada di depan komputer untuk menyetujui prompt attach. - Gateway atau host node dapat menjalankan `npx chrome-devtools-mcp@latest --autoConnect` Catatan: -- Jalur ini berisiko lebih tinggi dibanding profil `openclaw` yang terisolasi karena dapat +- Jalur ini berisiko lebih tinggi daripada profil `openclaw` yang terisolasi karena dapat bertindak di dalam sesi browser Anda yang sudah login. -- OpenClaw tidak meluncurkan browser untuk driver ini; ia hanya attach ke +- OpenClaw tidak meluncurkan browser untuk driver ini; OpenClaw hanya attach ke sesi yang sudah ada. - OpenClaw menggunakan alur resmi Chrome DevTools MCP `--autoConnect` di sini. Jika - `userDataDir` disetel, OpenClaw meneruskannya untuk menargetkan direktori data pengguna + `userDataDir` diatur, OpenClaw meneruskannya untuk menargetkan direktori data pengguna Chromium eksplisit tersebut. - Screenshot existing-session mendukung tangkapan halaman dan tangkapan elemen `--ref` dari snapshot, tetapi tidak mendukung selector CSS `--element`. -- Screenshot halaman existing-session berfungsi tanpa Playwright melalui Chrome MCP. +- Screenshot halaman existing-session bekerja tanpa Playwright melalui Chrome MCP. Screenshot elemen berbasis ref (`--ref`) juga berfungsi di sana, tetapi `--full-page` tidak dapat digabungkan dengan `--ref` atau `--element`. -- Aksi existing-session masih lebih terbatas dibanding jalur browser terkelola: +- Tindakan existing-session masih lebih terbatas dibanding jalur browser + terkelola: - `click`, `type`, `hover`, `scrollIntoView`, `drag`, dan `select` memerlukan ref snapshot alih-alih selector CSS - - `click` hanya mendukung tombol kiri (tanpa override tombol atau modifier) + - `click` hanya tombol kiri (tanpa override tombol atau modifier) - `type` tidak mendukung `slowly=true`; gunakan `fill` atau `press` - `press` tidak mendukung `delayMs` - `hover`, `scrollIntoView`, `drag`, `select`, `fill`, dan `evaluate` tidak @@ -519,22 +533,23 @@ Catatan: - Existing-session `wait --url` mendukung pola exact, substring, dan glob seperti driver browser lainnya. `wait --load networkidle` belum didukung. - Hook upload existing-session memerlukan `ref` atau `inputRef`, mendukung satu file - per kali, dan tidak mendukung penargetan CSS `element`. + sekali waktu, dan tidak mendukung penargetan CSS `element`. - Hook dialog existing-session tidak mendukung override timeout. -- Beberapa fitur masih memerlukan jalur browser terkelola, termasuk aksi - batch, ekspor PDF, intersepsi unduhan, dan `responsebody`. -- Existing-session bersifat host-local. Jika Chrome berada di mesin lain atau - namespace jaringan yang berbeda, gunakan CDP jarak jauh atau host node. +- Beberapa fitur masih memerlukan jalur browser terkelola, termasuk batch + actions, ekspor PDF, intersepsi unduhan, dan `responsebody`. +- Existing-session dapat attach pada host yang dipilih atau melalui + node browser yang terhubung. Jika Chrome berada di tempat lain dan tidak ada node browser yang terhubung, gunakan + CDP jarak jauh atau host node sebagai gantinya. ## Jaminan isolasi - **Direktori data pengguna khusus**: tidak pernah menyentuh profil browser pribadi Anda. - **Port khusus**: menghindari `9222` untuk mencegah benturan dengan alur kerja pengembangan. -- **Kontrol tab yang deterministik**: targetkan tab berdasarkan `targetId`, bukan “tab terakhir”. +- **Kontrol tab deterministik**: targetkan tab berdasarkan `targetId`, bukan “tab terakhir”. ## Pemilihan browser -Saat meluncurkan secara lokal, OpenClaw memilih yang pertama tersedia: +Saat diluncurkan secara lokal, OpenClaw memilih yang pertama tersedia: 1. Chrome 2. Brave @@ -547,43 +562,43 @@ Anda dapat meng-override dengan `browser.executablePath`. Platform: - macOS: memeriksa `/Applications` dan `~/Applications`. -- Linux: mencari `google-chrome`, `brave`, `microsoft-edge`, `chromium`, dan sebagainya. +- Linux: mencari `google-chrome`, `brave`, `microsoft-edge`, `chromium`, dll. - Windows: memeriksa lokasi instalasi umum. ## API kontrol (opsional) -Hanya untuk integrasi lokal, Gateway mengekspos API HTTP loopback kecil: +Untuk integrasi lokal saja, Gateway mengekspos API HTTP loopback kecil: - Status/start/stop: `GET /`, `POST /start`, `POST /stop` - Tab: `GET /tabs`, `POST /tabs/open`, `POST /tabs/focus`, `DELETE /tabs/:targetId` - Snapshot/screenshot: `GET /snapshot`, `POST /screenshot` -- Aksi: `POST /navigate`, `POST /act` +- Tindakan: `POST /navigate`, `POST /act` - Hook: `POST /hooks/file-chooser`, `POST /hooks/dialog` - Unduhan: `POST /download`, `POST /wait/download` - Debugging: `GET /console`, `POST /pdf` - Debugging: `GET /errors`, `GET /requests`, `POST /trace/start`, `POST /trace/stop`, `POST /highlight` - Jaringan: `POST /response/body` -- Status: `GET /cookies`, `POST /cookies/set`, `POST /cookies/clear` -- Status: `GET /storage/:kind`, `POST /storage/:kind/set`, `POST /storage/:kind/clear` +- State: `GET /cookies`, `POST /cookies/set`, `POST /cookies/clear` +- State: `GET /storage/:kind`, `POST /storage/:kind/set`, `POST /storage/:kind/clear` - Pengaturan: `POST /set/offline`, `POST /set/headers`, `POST /set/credentials`, `POST /set/geolocation`, `POST /set/media`, `POST /set/timezone`, `POST /set/locale`, `POST /set/device` Semua endpoint menerima `?profile=`. -Jika autentikasi gateway shared-secret dikonfigurasi, rute HTTP browser juga memerlukan autentikasi: +Jika auth gateway shared-secret dikonfigurasi, route HTTP browser juga memerlukan auth: - `Authorization: Bearer ` -- `x-openclaw-password: ` atau HTTP Basic auth dengan kata sandi tersebut +- `x-openclaw-password: ` atau HTTP Basic auth dengan password tersebut Catatan: - API browser loopback mandiri ini **tidak** menggunakan trusted-proxy atau header identitas Tailscale Serve. -- Jika `gateway.auth.mode` adalah `none` atau `trusted-proxy`, rute browser loopback - ini tidak mewarisi mode pembawa identitas tersebut; biarkan tetap hanya loopback. +- Jika `gateway.auth.mode` adalah `none` atau `trusted-proxy`, route browser loopback ini + tidak mewarisi mode yang membawa identitas tersebut; tetap pertahankan hanya loopback. ### Kontrak error `/act` -`POST /act` menggunakan respons error terstruktur untuk validasi tingkat rute dan +`POST /act` menggunakan respons error terstruktur untuk validasi tingkat route dan kegagalan kebijakan: ```json @@ -592,46 +607,46 @@ kegagalan kebijakan: Nilai `code` saat ini: -- `ACT_KIND_REQUIRED` (HTTP 400): `kind` hilang atau tidak dikenali. -- `ACT_INVALID_REQUEST` (HTTP 400): payload aksi gagal dinormalisasi atau divalidasi. -- `ACT_SELECTOR_UNSUPPORTED` (HTTP 400): `selector` digunakan dengan jenis aksi yang tidak didukung. -- `ACT_EVALUATE_DISABLED` (HTTP 403): `evaluate` (atau `wait --fn`) dinonaktifkan oleh konfigurasi. -- `ACT_TARGET_ID_MISMATCH` (HTTP 403): `targetId` tingkat atas atau batch bertentangan dengan target permintaan. -- `ACT_EXISTING_SESSION_UNSUPPORTED` (HTTP 501): aksi tidak didukung untuk profil existing-session. +- `ACT_KIND_REQUIRED` (HTTP 400): `kind` tidak ada atau tidak dikenali. +- `ACT_INVALID_REQUEST` (HTTP 400): payload tindakan gagal dinormalisasi atau divalidasi. +- `ACT_SELECTOR_UNSUPPORTED` (HTTP 400): `selector` digunakan dengan jenis tindakan yang tidak didukung. +- `ACT_EVALUATE_DISABLED` (HTTP 403): `evaluate` (atau `wait --fn`) dinonaktifkan oleh config. +- `ACT_TARGET_ID_MISMATCH` (HTTP 403): `targetId` tingkat atas atau yang dibatch bertentangan dengan target request. +- `ACT_EXISTING_SESSION_UNSUPPORTED` (HTTP 501): tindakan tidak didukung untuk profil existing-session. -Kegagalan runtime lainnya mungkin masih mengembalikan `{ "error": "" }` tanpa +Kegagalan runtime lain masih dapat mengembalikan `{ "error": "" }` tanpa field `code`. ### Persyaratan Playwright -Beberapa fitur (navigate/act/snapshot AI/snapshot role, screenshot elemen, -PDF) memerlukan Playwright. Jika Playwright belum terpasang, endpoint tersebut mengembalikan +Beberapa fitur (navigate/act/snapshot AI/role snapshot, screenshot elemen, +PDF) memerlukan Playwright. Jika Playwright tidak terpasang, endpoint tersebut mengembalikan error 501 yang jelas. Yang masih berfungsi tanpa Playwright: -- Snapshot ARIA -- Screenshot halaman untuk browser `openclaw` terkelola ketika tersedia WebSocket - CDP per tab -- Screenshot halaman untuk profil `existing-session` / Chrome MCP -- Screenshot existing-session berbasis ref (`--ref`) dari output snapshot +- snapshot ARIA +- screenshot halaman untuk browser `openclaw` terkelola saat CDP + WebSocket per-tab tersedia +- screenshot halaman untuk profil `existing-session` / Chrome MCP +- screenshot berbasis ref (`--ref`) untuk `existing-session` dari output snapshot Yang masih memerlukan Playwright: - `navigate` - `act` -- Snapshot AI / snapshot role -- Screenshot elemen selector CSS (`--element`) -- Ekspor PDF browser penuh +- snapshot AI / role snapshot +- screenshot elemen selector CSS (`--element`) +- ekspor PDF browser penuh -Screenshot elemen juga menolak `--full-page`; rute mengembalikan `fullPage is +Screenshot elemen juga menolak `--full-page`; route mengembalikan `fullPage is not supported for element screenshots`. Jika Anda melihat `Playwright is not available in this gateway build`, instal paket -Playwright penuh (bukan `playwright-core`) dan mulai ulang gateway, atau instal ulang +Playwright penuh (bukan `playwright-core`) dan restart gateway, atau instal ulang OpenClaw dengan dukungan browser. -#### Instalasi Playwright di Docker +#### Instalasi Playwright Docker Jika Gateway Anda berjalan di Docker, hindari `npx playwright` (konflik override npm). Gunakan CLI bawaan sebagai gantinya: @@ -641,7 +656,7 @@ docker compose run --rm openclaw-cli \ node /app/node_modules/playwright-core/cli.js install chromium ``` -Untuk mempertahankan unduhan browser, setel `PLAYWRIGHT_BROWSERS_PATH` (misalnya, +Untuk mempertahankan unduhan browser, set `PLAYWRIGHT_BROWSERS_PATH` (misalnya, `/home/node/.cache/ms-playwright`) dan pastikan `/home/node` dipertahankan melalui `OPENCLAW_HOME_VOLUME` atau bind mount. Lihat [Docker](/id/install/docker). @@ -649,11 +664,11 @@ Untuk mempertahankan unduhan browser, setel `PLAYWRIGHT_BROWSERS_PATH` (misalnya Alur tingkat tinggi: -- Sebuah **server kontrol** kecil menerima permintaan HTTP. -- Server ini terhubung ke browser berbasis Chromium (Chrome/Brave/Edge/Chromium) melalui **CDP**. -- Untuk aksi lanjutan (klik/ketik/snapshot/PDF), server ini menggunakan **Playwright** di atas +- **Server kontrol** kecil menerima request HTTP. +- Server itu terhubung ke browser berbasis Chromium (Chrome/Brave/Edge/Chromium) melalui **CDP**. +- Untuk tindakan lanjutan (click/type/snapshot/PDF), server itu menggunakan **Playwright** di atas CDP. -- Saat Playwright tidak ada, hanya operasi non-Playwright yang tersedia. +- Saat Playwright tidak tersedia, hanya operasi non-Playwright yang tersedia. Desain ini menjaga agen tetap berada pada antarmuka yang stabil dan deterministik sambil memungkinkan Anda menukar browser dan profil lokal/jarak jauh. @@ -663,7 +678,7 @@ Anda menukar browser dan profil lokal/jarak jauh. Semua perintah menerima `--browser-profile ` untuk menargetkan profil tertentu. Semua perintah juga menerima `--json` untuk output yang dapat dibaca mesin (payload stabil). -Dasar-dasar: +Dasar: - `openclaw browser status` - `openclaw browser start` @@ -703,7 +718,7 @@ Catatan siklus hidup: - `openclaw browser pdf` - `openclaw browser responsebody "**/api" --max-chars 5000` -Aksi: +Tindakan: - `openclaw browser navigate https://example.com` - `openclaw browser resize 1280 720` @@ -727,7 +742,7 @@ Aksi: - `openclaw browser trace start` - `openclaw browser trace stop` -Status: +State: - `openclaw browser cookies` - `openclaw browser cookies set session abc123 --url "https://example.com"` @@ -748,25 +763,25 @@ Status: Catatan: -- `upload` dan `dialog` adalah panggilan **arming**; jalankan keduanya sebelum klik/press +- `upload` dan `dialog` adalah panggilan **arming**; jalankan keduanya sebelum click/press yang memicu chooser/dialog. -- Jalur output unduhan dan trace dibatasi ke root temp OpenClaw: +- Path output unduhan dan trace dibatasi ke root temp OpenClaw: - trace: `/tmp/openclaw` (fallback: `${os.tmpdir()}/openclaw`) - unduhan: `/tmp/openclaw/downloads` (fallback: `${os.tmpdir()}/openclaw/downloads`) -- Jalur upload dibatasi ke root upload temp OpenClaw: +- Path upload dibatasi ke root upload temp OpenClaw: - upload: `/tmp/openclaw/uploads` (fallback: `${os.tmpdir()}/openclaw/uploads`) -- `upload` juga dapat menyetel input file secara langsung melalui `--input-ref` atau `--element`. +- `upload` juga dapat langsung mengatur input file melalui `--input-ref` atau `--element`. - `snapshot`: - `--format ai` (default saat Playwright terpasang): mengembalikan snapshot AI dengan ref numerik (`aria-ref=""`). - `--format aria`: mengembalikan pohon aksesibilitas (tanpa ref; hanya untuk inspeksi). - - `--efficient` (atau `--mode efficient`): preset snapshot role ringkas (interactive + compact + depth + maxChars lebih rendah). - - Default konfigurasi (hanya tool/CLI): setel `browser.snapshotDefaults.mode: "efficient"` untuk menggunakan snapshot efisien saat pemanggil tidak memberikan mode (lihat [Konfigurasi Gateway](/id/gateway/configuration-reference#browser)). - - Opsi snapshot role (`--interactive`, `--compact`, `--depth`, `--selector`) memaksa snapshot berbasis role dengan ref seperti `ref=e12`. - - `--frame "