diff --git a/docs/id/channels/discord.md b/docs/id/channels/discord.md index 037d70f5a..0ace945f1 100644 --- a/docs/id/channels/discord.md +++ b/docs/id/channels/discord.md @@ -1,42 +1,42 @@ --- read_when: - - Sedang mengerjakan fitur channel Discord + - Sedang mengerjakan fitur saluran Discord summary: Status dukungan bot Discord, kemampuan, dan konfigurasi title: Discord x-i18n: - generated_at: "2026-04-06T03:07:40Z" + generated_at: "2026-04-08T09:14:33Z" model: gpt-5.4 provider: openai - source_hash: 54af2176a1b4fa1681e3f07494def0c652a2730165058848000e71a59e2a9d08 + source_hash: 3cd2886fad941ae2129e681911309539e9a65a2352b777b538d7f4686a68f73f source_path: channels/discord.md workflow: 15 --- # Discord (Bot API) -Status: siap untuk DM dan channel guild melalui gateway Discord resmi. +Status: siap untuk DM dan saluran guild melalui gateway Discord resmi. - - DM Discord secara default menggunakan mode pemasangan. + + DM Discord secara default menggunakan mode pairing. - + Perilaku perintah native dan katalog perintah. - - Diagnostik lintas channel dan alur perbaikan. + + Diagnostik lintas saluran dan alur perbaikan. -## Pengaturan cepat +## Penyiapan cepat -Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, lalu memasangkannya ke OpenClaw. Kami merekomendasikan untuk menambahkan bot Anda ke server pribadi milik Anda sendiri. Jika Anda belum memilikinya, [buat dulu](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (pilih **Create My Own > For me and my friends**). +Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, lalu memasangkannya ke OpenClaw. Kami merekomendasikan menambahkan bot Anda ke server pribadi Anda sendiri. Jika Anda belum punya, [buat dulu](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (pilih **Create My Own > For me and my friends**). - Buka [Discord Developer Portal](https://discord.com/developers/applications) lalu klik **New Application**. Beri nama seperti "OpenClaw". + Buka [Discord Developer Portal](https://discord.com/developers/applications) dan klik **New Application**. Beri nama seperti "OpenClaw". - Klik **Bot** di sidebar. Atur **Username** ke nama apa pun yang Anda gunakan untuk agen OpenClaw Anda. + Klik **Bot** di bilah sisi. Atur **Username** ke apa pun yang Anda gunakan untuk menyebut agen OpenClaw Anda. @@ -44,16 +44,16 @@ Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, lal Masih di halaman **Bot**, gulir ke bawah ke **Privileged Gateway Intents** lalu aktifkan: - **Message Content Intent** (wajib) - - **Server Members Intent** (direkomendasikan; wajib untuk allowlist peran dan pencocokan nama ke ID) + - **Server Members Intent** (direkomendasikan; wajib untuk allowlist peran dan pencocokan nama-ke-ID) - **Presence Intent** (opsional; hanya diperlukan untuk pembaruan presence) - Gulir kembali ke atas pada halaman **Bot** lalu klik **Reset Token**. + Gulir kembali ke atas di halaman **Bot** lalu klik **Reset Token**. - Meskipun namanya begitu, ini menghasilkan token pertama Anda — tidak ada apa pun yang sedang "direset". + Meskipun namanya begitu, ini menghasilkan token pertama Anda — tidak ada yang sedang "direset." Salin token tersebut dan simpan di suatu tempat. Ini adalah **Bot Token** Anda dan Anda akan segera membutuhkannya. @@ -61,14 +61,14 @@ Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, lal - Klik **OAuth2** di sidebar. Anda akan membuat URL undangan dengan izin yang tepat untuk menambahkan bot ke server Anda. + Klik **OAuth2** di bilah sisi. Anda akan membuat URL undangan dengan izin yang tepat untuk menambahkan bot ke server Anda. - Gulir ke bawah ke **OAuth2 URL Generator** lalu aktifkan: + Gulir ke bawah ke **OAuth2 URL Generator** dan aktifkan: - `bot` - `applications.commands` - Bagian **Bot Permissions** akan muncul di bawahnya. Aktifkan: + Bagian **Bot Permissions** akan muncul di bawah. Aktifkan: - View Channels - Send Messages @@ -77,30 +77,30 @@ Anda perlu membuat aplikasi baru dengan bot, menambahkan bot ke server Anda, lal - Attach Files - Add Reactions (opsional) - Salin URL yang dihasilkan di bagian bawah, tempelkan ke browser Anda, pilih server Anda, lalu klik **Continue** untuk menghubungkannya. Sekarang Anda seharusnya melihat bot Anda di server Discord. + Salin URL yang dihasilkan di bagian bawah, tempelkan ke browser Anda, pilih server Anda, lalu klik **Continue** untuk menghubungkan. Anda sekarang seharusnya dapat melihat bot Anda di server Discord. - Kembali di aplikasi Discord, Anda perlu mengaktifkan Developer Mode agar dapat menyalin ID internal. + Kembali ke aplikasi Discord, Anda perlu mengaktifkan Developer Mode agar dapat menyalin ID internal. - 1. Klik **User Settings** (ikon roda gigi di sebelah avatar Anda) → **Advanced** → aktifkan **Developer Mode** - 2. Klik kanan **ikon server** Anda di sidebar → **Copy Server ID** + 1. Klik **User Settings** (ikon roda gigi di samping avatar Anda) → **Advanced** → aktifkan **Developer Mode** + 2. Klik kanan **ikon server** Anda di bilah sisi → **Copy Server ID** 3. Klik kanan **avatar Anda sendiri** → **Copy User ID** - Simpan **Server ID** dan **User ID** Anda bersama Bot Token — Anda akan mengirimkan ketiganya ke OpenClaw pada langkah berikutnya. + Simpan **Server ID** dan **User ID** Anda bersama Bot Token — Anda akan mengirim ketiganya ke OpenClaw pada langkah berikutnya. - Agar pemasangan berfungsi, Discord perlu mengizinkan bot Anda mengirim DM kepada Anda. Klik kanan **ikon server** Anda → **Privacy Settings** → aktifkan **Direct Messages**. + Agar pairing berfungsi, Discord perlu mengizinkan bot Anda mengirimi Anda DM. Klik kanan **ikon server** Anda → **Privacy Settings** → aktifkan **Direct Messages**. - Ini memungkinkan anggota server (termasuk bot) mengirim DM kepada Anda. Biarkan ini tetap aktif jika Anda ingin menggunakan DM Discord dengan OpenClaw. Jika Anda hanya berencana menggunakan channel guild, Anda dapat menonaktifkan DM setelah pemasangan. + Ini memungkinkan anggota server (termasuk bot) mengirimkan DM kepada Anda. Biarkan ini tetap aktif jika Anda ingin menggunakan DM Discord dengan OpenClaw. Jika Anda hanya berencana menggunakan saluran guild, Anda dapat menonaktifkan DM setelah pairing. - - Token bot Discord Anda adalah rahasia (seperti kata sandi). Atur token itu pada mesin yang menjalankan OpenClaw sebelum mengirim pesan ke agen Anda. + + Token bot Discord Anda adalah rahasia (seperti kata sandi). Setel token ini pada mesin yang menjalankan OpenClaw sebelum mengirim pesan ke agen Anda. ```bash export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN" @@ -110,20 +110,20 @@ openclaw config set channels.discord.enabled true --strict-json openclaw gateway ``` - Jika OpenClaw sudah berjalan sebagai layanan latar belakang, mulai ulang melalui aplikasi OpenClaw Mac atau dengan menghentikan lalu memulai ulang proses `openclaw gateway run`. + Jika OpenClaw sudah berjalan sebagai layanan latar belakang, mulai ulang melalui aplikasi OpenClaw Mac atau dengan menghentikan lalu menjalankan kembali proses `openclaw gateway run`. - + - Chat dengan agen OpenClaw Anda di channel yang sudah ada (misalnya Telegram) dan beri tahu agen tersebut. Jika Discord adalah channel pertama Anda, gunakan tab CLI / config sebagai gantinya. + Chat dengan agen OpenClaw Anda di saluran yang sudah ada (misalnya Telegram) lalu beri tahu. Jika Discord adalah saluran pertama Anda, gunakan tab CLI / config sebagai gantinya. - > "Saya sudah mengatur token bot Discord saya di config. Tolong selesaikan penyiapan Discord dengan User ID `` dan Server ID ``." + > "Saya sudah menetapkan token bot Discord saya di config. Tolong selesaikan penyiapan Discord dengan User ID `` dan Server ID ``." - Jika Anda lebih suka config berbasis file, atur: + Jika Anda lebih suka config berbasis file, tetapkan: ```json5 { @@ -146,21 +146,21 @@ openclaw gateway DISCORD_BOT_TOKEN=... ``` - Nilai `token` plaintext didukung. Nilai SecretRef juga didukung untuk `channels.discord.token` pada provider env/file/exec. Lihat [Secrets Management](/id/gateway/secrets). + Nilai `token` plaintext didukung. Nilai SecretRef juga didukung untuk `channels.discord.token` di seluruh provider env/file/exec. Lihat [Secrets Management](/id/gateway/secrets). - - Tunggu sampai gateway berjalan, lalu kirim DM ke bot Anda di Discord. Bot akan merespons dengan kode pemasangan. + + Tunggu sampai gateway berjalan, lalu kirim DM ke bot Anda di Discord. Bot akan merespons dengan kode pairing. - Kirim kode pemasangan ke agen Anda di channel yang sudah ada: + Kirim kode pairing ke agen Anda di saluran yang sudah ada: - > "Setujui kode pemasangan Discord ini: ``" + > "Setujui kode pairing Discord ini: ``" @@ -172,25 +172,25 @@ openclaw pairing approve discord - Kode pemasangan kedaluwarsa setelah 1 jam. + Kode pairing kedaluwarsa setelah 1 jam. - Sekarang Anda seharusnya dapat chat dengan agen Anda di Discord melalui DM. + Anda sekarang seharusnya dapat mengobrol dengan agen Anda di Discord melalui DM. -Resolusi token memperhatikan akun. Nilai token di config lebih diutamakan daripada fallback env. `DISCORD_BOT_TOKEN` hanya digunakan untuk akun default. -Untuk panggilan outbound lanjutan (aksi tool/channel pesan), `token` per panggilan yang eksplisit digunakan untuk panggilan tersebut. Ini berlaku untuk aksi gaya kirim dan baca/probe (misalnya read/search/fetch/thread/pins/permissions). Pengaturan kebijakan akun/retry tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. +Resolusi token bersifat account-aware. Nilai token config lebih diprioritaskan daripada fallback env. `DISCORD_BOT_TOKEN` hanya digunakan untuk akun default. +Untuk panggilan outbound lanjutan (aksi alat pesan/saluran), `token` eksplisit per panggilan digunakan untuk panggilan tersebut. Ini berlaku untuk aksi bergaya kirim dan baca/probe (misalnya read/search/fetch/thread/pins/permissions). Pengaturan kebijakan/retry akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. -## Direkomendasikan: Siapkan workspace guild +## Rekomendasi: siapkan workspace guild -Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspace penuh tempat setiap channel mendapatkan sesi agen sendiri dengan konteksnya sendiri. Ini direkomendasikan untuk server pribadi yang hanya berisi Anda dan bot Anda. +Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspace penuh di mana setiap saluran mendapatkan sesi agen sendiri dengan konteksnya sendiri. Ini direkomendasikan untuk server pribadi yang hanya berisi Anda dan bot Anda. - Ini memungkinkan agen Anda merespons di channel mana pun pada server Anda, bukan hanya DM. + Ini memungkinkan agen Anda merespons di saluran mana pun di server Anda, bukan hanya DM. @@ -220,14 +220,14 @@ Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspac - Secara default, agen Anda hanya merespons di channel guild saat di-@mention. Untuk server pribadi, kemungkinan Anda ingin agen merespons setiap pesan. + Secara default, agen Anda hanya merespons di saluran guild saat di-@mention. Untuk server pribadi, kemungkinan Anda ingin agen merespons setiap pesan. > "Izinkan agen saya merespons di server ini tanpa harus di-@mention" - Atur `requireMention: false` di config guild Anda: + Tetapkan `requireMention: false` dalam config guild Anda: ```json5 { @@ -248,38 +248,38 @@ Setelah DM berfungsi, Anda dapat menyiapkan server Discord Anda sebagai workspac - - Secara default, memori jangka panjang (MEMORY.md) hanya dimuat dalam sesi DM. Channel guild tidak memuat MEMORY.md secara otomatis. + + Secara default, memori jangka panjang (MEMORY.md) hanya dimuat dalam sesi DM. Saluran guild tidak otomatis memuat MEMORY.md. - > "Saat saya mengajukan pertanyaan di channel Discord, gunakan memory_search atau memory_get jika Anda memerlukan konteks jangka panjang dari MEMORY.md." + > "Saat saya mengajukan pertanyaan di saluran Discord, gunakan memory_search atau memory_get jika Anda memerlukan konteks jangka panjang dari MEMORY.md." - Jika Anda memerlukan konteks bersama di setiap channel, letakkan instruksi yang stabil di `AGENTS.md` atau `USER.md` (keduanya disuntikkan ke setiap sesi). Simpan catatan jangka panjang di `MEMORY.md` dan akses sesuai kebutuhan dengan tool memori. + Jika Anda memerlukan konteks bersama di setiap saluran, letakkan instruksi stabil di `AGENTS.md` atau `USER.md` (keduanya disuntikkan untuk setiap sesi). Simpan catatan jangka panjang di `MEMORY.md` dan akses sesuai kebutuhan dengan alat memori. -Sekarang buat beberapa channel di server Discord Anda dan mulai chat. Agen Anda dapat melihat nama channel, dan setiap channel mendapatkan sesi terisolasi sendiri — jadi Anda dapat menyiapkan `#coding`, `#home`, `#research`, atau apa pun yang sesuai dengan alur kerja Anda. +Sekarang buat beberapa saluran di server Discord Anda dan mulai mengobrol. Agen Anda dapat melihat nama saluran, dan setiap saluran mendapatkan sesi terisolasi sendiri — jadi Anda dapat menyiapkan `#coding`, `#home`, `#research`, atau apa pun yang sesuai dengan alur kerja Anda. ## Model runtime - Gateway memiliki koneksi Discord. -- Perutean balasan bersifat deterministik: balasan inbound dari Discord kembali ke Discord. +- Perutean balasan bersifat deterministik: balasan masuk dari Discord dikembalikan ke Discord. - Secara default (`session.dmScope=main`), chat langsung berbagi sesi utama agen (`agent:main:main`). -- Channel guild adalah kunci sesi terisolasi (`agent::discord:channel:`). -- DM grup diabaikan secara default (`channels.discord.dm.groupEnabled=false`). -- Perintah slash native berjalan dalam sesi perintah terisolasi (`agent::discord:slash:`), sambil tetap membawa `CommandTargetSessionKey` ke sesi percakapan yang dirutekan. +- Saluran guild adalah kunci sesi terisolasi (`agent::discord:channel:`). +- Group DM diabaikan secara default (`channels.discord.dm.groupEnabled=false`). +- Slash command native berjalan dalam sesi perintah terisolasi (`agent::discord:slash:`), sambil tetap membawa `CommandTargetSessionKey` ke sesi percakapan yang dirutekan. -## Channel forum +## Saluran forum -Channel forum dan media Discord hanya menerima posting thread. OpenClaw mendukung dua cara untuk membuatnya: +Saluran forum dan media Discord hanya menerima posting thread. OpenClaw mendukung dua cara untuk membuatnya: -- Kirim pesan ke induk forum (`channel:`) untuk otomatis membuat thread. Judul thread menggunakan baris pertama pesan Anda yang tidak kosong. -- Gunakan `openclaw message thread create` untuk membuat thread secara langsung. Jangan berikan `--message-id` untuk channel forum. +- Kirim pesan ke induk forum (`channel:`) untuk membuat thread otomatis. Judul thread menggunakan baris pertama pesan Anda yang tidak kosong. +- Gunakan `openclaw message thread create` untuk membuat thread secara langsung. Jangan berikan `--message-id` untuk saluran forum. Contoh: kirim ke induk forum untuk membuat thread @@ -295,35 +295,35 @@ openclaw message thread create --channel discord --target channel: \ --thread-name "Topic title" --message "Body of the post" ``` -Induk forum tidak menerima komponen Discord. Jika Anda memerlukan komponen, kirim ke thread itu sendiri (`channel:`). +Induk forum tidak menerima komponen Discord. Jika Anda membutuhkan komponen, kirim ke thread itu sendiri (`channel:`). ## Komponen interaktif -OpenClaw mendukung container Discord components v2 untuk pesan agen. Gunakan tool pesan dengan payload `components`. Hasil interaksi dirutekan kembali ke agen sebagai pesan inbound normal dan mengikuti pengaturan Discord `replyToMode` yang ada. +OpenClaw mendukung container komponen v2 Discord untuk pesan agen. Gunakan alat pesan dengan payload `components`. Hasil interaksi dirutekan kembali ke agen sebagai pesan masuk biasa dan mengikuti pengaturan Discord `replyToMode` yang ada. Blok yang didukung: - `text`, `section`, `separator`, `actions`, `media-gallery`, `file` -- Baris aksi mengizinkan hingga 5 tombol atau satu menu pilih tunggal -- Jenis pilihan: `string`, `user`, `role`, `mentionable`, `channel` +- Baris aksi mengizinkan hingga 5 tombol atau satu menu pilih +- Tipe select: `string`, `user`, `role`, `mentionable`, `channel` -Secara default, komponen hanya bisa digunakan sekali. Atur `components.reusable=true` untuk mengizinkan tombol, pilihan, dan formulir digunakan beberapa kali hingga kedaluwarsa. +Secara default, komponen hanya dapat digunakan satu kali. Tetapkan `components.reusable=true` agar tombol, select, dan formulir dapat digunakan berkali-kali sampai kedaluwarsa. -Untuk membatasi siapa yang dapat mengklik tombol, atur `allowedUsers` pada tombol tersebut (ID pengguna Discord, tag, atau `*`). Jika dikonfigurasi, pengguna yang tidak cocok akan menerima penolakan ephemeral. +Untuk membatasi siapa yang dapat mengeklik tombol, tetapkan `allowedUsers` pada tombol tersebut (ID pengguna Discord, tag, atau `*`). Jika dikonfigurasi, pengguna yang tidak cocok akan menerima penolakan ephemeral. -Perintah slash `/model` dan `/models` membuka pemilih model interaktif dengan dropdown provider dan model plus langkah Submit. Balasan pemilih bersifat ephemeral dan hanya pengguna yang memanggilnya yang dapat menggunakannya. +Slash command `/model` dan `/models` membuka pemilih model interaktif dengan dropdown provider dan model serta langkah Submit. Balasan pemilih bersifat ephemeral dan hanya pengguna yang memanggilnya yang dapat menggunakannya. Lampiran file: -- Blok `file` harus mengarah ke referensi lampiran (`attachment://`) -- Sediakan lampiran melalui `media`/`path`/`filePath` (satu file); gunakan `media-gallery` untuk beberapa file -- Gunakan `filename` untuk mengganti nama unggahan jika harus cocok dengan referensi lampiran +- blok `file` harus menunjuk ke referensi lampiran (`attachment://`) +- Berikan lampiran melalui `media`/`path`/`filePath` (satu file); gunakan `media-gallery` untuk beberapa file +- Gunakan `filename` untuk mengganti nama unggahan saat harus cocok dengan referensi lampiran Formulir modal: - Tambahkan `components.modal` dengan hingga 5 field -- Jenis field: `text`, `checkbox`, `radio`, `select`, `role-select`, `user-select` -- OpenClaw menambahkan tombol pemicu secara otomatis +- Tipe field: `text`, `checkbox`, `radio`, `select`, `role-select`, `user-select` +- OpenClaw otomatis menambahkan tombol pemicu Contoh: @@ -332,45 +332,45 @@ Contoh: channel: "discord", action: "send", to: "channel:123456789012345678", - message: "Teks fallback opsional", + message: "Optional fallback text", components: { reusable: true, - text: "Pilih jalur", + text: "Choose a path", blocks: [ { type: "actions", buttons: [ { - label: "Setujui", + label: "Approve", style: "success", allowedUsers: ["123456789012345678"], }, - { label: "Tolak", style: "danger" }, + { label: "Decline", style: "danger" }, ], }, { type: "actions", select: { type: "string", - placeholder: "Pilih opsi", + placeholder: "Pick an option", options: [ - { label: "Opsi A", value: "a" }, - { label: "Opsi B", value: "b" }, + { label: "Option A", value: "a" }, + { label: "Option B", value: "b" }, ], }, }, ], modal: { - title: "Detail", - triggerLabel: "Buka formulir", + title: "Details", + triggerLabel: "Open form", fields: [ - { type: "text", label: "Peminta" }, + { type: "text", label: "Requester" }, { type: "select", - label: "Prioritas", + label: "Priority", options: [ - { label: "Rendah", value: "low" }, - { label: "Tinggi", value: "high" }, + { label: "Low", value: "low" }, + { label: "High", value: "high" }, ], }, ], @@ -383,19 +383,19 @@ Contoh: - `channels.discord.dmPolicy` mengontrol akses DM (lama: `channels.discord.dm.policy`): + `channels.discord.dmPolicy` mengontrol akses DM (legacy: `channels.discord.dm.policy`): - `pairing` (default) - `allowlist` - - `open` (mengharuskan `channels.discord.allowFrom` mencakup `"*"`; lama: `channels.discord.dm.allowFrom`) + - `open` (memerlukan `channels.discord.allowFrom` mencakup `"*"`; legacy: `channels.discord.dm.allowFrom`) - `disabled` - Jika kebijakan DM tidak terbuka, pengguna yang tidak dikenal akan diblokir (atau diminta melakukan pemasangan dalam mode `pairing`). + Jika kebijakan DM tidak open, pengguna yang tidak dikenal diblokir (atau diminta melakukan pairing dalam mode `pairing`). Prioritas multi-akun: - `channels.discord.accounts.default.allowFrom` hanya berlaku untuk akun `default`. - - Akun bernama mewarisi `channels.discord.allowFrom` saat `allowFrom` miliknya sendiri tidak diatur. + - Akun bernama mewarisi `channels.discord.allowFrom` saat `allowFrom` mereka sendiri tidak ditetapkan. - Akun bernama tidak mewarisi `channels.discord.accounts.default.allowFrom`. Format target DM untuk pengiriman: @@ -403,7 +403,7 @@ Contoh: - `user:` - mention `<@id>` - ID numerik polos ambigu dan ditolak kecuali jenis target pengguna/channel yang eksplisit diberikan. + ID numerik polos bersifat ambigu dan ditolak kecuali jenis target user/channel eksplisit diberikan. @@ -419,11 +419,11 @@ Contoh: Perilaku `allowlist`: - guild harus cocok dengan `channels.discord.guilds` (`id` lebih disukai, slug diterima) - - allowlist pengirim opsional: `users` (ID stabil direkomendasikan) dan `roles` (hanya ID peran); jika salah satu dikonfigurasi, pengirim diizinkan bila cocok dengan `users` ATAU `roles` + - allowlist pengirim opsional: `users` (ID stabil direkomendasikan) dan `roles` (hanya ID peran); jika salah satunya dikonfigurasi, pengirim diizinkan saat cocok dengan `users` ATAU `roles` - pencocokan nama/tag langsung dinonaktifkan secara default; aktifkan `channels.discord.dangerouslyAllowNameMatching: true` hanya sebagai mode kompatibilitas darurat - nama/tag didukung untuk `users`, tetapi ID lebih aman; `openclaw security audit` memperingatkan saat entri nama/tag digunakan - - jika sebuah guild memiliki `channels` yang dikonfigurasi, channel yang tidak tercantum akan ditolak - - jika sebuah guild tidak memiliki blok `channels`, semua channel di guild yang ada di allowlist diizinkan + - jika guild memiliki `channels` yang dikonfigurasi, saluran yang tidak tercantum akan ditolak + - jika guild tidak memiliki blok `channels`, semua saluran dalam guild yang di-allowlist diizinkan Contoh: @@ -449,33 +449,33 @@ Contoh: } ``` - Jika Anda hanya mengatur `DISCORD_BOT_TOKEN` dan tidak membuat blok `channels.discord`, fallback runtime adalah `groupPolicy="allowlist"` (dengan peringatan di log), bahkan jika `channels.defaults.groupPolicy` adalah `open`. + Jika Anda hanya menetapkan `DISCORD_BOT_TOKEN` dan tidak membuat blok `channels.discord`, fallback runtime adalah `groupPolicy="allowlist"` (dengan peringatan di log), meskipun `channels.defaults.groupPolicy` adalah `open`. - - Pesan guild secara default digerbang oleh mention. + + Pesan guild secara default dibatasi mention. Deteksi mention mencakup: - mention bot eksplisit - pola mention yang dikonfigurasi (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`) - - perilaku reply-to-bot implisit pada kasus yang didukung + - perilaku balas-ke-bot implisit dalam kasus yang didukung - `requireMention` dikonfigurasi per guild/channel (`channels.discord.guilds...`). - `ignoreOtherMentions` secara opsional mengabaikan pesan yang me-mention pengguna/peran lain tetapi bukan bot (tidak termasuk @everyone/@here). + `requireMention` dikonfigurasi per guild/saluran (`channels.discord.guilds...`). + `ignoreOtherMentions` secara opsional membuang pesan yang menyebut pengguna/peran lain tetapi bukan bot (tidak termasuk @everyone/@here). - DM grup: + Group DM: - default: diabaikan (`dm.groupEnabled=false`) - - allowlist opsional melalui `dm.groupChannels` (ID channel atau slug) + - allowlist opsional melalui `dm.groupChannels` (ID saluran atau slug) ### Perutean agen berbasis peran -Gunakan `bindings[].match.roles` untuk merutekan anggota guild Discord ke agen yang berbeda berdasarkan ID peran. Binding berbasis peran hanya menerima ID peran dan dievaluasi setelah binding peer atau parent-peer dan sebelum binding hanya-guild. Jika suatu binding juga menetapkan field pencocokan lain (misalnya `peer` + `guildId` + `roles`), semua field yang dikonfigurasi harus cocok. +Gunakan `bindings[].match.roles` untuk merutekan anggota guild Discord ke agen yang berbeda berdasarkan ID peran. Binding berbasis peran hanya menerima ID peran dan dievaluasi setelah binding peer atau parent-peer dan sebelum binding khusus guild. Jika suatu binding juga menetapkan field pencocokan lain (misalnya `peer` + `guildId` + `roles`), semua field yang dikonfigurasi harus cocok. ```json5 { @@ -516,14 +516,14 @@ Gunakan `bindings[].match.roles` untuk merutekan anggota guild Discord ke agen y - Message Content Intent - Server Members Intent (direkomendasikan) - Presence intent bersifat opsional dan hanya diperlukan jika Anda ingin menerima pembaruan presence. Mengatur presence bot (`setPresence`) tidak memerlukan pengaktifan pembaruan presence untuk anggota. + Presence intent bersifat opsional dan hanya diperlukan jika Anda ingin menerima pembaruan presence. Menetapkan presence bot (`setPresence`) tidak memerlukan pembaruan presence untuk anggota diaktifkan. - - OAuth URL generator: + + Generator URL OAuth: - - scope: `bot`, `applications.commands` + - scopes: `bot`, `applications.commands` Izin baseline yang umum: @@ -534,7 +534,7 @@ Gunakan `bindings[].match.roles` untuk merutekan anggota guild Discord ke agen y - Attach Files - Add Reactions (opsional) - Hindari `Administrator` kecuali memang diperlukan secara eksplisit. + Hindari `Administrator` kecuali benar-benar diperlukan. @@ -542,25 +542,25 @@ Gunakan `bindings[].match.roles` untuk merutekan anggota guild Discord ke agen y Aktifkan Discord Developer Mode, lalu salin: - ID server - - ID channel + - ID saluran - ID pengguna - Lebih utamakan ID numerik di config OpenClaw agar audit dan probe lebih andal. + Lebih pilih ID numerik dalam config OpenClaw untuk audit dan probe yang andal. -## Perintah native dan otorisasi perintah +## Perintah native dan autentikasi perintah - `commands.native` secara default bernilai `"auto"` dan diaktifkan untuk Discord. -- Override per channel: `channels.discord.commands.native`. -- `commands.native=false` secara eksplisit menghapus perintah native Discord yang sebelumnya telah didaftarkan. -- Otorisasi perintah native menggunakan allowlist/kebijakan Discord yang sama seperti penanganan pesan biasa. -- Perintah mungkin masih terlihat di UI Discord bagi pengguna yang tidak diotorisasi; eksekusi tetap menegakkan otorisasi OpenClaw dan mengembalikan "not authorized". +- Override per saluran: `channels.discord.commands.native`. +- `commands.native=false` secara eksplisit menghapus perintah native Discord yang sebelumnya terdaftar. +- Autentikasi perintah native menggunakan allowlist/kebijakan Discord yang sama seperti penanganan pesan biasa. +- Perintah mungkin tetap terlihat di UI Discord bagi pengguna yang tidak berwenang; eksekusi tetap menerapkan autentikasi OpenClaw dan mengembalikan "not authorized". -Lihat [Slash commands](/id/tools/slash-commands) untuk katalog perintah dan perilakunya. +Lihat [Slash commands](/id/tools/slash-commands) untuk katalog dan perilaku perintah. -Pengaturan default perintah slash: +Pengaturan slash command default: - `ephemeral: true` @@ -580,26 +580,26 @@ Pengaturan default perintah slash: - `all` - `batched` - Catatan: `off` menonaktifkan threading balasan implisit. Tag `[[reply_to_*]]` yang eksplisit tetap dihormati. - `first` selalu menempelkan referensi balasan native implisit ke pesan Discord outbound pertama untuk giliran tersebut. - `batched` hanya menempelkan referensi balasan native implisit Discord saat - giliran inbound merupakan batch beberapa pesan yang didebounce. Ini berguna - saat Anda ingin balasan native terutama untuk chat yang ambigu dan ramai, bukan untuk setiap + Catatan: `off` menonaktifkan threading balasan implisit. Tag `[[reply_to_*]]` eksplisit tetap dihormati. + `first` selalu melampirkan referensi balasan native implisit ke pesan Discord keluar pertama untuk giliran tersebut. + `batched` hanya melampirkan referensi balasan native implisit Discord ketika + giliran masuk adalah batch terdebounce dari beberapa pesan. Ini berguna + ketika Anda menginginkan balasan native terutama untuk chat yang ambigu dan ramai, bukan untuk setiap giliran satu pesan. - ID pesan ditampilkan dalam context/history sehingga agen dapat menargetkan pesan tertentu. + ID pesan dimunculkan dalam konteks/riwayat sehingga agen dapat menargetkan pesan tertentu. - - OpenClaw dapat men-stream draf balasan dengan mengirim pesan sementara lalu mengeditnya saat teks datang. + + OpenClaw dapat melakukan streaming draf balasan dengan mengirim pesan sementara dan mengeditnya saat teks tiba. - `channels.discord.streaming` mengontrol streaming pratinjau (`off` | `partial` | `block` | `progress`, default: `off`). - - Default tetap `off` karena edit pratinjau Discord dapat dengan cepat mencapai rate limit, terutama saat beberapa bot atau gateway berbagi akun atau lalu lintas guild yang sama. - - `progress` diterima untuk konsistensi lintas channel dan dipetakan ke `partial` di Discord. - - `channels.discord.streamMode` adalah alias lama dan dimigrasikan otomatis. - - `partial` mengedit satu pesan pratinjau saat token datang. - - `block` mengeluarkan potongan seukuran draf (gunakan `draftChunk` untuk menyetel ukuran dan breakpoint). + - Default tetap `off` karena edit pratinjau Discord dapat dengan cepat terkena batas laju, terutama ketika beberapa bot atau gateway berbagi akun atau lalu lintas guild yang sama. + - `progress` diterima untuk konsistensi lintas saluran dan dipetakan ke `partial` di Discord. + - `channels.discord.streamMode` adalah alias legacy dan dimigrasikan otomatis. + - `partial` mengedit satu pesan pratinjau saat token tiba. + - `block` mengeluarkan potongan seukuran draf (gunakan `draftChunk` untuk menyesuaikan ukuran dan breakpoint). Contoh: @@ -613,7 +613,7 @@ Pengaturan default perintah slash: } ``` - Default chunking mode `block` (dibatasi ke `channels.discord.textChunkLimit`): + Default potongan mode `block` (dibatasi ke `channels.discord.textChunkLimit`): ```json5 { @@ -630,10 +630,10 @@ Pengaturan default perintah slash: } ``` - Streaming pratinjau hanya untuk teks; balasan media akan kembali ke pengiriman normal. + Streaming pratinjau hanya untuk teks; balasan media kembali ke pengiriman normal. Catatan: streaming pratinjau terpisah dari block streaming. Saat block streaming secara eksplisit - diaktifkan untuk Discord, OpenClaw melewati preview stream untuk menghindari streaming ganda. + diaktifkan untuk Discord, OpenClaw melewati stream pratinjau untuk menghindari streaming ganda. @@ -651,25 +651,25 @@ Pengaturan default perintah slash: Perilaku thread: - - Thread Discord dirutekan sebagai sesi channel - - metadata thread induk dapat digunakan untuk pengaitan parent-session - - config thread mewarisi config channel induk kecuali ada entri khusus thread + - Thread Discord dirutekan sebagai sesi saluran + - metadata thread induk dapat digunakan untuk keterkaitan sesi induk + - config thread mewarisi config saluran induk kecuali ada entri khusus thread - Topik channel disuntikkan sebagai konteks **tidak tepercaya** (bukan sebagai system prompt). - Konteks balasan dan pesan kutipan saat ini tetap seperti yang diterima. - Allowlist Discord terutama mengendalikan siapa yang dapat memicu agen, bukan batas redaksi konteks tambahan yang lengkap. + Topik saluran disuntikkan sebagai konteks **tidak tepercaya** (bukan sebagai system prompt). + Konteks balasan dan pesan yang dikutip saat ini tetap sebagaimana diterima. + Allowlist Discord terutama membatasi siapa yang dapat memicu agen, bukan batas penyuntingan konteks tambahan yang sepenuhnya lengkap. - - Discord dapat mengikat thread ke target sesi sehingga pesan lanjutan di thread itu terus dirutekan ke sesi yang sama (termasuk sesi subagent). + + Discord dapat mengikat thread ke target sesi sehingga pesan tindak lanjut di thread tersebut tetap dirutekan ke sesi yang sama (termasuk sesi subagen). Perintah: - - `/focus ` mengikat thread saat ini/baru ke target subagent/sesi + - `/focus ` mengikat thread saat ini/baru ke target subagen/sesi - `/unfocus` menghapus binding thread saat ini - `/agents` menampilkan run aktif dan status binding - - `/session idle ` memeriksa/memperbarui pelepasan fokus otomatis karena tidak aktif untuk binding yang difokuskan + - `/session idle ` memeriksa/memperbarui auto-unfocus karena tidak aktif untuk binding yang difokuskan - `/session max-age ` memeriksa/memperbarui usia maksimum keras untuk binding yang difokuskan Config: @@ -698,18 +698,18 @@ Pengaturan default perintah slash: Catatan: - - `session.threadBindings.*` mengatur default global. - - `channels.discord.threadBindings.*` meng-override perilaku Discord. - - `spawnSubagentSessions` harus bernilai true agar thread otomatis dibuat/diikat untuk `sessions_spawn({ thread: true })`. - - `spawnAcpSessions` harus bernilai true agar thread otomatis dibuat/diikat untuk ACP (`/acp spawn ... --thread ...` atau `sessions_spawn({ runtime: "acp", thread: true })`). + - `session.threadBindings.*` menetapkan default global. + - `channels.discord.threadBindings.*` menggantikan perilaku Discord. + - `spawnSubagentSessions` harus bernilai true untuk membuat/mengikat thread otomatis bagi `sessions_spawn({ thread: true })`. + - `spawnAcpSessions` harus bernilai true untuk membuat/mengikat thread otomatis bagi ACP (`/acp spawn ... --thread ...` atau `sessions_spawn({ runtime: "acp", thread: true })`). - Jika thread binding dinonaktifkan untuk suatu akun, `/focus` dan operasi thread binding terkait tidak tersedia. Lihat [Sub-agents](/id/tools/subagents), [ACP Agents](/id/tools/acp-agents), dan [Configuration Reference](/id/gateway/configuration-reference). - - Untuk workspace ACP stabil yang "selalu aktif", konfigurasikan binding ACP typed tingkat atas yang menargetkan percakapan Discord. + + Untuk workspace ACP yang stabil dan "selalu aktif", konfigurasikan binding ACP bertipe tingkat atas yang menargetkan percakapan Discord. Jalur config: @@ -765,13 +765,13 @@ Pengaturan default perintah slash: Catatan: - - `/acp spawn codex --bind here` mengikat channel atau thread Discord saat ini di tempat dan menjaga pesan berikutnya tetap dirutekan ke sesi ACP yang sama. - - Itu tetap bisa berarti "mulai sesi ACP Codex baru", tetapi tidak membuat thread Discord baru dengan sendirinya. Channel yang ada tetap menjadi permukaan chat. - - Codex mungkin tetap berjalan di `cwd` atau workspace backend miliknya sendiri di disk. Workspace itu adalah status runtime, bukan thread Discord. - - Pesan thread dapat mewarisi binding ACP channel induk. - - Dalam channel atau thread yang terikat, `/new` dan `/reset` mereset sesi ACP yang sama di tempat. - - Thread binding sementara tetap berfungsi dan dapat meng-override resolusi target saat aktif. - - `spawnAcpSessions` hanya diperlukan saat OpenClaw perlu membuat/mengikat thread anak melalui `--thread auto|here`. Ini tidak diperlukan untuk `/acp spawn ... --bind here` di channel saat ini. + - `/acp spawn codex --bind here` mengikat saluran atau thread Discord saat ini di tempat dan menjaga agar pesan mendatang tetap dirutekan ke sesi ACP yang sama. + - Itu masih dapat berarti "memulai sesi ACP Codex baru", tetapi tidak dengan sendirinya membuat thread Discord baru. Saluran yang ada tetap menjadi permukaan chat. + - Codex mungkin tetap berjalan dalam `cwd` atau workspace backend tersendiri di disk. Workspace itu adalah state runtime, bukan thread Discord. + - Pesan thread dapat mewarisi binding ACP saluran induk. + - Dalam saluran atau thread yang terikat, `/new` dan `/reset` mereset sesi ACP yang sama di tempat. + - Thread binding sementara tetap berfungsi dan dapat menggantikan resolusi target saat aktif. + - `spawnAcpSessions` hanya diperlukan ketika OpenClaw perlu membuat/mengikat thread anak melalui `--thread auto|here`. Ini tidak diperlukan untuk `/acp spawn ... --bind here` di saluran saat ini. Lihat [ACP Agents](/id/tools/acp-agents) untuk detail perilaku binding. @@ -790,24 +790,24 @@ Pengaturan default perintah slash: - `ackReaction` mengirim emoji tanda terima saat OpenClaw sedang memproses pesan inbound. + `ackReaction` mengirim emoji pengakuan saat OpenClaw sedang memproses pesan masuk. Urutan resolusi: - `channels.discord.accounts..ackReaction` - `channels.discord.ackReaction` - `messages.ackReaction` - - fallback emoji identitas agen (`agents.list[].identity.emoji`, atau "👀") + - fallback emoji identitas agen (`agents.list[].identity.emoji`, jika tidak ada "👀") Catatan: - Discord menerima emoji unicode atau nama emoji kustom. - - Gunakan `""` untuk menonaktifkan reaksi pada channel atau akun. + - Gunakan `""` untuk menonaktifkan reaksi untuk saluran atau akun. - Penulisan config yang dipicu channel diaktifkan secara default. + Penulisan config yang dimulai dari saluran diaktifkan secara default. Ini memengaruhi alur `/config set|unset` (saat fitur perintah diaktifkan). @@ -875,14 +875,14 @@ Pengaturan default perintah slash: Catatan: - allowlist dapat menggunakan `pk:` - - nama tampilan anggota dicocokkan berdasarkan nama/slug hanya saat `channels.discord.dangerouslyAllowNameMatching: true` + - nama tampilan anggota dicocokkan berdasarkan nama/slug hanya ketika `channels.discord.dangerouslyAllowNameMatching: true` - lookup menggunakan ID pesan asli dan dibatasi oleh jendela waktu - jika lookup gagal, pesan yang diproksikan diperlakukan sebagai pesan bot dan dibuang kecuali `allowBots=true` - Pembaruan presence diterapkan saat Anda mengatur field status atau aktivitas, atau saat Anda mengaktifkan auto presence. + Pembaruan presence diterapkan ketika Anda menetapkan field status atau activity, atau saat Anda mengaktifkan auto presence. Contoh hanya status: @@ -896,13 +896,13 @@ Pengaturan default perintah slash: } ``` - Contoh aktivitas (status kustom adalah jenis aktivitas default): + Contoh activity (custom status adalah tipe activity default): ```json5 { channels: { discord: { - activity: "Waktu fokus", + activity: "Focus time", activityType: 4, }, }, @@ -923,13 +923,13 @@ Pengaturan default perintah slash: } ``` - Peta jenis aktivitas: + Peta tipe activity: - 0: Playing - 1: Streaming (memerlukan `activityUrl`) - 2: Listening - 3: Watching - - 4: Custom (menggunakan teks aktivitas sebagai status state; emoji opsional) + - 4: Custom (menggunakan teks activity sebagai status state; emoji opsional) - 5: Competing Contoh auto presence (sinyal kesehatan runtime): @@ -942,7 +942,7 @@ Pengaturan default perintah slash: enabled: true, intervalMs: 30000, minUpdateIntervalMs: 15000, - exhaustedText: "token habis", + exhaustedText: "token exhausted", }, }, }, @@ -958,39 +958,39 @@ Pengaturan default perintah slash: - Discord mendukung penanganan persetujuan berbasis tombol di DM dan secara opsional dapat memposting prompt persetujuan di channel asal. + Discord mendukung penanganan persetujuan berbasis tombol di DM dan secara opsional dapat memposting prompt persetujuan di saluran asal. Jalur config: - `channels.discord.execApprovals.enabled` - - `channels.discord.execApprovals.approvers` (opsional; fallback ke `commands.ownerAllowFrom` bila memungkinkan) + - `channels.discord.execApprovals.approvers` (opsional; fallback ke `commands.ownerAllowFrom` jika memungkinkan) - `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) - `agentFilter`, `sessionFilter`, `cleanupAfterResolve` - Discord otomatis mengaktifkan persetujuan eksekusi native saat `enabled` tidak diatur atau bernilai `"auto"` dan setidaknya satu approver dapat diresolusikan, baik dari `execApprovals.approvers` maupun dari `commands.ownerAllowFrom`. Discord tidak menyimpulkan approver eksekusi dari `allowFrom` channel, `dm.allowFrom` lama, atau `defaultTo` direct-message. Atur `enabled: false` untuk menonaktifkan Discord sebagai klien persetujuan native secara eksplisit. + Discord otomatis mengaktifkan persetujuan exec native ketika `enabled` tidak ditetapkan atau `"auto"` dan setidaknya satu approver dapat diresolusikan, baik dari `execApprovals.approvers` atau dari `commands.ownerAllowFrom`. Discord tidak menyimpulkan approver exec dari `allowFrom` saluran, `dm.allowFrom` legacy, atau `defaultTo` direct-message. Tetapkan `enabled: false` untuk menonaktifkan Discord sebagai klien persetujuan native secara eksplisit. - Saat `target` bernilai `channel` atau `both`, prompt persetujuan terlihat di channel. Hanya approver yang berhasil diresolusikan yang dapat menggunakan tombol; pengguna lain menerima penolakan ephemeral. Prompt persetujuan menyertakan teks perintah, jadi aktifkan pengiriman channel hanya pada channel tepercaya. Jika ID channel tidak dapat diturunkan dari session key, OpenClaw akan fallback ke pengiriman DM. + Saat `target` adalah `channel` atau `both`, prompt persetujuan terlihat di saluran. Hanya approver yang dapat diresolusikan yang dapat menggunakan tombol; pengguna lain menerima penolakan ephemeral. Prompt persetujuan menyertakan teks perintah, jadi hanya aktifkan pengiriman saluran di saluran tepercaya. Jika ID saluran tidak dapat diturunkan dari session key, OpenClaw kembali ke pengiriman DM. - Discord juga merender tombol persetujuan bersama yang digunakan oleh channel chat lain. Adapter Discord native terutama menambahkan perutean DM approver dan fanout channel. - Saat tombol tersebut ada, tombol itu menjadi UX persetujuan utama; OpenClaw - hanya boleh menyertakan perintah manual `/approve` ketika hasil tool menyatakan + Discord juga merender tombol persetujuan bersama yang digunakan oleh saluran chat lain. Adapter Discord native terutama menambahkan perutean DM approver dan fanout saluran. + Saat tombol-tombol itu ada, tombol tersebut adalah UX persetujuan utama; OpenClaw + hanya seharusnya menyertakan perintah `/approve` manual ketika hasil alat menyatakan persetujuan chat tidak tersedia atau persetujuan manual adalah satu-satunya jalur. - Otorisasi gateway untuk handler ini menggunakan kontrak resolusi kredensial bersama yang sama seperti klien Gateway lainnya: + Autentikasi gateway untuk handler ini menggunakan kontrak resolusi kredensial bersama yang sama seperti klien Gateway lainnya: - - auth lokal env-first (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD` lalu `gateway.auth.*`) - - dalam mode lokal, `gateway.remote.*` dapat digunakan sebagai fallback hanya saat `gateway.auth.*` tidak diatur; SecretRef lokal yang dikonfigurasi tetapi tidak dapat diresolusikan gagal tertutup - - dukungan mode remote melalui `gateway.remote.*` jika berlaku - - override URL aman terhadap override: override CLI tidak menggunakan kembali kredensial implisit, dan override env hanya menggunakan kredensial env + - autentikasi lokal env-first (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD` lalu `gateway.auth.*`) + - dalam mode lokal, `gateway.remote.*` dapat digunakan sebagai fallback hanya ketika `gateway.auth.*` tidak ditetapkan; SecretRef lokal yang dikonfigurasi namun tidak dapat diresolusikan gagal secara tertutup + - dukungan mode remote melalui `gateway.remote.*` bila berlaku + - override URL aman terhadap override: override CLI tidak menggunakan ulang kredensial implisit, dan override env hanya menggunakan kredensial env Perilaku resolusi persetujuan: - - ID dengan prefiks `plugin:` diresolusikan melalui `plugin.approval.resolve`. + - ID yang diawali `plugin:` diresolusikan melalui `plugin.approval.resolve`. - ID lainnya diresolusikan melalui `exec.approval.resolve`. - - Discord tidak melakukan hop fallback exec-ke-plugin tambahan di sini; prefiks + - Discord tidak melakukan lompatan fallback exec-ke-plugin tambahan di sini; prefiks id menentukan metode gateway mana yang dipanggil. - Persetujuan eksekusi secara default kedaluwarsa setelah 30 menit. Jika persetujuan gagal dengan + Persetujuan exec kedaluwarsa setelah 30 menit secara default. Jika persetujuan gagal dengan ID persetujuan yang tidak dikenal, verifikasi resolusi approver, pengaktifan fitur, dan bahwa jenis id persetujuan yang dikirim cocok dengan permintaan yang tertunda. @@ -999,35 +999,37 @@ Pengaturan default perintah slash: -## Tool dan gerbang aksi +## Alat dan gerbang aksi -Aksi pesan Discord mencakup perpesanan, admin channel, moderasi, presence, dan aksi metadata. +Aksi pesan Discord mencakup pesan, administrasi saluran, moderasi, presence, dan aksi metadata. Contoh inti: -- perpesanan: `sendMessage`, `readMessages`, `editMessage`, `deleteMessage`, `threadReply` +- pesan: `sendMessage`, `readMessages`, `editMessage`, `deleteMessage`, `threadReply` - reaksi: `react`, `reactions`, `emojiList` - moderasi: `timeout`, `kick`, `ban` - presence: `setPresence` +Aksi `event-create` menerima parameter `image` opsional (URL atau path file lokal) untuk menetapkan gambar sampul event terjadwal. + Gerbang aksi berada di bawah `channels.discord.actions.*`. Perilaku gerbang default: -| Grup aksi | Default | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------- | -| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | enabled | -| roles | disabled | -| moderation | disabled | -| presence | disabled | +| Kelompok aksi | Default | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | enabled | +| roles | disabled | +| moderation | disabled | +| presence | disabled | -## UI Components v2 +## UI komponen v2 -OpenClaw menggunakan Discord components v2 untuk persetujuan eksekusi dan penanda lintas konteks. Aksi pesan Discord juga dapat menerima `components` untuk UI kustom (lanjutan; memerlukan pembuatan payload komponen melalui discord tool), sementara `embeds` lama tetap tersedia tetapi tidak direkomendasikan. +OpenClaw menggunakan komponen v2 Discord untuk persetujuan exec dan penanda lintas konteks. Aksi pesan Discord juga dapat menerima `components` untuk UI kustom (lanjutan; memerlukan pembuatan payload komponen melalui alat discord), sementara `embeds` legacy tetap tersedia tetapi tidak direkomendasikan. -- `channels.discord.ui.components.accentColor` mengatur warna aksen yang digunakan oleh container komponen Discord (hex). -- Atur per akun dengan `channels.discord.accounts..ui.components.accentColor`. -- `embeds` diabaikan saat components v2 ada. +- `channels.discord.ui.components.accentColor` menetapkan warna aksen yang digunakan oleh container komponen Discord (hex). +- Tetapkan per akun dengan `channels.discord.accounts..ui.components.accentColor`. +- `embeds` diabaikan ketika komponen v2 ada. Contoh: @@ -1045,15 +1047,15 @@ Contoh: } ``` -## Channel suara +## Saluran suara -OpenClaw dapat bergabung dengan channel suara Discord untuk percakapan realtime yang berkelanjutan. Ini terpisah dari lampiran pesan suara. +OpenClaw dapat bergabung ke saluran suara Discord untuk percakapan realtime yang berkelanjutan. Ini terpisah dari lampiran pesan suara. Persyaratan: - Aktifkan perintah native (`commands.native` atau `channels.discord.commands.native`). - Konfigurasikan `channels.discord.voice`. -- Bot memerlukan izin Connect + Speak di channel suara target. +- Bot memerlukan izin Connect + Speak di saluran suara target. Gunakan perintah native khusus Discord `/vc join|leave|status` untuk mengontrol sesi. Perintah ini menggunakan agen default akun dan mengikuti aturan allowlist dan group policy yang sama seperti perintah Discord lainnya. @@ -1085,21 +1087,21 @@ Contoh auto-join: Catatan: -- `voice.tts` meng-override `messages.tts` hanya untuk pemutaran suara. -- Giliran transkrip suara menurunkan status owner dari Discord `allowFrom` (atau `dm.allowFrom`); penutur non-owner tidak dapat mengakses tool khusus owner (misalnya `gateway` dan `cron`). -- Voice diaktifkan secara default; atur `channels.discord.voice.enabled=false` untuk menonaktifkannya. +- `voice.tts` menggantikan `messages.tts` hanya untuk pemutaran suara. +- Giliran transkrip suara menurunkan status owner dari Discord `allowFrom` (atau `dm.allowFrom`); pembicara non-owner tidak dapat mengakses alat khusus owner (misalnya `gateway` dan `cron`). +- Voice diaktifkan secara default; tetapkan `channels.discord.voice.enabled=false` untuk menonaktifkannya. - `voice.daveEncryption` dan `voice.decryptionFailureTolerance` diteruskan ke opsi join `@discordjs/voice`. -- Default `@discordjs/voice` adalah `daveEncryption=true` dan `decryptionFailureTolerance=24` jika tidak diatur. -- OpenClaw juga memantau kegagalan dekripsi receive dan memulihkan secara otomatis dengan keluar/bergabung ulang ke channel suara setelah kegagalan berulang dalam jendela waktu singkat. -- Jika log receive berulang kali menampilkan `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, ini mungkin bug receive upstream `@discordjs/voice` yang dilacak di [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419). +- Default `@discordjs/voice` adalah `daveEncryption=true` dan `decryptionFailureTolerance=24` jika tidak ditetapkan. +- OpenClaw juga memantau kegagalan dekripsi saat menerima dan melakukan pemulihan otomatis dengan keluar/bergabung ulang ke saluran suara setelah kegagalan berulang dalam jangka waktu singkat. +- Jika log penerimaan berulang kali menampilkan `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, ini mungkin bug penerimaan upstream `@discordjs/voice` yang dilacak di [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419). ## Pesan suara -Pesan suara Discord menampilkan pratinjau waveform dan memerlukan audio OGG/Opus plus metadata. OpenClaw menghasilkan waveform secara otomatis, tetapi memerlukan `ffmpeg` dan `ffprobe` yang tersedia pada host gateway untuk memeriksa dan mengonversi file audio. +Pesan suara Discord menampilkan pratinjau waveform dan memerlukan audio OGG/Opus beserta metadata. OpenClaw menghasilkan waveform secara otomatis, tetapi memerlukan `ffmpeg` dan `ffprobe` tersedia di host gateway untuk memeriksa dan mengonversi file audio. Persyaratan dan batasan: -- Berikan **jalur file lokal** (URL ditolak). +- Berikan **path file lokal** (URL ditolak). - Hilangkan konten teks (Discord tidak mengizinkan teks + pesan suara dalam payload yang sama). - Format audio apa pun diterima; OpenClaw mengonversi ke OGG/Opus bila diperlukan. @@ -1120,11 +1122,11 @@ message(action="send", channel="discord", target="channel:123", path="/path/to/a - + - verifikasi `groupPolicy` - verifikasi guild allowlist di bawah `channels.discord.guilds` - - jika peta `channels` guild ada, hanya channel yang tercantum yang diizinkan + - jika peta `channels` guild ada, hanya saluran yang tercantum yang diizinkan - verifikasi perilaku `requireMention` dan pola mention Pemeriksaan yang berguna: @@ -1141,12 +1143,12 @@ openclaw logs --follow Penyebab umum: - `groupPolicy="allowlist"` tanpa guild/channel allowlist yang cocok - - `requireMention` dikonfigurasi di tempat yang salah (harus di bawah `channels.discord.guilds` atau entri channel) + - `requireMention` dikonfigurasi di tempat yang salah (harus di bawah `channels.discord.guilds` atau entri saluran) - pengirim diblokir oleh allowlist `users` guild/channel - + Log yang umum: @@ -1154,16 +1156,16 @@ openclaw logs --follow - `Slow listener detected ...` - `discord inbound worker timed out after ...` - Knob anggaran listener: + Pengaturan anggaran listener: - akun tunggal: `channels.discord.eventQueue.listenerTimeout` - multi-akun: `channels.discord.accounts..eventQueue.listenerTimeout` - Knob timeout worker run: + Pengaturan timeout run worker: - akun tunggal: `channels.discord.inboundWorker.runTimeoutMs` - multi-akun: `channels.discord.accounts..inboundWorker.runTimeoutMs` - - default: `1800000` (30 menit); atur `0` untuk menonaktifkan + - default: `1800000` (30 menit); tetapkan `0` untuk menonaktifkan Baseline yang direkomendasikan: @@ -1187,38 +1189,38 @@ openclaw logs --follow ``` Gunakan `eventQueue.listenerTimeout` untuk penyiapan listener yang lambat dan `inboundWorker.runTimeoutMs` - hanya jika Anda menginginkan katup pengaman terpisah untuk giliran agen yang diantrikan. + hanya jika Anda menginginkan katup pengaman terpisah untuk giliran agen yang masuk ke antrean. - - Pemeriksaan izin `channels status --probe` hanya berfungsi untuk ID channel numerik. + + Pemeriksaan izin `channels status --probe` hanya berfungsi untuk ID saluran numerik. - Jika Anda menggunakan key slug, pencocokan runtime masih dapat berfungsi, tetapi probe tidak dapat memverifikasi izin sepenuhnya. + Jika Anda menggunakan kunci slug, pencocokan runtime masih dapat berfungsi, tetapi probe tidak dapat sepenuhnya memverifikasi izin. - + - DM dinonaktifkan: `channels.discord.dm.enabled=false` - - kebijakan DM dinonaktifkan: `channels.discord.dmPolicy="disabled"` (lama: `channels.discord.dm.policy`) - - menunggu persetujuan pemasangan dalam mode `pairing` + - kebijakan DM dinonaktifkan: `channels.discord.dmPolicy="disabled"` (legacy: `channels.discord.dm.policy`) + - menunggu persetujuan pairing dalam mode `pairing` - Secara default, pesan yang dibuat bot diabaikan. + Secara default pesan yang ditulis bot diabaikan. - Jika Anda mengatur `channels.discord.allowBots=true`, gunakan aturan mention dan allowlist yang ketat untuk menghindari perilaku loop. - Lebih baik gunakan `channels.discord.allowBots="mentions"` agar hanya menerima pesan bot yang me-mention bot. + Jika Anda menetapkan `channels.discord.allowBots=true`, gunakan aturan mention dan allowlist yang ketat untuk menghindari perilaku loop. + Lebih pilih `channels.discord.allowBots="mentions"` agar hanya menerima pesan bot yang menyebut bot. - + - - pastikan OpenClaw selalu terbaru (`openclaw update`) agar logika pemulihan receive suara Discord tersedia - - pastikan `channels.discord.voice.daveEncryption=true` (default) - - mulai dari `channels.discord.voice.decryptionFailureTolerance=24` (default upstream) dan sesuaikan hanya jika perlu + - pastikan OpenClaw tetap terbaru (`openclaw update`) agar logika pemulihan penerimaan voice Discord tersedia + - konfirmasi `channels.discord.voice.daveEncryption=true` (default) + - mulai dari `channels.discord.voice.decryptionFailureTolerance=24` (default upstream) dan sesuaikan hanya jika diperlukan - pantau log untuk: - `discord voice: DAVE decrypt failures detected` - `discord voice: repeated decrypt failures; attempting rejoin` @@ -1238,13 +1240,13 @@ Field Discord dengan sinyal tinggi: - startup/auth: `enabled`, `token`, `accounts.*`, `allowBots` - kebijakan: `groupPolicy`, `dm.*`, `guilds.*`, `guilds.*.channels.*` - perintah: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*` -- event queue: `eventQueue.listenerTimeout` (anggaran listener), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency` +- antrean event: `eventQueue.listenerTimeout` (anggaran listener), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency` - inbound worker: `inboundWorker.runTimeoutMs` - balasan/riwayat: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` - pengiriman: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage` -- streaming: `streaming` (alias lama: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce` +- streaming: `streaming` (alias legacy: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce` - media/retry: `mediaMaxMb`, `retry` - - `mediaMaxMb` membatasi unggahan Discord outbound (default: `100MB`) + - `mediaMaxMb` membatasi unggahan Discord keluar (default: `100MB`) - aksi: `actions.*` - presence: `activity`, `status`, `activityType`, `activityUrl` - UI: `ui.components.accentColor` @@ -1252,16 +1254,16 @@ Field Discord dengan sinyal tinggi: ## Keamanan dan operasi -- Perlakukan token bot sebagai rahasia (`DISCORD_BOT_TOKEN` lebih disukai di lingkungan tersupervisi). -- Berikan izin Discord dengan hak paling minimum. -- Jika deploy/status perintah kedaluwarsa, mulai ulang gateway dan periksa ulang dengan `openclaw channels status --probe`. +- Perlakukan token bot sebagai rahasia (`DISCORD_BOT_TOKEN` lebih disukai di lingkungan yang diawasi). +- Berikan izin Discord seminimal mungkin. +- Jika deploy/state perintah basi, mulai ulang gateway dan periksa ulang dengan `openclaw channels status --probe`. ## Terkait -- [Pemasangan](/id/channels/pairing) +- [Pairing](/id/channels/pairing) - [Grup](/id/channels/groups) -- [Perutean channel](/id/channels/channel-routing) +- [Perutean saluran](/id/channels/channel-routing) - [Keamanan](/id/gateway/security) -- [Perutean multi-agent](/id/concepts/multi-agent) +- [Perutean multi-agen](/id/concepts/multi-agent) - [Pemecahan masalah](/id/channels/troubleshooting) -- [Perintah slash](/id/tools/slash-commands) +- [Slash commands](/id/tools/slash-commands) diff --git a/docs/id/concepts/dreaming.md b/docs/id/concepts/dreaming.md index 0701a0cf6..9a9ef8aa1 100644 --- a/docs/id/concepts/dreaming.md +++ b/docs/id/concepts/dreaming.md @@ -6,10 +6,10 @@ read_when: summary: Konsolidasi memori latar belakang dengan fase light, deep, dan REM serta Dream Diary title: Dreaming (eksperimental) x-i18n: - generated_at: "2026-04-06T09:13:18Z" + generated_at: "2026-04-08T09:12:40Z" model: gpt-5.4 provider: openai - source_hash: 36c4b1e70801d662090dc8ce20608c2f141c23cd7ce53c54e3dcf332c801fd4e + source_hash: 0254f3b0949158264e583c12f36f2b1a83d1b44dc4da01a1b272422d38e8655d source_path: concepts/dreaming.md workflow: 15 --- @@ -17,12 +17,12 @@ x-i18n: # Dreaming (eksperimental) Dreaming adalah sistem konsolidasi memori latar belakang di `memory-core`. -Sistem ini membantu OpenClaw memindahkan sinyal jangka pendek yang kuat ke memori yang tahan lama sambil +Ini membantu OpenClaw memindahkan sinyal jangka pendek yang kuat ke memori yang tahan lama sambil menjaga prosesnya tetap dapat dijelaskan dan ditinjau. -Dreaming bersifat **opsional** dan dinonaktifkan secara default. +Dreaming bersifat **opt-in** dan dinonaktifkan secara default. -## Apa yang ditulis dreaming +## Apa yang ditulis oleh dreaming Dreaming menyimpan dua jenis output: @@ -35,32 +35,31 @@ Promosi jangka panjang tetap hanya menulis ke `MEMORY.md`. Dreaming menggunakan tiga fase kooperatif: -| Fase | Tujuan | Penulisan permanen | -| ----- | ----------------------------------------- | ------------------ | -| Light | Mengurutkan dan menyiapkan materi jangka pendek terbaru | Tidak | -| Deep | Menilai dan mempromosikan kandidat yang tahan lama | Ya (`MEMORY.md`) | -| REM | Merefleksikan tema dan gagasan yang berulang | Tidak | +| Fase | Tujuan | Penulisan tahan lama | +| ----- | ----------------------------------------- | -------------------- | +| Light | Mengurutkan dan menyiapkan materi jangka pendek terbaru | Tidak | +| Deep | Menilai dan mempromosikan kandidat tahan lama | Ya (`MEMORY.md`) | +| REM | Merefleksikan tema dan ide yang berulang | Tidak | -Fase-fase ini adalah detail implementasi internal, bukan "mode" terpisah -yang dikonfigurasi pengguna. +Fase-fase ini adalah detail implementasi internal, bukan "mode" terpisah yang dikonfigurasi pengguna. ### Fase light Fase light mengingest sinyal memori harian terbaru dan jejak recall, menghapus duplikasi, dan menyiapkan baris kandidat. -- Membaca dari status recall jangka pendek dan file memori harian terbaru. -- Menulis blok `## Light Sleep` yang dikelola saat penyimpanan menyertakan output inline. -- Mencatat sinyal reinforcement untuk pemeringkatan deep berikutnya. +- Membaca dari status recall jangka pendek, file memori harian terbaru, dan transkrip sesi yang telah disunting bila tersedia. +- Menulis blok `## Light Sleep` yang dikelola ketika penyimpanan menyertakan output inline. +- Mencatat sinyal reinforcement untuk pemeringkatan deep nanti. - Tidak pernah menulis ke `MEMORY.md`. ### Fase deep Fase deep menentukan apa yang menjadi memori jangka panjang. -- Memberi peringkat kandidat menggunakan penilaian berbobot dan ambang batas. +- Memberi peringkat kandidat menggunakan penilaian berbobot dan ambang batas gerbang. - Mengharuskan `minScore`, `minRecallCount`, dan `minUniqueQueries` terpenuhi. -- Merehidrasi potongan dari file harian aktif sebelum menulis, sehingga potongan yang usang/dihapus dilewati. +- Merehidrasi cuplikan dari file harian aktif sebelum menulis, sehingga cuplikan yang usang/dihapus dilewati. - Menambahkan entri yang dipromosikan ke `MEMORY.md`. - Menulis ringkasan `## Deep Sleep` ke `DREAMS.md` dan secara opsional menulis `memory/dreaming/deep/YYYY-MM-DD.md`. @@ -69,14 +68,21 @@ Fase deep menentukan apa yang menjadi memori jangka panjang. Fase REM mengekstrak pola dan sinyal reflektif. - Membangun ringkasan tema dan refleksi dari jejak jangka pendek terbaru. -- Menulis blok `## REM Sleep` yang dikelola saat penyimpanan menyertakan output inline. +- Menulis blok `## REM Sleep` yang dikelola ketika penyimpanan menyertakan output inline. - Mencatat sinyal reinforcement REM yang digunakan oleh pemeringkatan deep. - Tidak pernah menulis ke `MEMORY.md`. +## Ingestion transkrip sesi + +Dreaming dapat mengingest transkrip sesi yang telah disunting ke dalam korpus dreaming. Ketika +transkrip tersedia, transkrip tersebut dimasukkan ke fase light bersama sinyal +memori harian dan jejak recall. Konten pribadi dan sensitif disunting +sebelum ingestion. + ## Dream Diary Dreaming juga menyimpan **Dream Diary** naratif di `DREAMS.md`. -Setelah setiap fase memiliki materi yang cukup, `memory-core` menjalankan giliran subagen latar belakang dengan upaya terbaik +Setelah setiap fase memiliki cukup materi, `memory-core` menjalankan giliran subagen latar belakang best-effort (menggunakan model runtime default) dan menambahkan entri diary singkat. Diary ini untuk dibaca manusia di UI Dreams, bukan sumber promosi. @@ -85,27 +91,26 @@ Diary ini untuk dibaca manusia di UI Dreams, bukan sumber promosi. Pemeringkatan deep menggunakan enam sinyal dasar berbobot ditambah reinforcement fase: -| Sinyal | Bobot | Deskripsi | +| Sinyal | Bobot | Deskripsi | | ------------------- | ------ | ------------------------------------------------- | | Frekuensi | 0.24 | Berapa banyak sinyal jangka pendek yang dikumpulkan entri | -| Relevansi | 0.30 | Kualitas pengambilan rata-rata untuk entri | -| Keragaman kueri | 0.15 | Konteks kueri/hari berbeda yang memunculkannya | -| Kebaruan | 0.15 | Skor kesegaran dengan peluruhan waktu | -| Konsolidasi | 0.10 | Kekuatan kemunculan berulang lintas hari | -| Kekayaan konseptual | 0.06 | Kepadatan tag konsep dari potongan/path | +| Relevansi | 0.30 | Rata-rata kualitas pengambilan untuk entri | +| Keragaman kueri | 0.15 | Konteks kueri/hari berbeda yang memunculkannya | +| Kebaruan | 0.15 | Skor kesegaran yang menurun seiring waktu | +| Konsolidasi | 0.10 | Kekuatan kemunculan ulang lintas hari | +| Kekayaan konseptual | 0.06 | Kepadatan tag konsep dari cuplikan/path | -Hit fase light dan REM menambahkan peningkatan kecil dengan peluruhan kebaruan dari +Hit fase Light dan REM menambahkan dorongan kecil yang menurun seiring waktu dari `memory/.dreams/phase-signals.json`. ## Penjadwalan -Saat diaktifkan, `memory-core` mengelola secara otomatis satu pekerjaan cron untuk satu sapuan dreaming -penuh. Setiap sapuan menjalankan fase secara berurutan: light -> REM -> deep. +Saat diaktifkan, `memory-core` mengelola secara otomatis satu cron job untuk satu sapuan dreaming penuh. Setiap sapuan menjalankan fase secara berurutan: light -> REM -> deep. Perilaku kadens default: -| Pengaturan | Default | -| ------------------- | ----------- | +| Pengaturan | Default | +| -------------------- | ----------- | | `dreaming.frequency` | `0 3 * * *` | ## Mulai cepat @@ -168,7 +173,7 @@ openclaw memory promote --limit 5 openclaw memory status --deep ``` -`memory promote` manual menggunakan ambang batas fase deep secara default kecuali ditimpa +`memory promote` manual menggunakan ambang fase deep secara default kecuali dioverride dengan flag CLI. Jelaskan mengapa kandidat tertentu akan atau tidak akan dipromosikan: @@ -178,7 +183,7 @@ openclaw memory promote-explain "router vlan" openclaw memory promote-explain "router vlan" --json ``` -Pratinjau refleksi REM, kebenaran kandidat, dan output promosi deep tanpa +Pratinjau refleksi REM, candidate truths, dan output promosi deep tanpa menulis apa pun: ```bash @@ -190,30 +195,30 @@ openclaw memory rem-harness --json Semua pengaturan berada di bawah `plugins.entries.memory-core.config.dreaming`. -| Kunci | Default | +| Key | Default | | ----------- | ----------- | | `enabled` | `false` | | `frequency` | `0 3 * * *` | -Kebijakan fase, ambang batas, dan perilaku penyimpanan adalah detail implementasi -internal (bukan konfigurasi yang ditujukan untuk pengguna). +Kebijakan fase, ambang batas, dan perilaku penyimpanan adalah detail implementasi internal +(bukan konfigurasi yang dihadapkan ke pengguna). -Lihat [Referensi konfigurasi Memory](/id/reference/memory-config#dreaming-experimental) -untuk daftar kunci lengkap. +Lihat [Referensi konfigurasi memory](/id/reference/memory-config#dreaming-experimental) +untuk daftar key lengkap. ## UI Dreams Saat diaktifkan, tab **Dreams** di Gateway menampilkan: -- status aktif dreaming saat ini -- status tingkat fase dan keberadaan sapuan terkelola +- status dreaming aktif saat ini +- status tingkat fase dan keberadaan managed-sweep - jumlah jangka pendek, jangka panjang, dan yang dipromosikan hari ini -- waktu jalan terjadwal berikutnya +- waktu proses terjadwal berikutnya - pembaca Dream Diary yang dapat diperluas yang didukung oleh `doctor.memory.dreamDiary` ## Terkait - [Memory](/id/concepts/memory) -- [Memory Search](/id/concepts/memory-search) +- [Pencarian Memory](/id/concepts/memory-search) - [CLI memory](/cli/memory) -- [Referensi konfigurasi Memory](/id/reference/memory-config) +- [Referensi konfigurasi memory](/id/reference/memory-config) diff --git a/docs/id/gateway/configuration-reference.md b/docs/id/gateway/configuration-reference.md index be7720b3c..4f05af9fd 100644 --- a/docs/id/gateway/configuration-reference.md +++ b/docs/id/gateway/configuration-reference.md @@ -1,28 +1,28 @@ --- read_when: - - Anda memerlukan semantik atau nilai default konfigurasi tingkat bidang yang tepat - - 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 + - Anda memerlukan semantik atau nilai default konfigurasi yang tepat pada tingkat field + - Anda sedang memvalidasi blok konfigurasi channel, model, gateway, atau tool +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-08T06:07:00Z" + generated_at: "2026-04-08T09:18:00Z" model: gpt-5.4 provider: openai - source_hash: 2f9ab34fb56897a77cb038d95bea21e8530d8f0402b66d1ee97c73822a1e8fd4 + source_hash: fd5f69050455e610fc7c825d95f546a16aa867b8a9c0d692a48de36419b0afc2 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 [Configuration](/id/gateway/configuration). -Halaman ini mencakup permukaan konfigurasi utama OpenClaw dan menautkan keluar saat sebuah subsistem memiliki referensi mendalamnya sendiri. Halaman ini **tidak** mencoba menyisipkan setiap katalog perintah milik channel/plugin atau setiap knob memori/QMD mendalam dalam satu halaman. +Halaman ini mencakup permukaan konfigurasi utama OpenClaw dan menautkan ke luar saat sebuah subsistem memiliki referensi lebih mendalamnya sendiri. Halaman ini **tidak** mencoba menyisipkan setiap katalog perintah milik channel/plugin atau setiap knob memori/QMD mendalam ke dalam satu halaman. Sumber kebenaran kode: -- `openclaw config schema` mencetak JSON Schema aktif yang digunakan untuk validasi dan Control UI, dengan metadata bundled/plugin/channel digabungkan jika tersedia -- `config.schema.lookup` mengembalikan satu node skema dengan cakupan path untuk alat penelusuran mendalam +- `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 jalur untuk tool penelusuran mendalam - `pnpm config:docs:check` / `pnpm config:docs:gen` memvalidasi hash baseline dokumen konfigurasi terhadap permukaan skema saat ini Referensi mendalam khusus: @@ -31,40 +31,40 @@ Referensi mendalam khusus: - [Slash Commands](/id/tools/slash-commands) untuk katalog perintah built-in + 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 saat dihilangkan. +Format konfigurasi adalah **JSON5** (komentar + koma di akhir diperbolehkan). Semua field bersifat opsional — OpenClaw menggunakan nilai default aman saat dihilangkan. --- ## Channel -Setiap channel mulai secara otomatis saat bagian konfigurasinya ada (kecuali `enabled: false`). +Setiap channel dimulai secara otomatis saat bagian konfigurasinya ada (kecuali `enabled: false`). ### Akses DM dan grup Semua channel mendukung kebijakan DM dan kebijakan grup: -| Kebijakan DM | Perilaku | -| ------------------- | ------------------------------------------------------------- | -| `pairing` (default) | Pengirim yang tidak dikenal mendapat kode pairing satu kali; 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 tidak dikenal mendapat kode pairing sekali pakai; pemilik harus menyetujui | +| `allowlist` | Hanya pengirim di `allowFrom` (atau penyimpanan izin pairing) | +| `open` | Izinkan semua DM masuk (memerlukan `allowFrom: ["*"]`) | +| `disabled` | Abaikan semua DM masuk | -| Kebijakan grup | Perilaku | -| --------------------- | ------------------------------------------------------- | +| Kebijakan grup | Perilaku | +| --------------------- | ----------------------------------------------------- | | `allowlist` (default) | Hanya grup yang cocok dengan allowlist yang dikonfigurasi | -| `open` | Lewati allowlist grup (mention-gating tetap berlaku) | -| `disabled` | Blokir semua pesan grup/room | +| `open` | Lewati allowlist grup (gating mention tetap berlaku) | +| `disabled` | Blokir semua pesan grup/room | -`channels.defaults.groupPolicy` menetapkan default saat `groupPolicy` penyedia 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. +`channels.defaults.groupPolicy` menetapkan default saat `groupPolicy` milik provider tidak disetel. +Kode pairing kedaluwarsa setelah 1 jam. Permintaan pairing DM yang tertunda dibatasi **3 per channel**. +Jika sebuah blok provider tidak ada sama sekali (`channels.` tidak ada), kebijakan grup runtime kembali ke `allowlist` (gagal-tertutup) 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 berlaku saat sebuah sesi belum memiliki override model (misalnya, diatur 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 sebuah sesi belum memiliki override model (misalnya, disetel 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 seluruh penyedia: +Gunakan `channels.defaults` untuk perilaku kebijakan grup dan heartbeat bersama di semua 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 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 mempertahankan konteks kutipan/balasan eksplisit). Override per channel: `channels..contextVisibility`. -- `channels.defaults.heartbeat.showOk`: sertakan status channel sehat dalam output heartbeat. -- `channels.defaults.heartbeat.showAlerts`: sertakan status menurun/error dalam output heartbeat. -- `channels.defaults.heartbeat.useIndicator`: render output heartbeat bergaya indikator yang ringkas. +- `channels.defaults.groupPolicy`: kebijakan grup fallback saat `groupPolicy` tingkat provider 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 kutip/balas yang eksplisit). Override per-channel: `channels..contextVisibility`. +- `channels.defaults.heartbeat.showOk`: sertakan status channel yang sehat dalam output heartbeat. +- `channels.defaults.heartbeat.showAlerts`: sertakan status yang menurun/error dalam output heartbeat. +- `channels.defaults.heartbeat.useIndicator`: tampilkan output heartbeat bergaya indikator ringkas. ### WhatsApp -WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai secara otomatis saat ada sesi yang tertaut. +WhatsApp berjalan melalui channel web gateway (Baileys Web). Ini dimulai secara otomatis saat ada sesi tertaut. ```json5 { @@ -124,7 +124,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s textChunkLimit: 4000, chunkMode: "length", // length | newline mediaMaxMb: 50, - sendReadReceipts: true, // blue ticks (false in self-chat mode) + sendReadReceipts: true, // centang biru (false dalam mode self-chat) groups: { "*": { requireMention: true }, }, @@ -164,10 +164,10 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s } ``` -- Perintah keluar default ke akun `default` jika ada; jika tidak, ke ID akun terkonfigurasi pertama (diurutkan). -- `channels.whatsapp.defaultAccount` opsional menimpa pemilihan akun default fallback itu jika 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`. +- Perintah outbound secara default memakai akun `default` jika ada; jika tidak, ID akun pertama yang dikonfigurasi (diurutkan). +- `channels.whatsapp.defaultAccount` opsional menggantikan fallback pemilihan akun default itu saat cocok dengan ID akun yang dikonfigurasi. +- Direktori auth Baileys satu akun lama dimigrasikan oleh `openclaw doctor` ke `whatsapp/default`. +- Override per-akun: `channels.whatsapp.accounts..sendReadReceipts`, `channels.whatsapp.accounts..dmPolicy`, `channels.whatsapp.accounts..allowFrom`. @@ -225,13 +225,13 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s } ``` -- 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 menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Dalam pengaturan multi-akun (2+ ID akun), tetapkan default eksplisit (`channels.telegram.defaultAccount` atau `channels.telegram.accounts.default`) untuk menghindari perutean fallback; `openclaw doctor` memberi peringatan saat ini tidak ada atau tidak valid. -- `configWrites: false` memblokir penulisan konfigurasi yang dimulai dari 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 dalam `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Token bot: `channels.telegram.botToken` atau `channels.telegram.tokenFile` (hanya file reguler; 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 fallback routing; `openclaw doctor` memperingatkan bila ini hilang 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 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). +- Kebijakan retry: lihat [Retry policy](/id/concepts/retry). ### Discord @@ -297,7 +297,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s enabled: true, idleHours: 24, maxAgeHours: 0, - spawnSubagentSessions: false, // opt-in for sessions_spawn({ thread: true }) + spawnSubagentSessions: false, // opt-in untuk sessions_spawn({ thread: true }) }, voice: { enabled: true, @@ -334,33 +334,33 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s ``` - Token: `channels.discord.token`, dengan `DISCORD_BOT_TOKEN` sebagai fallback untuk akun default. -- Panggilan keluar langsung yang menyediakan `token` Discord eksplisit menggunakan token itu untuk panggilan tersebut; pengaturan retry/kebijakan akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. -- `channels.discord.defaultAccount` opsional menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- Panggilan outbound langsung yang memberikan `token` Discord eksplisit memakai token itu 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 `#`). Sebaiknya gunakan ID guild. -- Pesan yang ditulis bot diabaikan secara default. `allowBots: true` mengizinkannya; 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 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) +- Slug guild berupa huruf kecil dengan spasi diganti `-`; kunci channel memakai nama yang sudah di-slug (tanpa `#`). Gunakan 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 disaring). +- `channels.discord.guilds..ignoreOtherMentions` (dan override channel) menjatuhkan pesan yang menyebut pengguna atau role lain tetapi bukan bot (tidak termasuk @everyone/@here). +- `maxLinesPerMessage` (default 17) memecah pesan tinggi meski di bawah 2000 karakter. +- `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 dalam `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). -- `channels.discord.ui.components.accentColor` menetapkan warna aksen untuk container Discord components v2. +- 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 container komponen Discord v2. - `channels.discord.voice` mengaktifkan percakapan channel suara Discord dan 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/masuk kembali ke sesi suara setelah kegagalan dekripsi berulang. - `channels.discord.streaming` adalah kunci 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 mengizinkan override teks status opsional. -- `channels.discord.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan nama/tag yang bisa berubah (mode kompatibilitas break-glass). +- `channels.discord.autoPresence` memetakan ketersediaan runtime ke presence bot (sehat => online, menurun => idle, habis => dnd) dan mengizinkan override teks status opsional. +- `channels.discord.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan nama/tag yang dapat berubah (mode kompatibilitas darurat). - `channels.discord.execApprovals`: pengiriman approval exec native Discord dan otorisasi approver. - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, approval exec aktif saat approver dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. - - `approvers`: ID pengguna Discord yang diizinkan menyetujui permintaan exec. Fallback ke `commands.ownerAllowFrom` jika dihilangkan. - - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan approval bagi semua agen. + - `approvers`: ID pengguna Discord yang diizinkan menyetujui permintaan exec. Menggunakan fallback ke `commands.ownerAllowFrom` jika dihilangkan. + - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan approval untuk semua agen. - `sessionFilter`: pola kunci sesi opsional (substring atau regex). - - `target`: tempat mengirim prompt approval. `"dm"` (default) mengirim ke DM approver, `"channel"` mengirim ke channel asal, `"both"` mengirim ke keduanya. Saat target mencakup `"channel"`, tombol hanya bisa digunakan oleh approver yang berhasil di-resolve. - - `cleanupAfterResolve`: saat `true`, menghapus DM approval setelah approval, penolakan, atau timeout. + - `target`: tempat mengirim prompt approval. `"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 approval setelah disetujui, ditolak, atau timeout. **Mode notifikasi reaksi:** `off` (tidak ada), `own` (pesan bot, default), `all` (semua pesan), `allowlist` (dari `guilds..users` pada semua pesan). @@ -397,7 +397,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s - 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 bisa berubah (mode kompatibilitas break-glass). +- `channels.googlechat.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan principal email yang dapat berubah (mode kompatibilitas darurat). ### Slack @@ -449,7 +449,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s chunkMode: "length", streaming: { mode: "partial", // off | partial | block | progress - nativeTransport: true, // use Slack native streaming API when mode=partial + nativeTransport: true, // gunakan API streaming native Slack saat mode=partial }, mediaMaxMb: 20, execApprovals: { @@ -465,34 +465,34 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini mulai s ``` - **Socket mode** memerlukan `botToken` dan `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` untuk fallback env akun default). -- **HTTP mode** memerlukan `botToken` plus `signingSecret` (di root atau per akun). +- **HTTP mode** 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 +- Snapshot akun Slack mengekspos field sumber/status per-kredensial seperti `botTokenSource`, `botTokenStatus`, `appTokenStatus`, dan, dalam mode HTTP, - `signingSecretStatus`. `configured_unavailable` berarti akun tersebut - dikonfigurasi melalui SecretRef tetapi path perintah/runtime saat ini tidak dapat - me-resolve nilai secret. -- `configWrites: false` memblokir penulisan konfigurasi yang dimulai dari Slack. -- `channels.slack.defaultAccount` opsional menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. + `signingSecretStatus`. `configured_unavailable` berarti akun + dikonfigurasi melalui SecretRef tetapi jalur perintah/runtime saat ini tidak dapat + me-resolve nilai rahasia. +- `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. - Gunakan `user:` (DM) atau `channel:` untuk target pengiriman. **Mode notifikasi reaksi:** `off`, `own` (default), `all`, `allowlist` (dari `reactionAllowlist`). -**Isolasi sesi thread:** `thread.historyScope` bersifat per-thread (default) atau dibagikan di seluruh channel. `thread.inheritParent` menyalin transkrip channel induk ke thread baru. +**Isolasi sesi thread:** `thread.historyScope` adalah per-thread (default) atau dibagi 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 balasan thread. DM tingkat atas tetap di luar thread secara default, jadi menggunakan `typingReaction` atau pengiriman normal alih-alih pratinjau bergaya thread. +- Streaming native Slack plus status thread gaya asisten Slack "is typing..." memerlukan target thread balasan. DM tingkat atas tetap di luar thread secara default, jadi mereka 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 approval exec native Slack dan otorisasi approver. Skema sama dengan Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (ID pengguna Slack), `agentFilter`, `sessionFilter`, dan `target` (`"dm"`, `"channel"`, atau `"both"`). +- `channels.slack.execApprovals`: pengiriman approval exec native Slack dan otorisasi approver. Skema yang sama seperti Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (ID pengguna Slack), `agentFilter`, `sessionFilter`, dan `target` (`"dm"`, `"channel"`, atau `"both"`). -| Grup aksi | Default | Catatan | -| ------------ | ------- | ----------------------- | -| reactions | enabled | React + daftar reaksi | -| messages | enabled | Baca/kirim/edit/hapus | -| pins | enabled | Pin/unpin/daftar | -| memberInfo | enabled | Informasi anggota | -| emojiList | enabled | Daftar emoji kustom | +| Grup action | Default | Catatan | +| ----------- | ------- | ---------------------- | +| reactions | enabled | React + daftar reaksi | +| messages | enabled | Baca/kirim/edit/hapus | +| pins | enabled | Sematkan/lepas/daftar | +| memberInfo | enabled | Info anggota | +| emojiList | enabled | Daftar emoji kustom | ### Mattermost @@ -516,7 +516,7 @@ Mattermost dikirim sebagai plugin: `openclaw plugins install @openclaw/mattermos native: true, // opt-in nativeSkills: true, callbackPath: "/api/channels/mattermost/command", - // Optional explicit URL for reverse-proxy/public deployments + // URL eksplisit opsional untuk deployment reverse-proxy/publik callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, textChunkLimit: 4000, @@ -526,23 +526,23 @@ Mattermost dikirim sebagai plugin: `openclaw plugins install @openclaw/mattermos } ``` -Mode chat: `oncall` (merespons pada @-mention, default), `onmessage` (setiap pesan), `onchar` (pesan yang diawali prefiks pemicu). +Mode chat: `oncall` (merespons pada @-mention, default), `onmessage` (setiap pesan), `onchar` (pesan yang diawali prefix pemicu). Saat perintah native Mattermost diaktifkan: -- `commands.callbackPath` harus berupa path (misalnya `/api/channels/mattermost/command`), bukan URL penuh. -- `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 - oleh Mattermost saat registrasi slash command. Jika registrasi gagal atau tidak ada +- `commands.callbackPath` harus berupa path (misalnya `/api/channels/mattermost/command`), bukan URL lengkap. +- `commands.callbackUrl` harus mengarah ke endpoint gateway OpenClaw dan dapat dijangkau dari server Mattermost. +- Callback slash native diautentikasi dengan token per-perintah yang dikembalikan + oleh Mattermost selama registrasi slash command. Jika registrasi gagal atau tidak ada perintah yang diaktifkan, OpenClaw menolak callback dengan `Unauthorized: invalid command token.` - Untuk host callback privat/tailnet/internal, Mattermost mungkin memerlukan - `ServiceSettings.AllowedUntrustedInternalConnections` untuk menyertakan host/domain callback. - Gunakan nilai host/domain, bukan URL penuh. -- `channels.mattermost.configWrites`: izinkan atau tolak penulisan konfigurasi yang dimulai dari Mattermost. -- `channels.mattermost.requireMention`: mewajibkan `@mention` sebelum membalas di channel. -- `channels.mattermost.groups..requireMention`: override mention-gating per channel (`"*"` untuk default). -- `channels.mattermost.defaultAccount` opsional menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. + `ServiceSettings.AllowedUntrustedInternalConnections` untuk mencakup host/domain callback. + Gunakan nilai host/domain, bukan URL lengkap. +- `channels.mattermost.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu Mattermost. +- `channels.mattermost.requireMention`: memerlukan `@mention` sebelum membalas di channel. +- `channels.mattermost.groups..requireMention`: override gating mention per-channel (`"*"` untuk default). +- `channels.mattermost.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. ### Signal @@ -551,7 +551,7 @@ Saat perintah native Mattermost diaktifkan: channels: { signal: { enabled: true, - account: "+15555550123", // optional account binding + account: "+15555550123", // binding akun opsional dmPolicy: "pairing", allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], configWrites: true, @@ -566,8 +566,8 @@ Saat perintah native Mattermost diaktifkan: **Mode notifikasi reaksi:** `off`, `own` (default), `all`, `allowlist` (dari `reactionAllowlist`). - `channels.signal.account`: sematkan startup channel ke identitas akun Signal tertentu. -- `channels.signal.configWrites`: izinkan atau tolak penulisan konfigurasi yang dimulai dari Signal. -- `channels.signal.defaultAccount` opsional menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- `channels.signal.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu Signal. +- `channels.signal.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. ### BlueBubbles @@ -579,16 +579,16 @@ BlueBubbles adalah jalur iMessage yang direkomendasikan (didukung plugin, dikonf bluebubbles: { enabled: true, dmPolicy: "pairing", - // serverUrl, password, webhookPath, group controls, and advanced actions: - // see /channels/bluebubbles + // serverUrl, password, webhookPath, kontrol grup, dan action lanjutan: + // lihat /channels/bluebubbles }, }, } ``` -- Path kunci inti yang dicakup di sini: `channels.bluebubbles`, `channels.bluebubbles.dmPolicy`. -- `channels.bluebubbles.defaultAccount` opsional menimpa 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). +- Jalur kunci 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 field bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). - Konfigurasi channel BlueBubbles lengkap didokumentasikan di [BlueBubbles](/id/channels/bluebubbles). ### iMessage @@ -617,15 +617,15 @@ OpenClaw menjalankan `imsg rpc` (JSON-RPC melalui stdio). Tidak memerlukan daemo } ``` -- `channels.imessage.defaultAccount` opsional menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- `channels.imessage.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. - Memerlukan Full Disk Access ke DB Messages. -- Sebaiknya gunakan 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. +- Gunakan target `chat_id:`. Gunakan `imsg chats --limit 20` untuk mencantumkan chat. +- `cliPath` dapat menunjuk ke wrapper SSH; setel `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 ketat, jadi pastikan host key relay sudah ada di `~/.ssh/known_hosts`. -- `channels.imessage.configWrites`: izinkan atau tolak penulisan konfigurasi yang dimulai dari 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). +- SCP menggunakan pemeriksaan host-key yang 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 field bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). @@ -638,7 +638,7 @@ exec ssh -T gateway-host imsg "$@" ### Matrix -Matrix didukung ekstensi dan dikonfigurasi di bawah `channels.matrix`. +Matrix didukung extension dan dikonfigurasi di bawah `channels.matrix`. ```json5 { @@ -668,25 +668,25 @@ Matrix didukung ekstensi dan dikonfigurasi di bawah `channels.matrix`. } ``` -- Autentikasi token menggunakan `accessToken`; autentikasi password menggunakan `userId` + `password`. -- `channels.matrix.proxy` merutekan lalu lintas HTTP Matrix melalui proxy HTTP(S) eksplisit. Akun bernama dapat menimpanya dengan `channels.matrix.accounts..proxy`. +- Auth token menggunakan `accessToken`; auth password menggunakan `userId` + `password`. +- `channels.matrix.proxy` merutekan lalu lintas HTTP Matrix melalui proxy HTTP(S) eksplisit. Akun bernama dapat meng-override-nya 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.autoJoin` default ke `off`, sehingga room yang diundang dan undangan gaya DM baru diabaikan sampai Anda menetapkan `autoJoin: "allowlist"` dengan `autoJoinAllowlist` atau `autoJoin: "always"`. +- `channels.matrix.autoJoin` default ke `off`, jadi room undangan dan undangan gaya DM baru diabaikan sampai Anda menyetel `autoJoin: "allowlist"` dengan `autoJoinAllowlist` atau `autoJoin: "always"`. - `channels.matrix.execApprovals`: pengiriman approval exec native Matrix dan otorisasi approver. - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, approval 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 approval bagi semua agen. + - `approvers`: ID pengguna Matrix (misalnya `@owner:example.org`) yang diizinkan menyetujui permintaan exec. + - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan approval untuk semua agen. - `sessionFilter`: pola kunci sesi opsional (substring atau regex). - `target`: tempat mengirim prompt approval. `"dm"` (default), `"channel"` (room asal), atau `"both"`. - - Override per akun: `channels.matrix.accounts..execApprovals`. -- `channels.matrix.dm.sessionScope` mengontrol bagaimana 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 langsung menggunakan kebijakan proxy yang sama dengan lalu lintas runtime. + - Override per-akun: `channels.matrix.accounts..execApprovals`. +- `channels.matrix.dm.sessionScope` mengontrol bagaimana DM Matrix dikelompokkan ke dalam sesi: `per-user` (default) dibagi 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 setup didokumentasikan di [Matrix](/id/channels/matrix). ### Microsoft Teams -Microsoft Teams didukung ekstensi dan dikonfigurasi di bawah `channels.msteams`. +Microsoft Teams didukung extension dan dikonfigurasi di bawah `channels.msteams`. ```json5 { @@ -694,19 +694,19 @@ Microsoft Teams didukung ekstensi dan dikonfigurasi di bawah `channels.msteams`. msteams: { enabled: true, configWrites: true, - // appId, appPassword, tenantId, webhook, team/channel policies: - // see /channels/msteams + // appId, appPassword, tenantId, webhook, kebijakan team/channel: + // lihat /channels/msteams }, }, } ``` -- Path kunci inti yang dicakup di sini: `channels.msteams`, `channels.msteams.configWrites`. -- Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, override per team/per channel) didokumentasikan di [Microsoft Teams](/id/channels/msteams). +- Jalur kunci inti yang dicakup di sini: `channels.msteams`, `channels.msteams.configWrites`. +- Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, override per-team/per-channel) didokumentasikan di [Microsoft Teams](/id/channels/msteams). ### IRC -IRC didukung ekstensi dan dikonfigurasi di bawah `channels.irc`. +IRC didukung extension dan dikonfigurasi di bawah `channels.irc`. ```json5 { @@ -727,13 +727,13 @@ IRC didukung ekstensi dan dikonfigurasi di bawah `channels.irc`. } ``` -- Path kunci inti yang dicakup di sini: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`. -- `channels.irc.defaultAccount` opsional menimpa pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Konfigurasi channel IRC lengkap (host/port/TLS/channel/allowlist/mention gating) didokumentasikan di [IRC](/id/channels/irc). +- Jalur kunci 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/channel/allowlist/gating mention) didokumentasikan di [IRC](/id/channels/irc). ### Multi-akun (semua channel) -Jalankan banyak akun per channel (masing-masing dengan `accountId` sendiri): +Jalankan beberapa akun per channel (masing-masing dengan `accountId` sendiri): ```json5 { @@ -756,26 +756,26 @@ Jalankan banyak 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 ditimpa per akun. +- Pengaturan channel dasar berlaku untuk semua akun kecuali di-override 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) ketika masih menggunakan konfigurasi channel akun tunggal tingkat atas, OpenClaw terlebih dahulu mempromosikan nilai akun tunggal tingkat atas yang bercakupan akun ke peta akun channel agar akun asli tetap berfungsi. Sebagian besar channel memindahkannya ke `channels..accounts.default`; Matrix dapat mempertahankan target bernama/default yang sudah cocok. -- Binding khusus channel yang sudah ada (tanpa `accountId`) tetap cocok dengan akun default; binding bercakupan akun tetap opsional. -- `openclaw doctor --fix` juga memperbaiki shape campuran dengan memindahkan nilai akun tunggal tingkat atas yang bercakupan akun ke akun yang dipromosikan yang dipilih untuk channel itu. Sebagian besar channel menggunakan `accounts.default`; Matrix dapat mempertahankan target bernama/default yang sudah cocok. +- Jika Anda menambahkan akun non-default melalui `openclaw channels add` (atau onboarding channel) saat masih berada pada konfigurasi channel tingkat atas satu akun, OpenClaw terlebih dahulu mempromosikan nilai satu akun 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 cocok. +- Binding channel-only 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 satu akun tingkat atas yang dicakup akun ke akun yang dipromosikan yang dipilih untuk channel itu. Sebagian besar channel menggunakan `accounts.default`; Matrix dapat mempertahankan target bernama/default yang sudah cocok. -### Channel ekstensi lainnya +### Channel extension lainnya -Banyak channel ekstensi dikonfigurasi sebagai `channels.` dan didokumentasikan di halaman channel khusus mereka (misalnya Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, dan Twitch). -Lihat indeks channel lengkap: [Channel](/id/channels). +Banyak channel extension dikonfigurasi sebagai `channels.` dan didokumentasikan di halaman channel khususnya (misalnya Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, dan Twitch). +Lihat indeks channel lengkap: [Channels](/id/channels). -### Mention gating chat grup +### Gating 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. **Jenis mention:** - **Mention metadata**: @-mention native platform. Diabaikan dalam mode self-chat WhatsApp. -- **Pola teks**: pola regex aman dalam `agents.list[].groupChat.mentionPatterns`. Pola yang tidak valid dan pengulangan bertingkat yang tidak aman diabaikan. -- Mention gating diterapkan hanya saat deteksi memungkinkan (mention native atau setidaknya satu pola). +- **Pola teks**: pola regex aman di `agents.list[].groupChat.mentionPatterns`. Pola tidak valid dan repetisi bertingkat yang tidak aman diabaikan. +- Gating mention diterapkan hanya saat deteksi dimungkinkan (mention native atau setidaknya satu pola). ```json5 { @@ -788,7 +788,7 @@ Pesan grup secara default **memerlukan mention** (mention metadata atau pola reg } ``` -`messages.groupChat.historyLimit` menetapkan default global. Channel dapat menimpanya dengan `channels..historyLimit` (atau per akun). Tetapkan `0` untuk menonaktifkan. +`messages.groupChat.historyLimit` menetapkan default global. Channel dapat meng-override dengan `channels..historyLimit` (atau per-akun). Setel `0` untuk menonaktifkan. #### Batas riwayat DM @@ -805,13 +805,13 @@ 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`. #### Mode self-chat -Sertakan nomor Anda sendiri dalam `allowFrom` untuk mengaktifkan mode self-chat (mengabaikan @-mention native, hanya merespons pola teks): +Sertakan nomor Anda sendiri di `allowFrom` untuk mengaktifkan mode self-chat (mengabaikan @-mention native, hanya merespons pola teks): ```json5 { @@ -837,16 +837,16 @@ Sertakan nomor Anda sendiri dalam `allowFrom` untuk mengaktifkan mode self-chat ```json5 { commands: { - native: "auto", // register native commands when supported - nativeSkills: "auto", // register native skill commands when supported - text: true, // parse /commands in chat messages - bash: false, // allow ! (alias: /bash) + native: "auto", // daftarkan perintah native saat didukung + nativeSkills: "auto", // daftarkan perintah skill native saat didukung + text: true, // parse /commands dalam pesan chat + bash: false, // izinkan ! (alias: /bash) bashForegroundMs: 2000, - config: false, // allow /config - mcp: false, // allow /mcp - plugins: false, // allow /plugins - debug: false, // allow /debug - restart: true, // allow /restart + gateway restart tool + config: false, // izinkan /config + mcp: false, // izinkan /mcp + plugins: false, // izinkan /plugins + debug: false, // izinkan /debug + restart: true, // izinkan /restart + tool restart gateway ownerAllowFrom: ["discord:123456789012345678"], ownerDisplay: "raw", // raw | hash ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}", @@ -861,28 +861,28 @@ Sertakan nomor Anda sendiri dalam `allowFrom` untuk mengaktifkan mode self-chat -- 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 mereka serta [Slash Commands](/id/tools/slash-commands). +- Blok ini mengonfigurasi permukaan perintah. Untuk katalog 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 mereka ditambah [Slash Commands](/id/tools/slash-commands). - Perintah teks harus berupa pesan **mandiri** dengan awalan `/`. -- `native: "auto"` menyalakan perintah native untuk Discord/Telegram, membiarkan Slack nonaktif. -- `nativeSkills: "auto"` menyalakan perintah skill native untuk Discord/Telegram, membiarkan Slack nonaktif. -- Override per channel: `channels.discord.commands.native` (bool atau `"auto"`). `false` menghapus perintah yang sebelumnya didaftarkan. -- Override registrasi skill native per channel dengan `channels..commands.nativeSkills`. -- `channels.telegram.customCommands` menambahkan entri menu bot Telegram ekstra. -- `bash: true` mengaktifkan `! ` untuk shell host. Memerlukan `tools.elevated.enabled` dan pengirim ada dalam `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 dengan cakupan tulis normal. +- `native: "auto"` mengaktifkan perintah native untuk Discord/Telegram, membiarkan Slack nonaktif. +- `nativeSkills: "auto"` mengaktifkan perintah skill native untuk Discord/Telegram, 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 berada 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 read-only tetap tersedia untuk klien operator dengan cakupan tulis normal. - `mcp: true` mengaktifkan `/mcp` untuk konfigurasi server MCP yang dikelola OpenClaw di bawah `mcp.servers`. -- `plugins: true` mengaktifkan `/plugins` untuk discovery plugin, install, dan kontrol enable/disable. +- `plugins: true` mengaktifkan `/plugins` untuk penemuan, instalasi, dan kontrol enable/disable plugin. - `channels..configWrites` mengontrol mutasi konfigurasi per channel (default: true). - Untuk channel multi-akun, `channels..accounts..configWrites` juga mengontrol 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 explicit owner allowlist untuk perintah/alat khusus owner. Ini terpisah dari `allowFrom`. -- `ownerDisplay: "hash"` melakukan hash pada ID owner di system prompt. Atur `ownerDisplaySecret` untuk mengontrol hashing. -- `allowFrom` bersifat per penyedia. Saat diatur, ini adalah **satu-satunya** sumber otorisasi (allowlist/pairing channel dan `useAccessGroups` diabaikan). -- `useAccessGroups: false` memungkinkan perintah melewati kebijakan grup akses saat `allowFrom` tidak diatur. +- `restart: false` menonaktifkan `/restart` dan action tool restart gateway. Default: `true`. +- `ownerAllowFrom` adalah allowlist pemilik eksplisit untuk perintah/tool khusus pemilik. Ini terpisah dari `allowFrom`. +- `ownerDisplay: "hash"` meng-hash ID pemilik di system prompt. Setel `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 dokumen perintah: - katalog built-in + bundled: [Slash Commands](/id/tools/slash-commands) - - permukaan perintah khusus channel: [Channel](/id/channels) + - 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) @@ -906,7 +906,7 @@ Default: `~/.openclaw/workspace`. ### `agents.defaults.repoRoot` -Root repository opsional yang ditampilkan pada baris Runtime di system prompt. Jika tidak diatur, OpenClaw mendeteksi otomatis dengan menelusuri ke atas dari workspace. +Root repository opsional yang ditampilkan dalam baris Runtime pada system prompt. Jika tidak disetel, OpenClaw mendeteksi otomatis dengan menelusuri ke atas dari workspace. ```json5 { @@ -916,7 +916,7 @@ Root repository opsional yang ditampilkan pada baris Runtime di system prompt. J ### `agents.defaults.skills` -Allowlist skill default opsional untuk agen yang tidak mengatur +Allowlist skill default opsional untuk agen yang tidak menyetel `agents.list[].skills`. ```json5 @@ -924,18 +924,18 @@ Allowlist skill default opsional untuk agen yang tidak mengatur agents: { defaults: { skills: ["github", "weather"] }, list: [ - { id: "writer" }, // inherits github, weather - { id: "docs", skills: ["docs-search"] }, // replaces defaults - { id: "locked-down", skills: [] }, // no skills + { id: "writer" }, // mewarisi github, weather + { id: "docs", skills: ["docs-search"] }, // menggantikan default + { id: "locked-down", skills: [] }, // tanpa skill ], }, } ``` -- Hilangkan `agents.defaults.skills` untuk skill tanpa batas secara default. +- Hilangkan `agents.defaults.skills` untuk skill tak dibatasi secara default. - Hilangkan `agents.list[].skills` untuk mewarisi default. -- Tetapkan `agents.list[].skills: []` untuk tanpa skill. -- Daftar `agents.list[].skills` yang tidak kosong adalah set final untuk agen tersebut; daftar ini +- Setel `agents.list[].skills: []` untuk tanpa skill. +- Daftar `agents.list[].skills` yang tidak kosong adalah set final untuk agen itu; daftar ini tidak digabungkan dengan default. ### `agents.defaults.skipBootstrap` @@ -950,9 +950,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 system prompt. Default: `"always"`. -- `"continuation-skip"`: giliran lanjutan yang aman (setelah respons asisten selesai) melewati penyuntikan ulang bootstrap workspace, mengurangi ukuran prompt. Proses heartbeat dan retry pasca-compaction tetap membangun ulang konteks. +- `"continuation-skip"`: giliran lanjutan yang aman (setelah respons asisten selesai) melewati penyisipan ulang bootstrap workspace, mengurangi ukuran prompt. Eksekusi heartbeat dan percobaan ulang pasca-compaction tetap membangun ulang konteks. ```json5 { @@ -962,7 +962,7 @@ Mengontrol kapan file bootstrap workspace disuntikkan ke system prompt. Default: ### `agents.defaults.bootstrapMaxChars` -Karakter maksimum per file bootstrap workspace sebelum dipotong. Default: `20000`. +Jumlah karakter maksimum per file bootstrap workspace sebelum dipotong. Default: `20000`. ```json5 { @@ -972,7 +972,7 @@ Karakter maksimum per file bootstrap workspace sebelum dipotong. Default: `20000 ### `agents.defaults.bootstrapTotalMaxChars` -Total karakter maksimum yang disuntikkan di seluruh file bootstrap workspace. Default: `150000`. +Jumlah total karakter maksimum yang disisipkan di semua file bootstrap workspace. Default: `150000`. ```json5 { @@ -985,9 +985,9 @@ Total karakter maksimum yang disuntikkan di seluruh file bootstrap workspace. De Mengontrol teks peringatan yang terlihat oleh agen saat konteks bootstrap dipotong. Default: `"once"`. -- `"off"`: jangan pernah menyuntikkan teks peringatan ke system prompt. -- `"once"`: suntikkan peringatan sekali per signature pemotongan unik (disarankan). -- `"always"`: suntikkan peringatan pada setiap run saat ada pemotongan. +- `"off"`: jangan pernah menyisipkan teks peringatan ke system prompt. +- `"once"`: sisipkan peringatan sekali per tanda tangan pemotongan unik (disarankan). +- `"always"`: sisipkan peringatan pada setiap eksekusi saat ada pemotongan. ```json5 { @@ -997,10 +997,10 @@ Default: `"once"`. ### `agents.defaults.imageMaxDimensionPx` -Ukuran piksel maksimum untuk sisi gambar terpanjang dalam blok gambar transkrip/alat sebelum panggilan penyedia. +Ukuran piksel maksimum untuk sisi terpanjang gambar dalam blok gambar transkrip/tool sebelum pemanggilan provider. Default: `1200`. -Nilai yang lebih rendah biasanya mengurangi penggunaan vision-token dan ukuran payload permintaan untuk run yang banyak screenshot. +Nilai yang lebih rendah biasanya mengurangi penggunaan vision-token dan ukuran payload permintaan untuk eksekusi dengan banyak tangkapan layar. Nilai yang lebih tinggi mempertahankan lebih banyak detail visual. ```json5 @@ -1011,7 +1011,7 @@ Nilai yang lebih tinggi mempertahankan lebih banyak detail visual. ### `agents.defaults.userTimezone` -Zona waktu untuk konteks system prompt (bukan stempel waktu pesan). Fallback ke zona waktu host. +Zona waktu untuk konteks system prompt (bukan timestamp pesan). Menggunakan fallback ke zona waktu host. ```json5 { @@ -1059,7 +1059,7 @@ Format waktu dalam system prompt. Default: `auto` (preferensi OS). primary: "anthropic/claude-opus-4-6", fallbacks: ["openai/gpt-5.4-mini"], }, - params: { cacheRetention: "long" }, // global default provider params + params: { cacheRetention: "long" }, // param provider default global pdfMaxBytesMb: 10, pdfMaxPages: 20, thinkingDefault: "low", @@ -1078,39 +1078,39 @@ 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 path alat `image` sebagai konfigurasi model vision-nya. - - Juga digunakan sebagai perutean fallback saat model yang dipilih/default tidak dapat menerima input gambar. + - Digunakan oleh jalur tool `image` sebagai konfigurasi model-vision-nya. + - 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 mendatang yang menghasilkan gambar. - - Nilai umum: `google/gemini-3.1-flash-image-preview` untuk pembuatan gambar native Gemini, `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 cocok (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. Pertama mencoba penyedia default saat ini, lalu penyedia pembuatan gambar terdaftar lainnya dalam urutan provider-id. + - Digunakan oleh kapabilitas pembuatan gambar bersama dan permukaan tool/plugin masa depan apa pun 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 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 memiliki auth. Pertama mencoba provider default saat ini, 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 tool built-in `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. Pertama mencoba penyedia default saat ini, lalu penyedia pembuatan musik terdaftar lainnya dalam urutan provider-id. - - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/API key penyedia yang cocok. + - Jika dihilangkan, `music_generate` masih dapat menyimpulkan default provider yang memiliki auth. Pertama mencoba provider default saat ini, 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 tool built-in `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. Pertama mencoba penyedia default saat ini, lalu penyedia pembuatan video terdaftar lainnya dalam urutan provider-id. - - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/API key penyedia yang cocok. - - Penyedia pembuatan video Qwen bundled saat ini mendukung hingga 1 video output, 1 gambar input, 4 video input, durasi 10 detik, dan opsi tingkat penyedia `size`, `aspectRatio`, `resolution`, `audio`, dan `watermark`. + - Jika dihilangkan, `video_generate` masih dapat menyimpulkan default provider yang memiliki auth. Pertama mencoba provider default saat ini, 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 bundled Qwen saat ini mendukung hingga 1 video output, 1 gambar input, 4 video input, durasi 10 detik, dan 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 telah di-resolve. -- `pdfMaxBytesMb`: batas ukuran PDF default untuk alat `pdf` saat `maxBytesMb` tidak diberikan saat pemanggilan. -- `pdfMaxPages`: jumlah halaman maksimum default yang dipertimbangkan oleh mode fallback ekstraksi dalam alat `pdf`. + - Digunakan oleh tool `pdf` untuk routing model. + - Jika dihilangkan, tool PDF menggunakan fallback ke `imageModel`, lalu ke model sesi/default yang di-resolve. +- `pdfMaxBytesMb`: batas ukuran PDF default untuk tool `pdf` saat `maxBytesMb` tidak diberikan saat pemanggilan. +- `pdfMaxPages`: jumlah halaman maksimum default yang dipertimbangkan oleh mode fallback ekstraksi di tool `pdf`. - `verboseDefault`: level verbose default untuk agen. Nilai: `"off"`, `"on"`, `"full"`. Default: `"off"`. - `elevatedDefault`: level 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 provider, OpenClaw mencoba alias terlebih dahulu, lalu kecocokan unik configured-provider untuk ID model tepat itu, dan baru kemudian fallback ke provider default yang dikonfigurasi (perilaku kompatibilitas lama yang sudah deprecated, jadi sebaiknya gunakan `provider/model` eksplisit). Jika provider itu tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw fallback ke provider/model terkonfigurasi pertama alih-alih menampilkan default penyedia lama yang sudah dihapus. -- `models`: katalog model dan allowlist terkonfigurasi untuk `/model`. Setiap entri dapat menyertakan `alias` (shortcut) dan `params` (spesifik penyedia, misalnya `temperature`, `maxTokens`, `cacheRetention`, `context1m`). -- `params`: parameter provider default global yang diterapkan ke semua model. Ditetapkan di `agents.defaults.params` (mis. `{ cacheRetention: "long" }`). -- Prioritas penggabungan `params` (konfigurasi): `agents.defaults.params` (basis global) ditimpa oleh `agents.defaults.models["provider/model"].params` (per-model), lalu `agents.list[].params` (ID agen yang cocok) menimpa per kunci. Lihat [Prompt Caching](/id/reference/prompt-caching) untuk detail. -- Penulis konfigurasi yang memutasi bidang-bidang ini (misalnya `/models set`, `/models set-image`, serta perintah tambah/hapus fallback) menyimpan bentuk objek kanonis dan mempertahankan daftar fallback yang ada jika memungkinkan. -- `maxConcurrent`: maksimum run agen paralel lintas sesi (setiap sesi tetap diserialisasi). Default: 4. +- `model.primary`: format `provider/model` (mis. `openai/gpt-5.4`). Jika Anda menghilangkan provider, OpenClaw terlebih dahulu mencoba alias, lalu kecocokan provider-terkonfigurasi yang unik untuk ID model yang tepat, dan baru setelah itu menggunakan fallback ke provider default yang dikonfigurasi (perilaku kompatibilitas lama yang sudah deprecated, jadi gunakan `provider/model` eksplisit). Jika provider itu tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw menggunakan fallback ke provider/model terkonfigurasi pertama 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. Setel 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 agen yang cocok) mengoverride per kunci. Lihat [Prompt Caching](/id/reference/prompt-caching) untuk detail. +- 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 agen paralel di seluruh sesi (setiap sesi tetap diserialisasi). Default: 4. -**Shorthand alias built-in** (hanya berlaku saat model ada di `agents.defaults.models`): +**Singkatan alias built-in** (hanya berlaku saat model ada di `agents.defaults.models`): | Alias | Model | | ------------------- | -------------------------------------- | @@ -1125,13 +1125,13 @@ Format waktu dalam system prompt. Default: `auto` (preferensi OS). Alias yang Anda konfigurasi selalu menang atas 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 panggilan alat. Tetapkan `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. +Model Z.AI GLM-4.x secara otomatis mengaktifkan mode thinking kecuali Anda menetapkan `--thinking off` atau menentukan sendiri `agents.defaults.models["zai/"].params.thinking`. +Model Z.AI mengaktifkan `tool_stream` secara default untuk streaming pemanggilan tool. Setel `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 disetel. ### `agents.defaults.cliBackends` -Backend CLI opsional untuk run fallback hanya teks (tanpa panggilan alat). Berguna sebagai cadangan saat penyedia API gagal. +Backend CLI opsional untuk eksekusi fallback teks saja (tanpa pemanggilan tool). Berguna sebagai cadangan saat provider API gagal. ```json5 { @@ -1159,28 +1159,43 @@ Backend CLI opsional untuk run fallback hanya teks (tanpa panggilan alat). Bergu } ``` -- Backend CLI bersifat text-first; alat selalu dinonaktifkan. -- Sesi didukung saat `sessionArg` diatur. +- Backend CLI bersifat text-first; tool selalu dinonaktifkan. +- Sesi didukung saat `sessionArg` disetel. - Pass-through gambar didukung saat `imageArg` menerima path file. +### `agents.defaults.systemPromptOverride` + +Gantikan seluruh system prompt yang dirakit OpenClaw dengan string tetap. Setel pada level default (`agents.defaults.systemPromptOverride`) atau per agen (`agents.list[].systemPromptOverride`). Nilai per-agen memiliki prioritas lebih tinggi; nilai kosong atau hanya whitespace diabaikan. Berguna untuk eksperimen prompt yang terkontrol. + +```json5 +{ + agents: { + defaults: { + systemPromptOverride: "You are a helpful assistant.", + }, + }, +} +``` + ### `agents.defaults.heartbeat` -Run heartbeat berkala. +Eksekusi heartbeat berkala. ```json5 { agents: { defaults: { heartbeat: { - every: "30m", // 0m disables + every: "30m", // 0m menonaktifkan model: "openai/gpt-5.4-mini", includeReasoning: false, - lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files - isolatedSession: false, // default: false; true runs each heartbeat in a fresh session (no conversation history) + includeSystemPromptSection: true, // default: true; false menghilangkan bagian Heartbeat dari system prompt + lightContext: false, // default: false; true hanya mempertahankan HEARTBEAT.md dari file bootstrap workspace + isolatedSession: false, // default: false; true menjalankan setiap heartbeat di sesi baru (tanpa riwayat percakapan) session: "main", to: "+15555550123", directPolicy: "allow", // allow (default) | block - target: "none", // default: none | options: last | whatsapp | telegram | discord | ... + target: "none", // default: none | opsi: last | whatsapp | telegram | discord | ... prompt: "Read HEARTBEAT.md if it exists...", ackMaxChars: 300, suppressToolErrorWarnings: false, @@ -1190,12 +1205,13 @@ Run heartbeat berkala. } ``` -- `every`: string durasi (ms/s/m/h). Default: `30m` (auth API-key) atau `1h` (auth OAuth). Tetapkan `0m` untuk menonaktifkan. -- `suppressToolErrorWarnings`: saat true, menekan payload peringatan error alat selama run heartbeat. -- `directPolicy`: kebijakan pengiriman direct/DM. `allow` (default) mengizinkan pengiriman target langsung. `block` menekan pengiriman target langsung dan mengeluarkan `reason=dm-blocked`. -- `lightContext`: saat true, run 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: atur `agents.list[].heartbeat`. Saat ada agen mendefinisikan `heartbeat`, **hanya agen tersebut** yang menjalankan heartbeat. +- `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 penyisipan `HEARTBEAT.md` ke konteks bootstrap. Default: `true`. +- `suppressToolErrorWarnings`: saat true, menekan payload peringatan error tool selama eksekusi heartbeat. +- `directPolicy`: kebijakan pengiriman langsung/DM. `allow` (default) mengizinkan pengiriman target langsung. `block` menekan pengiriman target langsung dan memunculkan `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 di 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 membakar lebih banyak token. ### `agents.defaults.compaction` @@ -1206,14 +1222,14 @@ Run heartbeat berkala. defaults: { compaction: { mode: "safeguard", // default | safeguard - provider: "my-provider", // id of a registered compaction provider plugin (optional) + provider: "my-provider", // id 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.", // used when identifierPolicy=custom - postCompactionSections: ["Session Startup", "Red Lines"], // [] disables reinjection - model: "openrouter/anthropic/claude-sonnet-4-6", // optional compaction-only model override - notifyUser: true, // send a brief notice when compaction starts (default: false) + identifierInstructions: "Preserve deployment IDs, ticket IDs, and host:port pairs exactly.", // digunakan saat identifierPolicy=custom + 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: { enabled: true, softThresholdTokens: 6000, @@ -1227,18 +1243,18 @@ Run heartbeat berkala. ``` - `mode`: `default` atau `safeguard` (ringkasan bertahap untuk riwayat panjang). Lihat [Compaction](/id/concepts/compaction). -- `provider`: ID plugin penyedia compaction yang terdaftar. Saat diatur, `summarize()` penyedia dipanggil alih-alih ringkasan LLM built-in. Fallback ke built-in saat gagal. Menetapkan penyedia memaksa `mode: "safeguard"`. Lihat [Compaction](/id/concepts/compaction). +- `provider`: id plugin provider compaction terdaftar. Saat disetel, `summarize()` milik provider dipanggil alih-alih ringkasan LLM built-in. Menggunakan fallback ke built-in saat gagal. Menyetel 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 selama 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"]`; tetapkan `[]` untuk menonaktifkan penyuntikan ulang. Saat tidak diatur atau secara eksplisit diatur ke pasangan default itu, heading lama `Every Session`/`Safety` juga diterima sebagai fallback legacy. -- `model`: override `provider/model-id` opsional hanya untuk ringkasan compaction. Gunakan ini saat sesi utama harus tetap memakai satu model tetapi ringkasan compaction harus berjalan pada model lain; saat 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 memori yang tahan lama. Dilewati saat workspace bersifat read-only. +- `identifierPolicy`: `strict` (default), `off`, atau `custom`. `strict` menambahkan panduan bawaan untuk mempertahankan identifier opak selama ringkasan compaction. +- `identifierInstructions`: teks kustom opsional untuk preservasi identifier yang digunakan saat `identifierPolicy=custom`. +- `postCompactionSections`: nama bagian AGENTS.md H2/H3 opsional untuk disisipkan ulang setelah compaction. Default ke `["Session Startup", "Red Lines"]`; setel `[]` untuk menonaktifkan penyisipan ulang. Saat tidak disetel atau secara eksplisit disetel ke pasangan default itu, heading lama `Every Session`/`Safety` juga diterima sebagai fallback kompatibilitas lama. +- `model`: override `provider/model-id` opsional hanya untuk ringkasan compaction. Gunakan ini saat sesi utama harus tetap memakai satu model tetapi ringkasan compaction harus berjalan di model lain; saat tidak disetel, compaction memakai model utama sesi. +- `notifyUser`: saat `true`, mengirim pemberitahuan singkat ke pengguna saat compaction dimulai (misalnya, "Compacting context..."). Dinonaktifkan secara default agar compaction tetap senyap. +- `memoryFlush`: giliran agentic senyap sebelum auto-compaction untuk menyimpan memori yang tahan lama. Dilewati saat workspace hanya-baca. ### `agents.defaults.contextPruning` -Memangkas **hasil alat lama** dari konteks dalam memori sebelum dikirim ke LLM. Ini **tidak** memodifikasi riwayat sesi di disk. +Memangkas **hasil tool lama** dari konteks dalam memori sebelum dikirim ke LLM. **Tidak** memodifikasi riwayat sesi di disk. ```json5 { @@ -1246,7 +1262,7 @@ Memangkas **hasil alat lama** dari konteks dalam memori sebelum dikirim ke LLM. defaults: { contextPruning: { mode: "cache-ttl", // off | cache-ttl - ttl: "1h", // duration (ms/s/m/h), default unit: minutes + ttl: "1h", // durasi (ms/s/m/h), unit default: menit keepLastAssistants: 3, softTrimRatio: 0.3, hardClearRatio: 0.5, @@ -1263,24 +1279,24 @@ Memangkas **hasil alat lama** dari konteks dalam memori sebelum dikirim ke LLM. - `mode: "cache-ttl"` mengaktifkan pass 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 hasil alat yang lebih lama jika diperlukan. +- `ttl` mengontrol seberapa sering pruning dapat berjalan lagi (setelah sentuhan cache terakhir). +- Pruning melakukan soft-trim pada hasil tool besar terlebih dahulu, lalu hard-clear pada hasil tool yang lebih lama jika diperlukan. **Soft-trim** mempertahankan bagian awal + akhir dan menyisipkan `...` di tengah. -**Hard-clear** mengganti seluruh hasil alat dengan placeholder. +**Hard-clear** mengganti seluruh hasil tool dengan placeholder. Catatan: -- Blok gambar tidak pernah dipotong/dihapus. -- Rasio berbasis karakter (perkiraan), bukan jumlah token yang tepat. -- Jika jumlah pesan asisten kurang dari `keepLastAssistants`, pruning dilewati. +- Blok gambar tidak pernah dipangkas/dibersihkan. +- Rasio berbasis karakter (perkiraan), bukan hitungan token yang tepat. +- Jika ada kurang dari `keepLastAssistants` pesan asisten, pruning dilewati. Lihat [Session Pruning](/id/concepts/session-pruning) untuk detail perilaku. -### Streaming blok +### Block streaming ```json5 { @@ -1290,19 +1306,19 @@ Lihat [Session Pruning](/id/concepts/session-pruning) untuk detail perilaku. blockStreamingBreak: "text_end", // text_end | message_end blockStreamingChunk: { minChars: 800, maxChars: 1200 }, blockStreamingCoalesce: { idleMs: 1000 }, - humanDelay: { mode: "natural" }, // off | natural | custom (use minMs/maxMs) + humanDelay: { mode: "natural" }, // off | natural | custom (gunakan minMs/maxMs) }, }, } ``` - 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 `minChars: 1500`. -- `humanDelay`: jeda acak antara balasan blok. `natural` = 800–2500ms. 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–2500ms. Override per-agen: `agents.list[].humanDelay`. -Lihat [Streaming](/id/concepts/streaming) untuk perilaku + detail chunking. +Lihat [Streaming](/id/concepts/streaming) untuk detail perilaku + chunking. -### Indikator mengetik +### Indikator pengetikan ```json5 { @@ -1316,7 +1332,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). @@ -1370,7 +1386,7 @@ Sandboxing opsional untuk agen tertanam. Lihat [Sandboxing](/id/gateway/sandboxi identityFile: "~/.ssh/id_ed25519", certificateFile: "~/.ssh/id_ed25519-cert.pub", knownHostsFile: "~/.ssh/known_hosts", - // SecretRefs / inline contents also supported: + // SecretRef / konten inline juga didukung: // identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" }, // certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" }, // knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" }, @@ -1424,19 +1440,19 @@ Sandboxing opsional untuk agen tertanam. Lihat [Sandboxing](/id/gateway/sandboxi **Backend:** - `docker`: runtime Docker lokal (default) -- `ssh`: runtime jarak jauh berbasis SSH generik +- `ssh`: runtime jarak jauh umum berbasis SSH - `openshell`: runtime OpenShell -Saat `backend: "openshell"` dipilih, pengaturan spesifik runtime dipindahkan ke +Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke `plugins.entries.openshell.config`. **Konfigurasi backend SSH:** - `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 sudah ada yang diteruskan ke OpenSSH -- `identityData` / `certificateData` / `knownHostsData`: konten inline atau SecretRef yang diwujudkan OpenClaw menjadi file sementara saat runtime +- `workspaceRoot`: root jarak jauh absolut yang digunakan untuk workspace per-scope +- `identityFile` / `certificateFile` / `knownHostsFile`: file lokal yang ada yang diteruskan ke OpenSSH +- `identityData` / `certificateData` / `knownHostsData`: konten inline atau SecretRef yang dimaterialisasi OpenClaw menjadi file sementara saat runtime - `strictHostKeyChecking` / `updateHostKeys`: knob kebijakan host-key OpenSSH **Prioritas auth SSH:** @@ -1448,21 +1464,21 @@ Saat `backend: "openshell"` dipilih, pengaturan spesifik runtime dipindahkan ke **Perilaku backend SSH:** -- men-seed workspace jarak jauh sekali setelah pembuatan atau pembuatan ulang +- mengisi workspace jarak jauh sekali setelah create atau recreate - lalu mempertahankan workspace SSH jarak jauh sebagai kanonis -- merutekan `exec`, alat file, dan path media melalui SSH -- tidak otomatis menyinkronkan perubahan jarak jauh kembali ke host +- merutekan `exec`, tool file, dan jalur 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 di-mount read-only di `/agent` -- `rw`: workspace agen di-mount baca/tulis di `/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` **Scope:** -- `session`: container + workspace per sesi +- `session`: container + workspace per-sesi - `agent`: satu container + workspace per agen (default) - `shared`: container dan workspace bersama (tanpa isolasi lintas sesi) @@ -1479,10 +1495,10 @@ Saat `backend: "openshell"` dipilih, pengaturan spesifik runtime dipindahkan ke from: "openclaw", remoteWorkspaceDir: "/sandbox", remoteAgentWorkspaceDir: "/agent", - gateway: "lab", // optional - gatewayEndpoint: "https://lab.example", // optional - policy: "strict", // optional OpenShell policy id - providers: ["openai"], // optional + gateway: "lab", // opsional + gatewayEndpoint: "https://lab.example", // opsional + policy: "strict", // id kebijakan OpenShell opsional + providers: ["openai"], // opsional autoProviders: true, timeoutSeconds: 120, }, @@ -1494,30 +1510,30 @@ Saat `backend: "openshell"` dipilih, pengaturan spesifik runtime dipindahkan ke **Mode OpenShell:** -- `mirror`: seed remote dari lokal sebelum exec, sinkronkan kembali setelah exec; workspace lokal tetap kanonis -- `remote`: seed remote sekali saat sandbox dibuat, lalu pertahankan workspace jarak jauh sebagai kanonis +- `mirror`: isi jarak jauh dari lokal sebelum exec, sinkronkan balik setelah exec; workspace lokal tetap kanonis +- `remote`: isi jarak jauh sekali saat sandbox dibuat, lalu pertahankan workspace jarak jauh sebagai kanonis -Dalam mode `remote`, edit host-lokal yang dibuat di luar OpenClaw tidak otomatis disinkronkan ke sandbox setelah langkah seed. -Transport menggunakan SSH ke sandbox OpenShell, tetapi plugin memiliki siklus hidup sandbox dan sinkronisasi mirror opsional. +Dalam mode `remote`, edit host-lokal yang dibuat di luar OpenClaw tidak disinkronkan ke sandbox secara otomatis setelah langkah seed. +Transport menggunakan SSH ke sandbox OpenShell, tetapi plugin memiliki lifecycle sandbox dan sinkronisasi mirror opsional. -**`setupCommand`** dijalankan sekali setelah pembuatan container (melalui `sh -lc`). Memerlukan network egress, root yang dapat ditulis, pengguna root. +**`setupCommand`** berjalan sekali setelah pembuatan container (melalui `sh -lc`). Memerlukan egress jaringan, root yang bisa ditulis, pengguna root. -**Container default ke `network: "none"`** — tetapkan ke `"bridge"` (atau jaringan bridge kustom) jika agen memerlukan akses keluar. -`"host"` diblokir. `"container:"` diblokir secara default kecuali Anda secara eksplisit mengatur -`sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` (break-glass). +**Container default ke `network: "none"`** — setel ke `"bridge"` (atau jaringan bridge kustom) jika agen membutuhkan akses keluar. +`"host"` diblokir. `"container:"` diblokir secara default kecuali Anda secara eksplisit menyetel +`sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` (darurat). -**Lampiran masuk** ditempatkan ke `media/inbound/*` di workspace aktif. +**Lampiran masuk** ditempatkan ke `media/inbound/*` dalam workspace aktif. -**`docker.binds`** me-mount direktori host tambahan; bind global dan per agen digabungkan. +**`docker.binds`** memasang direktori host tambahan; bind global dan per-agen digabungkan. -**Browser tersandbox** (`sandbox.browser.enabled`): Chromium + CDP 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 password dalam 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 pengamat noVNC menggunakan auth VNC secara default dan OpenClaw memancarkan URL token berumur pendek (alih-alih mengekspos kata sandi di URL bersama). -- `allowHostControl: false` (default) memblokir sesi tersandbox untuk menargetkan browser host. -- `network` default ke `openclaw-sandbox-browser` (jaringan bridge khusus). Tetapkan ke `bridge` hanya saat Anda secara eksplisit menginginkan konektivitas bridge global. +- `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 memang 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` me-mount direktori host tambahan hanya ke container browser sandbox. Saat diatur (termasuk `[]`), nilainya menggantikan `docker.binds` untuk container browser. -- Default peluncuran didefinisikan di `scripts/sandbox-browser-entrypoint.sh` dan disetel untuk host container: +- `sandbox.browser.binds` memasang direktori host tambahan hanya ke container browser sandbox. Saat disetel (termasuk `[]`), ini menggantikan `docker.binds` untuk container browser. +- Default peluncuran ditetapkan dalam `scripts/sandbox-browser-entrypoint.sh` dan disetel untuk host container: - `--remote-debugging-address=127.0.0.1` - `--remote-debugging-port=` - `--user-data-dir=${HOME}/.chrome` @@ -1538,26 +1554,27 @@ Akses pengamat noVNC menggunakan auth VNC secara default dan OpenClaw mengeluark - `--disable-3d-apis`, `--disable-software-rasterizer`, dan `--disable-gpu` aktif 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=`; tetapkan `0` untuk menggunakan + `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; setel `0` untuk memakai batas proses default Chromium. - plus `--no-sandbox` dan `--disable-setuid-sandbox` saat `noSandbox` diaktifkan. - - Default 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. -Sandbox browser dan `sandbox.docker.binds` saat ini hanya didukung Docker. +Sandboxing browser dan `sandbox.docker.binds` saat ini hanya Docker. Bangun image: ```bash -scripts/sandbox-setup.sh # main sandbox image -scripts/sandbox-browser-setup.sh # optional browser image +scripts/sandbox-setup.sh # image sandbox utama +scripts/sandbox-browser-setup.sh # image browser opsional ``` -### `agents.list` (override per agen) +### `agents.list` (override per-agen) ```json5 { @@ -1569,12 +1586,12 @@ scripts/sandbox-browser-setup.sh # optional browser image name: "Main Agent", workspace: "~/.openclaw/workspace", agentDir: "~/.openclaw/agents/main/agent", - model: "anthropic/claude-opus-4-6", // or { primary, fallbacks } - thinkingDefault: "high", // per-agent thinking level override - reasoningDefault: "on", // per-agent reasoning visibility override - fastModeDefault: false, // per-agent fast mode override - params: { cacheRetention: "none" }, // overrides matching defaults.models params by key - skills: ["docs-search"], // replaces agents.defaults.skills when set + model: "anthropic/claude-opus-4-6", // atau { primary, fallbacks } + thinkingDefault: "high", // override level thinking per-agen + reasoningDefault: "on", // override visibilitas reasoning per-agen + fastModeDefault: false, // override fast mode per-agen + params: { cacheRetention: "none" }, // mengoverride defaults.models yang cocok per kunci + skills: ["docs-search"], // menggantikan agents.defaults.skills saat disetel identity: { name: "Samantha", theme: "helpful sloth", @@ -1606,25 +1623,25 @@ scripts/sandbox-browser-setup.sh # optional browser image ``` - `id`: ID agen stabil (wajib). -- `default`: saat ada beberapa yang diatur, yang pertama menang (peringatan dicatat). Jika tidak ada yang diatur, entri daftar pertama menjadi default. -- `model`: bentuk string menimpa hanya `primary`; bentuk objek `{ primary, fallbacks }` menimpa keduanya (`[]` menonaktifkan fallback global). Job cron yang hanya menimpa `primary` tetap mewarisi fallback default kecuali Anda menetapkan `fallbacks: []`. -- `params`: param stream per agen yang digabungkan di atas entri model terpilih dalam `agents.defaults.models`. Gunakan ini untuk override spesifik agen seperti `cacheRetention`, `temperature`, atau `maxTokens` tanpa menduplikasi seluruh katalog model. -- `skills`: allowlist skill per agen opsional. Jika dihilangkan, agen mewarisi `agents.defaults.skills` saat diatur; daftar eksplisit menggantikan default alih-alih menggabungkannya, dan `[]` berarti tanpa skill. -- `thinkingDefault`: default level thinking per agen opsional (`off | minimal | low | medium | high | xhigh | adaptive`). Menimpa `agents.defaults.thinkingDefault` untuk agen ini saat tidak ada override per pesan atau per sesi. -- `reasoningDefault`: default visibilitas reasoning per agen opsional (`on | off | stream`). Berlaku saat tidak ada override reasoning per pesan atau per sesi. -- `fastModeDefault`: default per agen opsional untuk fast mode (`true | false`). Berlaku saat tidak ada override fast-mode per pesan atau per sesi. -- `runtime`: deskriptor runtime per agen opsional. 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:`. -- `identity` memperoleh default: `ackReaction` dari `emoji`, `mentionPatterns` dari `name`/`emoji`. -- `subagents.allowAgents`: allowlist ID agen untuk `sessions_spawn` (`["*"]` = apa pun; default: hanya agen yang sama). -- Pengaman pewarisan sandbox: jika sesi peminta disandbox, `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). +- `default`: saat beberapa disetel, yang pertama menang (peringatan dicatat). Jika tidak ada yang disetel, 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 menyetel `fallbacks: []`. +- `params`: parameter stream per-agen yang digabungkan di atas entri model yang dipilih dalam `agents.defaults.models`. Gunakan ini untuk override khusus agen seperti `cacheRetention`, `temperature`, atau `maxTokens` tanpa menduplikasi seluruh katalog model. +- `skills`: allowlist skill per-agen opsional. Jika dihilangkan, agen mewarisi `agents.defaults.skills` saat disetel; daftar eksplisit menggantikan default alih-alih digabungkan, dan `[]` berarti tanpa skill. +- `thinkingDefault`: level thinking default per-agen opsional (`off | minimal | low | medium | high | xhigh | adaptive`). Mengoverride `agents.defaults.thinkingDefault` untuk agen ini saat tidak ada override per-pesan atau per-sesi. +- `reasoningDefault`: visibilitas reasoning default per-agen opsional (`on | off | stream`). Berlaku saat tidak ada override reasoning per-pesan atau per-sesi. +- `fastModeDefault`: default per-agen opsional untuk fast mode (`true | false`). Berlaku saat tidak ada override fast-mode per-pesan atau per-sesi. +- `runtime`: deskriptor runtime per-agen opsional. 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:`. +- `identity` menurunkan default: `ackReaction` dari `emoji`, `mentionPatterns` dari `name`/`emoji`. +- `subagents.allowAgents`: allowlist ID agen untuk `sessions_spawn` (`["*"]` = apa pun; default: agen yang sama saja). +- Guard pewarisan sandbox: jika sesi peminta berada dalam sandbox, `sessions_spawn` menolak target yang akan berjalan tanpa sandbox. +- `subagents.requireAgentId`: saat true, blokir pemanggilan `sessions_spawn` yang menghilangkan `agentId` (memaksa pemilihan profil eksplisit; default: false). --- -## Perutean multi-agen +## Routing multi-agen -Jalankan banyak agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id/concepts/multi-agent). +Jalankan beberapa agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id/concepts/multi-agent). ```json5 { @@ -1641,29 +1658,29 @@ Jalankan banyak agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id/c } ``` -### Bidang pencocokan 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 hilang default ke route), `acp` untuk binding percakapan ACP persisten. - `match.channel` (wajib) -- `match.accountId` (opsional; `*` = akun apa pun; dihilangkan = akun default) +- `match.accountId` (opsional; `*` = akun apa saja; dihilangkan = akun default) - `match.peer` (opsional; `{ kind: direct|group|channel, id }`) -- `match.guildId` / `match.teamId` (opsional; spesifik channel) +- `match.guildId` / `match.teamId` (opsional; khusus channel) - `acp` (opsional; hanya untuk entri `type: "acp"`): `{ mode, label, cwd, backend }` -**Urutan pencocokan deterministik:** +**Urutan kecocokan deterministik:** 1. `match.peer` 2. `match.guildId` 3. `match.teamId` 4. `match.accountId` (tepat, tanpa peer/guild/team) -5. `match.accountId: "*"` (cakupan seluruh channel) +5. `match.accountId: "*"` (seluruh channel) 6. Agen default -Di dalam setiap tingkat, entri `bindings` yang pertama cocok akan menang. +Dalam setiap tier, 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 route binding di atas. +Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan yang tepat (`match.channel` + akun + `match.peer.id`) dan tidak menggunakan urutan tier binding route di atas. -### Profil akses per agen +### Profil akses per-agen @@ -1683,7 +1700,7 @@ Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan - + ```json5 { @@ -1712,7 +1729,7 @@ Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan - + ```json5 { @@ -1758,11 +1775,11 @@ Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan -Lihat [Sandbox & Tools Multi-Agent](/id/tools/multi-agent-sandbox-tools) untuk detail prioritas. +Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk detail prioritas. --- -## Sesi +## Session ```json5 { @@ -1784,22 +1801,22 @@ Lihat [Sandbox & Tools Multi-Agent](/id/tools/multi-agent-sandbox-tools) untuk d }, resetTriggers: ["/new", "/reset"], store: "~/.openclaw/agents/{agentId}/sessions/sessions.json", - parentForkMaxTokens: 100000, // skip parent-thread fork above this token count (0 disables) + 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", // duration or false - maxDiskBytes: "500mb", // optional hard budget - highWaterBytes: "400mb", // optional cleanup target + resetArchiveRetention: "30d", // durasi atau false + maxDiskBytes: "500mb", // opsional hard budget + highWaterBytes: "400mb", // target cleanup opsional }, threadBindings: { enabled: true, - idleHours: 24, // default inactivity auto-unfocus in hours (`0` disables) - maxAgeHours: 0, // default hard max age in hours (`0` disables) + idleHours: 24, // auto-unfocus tidak aktif default dalam jam (`0` menonaktifkan) + maxAgeHours: 0, // usia maksimum keras default dalam jam (`0` menonaktifkan) }, - mainKey: "main", // legacy (runtime always uses "main") + mainKey: "main", // lama (runtime selalu menggunakan "main") agentToAgent: { maxPingPongTurns: 5 }, sendPolicy: { rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }], @@ -1809,48 +1826,48 @@ Lihat [Sandbox & Tools Multi-Agent](/id/tools/multi-agent-sandbox-tools) untuk d } ``` - + - **`scope`**: strategi pengelompokan sesi dasar untuk konteks chat grup. - `per-sender` (default): setiap pengirim mendapat sesi terisolasi dalam konteks channel. - - `global`: semua peserta dalam konteks channel berbagi satu sesi (gunakan hanya saat konteks bersama memang dimaksudkan). -- **`dmScope`**: bagaimana DM dikelompokkan. + - `global`: semua peserta dalam konteks channel berbagi satu sesi (gunakan hanya jika konteks bersama memang diinginkan). +- **`dmScope`**: cara DM dikelompokkan. - `main`: semua DM berbagi sesi utama. - `per-peer`: isolasi berdasarkan ID pengirim lintas 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 berprefiks penyedia untuk berbagi sesi lintas channel. -- **`reset`**: kebijakan reset utama. `daily` mereset pada `atHour` waktu lokal; `idle` mereset setelah `idleMinutes`. Saat keduanya dikonfigurasi, yang kedaluwarsa lebih dulu yang menang. -- **`resetByType`**: override per tipe (`direct`, `group`, `thread`). `dm` lama diterima sebagai alias untuk `direct`. -- **`parentForkMaxTokens`**: maksimum `totalTokens` sesi induk yang diizinkan saat membuat sesi thread bercabang (default `100000`). - - Jika `totalTokens` induk di atas nilai ini, OpenClaw memulai sesi thread baru alih-alih mewarisi riwayat transkrip induk. - - Tetapkan `0` untuk menonaktifkan pengaman ini dan selalu mengizinkan parent forking. -- **`mainKey`**: bidang lama. Runtime kini selalu menggunakan `"main"` untuk bucket chat langsung utama. -- **`agentToAgent.maxPingPongTurns`**: jumlah giliran balas-balik maksimum antar agen selama pertukaran agen-ke-agen (integer, 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`**: kontrol pembersihan + retensi session-store. - - `mode`: `warn` hanya mengeluarkan peringatan; `enforce` menerapkan pembersihan. - - `pruneAfter`: batas usia untuk entri usang (default `30d`). +- **`identityLinks`**: memetakan 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`. Saat keduanya dikonfigurasi, yang kedaluwarsa lebih dulu akan menang. +- **`resetByType`**: override per-jenis (`direct`, `group`, `thread`). `dm` lama diterima sebagai alias untuk `direct`. +- **`parentForkMaxTokens`**: `totalTokens` sesi induk maksimum yang diizinkan saat membuat sesi thread hasil fork (default `100000`). + - Jika `totalTokens` parent di atas nilai ini, OpenClaw memulai sesi thread baru alih-alih mewarisi riwayat transkrip parent. + - Setel `0` untuk menonaktifkan guard ini dan selalu mengizinkan forking parent. +- **`mainKey`**: field lama. Runtime sekarang selalu menggunakan `"main"` untuk bucket chat langsung utama. +- **`agentToAgent.maxPingPongTurns`**: jumlah maksimum giliran balas-balik antar agen selama pertukaran agent-to-agent (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`. Deny pertama menang. +- **`maintenance`**: kontrol cleanup + retensi penyimpanan sesi. + - `mode`: `warn` hanya memunculkan peringatan; `enforce` menerapkan cleanup. + - `pruneAfter`: cutoff usia untuk entri usang (default `30d`). - `maxEntries`: jumlah maksimum entri dalam `sessions.json` (default `500`). - - `rotateBytes`: rotasi `sessions.json` saat melebihi ukuran ini (default `10mb`). - - `resetArchiveRetention`: retensi untuk arsip transkrip `*.reset.`. Default ke `pruneAfter`; tetapkan `false` untuk menonaktifkan. - - `maxDiskBytes`: anggaran disk direktori sesi opsional. Dalam mode `warn`, mencatat peringatan; dalam mode `enforce`, menghapus artefak/sesi tertua terlebih dahulu. - - `highWaterBytes`: target opsional setelah pembersihan anggaran. Default ke `80%` dari `maxDiskBytes`. + - `rotateBytes`: rotasikan `sessions.json` saat melebihi ukuran ini (default `10mb`). + - `resetArchiveRetention`: retensi untuk arsip transkrip `*.reset.`. Default ke `pruneAfter`; setel `false` untuk menonaktifkan. + - `maxDiskBytes`: budget disk direktori sesi opsional. Dalam mode `warn` akan mencatat peringatan; dalam mode `enforce` akan menghapus artefak/sesi tertua lebih dulu. + - `highWaterBytes`: target opsional setelah cleanup budget. Default ke `80%` dari `maxDiskBytes`. - **`threadBindings`**: default global untuk fitur sesi terikat thread. - - `enabled`: sakelar default utama (penyedia dapat menimpa; Discord menggunakan `channels.discord.threadBindings.enabled`) - - `idleHours`: default auto-unfocus karena tidak aktif dalam jam (`0` menonaktifkan; penyedia dapat menimpa) - - `maxAgeHours`: default usia maksimum keras dalam jam (`0` menonaktifkan; penyedia dapat menimpa) + - `enabled`: sakelar default master (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) --- -## Pesan +## Messages ```json5 { messages: { - responsePrefix: "🦞", // or "auto" + responsePrefix: "🦞", // atau "auto" ackReaction: "👀", ackReactionScope: "group-mentions", // group-mentions | group-all | direct | all removeAckAfterReply: false, @@ -1865,7 +1882,7 @@ Lihat [Sandbox & Tools Multi-Agent](/id/tools/multi-agent-sandbox-tools) untuk d }, }, inbound: { - debounceMs: 2000, // 0 disables + debounceMs: 2000, // 0 menonaktifkan byChannel: { whatsapp: 5000, slack: 1500, @@ -1875,38 +1892,38 @@ Lihat [Sandbox & Tools Multi-Agent](/id/tools/multi-agent-sandbox-tools) untuk d } ``` -### Prefiks respons +### Prefix 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 cascade. `"auto"` menurunkan `[{identity.name}]`. -**Variabel templat:** +**Variabel template:** -| Variabel | Deskripsi | Contoh | -| ----------------- | --------------------- | --------------------------- | -| `{model}` | Nama model singkat | `claude-opus-4-6` | -| `{modelFull}` | Identifier model lengkap | `anthropic/claude-opus-4-6` | -| `{provider}` | Nama penyedia | `anthropic` | -| `{thinkingLevel}` | Level thinking saat ini | `high`, `low`, `off` | -| `{identity.name}` | Nama identitas agen | (sama seperti `"auto"`) | +| Variabel | Deskripsi | Contoh | +| ----------------- | ---------------------- | --------------------------- | +| `{model}` | Nama model singkat | `claude-opus-4-6` | +| `{modelFull}` | Identifier model penuh | `anthropic/claude-opus-4-6` | +| `{provider}` | Nama provider | `anthropic` | +| `{thinkingLevel}` | Level thinking saat ini | `high`, `low`, `off` | +| `{identity.name}` | Nama identitas agen | (sama seperti `"auto"`) | Variabel tidak peka huruf besar/kecil. `{think}` adalah alias untuk `{thinkingLevel}`. ### Reaksi ack -- Default ke `identity.emoji` agen aktif, jika tidak `"👀"`. Tetapkan `""` untuk menonaktifkan. -- Override per channel: `channels..ackReaction`, `channels..accounts..ackReaction`. +- Default ke `identity.emoji` agen aktif, jika tidak `"👀"`. Setel `""` 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`. - `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 diatur status reactions tetap aktif saat ack reaction aktif. - Di Telegram, atur secara eksplisit ke `true` untuk mengaktifkan status reactions siklus hidup. +- `messages.statusReactions.enabled`: mengaktifkan reaksi status lifecycle di Slack, Discord, dan Telegram. + Di Slack dan Discord, jika tidak disetel maka reaksi status tetap aktif saat reaksi ack aktif. + Di Telegram, setel secara eksplisit ke `true` untuk mengaktifkan reaksi status lifecycle. -### Debounce masuk +### Debounce inbound -Mengelompokkan pesan cepat yang hanya berisi teks dari pengirim yang sama menjadi satu giliran agen. Media/lampiran langsung mem-flush. Perintah kontrol melewati debouncing. +Mengelompokkan pesan teks cepat dari pengirim yang sama menjadi satu giliran agen. Media/lampiran langsung mem-flush. Perintah kontrol melewati debouncing. ### TTS (text-to-speech) @@ -1949,12 +1966,12 @@ Mengelompokkan pesan cepat yang hanya berisi teks dari pengirim yang sama menjad } ``` -- `auto` mengontrol mode auto-TTS default: `off`, `always`, `inbound`, atau `tagged`. `/tts on|off` dapat menimpa preferensi lokal, dan `/tts status` menampilkan status efektif. -- `summaryModel` menimpa `agents.defaults.model.primary` untuk auto-summary. +- `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` menimpa endpoint OpenAI TTS. Urutan resolusi adalah konfigurasi, 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/voice. +- API key menggunakan fallback ke `ELEVENLABS_API_KEY`/`XI_API_KEY` dan `OPENAI_API_KEY`. +- `openai.baseUrl` mengoverride endpoint OpenAI TTS. 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 kompatibel OpenAI dan melonggarkan validasi model/voice. --- @@ -1984,34 +2001,34 @@ Default untuk mode Talk (macOS/iOS/Android). } ``` -- `talk.provider` harus cocok dengan kunci dalam `talk.providers` saat beberapa penyedia Talk dikonfigurasi. +- `talk.provider` harus cocok dengan 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.`. -- Voice ID fallback ke `ELEVENLABS_VOICE_ID` atau `SAG_VOICE_ID`. +- 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 directive Talk menggunakan nama yang ramah. -- `silenceTimeoutMs` mengontrol berapa lama mode Talk menunggu setelah pengguna diam sebelum mengirim transkrip. Jika tidak diatur, jendela jeda default platform dipertahankan (`700 ms di macOS dan Android, 900 ms di iOS`). +- `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, tetap memakai jendela jeda default platform (`700 ms di macOS dan Android, 900 ms di iOS`). --- -## Alat +## Tools -### Profil alat +### Profil tool `tools.profile` menetapkan allowlist dasar sebelum `tools.allow`/`tools.deny`: -Onboarding lokal secara default mengatur konfigurasi lokal baru ke `tools.profile: "coding"` saat tidak diatur (profil eksplisit yang sudah ada dipertahankan). +Onboarding lokal secara default menetapkan konfigurasi lokal baru ke `tools.profile: "coding"` saat tidak disetel (profil eksplisit yang ada dipertahankan). | 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 diatur) | +| `full` | Tanpa pembatasan (sama seperti tidak disetel) | -### Grup alat +### 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` | @@ -2024,11 +2041,11 @@ Onboarding lokal secara default mengatur konfigurasi lokal baru ke `tools.profil | `group:nodes` | `nodes` | | `group:agents` | `agents_list` | | `group:media` | `image`, `image_generate`, `video_generate`, `tts` | -| `group:openclaw` | Semua alat built-in (tidak termasuk plugin penyedia) | +| `group:openclaw` | Semua tool built-in (tidak termasuk plugin provider) | ### `tools.allow` / `tools.deny` -Kebijakan allow/deny alat global (deny menang). Tidak peka huruf besar/kecil, mendukung wildcard `*`. Diterapkan bahkan saat sandbox Docker mati. +Kebijakan allow/deny tool global (deny menang). Tidak peka huruf besar/kecil, mendukung wildcard `*`. Diterapkan bahkan saat sandbox Docker nonaktif. ```json5 { @@ -2038,7 +2055,7 @@ Kebijakan allow/deny alat global (deny menang). Tidak peka huruf besar/kecil, me ### `tools.byProvider` -Lebih lanjut membatasi alat untuk penyedia atau model tertentu. Urutan: profil dasar → profil penyedia → allow/deny. +Membatasi tool lebih lanjut untuk provider atau model tertentu. Urutan: profil dasar → profil provider → allow/deny. ```json5 { @@ -2070,7 +2087,7 @@ Mengontrol akses exec elevated di luar sandbox: } ``` -- Override per agen (`agents.list[].tools.elevated`) hanya dapat membatasi lebih lanjut. +- Override per-agen (`agents.list[].tools.elevated`) hanya dapat membatasi lebih lanjut. - `/elevated on|off|ask|full` menyimpan status per sesi; directive 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`). @@ -2096,8 +2113,8 @@ Mengontrol akses exec elevated di luar sandbox: ### `tools.loopDetection` -Pemeriksaan keamanan loop alat **dinonaktifkan secara default**. Tetapkan `enabled: true` untuk mengaktifkan deteksi. -Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan ditimpa per agen di `agents.list[].tools.loopDetection`. +Pemeriksaan keamanan loop tool **dinonaktifkan secara default**. Setel `enabled: true` untuk mengaktifkan deteksi. +Pengaturan dapat ditentukan secara global di `tools.loopDetection` dan dioverride per-agen di `agents.list[].tools.loopDetection`. ```json5 { @@ -2118,13 +2135,13 @@ Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan ditimp } ``` -- `historySize`: riwayat panggilan alat maksimum yang dipertahankan untuk analisis loop. +- `historySize`: riwayat pemanggilan tool maksimum yang dipertahankan untuk analisis loop. - `warningThreshold`: ambang pola berulang tanpa progres untuk peringatan. - `criticalThreshold`: ambang berulang yang lebih tinggi untuk memblokir loop kritis. -- `globalCircuitBreakerThreshold`: ambang hard stop untuk run tanpa progres apa pun. -- `detectors.genericRepeat`: beri peringatan pada panggilan alat yang sama dengan argumen yang sama secara berulang. -- `detectors.knownPollNoProgress`: beri peringatan/blokir pada alat poll yang dikenal (`process.poll`, `command_status`, dll.). -- `detectors.pingPong`: beri peringatan/blokir pada pola pasangan bergantian tanpa progres. +- `globalCircuitBreakerThreshold`: ambang hard stop untuk eksekusi tanpa progres apa pun. +- `detectors.genericRepeat`: beri peringatan pada panggilan tool yang berulang dengan argumen yang sama. +- `detectors.knownPollNoProgress`: beri peringatan/blokir pada tool poll yang dikenal (`process.poll`, `command_status`, dll.). +- `detectors.pingPong`: beri peringatan/blokir pada pola pasangan bolak-balik tanpa progres. - Jika `warningThreshold >= criticalThreshold` atau `criticalThreshold >= globalCircuitBreakerThreshold`, validasi gagal. ### `tools.web` @@ -2135,14 +2152,14 @@ Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan ditimp web: { search: { enabled: true, - apiKey: "brave_api_key", // or BRAVE_API_KEY env + apiKey: "brave_api_key", // atau env BRAVE_API_KEY maxResults: 5, timeoutSeconds: 30, cacheTtlMinutes: 15, }, fetch: { enabled: true, - provider: "firecrawl", // optional; omit for auto-detect + provider: "firecrawl", // opsional; hilangkan untuk auto-detect maxChars: 50000, maxCharsCap: 50000, maxResponseBytes: 2000000, @@ -2167,7 +2184,7 @@ Mengonfigurasi pemahaman media masuk (gambar/audio/video): media: { concurrency: 2, asyncCompletion: { - directSend: false, // opt-in: send finished async music/video directly to the channel + directSend: false, // opt-in: kirim musik/video async yang selesai langsung ke channel }, audio: { enabled: true, @@ -2191,31 +2208,31 @@ Mengonfigurasi pemahaman media masuk (gambar/audio/video): } ``` - + **Entri provider** (`type: "provider"` atau dihilangkan): -- `provider`: ID penyedia API (`openai`, `anthropic`, `google`/`gemini`, `groq`, dll.) +- `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 akan dijalankan -- `args`: argumen bertemplat (mendukung `{{MediaPath}}`, `{{Prompt}}`, `{{MaxChars}}`, dll.) +- `command`: executable untuk dijalankan +- `args`: argumen bertemplate (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. -- Kegagalan akan fallback ke entri berikutnya. +- `prompt`, `maxChars`, `maxBytes`, `timeoutSeconds`, `language`: override per-entri. +- Kegagalan menggunakan fallback ke entri berikutnya. -Auth penyedia mengikuti urutan standar: `auth-profiles.json` → env vars → `models.providers.*.apiKey`. +Auth provider mengikuti urutan standar: `auth-profiles.json` → env vars → `models.providers.*.apiKey`. -**Bidang async completion:** +**Field async completion:** -- `asyncCompletion.directSend`: saat `true`, tugas async `music_generate` - dan `video_generate` yang selesai mencoba pengiriman channel langsung terlebih dahulu. Default: `false` +- `asyncCompletion.directSend`: saat `true`, tugas `music_generate` + dan `video_generate` async yang selesai mencoba pengiriman channel langsung terlebih dahulu. Default: `false` (jalur lama requester-session wake/model-delivery). @@ -2235,9 +2252,9 @@ Auth penyedia mengikuti urutan standar: `auth-profiles.json` → env vars → `m ### `tools.sessions` -Mengontrol sesi mana yang dapat ditargetkan oleh alat sesi (`sessions_list`, `sessions_history`, `sessions_send`). +Mengontrol sesi mana yang dapat ditargetkan oleh tool sesi (`sessions_list`, `sessions_history`, `sessions_send`). -Default: `tree` (sesi saat ini + sesi yang dihasilkan olehnya, seperti subagen). +Default: `tree` (sesi saat ini + sesi yang dibuat olehnya, seperti subagen). ```json5 { @@ -2253,10 +2270,10 @@ Default: `tree` (sesi saat ini + sesi yang dihasilkan olehnya, seperti subagen). Catatan: - `self`: hanya kunci sesi saat ini. -- `tree`: sesi saat ini + sesi yang dihasilkan 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). +- `tree`: sesi saat ini + sesi yang dibuat oleh sesi saat ini (subagen). +- `agent`: sesi mana pun yang milik 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 disandbox dan `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibilitas dipaksa ke `tree` bahkan jika `tools.sessions.visibility="all"`. +- Clamp sandbox: saat sesi saat ini berada dalam sandbox dan `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibilitas dipaksa ke `tree` bahkan jika `tools.sessions.visibility="all"`. ### `tools.sessions_spawn` @@ -2267,11 +2284,11 @@ Mengontrol dukungan lampiran inline untuk `sessions_spawn`. tools: { sessions_spawn: { attachments: { - enabled: false, // opt-in: set true to allow inline file attachments - maxTotalBytes: 5242880, // 5 MB total across all files + enabled: false, // opt-in: setel true untuk mengizinkan lampiran file inline + maxTotalBytes: 5242880, // total 5 MB di semua file maxFiles: 50, maxFileBytes: 1048576, // 1 MB per file - retainOnSessionKeep: false, // keep attachments when cleanup="keep" + retainOnSessionKeep: false, // pertahankan lampiran saat cleanup="keep" }, }, }, @@ -2281,21 +2298,21 @@ Mengontrol dukungan lampiran inline untuk `sessions_spawn`. Catatan: - Lampiran hanya didukung untuk `runtime: "subagent"`. Runtime ACP menolaknya. -- File diwujudkan ke workspace anak di `.openclaw/attachments//` dengan `.manifest.json`. -- Konten lampiran otomatis disunting dari persistensi transkrip. -- Input base64 divalidasi dengan pemeriksaan alfabet/padding ketat dan guard ukuran pra-decode. +- File dimaterialisasi ke workspace anak di `.openclaw/attachments//` dengan `.manifest.json`. +- Konten lampiran otomatis disensor dari persistensi transkrip. +- 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` mempertahankannya hanya saat `retainOnSessionKeep: true`. +- Cleanup mengikuti kebijakan `cleanup`: `delete` selalu menghapus lampiran; `keep` mempertahankannya hanya saat `retainOnSessionKeep: true`. ### `tools.experimental` -Flag alat built-in eksperimental. Default mati kecuali aturan auto-enable spesifik runtime berlaku. +Flag tool built-in eksperimental. Default nonaktif kecuali berlaku aturan auto-enable khusus runtime. ```json5 { tools: { experimental: { - planTool: true, // enable experimental update_plan + planTool: true, // aktifkan update_plan eksperimental }, }, } @@ -2303,9 +2320,9 @@ Flag alat built-in eksperimental. Default mati kecuali aturan auto-enable spesif Catatan: -- `planTool`: mengaktifkan alat `update_plan` terstruktur untuk pelacakan pekerjaan multi-langkah yang tidak sepele. -- Default: `false` untuk penyedia non-OpenAI. Run OpenAI dan OpenAI Codex mengaktifkannya otomatis saat tidak diatur; tetapkan `false` untuk menonaktifkan auto-enable itu. -- Saat diaktifkan, system prompt juga menambahkan panduan penggunaan agar model hanya menggunakannya untuk pekerjaan yang substansial dan menjaga paling banyak satu langkah `in_progress`. +- `planTool`: mengaktifkan tool terstruktur `update_plan` untuk pelacakan pekerjaan multi-langkah yang tidak sepele. +- Default: `false` untuk provider non-OpenAI. Eksekusi OpenAI dan OpenAI Codex mengaktifkannya secara otomatis saat tidak disetel; setel `false` untuk menonaktifkan auto-enable itu. +- Saat diaktifkan, system prompt juga menambahkan panduan penggunaan agar model hanya memakainya untuk pekerjaan substansial dan mempertahankan maksimal satu langkah `in_progress`. ### `agents.defaults.subagents` @@ -2325,16 +2342,16 @@ Catatan: } ``` -- `model`: model default untuk sub-agen yang dihasilkan. Jika dihilangkan, sub-agen mewarisi model pemanggil. -- `allowAgents`: allowlist default ID agen target untuk `sessions_spawn` saat agen peminta tidak mengatur `subagents.allowAgents` sendiri (`["*"]` = apa pun; default: hanya agen yang sama). -- `runTimeoutSeconds`: timeout default (detik) untuk `sessions_spawn` saat panggilan alat menghilangkan `runTimeoutSeconds`. `0` berarti tanpa timeout. -- Kebijakan alat per subagen: `tools.subagents.tools.allow` / `tools.subagents.tools.deny`. +- `model`: model default untuk sub-agen yang di-spawn. Jika dihilangkan, sub-agen mewarisi model pemanggil. +- `allowAgents`: allowlist default ID agen target untuk `sessions_spawn` saat agen peminta tidak menyetel `subagents.allowAgents` sendiri (`["*"]` = apa pun; default: agen yang sama saja). +- `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`. --- -## Penyedia kustom dan base URL +## Provider kustom dan base URL -OpenClaw menggunakan katalog model built-in. Tambahkan penyedia kustom melalui `models.providers` di konfigurasi atau `~/.openclaw/agents//agent/models.json`. +OpenClaw menggunakan katalog model built-in. Tambahkan provider kustom melalui `models.providers` di konfigurasi atau `~/.openclaw/agents//agent/models.json`. ```json5 { @@ -2364,48 +2381,48 @@ OpenClaw menggunakan katalog model built-in. Tambahkan penyedia kustom melalui ` ``` - Gunakan `authHeader: true` + `headers` untuk kebutuhan auth kustom. -- Timpa root konfigurasi agen dengan `OPENCLAW_AGENT_DIR` (atau `PI_CODING_AGENT_DIR`, alias variabel lingkungan lama). -- Prioritas penggabungan untuk ID penyedia yang cocok: +- Override root konfigurasi agen dengan `OPENCLAW_AGENT_DIR` (atau `PI_CODING_AGENT_DIR`, alias variabel lingkungan lama). +- Prioritas penggabungan untuk ID provider yang cocok: - Nilai `baseUrl` `models.json` agen yang tidak kosong menang. - - Nilai `apiKey` agen yang tidak kosong menang hanya saat penyedia itu tidak dikelola SecretRef dalam konteks config/auth-profile saat ini. - - Nilai `apiKey` penyedia yang dikelola SecretRef disegarkan dari source marker (`ENV_VAR_NAME` untuk env refs, `secretref-managed` untuk file/exec refs) alih-alih mempersistenkan secret yang telah di-resolve. - - Nilai header penyedia yang dikelola SecretRef disegarkan dari source marker (`secretref-env:ENV_VAR_NAME` untuk env refs, `secretref-managed` untuk file/exec refs). - - `apiKey`/`baseUrl` agen yang kosong atau tidak ada fallback ke `models.providers` dalam konfigurasi. - - `contextWindow`/`maxTokens` model yang cocok menggunakan nilai 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. + - Nilai `apiKey` agen yang tidak kosong menang hanya saat provider itu tidak dikelola SecretRef dalam konteks auth-profile/config 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 rahasia 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 hilang menggunakan fallback ke `models.providers` dalam konfigurasi. + - `contextWindow`/`maxTokens` model yang cocok memakai nilai yang lebih tinggi antara konfigurasi eksplisit dan nilai katalog implisit. + - `contextTokens` model yang cocok mempertahankan batas runtime eksplisit bila ada; gunakan untuk membatasi konteks efektif tanpa mengubah metadata model native. - Gunakan `models.mode: "replace"` saat Anda ingin konfigurasi menulis ulang `models.json` sepenuhnya. - - Persistensi marker bersifat source-authoritative: marker ditulis dari snapshot konfigurasi sumber aktif (pra-resolusi), bukan dari nilai secret runtime yang telah di-resolve. + - Persistensi penanda bersifat source-authoritative: penanda ditulis dari snapshot konfigurasi sumber aktif (pra-resolusi), bukan dari nilai secret runtime yang telah di-resolve. -### Detail bidang penyedia +### Detail field provider -- `models.mode`: perilaku katalog penyedia (`merge` atau `replace`). -- `models.providers`: peta penyedia kustom yang dikunci oleh ID penyedia. +- `models.mode`: perilaku katalog provider (`merge` atau `replace`). +- `models.providers`: map provider kustom yang dikunci dengan ID provider. - `models.providers.*.api`: adapter permintaan (`openai-completions`, `openai-responses`, `anthropic-messages`, `google-generative-ai`, dll). -- `models.providers.*.apiKey`: kredensial penyedia (sebaiknya gunakan SecretRef/substitusi env). +- `models.providers.*.apiKey`: kredensial provider (utamakan SecretRef/substitusi env). - `models.providers.*.auth`: strategi auth (`api-key`, `token`, `oauth`, `aws-sdk`). -- `models.providers.*.injectNumCtxForOpenAICompat`: untuk Ollama + `openai-completions`, suntikkan `options.num_ctx` ke permintaan (default: `true`). -- `models.providers.*.authHeader`: paksa transport kredensial di header `Authorization` saat diperlukan. +- `models.providers.*.injectNumCtxForOpenAICompat`: untuk Ollama + `openai-completions`, sisipkan `options.num_ctx` ke permintaan (default: `true`). +- `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 penyedia). Nilai menerima SecretRef. - - `request.auth`: override strategi auth. Mode: `"provider-default"` (gunakan auth built-in penyedia), `"authorization-bearer"` (dengan `token`), `"header"` (dengan `headerName`, `value`, opsional `prefix`). - - `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. Bidang: `ca`, `cert`, `key`, `passphrase` (semua menerima SecretRef), `serverName`, `insecureSkipVerify`. -- `models.providers.*.models`: entri katalog model penyedia eksplisit. + - `request.headers`: header tambahan (digabungkan dengan default provider). Nilai menerima SecretRef. + - `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 `HTTP_PROXY`/`HTTPS_PROXY`), `"explicit-proxy"` (dengan `url`). Kedua mode menerima subobjek `tls` opsional. + - `request.tls`: override TLS untuk koneksi langsung. Field: `ca`, `cert`, `key`, `passphrase` (semua menerima SecretRef), `serverName`, `insecureSkipVerify`. +- `models.providers.*.models`: entri katalog model provider eksplisit. - `models.providers.*.models.*.contextWindow`: metadata jendela konteks model native. -- `models.providers.*.models.*.contextTokens`: batas konteks runtime opsional. Gunakan ini saat Anda ingin anggaran konteks efektif lebih kecil dari `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 nilainya menjadi `false` saat runtime. `baseUrl` kosong/tidak ada mempertahankan perilaku default OpenAI. -- `models.providers.*.models.*.compat.requiresStringContent`: petunjuk kompatibilitas opsional untuk endpoint chat string-only yang kompatibel dengan OpenAI. Saat `true`, OpenClaw meratakan array `messages[].content` teks murni menjadi string biasa sebelum mengirim permintaan. +- `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 kompatibel OpenAI yang hanya menerima string. Saat `true`, OpenClaw meratakan array `messages[].content` yang hanya 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 provider-id opsional untuk discovery terarah. +- `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`: jendela konteks fallback untuk model yang ditemukan. - `plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens`: token output maksimum fallback untuk model yang ditemukan. -### Contoh penyedia +### Contoh provider @@ -2441,7 +2458,7 @@ OpenClaw menggunakan katalog model built-in. Tambahkan penyedia kustom melalui ` } ``` -Gunakan `cerebras/zai-glm-4.7` untuk Cerebras; `zai/glm-4.7` untuk Z.AI direct. +Gunakan `cerebras/zai-glm-4.7` untuk Cerebras; `zai/glm-4.7` untuk Z.AI langsung. @@ -2458,7 +2475,7 @@ Gunakan `cerebras/zai-glm-4.7` untuk Cerebras; `zai/glm-4.7` untuk Z.AI direct. } ``` -Tetapkan `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`). Gunakan ref `opencode/...` untuk katalog Zen atau ref `opencode-go/...` untuk katalog Go. Shortcut: `openclaw onboard --auth-choice opencode-zen` atau `openclaw onboard --auth-choice opencode-go`. +Setel `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`). Gunakan referensi `opencode/...` untuk katalog Zen atau referensi `opencode-go/...` untuk katalog Go. Shortcut: `openclaw onboard --auth-choice opencode-zen` atau `openclaw onboard --auth-choice opencode-go`. @@ -2475,11 +2492,11 @@ Tetapkan `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`). Gunakan ref `opencode } ``` -Tetapkan `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` diterima sebagai alias. Shortcut: `openclaw onboard --auth-choice zai-api-key`. +Setel `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` diterima sebagai alias. Shortcut: `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` -- Untuk endpoint umum, definisikan penyedia kustom dengan override base URL. +- Untuk endpoint umum, definisikan provider kustom dengan override base URL. @@ -2521,8 +2538,8 @@ Tetapkan `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` diterima sebagai alias. Shortcut: 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 sekarang menguncinya pada -kapabilitas endpoint alih-alih hanya ID penyedia built-in. +`openai-completions`, dan OpenClaw kini mengaitkannya berdasarkan +kapabilitas endpoint alih-alih hanya ID provider built-in. @@ -2540,7 +2557,7 @@ kapabilitas endpoint alih-alih hanya ID penyedia built-in. } ``` -Kompatibel dengan Anthropic, penyedia built-in. Shortcut: `openclaw onboard --auth-choice kimi-code-api-key`. +Kompatibel Anthropic, provider built-in. Shortcut: `openclaw onboard --auth-choice kimi-code-api-key`. @@ -2619,12 +2636,12 @@ Base URL harus menghilangkan `/v1` (klien Anthropic menambahkannya). Shortcut: ` } ``` -Tetapkan `MINIMAX_API_KEY`. Shortcut: +Setel `MINIMAX_API_KEY`. Shortcut: `openclaw onboard --auth-choice minimax-global-api` atau `openclaw onboard --auth-choice minimax-cn-api`. Katalog model sekarang default hanya ke M2.7. -Pada path streaming yang kompatibel dengan Anthropic, OpenClaw menonaktifkan thinking MiniMax -secara default kecuali Anda secara eksplisit menetapkan `thinking` sendiri. `/fast on` atau +Pada jalur streaming yang kompatibel Anthropic, OpenClaw menonaktifkan thinking MiniMax +secara default kecuali Anda secara eksplisit menyetel `thinking` sendiri. `/fast on` atau `params.fastMode: true` menulis ulang `MiniMax-M2.7` menjadi `MiniMax-M2.7-highspeed`. @@ -2632,7 +2649,7 @@ secara default kecuali Anda secara eksplisit menetapkan `thinking` sendiri. `/fa -Lihat [Model Lokal](/id/gateway/local-models). Singkatnya: jalankan model lokal besar melalui LM Studio Responses API pada perangkat keras serius; pertahankan model hosted tetap tergabung untuk fallback. +Lihat [Local Models](/id/gateway/local-models). Singkatnya: jalankan model lokal besar melalui LM Studio Responses API pada perangkat keras yang serius; pertahankan model yang di-host tetap tergabung untuk fallback. @@ -2653,7 +2670,7 @@ Lihat [Model Lokal](/id/gateway/local-models). Singkatnya: jalankan model lokal }, entries: { "image-lab": { - apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // or plaintext string + apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // atau string plaintext env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" }, }, peekaboo: { enabled: true }, @@ -2665,16 +2682,16 @@ Lihat [Model Lokal](/id/gateway/local-models). Singkatnya: jalankan model lokal - `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` +- `install.preferBrew`: saat true, utamakan installer Homebrew saat `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 skill meskipun bundled/terpasang. -- `entries..apiKey`: kemudahan API key untuk skill yang mendeklarasikan env var utama (string plaintext atau objek SecretRef). +- `install.nodeManager`: preferensi installer node untuk spesifikasi + `metadata.openclaw.install` (`npm` | `pnpm` | `yarn` | `bun`). +- `entries..enabled: false` menonaktifkan skill meskipun bundled/terinstal. +- `entries..apiKey`: kemudahan API key tingkat skill (saat didukung oleh skill). --- -## Plugin +## Plugins ```json5 { @@ -2699,27 +2716,27 @@ Lihat [Model Lokal](/id/gateway/local-models). Singkatnya: jalankan model lokal ``` - Dimuat dari `~/.openclaw/extensions`, `/.openclaw/extensions`, plus `plugins.load.paths`. -- Discovery menerima plugin OpenClaw native serta bundel Codex dan Claude yang kompatibel, termasuk bundel Claude tanpa manifest dengan tata letak default. +- 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 tercantum yang dimuat). `deny` menang. -- `plugins.entries..apiKey`: bidang kemudahan API key tingkat plugin (bila didukung oleh plugin). -- `plugins.entries..env`: peta env var bercakupan plugin. -- `plugins.entries..hooks.allowPromptInjection`: saat `false`, inti 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 bundel yang didukung. -- `plugins.entries..subagent.allowModelOverride`: secara eksplisit mempercayai plugin ini untuk meminta override `provider` dan `model` per run bagi run subagen latar belakang. -- `plugins.entries..subagent.allowedModels`: allowlist opsional target `provider/model` kanonis untuk override subagen tepercaya. Gunakan `"*"` hanya jika Anda memang ingin mengizinkan model apa pun. -- `plugins.entries..config`: objek konfigurasi yang didefinisikan plugin (divalidasi oleh skema plugin OpenClaw native bila tersedia). -- `plugins.entries.firecrawl.config.webFetch`: pengaturan penyedia web-fetch Firecrawl. - - `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`. +- `plugins.entries..apiKey`: field kemudahan API key tingkat plugin (saat didukung plugin). +- `plugins.entries..env`: map env var yang dicakup plugin. +- `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 background subagent. +- `plugins.entries..subagent.allowedModels`: allowlist opsional target kanonis `provider/model` untuk override subagent tepercaya. Gunakan `"*"` hanya jika 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`. - `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 xAI X Search (pencarian web Grok). - - `enabled`: aktifkan penyedia X Search. - - `model`: model Grok yang digunakan untuk pencarian (misalnya `"grok-4-1-fast"`). + - `enabled`: aktifkan provider X Search. + - `model`: model Grok yang digunakan untuk pencarian (mis. `"grok-4-1-fast"`). - `plugins.entries.memory-core.config.dreaming`: pengaturan memory dreaming (eksperimental). Lihat [Dreaming](/id/concepts/dreaming) untuk fase dan ambang. - - `enabled`: sakelar dreaming utama (default `false`). - - `frequency`: cadence cron untuk setiap sapuan dreaming penuh (default `"0 3 * * *"`). + - `enabled`: sakelar utama dreaming (default `false`). + - `frequency`: cadence cron untuk setiap sweep dreaming penuh (`"0 3 * * *"` secara default). - kebijakan fase dan ambang adalah detail implementasi (bukan kunci konfigurasi yang menghadap pengguna). - Konfigurasi memori lengkap ada di [Referensi konfigurasi memori](/id/reference/memory-config): - `agents.defaults.memorySearch.*` @@ -2727,12 +2744,12 @@ Lihat [Model Lokal](/id/gateway/local-models). Singkatnya: jalankan model lokal - `memory.citations` - `memory.qmd.*` - `plugins.entries.memory-core.config.dreaming` -- Plugin bundel Claude yang aktif juga dapat menyumbangkan default Pi tertanam dari `settings.json`; OpenClaw menerapkannya sebagai pengaturan agen yang telah disanitasi, bukan sebagai patch konfigurasi OpenClaw mentah. +- Plugin bundle Claude yang diaktifkan juga dapat menyumbangkan default Pi tertanam dari `settings.json`; OpenClaw menerapkannya sebagai pengaturan agen yang sudah disanitasi, bukan sebagai patch konfigurasi OpenClaw mentah. - `plugins.slots.memory`: pilih ID plugin memori aktif, atau `"none"` untuk menonaktifkan plugin memori. -- `plugins.slots.contextEngine`: pilih ID plugin context engine aktif; default ke `"legacy"` kecuali Anda memasang dan memilih engine lain. +- `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 yang 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 daripada edit manual. + - Perlakukan `plugins.installs.*` sebagai state yang dikelola; utamakan perintah CLI daripada edit manual. Lihat [Plugins](/id/tools/plugin). @@ -2747,8 +2764,8 @@ Lihat [Plugins](/id/tools/plugin). evaluateEnabled: true, defaultProfile: "user", ssrfPolicy: { - dangerouslyAllowPrivateNetwork: true, // default trusted-network mode - // allowPrivateNetwork: true, // legacy alias + dangerouslyAllowPrivateNetwork: true, // mode jaringan tepercaya default + // allowPrivateNetwork: true, // alias lama // hostnameAllowlist: ["*.example.com", "example.com"], // allowedHostnames: ["localhost"], }, @@ -2775,26 +2792,26 @@ Lihat [Plugins](/id/tools/plugin). ``` - `evaluateEnabled: false` menonaktifkan `act:evaluate` dan `wait --fn`. -- `ssrfPolicy.dangerouslyAllowPrivateNetwork` default ke `true` saat tidak diatur (model jaringan tepercaya). -- Tetapkan `ssrfPolicy.dangerouslyAllowPrivateNetwork: false` untuk navigasi browser ketat hanya publik. -- Dalam mode ketat, endpoint profil CDP jarak jauh (`profiles.*.cdpUrl`) tunduk pada pemblokiran jaringan privat yang sama selama pemeriksaan keterjangkauan/discovery. +- `ssrfPolicy.dangerouslyAllowPrivateNetwork` default ke `true` saat tidak disetel (model jaringan tepercaya). +- Setel `ssrfPolicy.dangerouslyAllowPrivateNetwork: false` untuk navigasi browser publik-saja yang ketat. +- Dalam mode ketat, endpoint profil CDP jarak jauh (`profiles.*.cdpUrl`) tunduk pada pemblokiran jaringan privat yang sama selama pemeriksaan reachability/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) - saat penyedia Anda memberi URL WebSocket DevTools langsung. -- Profil `existing-session` hanya host dan menggunakan Chrome MCP alih-alih CDP. -- 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: - aksi berbasis snapshot/ref alih-alih penargetan selector CSS, hook upload satu file, - tanpa override timeout dialog, tanpa `wait --load networkidle`, serta tanpa - `responsebody`, ekspor PDF, intersepsi unduhan, atau aksi batch. -- Profil `openclaw` lokal yang dikelola secara otomatis menetapkan `cdpPort` dan `cdpUrl`; hanya - atur `cdpUrl` secara eksplisit untuk CDP jarak jauh. + saat provider Anda memberi URL WebSocket DevTools langsung. +- Profil `existing-session` hanya-host dan menggunakan Chrome MCP alih-alih CDP. +- Profil `existing-session` dapat menyetel `userDataDir` untuk menargetkan profil browser berbasis Chromium tertentu + seperti Brave atau Edge. +- Profil `existing-session` mempertahankan batas route Chrome MCP saat ini: + action berbasis snapshot/ref alih-alih penargetan selector CSS, hook unggah satu-file, + tanpa override timeout dialog, tanpa `wait --load networkidle`, dan tanpa + `responsebody`, ekspor PDF, intersepsi unduhan, atau action batch. +- Profil `openclaw` yang dikelola lokal otomatis menetapkan `cdpPort` dan `cdpUrl`; hanya + setel `cdpUrl` secara eksplisit untuk CDP jarak jauh. - Urutan auto-detect: browser default jika berbasis Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary. -- Layanan kontrol: hanya loopback (port diturunkan dari `gateway.port`, default `18791`). +- Layanan kontrol: loopback saja (port diturunkan dari `gateway.port`, default `18791`). - `extraArgs` menambahkan flag peluncuran tambahan ke startup Chromium lokal (misalnya `--disable-gpu`, ukuran jendela, atau flag debug). @@ -2808,14 +2825,14 @@ Lihat [Plugins](/id/tools/plugin). seamColor: "#FF4500", assistant: { name: "OpenClaw", - avatar: "CB", // emoji, short text, image URL, or data URI + avatar: "CB", // emoji, teks singkat, URL gambar, atau data URI }, }, } ``` -- `seamColor`: warna aksen untuk chrome UI aplikasi native (warna bubble Talk Mode, dll.). -- `assistant`: override identitas Control UI. Fallback ke identitas agen aktif. +- `seamColor`: warna aksen untuk chrome UI aplikasi native (warna gelembung Talk Mode, dll.). +- `assistant`: override identitas Control UI. Menggunakan fallback ke identitas agen aktif. --- @@ -2830,8 +2847,8 @@ Lihat [Plugins](/id/tools/plugin). auth: { mode: "token", // none | token | password | trusted-proxy token: "your-token", - // password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD - // trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /gateway/trusted-proxy-auth + // password: "your-password", // atau OPENCLAW_GATEWAY_PASSWORD + // trustedProxy: { userHeader: "x-forwarded-user" }, // untuk mode=trusted-proxy; lihat /gateway/trusted-proxy-auth allowTailscale: true, rateLimit: { maxAttempts: 10, @@ -2848,8 +2865,8 @@ Lihat [Plugins](/id/tools/plugin). enabled: true, basePath: "/openclaw", // root: "dist/control-ui", - // allowedOrigins: ["https://control.example.com"], // required for non-loopback Control UI - // dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode + // allowedOrigins: ["https://control.example.com"], // wajib untuk Control UI non-loopback + // dangerouslyAllowHostHeaderOriginFallback: false, // mode fallback origin Host-header yang berbahaya // allowInsecureAuth: false, // dangerouslyDisableDeviceAuth: false, }, @@ -2860,12 +2877,12 @@ Lihat [Plugins](/id/tools/plugin). // password: "your-password", }, trustedProxies: ["10.0.0.1"], - // Optional. Default false. + // Opsional. Default false. allowRealIpFallback: false, tools: { - // Additional /tools/invoke HTTP denies + // Deny HTTP /tools/invoke tambahan deny: ["browser"], - // Remove tools from the default HTTP deny list + // Hapus tool dari daftar deny HTTP default allow: ["gateway"], }, push: { @@ -2880,40 +2897,34 @@ Lihat [Plugins](/id/tools/plugin). } ``` - + -- `mode`: `local` (jalankan gateway) atau `remote` (hubungkan ke gateway jarak jauh). Gateway menolak start 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 start 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 default `loopback` mendengarkan pada `127.0.0.1` di dalam container. Dengan Docker bridge networking (`-p 18789:18789`), lalu lintas tiba di `eth0`, sehingga gateway tidak dapat dijangkau. Gunakan `--network host`, atau tetapkan `bind: "lan"` (atau `bind: "custom"` dengan `customBindHost: "0.0.0.0"`) untuk mendengarkan di semua interface. -- **Auth**: wajib secara default. Bind non-loopback memerlukan auth gateway. Dalam praktiknya itu 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` keduanya dikonfigurasi (termasuk SecretRef), tetapkan `gateway.auth.mode` secara eksplisit ke `token` atau `password`. Startup dan flow instalasi/perbaikan layanan gagal saat keduanya dikonfigurasi dan mode tidak diatur. +- **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`, jadi gateway tidak dapat dijangkau. Gunakan `--network host`, atau setel `bind: "lan"` (atau `bind: "custom"` dengan `customBindHost: "0.0.0.0"`) untuk mendengarkan di semua antarmuka. +- **Auth**: wajib secara default. Bind non-loopback memerlukan auth gateway. Dalam praktiknya itu berarti token/password bersama atau reverse proxy berbasis 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), setel `gateway.auth.mode` secara eksplisit ke `token` atau `password`. Alur startup dan instalasi/perbaikan layanan gagal saat keduanya dikonfigurasi dan mode tidak disetel. - `gateway.auth.mode: "none"`: mode tanpa auth eksplisit. Gunakan hanya untuk setup loopback lokal 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 trusted-proxy auth. -- `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 itu; mereka mengikuti mode auth HTTP normal gateway. Flow 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 scope auth (shared-secret dan device-token dilacak secara independen). Upaya yang diblokir mengembalikan `429` + `Retry-After`. - - Pada path async Tailscale Serve Control UI, upaya gagal untuk `{scope, clientIp}` yang sama diserialisasi sebelum penulisan kegagalan. Karena itu upaya buruk yang bersamaan dari klien yang sama dapat memicu limiter pada permintaan kedua alih-alih keduanya lolos sebagai mismatch biasa. - - `gateway.auth.rateLimit.exemptLoopback` default ke `true`; tetapkan `false` saat Anda memang ingin lalu lintas localhost juga dibatasi (untuk setup uji atau deployment proxy ketat). -- Upaya auth WS asal 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` +- `gateway.auth.mode: "trusted-proxy"`: delegasikan auth ke reverse proxy berbasis 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 API HTTP **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"`. +- `gateway.auth.rateLimit`: limiter kegagalan auth opsional. Berlaku per IP klien dan per cakupan auth (shared-secret dan device-token dilacak secara independen). Upaya yang diblokir mengembalikan `429` + `Retry-After`. + - Pada jalur async Tailscale Serve Control UI, upaya gagal untuk `{scope, clientIp}` yang sama diserialisasi sebelum penulisan kegagalan. Oleh karena itu, upaya buruk bersamaan dari klien yang sama dapat memicu limiter pada permintaan kedua alih-alih keduanya lolos sebagai mismatch biasa. + - `gateway.auth.rateLimit.exemptLoopback` default ke `true`; setel `false` saat Anda sengaja ingin lalu lintas localhost juga terkena rate limit (untuk setup pengujian atau deployment proxy yang ketat). +- Upaya auth WS asal browser selalu dibatasi dengan pengecualian loopback dinonaktifkan (pertahanan berlapis terhadap brute force localhost berbasis browser). +- Pada loopback, lockout asal-browser itu 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 browser-origin eksplisit untuk koneksi WebSocket Gateway. Wajib saat klien browser diharapkan berasal dari origin non-loopback. -- `controlUi.dangerouslyAllowHostHeaderOriginFallback`: mode berbahaya yang mengaktifkan fallback origin berbasis Host-header untuk deployment yang dengan sengaja mengandalkan kebijakan origin Host-header. +- `controlUi.allowedOrigins`: allowlist origin browser eksplisit untuk koneksi WebSocket Gateway. Wajib saat klien browser diharapkan dari origin non-loopback. +- `controlUi.dangerouslyAllowHostHeaderOriginFallback`: mode berbahaya yang mengaktifkan fallback origin Host-header untuk deployment yang sengaja 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. Bidang ini tidak mengonfigurasi auth gateway dengan sendirinya. -- `gateway.push.apns.relay.baseUrl`: base URL HTTPS untuk relay APNs eksternal yang digunakan oleh build iOS resmi/TestFlight setelah build tersebut 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: `10000`. -- Registrasi berbasis relay didelegasikan ke identitas gateway tertentu. Aplikasi iOS yang dipairing mengambil `gateway.identity.get`, menyertakan identitas itu dalam registrasi relay, dan meneruskan grant pengiriman bercakupan registrasi ke gateway. Gateway lain tidak dapat menggunakan kembali registrasi yang tersimpan itu. +- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1`: override darurat sisi klien yang mengizinkan plaintext `ws://` ke IP jaringan privat tepercaya; default tetap hanya loopback untuk plaintext. +- `gateway.remote.token` / `.password` adalah field kredensial klien jarak jauh. Keduanya 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 itu dalam registrasi relay, dan meneruskan izin kirim 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. Tetapkan `0` untuk menonaktifkan restart monitor kesehatan secara global. Default: `5`. -- `gateway.channelStaleEventThresholdMinutes`: ambang socket stale dalam menit. Pertahankan agar lebih besar dari atau sama dengan `gateway.channelHealthCheckMinutes`. Default: `30`. -- `gateway.channelMaxRestartsPerHour`: restart monitor kesehatan maksimum per channel/akun dalam satu jam berjalan. Default: `10`. -- `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. Saat diatur, nilainya lebih diutamakan daripada override tingkat channel. -- Path panggilan gateway lokal dapat menggunakan `gateway.remote.*` sebagai fallback hanya saat `gateway.auth.*` tidak diatur. -- Jika `gateway.auth.token` \ No newline at end of file +- `gateway.channelHealthCheckMinutes`: interval monitor kesehatan channel dalam menit. Setel ` \ No newline at end of file diff --git a/docs/id/plugins/sdk-migration.md b/docs/id/plugins/sdk-migration.md index fd7282204..8c95d7d66 100644 --- a/docs/id/plugins/sdk-migration.md +++ b/docs/id/plugins/sdk-migration.md @@ -5,41 +5,41 @@ read_when: - Anda sedang memperbarui plugin ke arsitektur plugin modern - Anda memelihara plugin OpenClaw eksternal sidebarTitle: Migrate to SDK -summary: Bermigrasi dari lapisan kompatibilitas mundur lama ke plugin SDK modern +summary: Migrasikan dari lapisan kompatibilitas mundur lama ke plugin SDK modern title: Migrasi Plugin SDK x-i18n: - generated_at: "2026-04-08T02:17:27Z" + generated_at: "2026-04-08T09:13:47Z" model: gpt-5.4 provider: openai - source_hash: 155a8b14bc345319c8516ebdb8a0ccdea2c5f7fa07dad343442996daee21ecad + source_hash: d9a2ce7f5553563516a549ca87e776a6a71e8dd8533a773c5ddbecfae43e7b77 source_path: plugins/sdk-migration.md workflow: 15 --- # Migrasi Plugin SDK -OpenClaw telah beralih dari lapisan kompatibilitas mundur yang luas ke arsitektur plugin -modern dengan import yang terfokus dan terdokumentasi. Jika plugin Anda dibuat sebelum -arsitektur baru, panduan ini membantu Anda bermigrasi. +OpenClaw telah beralih dari lapisan kompatibilitas mundur yang luas ke arsitektur +plugin modern dengan impor yang terfokus dan terdokumentasi. Jika plugin Anda +dibangun sebelum arsitektur baru ini, panduan ini membantu Anda bermigrasi. ## Apa yang berubah -Sistem plugin lama menyediakan dua permukaan terbuka lebar yang memungkinkan plugin mengimpor -apa pun yang mereka butuhkan dari satu entry point: +Sistem plugin lama menyediakan dua surface yang sangat terbuka yang memungkinkan +plugin mengimpor apa pun yang mereka perlukan dari satu titik masuk: -- **`openclaw/plugin-sdk/compat`** — satu import yang mengekspor ulang puluhan - helper. Ini diperkenalkan untuk menjaga plugin berbasis hook lama tetap berfungsi sementara - arsitektur plugin baru sedang dibangun. -- **`openclaw/extension-api`** — jembatan yang memberi plugin akses langsung ke - helper sisi host seperti embedded agent runner. +- **`openclaw/plugin-sdk/compat`** — satu impor yang mengekspor ulang puluhan + helper. Ini diperkenalkan untuk menjaga plugin berbasis hook lama tetap + berfungsi saat arsitektur plugin baru sedang dibangun. +- **`openclaw/extension-api`** — sebuah jembatan yang memberi plugin akses + langsung ke helper sisi host seperti embedded agent runner. -Kedua permukaan kini **deprecated**. Keduanya masih berfungsi saat runtime, tetapi plugin baru -tidak boleh menggunakannya, dan plugin yang ada harus bermigrasi sebelum rilis mayor berikutnya -menghapusnya. +Kedua surface sekarang **deprecated**. Keduanya masih berfungsi saat runtime, +tetapi plugin baru tidak boleh menggunakannya, dan plugin yang sudah ada harus +bermigrasi sebelum rilis mayor berikutnya menghapusnya. Lapisan kompatibilitas mundur akan dihapus pada rilis mayor mendatang. - Plugin yang masih mengimpor dari permukaan ini akan rusak saat itu terjadi. + Plugin yang masih mengimpor dari surface ini akan rusak ketika itu terjadi. ## Mengapa ini berubah @@ -47,36 +47,36 @@ menghapusnya. Pendekatan lama menimbulkan masalah: - **Startup lambat** — mengimpor satu helper memuat puluhan modul yang tidak terkait -- **Dependensi sirkular** — ekspor ulang yang luas memudahkan terciptanya siklus import -- **Permukaan API tidak jelas** — tidak ada cara untuk mengetahui ekspor mana yang stabil vs internal +- **Dependensi sirkular** — ekspor ulang yang luas memudahkan terbentuknya siklus impor +- **Surface API yang tidak jelas** — tidak ada cara untuk mengetahui ekspor mana yang stabil vs internal -Plugin SDK modern memperbaiki hal ini: setiap path import (`openclaw/plugin-sdk/\`) -adalah modul kecil yang berdiri sendiri dengan tujuan yang jelas dan kontrak yang terdokumentasi. +Plugin SDK modern memperbaikinya: setiap path impor (`openclaw/plugin-sdk/\`) +adalah modul kecil yang mandiri dengan tujuan yang jelas dan kontrak yang terdokumentasi. -Seam kenyamanan provider lama untuk channel bawaan juga telah dihapus. Import +Seam kenyamanan provider lama untuk channel bawaan juga sudah dihapus. Impor seperti `openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`, `openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, seam helper berlabel channel, dan -`openclaw/plugin-sdk/telegram-core` adalah shortcut mono-repo privat, bukan +`openclaw/plugin-sdk/telegram-core` adalah pintasan mono-repo privat, bukan kontrak plugin yang stabil. Gunakan subpath SDK generik yang sempit sebagai gantinya. Di dalam -workspace plugin bawaan, simpan helper milik provider dalam -`api.ts` atau `runtime-api.ts` milik plugin itu sendiri. +workspace plugin bawaan, simpan helper milik provider di `api.ts` atau `runtime-api.ts` +milik plugin tersebut. Contoh provider bawaan saat ini: - Anthropic menyimpan helper stream khusus Claude di seam `api.ts` / `contract-api.ts` miliknya sendiri -- OpenAI menyimpan builder provider, helper model default, dan builder provider realtime - di `api.ts` miliknya sendiri +- OpenAI menyimpan builder provider, helper model default, dan builder provider + realtime di `api.ts` miliknya sendiri - OpenRouter menyimpan builder provider dan helper onboarding/config di `api.ts` miliknya sendiri ## Cara bermigrasi - - Plugin channel yang mendukung approval kini mengekspos perilaku approval native melalui - `approvalCapability.nativeRuntime` serta registry konteks runtime bersama. + + Plugin channel yang mendukung approval sekarang mengekspos perilaku approval native melalui + `approvalCapability.nativeRuntime` ditambah registry runtime-context bersama. Perubahan utama: @@ -86,44 +86,45 @@ Contoh provider bawaan saat ini: `plugin.approvals` ke `approvalCapability` - `ChannelPlugin.approvals` telah dihapus dari kontrak publik plugin channel; pindahkan field delivery/native/render ke `approvalCapability` - - `plugin.auth` tetap ada hanya untuk alur login/logout channel; hook auth + - `plugin.auth` tetap dipakai hanya untuk alur login/logout channel; hook auth approval di sana tidak lagi dibaca oleh core - - Daftarkan objek runtime milik channel seperti klien, token, atau aplikasi Bolt - melalui `openclaw/plugin-sdk/channel-runtime-context` + - Daftarkan objek runtime milik channel seperti client, token, atau aplikasi + Bolt melalui `openclaw/plugin-sdk/channel-runtime-context` - Jangan kirim pemberitahuan reroute milik plugin dari handler approval native; - core kini memiliki notifikasi diarahkan-ke-tempat-lain dari hasil pengiriman yang sebenarnya + core sekarang menangani pemberitahuan dialihkan-ke-tempat-lain dari hasil pengiriman yang sebenarnya - Saat meneruskan `channelRuntime` ke `createChannelManager(...)`, sediakan - permukaan `createPluginRuntime().channel` yang nyata. Stub parsial akan ditolak. + surface `createPluginRuntime().channel` yang nyata. Stub parsial akan ditolak. - Lihat `/plugins/sdk-channel-plugins` untuk tata letak kapabilitas approval saat ini. + Lihat `/plugins/sdk-channel-plugins` untuk tata letak capability + approval saat ini. - Jika plugin Anda menggunakan `openclaw/plugin-sdk/windows-spawn`, wrapper Windows - `.cmd`/`.bat` yang tidak ter-resolve kini gagal tertutup kecuali Anda secara eksplisit meneruskan + Jika plugin Anda menggunakan `openclaw/plugin-sdk/windows-spawn`, wrapper + Windows `.cmd`/`.bat` yang tidak terpecahkan sekarang gagal tertutup kecuali Anda secara eksplisit meneruskan `allowShellFallback: true`. ```typescript - // Sebelumnya + // Sebelum const program = applyWindowsSpawnProgramPolicy({ candidate }); - // Sesudahnya + // Sesudah const program = applyWindowsSpawnProgramPolicy({ candidate, - // Setel ini hanya untuk pemanggil kompatibilitas tepercaya yang memang + // Hanya setel ini untuk pemanggil kompatibilitas tepercaya yang secara sengaja // menerima fallback yang dimediasi shell. allowShellFallback: true, }); ``` - Jika pemanggil Anda tidak sengaja bergantung pada fallback shell, jangan setel + Jika pemanggil Anda tidak secara sengaja bergantung pada shell fallback, jangan setel `allowShellFallback` dan tangani error yang dilempar sebagai gantinya. - - Cari dalam plugin Anda import dari salah satu permukaan deprecated: + + Cari plugin Anda untuk impor dari salah satu surface deprecated: ```bash grep -r "plugin-sdk/compat" my-plugin/ @@ -132,18 +133,18 @@ Contoh provider bawaan saat ini: - - Setiap ekspor dari permukaan lama dipetakan ke path import modern tertentu: + + Setiap ekspor dari surface lama dipetakan ke path impor modern tertentu: ```typescript - // Sebelumnya (lapisan kompatibilitas mundur yang deprecated) + // Sebelum (lapisan kompatibilitas mundur deprecated) import { createChannelReplyPipeline, createPluginRuntimeStore, resolveControlCommandGate, } from "openclaw/plugin-sdk/compat"; - // Sesudahnya (import modern yang terfokus) + // Sesudah (impor modern yang terfokus) import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline"; import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth"; @@ -153,17 +154,17 @@ Contoh provider bawaan saat ini: secara langsung: ```typescript - // Sebelumnya (jembatan extension-api yang deprecated) + // Sebelum (jembatan extension-api deprecated) import { runEmbeddedPiAgent } from "openclaw/extension-api"; const result = await runEmbeddedPiAgent({ sessionId, prompt }); - // Sesudahnya (runtime yang diinjeksi) + // Sesudah (runtime yang diinjeksi) const result = await api.runtime.agent.runEmbeddedPiAgent({ sessionId, prompt }); ``` Pola yang sama berlaku untuk helper jembatan lama lainnya: - | Import lama | Padanan modern | + | Impor lama | Padanan modern | | --- | --- | | `resolveAgentDir` | `api.runtime.agent.resolveAgentDir` | | `resolveAgentWorkspaceDir` | `api.runtime.agent.resolveAgentWorkspaceDir` | @@ -171,7 +172,7 @@ Contoh provider bawaan saat ini: | `resolveThinkingDefault` | `api.runtime.agent.resolveThinkingDefault` | | `resolveAgentTimeoutMs` | `api.runtime.agent.resolveAgentTimeoutMs` | | `ensureAgentWorkspace` | `api.runtime.agent.ensureAgentWorkspace` | - | helper penyimpanan sesi | `api.runtime.agent.session.*` | + | helper session store | `api.runtime.agent.session.*` | @@ -183,167 +184,169 @@ Contoh provider bawaan saat ini: -## Referensi path import +## Referensi path impor - - | Path import | Tujuan | Ekspor utama | + + | Path impor | Tujuan | Ekspor utama | | --- | --- | --- | | `plugin-sdk/plugin-entry` | Helper entri plugin kanonis | `definePluginEntry` | - | `plugin-sdk/core` | Ekspor ulang umbrella lama untuk definisi/builder entri channel | `defineChannelPluginEntry`, `createChatChannelPlugin` | - | `plugin-sdk/config-schema` | Ekspor skema konfigurasi root | `OpenClawSchema` | - | `plugin-sdk/provider-entry` | Helper entri provider tunggal | `defineSingleProviderPluginEntry` | + | `plugin-sdk/core` | Ekspor ulang payung lama untuk definisi/builder entri channel | `defineChannelPluginEntry`, `createChatChannelPlugin` | + | `plugin-sdk/config-schema` | Ekspor skema config root | `OpenClawSchema` | + | `plugin-sdk/provider-entry` | Helper entri single-provider | `defineSingleProviderPluginEntry` | | `plugin-sdk/channel-core` | Definisi dan builder entri channel yang terfokus | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` | | `plugin-sdk/setup` | Helper wizard setup bersama | Prompt allowlist, builder status setup | - | `plugin-sdk/setup-runtime` | Helper runtime saat setup | Adaptor patch setup yang aman untuk import, helper catatan lookup, `promptResolvedAllowFrom`, `splitSetupEntries`, proxy setup terdelegasi | - | `plugin-sdk/setup-adapter-runtime` | Helper adaptor setup | `createEnvPatchedAccountSetupAdapter` | + | `plugin-sdk/setup-runtime` | Helper runtime saat setup | Adapter patch setup yang aman untuk impor, helper catatan lookup, `promptResolvedAllowFrom`, `splitSetupEntries`, proxy setup terdelegasi | + | `plugin-sdk/setup-adapter-runtime` | Helper adapter setup | `createEnvPatchedAccountSetupAdapter` | | `plugin-sdk/setup-tools` | Helper tooling setup | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` | - | `plugin-sdk/account-core` | Helper multi-akun | Helper daftar akun/konfigurasi/action-gate | + | `plugin-sdk/account-core` | Helper multi-account | Helper daftar/config/action-gate akun | | `plugin-sdk/account-id` | Helper account-id | `DEFAULT_ACCOUNT_ID`, normalisasi account-id | | `plugin-sdk/account-resolution` | Helper lookup akun | Helper lookup akun + fallback default | - | `plugin-sdk/account-helpers` | Helper akun sempit | Helper daftar akun/aksi akun | - | `plugin-sdk/channel-setup` | Adaptor wizard setup | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` | + | `plugin-sdk/account-helpers` | Helper akun yang sempit | Helper daftar akun/action akun | + | `plugin-sdk/channel-setup` | Adapter wizard setup | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` | | `plugin-sdk/channel-pairing` | Primitive pairing DM | `createChannelPairingController` | - | `plugin-sdk/channel-reply-pipeline` | Wiring prefiks balasan + typing | `createChannelReplyPipeline` | - | `plugin-sdk/channel-config-helpers` | Factory adaptor konfigurasi | `createHybridChannelConfigAdapter` | - | `plugin-sdk/channel-config-schema` | Builder skema konfigurasi | Tipe skema konfigurasi channel | - | `plugin-sdk/telegram-command-config` | Helper konfigurasi perintah Telegram | Normalisasi nama perintah, pemangkasan deskripsi, validasi duplikat/konflik | + | `plugin-sdk/channel-reply-pipeline` | Wiring prefiks balasan + pengetikan | `createChannelReplyPipeline` | + | `plugin-sdk/channel-config-helpers` | Factory adapter config | `createHybridChannelConfigAdapter` | + | `plugin-sdk/channel-config-schema` | Builder skema config | Tipe skema config channel | + | `plugin-sdk/telegram-command-config` | Helper config perintah Telegram | Normalisasi nama perintah, pemangkasan deskripsi, validasi duplikasi/konflik | | `plugin-sdk/channel-policy` | Resolusi kebijakan grup/DM | `resolveChannelGroupRequireMention` | | `plugin-sdk/channel-lifecycle` | Pelacakan status akun | `createAccountStatusSink` | - | `plugin-sdk/inbound-envelope` | Helper inbound envelope | Route bersama + helper builder envelope | + | `plugin-sdk/inbound-envelope` | Helper envelope inbound | Helper route bersama + builder envelope | | `plugin-sdk/inbound-reply-dispatch` | Helper balasan inbound | Helper record-and-dispatch bersama | | `plugin-sdk/messaging-targets` | Parsing target pesan | Helper parsing/pencocokan target | | `plugin-sdk/outbound-media` | Helper media outbound | Pemuatan media outbound bersama | - | `plugin-sdk/outbound-runtime` | Helper runtime outbound | Helper identitas outbound/delegasi pengiriman | - | `plugin-sdk/thread-bindings-runtime` | Helper binding thread | Siklus hidup thread-binding dan helper adaptor | - | `plugin-sdk/agent-media-payload` | Helper payload media lama | Builder payload media agen untuk tata letak field lama | + | `plugin-sdk/outbound-runtime` | Helper runtime outbound | Helper identitas/delegasi pengiriman outbound | + | `plugin-sdk/thread-bindings-runtime` | Helper thread-binding | Lifecycle thread-binding dan helper adapter | + | `plugin-sdk/agent-media-payload` | Helper payload media lama | Builder payload media agent untuk tata letak field lama | | `plugin-sdk/channel-runtime` | Shim kompatibilitas deprecated | Hanya utilitas runtime channel lama | - | `plugin-sdk/channel-send-result` | Tipe hasil pengiriman | Tipe hasil balasan | + | `plugin-sdk/channel-send-result` | Tipe hasil kirim | Tipe hasil balasan | | `plugin-sdk/runtime-store` | Penyimpanan plugin persisten | `createPluginRuntimeStore` | | `plugin-sdk/runtime` | Helper runtime yang luas | Helper runtime/logging/backup/instalasi plugin | - | `plugin-sdk/runtime-env` | Helper env runtime sempit | Logger/runtime env, timeout, retry, dan helper backoff | - | `plugin-sdk/plugin-runtime` | Helper runtime plugin bersama | Helper plugin command/hook/http/interaktif | + | `plugin-sdk/runtime-env` | Helper env runtime yang sempit | Helper logger/runtime env, timeout, retry, dan backoff | + | `plugin-sdk/plugin-runtime` | Helper runtime plugin bersama | Helper perintah/hook/http/interaktif plugin | | `plugin-sdk/hook-runtime` | Helper pipeline hook | Helper pipeline webhook/internal hook bersama | | `plugin-sdk/lazy-runtime` | Helper runtime lazy | `createLazyRuntimeModule`, `createLazyRuntimeMethod`, `createLazyRuntimeMethodBinder`, `createLazyRuntimeNamedExport`, `createLazyRuntimeSurface` | | `plugin-sdk/process-runtime` | Helper proses | Helper exec bersama | | `plugin-sdk/cli-runtime` | Helper runtime CLI | Pemformatan perintah, wait, helper versi | - | `plugin-sdk/gateway-runtime` | Helper gateway | Klien gateway dan helper patch status channel | - | `plugin-sdk/config-runtime` | Helper konfigurasi | Helper muat/tulis konfigurasi | - | `plugin-sdk/telegram-command-config` | Helper perintah Telegram | Helper validasi perintah Telegram yang stabil sebagai fallback saat permukaan kontrak Telegram bawaan tidak tersedia | - | `plugin-sdk/approval-runtime` | Helper prompt approval | Payload approval exec/plugin, helper kapabilitas/profil approval, helper routing/runtime approval native | - | `plugin-sdk/approval-auth-runtime` | Helper auth approval | Resolusi approver, auth aksi obrolan yang sama | - | `plugin-sdk/approval-client-runtime` | Helper klien approval | Helper profil/filter approval exec native | - | `plugin-sdk/approval-delivery-runtime` | Helper pengiriman approval | Adaptor pengiriman/kapabilitas approval native | - | `plugin-sdk/approval-gateway-runtime` | Helper gateway approval | Helper resolusi gateway approval bersama | - | `plugin-sdk/approval-handler-adapter-runtime` | Helper adaptor approval | Helper pemuatan adaptor approval native yang ringan untuk hot channel entrypoint | - | `plugin-sdk/approval-handler-runtime` | Helper handler approval | Helper runtime handler approval yang lebih luas; pilih seam adaptor/gateway yang lebih sempit jika sudah cukup | + | `plugin-sdk/gateway-runtime` | Helper gateway | Helper client gateway dan patch status channel | + | `plugin-sdk/config-runtime` | Helper config | Helper load/write config | + | `plugin-sdk/telegram-command-config` | Helper perintah Telegram | Helper validasi perintah Telegram yang stabil-fallback ketika surface kontrak Telegram bawaan tidak tersedia | + | `plugin-sdk/approval-runtime` | Helper prompt approval | Payload approval exec/plugin, helper capability/profile approval, helper routing/runtime approval native | + | `plugin-sdk/approval-auth-runtime` | Helper auth approval | Resolusi approver, auth aksi same-chat | + | `plugin-sdk/approval-client-runtime` | Helper client approval | Helper profile/filter approval exec native | + | `plugin-sdk/approval-delivery-runtime` | Helper pengiriman approval | Adapter capability/pengiriman approval native | + | `plugin-sdk/approval-gateway-runtime` | Helper gateway approval | Helper resolusi-gateway approval bersama | + | `plugin-sdk/approval-handler-adapter-runtime` | Helper adapter approval | Helper pemuatan adapter approval native yang ringan untuk entrypoint channel yang panas | + | `plugin-sdk/approval-handler-runtime` | Helper handler approval | Helper runtime handler approval yang lebih luas; prioritaskan seam adapter/gateway yang lebih sempit bila itu sudah cukup | | `plugin-sdk/approval-native-runtime` | Helper target approval | Helper binding target/akun approval native | | `plugin-sdk/approval-reply-runtime` | Helper balasan approval | Helper payload balasan approval exec/plugin | - | `plugin-sdk/channel-runtime-context` | Helper konteks runtime channel | Helper register/get/watch konteks runtime channel generik | + | `plugin-sdk/channel-runtime-context` | Helper runtime-context channel | Helper register/get/watch runtime-context channel generik | | `plugin-sdk/security-runtime` | Helper keamanan | Helper trust, gating DM, konten eksternal, dan pengumpulan secret bersama | | `plugin-sdk/ssrf-policy` | Helper kebijakan SSRF | Helper allowlist host dan kebijakan jaringan privat | - | `plugin-sdk/ssrf-runtime` | Helper runtime SSRF | Pinned-dispatcher, fetch terlindungi, helper kebijakan SSRF | + | `plugin-sdk/ssrf-runtime` | Helper runtime SSRF | Helper pinned-dispatcher, guarded fetch, kebijakan SSRF | | `plugin-sdk/collection-runtime` | Helper cache terbatas | `pruneMapToMaxSize` | | `plugin-sdk/diagnostic-runtime` | Helper gating diagnostik | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` | - | `plugin-sdk/error-runtime` | Helper pemformatan error | `formatUncaughtError`, `isApprovalNotFoundError`, helper graph error | - | `plugin-sdk/fetch-runtime` | Helper fetch/proxy terbungkus | `resolveFetch`, helper proxy | + | `plugin-sdk/error-runtime` | Helper pemformatan error | `formatUncaughtError`, `isApprovalNotFoundError`, helper grafik error | + | `plugin-sdk/fetch-runtime` | Helper wrapped fetch/proxy | `resolveFetch`, helper proxy | | `plugin-sdk/host-runtime` | Helper normalisasi host | `normalizeHostname`, `normalizeScpRemoteHost` | | `plugin-sdk/retry-runtime` | Helper retry | `RetryConfig`, `retryAsync`, runner kebijakan | | `plugin-sdk/allow-from` | Pemformatan allowlist | `formatAllowFromLowercase` | | `plugin-sdk/allowlist-resolution` | Pemetaan input allowlist | `mapAllowlistResolutionInputs` | - | `plugin-sdk/command-auth` | Helper gating perintah dan permukaan perintah | `resolveControlCommandGate`, helper otorisasi pengirim, helper registry perintah | + | `plugin-sdk/command-auth` | Gating perintah dan helper surface perintah | `resolveControlCommandGate`, helper otorisasi pengirim, helper registry perintah | | `plugin-sdk/secret-input` | Parsing input secret | Helper input secret | - | `plugin-sdk/webhook-ingress` | Helper permintaan webhook | Utilitas target webhook | - | `plugin-sdk/webhook-request-guards` | Helper guard body webhook | Helper baca/batas body permintaan | - | `plugin-sdk/reply-runtime` | Runtime balasan bersama | Inbound dispatch, heartbeat, perencana balasan, chunking | - | `plugin-sdk/reply-dispatch-runtime` | Helper dispatch balasan sempit | Helper finalisasi + dispatch provider | + | `plugin-sdk/webhook-ingress` | Helper request webhook | Utilitas target webhook | + | `plugin-sdk/webhook-request-guards` | Helper guard body webhook | Helper baca/batas body request | + | `plugin-sdk/reply-runtime` | Runtime balasan bersama | Dispatch inbound, heartbeat, planner balasan, chunking | + | `plugin-sdk/reply-dispatch-runtime` | Helper dispatch balasan yang sempit | Helper finalisasi + dispatch provider | | `plugin-sdk/reply-history` | Helper riwayat balasan | `buildHistoryContext`, `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, `clearHistoryEntriesIfEnabled` | | `plugin-sdk/reply-reference` | Perencanaan referensi balasan | `createReplyReferencePlanner` | - | `plugin-sdk/reply-chunking` | Helper chunk balasan | Helper chunking teks/markdown | - | `plugin-sdk/session-store-runtime` | Helper penyimpanan sesi | Helper path store + updated-at | - | `plugin-sdk/state-paths` | Helper path status | Helper status dan direktori OAuth | + | `plugin-sdk/reply-chunking` | Helper potongan balasan | Helper chunking teks/markdown | + | `plugin-sdk/session-store-runtime` | Helper session store | Helper path store + updated-at | + | `plugin-sdk/state-paths` | Helper path state | Helper direktori state dan OAuth | | `plugin-sdk/routing` | Helper routing/session-key | `resolveAgentRoute`, `buildAgentSessionKey`, `resolveDefaultAgentBoundAccountId`, helper normalisasi session-key | - | `plugin-sdk/status-helpers` | Helper status channel | Builder ringkasan/snapshot status channel/akun, default status runtime, helper metadata isu | + | `plugin-sdk/status-helpers` | Helper status channel | Builder ringkasan status channel/akun, default runtime-state, helper metadata issue | | `plugin-sdk/target-resolver-runtime` | Helper target resolver | Helper target resolver bersama | | `plugin-sdk/string-normalization-runtime` | Helper normalisasi string | Helper normalisasi slug/string | - | `plugin-sdk/request-url` | Helper URL permintaan | Mengekstrak URL string dari input mirip-request | - | `plugin-sdk/run-command` | Helper perintah berjangka waktu | Runner perintah berjangka waktu dengan stdout/stderr yang dinormalisasi | + | `plugin-sdk/request-url` | Helper URL request | Mengekstrak URL string dari input mirip request | + | `plugin-sdk/run-command` | Helper perintah bertempo | Runner perintah bertempo dengan stdout/stderr ternormalisasi | | `plugin-sdk/param-readers` | Pembaca parameter | Pembaca parameter tool/CLI umum | - | `plugin-sdk/tool-send` | Ekstraksi pengiriman tool | Mengekstrak field target pengiriman kanonis dari argumen tool | - | `plugin-sdk/temp-path` | Helper path sementara | Helper path unduhan sementara bersama | - | `plugin-sdk/logging-core` | Helper logging | Logger subsistem dan helper redaksi | - | `plugin-sdk/markdown-table-runtime` | Helper tabel Markdown | Helper mode tabel Markdown | + | `plugin-sdk/tool-payload` | Ekstraksi payload tool | Mengekstrak payload ternormalisasi dari objek hasil tool | + | `plugin-sdk/tool-send` | Ekstraksi pengiriman tool | Mengekstrak field target kirim kanonis dari argumen tool | + | `plugin-sdk/temp-path` | Helper path temp | Helper path unduhan sementara bersama | + | `plugin-sdk/logging-core` | Helper logging | Helper logger subsistem dan redaksi | + | `plugin-sdk/markdown-table-runtime` | Helper tabel markdown | Helper mode tabel markdown | | `plugin-sdk/reply-payload` | Tipe balasan pesan | Tipe payload balasan | - | `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted yang dikurasi | Helper penemuan/konfigurasi provider self-hosted | - | `plugin-sdk/self-hosted-provider-setup` | Helper setup provider self-hosted yang kompatibel dengan OpenAI dan terfokus | Helper penemuan/konfigurasi provider self-hosted yang sama | + | `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted yang terkurasi | Helper penemuan/config provider self-hosted | + | `plugin-sdk/self-hosted-provider-setup` | Helper setup provider self-hosted kompatibel OpenAI yang terfokus | Helper penemuan/config provider self-hosted yang sama | | `plugin-sdk/provider-auth-runtime` | Helper auth runtime provider | Helper resolusi API key runtime | - | `plugin-sdk/provider-auth-api-key` | Helper setup API key provider | Helper onboarding/penulisan profil API key | - | `plugin-sdk/provider-auth-result` | Helper hasil auth provider | Builder hasil auth OAuth standar | + | `plugin-sdk/provider-auth-api-key` | Helper setup API key provider | Helper onboarding/profile-write API key | + | `plugin-sdk/provider-auth-result` | Helper hasil auth provider | Builder standar hasil auth OAuth | | `plugin-sdk/provider-auth-login` | Helper login interaktif provider | Helper login interaktif bersama | - | `plugin-sdk/provider-env-vars` | Helper env-var provider | Helper lookup env-var auth provider | + | `plugin-sdk/provider-env-vars` | Helper env var provider | Helper lookup env var auth provider | | `plugin-sdk/provider-model-shared` | Helper model/replay provider bersama | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, builder kebijakan replay bersama, helper endpoint provider, dan helper normalisasi model-id | | `plugin-sdk/provider-catalog-shared` | Helper katalog provider bersama | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` | - | `plugin-sdk/provider-onboard` | Patch onboarding provider | Helper konfigurasi onboarding | + | `plugin-sdk/provider-onboard` | Patch onboarding provider | Helper config onboarding | | `plugin-sdk/provider-http` | Helper HTTP provider | Helper kemampuan HTTP/endpoint provider generik | | `plugin-sdk/provider-web-fetch` | Helper web-fetch provider | Helper registrasi/cache provider web-fetch | - | `plugin-sdk/provider-web-search-contract` | Helper kontrak web-search provider | Helper kontrak konfigurasi/kredensial web-search yang sempit seperti `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial dengan cakupan tertentu | + | `plugin-sdk/provider-web-search-config-contract` | Helper config web-search provider | Helper config/kredensial web-search yang sempit untuk provider yang tidak memerlukan wiring enable plugin | + | `plugin-sdk/provider-web-search-contract` | Helper kontrak web-search provider | Helper kontrak config/kredensial web-search yang sempit seperti `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial terlingkup | | `plugin-sdk/provider-web-search` | Helper web-search provider | Helper registrasi/cache/runtime provider web-search | | `plugin-sdk/provider-tools` | Helper kompatibilitas tool/skema provider | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, pembersihan skema Gemini + diagnostik, dan helper kompatibilitas xAI seperti `resolveXaiModelCompatPatch` / `applyXaiModelCompat` | | `plugin-sdk/provider-usage` | Helper penggunaan provider | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage`, dan helper penggunaan provider lainnya | - | `plugin-sdk/provider-stream` | Helper wrapper stream provider | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipe wrapper stream, dan helper wrapper bersama Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot | - | `plugin-sdk/keyed-async-queue` | Antrean async berurutan | `KeyedAsyncQueue` | - | `plugin-sdk/media-runtime` | Helper media bersama | Helper fetch/transform/store media serta builder payload media | - | `plugin-sdk/media-generation-runtime` | Helper media-generation bersama | Helper failover bersama, pemilihan kandidat, dan pesan model hilang untuk pembuatan gambar/video/musik | - | `plugin-sdk/media-understanding` | Helper media-understanding | Tipe provider media understanding serta ekspor helper gambar/audio yang menghadap provider | - | `plugin-sdk/text-runtime` | Helper teks bersama | Penghapusan teks yang terlihat oleh asisten, helper render/chunking/tabel markdown, helper redaksi, helper tag direktif, utilitas teks aman, serta helper teks/logging terkait | + | `plugin-sdk/provider-stream` | Helper pembungkus stream provider | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipe pembungkus stream, dan helper pembungkus bersama Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot | + | `plugin-sdk/keyed-async-queue` | Queue async terurut | `KeyedAsyncQueue` | + | `plugin-sdk/media-runtime` | Helper media bersama | Helper fetch/transform/store media plus builder payload media | + | `plugin-sdk/media-generation-runtime` | Helper pembuatan media bersama | Helper failover bersama, pemilihan kandidat, dan pesan model hilang untuk pembuatan gambar/video/musik | + | `plugin-sdk/media-understanding` | Helper pemahaman media | Tipe provider pemahaman media plus ekspor helper gambar/audio untuk provider | + | `plugin-sdk/text-runtime` | Helper teks bersama | Penghapusan teks yang terlihat oleh asisten, helper render/chunking/table markdown, helper redaksi, helper tag direktif, utilitas safe-text, dan helper teks/logging terkait | | `plugin-sdk/text-chunking` | Helper chunking teks | Helper chunking teks outbound | - | `plugin-sdk/speech` | Helper speech | Tipe provider speech serta helper direktif, registry, dan validasi yang menghadap provider | - | `plugin-sdk/speech-core` | Core speech bersama | Tipe provider speech, registry, direktif, normalisasi | + | `plugin-sdk/speech` | Helper speech | Tipe provider speech plus ekspor helper direktif, registry, dan validasi untuk provider | + | `plugin-sdk/speech-core` | Inti speech bersama | Tipe provider speech, registry, direktif, normalisasi | | `plugin-sdk/realtime-transcription` | Helper transkripsi realtime | Tipe provider dan helper registry | | `plugin-sdk/realtime-voice` | Helper suara realtime | Tipe provider dan helper registry | - | `plugin-sdk/image-generation-core` | Core image-generation bersama | Tipe image-generation, failover, auth, dan helper registry | - | `plugin-sdk/music-generation` | Helper music-generation | Tipe provider/permintaan/hasil music-generation | - | `plugin-sdk/music-generation-core` | Core music-generation bersama | Tipe music-generation, helper failover, lookup provider, dan parsing model-ref | - | `plugin-sdk/video-generation` | Helper video-generation | Tipe provider/permintaan/hasil video-generation | - | `plugin-sdk/video-generation-core` | Core video-generation bersama | Tipe video-generation, helper failover, lookup provider, dan parsing model-ref | + | `plugin-sdk/image-generation-core` | Inti image-generation bersama | Tipe image-generation, failover, auth, dan helper registry | + | `plugin-sdk/music-generation` | Helper music-generation | Tipe provider/request/result music-generation | + | `plugin-sdk/music-generation-core` | Inti music-generation bersama | Tipe music-generation, helper failover, lookup provider, dan parsing model-ref | + | `plugin-sdk/video-generation` | Helper video-generation | Tipe provider/request/result video-generation | + | `plugin-sdk/video-generation-core` | Inti video-generation bersama | Tipe video-generation, helper failover, lookup provider, dan parsing model-ref | | `plugin-sdk/interactive-runtime` | Helper balasan interaktif | Normalisasi/reduksi payload balasan interaktif | - | `plugin-sdk/channel-config-primitives` | Primitive konfigurasi channel | Primitive config-schema channel yang sempit | - | `plugin-sdk/channel-config-writes` | Helper penulisan konfigurasi channel | Helper otorisasi penulisan konfigurasi channel | + | `plugin-sdk/channel-config-primitives` | Primitive config channel | Primitive channel config-schema yang sempit | + | `plugin-sdk/channel-config-writes` | Helper penulisan config channel | Helper otorisasi penulisan config channel | | `plugin-sdk/channel-plugin-common` | Prelude channel bersama | Ekspor prelude plugin channel bersama | | `plugin-sdk/channel-status` | Helper status channel | Helper snapshot/ringkasan status channel bersama | - | `plugin-sdk/allowlist-config-edit` | Helper konfigurasi allowlist | Helper edit/baca konfigurasi allowlist | + | `plugin-sdk/allowlist-config-edit` | Helper config allowlist | Helper edit/baca config allowlist | | `plugin-sdk/group-access` | Helper akses grup | Helper keputusan akses grup bersama | - | `plugin-sdk/direct-dm` | Helper direct-DM | Helper auth/guard direct-DM bersama | - | `plugin-sdk/extension-shared` | Helper extension bersama | Primitive channel/status pasif dan ambient proxy helper | - | `plugin-sdk/webhook-targets` | Helper target webhook | Registry target webhook dan helper instalasi route | + | `plugin-sdk/direct-dm` | Helper DM langsung | Helper auth/guard DM langsung bersama | + | `plugin-sdk/extension-shared` | Helper extension bersama | Primitive helper passive-channel/status dan ambient proxy | + | `plugin-sdk/webhook-targets` | Helper target webhook | Registry target webhook dan helper pemasangan route | | `plugin-sdk/webhook-path` | Helper path webhook | Helper normalisasi path webhook | - | `plugin-sdk/web-media` | Helper media web bersama | Helper pemuatan media remote/lokal | + | `plugin-sdk/web-media` | Helper media web bersama | Helper pemuatan media jarak jauh/lokal | | `plugin-sdk/zod` | Ekspor ulang Zod | `zod` yang diekspor ulang untuk konsumen plugin SDK | - | `plugin-sdk/memory-core` | Helper memory-core bawaan | Permukaan helper memory manager/config/file/CLI | - | `plugin-sdk/memory-core-engine-runtime` | Fasad runtime engine memori | Fasad runtime indeks/pencarian memori | - | `plugin-sdk/memory-core-host-engine-foundation` | Engine fondasi host memori | Ekspor engine fondasi host memori | - | `plugin-sdk/memory-core-host-engine-embeddings` | Engine embedding host memori | Ekspor engine embedding host memori | - | `plugin-sdk/memory-core-host-engine-qmd` | Engine QMD host memori | Ekspor engine QMD host memori | - | `plugin-sdk/memory-core-host-engine-storage` | Engine penyimpanan host memori | Ekspor engine penyimpanan host memori | - | `plugin-sdk/memory-core-host-multimodal` | Helper multimodal host memori | Helper multimodal host memori | - | `plugin-sdk/memory-core-host-query` | Helper kueri host memori | Helper kueri host memori | - | `plugin-sdk/memory-core-host-secret` | Helper secret host memori | Helper secret host memori | - | `plugin-sdk/memory-core-host-events` | Helper jurnal event host memori | Helper jurnal event host memori | - | `plugin-sdk/memory-core-host-status` | Helper status host memori | Helper status host memori | - | `plugin-sdk/memory-core-host-runtime-cli` | Runtime CLI host memori | Helper runtime CLI host memori | - | `plugin-sdk/memory-core-host-runtime-core` | Runtime core host memori | Helper runtime core host memori | - | `plugin-sdk/memory-core-host-runtime-files` | Helper file/runtime host memori | Helper file/runtime host memori | - | `plugin-sdk/memory-host-core` | Alias runtime core host memori | Alias netral-vendor untuk helper runtime core host memori | - | `plugin-sdk/memory-host-events` | Alias jurnal event host memori | Alias netral-vendor untuk helper jurnal event host memori | - | `plugin-sdk/memory-host-files` | Alias file/runtime host memori | Alias netral-vendor untuk helper file/runtime host memori | - | `plugin-sdk/memory-host-markdown` | Helper markdown terkelola | Helper managed-markdown bersama untuk plugin yang berdekatan dengan memori | - | `plugin-sdk/memory-host-search` | Fasad pencarian memori aktif | Fasad runtime lazy active-memory search-manager | - | `plugin-sdk/memory-host-status` | Alias status host memori | Alias netral-vendor untuk helper status host memori | - | `plugin-sdk/memory-lancedb` | Helper memory-lancedb bawaan | Permukaan helper memory-lancedb | - | `plugin-sdk/testing` | Utilitas pengujian | Helper dan mock pengujian | + | `plugin-sdk/memory-core` | Helper memory-core bawaan | Surface helper manajer/config/file/CLI memory | + | `plugin-sdk/memory-core-engine-runtime` | Fasad runtime engine memory | Fasad runtime index/search memory | + | `plugin-sdk/memory-core-host-engine-foundation` | Engine foundation host memory | Ekspor engine foundation host memory | + | `plugin-sdk/memory-core-host-engine-embeddings` | Engine embedding host memory | Ekspor engine embedding host memory | + | `plugin-sdk/memory-core-host-engine-qmd` | Engine QMD host memory | Ekspor engine QMD host memory | + | `plugin-sdk/memory-core-host-engine-storage` | Engine penyimpanan host memory | Ekspor engine penyimpanan host memory | + | `plugin-sdk/memory-core-host-multimodal` | Helper multimodal host memory | Helper multimodal host memory | + | `plugin-sdk/memory-core-host-query` | Helper query host memory | Helper query host memory | + | `plugin-sdk/memory-core-host-secret` | Helper secret host memory | Helper secret host memory | + | `plugin-sdk/memory-core-host-events` | Helper jurnal event host memory | Helper jurnal event host memory | + | `plugin-sdk/memory-core-host-status` | Helper status host memory | Helper status host memory | + | `plugin-sdk/memory-core-host-runtime-cli` | Runtime CLI host memory | Helper runtime CLI host memory | + | `plugin-sdk/memory-core-host-runtime-core` | Runtime inti host memory | Helper runtime inti host memory | + | `plugin-sdk/memory-core-host-runtime-files` | Helper file/runtime host memory | Helper file/runtime host memory | + | `plugin-sdk/memory-host-core` | Alias runtime inti host memory | Alias netral-vendor untuk helper runtime inti host memory | + | `plugin-sdk/memory-host-events` | Alias jurnal event host memory | Alias netral-vendor untuk helper jurnal event host memory | + | `plugin-sdk/memory-host-files` | Alias file/runtime host memory | Alias netral-vendor untuk helper file/runtime host memory | + | `plugin-sdk/memory-host-markdown` | Helper markdown terkelola | Helper managed-markdown bersama untuk plugin yang berdekatan dengan memory | + | `plugin-sdk/memory-host-search` | Fasad pencarian memory aktif | Fasad runtime search-manager active-memory lazy | + | `plugin-sdk/memory-host-status` | Alias status host memory | Alias netral-vendor untuk helper status host memory | + | `plugin-sdk/memory-lancedb` | Helper memory-lancedb bawaan | Surface helper memory-lancedb | + | `plugin-sdk/testing` | Utilitas pengujian | Helper pengujian dan mock | -Tabel ini sengaja merupakan subset migrasi umum, bukan permukaan SDK penuh. -Daftar lengkap 200+ entrypoint ada di +Tabel ini sengaja merupakan subset migrasi umum, bukan seluruh +surface SDK. Daftar lengkap 200+ entrypoint ada di `scripts/lib/plugin-sdk-entrypoints.json`. Daftar itu masih mencakup beberapa seam helper bundled-plugin seperti @@ -359,7 +362,7 @@ Aturan yang sama berlaku untuk keluarga helper bawaan lainnya seperti: - Matrix: `plugin-sdk/matrix*` - LINE: `plugin-sdk/line*` - IRC: `plugin-sdk/irc*` -- permukaan helper/plugin bawaan seperti `plugin-sdk/googlechat`, +- surface helper/plugin bawaan seperti `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles*`, `plugin-sdk/mattermost*`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, @@ -369,38 +372,38 @@ Aturan yang sama berlaku untuk keluarga helper bawaan lainnya seperti: `plugin-sdk/thread-ownership`, dan `plugin-sdk/voice-call` `plugin-sdk/github-copilot-token` saat ini mengekspos -permukaan helper token yang sempit `DEFAULT_COPILOT_API_BASE_URL`, +surface helper token yang sempit `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken`, dan `resolveCopilotApiToken`. -Gunakan import yang paling sempit yang sesuai dengan pekerjaan tersebut. Jika Anda tidak dapat menemukan ekspor, -periksa sumber di `src/plugin-sdk/` atau tanyakan di Discord. +Gunakan impor tersempit yang sesuai dengan pekerjaan Anda. Jika Anda tidak dapat menemukan ekspor, +periksa source di `src/plugin-sdk/` atau tanyakan di Discord. ## Linimasa penghapusan -| Kapan | Apa yang terjadi | -| ---------------------- | ----------------------------------------------------------------------- | -| **Sekarang** | Permukaan deprecated memunculkan peringatan runtime | -| **Rilis mayor berikutnya** | Permukaan deprecated akan dihapus; plugin yang masih menggunakannya akan gagal | +| Kapan | Apa yang terjadi | +| ---------------------- | --------------------------------------------------------------------- | +| **Sekarang** | Surface deprecated mengeluarkan peringatan runtime | +| **Rilis mayor berikutnya** | Surface deprecated akan dihapus; plugin yang masih menggunakannya akan gagal | -Semua plugin core sudah dimigrasikan. Plugin eksternal harus bermigrasi +Semua plugin core sudah dimigrasikan. Plugin eksternal sebaiknya bermigrasi sebelum rilis mayor berikutnya. -## Menyembunyikan peringatan untuk sementara +## Menyembunyikan peringatan sementara -Setel variabel environment ini saat Anda sedang mengerjakan migrasi: +Setel variabel environment ini saat Anda sedang melakukan migrasi: ```bash OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway run OPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run ``` -Ini adalah jalur keluar sementara, bukan solusi permanen. +Ini adalah celah keluar sementara, bukan solusi permanen. ## Terkait -- [Memulai](/id/plugins/building-plugins) — bangun plugin pertama Anda -- [Ikhtisar SDK](/id/plugins/sdk-overview) — referensi import subpath lengkap -- [Plugin Channel](/id/plugins/sdk-channel-plugins) — membangun plugin channel -- [Plugin Provider](/id/plugins/sdk-provider-plugins) — membangun plugin provider -- [Internal Plugin](/id/plugins/architecture) — pendalaman arsitektur -- [Manifest Plugin](/id/plugins/manifest) — referensi skema manifest +- [Getting Started](/id/plugins/building-plugins) — bangun plugin pertama Anda +- [SDK Overview](/id/plugins/sdk-overview) — referensi lengkap impor subpath +- [Channel Plugins](/id/plugins/sdk-channel-plugins) — membangun plugin channel +- [Provider Plugins](/id/plugins/sdk-provider-plugins) — membangun plugin provider +- [Plugin Internals](/id/plugins/architecture) — pendalaman arsitektur +- [Plugin Manifest](/id/plugins/manifest) — referensi skema manifest diff --git a/docs/id/plugins/sdk-overview.md b/docs/id/plugins/sdk-overview.md index e3bb19e3b..deb90b61b 100644 --- a/docs/id/plugins/sdk-overview.md +++ b/docs/id/plugins/sdk-overview.md @@ -1,28 +1,28 @@ --- read_when: - - Anda perlu mengetahui subpath SDK mana yang harus diimpor - - Anda menginginkan referensi untuk semua metode registrasi di OpenClawPluginApi + - Anda perlu mengetahui subpath SDK mana yang harus diimpor dari + - Anda menginginkan referensi untuk semua metode pendaftaran pada OpenClawPluginApi - Anda sedang mencari ekspor SDK tertentu sidebarTitle: SDK Overview -summary: Peta import, referensi API registrasi, dan arsitektur SDK -title: Ringkasan Plugin SDK +summary: Peta impor, referensi API pendaftaran, dan arsitektur SDK +title: Ikhtisar Plugin SDK x-i18n: - generated_at: "2026-04-08T02:17:43Z" + generated_at: "2026-04-08T09:13:46Z" model: gpt-5.4 provider: openai - source_hash: c5a41bd82d165dfbb7fbd6e4528cf322e9133a51efe55fa8518a7a0a626d9d30 + source_hash: 6e7b420eb0f3faa8916357d52df949f6c9a46f1c843a1e6a0c0b8bb26db6cbff source_path: plugins/sdk-overview.md workflow: 15 --- -# Ringkasan Plugin SDK +# Ikhtisar Plugin SDK Plugin SDK adalah kontrak bertipe antara plugin dan core. Halaman ini adalah referensi untuk **apa yang harus diimpor** dan **apa yang dapat Anda daftarkan**. **Mencari panduan cara melakukannya?** - - Plugin pertama? Mulai dari [Getting Started](/id/plugins/building-plugins) + - Plugin pertama? Mulai dengan [Getting Started](/id/plugins/building-plugins) - Plugin channel? Lihat [Channel Plugins](/id/plugins/sdk-channel-plugins) - Plugin provider? Lihat [Provider Plugins](/id/plugins/sdk-provider-plugins) @@ -36,8 +36,8 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core"; ``` -Setiap subpath adalah modul kecil yang mandiri. Ini menjaga startup tetap cepat dan -mencegah masalah circular dependency. Untuk helper entri/build khusus channel, +Setiap subpath adalah modul kecil yang berdiri sendiri. Ini menjaga startup tetap cepat dan +mencegah masalah dependensi melingkar. Untuk helper entry/build khusus channel, utamakan `openclaw/plugin-sdk/channel-core`; gunakan `openclaw/plugin-sdk/core` untuk permukaan payung yang lebih luas dan helper bersama seperti `buildChannelConfigSchema`. @@ -47,33 +47,33 @@ Jangan tambahkan atau bergantung pada seam kemudahan bernama provider seperti `openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, atau seam helper bermerek channel. Plugin bawaan harus menyusun subpath SDK generik di dalam barrel `api.ts` atau `runtime-api.ts` mereka sendiri, dan core -harus menggunakan barrel lokal plugin tersebut atau menambahkan kontrak SDK generik yang sempit -ketika kebutuhannya benar-benar lintas channel. +harus menggunakan barrel lokal plugin tersebut atau menambahkan kontrak SDK generik +yang sempit saat kebutuhannya benar-benar lintas channel. -Peta ekspor yang dihasilkan masih berisi sejumlah kecil seam helper -plugin bawaan seperti `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`, -`plugin-sdk/zalo`, `plugin-sdk/zalo-setup`, dan `plugin-sdk/matrix*`. Subpath tersebut -ada hanya untuk pemeliharaan dan kompatibilitas plugin bawaan; subpath itu -sengaja dihilangkan dari tabel umum di bawah ini dan bukan jalur impor yang +Peta ekspor yang dihasilkan masih memuat sejumlah kecil seam helper plugin bawaan +seperti `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`, +`plugin-sdk/zalo`, `plugin-sdk/zalo-setup`, dan `plugin-sdk/matrix*`. Subpath +tersebut hanya ada untuk pemeliharaan dan kompatibilitas plugin bawaan; subpath itu +sengaja tidak dimasukkan dari tabel umum di bawah dan bukan jalur impor yang direkomendasikan untuk plugin pihak ketiga yang baru. ## Referensi subpath -Subpath yang paling umum digunakan, dikelompokkan berdasarkan tujuan. Daftar lengkap -lebih dari 200 subpath yang dihasilkan ada di `scripts/lib/plugin-sdk-entrypoints.json`. +Subpath yang paling umum digunakan, dikelompokkan berdasarkan tujuan. Daftar lengkap yang dihasilkan +berisi lebih dari 200 subpath ada di `scripts/lib/plugin-sdk-entrypoints.json`. -Subpath helper plugin bawaan yang dicadangkan masih muncul di daftar hasil generate tersebut. -Perlakukan itu sebagai detail implementasi/permukaan kompatibilitas kecuali halaman dokumen +Subpath helper plugin bawaan yang dicadangkan masih muncul dalam daftar yang dihasilkan itu. +Perlakukan itu sebagai permukaan detail implementasi/kompatibilitas kecuali suatu halaman dokumentasi secara eksplisit mempromosikannya sebagai publik. ### Entri plugin -| Subpath | Ekspor utama | -| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `plugin-sdk/plugin-entry` | `definePluginEntry` | +| Subpath | Ekspor utama | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| `plugin-sdk/plugin-entry` | `definePluginEntry` | | `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` | -| `plugin-sdk/config-schema` | `OpenClawSchema` | -| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` | +| `plugin-sdk/config-schema` | `OpenClawSchema` | +| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` | @@ -81,29 +81,29 @@ secara eksplisit mempromosikannya sebagai publik. | --- | --- | | `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` | | `plugin-sdk/config-schema` | Ekspor skema Zod root `openclaw.json` (`OpenClawSchema`) | - | `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, ditambah `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` | - | `plugin-sdk/setup` | Helper wizard setup bersama, prompt allowlist, pembuat status setup | + | `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, serta `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` | + | `plugin-sdk/setup` | Helper wizard setup bersama, prompt allowlist, builder status setup | | `plugin-sdk/setup-runtime` | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` | | `plugin-sdk/setup-adapter-runtime` | `createEnvPatchedAccountSetupAdapter` | | `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` | - | `plugin-sdk/account-core` | Helper config multi-akun/action-gate, helper fallback akun default | + | `plugin-sdk/account-core` | Helper multi-akun config/action-gate, helper fallback akun default | | `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, helper normalisasi account-id | - | `plugin-sdk/account-resolution` | Pencarian akun + helper fallback default | - | `plugin-sdk/account-helpers` | Helper sempit untuk daftar akun/aksi akun | + | `plugin-sdk/account-resolution` | Helper pencarian akun + fallback default | + | `plugin-sdk/account-helpers` | Helper sempit untuk daftar akun/tindakan akun | | `plugin-sdk/channel-pairing` | `createChannelPairingController` | | `plugin-sdk/channel-reply-pipeline` | `createChannelReplyPipeline` | | `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter` | | `plugin-sdk/channel-config-schema` | Tipe skema config channel | - | `plugin-sdk/telegram-command-config` | Helper normalisasi/validasi custom-command Telegram dengan fallback kontrak bawaan | + | `plugin-sdk/telegram-command-config` | Helper normalisasi/validasi custom command Telegram dengan fallback kontrak bawaan | | `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` | | `plugin-sdk/channel-lifecycle` | `createAccountStatusSink` | - | `plugin-sdk/inbound-envelope` | Helper bersama untuk route inbound + pembuat envelope | - | `plugin-sdk/inbound-reply-dispatch` | Helper bersama untuk pencatatan dan dispatch inbound | + | `plugin-sdk/inbound-envelope` | Helper rute inbound + builder envelope bersama | + | `plugin-sdk/inbound-reply-dispatch` | Helper record-and-dispatch inbound bersama | | `plugin-sdk/messaging-targets` | Helper parsing/pencocokan target | - | `plugin-sdk/outbound-media` | Helper bersama pemuatan media outbound | - | `plugin-sdk/outbound-runtime` | Helper identitas outbound/send delegate | + | `plugin-sdk/outbound-media` | Helper pemuatan media outbound bersama | + | `plugin-sdk/outbound-runtime` | Helper identitas outbound/delegasi pengiriman | | `plugin-sdk/thread-bindings-runtime` | Siklus hidup thread-binding dan helper adapter | - | `plugin-sdk/agent-media-payload` | Pembuat payload media agen lama | + | `plugin-sdk/agent-media-payload` | Builder payload media agent lama | | `plugin-sdk/conversation-runtime` | Helper binding percakapan/thread, pairing, dan configured-binding | | `plugin-sdk/runtime-config-snapshot` | Helper snapshot config runtime | | `plugin-sdk/runtime-group-policy` | Helper resolusi group-policy runtime | @@ -115,35 +115,36 @@ secara eksplisit mempromosikannya sebagai publik. | `plugin-sdk/group-access` | Helper keputusan akses grup bersama | | `plugin-sdk/direct-dm` | Helper auth/guard direct-DM bersama | | `plugin-sdk/interactive-runtime` | Helper normalisasi/reduksi payload balasan interaktif | - | `plugin-sdk/channel-inbound` | Helper debounce inbound, pencocokan mention, helper mention-policy, dan helper envelope | + | `plugin-sdk/channel-inbound` | Debounce inbound, pencocokan mention, helper kebijakan mention, dan helper envelope | | `plugin-sdk/channel-send-result` | Tipe hasil balasan | | `plugin-sdk/channel-actions` | `createMessageToolButtonsSchema`, `createMessageToolCardSchema` | | `plugin-sdk/channel-targets` | Helper parsing/pencocokan target | | `plugin-sdk/channel-contract` | Tipe kontrak channel | | `plugin-sdk/channel-feedback` | Wiring feedback/reaksi | - | `plugin-sdk/channel-secret-runtime` | Helper kontrak rahasia yang sempit seperti `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, dan tipe target rahasia | + | `plugin-sdk/channel-secret-runtime` | Helper kontrak secret yang sempit seperti `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, dan tipe target secret | | Subpath | Ekspor utama | | --- | --- | | `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` | - | `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted yang dikurasi | - | `plugin-sdk/self-hosted-provider-setup` | Helper setup provider self-hosted yang kompatibel dengan OpenAI dan terfokus | + | `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted yang terkurasi | + | `plugin-sdk/self-hosted-provider-setup` | Helper setup provider self-hosted kompatibel OpenAI yang terfokus | | `plugin-sdk/cli-backend` | Default backend CLI + konstanta watchdog | | `plugin-sdk/provider-auth-runtime` | Helper resolusi API key runtime untuk plugin provider | | `plugin-sdk/provider-auth-api-key` | Helper onboarding/penulisan profil API key seperti `upsertApiKeyProfile` | - | `plugin-sdk/provider-auth-result` | Pembuat hasil auth OAuth standar | + | `plugin-sdk/provider-auth-result` | Builder hasil auth OAuth standar | | `plugin-sdk/provider-auth-login` | Helper login interaktif bersama untuk plugin provider | | `plugin-sdk/provider-env-vars` | Helper pencarian env var auth provider | | `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile`, `upsertApiKeyProfile`, `writeOAuthCredentials` | - | `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, pembuat replay-policy bersama, helper endpoint provider, dan helper normalisasi model-id seperti `normalizeNativeXaiModelId` | + | `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, builder kebijakan replay bersama, helper endpoint provider, dan helper normalisasi model-id seperti `normalizeNativeXaiModelId` | | `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` | - | `plugin-sdk/provider-http` | Helper generic kemampuan HTTP/endpoint provider | + | `plugin-sdk/provider-http` | Helper kapabilitas HTTP/endpoint provider generik | | `plugin-sdk/provider-web-fetch-contract` | Helper kontrak config/seleksi web-fetch yang sempit seperti `enablePluginInConfig` dan `WebFetchProviderPlugin` | - | `plugin-sdk/provider-web-fetch` | Helper registrasi/cache provider web-fetch | - | `plugin-sdk/provider-web-search-contract` | Helper kontrak config/kredensial web-search yang sempit seperti `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial terlingkup | - | `plugin-sdk/provider-web-search` | Helper registrasi/cache/runtime provider web-search | + | `plugin-sdk/provider-web-fetch` | Helper pendaftaran/cache provider web-fetch | + | `plugin-sdk/provider-web-search-config-contract` | Helper config/kredensial web-search yang sempit untuk provider yang tidak memerlukan wiring enable plugin | + | `plugin-sdk/provider-web-search-contract` | Helper kontrak config/kredensial web-search yang sempit seperti `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial berpencakupan | + | `plugin-sdk/provider-web-search` | Helper pendaftaran/cache/runtime provider web-search | | `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, pembersihan skema Gemini + diagnostik, dan helper kompatibilitas xAI seperti `resolveXaiModelCompatPatch` / `applyXaiModelCompat` | | `plugin-sdk/provider-usage` | `fetchClaudeUsage` dan yang serupa | | `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipe wrapper stream, dan helper wrapper bersama Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot | @@ -154,110 +155,111 @@ secara eksplisit mempromosikannya sebagai publik. | Subpath | Ekspor utama | | --- | --- | - | `plugin-sdk/command-auth` | `resolveControlCommandGate`, helper registry command, helper otorisasi pengirim | - | `plugin-sdk/approval-auth-runtime` | Helper resolusi approver dan action-auth dalam chat yang sama | - | `plugin-sdk/approval-client-runtime` | Helper profil/filter persetujuan exec native | - | `plugin-sdk/approval-delivery-runtime` | Adapter kemampuan/pengiriman persetujuan native | - | `plugin-sdk/approval-gateway-runtime` | Helper bersama resolusi gateway persetujuan | - | `plugin-sdk/approval-handler-adapter-runtime` | Helper pemuatan adapter persetujuan native yang ringan untuk entrypoint channel panas | - | `plugin-sdk/approval-handler-runtime` | Helper runtime approval handler yang lebih luas; utamakan seam adapter/gateway yang lebih sempit jika sudah cukup | - | `plugin-sdk/approval-native-runtime` | Helper target persetujuan native + account-binding | - | `plugin-sdk/approval-reply-runtime` | Helper payload balasan persetujuan exec/plugin | - | `plugin-sdk/command-auth-native` | Helper auth command native + session-target native | + | `plugin-sdk/command-auth` | `resolveControlCommandGate`, helper registri command, helper otorisasi pengirim | + | `plugin-sdk/approval-auth-runtime` | Helper resolusi approver dan auth tindakan obrolan yang sama | + | `plugin-sdk/approval-client-runtime` | Helper profil/filter approval exec native | + | `plugin-sdk/approval-delivery-runtime` | Adapter kapabilitas/pengiriman approval native | + | `plugin-sdk/approval-gateway-runtime` | Helper resolusi gateway approval bersama | + | `plugin-sdk/approval-handler-adapter-runtime` | Helper pemuatan adapter approval native ringan untuk entrypoint channel yang sering dipanggil | + | `plugin-sdk/approval-handler-runtime` | Helper runtime handler approval yang lebih luas; utamakan seam adapter/gateway yang lebih sempit bila itu sudah cukup | + | `plugin-sdk/approval-native-runtime` | Helper target approval native + binding akun | + | `plugin-sdk/approval-reply-runtime` | Helper payload balasan approval exec/plugin | + | `plugin-sdk/command-auth-native` | Auth command native + helper target sesi native | | `plugin-sdk/command-detection` | Helper deteksi command bersama | - | `plugin-sdk/command-surface` | Normalisasi isi command dan helper permukaan command | + | `plugin-sdk/command-surface` | Helper normalisasi badan command dan permukaan command | | `plugin-sdk/allow-from` | `formatAllowFromLowercase` | - | `plugin-sdk/channel-secret-runtime` | Helper pengumpulan kontrak rahasia yang sempit untuk permukaan rahasia channel/plugin | - | `plugin-sdk/secret-ref-runtime` | Helper sempit `coerceSecretRef` dan pengetikan SecretRef untuk parsing kontrak/config rahasia | - | `plugin-sdk/security-runtime` | Helper bersama untuk trust, gating DM, konten eksternal, dan pengumpulan rahasia | + | `plugin-sdk/channel-secret-runtime` | Helper koleksi kontrak secret yang sempit untuk permukaan secret channel/plugin | + | `plugin-sdk/secret-ref-runtime` | Helper `coerceSecretRef` yang sempit dan helper tipe SecretRef untuk parsing kontrak secret/config | + | `plugin-sdk/security-runtime` | Helper trust, gating DM, konten eksternal, dan pengumpulan secret bersama | | `plugin-sdk/ssrf-policy` | Helper allowlist host dan kebijakan SSRF jaringan privat | - | `plugin-sdk/ssrf-runtime` | Helper pinned-dispatcher, fetch dengan penjagaan SSRF, dan kebijakan SSRF | - | `plugin-sdk/secret-input` | Helper parsing input rahasia | + | `plugin-sdk/ssrf-runtime` | Helper pinned-dispatcher, fetch yang dijaga SSRF, dan kebijakan SSRF | + | `plugin-sdk/secret-input` | Helper parsing input secret | | `plugin-sdk/webhook-ingress` | Helper request/target webhook | - | `plugin-sdk/webhook-request-guards` | Helper ukuran isi request/timeout | + | `plugin-sdk/webhook-request-guards` | Helper ukuran body/timeout request | | Subpath | Ekspor utama | | --- | --- | - | `plugin-sdk/runtime` | Helper runtime/logging/backup/instalasi plugin yang luas | - | `plugin-sdk/runtime-env` | Helper sempit untuk env runtime, logger, timeout, retry, dan backoff | - | `plugin-sdk/channel-runtime-context` | Helper registrasi dan pencarian runtime-context channel generik | + | `plugin-sdk/runtime` | Helper runtime/logging/backup/instal plugin yang luas | + | `plugin-sdk/runtime-env` | Helper env runtime, logger, timeout, retry, dan backoff yang sempit | + | `plugin-sdk/channel-runtime-context` | Helper generik untuk pendaftaran dan pencarian konteks runtime channel | | `plugin-sdk/runtime-store` | `createPluginRuntimeStore` | - | `plugin-sdk/plugin-runtime` | Helper bersama untuk command/hook/http/interaktif plugin | - | `plugin-sdk/hook-runtime` | Helper pipeline webhook/internal hook bersama | + | `plugin-sdk/plugin-runtime` | Helper command/hook/http/interaktif plugin bersama | + | `plugin-sdk/hook-runtime` | Helper pipeline hook webhook/internal bersama | | `plugin-sdk/lazy-runtime` | Helper impor/binding runtime lazy seperti `createLazyRuntimeModule`, `createLazyRuntimeMethod`, dan `createLazyRuntimeSurface` | - | `plugin-sdk/process-runtime` | Helper process exec | - | `plugin-sdk/cli-runtime` | Helper formatting CLI, wait, dan versi | + | `plugin-sdk/process-runtime` | Helper eksekusi proses | + | `plugin-sdk/cli-runtime` | Helper format, tunggu, dan versi CLI | | `plugin-sdk/gateway-runtime` | Helper client gateway dan patch status channel | | `plugin-sdk/config-runtime` | Helper pemuatan/penulisan config | - | `plugin-sdk/telegram-command-config` | Normalisasi nama/deskripsi command Telegram dan pemeriksaan duplikasi/konflik, bahkan ketika permukaan kontrak Telegram bawaan tidak tersedia | - | `plugin-sdk/approval-runtime` | Helper persetujuan exec/plugin, pembuat approval-capability, helper auth/profile, helper routing/runtime native | + | `plugin-sdk/telegram-command-config` | Normalisasi nama/deskripsi command Telegram dan pemeriksaan duplikat/konflik, bahkan saat permukaan kontrak Telegram bawaan tidak tersedia | + | `plugin-sdk/approval-runtime` | Helper approval exec/plugin, builder kapabilitas approval, helper auth/profil, helper routing/runtime native | | `plugin-sdk/reply-runtime` | Helper runtime inbound/balasan bersama, chunking, dispatch, heartbeat, perencana balasan | - | `plugin-sdk/reply-dispatch-runtime` | Helper sempit untuk dispatch/finalisasi balasan | - | `plugin-sdk/reply-history` | Helper bersama reply-history jendela pendek seperti `buildHistoryContext`, `recordPendingHistoryEntry`, dan `clearHistoryEntriesIfEnabled` | + | `plugin-sdk/reply-dispatch-runtime` | Helper dispatch/finalisasi balasan yang sempit | + | `plugin-sdk/reply-history` | Helper riwayat balasan jendela pendek bersama seperti `buildHistoryContext`, `recordPendingHistoryEntry`, dan `clearHistoryEntriesIfEnabled` | | `plugin-sdk/reply-reference` | `createReplyReferencePlanner` | - | `plugin-sdk/reply-chunking` | Helper sempit chunking teks/markdown | - | `plugin-sdk/session-store-runtime` | Helper path session store + updated-at | + | `plugin-sdk/reply-chunking` | Helper chunking teks/markdown yang sempit | + | `plugin-sdk/session-store-runtime` | Helper path penyimpanan sesi + updated-at | | `plugin-sdk/state-paths` | Helper path direktori state/OAuth | - | `plugin-sdk/routing` | Helper binding route/kunci sesi/akun seperti `resolveAgentRoute`, `buildAgentSessionKey`, dan `resolveDefaultAgentBoundAccountId` | - | `plugin-sdk/status-helpers` | Helper bersama ringkasan status channel/akun, default status runtime, dan helper metadata masalah | - | `plugin-sdk/target-resolver-runtime` | Helper target resolver bersama | + | `plugin-sdk/routing` | Helper rute/kunci sesi/binding akun seperti `resolveAgentRoute`, `buildAgentSessionKey`, dan `resolveDefaultAgentBoundAccountId` | + | `plugin-sdk/status-helpers` | Helper ringkasan status channel/akun bersama, default state runtime, dan helper metadata isu | + | `plugin-sdk/target-resolver-runtime` | Helper resolver target bersama | | `plugin-sdk/string-normalization-runtime` | Helper normalisasi slug/string | - | `plugin-sdk/request-url` | Ekstrak URL string dari input yang mirip fetch/request | + | `plugin-sdk/request-url` | Ekstrak URL string dari input mirip fetch/request | | `plugin-sdk/run-command` | Runner command bertimer dengan hasil stdout/stderr yang dinormalisasi | - | `plugin-sdk/param-readers` | Pembaca param tool/CLI umum | + | `plugin-sdk/param-readers` | Pembaca param umum untuk tool/CLI | + | `plugin-sdk/tool-payload` | Ekstrak payload yang dinormalisasi dari objek hasil tool | | `plugin-sdk/tool-send` | Ekstrak field target pengiriman kanonis dari argumen tool | - | `plugin-sdk/temp-path` | Helper bersama untuk path unduhan sementara | + | `plugin-sdk/temp-path` | Helper path unduhan sementara bersama | | `plugin-sdk/logging-core` | Helper logger subsistem dan redaksi | | `plugin-sdk/markdown-table-runtime` | Helper mode tabel Markdown | - | `plugin-sdk/json-store` | Helper kecil baca/tulis state JSON | + | `plugin-sdk/json-store` | Helper baca/tulis state JSON kecil | | `plugin-sdk/file-lock` | Helper file-lock re-entrant | | `plugin-sdk/persistent-dedupe` | Helper cache dedupe berbasis disk | | `plugin-sdk/acp-runtime` | Helper ACP runtime/sesi dan reply-dispatch | - | `plugin-sdk/agent-config-primitives` | Primitive sempit skema config runtime agen | + | `plugin-sdk/agent-config-primitives` | Primitive sempit skema config runtime agent | | `plugin-sdk/boolean-param` | Pembaca param boolean longgar | | `plugin-sdk/dangerous-name-runtime` | Helper resolusi pencocokan nama berbahaya | | `plugin-sdk/device-bootstrap` | Helper bootstrap perangkat dan token pairing | | `plugin-sdk/extension-shared` | Primitive helper bersama untuk passive-channel, status, dan ambient proxy | | `plugin-sdk/models-provider-runtime` | Helper balasan command/provider `/models` | | `plugin-sdk/skill-commands-runtime` | Helper daftar skill command | - | `plugin-sdk/native-command-registry` | Helper registrasi/build/serialisasi command native | - | `plugin-sdk/provider-zai-endpoint` | Helper deteksi endpoint Z.A.I | - | `plugin-sdk/infra-runtime` | Helper system event/heartbeat | + | `plugin-sdk/native-command-registry` | Helper registry/build/serialize command native | + | `plugin-sdk/provider-zai-endpoint` | Helper deteksi endpoint Z.AI | + | `plugin-sdk/infra-runtime` | Helper event sistem/heartbeat | | `plugin-sdk/collection-runtime` | Helper cache kecil yang dibatasi | | `plugin-sdk/diagnostic-runtime` | Helper flag dan event diagnostik | - | `plugin-sdk/error-runtime` | Graph error, formatting, helper klasifikasi error bersama, `isApprovalNotFoundError` | - | `plugin-sdk/fetch-runtime` | Helper fetch terbungkus, proxy, dan pinned lookup | + | `plugin-sdk/error-runtime` | Helper graf error, formatting, klasifikasi error bersama, `isApprovalNotFoundError` | + | `plugin-sdk/fetch-runtime` | Helper fetch terbungkus, proxy, dan pencarian pinned | | `plugin-sdk/host-runtime` | Helper normalisasi hostname dan host SCP | | `plugin-sdk/retry-runtime` | Helper config retry dan runner retry | - | `plugin-sdk/agent-runtime` | Helper direktori/identitas/workspace agen | + | `plugin-sdk/agent-runtime` | Helper direktori/identitas/workspace agent | | `plugin-sdk/directory-runtime` | Query/dedup direktori berbasis config | | `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` | - + | Subpath | Ekspor utama | | --- | --- | - | `plugin-sdk/media-runtime` | Helper bersama fetch/transform/store media plus pembuat payload media | - | `plugin-sdk/media-generation-runtime` | Helper bersama failover pembuatan media, pemilihan kandidat, dan pesan model yang hilang | - | `plugin-sdk/media-understanding` | Tipe provider pemahaman media plus ekspor helper gambar/audio untuk provider | - | `plugin-sdk/text-runtime` | Helper bersama teks/markdown/logging seperti penghapusan teks yang terlihat oleh asisten, helper render/chunking/table markdown, helper redaksi, helper directive-tag, dan utilitas safe-text | + | `plugin-sdk/media-runtime` | Helper fetch/transform/store media bersama plus builder payload media | + | `plugin-sdk/media-generation-runtime` | Helper failover media-generation bersama, pemilihan kandidat, dan pesan model yang hilang | + | `plugin-sdk/media-understanding` | Tipe provider media understanding plus ekspor helper gambar/audio yang menghadap provider | + | `plugin-sdk/text-runtime` | Helper teks/markdown/logging bersama seperti penghapusan teks yang terlihat oleh asisten, helper render/chunking/tabel markdown, helper redaksi, helper tag arahan, dan utilitas safe-text | | `plugin-sdk/text-chunking` | Helper chunking teks outbound | - | `plugin-sdk/speech` | Tipe provider ucapan plus helper directive, registry, dan validasi untuk provider | - | `plugin-sdk/speech-core` | Tipe provider ucapan bersama, registry, directive, dan helper normalisasi | - | `plugin-sdk/realtime-transcription` | Tipe provider transkripsi realtime dan helper registry | - | `plugin-sdk/realtime-voice` | Tipe provider suara realtime dan helper registry | - | `plugin-sdk/image-generation` | Tipe provider pembuatan gambar | - | `plugin-sdk/image-generation-core` | Tipe pembuatan gambar bersama, failover, auth, dan helper registry | - | `plugin-sdk/music-generation` | Tipe provider/request/result pembuatan musik | - | `plugin-sdk/music-generation-core` | Tipe pembuatan musik bersama, helper failover, pencarian provider, dan parsing model-ref | - | `plugin-sdk/video-generation` | Tipe provider/request/result pembuatan video | - | `plugin-sdk/video-generation-core` | Tipe pembuatan video bersama, helper failover, pencarian provider, dan parsing model-ref | - | `plugin-sdk/webhook-targets` | Helper registry target webhook dan instalasi route | + | `plugin-sdk/speech` | Tipe provider speech plus ekspor helper arahan, registri, dan validasi yang menghadap provider | + | `plugin-sdk/speech-core` | Tipe provider speech bersama, registri, arahan, dan helper normalisasi | + | `plugin-sdk/realtime-transcription` | Tipe provider realtime transcription dan helper registri | + | `plugin-sdk/realtime-voice` | Tipe provider realtime voice dan helper registri | + | `plugin-sdk/image-generation` | Tipe provider image generation | + | `plugin-sdk/image-generation-core` | Tipe image-generation bersama, failover, auth, dan helper registri | + | `plugin-sdk/music-generation` | Tipe provider/request/result music generation | + | `plugin-sdk/music-generation-core` | Tipe music-generation bersama, helper failover, pencarian provider, dan parsing model-ref | + | `plugin-sdk/video-generation` | Tipe provider/request/result video generation | + | `plugin-sdk/video-generation-core` | Tipe video-generation bersama, helper failover, pencarian provider, dan parsing model-ref | + | `plugin-sdk/webhook-targets` | Registry target webhook dan helper pemasangan rute | | `plugin-sdk/webhook-path` | Helper normalisasi path webhook | - | `plugin-sdk/web-media` | Helper bersama pemuatan media remote/lokal | - | `plugin-sdk/zod` | `zod` yang diekspor ulang untuk konsumen Plugin SDK | + | `plugin-sdk/web-media` | Helper pemuatan media remote/lokal bersama | + | `plugin-sdk/zod` | `zod` yang diekspor ulang untuk konsumen plugin SDK | | `plugin-sdk/testing` | `installCommonResolveTargetErrorCases`, `shouldAckReaction` | @@ -272,13 +274,13 @@ secara eksplisit mempromosikannya sebagai publik. | `plugin-sdk/memory-core-host-engine-storage` | Ekspor engine penyimpanan host memori | | `plugin-sdk/memory-core-host-multimodal` | Helper multimodal host memori | | `plugin-sdk/memory-core-host-query` | Helper query host memori | - | `plugin-sdk/memory-core-host-secret` | Helper rahasia host memori | + | `plugin-sdk/memory-core-host-secret` | Helper secret host memori | | `plugin-sdk/memory-core-host-events` | Helper jurnal event host memori | | `plugin-sdk/memory-core-host-status` | Helper status host memori | | `plugin-sdk/memory-core-host-runtime-cli` | Helper runtime CLI host memori | | `plugin-sdk/memory-core-host-runtime-core` | Helper runtime core host memori | | `plugin-sdk/memory-core-host-runtime-files` | Helper file/runtime host memori | - | `plugin-sdk/memory-host-core` | Alias netral-vendor untuk helper runtime core host memori | + | `plugin-sdk/memory-host-core` | Alias netral-vendor untuk helper runtime inti host memori | | `plugin-sdk/memory-host-events` | Alias netral-vendor untuk helper jurnal event host memori | | `plugin-sdk/memory-host-files` | Alias netral-vendor untuk helper file/runtime host memori | | `plugin-sdk/memory-host-markdown` | Helper managed-markdown bersama untuk plugin yang berdekatan dengan memori | @@ -288,72 +290,73 @@ secara eksplisit mempromosikannya sebagai publik. - | Family | Subpath saat ini | Tujuan penggunaan | + | Family | Subpath saat ini | Penggunaan yang dimaksudkan | | --- | --- | --- | - | Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Helper dukungan plugin browser bawaan (`browser-support` tetap menjadi compatibility barrel) | + | Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Helper dukungan plugin browser bawaan (`browser-support` tetap menjadi barrel kompatibilitas) | | Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Permukaan helper/runtime Matrix bawaan | | Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Permukaan helper/runtime LINE bawaan | | IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Permukaan helper IRC bawaan | | Helper khusus channel | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Seam kompatibilitas/helper channel bawaan | - | Helper auth/plugin khusus | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Seam helper fitur/plugin bawaan; `plugin-sdk/github-copilot-token` saat ini mengekspor `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken`, dan `resolveCopilotApiToken` | + | Helper khusus auth/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Seam helper fitur/plugin bawaan; `plugin-sdk/github-copilot-token` saat ini mengekspor `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken`, dan `resolveCopilotApiToken` | -## API registrasi +## API pendaftaran -Callback `register(api)` menerima objek `OpenClawPluginApi` dengan metode berikut: +Callback `register(api)` menerima objek `OpenClawPluginApi` dengan metode-metode +berikut: -### Registrasi capability +### Pendaftaran kapabilitas -| Metode | Yang didaftarkan | +| Method | Apa yang didaftarkan | | ------------------------------------------------ | -------------------------------- | | `api.registerProvider(...)` | Inferensi teks (LLM) | | `api.registerCliBackend(...)` | Backend inferensi CLI lokal | -| `api.registerChannel(...)` | Channel pesan | -| `api.registerSpeechProvider(...)` | Sintesis text-to-speech / STT | -| `api.registerRealtimeTranscriptionProvider(...)` | Transkripsi realtime streaming | -| `api.registerRealtimeVoiceProvider(...)` | Sesi suara realtime duplex | -| `api.registerMediaUnderstandingProvider(...)` | Analisis gambar/audio/video | +| `api.registerChannel(...)` | Channel pesan | +| `api.registerSpeechProvider(...)` | Sintesis teks-ke-suara / STT | +| `api.registerRealtimeTranscriptionProvider(...)` | Transkripsi realtime streaming | +| `api.registerRealtimeVoiceProvider(...)` | Sesi suara realtime dupleks | +| `api.registerMediaUnderstandingProvider(...)` | Analisis gambar/audio/video | | `api.registerImageGenerationProvider(...)` | Pembuatan gambar | -| `api.registerMusicGenerationProvider(...)` | Pembuatan musik | -| `api.registerVideoGenerationProvider(...)` | Pembuatan video | -| `api.registerWebFetchProvider(...)` | Provider fetch / scrape web | -| `api.registerWebSearchProvider(...)` | Pencarian web | +| `api.registerMusicGenerationProvider(...)` | Pembuatan musik | +| `api.registerVideoGenerationProvider(...)` | Pembuatan video | +| `api.registerWebFetchProvider(...)` | Provider web fetch / scrape | +| `api.registerWebSearchProvider(...)` | Pencarian web | ### Tools dan command -| Metode | Yang didaftarkan | -| ------------------------------- | ---------------------------------------------- | -| `api.registerTool(tool, opts?)` | Tool agen (wajib atau `{ optional: true }`) | -| `api.registerCommand(def)` | Command kustom (melewati LLM) | +| Method | Apa yang didaftarkan | +| ------------------------------- | --------------------------------------------- | +| `api.registerTool(tool, opts?)` | Tool agent (wajib atau `{ optional: true }`) | +| `api.registerCommand(def)` | Command kustom (melewati LLM) | ### Infrastruktur -| Metode | Yang didaftarkan | +| Method | Apa yang didaftarkan | | ---------------------------------------------- | --------------------------------------- | -| `api.registerHook(events, handler, opts?)` | Event hook | +| `api.registerHook(events, handler, opts?)` | Hook event | | `api.registerHttpRoute(params)` | Endpoint HTTP gateway | | `api.registerGatewayMethod(name, handler)` | Metode RPC gateway | | `api.registerCli(registrar, opts?)` | Subcommand CLI | -| `api.registerService(service)` | Layanan background | -| `api.registerInteractiveHandler(registration)` | Interactive handler | -| `api.registerMemoryPromptSupplement(builder)` | Bagian prompt tambahan yang berdekatan dengan memori | -| `api.registerMemoryCorpusSupplement(adapter)` | Korpus pencarian/baca memori tambahan | +| `api.registerService(service)` | Layanan latar belakang | +| `api.registerInteractiveHandler(registration)` | Handler interaktif | +| `api.registerMemoryPromptSupplement(builder)` | Bagian prompt aditif yang berdekatan dengan memori | +| `api.registerMemoryCorpusSupplement(adapter)` | Korpus pencarian/baca memori aditif | Namespace admin core yang dicadangkan (`config.*`, `exec.approvals.*`, `wizard.*`, -`update.*`) selalu tetap `operator.admin`, bahkan jika plugin mencoba menetapkan -scope metode gateway yang lebih sempit. Utamakan prefiks khusus plugin untuk -metode milik plugin. +`update.*`) selalu tetap `operator.admin`, meskipun plugin mencoba menetapkan +cakupan metode gateway yang lebih sempit. Utamakan prefiks khusus plugin untuk +metode yang dimiliki plugin. -### Metadata registrasi CLI +### Metadata pendaftaran CLI `api.registerCli(registrar, opts?)` menerima dua jenis metadata tingkat atas: - `commands`: root command eksplisit yang dimiliki registrar -- `descriptors`: descriptor command saat parse yang digunakan untuk bantuan CLI root, - routing, dan registrasi CLI plugin lazy +- `descriptors`: deskriptor command saat parse yang digunakan untuk bantuan CLI root, + routing, dan pendaftaran CLI plugin lazy -Jika Anda ingin command plugin tetap lazy-loaded di jalur CLI root normal, +Jika Anda ingin command plugin tetap dimuat secara lazy di jalur CLI root normal, sediakan `descriptors` yang mencakup setiap root command tingkat atas yang diekspos oleh registrar tersebut. @@ -367,7 +370,7 @@ api.registerCli( descriptors: [ { name: "matrix", - description: "Manage Matrix accounts, verification, devices, and profile state", + description: "Kelola akun Matrix, verifikasi, perangkat, dan status profil", hasSubcommands: true, }, ], @@ -375,84 +378,83 @@ api.registerCli( ); ``` -Gunakan `commands` saja hanya ketika Anda tidak memerlukan registrasi CLI root lazy. -Jalur kompatibilitas eager itu tetap didukung, tetapi jalur tersebut tidak memasang -placeholder berbasis descriptor untuk lazy loading saat parse time. +Gunakan `commands` saja hanya ketika Anda tidak memerlukan pendaftaran CLI root secara lazy. +Jalur kompatibilitas eager tersebut tetap didukung, tetapi tidak memasang +placeholder berbasis descriptor untuk pemuatan lazy saat parse-time. -### Registrasi backend CLI +### Pendaftaran backend CLI -`api.registerCliBackend(...)` memungkinkan plugin memiliki config default untuk -backend CLI AI lokal seperti `codex-cli`. +`api.registerCliBackend(...)` memungkinkan plugin memiliki config default untuk backend +CLI AI lokal seperti `codex-cli`. - `id` backend menjadi prefiks provider dalam model ref seperti `codex-cli/gpt-5`. - `config` backend menggunakan bentuk yang sama seperti `agents.defaults.cliBackends.`. -- Config pengguna tetap menang. OpenClaw menggabungkan `agents.defaults.cliBackends.` di atas - default plugin sebelum menjalankan CLI. -- Gunakan `normalizeConfig` ketika backend membutuhkan penulisan ulang kompatibilitas setelah penggabungan - (misalnya menormalkan bentuk flag lama). +- Config pengguna tetap menang. OpenClaw menggabungkan `agents.defaults.cliBackends.` di atas default + plugin sebelum menjalankan CLI. +- Gunakan `normalizeConfig` saat backend memerlukan penulisan ulang kompatibilitas setelah penggabungan + (misalnya menormalisasi bentuk flag lama). ### Slot eksklusif -| Metode | Yang didaftarkan | -| ------------------------------------------ | ------------------------------------- | -| `api.registerContextEngine(id, factory)` | Context engine (satu aktif pada satu waktu) | -| `api.registerMemoryCapability(capability)` | Capability memori terpadu | -| `api.registerMemoryPromptSection(builder)` | Pembuat bagian prompt memori | -| `api.registerMemoryFlushPlan(resolver)` | Resolver rencana flush memori | -| `api.registerMemoryRuntime(runtime)` | Adapter runtime memori | +| Method | Apa yang didaftarkan | +| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `api.registerContextEngine(id, factory)` | Engine konteks (satu aktif pada satu waktu). Callback `assemble()` menerima `availableTools` dan `citationsMode` sehingga engine dapat menyesuaikan penambahan prompt. | +| `api.registerMemoryCapability(capability)` | Kapabilitas memori terpadu | +| `api.registerMemoryPromptSection(builder)` | Builder bagian prompt memori | +| `api.registerMemoryFlushPlan(resolver)` | Resolver rencana flush memori | +| `api.registerMemoryRuntime(runtime)` | Adapter runtime memori | ### Adapter embedding memori -| Metode | Yang didaftarkan | -| ---------------------------------------------- | -------------------------------------------------- | -| `api.registerMemoryEmbeddingProvider(adapter)` | Adapter embedding memori untuk plugin aktif | +| Method | Apa yang didaftarkan | +| ---------------------------------------------- | ---------------------------------------------- | +| `api.registerMemoryEmbeddingProvider(adapter)` | Adapter embedding memori untuk plugin aktif | - `registerMemoryCapability` adalah API plugin memori eksklusif yang diutamakan. - `registerMemoryCapability` juga dapat mengekspos `publicArtifacts.listArtifacts(...)` sehingga plugin pendamping dapat menggunakan artefak memori yang diekspor melalui - `openclaw/plugin-sdk/memory-host-core` alih-alih menjangkau layout privat + `openclaw/plugin-sdk/memory-host-core` alih-alih menjangkau tata letak privat plugin memori tertentu. - `registerMemoryPromptSection`, `registerMemoryFlushPlan`, dan `registerMemoryRuntime` adalah API plugin memori eksklusif yang kompatibel dengan versi lama. - `registerMemoryEmbeddingProvider` memungkinkan plugin memori aktif mendaftarkan satu - atau lebih id adapter embedding (misalnya `openai`, `gemini`, atau id khusus - yang didefinisikan plugin). + atau lebih id adapter embedding (misalnya `openai`, `gemini`, atau id yang ditentukan plugin secara kustom). - Config pengguna seperti `agents.defaults.memorySearch.provider` dan - `agents.defaults.memorySearch.fallback` diresolusikan terhadap id adapter terdaftar tersebut. + `agents.defaults.memorySearch.fallback` diselesaikan terhadap id adapter yang terdaftar tersebut. ### Event dan siklus hidup -| Metode | Fungsinya | -| -------------------------------------------- | ---------------------------- | -| `api.on(hookName, handler, opts?)` | Lifecycle hook bertipe | -| `api.onConversationBindingResolved(handler)` | Callback binding percakapan | +| Method | Fungsinya | +| -------------------------------------------- | ----------------------------- | +| `api.on(hookName, handler, opts?)` | Hook siklus hidup bertipe | +| `api.onConversationBindingResolved(handler)` | Callback binding percakapan | ### Semantik keputusan hook -- `before_tool_call`: mengembalikan `{ block: true }` bersifat terminal. Setelah ada handler yang menetapkannya, handler prioritas lebih rendah dilewati. +- `before_tool_call`: mengembalikan `{ block: true }` bersifat terminal. Setelah handler mana pun menetapkannya, handler dengan prioritas lebih rendah dilewati. - `before_tool_call`: mengembalikan `{ block: false }` diperlakukan sebagai tidak ada keputusan (sama seperti menghilangkan `block`), bukan sebagai override. -- `before_install`: mengembalikan `{ block: true }` bersifat terminal. Setelah ada handler yang menetapkannya, handler prioritas lebih rendah dilewati. +- `before_install`: mengembalikan `{ block: true }` bersifat terminal. Setelah handler mana pun menetapkannya, handler dengan prioritas lebih rendah dilewati. - `before_install`: mengembalikan `{ block: false }` diperlakukan sebagai tidak ada keputusan (sama seperti menghilangkan `block`), bukan sebagai override. -- `reply_dispatch`: mengembalikan `{ handled: true, ... }` bersifat terminal. Setelah ada handler yang mengklaim dispatch, handler prioritas lebih rendah dan jalur dispatch model default dilewati. -- `message_sending`: mengembalikan `{ cancel: true }` bersifat terminal. Setelah ada handler yang menetapkannya, handler prioritas lebih rendah dilewati. +- `reply_dispatch`: mengembalikan `{ handled: true, ... }` bersifat terminal. Setelah handler mana pun mengklaim dispatch, handler dengan prioritas lebih rendah dan jalur dispatch model default dilewati. +- `message_sending`: mengembalikan `{ cancel: true }` bersifat terminal. Setelah handler mana pun menetapkannya, handler dengan prioritas lebih rendah dilewati. - `message_sending`: mengembalikan `{ cancel: false }` diperlakukan sebagai tidak ada keputusan (sama seperti menghilangkan `cancel`), bukan sebagai override. ### Field objek API -| Field | Tipe | Deskripsi | -| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------ | -| `api.id` | `string` | Id plugin | -| `api.name` | `string` | Nama tampilan | -| `api.version` | `string?` | Versi plugin (opsional) | -| `api.description` | `string?` | Deskripsi plugin (opsional) | +| Field | Type | Deskripsi | +| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- | +| `api.id` | `string` | Id plugin | +| `api.name` | `string` | Nama tampilan | +| `api.version` | `string?` | Versi plugin (opsional) | +| `api.description` | `string?` | Deskripsi plugin (opsional) | | `api.source` | `string` | Path sumber plugin | | `api.rootDir` | `string?` | Direktori root plugin (opsional) | -| `api.config` | `OpenClawConfig` | Snapshot config saat ini (snapshot runtime in-memory aktif jika tersedia) | -| `api.pluginConfig` | `Record` | Config khusus plugin dari `plugins.entries..config` | -| `api.runtime` | `PluginRuntime` | [Helper runtime](/id/plugins/sdk-runtime) | -| `api.logger` | `PluginLogger` | Logger terlingkup (`debug`, `info`, `warn`, `error`) | -| `api.registrationMode` | `PluginRegistrationMode` | Mode pemuatan saat ini; `"setup-runtime"` adalah jendela startup/setup ringan sebelum full-entry | -| `api.resolvePath(input)` | `(string) => string` | Menyelesaikan path relatif terhadap root plugin | +| `api.config` | `OpenClawConfig` | Snapshot config saat ini (snapshot runtime dalam memori yang aktif bila tersedia) | +| `api.pluginConfig` | `Record` | Config khusus plugin dari `plugins.entries..config` | +| `api.runtime` | `PluginRuntime` | [Helper runtime](/id/plugins/sdk-runtime) | +| `api.logger` | `PluginLogger` | Logger berpencakupan (`debug`, `info`, `warn`, `error`) | +| `api.registrationMode` | `PluginRegistrationMode` | Mode pemuatan saat ini; `"setup-runtime"` adalah jendela startup/setup ringan sebelum entri penuh | +| `api.resolvePath(input)` | `(string) => string` | Menyelesaikan path relatif terhadap root plugin | ## Konvensi modul internal @@ -462,26 +464,26 @@ Di dalam plugin Anda, gunakan file barrel lokal untuk impor internal: my-plugin/ api.ts # Ekspor publik untuk konsumen eksternal runtime-api.ts # Ekspor runtime khusus internal - index.ts # Titik masuk plugin - setup-entry.ts # Entri ringan khusus setup (opsional) + index.ts # Entry point plugin + setup-entry.ts # Entri setup ringan saja (opsional) ``` Jangan pernah mengimpor plugin Anda sendiri melalui `openclaw/plugin-sdk/` dari kode production. Arahkan impor internal melalui `./api.ts` atau - `./runtime-api.ts`. Jalur SDK adalah kontrak eksternal saja. + `./runtime-api.ts`. Path SDK hanya merupakan kontrak eksternal. -Permukaan publik plugin bawaan yang dimuat melalui facade (`api.ts`, `runtime-api.ts`, +Permukaan publik plugin bawaan yang dimuat melalui fasad (`api.ts`, `runtime-api.ts`, `index.ts`, `setup-entry.ts`, dan file entri publik serupa) kini mengutamakan -snapshot config runtime aktif ketika OpenClaw sudah berjalan. Jika belum ada -snapshot runtime, permukaan tersebut akan kembali ke file config yang telah diresolusikan di disk. +snapshot config runtime aktif saat OpenClaw sudah berjalan. Jika snapshot runtime +belum ada, permukaan tersebut akan fallback ke file config di disk yang telah diselesaikan. -Plugin provider juga dapat mengekspos barrel kontrak lokal plugin yang sempit ketika -helper memang bersifat khusus provider dan belum layak dimasukkan ke subpath SDK generik. +Plugin provider juga dapat mengekspos barrel kontrak lokal plugin yang sempit ketika suatu +helper memang khusus provider dan belum cocok ditempatkan dalam subpath SDK generik. Contoh bawaan saat ini: provider Anthropic menyimpan helper stream Claude di seam publik `api.ts` / `contract-api.ts` miliknya sendiri alih-alih -mendorong logika header beta Anthropic dan `service_tier` ke kontrak +mempromosikan logika header beta Anthropic dan `service_tier` ke dalam kontrak `plugin-sdk/*` generik. Contoh bawaan lain saat ini: @@ -493,16 +495,16 @@ Contoh bawaan lain saat ini: Kode production extension juga harus menghindari impor `openclaw/plugin-sdk/`. - Jika sebuah helper benar-benar bersifat bersama, pindahkan ke subpath SDK netral - seperti `openclaw/plugin-sdk/speech`, `.../provider-model-shared`, atau permukaan - berorientasi capability lainnya alih-alih menggabungkan dua plugin secara erat. + Jika suatu helper benar-benar dibagikan, promosikan helper tersebut ke subpath SDK netral + seperti `openclaw/plugin-sdk/speech`, `.../provider-model-shared`, atau + permukaan berorientasi kapabilitas lainnya alih-alih memasangkan dua plugin secara langsung. ## Terkait - [Entry Points](/id/plugins/sdk-entrypoints) — opsi `definePluginEntry` dan `defineChannelPluginEntry` -- [Runtime Helpers](/id/plugins/sdk-runtime) — referensi lengkap namespace `api.runtime` -- [Setup and Config](/id/plugins/sdk-setup) — packaging, manifest, skema config +- [Runtime Helpers](/id/plugins/sdk-runtime) — referensi namespace `api.runtime` lengkap +- [Setup and Config](/id/plugins/sdk-setup) — packaging, manifes, skema config - [Testing](/id/plugins/sdk-testing) — utilitas pengujian dan aturan lint -- [SDK Migration](/id/plugins/sdk-migration) — migrasi dari permukaan yang sudah deprecated -- [Plugin Internals](/id/plugins/architecture) — arsitektur mendalam dan model capability +- [SDK Migration](/id/plugins/sdk-migration) — migrasi dari permukaan yang sudah usang +- [Plugin Internals](/id/plugins/architecture) — arsitektur mendalam dan model kapabilitas diff --git a/docs/id/providers/google.md b/docs/id/providers/google.md index 5aa0a2809..c53656562 100644 --- a/docs/id/providers/google.md +++ b/docs/id/providers/google.md @@ -1,38 +1,38 @@ --- read_when: - Anda ingin menggunakan model Google Gemini dengan OpenClaw - - Anda memerlukan alur auth API key atau OAuth -summary: Penyiapan Google Gemini (API key + OAuth, pembuatan gambar, pemahaman media, pencarian web) + - Anda memerlukan alur autentikasi kunci API atau OAuth +summary: Penyiapan Google Gemini (kunci API + OAuth, pembuatan gambar, pemahaman media, pencarian web) title: Google (Gemini) x-i18n: - generated_at: "2026-04-08T02:16:30Z" + generated_at: "2026-04-08T09:12:43Z" model: gpt-5.4 provider: openai - source_hash: e9e558f5ce35c853e0240350be9a1890460c5f7f7fd30b05813a656497dee516 + source_hash: fad2ff68987301bd86145fa6e10de8c7b38d5bd5dbcd13db9c883f7f5b9a4e01 source_path: providers/google.md workflow: 15 --- # Google (Gemini) -Plugin Google menyediakan akses ke model Gemini melalui Google AI Studio, serta +plugin Google menyediakan akses ke model Gemini melalui Google AI Studio, serta pembuatan gambar, pemahaman media (gambar/audio/video), dan pencarian web melalui Gemini Grounding. -- Provider: `google` -- Auth: `GEMINI_API_KEY` atau `GOOGLE_API_KEY` +- Penyedia: `google` +- Autentikasi: `GEMINI_API_KEY` atau `GOOGLE_API_KEY` - API: Google Gemini API -- Provider alternatif: `google-gemini-cli` (OAuth) +- Penyedia alternatif: `google-gemini-cli` (OAuth) ## Mulai cepat -1. Setel API key: +1. Atur kunci API: ```bash openclaw onboard --auth-choice gemini-api-key ``` -2. Setel model default: +2. Atur model default: ```json5 { @@ -55,8 +55,8 @@ openclaw onboard --non-interactive \ ## OAuth (Gemini CLI) -Provider alternatif `google-gemini-cli` menggunakan PKCE OAuth alih-alih API -key. Ini adalah integrasi tidak resmi; beberapa pengguna melaporkan adanya +Penyedia alternatif `google-gemini-cli` menggunakan PKCE OAuth alih-alih kunci API. +Ini adalah integrasi tidak resmi; beberapa pengguna melaporkan adanya pembatasan akun. Gunakan dengan risiko Anda sendiri. - Model default: `google-gemini-cli/gemini-3-flash-preview` @@ -70,53 +70,56 @@ pembatasan akun. Gunakan dengan risiko Anda sendiri. openclaw models auth login --provider google-gemini-cli --set-default ``` -Environment variables: +Variabel lingkungan: - `OPENCLAW_GEMINI_OAUTH_CLIENT_ID` - `OPENCLAW_GEMINI_OAUTH_CLIENT_SECRET` (Atau varian `GEMINI_CLI_*`.) -Jika permintaan OAuth Gemini CLI gagal setelah login, setel +Jika permintaan OAuth Gemini CLI gagal setelah login, atur `GOOGLE_CLOUD_PROJECT` atau `GOOGLE_CLOUD_PROJECT_ID` pada host gateway lalu coba lagi. Jika login gagal sebelum alur browser dimulai, pastikan perintah `gemini` lokal -sudah terinstal dan ada di `PATH`. OpenClaw mendukung instalasi Homebrew maupun -instalasi npm global, termasuk tata letak umum Windows/npm. +sudah terinstal dan tersedia di `PATH`. OpenClaw mendukung instalasi Homebrew +dan instalasi npm global, termasuk tata letak umum Windows/npm. Catatan penggunaan JSON Gemini CLI: -- Teks balasan berasal dari field JSON CLI `response`. +- Teks balasan berasal dari kolom JSON `response` milik CLI. - Penggunaan akan fallback ke `stats` saat CLI membiarkan `usage` kosong. - `stats.cached` dinormalisasi menjadi OpenClaw `cacheRead`. - Jika `stats.input` tidak ada, OpenClaw menurunkan token input dari `stats.input_tokens - stats.cached`. -## Kapabilitas +## Kemampuan -| Kapabilitas | Didukung | -| --------------------- | ----------------- | -| Chat completions | Ya | -| Pembuatan gambar | Ya | -| Pembuatan musik | Ya | -| Pemahaman gambar | Ya | -| Transkripsi audio | Ya | -| Pemahaman video | Ya | -| Pencarian web (Grounding) | Ya | -| Thinking/reasoning | Ya (Gemini 3.1+) | +| Kemampuan | Didukung | +| ---------------------- | ----------------- | +| Penyelesaian chat | Ya | +| Pembuatan gambar | Ya | +| Pembuatan musik | Ya | +| Pemahaman gambar | Ya | +| Transkripsi audio | Ya | +| Pemahaman video | Ya | +| Pencarian web (Grounding) | Ya | +| Thinking/reasoning | Ya (Gemini 3.1+) | +| Model Gemma 4 | Ya | + +Model Gemma 4 (misalnya `gemma-4-26b-a4b-it`) mendukung mode thinking. OpenClaw menulis ulang `thinkingBudget` menjadi `thinkingLevel` Google yang didukung untuk Gemma 4. Menyetel thinking ke `off` akan mempertahankan thinking tetap dinonaktifkan alih-alih memetakannya ke `MINIMAL`. ## Penggunaan ulang cache Gemini langsung Untuk eksekusi API Gemini langsung (`api: "google-generative-ai"`), OpenClaw kini meneruskan handle `cachedContent` yang dikonfigurasi ke permintaan Gemini. -- Konfigurasikan params per-model atau global dengan salah satu +- Konfigurasikan parameter per model atau global dengan `cachedContent` atau `cached_content` lama -- Jika keduanya ada, `cachedContent` yang dipakai +- Jika keduanya ada, `cachedContent` yang diprioritaskan - Contoh nilai: `cachedContents/prebuilt-context` - Penggunaan cache-hit Gemini dinormalisasi menjadi OpenClaw `cacheRead` dari - upstream `cachedContentTokenCount` + `cachedContentTokenCount` upstream Contoh: @@ -138,7 +141,7 @@ Contoh: ## Pembuatan gambar -Provider pembuatan gambar `google` yang dibundel default-nya adalah +Penyedia pembuatan gambar `google` bawaan default ke `google/gemini-3.1-flash-image-preview`. - Juga mendukung `google/gemini-3-pro-image-preview` @@ -146,11 +149,11 @@ Provider pembuatan gambar `google` yang dibundel default-nya adalah - Mode edit: diaktifkan, hingga 5 gambar input - Kontrol geometri: `size`, `aspectRatio`, dan `resolution` -Provider `google-gemini-cli` yang hanya OAuth adalah permukaan inferensi teks -yang terpisah. Pembuatan gambar, pemahaman media, dan Gemini Grounding tetap berada pada -ID provider `google`. +Penyedia `google-gemini-cli` yang hanya mendukung OAuth adalah surface inferensi +teks yang terpisah. Pembuatan gambar, pemahaman media, dan Gemini Grounding tetap +berada pada id penyedia `google`. -Untuk menggunakan Google sebagai provider gambar default: +Untuk menggunakan Google sebagai penyedia gambar default: ```json5 { @@ -165,19 +168,19 @@ Untuk menggunakan Google sebagai provider gambar default: ``` Lihat [Image Generation](/id/tools/image-generation) untuk parameter tool bersama, -pemilihan provider, dan perilaku failover. +pemilihan penyedia, dan perilaku failover. ## Pembuatan video -Plugin `google` yang dibundel juga mendaftarkan pembuatan video melalui tool bersama +plugin `google` bawaan juga mendaftarkan pembuatan video melalui tool bersama `video_generate`. - Model video default: `google/veo-3.1-fast-generate-preview` -- Mode: text-to-video, image-to-video, dan alur referensi video tunggal +- Mode: text-to-video, image-to-video, dan alur referensi satu video - Mendukung `aspectRatio`, `resolution`, dan `audio` -- Clamp durasi saat ini: **4 hingga 8 detik** +- Batas durasi saat ini: **4 hingga 8 detik** -Untuk menggunakan Google sebagai provider video default: +Untuk menggunakan Google sebagai penyedia video default: ```json5 { @@ -192,21 +195,21 @@ Untuk menggunakan Google sebagai provider video default: ``` Lihat [Video Generation](/id/tools/video-generation) untuk parameter tool bersama, -pemilihan provider, dan perilaku failover. +pemilihan penyedia, dan perilaku failover. ## Pembuatan musik -Plugin `google` yang dibundel juga mendaftarkan pembuatan musik melalui tool bersama +plugin `google` bawaan juga mendaftarkan pembuatan musik melalui tool bersama `music_generate`. - Model musik default: `google/lyria-3-clip-preview` - Juga mendukung `google/lyria-3-pro-preview` - Kontrol prompt: `lyrics` dan `instrumental` -- Format output: `mp3` secara default, serta `wav` pada `google/lyria-3-pro-preview` +- Format keluaran: `mp3` secara default, serta `wav` pada `google/lyria-3-pro-preview` - Input referensi: hingga 10 gambar -- Eksekusi berbasis sesi dipisahkan melalui alur task/status bersama, termasuk `action: "status"` +- Eksekusi berbasis sesi dilepas melalui alur tugas/status bersama, termasuk `action: "status"` -Untuk menggunakan Google sebagai provider musik default: +Untuk menggunakan Google sebagai penyedia musik default: ```json5 { @@ -221,9 +224,9 @@ Untuk menggunakan Google sebagai provider musik default: ``` Lihat [Music Generation](/id/tools/music-generation) untuk parameter tool bersama, -pemilihan provider, dan perilaku failover. +pemilihan penyedia, dan perilaku failover. -## Catatan environment +## Catatan lingkungan Jika Gateway berjalan sebagai daemon (launchd/systemd), pastikan `GEMINI_API_KEY` tersedia untuk proses tersebut (misalnya, di `~/.openclaw/.env` atau melalui diff --git a/docs/id/providers/ollama.md b/docs/id/providers/ollama.md index 8d239fa6e..d953be75a 100644 --- a/docs/id/providers/ollama.md +++ b/docs/id/providers/ollama.md @@ -5,20 +5,20 @@ read_when: summary: Jalankan OpenClaw dengan Ollama (model cloud dan lokal) title: Ollama x-i18n: - generated_at: "2026-04-08T02:17:29Z" + generated_at: "2026-04-08T09:12:54Z" model: gpt-5.4 provider: openai - source_hash: 222ec68f7d4bb29cc7796559ddef1d5059f5159e7a51e2baa3a271ddb3abb716 + source_hash: d3295a7c879d3636a2ffdec05aea6e670e54a990ef52bd9b0cae253bc24aa3f7 source_path: providers/ollama.md workflow: 15 --- # Ollama -Ollama adalah runtime LLM lokal yang memudahkan menjalankan model open-source di mesin Anda. OpenClaw terintegrasi dengan API native Ollama (`/api/chat`), mendukung streaming dan pemanggilan tool, serta dapat menemukan model Ollama lokal secara otomatis saat Anda memilih ikut serta dengan `OLLAMA_API_KEY` (atau profil auth) dan tidak mendefinisikan entri `models.providers.ollama` secara eksplisit. +Ollama adalah runtime LLM lokal yang memudahkan Anda menjalankan model open-source di mesin Anda. OpenClaw terintegrasi dengan API native Ollama (`/api/chat`), mendukung streaming dan pemanggilan tool, serta dapat menemukan model Ollama lokal secara otomatis saat Anda ikut serta dengan `OLLAMA_API_KEY` (atau profil autentikasi) dan tidak mendefinisikan entri `models.providers.ollama` secara eksplisit. -**Pengguna Ollama jarak jauh**: Jangan gunakan URL kompatibel OpenAI `/v1` (`http://host:11434/v1`) dengan OpenClaw. Ini merusak pemanggilan tool dan model dapat menghasilkan JSON tool mentah sebagai teks biasa. Gunakan URL API native Ollama sebagai gantinya: `baseUrl: "http://host:11434"` (tanpa `/v1`). +**Pengguna Ollama jarak jauh**: Jangan gunakan URL kompatibel OpenAI `/v1` (`http://host:11434/v1`) dengan OpenClaw. Ini merusak pemanggilan tool dan model dapat mengeluarkan JSON tool mentah sebagai teks biasa. Gunakan URL API native Ollama sebagai gantinya: `baseUrl: "http://host:11434"` (tanpa `/v1`). ## Mulai cepat @@ -33,11 +33,11 @@ openclaw onboard Pilih **Ollama** dari daftar provider. Onboarding akan: -1. Menanyakan base URL Ollama tempat instance Anda dapat diakses (default `http://127.0.0.1:11434`). +1. Menanyakan URL dasar Ollama tempat instance Anda dapat dijangkau (default `http://127.0.0.1:11434`). 2. Memungkinkan Anda memilih **Cloud + Local** (model cloud dan model lokal) atau **Local** (hanya model lokal). -3. Membuka alur login di browser jika Anda memilih **Cloud + Local** dan belum masuk ke ollama.com. +3. Membuka alur masuk browser jika Anda memilih **Cloud + Local** dan belum masuk ke ollama.com. 4. Menemukan model yang tersedia dan menyarankan default. -5. Menarik model yang dipilih secara otomatis jika model tersebut belum tersedia secara lokal. +5. Melakukan auto-pull pada model yang dipilih jika model tersebut belum tersedia secara lokal. Mode non-interaktif juga didukung: @@ -47,7 +47,7 @@ openclaw onboard --non-interactive \ --accept-risk ``` -Secara opsional tentukan base URL atau model kustom: +Secara opsional tentukan URL dasar atau model kustom: ```bash openclaw onboard --non-interactive \ @@ -61,7 +61,7 @@ openclaw onboard --non-interactive \ 1. Instal Ollama: [https://ollama.com/download](https://ollama.com/download) -2. Tarik model lokal jika Anda menginginkan inferensi lokal: +2. Pull model lokal jika Anda ingin inferensi lokal: ```bash ollama pull gemma4 @@ -71,7 +71,7 @@ ollama pull gpt-oss:20b ollama pull llama3.3 ``` -3. Jika Anda juga ingin model cloud, masuklah: +3. Jika Anda juga menginginkan model cloud, masuklah: ```bash ollama signin @@ -92,10 +92,10 @@ OpenClaw saat ini menyarankan: - default lokal: `gemma4` - default cloud: `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud` -5. Jika Anda lebih memilih penyiapan manual, aktifkan Ollama untuk OpenClaw secara langsung (nilai apa pun berfungsi; Ollama tidak memerlukan key nyata): +5. Jika Anda lebih memilih penyiapan manual, aktifkan Ollama untuk OpenClaw secara langsung (nilai apa pun dapat digunakan; Ollama tidak memerlukan kunci asli): ```bash -# Set environment variable +# Tetapkan variabel lingkungan export OLLAMA_API_KEY="ollama-local" # Atau konfigurasi di file config Anda @@ -123,12 +123,13 @@ openclaw models set ollama/gemma4 ## Penemuan model (provider implisit) -Saat Anda menetapkan `OLLAMA_API_KEY` (atau profil auth) dan **tidak** mendefinisikan `models.providers.ollama`, OpenClaw menemukan model dari instance Ollama lokal di `http://127.0.0.1:11434`: +Saat Anda menetapkan `OLLAMA_API_KEY` (atau profil autentikasi) dan **tidak** mendefinisikan `models.providers.ollama`, OpenClaw menemukan model dari instance Ollama lokal di `http://127.0.0.1:11434`: - Mengueri `/api/tags` -- Menggunakan lookup `/api/show` dengan upaya terbaik untuk membaca `contextWindow` bila tersedia +- Menggunakan lookup `/api/show` best-effort untuk membaca `contextWindow` dan mendeteksi kapabilitas (termasuk vision) jika tersedia +- Model dengan kapabilitas `vision` yang dilaporkan oleh `/api/show` ditandai sebagai mampu-gambar (`input: ["text", "image"]`), sehingga OpenClaw secara otomatis menyisipkan gambar ke prompt untuk model tersebut - Menandai `reasoning` dengan heuristik nama model (`r1`, `reasoning`, `think`) -- Menetapkan `maxTokens` ke batas maksimum token Ollama default yang digunakan oleh OpenClaw +- Menetapkan `maxTokens` ke batas max-token default Ollama yang digunakan oleh OpenClaw - Menetapkan semua biaya ke `0` Ini menghindari entri model manual sambil menjaga katalog tetap selaras dengan instance Ollama lokal. @@ -140,7 +141,7 @@ ollama list openclaw models list ``` -Untuk menambahkan model baru, cukup tarik model dengan Ollama: +Untuk menambahkan model baru, cukup pull model tersebut dengan Ollama: ```bash ollama pull mistral @@ -154,7 +155,7 @@ Jika Anda menetapkan `models.providers.ollama` secara eksplisit, penemuan otomat ### Penyiapan dasar (penemuan implisit) -Cara paling sederhana untuk mengaktifkan Ollama adalah melalui environment variable: +Cara paling sederhana untuk mengaktifkan Ollama adalah melalui variabel lingkungan: ```bash export OLLAMA_API_KEY="ollama-local" @@ -162,10 +163,10 @@ export OLLAMA_API_KEY="ollama-local" ### Penyiapan eksplisit (model manual) -Gunakan config eksplisit saat: +Gunakan config eksplisit ketika: - Ollama berjalan di host/port lain. -- Anda ingin memaksa context window atau daftar model tertentu. +- Anda ingin memaksa window konteks atau daftar model tertentu. - Anda ingin definisi model sepenuhnya manual. ```json5 @@ -193,9 +194,9 @@ Gunakan config eksplisit saat: } ``` -Jika `OLLAMA_API_KEY` ditetapkan, Anda dapat menghilangkan `apiKey` dalam entri provider dan OpenClaw akan mengisinya untuk pemeriksaan ketersediaan. +Jika `OLLAMA_API_KEY` ditetapkan, Anda dapat menghilangkan `apiKey` di entri provider dan OpenClaw akan mengisinya untuk pemeriksaan ketersediaan. -### Base URL kustom (config eksplisit) +### URL dasar kustom (config eksplisit) Jika Ollama berjalan di host atau port yang berbeda (config eksplisit menonaktifkan penemuan otomatis, jadi definisikan model secara manual): @@ -205,8 +206,8 @@ Jika Ollama berjalan di host atau port yang berbeda (config eksplisit menonaktif providers: { ollama: { apiKey: "ollama-local", - baseUrl: "http://ollama-host:11434", // No /v1 - use native Ollama API URL - api: "ollama", // Set explicitly to guarantee native tool-calling behavior + baseUrl: "http://ollama-host:11434", // Tanpa /v1 - gunakan URL API native Ollama + api: "ollama", // Tetapkan secara eksplisit untuk menjamin perilaku pemanggilan tool native }, }, }, @@ -214,7 +215,7 @@ Jika Ollama berjalan di host atau port yang berbeda (config eksplisit menonaktif ``` -Jangan tambahkan `/v1` ke URL. Path `/v1` menggunakan mode kompatibel OpenAI, di mana pemanggilan tool tidak andal. Gunakan URL dasar Ollama tanpa sufiks path. +Jangan tambahkan `/v1` ke URL. Jalur `/v1` menggunakan mode kompatibel OpenAI, di mana pemanggilan tool tidak andal. Gunakan URL dasar Ollama tanpa sufiks path. ### Pemilihan model @@ -236,23 +237,23 @@ Setelah dikonfigurasi, semua model Ollama Anda tersedia: ## Model cloud -Model cloud memungkinkan Anda menjalankan model yang di-host di cloud (misalnya `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`) berdampingan dengan model lokal Anda. +Model cloud memungkinkan Anda menjalankan model yang di-host di cloud (misalnya `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`) bersama model lokal Anda. -Untuk menggunakan model cloud, pilih mode **Cloud + Local** saat setup. Wizard memeriksa apakah Anda sudah masuk dan membuka alur login di browser bila diperlukan. Jika autentikasi tidak dapat diverifikasi, wizard fallback ke default model lokal. +Untuk menggunakan model cloud, pilih mode **Cloud + Local** selama penyiapan. Wizard memeriksa apakah Anda sudah masuk dan membuka alur masuk browser bila diperlukan. Jika autentikasi tidak dapat diverifikasi, wizard akan kembali ke default model lokal. -Anda juga dapat langsung masuk di [ollama.com/signin](https://ollama.com/signin). +Anda juga dapat masuk langsung di [ollama.com/signin](https://ollama.com/signin). ## Ollama Web Search -OpenClaw juga mendukung **Ollama Web Search** sebagai provider -`web_search` terbundel. +OpenClaw juga mendukung **Ollama Web Search** sebagai provider `web_search` +bawaan. -- Ini menggunakan host Ollama yang Anda konfigurasi (`models.providers.ollama.baseUrl` jika - ditetapkan, jika tidak `http://127.0.0.1:11434`). +- Ini menggunakan host Ollama yang Anda konfigurasi (`models.providers.ollama.baseUrl` saat + ditetapkan, atau `http://127.0.0.1:11434` jika tidak). - Ini tidak memerlukan key. -- Ini memerlukan Ollama berjalan dan sudah masuk dengan `ollama signin`. +- Ini mengharuskan Ollama berjalan dan sudah masuk dengan `ollama signin`. -Pilih **Ollama Web Search** saat `openclaw onboard` atau +Pilih **Ollama Web Search** selama `openclaw onboard` atau `openclaw configure --section web`, atau tetapkan: ```json5 @@ -267,27 +268,27 @@ Pilih **Ollama Web Search** saat `openclaw onboard` atau } ``` -Untuk detail penyiapan lengkap dan perilakunya, lihat [Ollama Web Search](/id/tools/ollama-search). +Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools/ollama-search). ## Lanjutan ### Model reasoning -OpenClaw memperlakukan model dengan nama seperti `deepseek-r1`, `reasoning`, atau `think` sebagai mampu reasoning secara default: +OpenClaw memperlakukan model dengan nama seperti `deepseek-r1`, `reasoning`, atau `think` sebagai mampu-reasoning secara default: ```bash ollama pull deepseek-r1:32b ``` -### Biaya model +### Biaya Model Ollama gratis dan berjalan secara lokal, jadi semua biaya model ditetapkan ke $0. -### Konfigurasi streaming +### Konfigurasi Streaming Integrasi Ollama OpenClaw menggunakan **API native Ollama** (`/api/chat`) secara default, yang sepenuhnya mendukung streaming dan pemanggilan tool secara bersamaan. Tidak diperlukan konfigurasi khusus. -#### Mode Lama Kompatibel OpenAI +#### Mode Kompatibel OpenAI Lama **Pemanggilan tool tidak andal dalam mode kompatibel OpenAI.** Gunakan mode ini hanya jika Anda memerlukan format OpenAI untuk proxy dan tidak bergantung pada perilaku pemanggilan tool native. @@ -311,9 +312,9 @@ Jika Anda perlu menggunakan endpoint kompatibel OpenAI sebagai gantinya (misalny } ``` -Mode ini mungkin tidak mendukung streaming + pemanggilan tool secara bersamaan. Anda mungkin perlu menonaktifkan streaming dengan `params: { streaming: false }` dalam config model. +Mode ini mungkin tidak mendukung streaming + pemanggilan tool secara bersamaan. Anda mungkin perlu menonaktifkan streaming dengan `params: { streaming: false }` di config model. -Saat `api: "openai-completions"` digunakan dengan Ollama, OpenClaw secara default menyuntikkan `options.num_ctx` agar Ollama tidak diam-diam fallback ke context window 4096. Jika proxy/upstream Anda menolak field `options` yang tidak dikenal, nonaktifkan perilaku ini: +Saat `api: "openai-completions"` digunakan dengan Ollama, OpenClaw menyisipkan `options.num_ctx` secara default agar Ollama tidak diam-diam kembali ke window konteks 4096. Jika proxy/upstream Anda menolak field `options` yang tidak dikenal, nonaktifkan perilaku ini: ```json5 { @@ -331,15 +332,15 @@ Saat `api: "openai-completions"` digunakan dengan Ollama, OpenClaw secara defaul } ``` -### Context window +### Window konteks -Untuk model yang ditemukan secara otomatis, OpenClaw menggunakan context window yang dilaporkan oleh Ollama bila tersedia, jika tidak maka fallback ke context window Ollama default yang digunakan oleh OpenClaw. Anda dapat mengganti `contextWindow` dan `maxTokens` dalam config provider eksplisit. +Untuk model yang ditemukan otomatis, OpenClaw menggunakan window konteks yang dilaporkan oleh Ollama jika tersedia, jika tidak maka akan kembali ke window konteks default Ollama yang digunakan oleh OpenClaw. Anda dapat mengganti `contextWindow` dan `maxTokens` di config provider eksplisit. ## Pemecahan masalah ### Ollama tidak terdeteksi -Pastikan Ollama berjalan dan Anda menetapkan `OLLAMA_API_KEY` (atau profil auth), dan Anda **tidak** mendefinisikan entri `models.providers.ollama` secara eksplisit: +Pastikan Ollama sedang berjalan dan Anda telah menetapkan `OLLAMA_API_KEY` (atau profil autentikasi), serta Anda **tidak** mendefinisikan entri `models.providers.ollama` secara eksplisit: ```bash ollama serve @@ -353,9 +354,9 @@ curl http://localhost:11434/api/tags ### Tidak ada model yang tersedia -Jika model Anda tidak tercantum, lakukan salah satu dari berikut ini: +Jika model Anda tidak terdaftar, lakukan salah satu dari berikut: -- Tarik model secara lokal, atau +- Pull model secara lokal, atau - Definisikan model secara eksplisit di `models.providers.ollama`. Untuk menambahkan model: @@ -369,18 +370,18 @@ ollama pull llama3.3 # Atau model lain ### Koneksi ditolak -Periksa bahwa Ollama berjalan di port yang benar: +Periksa bahwa Ollama berjalan pada port yang benar: ```bash -# Check if Ollama is running +# Periksa apakah Ollama sedang berjalan ps aux | grep ollama -# Or restart Ollama +# Atau mulai ulang Ollama ollama serve ``` ## Lihat juga -- [Model Providers](/id/concepts/model-providers) - Ikhtisar semua provider -- [Model Selection](/id/concepts/models) - Cara memilih model -- [Configuration](/id/gateway/configuration) - Referensi config lengkap +- [Provider Model](/id/concepts/model-providers) - Ikhtisar semua provider +- [Pemilihan Model](/id/concepts/models) - Cara memilih model +- [Konfigurasi](/id/gateway/configuration) - Referensi config lengkap