From 8fd59714ec5fc234c672f161dc3743bec02746f0 Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Wed, 15 Apr 2026 14:48:30 +0000 Subject: [PATCH] chore(i18n): refresh id translations --- docs/id/concepts/dreaming.md | 118 +- docs/id/concepts/experimental-features.md | 56 + docs/id/concepts/memory-search.md | 66 +- docs/id/concepts/memory.md | 105 +- docs/id/gateway/configuration-reference.md | 1152 ++++++++++---------- docs/id/gateway/local-models.md | 78 +- docs/id/help/testing.md | 728 ++++++------- docs/id/providers/github-copilot.md | 123 ++- docs/id/providers/ollama.md | 196 ++-- docs/id/reference/memory-config.md | 360 +++--- docs/id/reference/wizard.md | 130 +-- docs/id/start/wizard-cli-reference.md | 240 ++-- 12 files changed, 1746 insertions(+), 1606 deletions(-) create mode 100644 docs/id/concepts/experimental-features.md diff --git a/docs/id/concepts/dreaming.md b/docs/id/concepts/dreaming.md index 71b2947db..dbda9072f 100644 --- a/docs/id/concepts/dreaming.md +++ b/docs/id/concepts/dreaming.md @@ -3,21 +3,21 @@ read_when: - Anda ingin promosi memori berjalan secara otomatis - Anda ingin memahami apa yang dilakukan setiap fase Dreaming - Anda ingin menyetel konsolidasi tanpa mengotori `MEMORY.md` -summary: Konsolidasi memori latar belakang dengan fase ringan, dalam, dan REM serta Buku Harian Mimpi -title: Dreaming (eksperimental) +summary: Konsolidasi memori latar belakang dengan fase ringan, dalam, dan REM serta Jurnal Mimpi +title: Dreaming x-i18n: - generated_at: "2026-04-15T09:14:51Z" + generated_at: "2026-04-15T14:40:58Z" model: gpt-5.4 provider: openai - source_hash: 5882a5068f2eabe54ca9893184e5385330a432b921870c38626399ce11c31e25 + source_hash: a5bcaec80f62e7611ed533094ef1917bd72c885f57252824db910e1f0496adc6 source_path: concepts/dreaming.md workflow: 15 --- -# Dreaming (eksperimental) +# Dreaming 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 +Sistem ini membantu OpenClaw memindahkan sinyal jangka pendek yang kuat ke memori tahan lama sambil menjaga prosesnya tetap dapat dijelaskan dan ditinjau. Dreaming bersifat **opsional** dan dinonaktifkan secara default. @@ -35,32 +35,32 @@ Promosi jangka panjang tetap hanya menulis ke `MEMORY.md`. Dreaming menggunakan tiga fase kooperatif: -| 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 gagasan yang berulang | Tidak | +| Fase | Tujuan | Penulisan tahan lama | +| ----- | ---------------------------------------- | -------------------- | +| Light | Menyortir dan menyiapkan materi jangka pendek terbaru | Tidak | +| Deep | Memberi skor dan mempromosikan kandidat tahan lama | Ya (`MEMORY.md`) | +| REM | Merefleksikan tema dan gagasan yang berulang | Tidak | Fase-fase ini adalah detail implementasi internal, bukan "mode" -terpisah yang dikonfigurasi pengguna. +terpisah yang dikonfigurasi oleh 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, file memori harian terbaru, dan transkrip sesi yang telah disunting bila tersedia. +- Membaca dari status recall jangka pendek, file memori harian terbaru, dan transkrip sesi yang telah disunting jika tersedia. - Menulis blok `## Light Sleep` yang dikelola ketika penyimpanan mencakup output inline. -- Mencatat sinyal penguatan untuk peringkat deep di tahap selanjutnya. +- Mencatat sinyal reinforcement untuk pemeringkatan deep nanti. - Tidak pernah menulis ke `MEMORY.md`. ### Fase Deep -Fase Deep menentukan apa yang menjadi memori jangka panjang. +Fase Deep memutuskan apa yang menjadi memori jangka panjang. -- Memberi peringkat kandidat menggunakan penilaian berbobot dan gerbang ambang. +- Memeringkat kandidat menggunakan penilaian berbobot dan ambang batas. - Mengharuskan `minScore`, `minRecallCount`, dan `minUniqueQueries` terpenuhi. -- Menghidrasi ulang cuplikan dari file harian aktif sebelum menulis, sehingga cuplikan lama/yang dihapus dilewati. +- Menghidrasi ulang cuplikan dari file harian langsung sebelum menulis, sehingga cuplikan usang/terhapus 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`. @@ -70,62 +70,62 @@ Fase REM mengekstrak pola dan sinyal reflektif. - Membangun ringkasan tema dan refleksi dari jejak jangka pendek terbaru. - Menulis blok `## REM Sleep` yang dikelola ketika penyimpanan mencakup output inline. -- Mencatat sinyal penguatan REM yang digunakan oleh peringkat deep. +- 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 +Dreaming dapat mengingest transkrip sesi yang telah disunting ke dalam korpus dreaming. Saat transkrip tersedia, transkrip tersebut dimasukkan ke fase Light bersama sinyal memori harian dan jejak recall. Konten pribadi dan sensitif disunting sebelum ingestion. -## Dream Diary +## Jurnal Mimpi -Dreaming juga menyimpan **Dream Diary** naratif di `DREAMS.md`. -Setelah setiap fase memiliki cukup materi, `memory-core` menjalankan giliran subagen latar belakang -best-effort (menggunakan model runtime default) dan menambahkan entri diary singkat. +Dreaming juga menyimpan **Jurnal Mimpi** naratif di `DREAMS.md`. +Setelah setiap fase memiliki materi yang cukup, `memory-core` menjalankan giliran subagen latar belakang +best-effort (menggunakan model runtime default) dan menambahkan entri jurnal singkat. -Diary ini ditujukan untuk dibaca manusia di UI Dreams, bukan sebagai sumber promosi. -Artefak diary/laporan yang dihasilkan Dreaming dikecualikan dari -promosi jangka pendek. Hanya cuplikan memori yang berlandaskan bukti yang memenuhi syarat untuk dipromosikan ke +Jurnal ini untuk dibaca manusia di UI Dreams, bukan sumber promosi. +Artefak jurnal/laporan yang dihasilkan Dreaming dikecualikan dari +promosi jangka pendek. Hanya cuplikan memori yang berlandaskan data yang memenuhi syarat untuk dipromosikan ke `MEMORY.md`. -Ada juga jalur backfill historis yang berlandaskan bukti untuk pekerjaan peninjauan dan pemulihan: +Ada juga jalur backfill historis yang berlandaskan data untuk pekerjaan peninjauan dan pemulihan: -- `memory rem-harness --path ... --grounded` mempratinjau output diary berlandaskan bukti dari catatan historis `YYYY-MM-DD.md`. -- `memory rem-backfill --path ...` menulis entri diary berlandaskan bukti yang dapat dibalik ke `DREAMS.md`. -- `memory rem-backfill --path ... --stage-short-term` menyiapkan kandidat tahan lama berlandaskan bukti ke penyimpanan bukti jangka pendek yang sama yang sudah digunakan oleh fase Deep normal. -- `memory rem-backfill --rollback` dan `--rollback-short-term` menghapus artefak backfill yang telah disiapkan tersebut tanpa menyentuh entri diary biasa atau recall jangka pendek aktif. +- `memory rem-harness --path ... --grounded` mempratinjau output jurnal berlandaskan data dari catatan historis `YYYY-MM-DD.md`. +- `memory rem-backfill --path ...` menulis entri jurnal berlandaskan data yang dapat dibalik ke `DREAMS.md`. +- `memory rem-backfill --path ... --stage-short-term` menyiapkan kandidat tahan lama berlandaskan data ke penyimpanan bukti jangka pendek yang sama yang sudah digunakan fase deep normal. +- `memory rem-backfill --rollback` dan `--rollback-short-term` menghapus artefak backfill yang disiapkan tersebut tanpa menyentuh entri jurnal biasa atau recall jangka pendek langsung. -Control UI menampilkan alur backfill/reset diary yang sama sehingga Anda dapat memeriksa -hasilnya di scene Dreams sebelum memutuskan apakah kandidat berlandaskan bukti tersebut -layak dipromosikan. Scene juga menampilkan jalur berlandaskan bukti yang berbeda sehingga Anda dapat melihat +UI Control menampilkan alur backfill/reset jurnal yang sama sehingga Anda dapat memeriksa +hasilnya di scene Dreams sebelum memutuskan apakah kandidat berlandaskan data +layak dipromosikan. Scene juga menampilkan jalur berlandaskan data yang terpisah sehingga Anda dapat melihat entri jangka pendek yang disiapkan mana yang berasal dari pemutaran ulang historis, item yang dipromosikan -mana yang dipimpin oleh data berlandaskan bukti, serta menghapus hanya entri tersiap berlandaskan bukti -tanpa menyentuh status jangka pendek aktif biasa. +mana yang dipimpin oleh data berlandaskan, dan menghapus hanya entri yang disiapkan khusus berlandaskan data tanpa +menyentuh status jangka pendek langsung biasa. -## Sinyal peringkat Deep +## Sinyal pemeringkatan Deep -Peringkat deep menggunakan enam sinyal dasar berbobot ditambah penguatan fase: +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 | -| Kekinian | 0.15 | Skor kesegaran yang meluruh terhadap waktu | -| Konsolidasi | 0.10 | Kekuatan kemunculan berulang lintas hari | -| Kekayaan konseptual | 0.06 | Kepadatan tag konsep dari cuplikan/path | +| Relevansi | 0.30 | Kualitas pengambilan rata-rata untuk entri | +| Keragaman kueri | 0.15 | Konteks kueri/hari berbeda yang memunculkannya | +| Keterkinian | 0.15 | Skor kesegaran dengan peluruhan 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 sedikit peningkatan yang meluruh terhadap waktu dari +Hit fase Light dan REM menambahkan sedikit peningkatan dengan peluruhan keterkinian dari `memory/.dreams/phase-signals.json`. ## Penjadwalan -Saat diaktifkan, `memory-core` secara otomatis mengelola satu job cron untuk satu penyapuan dreaming penuh. Setiap penyapuan menjalankan fase secara berurutan: light -> REM -> deep. +Saat diaktifkan, `memory-core` mengelola secara otomatis satu tugas Cron untuk satu sapuan dreaming penuh. Setiap sapuan menjalankan fase secara berurutan: light -> REM -> deep. -Perilaku cadence default: +Perilaku kadensi default: | Pengaturan | Default | | -------------------- | ----------- | @@ -151,7 +151,7 @@ Aktifkan dreaming: } ``` -Aktifkan dreaming dengan cadence penyapuan kustom: +Aktifkan dreaming dengan kadensi sapuan kustom: ```json { @@ -191,7 +191,7 @@ openclaw memory promote --limit 5 openclaw memory status --deep ``` -`memory promote` manual menggunakan ambang fase Deep secara default kecuali ditimpa +`memory promote` manual menggunakan ambang fase deep secara default kecuali diganti dengan flag CLI. Jelaskan mengapa kandidat tertentu akan atau tidak akan dipromosikan: @@ -218,22 +218,22 @@ Semua pengaturan berada di bawah `plugins.entries.memory-core.config.dreaming`. | `enabled` | `false` | | `frequency` | `0 3 * * *` | -Kebijakan fase, ambang, 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 dihadapi pengguna). -Lihat [Referensi konfigurasi Memory](/id/reference/memory-config#dreaming-experimental) +Lihat [Referensi konfigurasi Memory](/id/reference/memory-config#dreaming) untuk daftar kunci lengkap. ## UI Dreams Saat diaktifkan, tab **Dreams** di Gateway menampilkan: -- status dreaming aktif saat ini -- status tingkat fase dan keberadaan managed sweep -- jumlah jangka pendek, berlandaskan bukti, sinyal, dan yang dipromosikan hari ini -- waktu jalankan terjadwal berikutnya -- jalur Scene berlandaskan bukti yang berbeda untuk entri replay historis yang disiapkan -- pembaca Dream Diary yang dapat diperluas yang didukung oleh `doctor.memory.dreamDiary` +- status aktif dreaming saat ini +- status tingkat fase dan keberadaan sapuan terkelola +- jumlah jangka pendek, berlandaskan data, sinyal, dan yang dipromosikan hari ini +- waktu jadwal eksekusi berikutnya +- jalur Scene berlandaskan data yang terpisah untuk entri pemutaran ulang historis yang disiapkan +- pembaca Jurnal Mimpi yang dapat diperluas yang didukung oleh `doctor.memory.dreamDiary` ## Terkait diff --git a/docs/id/concepts/experimental-features.md b/docs/id/concepts/experimental-features.md new file mode 100644 index 000000000..e141943c6 --- /dev/null +++ b/docs/id/concepts/experimental-features.md @@ -0,0 +1,56 @@ +--- +read_when: + - Anda melihat kunci konfigurasi `.experimental` dan ingin mengetahui apakah itu stabil + - Anda ingin mencoba fitur runtime pratinjau tanpa membingungkannya dengan default normal + - Anda ingin satu tempat untuk menemukan flag eksperimental yang saat ini didokumentasikan +summary: Apa arti flag eksperimental di OpenClaw dan mana saja yang saat ini didokumentasikan +title: Fitur Eksperimental +x-i18n: + generated_at: "2026-04-15T14:40:34Z" + model: gpt-5.4 + provider: openai + source_hash: 2d1c7b3d4cd56ef8a0bdab1deb9918e9b2c9a33f956d63193246087f8633dcf3 + source_path: concepts/experimental-features.md + workflow: 15 +--- + +# Fitur eksperimental + +Fitur eksperimental di OpenClaw adalah **permukaan pratinjau yang bersifat opt-in**. Fitur-fitur ini +berada di balik flag eksplisit karena masih memerlukan penggunaan di dunia nyata +sebelum layak mendapatkan default yang stabil atau kontrak publik yang +berumur panjang. + +Perlakukan ini berbeda dari konfigurasi normal: + +- Biarkan **nonaktif secara default** kecuali dokumen terkait menyarankan Anda untuk mencobanya. +- Harapkan **bentuk dan perilaku berubah** lebih cepat dibandingkan konfigurasi stabil. +- Utamakan jalur stabil terlebih dahulu jika sudah tersedia. +- Jika Anda menerapkan OpenClaw secara luas, uji flag eksperimental di lingkungan + yang lebih kecil sebelum memasukkannya ke baseline bersama. + +## Flag yang saat ini didokumentasikan + +| Permukaan | Kunci | Gunakan saat | Selengkapnya | +| ------------------------ | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| Runtime model lokal | `agents.defaults.experimental.localModelLean` | Backend lokal yang lebih kecil atau lebih ketat mengalami kendala dengan permukaan tool default penuh OpenClaw | [Model Lokal](/id/gateway/local-models) | +| Pencarian memori | `agents.defaults.memorySearch.experimental.sessionMemory` | Anda ingin `memory_search` mengindeks transkrip sesi sebelumnya dan menerima biaya penyimpanan/pengindeksan tambahan | [Referensi konfigurasi memori](/id/reference/memory-config#session-memory-search-experimental) | +| Tool perencanaan terstruktur | `tools.experimental.planTool` | Anda ingin tool `update_plan` terstruktur diekspos untuk pelacakan pekerjaan multi-langkah di runtime dan UI yang kompatibel | [Referensi konfigurasi Gateway](/id/gateway/configuration-reference#toolsexperimental) | + +## Mode lean model lokal + +`agents.defaults.experimental.localModelLean: true` adalah katup pelepas tekanan +untuk penyiapan model lokal yang lebih lemah. Ini memangkas tool default yang +berat seperti `browser`, `cron`, dan `message` sehingga bentuk prompt menjadi lebih kecil dan kurang rapuh +untuk backend kompatibel OpenAI yang memiliki konteks kecil atau lebih ketat. + +Ini memang **bukan** jalur normal. Jika backend Anda menangani runtime penuh +dengan baik, biarkan ini nonaktif. + +## Eksperimental bukan berarti tersembunyi + +Jika sebuah fitur bersifat eksperimental, OpenClaw harus menyatakannya dengan +jelas di dokumen dan di jalur konfigurasinya sendiri. Yang **tidak** boleh +dilakukan adalah menyelundupkan perilaku pratinjau ke dalam knob default yang +terlihat stabil lalu berpura-pura itu normal. Begitulah cara permukaan +konfigurasi menjadi berantakan. diff --git a/docs/id/concepts/memory-search.md b/docs/id/concepts/memory-search.md index a0e957a27..5d4817767 100644 --- a/docs/id/concepts/memory-search.md +++ b/docs/id/concepts/memory-search.md @@ -1,15 +1,15 @@ --- read_when: - - Anda ingin memahami cara kerja `memory_search` + - Anda ingin memahami cara kerja memory_search - Anda ingin memilih penyedia embedding - Anda ingin menyetel kualitas pencarian summary: Bagaimana pencarian memori menemukan catatan yang relevan menggunakan embedding dan pengambilan hibrida title: Pencarian Memori x-i18n: - generated_at: "2026-04-12T23:28:18Z" + generated_at: "2026-04-15T14:40:35Z" model: gpt-5.4 provider: openai - source_hash: 71fde251b7d2dc455574aa458e7e09136f30613609ad8dafeafd53b2729a0310 + source_hash: f5757aa8fe8f7fec30ef5c826f72230f591ce4cad591d81a091189d50d4262ed source_path: concepts/memory-search.md workflow: 15 --- @@ -17,13 +17,13 @@ x-i18n: # Pencarian Memori `memory_search` menemukan catatan yang relevan dari file memori Anda, bahkan ketika -redaksinya berbeda dari teks aslinya. Fitur ini bekerja dengan mengindeks memori ke dalam potongan-potongan kecil -dan mencarinya menggunakan embedding, kata kunci, atau keduanya. +redaksinya berbeda dari teks aslinya. Fitur ini bekerja dengan mengindeks memori menjadi +potongan-potongan kecil lalu mencarinya menggunakan embedding, kata kunci, atau keduanya. ## Mulai cepat -Jika Anda telah mengonfigurasi kunci API OpenAI, Gemini, Voyage, atau Mistral, pencarian memori -akan bekerja secara otomatis. Untuk menetapkan penyedia secara eksplisit: +Jika Anda memiliki langganan GitHub Copilot, kunci API OpenAI, Gemini, Voyage, atau Mistral yang dikonfigurasi, pencarian memori akan berfungsi secara otomatis. Untuk menetapkan penyedia +secara eksplisit: ```json5 { @@ -42,15 +42,16 @@ node-llama-cpp). ## Penyedia yang didukung -| Penyedia | ID | Perlu kunci API | Catatan | -| -------- | --------- | --------------- | ---------------------------------------------------- | -| OpenAI | `openai` | Ya | Terdeteksi otomatis, cepat | -| Gemini | `gemini` | Ya | Mendukung pengindeksan gambar/audio | -| Voyage | `voyage` | Ya | Terdeteksi otomatis | -| Mistral | `mistral` | Ya | Terdeteksi otomatis | -| Bedrock | `bedrock` | Tidak | Terdeteksi otomatis saat rantai kredensial AWS terselesaikan | -| Ollama | `ollama` | Tidak | Lokal, harus ditetapkan secara eksplisit | -| Local | `local` | Tidak | Model GGUF, unduhan ~0,6 GB | +| Penyedia | ID | Perlu kunci API | Catatan | +| -------------- | ---------------- | --------------- | ---------------------------------------------------- | +| Bedrock | `bedrock` | Tidak | Terdeteksi otomatis ketika rantai kredensial AWS terselesaikan | +| Gemini | `gemini` | Ya | Mendukung pengindeksan gambar/audio | +| GitHub Copilot | `github-copilot` | Tidak | Terdeteksi otomatis, menggunakan langganan Copilot | +| Local | `local` | Tidak | Model GGUF, unduhan ~0.6 GB | +| Mistral | `mistral` | Ya | Terdeteksi otomatis | +| Ollama | `ollama` | Tidak | Lokal, harus ditetapkan secara eksplisit | +| OpenAI | `openai` | Ya | Terdeteksi otomatis, cepat | +| Voyage | `voyage` | Ya | Terdeteksi otomatis | ## Cara kerja pencarian @@ -69,31 +70,31 @@ flowchart LR - **Pencarian vektor** menemukan catatan dengan makna yang serupa ("gateway host" cocok dengan "mesin yang menjalankan OpenClaw"). -- **Pencarian kata kunci BM25** menemukan kecocokan persis (ID, string error, kunci config - ). +- **Pencarian kata kunci BM25** menemukan kecocokan yang persis (ID, string error, kunci + konfigurasi). -Jika hanya satu jalur yang tersedia (tidak ada embedding atau tidak ada FTS), jalur lainnya akan berjalan sendiri. +Jika hanya satu jalur yang tersedia (tanpa embedding atau tanpa FTS), jalur lainnya berjalan sendiri. -Ketika embedding tidak tersedia, OpenClaw tetap menggunakan pemeringkatan leksikal atas hasil FTS alih-alih hanya kembali ke urutan kecocokan persis mentah. Mode terdegradasi itu meningkatkan potongan dengan cakupan istilah kueri yang lebih kuat dan jalur file yang relevan, sehingga recall tetap berguna bahkan tanpa `sqlite-vec` atau penyedia embedding. +Ketika embedding tidak tersedia, OpenClaw tetap menggunakan pemeringkatan leksikal atas hasil FTS alih-alih hanya kembali ke pengurutan kecocokan persis mentah. Mode degradasi itu meningkatkan potongan dengan cakupan istilah kueri yang lebih kuat dan jalur file yang relevan, sehingga recall tetap berguna bahkan tanpa `sqlite-vec` atau penyedia embedding. ## Meningkatkan kualitas pencarian Dua fitur opsional membantu ketika Anda memiliki riwayat catatan yang besar: -### Peluruhan temporal +### Temporal decay -Catatan lama secara bertahap kehilangan bobot peringkat sehingga informasi terbaru muncul lebih dulu. +Catatan lama secara bertahap kehilangan bobot pemeringkatan sehingga informasi terbaru muncul lebih dulu. Dengan half-life bawaan 30 hari, catatan dari bulan lalu mendapat skor 50% dari -bobot aslinya. File yang selalu relevan seperti `MEMORY.md` tidak pernah mengalami peluruhan. +bobot aslinya. File evergreen seperti `MEMORY.md` tidak pernah mengalami decay. -Aktifkan peluruhan temporal jika agen Anda memiliki catatan harian selama berbulan-bulan dan informasi usang -terus mendapat peringkat lebih tinggi daripada konteks terbaru. +Aktifkan temporal decay jika agen Anda memiliki catatan harian selama berbulan-bulan dan +informasi usang terus berada di atas konteks yang lebih baru. -### MMR (keragaman) +### MMR (keberagaman) -Mengurangi hasil yang redundan. Jika lima catatan semuanya menyebut config router yang sama, MMR +Mengurangi hasil yang redundan. Jika lima catatan semuanya menyebut konfigurasi router yang sama, MMR memastikan hasil teratas mencakup topik yang berbeda alih-alih berulang. @@ -123,8 +124,7 @@ catatan harian yang berbeda. ## Memori multimodal Dengan Gemini Embedding 2, Anda dapat mengindeks file gambar dan audio bersama -Markdown. Kueri pencarian tetap berupa teks, tetapi dapat cocok dengan konten visual dan audio. -Lihat [referensi konfigurasi Memori](/id/reference/memory-config) untuk +Markdown. Kueri pencarian tetap berupa teks, tetapi akan cocok dengan konten visual dan audio. Lihat [referensi konfigurasi Memory](/id/reference/memory-config) untuk penyiapan. ## Pencarian memori sesi @@ -132,7 +132,7 @@ penyiapan. Anda dapat secara opsional mengindeks transkrip sesi sehingga `memory_search` dapat mengingat percakapan sebelumnya. Ini bersifat opt-in melalui `memorySearch.experimental.sessionMemory`. Lihat -[referensi konfigurasi](/id/reference/memory-config) untuk detailnya. +[referensi konfigurasi](/id/reference/memory-config) untuk detail. ## Pemecahan masalah @@ -145,8 +145,8 @@ percakapan sebelumnya. Ini bersifat opt-in melalui **Teks CJK tidak ditemukan?** Bangun ulang indeks FTS dengan `openclaw memory index --force`. -## Bacaan lebih lanjut +## Bacaan lanjutan - [Active Memory](/id/concepts/active-memory) -- memori sub-agen untuk sesi chat interaktif -- [Memori](/id/concepts/memory) -- tata letak file, backend, alat -- [Referensi konfigurasi Memori](/id/reference/memory-config) -- semua pengaturan config +- [Memory](/id/concepts/memory) -- tata letak file, backend, alat +- [Referensi konfigurasi Memory](/id/reference/memory-config) -- semua opsi konfigurasi diff --git a/docs/id/concepts/memory.md b/docs/id/concepts/memory.md index 5995009a1..acea81405 100644 --- a/docs/id/concepts/memory.md +++ b/docs/id/concepts/memory.md @@ -2,84 +2,83 @@ read_when: - Anda ingin memahami cara kerja memori - Anda ingin mengetahui file memori apa yang harus ditulis -summary: Bagaimana OpenClaw mengingat hal-hal di berbagai sesi +summary: Bagaimana OpenClaw mengingat berbagai hal di seluruh sesi title: Ikhtisar Memori x-i18n: - generated_at: "2026-04-09T01:27:51Z" + generated_at: "2026-04-15T14:40:32Z" model: gpt-5.4 provider: openai - source_hash: 2fe47910f5bf1c44be379e971c605f1cb3a29befcf2a7ee11fb3833cbe3b9059 + source_hash: ad1adafe1d81f1703d24f48a9c9da2b25a0ebbd4aad4f65d8bde5df78195d55b source_path: concepts/memory.md workflow: 15 --- # Ikhtisar Memori -OpenClaw mengingat berbagai hal dengan menulis **file Markdown biasa** di workspace agen Anda. Model hanya "mengingat" apa yang disimpan ke disk -- tidak ada status tersembunyi. +OpenClaw mengingat berbagai hal dengan menulis **file Markdown biasa** di workspace agen Anda. Model hanya "mengingat" apa yang disimpan ke disk -- tidak ada state tersembunyi. ## Cara kerjanya -Agen Anda memiliki tiga file terkait memori: +Agen Anda memiliki tiga file yang terkait dengan memori: -- **`MEMORY.md`** -- memori jangka panjang. Fakta, preferensi, dan keputusan yang tahan lama. Dimuat saat awal setiap sesi DM. -- **`memory/YYYY-MM-DD.md`** -- catatan harian. Konteks berjalan dan pengamatan. Catatan hari ini dan kemarin dimuat secara otomatis. -- **`DREAMS.md`** (eksperimental, opsional) -- Dream Diary dan ringkasan penyapuan dreaming untuk ditinjau manusia, termasuk entri backfill historis yang berlandaskan data. +- **`MEMORY.md`** -- memori jangka panjang. Fakta, preferensi, dan keputusan yang bertahan lama. Dimuat pada awal setiap sesi DM. +- **`memory/YYYY-MM-DD.md`** -- catatan harian. Konteks dan observasi yang berjalan. Catatan hari ini dan kemarin dimuat secara otomatis. +- **`DREAMS.md`** (opsional) -- Buku Harian Mimpi dan ringkasan penyapuan Dreaming untuk tinjauan manusia, termasuk entri backfill historis yang terlandaskan. File-file ini berada di workspace agen (default `~/.openclaw/workspace`). -Jika Anda ingin agen Anda mengingat sesuatu, cukup minta: "Ingat bahwa saya -lebih menyukai TypeScript." Agen akan menuliskannya ke file yang sesuai. +Jika Anda ingin agen Anda mengingat sesuatu, cukup minta: "Ingat bahwa saya lebih suka TypeScript." Agen akan menuliskannya ke file yang sesuai. -## Tool memori +## Alat memori -Agen memiliki dua tool untuk bekerja dengan memori: +Agen memiliki dua alat untuk bekerja dengan memori: - **`memory_search`** -- menemukan catatan yang relevan menggunakan pencarian semantik, bahkan ketika susunan katanya berbeda dari aslinya. -- **`memory_get`** -- membaca file memori tertentu atau rentang baris tertentu. +- **`memory_get`** -- membaca file memori tertentu atau rentang baris. -Kedua tool disediakan oleh plugin memori yang aktif (default: `memory-core`). +Kedua alat disediakan oleh Plugin memori aktif (default: `memory-core`). ## Plugin pendamping Memory Wiki -Jika Anda ingin memori tahan lama berfungsi lebih seperti basis pengetahuan yang dipelihara daripada sekadar catatan mentah, gunakan plugin bawaan `memory-wiki`. +Jika Anda ingin memori yang bertahan lama berperilaku lebih seperti basis pengetahuan yang dipelihara daripada sekadar catatan mentah, gunakan Plugin bawaan `memory-wiki`. -`memory-wiki` mengompilasi pengetahuan tahan lama ke dalam vault wiki dengan: +`memory-wiki` mengompilasi pengetahuan yang bertahan lama ke dalam vault wiki dengan: - struktur halaman yang deterministik - klaim dan bukti yang terstruktur - pelacakan kontradiksi dan kebaruan - dasbor yang dihasilkan -- ringkasan terkompilasi untuk konsumen agen/runtime -- tool native wiki seperti `wiki_search`, `wiki_get`, `wiki_apply`, dan `wiki_lint` +- digest terkompilasi untuk konsumen agen/runtime +- alat yang native untuk wiki seperti `wiki_search`, `wiki_get`, `wiki_apply`, dan `wiki_lint` -Plugin ini tidak menggantikan plugin memori yang aktif. Plugin memori yang aktif tetap memiliki kendali atas recall, promosi, dan dreaming. `memory-wiki` menambahkan lapisan pengetahuan kaya provenance di sampingnya. +Ini tidak menggantikan Plugin memori aktif. Plugin memori aktif tetap memiliki recall, promosi, dan Dreaming. `memory-wiki` menambahkan lapisan pengetahuan yang kaya provenance di sampingnya. Lihat [Memory Wiki](/id/plugins/memory-wiki). ## Pencarian memori -Ketika penyedia embedding dikonfigurasi, `memory_search` menggunakan **pencarian hibrida** -- menggabungkan kemiripan vektor (makna semantik) dengan pencocokan kata kunci (istilah persis seperti ID dan simbol kode). Ini berfungsi langsung tanpa konfigurasi tambahan setelah Anda memiliki API key untuk penyedia yang didukung. +Ketika penyedia embedding dikonfigurasi, `memory_search` menggunakan **pencarian hibrida** -- menggabungkan kemiripan vektor (makna semantik) dengan pencocokan kata kunci (istilah persis seperti ID dan simbol kode). Ini berfungsi langsung setelah Anda memiliki API key untuk penyedia yang didukung. -OpenClaw mendeteksi otomatis penyedia embedding Anda dari API key yang tersedia. Jika Anda memiliki key OpenAI, Gemini, Voyage, atau Mistral yang dikonfigurasi, pencarian memori akan diaktifkan secara otomatis. +OpenClaw secara otomatis mendeteksi penyedia embedding Anda dari API key yang tersedia. Jika Anda telah mengonfigurasi key OpenAI, Gemini, Voyage, atau Mistral, pencarian memori akan diaktifkan secara otomatis. -Untuk detail tentang cara kerja pencarian, opsi penyetelan, dan penyiapan penyedia, lihat -[Memory Search](/id/concepts/memory-search). +Untuk detail tentang cara kerja pencarian, opsi penyesuaian, dan penyiapan penyedia, lihat +[Pencarian Memori](/id/concepts/memory-search). ## Backend memori -Berbasis SQLite. Berfungsi langsung dengan pencarian kata kunci, kemiripan vektor, dan pencarian hibrida. Tanpa dependensi tambahan. +Berbasis SQLite. Berfungsi langsung dengan pencarian kata kunci, kemiripan vektor, dan pencarian hibrida. Tidak memerlukan dependensi tambahan. Sidecar local-first dengan reranking, perluasan kueri, dan kemampuan untuk mengindeks direktori di luar workspace. -Memori lintas sesi yang AI-native dengan pemodelan pengguna, pencarian semantik, dan kesadaran multi-agen. Instal plugin. +Memori lintas sesi yang native AI dengan pemodelan pengguna, pencarian semantik, dan kesadaran multi-agen. Instalasi Plugin. @@ -87,41 +86,43 @@ Memori lintas sesi yang AI-native dengan pemodelan pengguna, pencarian semantik, -Mengompilasi memori tahan lama menjadi vault wiki kaya provenance dengan klaim, dasbor, mode bridge, dan alur kerja yang ramah Obsidian. +Mengompilasi memori yang bertahan lama ke dalam vault wiki yang kaya provenance dengan klaim, dasbor, mode bridge, dan alur kerja yang ramah Obsidian. ## Flush memori otomatis -Sebelum [compaction](/id/concepts/compaction) merangkum percakapan Anda, OpenClaw menjalankan giliran diam-diam yang mengingatkan agen untuk menyimpan konteks penting ke file memori. Ini aktif secara default -- Anda tidak perlu mengonfigurasi apa pun. +Sebelum [Compaction](/id/concepts/compaction) merangkum percakapan Anda, OpenClaw menjalankan giliran senyap yang mengingatkan agen untuk menyimpan konteks penting ke file memori. Ini aktif secara default -- Anda tidak perlu mengonfigurasi apa pun. -Flush memori mencegah hilangnya konteks selama compaction. Jika agen Anda memiliki fakta penting dalam percakapan yang belum ditulis ke file, fakta tersebut akan disimpan secara otomatis sebelum peringkasan terjadi. +Flush memori mencegah kehilangan konteks selama Compaction. Jika agen Anda memiliki fakta penting dalam percakapan yang belum ditulis ke file, fakta tersebut akan disimpan secara otomatis sebelum peringkasan terjadi. -## Dreaming (eksperimental) +## Dreaming -Dreaming adalah proses konsolidasi latar belakang opsional untuk memori. Sistem ini mengumpulkan sinyal jangka pendek, memberi skor pada kandidat, dan hanya mempromosikan item yang memenuhi syarat ke memori jangka panjang (`MEMORY.md`). +Dreaming adalah proses konsolidasi latar belakang opsional untuk memori. Ini mengumpulkan sinyal jangka pendek, memberi skor pada kandidat, dan hanya mempromosikan item yang memenuhi syarat ke memori jangka panjang (`MEMORY.md`). -Sistem ini dirancang untuk menjaga memori jangka panjang tetap bernilai tinggi: +Ini dirancang untuk menjaga agar memori jangka panjang tetap memiliki sinyal tinggi: - **Opt-in**: dinonaktifkan secara default. -- **Terjadwal**: ketika diaktifkan, `memory-core` mengelola otomatis satu cron job berulang untuk penyapuan dreaming penuh. -- **Berambang**: promosi harus melewati gerbang skor, frekuensi recall, dan keragaman kueri. -- **Dapat ditinjau**: ringkasan fase dan entri buku harian ditulis ke `DREAMS.md` untuk ditinjau manusia. +- **Terjadwal**: saat diaktifkan, `memory-core` secara otomatis mengelola satu pekerjaan Cron berulang untuk penyapuan Dreaming penuh. +- **Berambang batas**: promosi harus melewati gerbang skor, frekuensi recall, dan keragaman kueri. +- **Dapat ditinjau**: ringkasan fase dan entri buku harian ditulis ke `DREAMS.md` untuk tinjauan manusia. -Untuk perilaku fase, sinyal penilaian, dan detail Dream Diary, lihat -[Dreaming (experimental)](/id/concepts/dreaming). +Untuk perilaku fase, sinyal penilaian, dan detail Buku Harian Mimpi, lihat +[Dreaming](/id/concepts/dreaming). -## Grounded backfill dan promosi langsung +## Backfill terlandaskan dan promosi langsung -Sistem dreaming sekarang memiliki dua jalur tinjauan yang sangat terkait: +Sistem Dreaming kini memiliki dua jalur peninjauan yang sangat terkait: -- **Live dreaming** bekerja dari penyimpanan dreaming jangka pendek di bawah - `memory/.dreams/` dan inilah yang digunakan fase mendalam normal saat memutuskan apa yang dapat lulus ke `MEMORY.md`. -- **Grounded backfill** membaca catatan historis `memory/YYYY-MM-DD.md` sebagai file harian mandiri dan menulis keluaran tinjauan terstruktur ke `DREAMS.md`. +- **Dreaming langsung** bekerja dari penyimpanan Dreaming jangka pendek di bawah + `memory/.dreams/` dan itulah yang digunakan fase mendalam normal saat memutuskan apa yang + dapat lulus ke `MEMORY.md`. +- **Backfill terlandaskan** membaca catatan historis `memory/YYYY-MM-DD.md` sebagai + file harian mandiri dan menulis keluaran tinjauan terstruktur ke `DREAMS.md`. -Grounded backfill berguna saat Anda ingin memutar ulang catatan lama dan memeriksa apa yang menurut sistem bersifat tahan lama tanpa mengedit `MEMORY.md` secara manual. +Backfill terlandaskan berguna ketika Anda ingin memutar ulang catatan lama dan memeriksa apa yang menurut sistem bersifat tahan lama tanpa mengedit `MEMORY.md` secara manual. Saat Anda menggunakan: @@ -129,13 +130,13 @@ Saat Anda menggunakan: openclaw memory rem-backfill --path ./memory --stage-short-term ``` -kandidat tahan lama yang berlandaskan data tidak dipromosikan secara langsung. Kandidat tersebut dipentaskan ke penyimpanan dreaming jangka pendek yang sama yang sudah digunakan oleh fase mendalam normal. Artinya: +kandidat tahan lama yang terlandaskan tidak dipromosikan secara langsung. Kandidat tersebut dipentaskan ke penyimpanan Dreaming jangka pendek yang sama yang sudah digunakan fase mendalam normal. Artinya: - `DREAMS.md` tetap menjadi permukaan tinjauan manusia. -- penyimpanan jangka pendek tetap menjadi permukaan pemeringkatan yang berhadapan dengan mesin. +- penyimpanan jangka pendek tetap menjadi permukaan pemeringkatan yang menghadap mesin. - `MEMORY.md` tetap hanya ditulis oleh promosi mendalam. -Jika Anda memutuskan pemutaran ulang itu tidak berguna, Anda dapat menghapus artefak yang dipentaskan tanpa menyentuh entri buku harian biasa atau status recall normal: +Jika Anda memutuskan pemutaran ulang itu tidak berguna, Anda dapat menghapus artefak yang dipentaskan tanpa menyentuh entri buku harian biasa atau state recall normal: ```bash openclaw memory rem-backfill --rollback @@ -154,11 +155,11 @@ openclaw memory index --force # Bangun ulang indeks - [Builtin Memory Engine](/id/concepts/memory-builtin) -- backend SQLite default - [QMD Memory Engine](/id/concepts/memory-qmd) -- sidecar local-first tingkat lanjut -- [Honcho Memory](/id/concepts/memory-honcho) -- memori lintas sesi AI-native -- [Memory Wiki](/id/plugins/memory-wiki) -- vault pengetahuan terkompilasi dan tool native wiki -- [Memory Search](/id/concepts/memory-search) -- pipeline pencarian, penyedia, dan - penyetelan -- [Dreaming (experimental)](/id/concepts/dreaming) -- promosi latar belakang +- [Honcho Memory](/id/concepts/memory-honcho) -- memori lintas sesi yang native AI +- [Memory Wiki](/id/plugins/memory-wiki) -- vault pengetahuan terkompilasi dan alat yang native untuk wiki +- [Pencarian Memori](/id/concepts/memory-search) -- pipeline pencarian, penyedia, dan + penyesuaian +- [Dreaming](/id/concepts/dreaming) -- promosi latar belakang dari recall jangka pendek ke memori jangka panjang -- [Memory configuration reference](/id/reference/memory-config) -- semua opsi konfigurasi -- [Compaction](/id/concepts/compaction) -- bagaimana compaction berinteraksi dengan memori +- [Referensi konfigurasi memori](/id/reference/memory-config) -- semua opsi konfigurasi +- [Compaction](/id/concepts/compaction) -- bagaimana Compaction berinteraksi dengan memori diff --git a/docs/id/gateway/configuration-reference.md b/docs/id/gateway/configuration-reference.md index 05efcc549..04632d80e 100644 --- a/docs/id/gateway/configuration-reference.md +++ b/docs/id/gateway/configuration-reference.md @@ -1,35 +1,35 @@ --- read_when: - - Anda memerlukan semantik konfigurasi tingkat bidang atau nilai default yang tepat - - 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 + - Anda memerlukan semantik konfigurasi tingkat bidang yang tepat atau nilai defaultnya + - Anda sedang memvalidasi blok konfigurasi channel, model, gateway, atau alat +summary: Referensi konfigurasi Gateway untuk kunci inti OpenClaw, nilai default, dan tautan ke referensi subsistem khusus title: Referensi Konfigurasi x-i18n: - generated_at: "2026-04-11T15:15:57Z" + generated_at: "2026-04-15T14:40:34Z" model: gpt-5.4 provider: openai - source_hash: 351a245bed59d852ea8582e4e9fec5017a5c623cd6f0034766cdea1b5330be3c + source_hash: 7a4da3b41d0304389bd6359aac1185c231e529781b607656ab352f8a8104bdba source_path: gateway/configuration-reference.md workflow: 15 --- # Referensi Konfigurasi -Referensi konfigurasi inti untuk `~/.openclaw/openclaw.json`. Untuk ringkasan 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 ketika sebuah subsistem memiliki referensi yang lebih mendalam. 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 memberikan tautan keluar saat suatu subsistem memiliki referensi yang lebih mendalam sendiri. Halaman ini **tidak** mencoba menyisipkan setiap katalog perintah milik channel/Plugin atau setiap knob memori/QMD tingkat lanjut 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 bila tersedia -- `config.schema.lookup` mengembalikan satu node skema yang dicakup jalur untuk alat penelusuran mendalam +- `openclaw config schema` mencetak JSON Schema langsung yang digunakan untuk validasi dan Control UI, dengan metadata bundled/plugin/channel digabungkan bila tersedia +- `config.schema.lookup` mengembalikan satu node skema yang dibatasi jalur untuk alat penelusuran mendalam - `pnpm config:docs:check` / `pnpm config:docs:gen` memvalidasi hash baseline dokumen konfigurasi terhadap permukaan skema saat ini Referensi mendalam khusus: - [Referensi konfigurasi memori](/id/reference/memory-config) untuk `agents.defaults.memorySearch.*`, `memory.qmd.*`, `memory.citations`, dan konfigurasi dreaming di bawah `plugins.entries.memory-core.config.dreaming` - [Slash Commands](/id/tools/slash-commands) untuk katalog perintah bawaan + bundled saat ini -- halaman channel/plugin pemilik untuk permukaan perintah khusus channel +- 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. @@ -37,34 +37,34 @@ Format konfigurasi adalah **JSON5** (komentar + koma di akhir diperbolehkan). Se ## Channels -Setiap channel dimulai secara otomatis saat bagian konfigurasinya ada (kecuali `enabled: false`). +Setiap channel dimulai secara otomatis ketika 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; pemilik harus menyetujui | -| `allowlist` | Hanya pengirim di `allowFrom` (atau penyimpanan izin hasil pair) | -| `open` | Izinkan semua DM masuk (memerlukan `allowFrom: ["*"]`) | -| `disabled` | Abaikan semua DM masuk | +| Kebijakan DM | Perilaku | +| -------------------- | ------------------------------------------------------------- | +| `pairing` (default) | Pengirim yang tidak dikenal mendapatkan kode pairing sekali; pemilik harus menyetujui | +| `allowlist` | Hanya pengirim di `allowFrom` (atau penyimpanan izinkan hasil pairing) | +| `open` | Izinkan semua DM masuk (memerlukan `allowFrom: ["*"]`) | +| `disabled` | Abaikan semua DM masuk | -| Kebijakan grup | Perilaku | -| --------------------- | ----------------------------------------------------- | -| `allowlist` (default) | Hanya grup yang cocok dengan allowlist yang dikonfigurasi | -| `open` | Lewati allowlist grup (pembatasan mention tetap berlaku) | -| `disabled` | Blokir semua pesan grup/room | +| Kebijakan grup | Perilaku | +| ---------------------- | ---------------------------------------------------- | +| `allowlist` (default) | Hanya grup yang cocok dengan allowlist yang dikonfigurasi | +| `open` | Lewati allowlist grup (gating mention tetap berlaku) | +| `disabled` | Blokir semua pesan grup/room | -`channels.defaults.groupPolicy` menetapkan default ketika `groupPolicy` milik provider tidak diatur. +`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 provider tidak ada sama sekali (`channels.` tidak ada), kebijakan grup runtime akan fallback ke `allowlist` (fail-closed) dengan peringatan saat startup. +Jika blok penyedia sepenuhnya tidak ada (`channels.` tidak ada), kebijakan grup runtime akan kembali ke `allowlist` (fail-closed) dengan peringatan saat startup. ### Override model channel -Gunakan `channels.modelByChannel` untuk menetapkan ID channel tertentu ke sebuah model. Nilai menerima `provider/model` atau alias model yang sudah dikonfigurasi. Pemetaan channel diterapkan 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 ketika sebuah sesi belum memiliki override model (misalnya, diatur melalui `/model`). ```json5 { @@ -85,9 +85,9 @@ Gunakan `channels.modelByChannel` untuk menetapkan ID channel tertentu ke sebuah } ``` -### Default channel dan heartbeat +### Default channel dan Heartbeat -Gunakan `channels.defaults` untuk perilaku kebijakan grup dan heartbeat bersama di seluruh provider: +Gunakan `channels.defaults` untuk perilaku kebijakan grup dan Heartbeat bersama di seluruh penyedia: ```json5 { @@ -105,15 +105,15 @@ Gunakan `channels.defaults` untuk perilaku kebijakan grup dan heartbeat bersama } ``` -- `channels.defaults.groupPolicy`: kebijakan grup fallback saat `groupPolicy` tingkat provider tidak diatur. -- `channels.defaults.contextVisibility`: mode visibilitas konteks tambahan default untuk semua channel. Nilai: `all` (default, sertakan semua konteks kutipan/thread/riwayat), `allowlist` (hanya sertakan konteks dari pengirim yang diizinkan), `allowlist_quote` (sama seperti allowlist tetapi pertahankan konteks kutipan/balasan eksplisit). Override per channel: `channels..contextVisibility`. -- `channels.defaults.heartbeat.showOk`: sertakan status channel yang sehat dalam output heartbeat. -- `channels.defaults.heartbeat.showAlerts`: sertakan status menurun/error dalam output heartbeat. -- `channels.defaults.heartbeat.useIndicator`: tampilkan output heartbeat bergaya indikator yang ringkas. +- `channels.defaults.groupPolicy`: kebijakan grup cadangan 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 pertahankan konteks kutipan/balasan eksplisit). Override per-channel: `channels..contextVisibility`. +- `channels.defaults.heartbeat.showOk`: sertakan status channel yang sehat dalam output Heartbeat. +- `channels.defaults.heartbeat.showAlerts`: sertakan status yang menurun/error dalam output Heartbeat. +- `channels.defaults.heartbeat.useIndicator`: tampilkan output Heartbeat bergaya indikator yang ringkas. ### WhatsApp -WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai secara otomatis saat sesi yang ditautkan ada. +WhatsApp berjalan melalui channel web Gateway (Baileys Web). Channel ini dimulai secara otomatis ketika sesi yang telah ditautkan ada. ```json5 { @@ -124,7 +124,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai textChunkLimit: 4000, chunkMode: "length", // length | newline mediaMaxMb: 50, - sendReadReceipts: true, // centang biru (false dalam mode chat ke diri sendiri) + sendReadReceipts: true, // centang biru (false dalam mode obrolan sendiri) groups: { "*": { requireMention: true }, }, @@ -164,8 +164,8 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai } ``` -- Perintah keluar secara default menggunakan akun `default` jika ada; jika tidak, ID akun pertama yang dikonfigurasi (diurutkan). -- `channels.whatsapp.defaultAccount` opsional menggantikan pemilihan akun default fallback itu jika cocok dengan ID akun yang dikonfigurasi. +- Perintah keluar secara default menggunakan akun `default` jika ada; jika tidak, gunakan ID akun pertama yang dikonfigurasi (diurutkan). +- `channels.whatsapp.defaultAccount` opsional menggantikan pemilihan akun default cadangan itu ketika nilainya 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`. @@ -202,7 +202,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai historyLimit: 50, replyToMode: "first", // off | first | all | batched linkPreview: true, - streaming: "partial", // off | partial | block | progress (default: off; aktifkan secara eksplisit untuk menghindari batas laju edit pratinjau) + streaming: "partial", // off | partial | block | progress (default: off; opt in explicitly to avoid preview-edit rate limits) actions: { reactions: true, sendMessage: true }, reactionNotifications: "own", // off | own | all mediaMaxMb: 100, @@ -225,13 +225,13 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai } ``` -- Token bot: `channels.telegram.botToken` atau `channels.telegram.tokenFile` (hanya file biasa; symlink ditolak), dengan `TELEGRAM_BOT_TOKEN` sebagai fallback untuk akun default. -- `channels.telegram.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Dalam penyiapan 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 dipicu Telegram (migrasi ID supergroup, `/config set|unset`). -- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk topik forum (gunakan `chatId:topic:topicId` kanonis di `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). -- Pratinjau stream Telegram menggunakan `sendMessage` + `editMessageText` (berfungsi di chat langsung dan grup). -- Kebijakan retry: lihat [Kebijakan retry](/id/concepts/retry). +- Token bot: `channels.telegram.botToken` atau `channels.telegram.tokenFile` (hanya file biasa; symlink ditolak), dengan `TELEGRAM_BOT_TOKEN` sebagai cadangan untuk akun default. +- `channels.telegram.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya cocok dengan ID akun yang dikonfigurasi. +- Dalam penyiapan multi-akun (2+ ID akun), tetapkan default eksplisit (`channels.telegram.defaultAccount` atau `channels.telegram.accounts.default`) untuk menghindari perutean cadangan; `openclaw doctor` akan memperingatkan jika ini tidak ada atau tidak valid. +- `configWrites: false` memblokir penulisan konfigurasi yang dipicu dari Telegram (migrasi ID supergroup, `/config set|unset`). +- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk topik forum (gunakan format kanonis `chatId:topic:topicId` di `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Pratinjau stream Telegram menggunakan `sendMessage` + `editMessageText` (berfungsi di obrolan langsung dan grup). +- Kebijakan retry: lihat [Retry policy](/id/concepts/retry). ### Discord @@ -333,34 +333,34 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai } ``` -- Token: `channels.discord.token`, dengan `DISCORD_BOT_TOKEN` sebagai fallback untuk akun default. +- Token: `channels.discord.token`, dengan `DISCORD_BOT_TOKEN` sebagai cadangan untuk akun default. - Panggilan keluar langsung yang memberikan `token` Discord eksplisit menggunakan token tersebut untuk panggilan; pengaturan retry/kebijakan akun tetap berasal dari akun yang dipilih dalam snapshot runtime aktif. -- `channels.discord.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- `channels.discord.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya cocok dengan ID akun yang dikonfigurasi. - Gunakan `user:` (DM) atau `channel:` (channel guild) untuk target pengiriman; ID numerik tanpa awalan ditolak. -- Slug guild menggunakan huruf kecil dengan spasi diganti menjadi `-`; kunci channel menggunakan nama yang sudah di-slug (tanpa `#`). Lebih disarankan menggunakan ID guild. +- Slug guild menggunakan huruf kecil dengan spasi diganti `-`; kunci channel menggunakan nama yang sudah di-slug (tanpa `#`). Utamakan ID guild. - Pesan yang ditulis bot diabaikan secara default. `allowBots: true` mengaktifkannya; gunakan `allowBots: "mentions"` untuk hanya menerima pesan bot yang menyebut bot (pesan sendiri tetap difilter). -- `channels.discord.guilds..ignoreOtherMentions` (dan override channel) menghapus pesan yang menyebut pengguna atau role lain tetapi tidak menyebut bot (tidak termasuk @everyone/@here). -- `maxLinesPerMessage` (default 17) membagi pesan yang tinggi meskipun di bawah 2000 karakter. +- `channels.discord.guilds..ignoreOtherMentions` (dan override channel) menghapus pesan yang menyebut pengguna atau peran lain tetapi tidak menyebut bot (tidak termasuk @everyone/@here). +- `maxLinesPerMessage` (default 17) memecah pesan yang tinggi bahkan ketika masih di bawah 2000 karakter. - `channels.discord.threadBindings` mengontrol perutean terikat thread Discord: - - `enabled`: override Discord untuk fitur sesi terikat thread (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, serta pengiriman/perutean terikat) + - `enabled`: override Discord untuk fitur sesi terikat thread (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, dan pengiriman/perutean terikat) - `idleHours`: override Discord untuk auto-unfocus karena tidak aktif dalam jam (`0` menonaktifkan) - `maxAgeHours`: override Discord untuk usia maksimum keras dalam jam (`0` menonaktifkan) - `spawnSubagentSessions`: sakelar opt-in untuk pembuatan/pengikatan thread otomatis `sessions_spawn({ thread: true })` -- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk channel dan thread (gunakan ID channel/thread di `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). +- Entri `bindings[]` tingkat atas dengan `type: "acp"` mengonfigurasi binding ACP persisten untuk channel dan thread (gunakan id channel/thread di `match.peer.id`). Semantik bidang dibagikan di [ACP Agents](/id/tools/acp-agents#channel-specific-settings). - `channels.discord.ui.components.accentColor` menetapkan warna aksen untuk kontainer komponen Discord v2. - `channels.discord.voice` mengaktifkan percakapan channel suara Discord 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/bergabung ulang ke sesi suara setelah kegagalan dekripsi berulang. -- `channels.discord.streaming` adalah kunci mode stream kanonis. Nilai boolean `streamMode` dan `streaming` lama dimigrasikan secara otomatis. -- `channels.discord.autoPresence` memetakan ketersediaan runtime ke presence bot (healthy => online, degraded => idle, exhausted => dnd) dan mengizinkan override teks status opsional. +- OpenClaw juga mencoba pemulihan penerimaan suara dengan keluar/bergabung kembali ke sesi suara setelah kegagalan dekripsi berulang. +- `channels.discord.streaming` adalah kunci mode stream kanonis. Nilai legacy `streamMode` dan nilai boolean `streaming` dimigrasikan secara otomatis. +- `channels.discord.autoPresence` memetakan ketersediaan runtime ke presence bot (healthy => online, degraded => idle, exhausted => dnd) dan memungkinkan override teks status opsional. - `channels.discord.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan nama/tag yang dapat berubah (mode kompatibilitas break-glass). - `channels.discord.execApprovals`: pengiriman persetujuan exec native Discord dan otorisasi pemberi persetujuan. - - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif saat pemberi persetujuan dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. - - `approvers`: ID pengguna Discord yang diizinkan untuk menyetujui permintaan exec. Fallback ke `commands.ownerAllowFrom` saat dihilangkan. + - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif ketika pemberi persetujuan dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. + - `approvers`: ID pengguna Discord yang diizinkan untuk menyetujui permintaan exec. Menggunakan `commands.ownerAllowFrom` sebagai cadangan jika dihilangkan. - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan persetujuan bagi semua agen. - `sessionFilter`: pola kunci sesi opsional (substring atau regex). - - `target`: tempat mengirim prompt persetujuan. `"dm"` (default) mengirim ke DM pemberi persetujuan, `"channel"` mengirim ke channel asal, `"both"` mengirim ke keduanya. Saat target mencakup `"channel"`, tombol hanya dapat digunakan oleh pemberi persetujuan yang berhasil di-resolve. - - `cleanupAfterResolve`: saat `true`, menghapus DM persetujuan setelah persetujuan, penolakan, atau timeout. + - `target`: tempat mengirim prompt persetujuan. `"dm"` (default) mengirim ke DM pemberi persetujuan, `"channel"` mengirim ke channel asal, `"both"` mengirim ke keduanya. Saat target menyertakan `"channel"`, tombol hanya dapat digunakan oleh pemberi persetujuan yang berhasil di-resolve. + - `cleanupAfterResolve`: saat `true`, menghapus DM persetujuan 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). @@ -395,7 +395,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai - JSON akun layanan: inline (`serviceAccount`) atau berbasis file (`serviceAccountFile`). - SecretRef akun layanan juga didukung (`serviceAccountRef`). -- Fallback env: `GOOGLE_CHAT_SERVICE_ACCOUNT` atau `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`. +- Cadangan env: `GOOGLE_CHAT_SERVICE_ACCOUNT` atau `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`. - Gunakan `spaces/` atau `users/` untuk target pengiriman. - `channels.googlechat.dangerouslyAllowNameMatching` mengaktifkan kembali pencocokan principal email yang dapat berubah (mode kompatibilitas break-glass). @@ -449,7 +449,7 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai chunkMode: "length", streaming: { mode: "partial", // off | partial | block | progress - nativeTransport: true, // gunakan API streaming native Slack saat mode=partial + nativeTransport: true, // use Slack native streaming API when mode=partial }, mediaMaxMb: 20, execApprovals: { @@ -464,34 +464,39 @@ WhatsApp berjalan melalui channel web gateway (Baileys Web). Channel ini dimulai } ``` -- **Mode socket** memerlukan `botToken` dan `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` untuk fallback env akun default). +- **Mode socket** memerlukan `botToken` dan `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` untuk cadangan env akun default). - **Mode HTTP** memerlukan `botToken` ditambah `signingSecret` (di root atau per akun). -- `botToken`, `appToken`, `signingSecret`, dan `userToken` menerima string plaintext atau objek SecretRef. -- Snapshot akun Slack mengekspos bidang sumber/status per kredensial seperti `botTokenSource`, `botTokenStatus`, `appTokenStatus`, dan, dalam mode HTTP, `signingSecretStatus`. `configured_unavailable` berarti akun dikonfigurasi melalui SecretRef tetapi jalur perintah/runtime saat ini tidak dapat me-resolve nilai secret. -- `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 secara otomatis. +- `botToken`, `appToken`, `signingSecret`, dan `userToken` menerima string plaintext + atau objek SecretRef. +- Snapshot akun Slack mengekspos bidang sumber/status per kredensial seperti + `botTokenSource`, `botTokenStatus`, `appTokenStatus`, dan, dalam mode HTTP, + `signingSecretStatus`. `configured_unavailable` berarti akun tersebut + dikonfigurasi melalui SecretRef tetapi jalur perintah/runtime saat ini tidak dapat + me-resolve nilai rahasia. +- `configWrites: false` memblokir penulisan konfigurasi yang dipicu dari Slack. +- `channels.slack.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya 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 legacy `streamMode`, nilai boolean `streaming`, dan `nativeStreaming` dimigrasikan secara 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. -- Streaming native Slack ditambah status thread bergaya asisten Slack "is typing..." memerlukan target thread balasan. DM tingkat atas tetap off-thread secara default, sehingga menggunakan `typingReaction` atau pengiriman normal sebagai ganti 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"`. +- Streaming native Slack ditambah status thread gaya asisten Slack "is typing..." memerlukan target thread balasan. DM tingkat atas tetap off-thread secara default, jadi DM menggunakan `typingReaction` atau pengiriman normal alih-alih pratinjau bergaya thread. +- `typingReaction` menambahkan reaksi sementara ke pesan Slack masuk saat balasan sedang berjalan, lalu menghapusnya setelah selesai. Gunakan shortcode emoji Slack seperti `"hourglass_flowing_sand"`. - `channels.slack.execApprovals`: pengiriman persetujuan exec native Slack dan otorisasi pemberi persetujuan. Skema sama seperti Discord: `enabled` (`true`/`false`/`"auto"`), `approvers` (ID pengguna Slack), `agentFilter`, `sessionFilter`, dan `target` (`"dm"`, `"channel"`, atau `"both"`). -| Grup aksi | Default | Catatan | -| ----------- | ------- | ---------------------- | -| reactions | enabled | React + daftar reaksi | -| messages | enabled | Baca/kirim/edit/hapus | -| pins | enabled | Sematkan/lepas/list | -| memberInfo | enabled | Info anggota | -| emojiList | enabled | Daftar emoji kustom | +| Grup aksi | Default | Catatan | +| ----------- | ------- | ------------------------ | +| reactions | aktif | Reaksi + daftar reaksi | +| messages | aktif | Baca/kirim/edit/hapus | +| pins | aktif | Sematkan/lepas/list | +| memberInfo | aktif | Info anggota | +| emojiList | aktif | Daftar emoji kustom | ### Mattermost -Mattermost dikirim sebagai plugin: `openclaw plugins install @openclaw/mattermost`. +Mattermost dikirim sebagai Plugin: `openclaw plugins install @openclaw/mattermost`. ```json5 { @@ -521,18 +526,23 @@ Mattermost dikirim sebagai plugin: `openclaw plugins install @openclaw/mattermos } ``` -Mode chat: `oncall` (merespons pada @-mention, default), `onmessage` (setiap pesan), `onchar` (pesan yang dimulai dengan awalan pemicu). +Mode chat: `oncall` (merespons pada @-mention, default), `onmessage` (setiap pesan), `onchar` (pesan yang dimulai dengan prefiks pemicu). Saat perintah native Mattermost diaktifkan: -- `commands.callbackPath` harus berupa path (misalnya `/api/channels/mattermost/command`), bukan URL penuh. -- `commands.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 pendaftaran slash command. Jika pendaftaran gagal atau tidak ada perintah yang diaktifkan, OpenClaw menolak callback dengan `Unauthorized: invalid command token.` -- Untuk host callback private/tailnet/internal, Mattermost mungkin memerlukan `ServiceSettings.AllowedUntrustedInternalConnections` untuk mencakup host/domain callback. Gunakan nilai host/domain, bukan URL penuh. -- `channels.mattermost.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu Mattermost. -- `channels.mattermost.requireMention`: mewajibkan `@mention` sebelum membalas di channel. -- `channels.mattermost.groups..requireMention`: override pembatasan mention per channel (`"*"` untuk default). -- `channels.mattermost.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- `commands.callbackPath` harus berupa path (misalnya `/api/channels/mattermost/command`), bukan URL lengkap. +- `commands.callbackUrl` harus me-resolve ke endpoint Gateway OpenClaw dan dapat dijangkau dari server Mattermost. +- Callback slash native diautentikasi dengan token per-perintah yang dikembalikan + oleh Mattermost selama pendaftaran slash command. Jika pendaftaran gagal atau tidak ada + perintah yang diaktifkan, OpenClaw menolak callback dengan + `Unauthorized: invalid command token.` +- Untuk host callback privat/tailnet/internal, Mattermost mungkin memerlukan + `ServiceSettings.AllowedUntrustedInternalConnections` untuk menyertakan host/domain callback. + Gunakan nilai host/domain, bukan URL lengkap. +- `channels.mattermost.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu dari 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 nilainya cocok dengan ID akun yang dikonfigurasi. ### Signal @@ -556,12 +566,12 @@ 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 dipicu Signal. -- `channels.signal.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- `channels.signal.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu dari Signal. +- `channels.signal.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya cocok dengan ID akun yang dikonfigurasi. ### BlueBubbles -BlueBubbles adalah jalur iMessage yang direkomendasikan (didukung plugin, dikonfigurasi di bawah `channels.bluebubbles`). +BlueBubbles adalah jalur iMessage yang direkomendasikan (didukung Plugin, dikonfigurasi di bawah `channels.bluebubbles`). ```json5 { @@ -569,7 +579,7 @@ BlueBubbles adalah jalur iMessage yang direkomendasikan (didukung plugin, dikonf bluebubbles: { enabled: true, dmPolicy: "pairing", - // serverUrl, password, webhookPath, kontrol grup, dan aksi lanjutan: + // serverUrl, password, webhookPath, kontrol grup, dan tindakan lanjutan: // lihat /channels/bluebubbles }, }, @@ -577,7 +587,7 @@ BlueBubbles adalah jalur iMessage yang direkomendasikan (didukung plugin, dikonf ``` - 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. +- `channels.bluebubbles.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya cocok dengan ID akun yang dikonfigurasi. - Entri `bindings[]` tingkat atas dengan `type: "acp"` dapat mengikat percakapan BlueBubbles ke sesi ACP persisten. Gunakan handle BlueBubbles atau string target (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`) di `match.peer.id`. Semantik bidang bersama: [ACP Agents](/id/tools/acp-agents#channel-specific-settings). - Konfigurasi channel BlueBubbles lengkap didokumentasikan di [BlueBubbles](/id/channels/bluebubbles). @@ -607,17 +617,17 @@ OpenClaw menjalankan `imsg rpc` (`JSON-RPC` melalui stdio). Tidak memerlukan dae } ``` -- `channels.imessage.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. +- `channels.imessage.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya cocok dengan ID akun yang dikonfigurasi. - Memerlukan Full Disk Access ke DB Messages. -- Lebih disarankan menggunakan target `chat_id:`. Gunakan `imsg chats --limit 20` untuk mencantumkan chat. -- `cliPath` dapat mengarah ke wrapper SSH; atur `remoteHost` (`host` atau `user@host`) untuk pengambilan lampiran SCP. -- `attachmentRoots` dan `remoteAttachmentRoots` membatasi path lampiran masuk (default: `/Users/*/Library/Messages/Attachments`). +- Utamakan target `chat_id:`. Gunakan `imsg chats --limit 20` untuk menampilkan daftar chat. +- `cliPath` dapat menunjuk ke pembungkus SSH; atur `remoteHost` (`host` atau `user@host`) untuk pengambilan lampiran SCP. +- `attachmentRoots` dan `remoteAttachmentRoots` membatasi jalur 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 dipicu iMessage. +- `channels.imessage.configWrites`: izinkan atau tolak penulisan konfigurasi yang dipicu 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). - + ```bash #!/usr/bin/env bash @@ -660,18 +670,18 @@ Matrix didukung extension dan dikonfigurasi di bawah `channels.matrix`. - Autentikasi token menggunakan `accessToken`; autentikasi kata sandi menggunakan `userId` + `password`. - `channels.matrix.proxy` merutekan lalu lintas HTTP Matrix melalui proxy HTTP(S) eksplisit. Akun bernama dapat menggantinya dengan `channels.matrix.accounts..proxy`. -- `channels.matrix.network.dangerouslyAllowPrivateNetwork` mengizinkan homeserver private/internal. `proxy` dan opt-in jaringan ini adalah kontrol yang independen. +- `channels.matrix.network.dangerouslyAllowPrivateNetwork` mengizinkan homeserver privat/internal. `proxy` dan opt-in jaringan ini adalah kontrol yang independen. - `channels.matrix.defaultAccount` memilih akun pilihan dalam penyiapan multi-akun. -- `channels.matrix.autoJoin` default-nya `off`, sehingga room undangan dan undangan bergaya DM baru diabaikan sampai Anda menetapkan `autoJoin: "allowlist"` dengan `autoJoinAllowlist` atau `autoJoin: "always"`. +- `channels.matrix.autoJoin` default-nya `off`, jadi room undangan dan undangan bergaya DM baru diabaikan sampai Anda menetapkan `autoJoin: "allowlist"` dengan `autoJoinAllowlist` atau `autoJoin: "always"`. - `channels.matrix.execApprovals`: pengiriman persetujuan exec native Matrix dan otorisasi pemberi persetujuan. - - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif saat pemberi persetujuan dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. + - `enabled`: `true`, `false`, atau `"auto"` (default). Dalam mode auto, persetujuan exec aktif ketika pemberi persetujuan dapat di-resolve dari `approvers` atau `commands.ownerAllowFrom`. - `approvers`: ID pengguna Matrix (mis. `@owner:example.org`) yang diizinkan untuk menyetujui permintaan exec. - `agentFilter`: allowlist ID agen opsional. Hilangkan untuk meneruskan persetujuan bagi semua agen. - `sessionFilter`: pola kunci sesi opsional (substring atau regex). - `target`: tempat mengirim prompt persetujuan. `"dm"` (default), `"channel"` (room asal), atau `"both"`. - Override per akun: `channels.matrix.accounts..execApprovals`. -- `channels.matrix.dm.sessionScope` mengontrol cara DM Matrix dikelompokkan ke dalam sesi: `per-user` (default) berbagi berdasarkan peer yang dirutekan, sedangkan `per-room` mengisolasi setiap room DM. -- Probe status Matrix dan lookup direktori langsung menggunakan kebijakan proxy yang sama seperti lalu lintas runtime. +- `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. - Konfigurasi Matrix lengkap, aturan penargetan, dan contoh penyiapan didokumentasikan di [Matrix](/id/channels/matrix). ### Microsoft Teams @@ -692,7 +702,7 @@ Microsoft Teams didukung extension dan dikonfigurasi di bawah `channels.msteams` ``` - Jalur kunci inti yang dicakup di sini: `channels.msteams`, `channels.msteams.configWrites`. -- Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, override per tim/per channel) didokumentasikan di [Microsoft Teams](/id/channels/msteams). +- Konfigurasi Teams lengkap (kredensial, webhook, kebijakan DM/grup, override per-tim/per-channel) didokumentasikan di [Microsoft Teams](/id/channels/msteams). ### IRC @@ -718,10 +728,10 @@ IRC didukung extension dan dikonfigurasi di bawah `channels.irc`. ``` - Jalur kunci inti yang dicakup di sini: `channels.irc`, `channels.irc.dmPolicy`, `channels.irc.configWrites`, `channels.irc.nickserv.*`. -- `channels.irc.defaultAccount` opsional menggantikan pemilihan akun default saat cocok dengan ID akun yang dikonfigurasi. -- Konfigurasi channel IRC lengkap (host/port/TLS/channels/allowlists/pembatasan mention) didokumentasikan di [IRC](/id/channels/irc). +- `channels.irc.defaultAccount` opsional menggantikan pemilihan akun default saat nilainya 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 channels) +### Multi-akun (semua channel) Jalankan beberapa akun per channel (masing-masing dengan `accountId` sendiri): @@ -731,11 +741,11 @@ Jalankan beberapa akun per channel (masing-masing dengan `accountId` sendiri): telegram: { accounts: { default: { - name: "Primary bot", + name: "Bot utama", botToken: "123456:ABC...", }, alerts: { - name: "Alerts bot", + name: "Bot peringatan", botToken: "987654:XYZ...", }, }, @@ -748,24 +758,24 @@ Jalankan beberapa akun per channel (masing-masing dengan `accountId` sendiri): - Token env hanya berlaku untuk akun **default**. - Pengaturan channel dasar berlaku untuk semua akun kecuali dioverride per akun. - Gunakan `bindings[].match.accountId` untuk merutekan setiap akun ke agen yang berbeda. -- Jika Anda menambahkan akun non-default melalui `openclaw channels add` (atau onboarding channel) saat masih menggunakan konfigurasi channel tingkat atas akun tunggal, OpenClaw terlebih dahulu mempromosikan nilai akun tunggal tingkat atas yang dicakup akun ke 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 yang dicakup akun tetap opsional. -- `openclaw doctor --fix` juga memperbaiki bentuk campuran dengan memindahkan nilai akun tunggal tingkat atas yang dicakup akun ke akun hasil promosi yang dipilih untuk channel tersebut. Sebagian besar channel menggunakan `accounts.default`; Matrix dapat mempertahankan target bernama/default yang sudah cocok. +- Jika Anda menambahkan akun non-default melalui `openclaw channels add` (atau onboarding channel) saat masih menggunakan konfigurasi channel tingkat atas akun tunggal, OpenClaw terlebih dahulu mempromosikan nilai akun tunggal tingkat atas yang dibatasi akun ke dalam peta akun channel agar akun asli tetap berfungsi. Sebagian besar channel memindahkannya ke `channels..accounts.default`; Matrix dapat mempertahankan target bernama/default yang cocok yang sudah ada. +- Binding khusus channel yang sudah ada (tanpa `accountId`) tetap akan cocok dengan akun default; binding yang dibatasi akun tetap opsional. +- `openclaw doctor --fix` juga memperbaiki bentuk campuran dengan memindahkan nilai akun tunggal tingkat atas yang dibatasi akun ke akun hasil promosi yang dipilih untuk channel tersebut. Sebagian besar channel menggunakan `accounts.default`; Matrix dapat mempertahankan target bernama/default yang cocok yang sudah ada. ### Channel extension lainnya Banyak channel extension dikonfigurasi sebagai `channels.` dan didokumentasikan di halaman channel khusus masing-masing (misalnya Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, dan Twitch). Lihat indeks channel lengkap: [Channels](/id/channels). -### Pembatasan mention chat grup +### Gating mention obrolan grup -Pesan grup default-nya **memerlukan mention** (mention metadata atau pola regex aman). Berlaku untuk chat grup WhatsApp, Telegram, Discord, Google Chat, dan iMessage. +Pesan grup secara default **memerlukan mention** (metadata mention atau pola regex aman). Berlaku untuk obrolan grup WhatsApp, Telegram, Discord, Google Chat, dan iMessage. **Jenis mention:** -- **Mention metadata**: @-mention native platform. Diabaikan dalam mode chat ke diri sendiri WhatsApp. -- **Pola teks**: Pola regex aman di `agents.list[].groupChat.mentionPatterns`. Pola tidak valid dan repetisi bertingkat yang tidak aman akan diabaikan. -- Pembatasan mention hanya diberlakukan saat deteksi dimungkinkan (mention native atau setidaknya satu pola). +- **Metadata mention**: @-mention native platform. Diabaikan dalam mode self-chat WhatsApp. +- **Pola teks**: pola regex aman di `agents.list[].groupChat.mentionPatterns`. Pola yang tidak valid dan pengulangan bersarang yang tidak aman diabaikan. +- Gating mention hanya diberlakukan saat deteksi memungkinkan (mention native atau setidaknya satu pola). ```json5 { @@ -778,7 +788,7 @@ Pesan grup default-nya **memerlukan mention** (mention metadata atau pola regex } ``` -`messages.groupChat.historyLimit` menetapkan default global. Channel dapat mengoverride dengan `channels..historyLimit` (atau per akun). Tetapkan `0` untuk menonaktifkan. +`messages.groupChat.historyLimit` menetapkan default global. Channel dapat menggantinya dengan `channels..historyLimit` (atau per akun). Tetapkan `0` untuk menonaktifkan. #### Batas riwayat DM @@ -795,13 +805,13 @@ Pesan grup default-nya **memerlukan mention** (mention metadata atau pola regex } ``` -Resolusi: override per DM → default provider → tanpa batas (semua dipertahankan). +Resolusi: override per-DM → default penyedia → tanpa batas (semua dipertahankan). Didukung: `telegram`, `whatsapp`, `discord`, `slack`, `signal`, `imessage`, `msteams`. -#### Mode chat ke diri sendiri +#### Mode self-chat -Sertakan nomor Anda sendiri di `allowFrom` untuk mengaktifkan mode chat ke diri sendiri (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 { @@ -822,7 +832,7 @@ Sertakan nomor Anda sendiri di `allowFrom` untuk mengaktifkan mode chat ke diri } ``` -### Perintah (penanganan perintah chat) +### Commands (penanganan perintah chat) ```json5 { @@ -852,25 +862,25 @@ Sertakan nomor Anda sendiri di `allowFrom` untuk mengaktifkan mode chat ke diri - Blok ini mengonfigurasi permukaan perintah. Untuk katalog perintah bawaan + bundled saat ini, lihat [Slash Commands](/id/tools/slash-commands). -- Halaman ini adalah **referensi kunci konfigurasi**, bukan katalog perintah lengkap. Perintah milik channel/plugin seperti QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone`, dan Talk `/voice` didokumentasikan di halaman channel/plugin masing-masing serta [Slash Commands](/id/tools/slash-commands). +- Halaman ini adalah **referensi kunci konfigurasi**, bukan katalog perintah lengkap. Perintah milik channel/Plugin seperti QQ Bot `/bot-ping` `/bot-help` `/bot-logs`, LINE `/card`, device-pair `/pair`, memory `/dreaming`, phone-control `/phone`, dan Talk `/voice` didokumentasikan di halaman channel/Plugin masing-masing serta [Slash Commands](/id/tools/slash-commands). - Perintah teks harus berupa pesan **mandiri** dengan awalan `/`. - `native: "auto"` mengaktifkan perintah native untuk Discord/Telegram, dan membiarkan Slack nonaktif. - `nativeSkills: "auto"` mengaktifkan perintah Skills native untuk Discord/Telegram, dan membiarkan Slack nonaktif. -- Override per channel: `channels.discord.commands.native` (bool atau `"auto"`). `false` menghapus perintah yang sebelumnya sudah didaftarkan. +- Override per channel: `channels.discord.commands.native` (bool atau `"auto"`). `false` menghapus perintah yang sebelumnya telah didaftarkan. - Override pendaftaran skill native per channel dengan `channels..commands.nativeSkills`. - `channels.telegram.customCommands` menambahkan entri menu bot Telegram tambahan. - `bash: true` mengaktifkan `! ` untuk shell host. Memerlukan `tools.elevated.enabled` dan pengirim ada di `tools.elevated.allowFrom.`. -- `config: true` mengaktifkan `/config` (membaca/menulis `openclaw.json`). Untuk klien gateway `chat.send`, penulisan persisten `/config set|unset` juga memerlukan `operator.admin`; `/config show` yang hanya-baca tetap tersedia untuk klien operator biasa dengan cakupan tulis. +- `config: true` mengaktifkan `/config` (membaca/menulis `openclaw.json`). Untuk klien Gateway `chat.send`, penulisan persisten `/config set|unset` juga memerlukan `operator.admin`; `/config show` yang hanya-baca tetap tersedia untuk klien operator biasa dengan cakupan tulis. - `mcp: true` mengaktifkan `/mcp` untuk konfigurasi server MCP yang dikelola OpenClaw di bawah `mcp.servers`. -- `plugins: true` mengaktifkan `/plugins` untuk penemuan, pemasangan, dan kontrol aktif/nonaktif plugin. -- `channels..configWrites` membatasi mutasi konfigurasi per channel (default: true). -- Untuk channel multi-akun, `channels..accounts..configWrites` juga membatasi penulisan yang menargetkan akun tersebut (misalnya `/allowlist --config --account ` atau `/config set channels..accounts....`). -- `restart: false` menonaktifkan `/restart` dan aksi alat restart gateway. Default: `true`. +- `plugins: true` mengaktifkan `/plugins` untuk penemuan Plugin, instalasi, dan kontrol aktif/nonaktif. +- `channels..configWrites` menjadi gerbang mutasi konfigurasi per channel (default: true). +- Untuk channel multi-akun, `channels..accounts..configWrites` juga menjadi gerbang penulisan yang menargetkan akun tersebut (misalnya `/allowlist --config --account ` atau `/config set channels..accounts....`). +- `restart: false` menonaktifkan `/restart` dan tindakan alat restart Gateway. Default: `true`. - `ownerAllowFrom` adalah allowlist pemilik eksplisit untuk perintah/alat khusus pemilik. Ini terpisah dari `allowFrom`. -- `ownerDisplay: "hash"` melakukan hash pada ID pemilik di system prompt. Atur `ownerDisplaySecret` untuk mengontrol hashing. -- `allowFrom` bersifat per-provider. Saat diatur, ini menjadi **satu-satunya** sumber otorisasi (allowlist/pairing channel dan `useAccessGroups` diabaikan). -- `useAccessGroups: false` memungkinkan perintah melewati kebijakan access-group saat `allowFrom` tidak diatur. -- Peta dokumen perintah: +- `ownerDisplay: "hash"` meng-hash id pemilik dalam system prompt. Atur `ownerDisplaySecret` untuk mengontrol hashing. +- `allowFrom` bersifat per-penyedia. Jika 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. +- Peta dokumentasi perintah: - katalog bawaan + bundled: [Slash Commands](/id/tools/slash-commands) - permukaan perintah khusus channel: [Channels](/id/channels) - perintah QQ Bot: [QQ Bot](/id/channels/qqbot) @@ -896,7 +906,7 @@ Default: `~/.openclaw/workspace`. ### `agents.defaults.repoRoot` -Root repositori opsional yang ditampilkan di baris Runtime pada system prompt. Jika tidak diatur, OpenClaw mendeteksi secara otomatis dengan menelusuri ke atas dari workspace. +Root repositori opsional yang ditampilkan di baris Runtime pada system prompt. Jika tidak diatur, OpenClaw mendeteksinya secara otomatis dengan menelusuri ke atas dari workspace. ```json5 { @@ -922,10 +932,11 @@ Allowlist skill default opsional untuk agen yang tidak menetapkan } ``` -- Hilangkan `agents.defaults.skills` untuk Skills tak dibatasi secara default. +- Hilangkan `agents.defaults.skills` untuk skill yang tidak dibatasi secara default. - Hilangkan `agents.list[].skills` untuk mewarisi default. -- Tetapkan `agents.list[].skills: []` untuk tanpa Skills. -- Daftar `agents.list[].skills` yang tidak kosong adalah set akhir untuk agen tersebut; daftar itu tidak digabungkan dengan default. +- Tetapkan `agents.list[].skills: []` untuk tanpa skill. +- Daftar `agents.list[].skills` yang tidak kosong adalah set final untuk agen tersebut; daftar ini + tidak digabungkan dengan default. ### `agents.defaults.skipBootstrap` @@ -939,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 dalam system prompt. Default: `"always"`. -- `"continuation-skip"`: giliran kelanjutan yang aman (setelah respons asisten selesai) melewati penyuntikan ulang bootstrap workspace, sehingga mengurangi ukuran prompt. Eksekusi heartbeat dan percobaan ulang pasca-pemadatan tetap membangun ulang konteks. +- `"continuation-skip"`: giliran lanjutan yang aman (setelah respons asisten selesai) melewati penyisipan ulang bootstrap workspace, sehingga mengurangi ukuran prompt. Eksekusi Heartbeat dan percobaan ulang pasca-Compaction tetap membangun ulang konteks. ```json5 { @@ -961,7 +972,7 @@ Jumlah karakter maksimum per file bootstrap workspace sebelum dipotong. Default: ### `agents.defaults.bootstrapTotalMaxChars` -Jumlah total karakter maksimum yang disuntikkan di semua file bootstrap workspace. Default: `150000`. +Jumlah total karakter maksimum yang disisipkan di seluruh file bootstrap workspace. Default: `150000`. ```json5 { @@ -974,9 +985,9 @@ Jumlah total karakter maksimum yang disuntikkan di semua file bootstrap workspac 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 (direkomendasikan). -- `"always"`: suntikkan peringatan pada setiap eksekusi saat pemotongan ada. +- `"off"`: jangan pernah menyisipkan teks peringatan ke dalam system prompt. +- `"once"`: sisipkan peringatan sekali per tanda tangan pemotongan unik (disarankan). +- `"always"`: sisipkan peringatan pada setiap eksekusi saat pemotongan ada. ```json5 { @@ -986,10 +997,10 @@ Default: `"once"`. ### `agents.defaults.imageMaxDimensionPx` -Ukuran piksel maksimum untuk sisi gambar terpanjang pada blok gambar transcript/tool sebelum panggilan provider. +Ukuran piksel maksimum untuk sisi gambar terpanjang dalam blok gambar transkrip/alat sebelum pemanggilan penyedia. Default: `1200`. -Nilai yang lebih rendah biasanya mengurangi penggunaan vision-token dan ukuran payload permintaan untuk eksekusi yang banyak memakai screenshot. +Nilai yang lebih rendah biasanya mengurangi penggunaan vision-token dan ukuran payload permintaan untuk eksekusi yang banyak menggunakan tangkapan layar. Nilai yang lebih tinggi mempertahankan lebih banyak detail visual. ```json5 @@ -1000,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 stempel waktu pesan). Jika tidak ada, menggunakan zona waktu host. ```json5 { @@ -1010,7 +1021,7 @@ Zona waktu untuk konteks system prompt (bukan stempel waktu pesan). Fallback ke ### `agents.defaults.timeFormat` -Format waktu di system prompt. Default: `auto` (preferensi OS). +Format waktu dalam system prompt. Default: `auto` (preferensi OS). ```json5 { @@ -1048,9 +1059,9 @@ Format waktu di system prompt. Default: `auto` (preferensi OS). primary: "anthropic/claude-opus-4-6", fallbacks: ["openai/gpt-5.4-mini"], }, - params: { cacheRetention: "long" }, // parameter provider default global + params: { cacheRetention: "long" }, // parameter penyedia default global embeddedHarness: { - runtime: "auto", // auto | pi | id harness terdaftar, misalnya codex + runtime: "auto", // auto | pi | id harness terdaftar, mis. codex fallback: "pi", // pi | none }, pdfMaxBytesMb: 10, @@ -1072,43 +1083,44 @@ Format waktu di system prompt. Default: `auto` (preferensi OS). - Bentuk objek menetapkan model utama plus model failover berurutan. - `imageModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - Digunakan oleh jalur alat `image` sebagai konfigurasi model vision. - - Juga digunakan sebagai perutean fallback ketika model yang dipilih/default tidak dapat menerima input gambar. + - Juga digunakan sebagai perutean cadangan 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 apa pun yang menghasilkan gambar. + - Digunakan oleh kapabilitas pembuatan gambar bersama dan permukaan alat/Plugin mendatang yang menghasilkan gambar. - Nilai umum: `google/gemini-3.1-flash-image-preview` untuk pembuatan gambar Gemini native, `fal/fal-ai/flux/dev` untuk fal, atau `openai/gpt-image-1` untuk OpenAI Images. - - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/kunci API 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 berbasis auth. Alat ini mencoba provider default saat ini terlebih dahulu, lalu provider pembuatan gambar terdaftar lainnya menurut urutan provider-id. + - Jika Anda memilih provider/model secara langsung, konfigurasikan juga autentikasi/kunci API penyedia yang sesuai (misalnya `GEMINI_API_KEY` atau `GOOGLE_API_KEY` untuk `google/*`, `OPENAI_API_KEY` untuk `openai/*`, `FAL_KEY` untuk `fal/*`). + - Jika dihilangkan, `image_generate` tetap dapat menyimpulkan default penyedia yang didukung auth. Ia mencoba penyedia default saat ini terlebih dahulu, lalu penyedia pembuatan gambar terdaftar lainnya dalam urutan id penyedia. - `musicGenerationModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - Digunakan oleh kapabilitas pembuatan musik bersama dan alat bawaan `music_generate`. - Nilai umum: `google/lyria-3-clip-preview`, `google/lyria-3-pro-preview`, atau `minimax/music-2.5+`. - - Jika dihilangkan, `music_generate` masih dapat menyimpulkan default provider berbasis auth. Alat ini mencoba provider default saat ini terlebih dahulu, lalu provider pembuatan musik terdaftar lainnya menurut urutan provider-id. - - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/kunci API provider yang sesuai. + - Jika dihilangkan, `music_generate` tetap dapat menyimpulkan default penyedia yang didukung auth. Ia mencoba penyedia default saat ini terlebih dahulu, lalu penyedia pembuatan musik terdaftar lainnya dalam urutan id penyedia. + - Jika Anda memilih provider/model secara langsung, konfigurasikan juga autentikasi/kunci API penyedia yang sesuai. - `videoGenerationModel`: menerima string (`"provider/model"`) atau objek (`{ primary, fallbacks }`). - Digunakan oleh kapabilitas pembuatan video bersama dan alat bawaan `video_generate`. - Nilai umum: `qwen/wan2.6-t2v`, `qwen/wan2.6-i2v`, `qwen/wan2.6-r2v`, `qwen/wan2.6-r2v-flash`, atau `qwen/wan2.7-r2v`. - - Jika dihilangkan, `video_generate` masih dapat menyimpulkan default provider berbasis auth. Alat ini mencoba provider default saat ini terlebih dahulu, lalu provider pembuatan video terdaftar lainnya menurut urutan provider-id. - - Jika Anda memilih provider/model secara langsung, konfigurasikan juga auth/kunci API provider yang sesuai. - - Provider pembuatan video Qwen bawaan mendukung hingga 1 video output, 1 gambar input, 4 video input, durasi 10 detik, dan opsi tingkat provider `size`, `aspectRatio`, `resolution`, `audio`, dan `watermark`. + - Jika dihilangkan, `video_generate` tetap dapat menyimpulkan default penyedia yang didukung auth. Ia mencoba penyedia default saat ini terlebih dahulu, lalu penyedia pembuatan video terdaftar lainnya dalam urutan id penyedia. + - Jika Anda memilih provider/model secara langsung, konfigurasikan juga autentikasi/kunci API penyedia yang sesuai. + - Penyedia pembuatan video Qwen bawaan mendukung hingga 1 video output, 1 gambar input, 4 video input, durasi 10 detik, serta opsi tingkat penyedia `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 sudah di-resolve. -- `pdfMaxBytesMb`: batas ukuran PDF default untuk alat `pdf` saat `maxBytesMb` tidak diberikan saat waktu pemanggilan. + - Jika dihilangkan, alat PDF akan kembali ke `imageModel`, lalu ke model sesi/default yang telah di-resolve. +- `pdfMaxBytesMb`: batas ukuran PDF default untuk alat `pdf` saat `maxBytesMb` tidak diberikan pada waktu pemanggilan. - `pdfMaxPages`: jumlah halaman maksimum default yang dipertimbangkan oleh mode fallback ekstraksi dalam alat `pdf`. - `verboseDefault`: tingkat verbose default untuk agen. Nilai: `"off"`, `"on"`, `"full"`. Default: `"off"`. - `elevatedDefault`: tingkat output elevated default untuk agen. Nilai: `"off"`, `"on"`, `"ask"`, `"full"`. Default: `"on"`. -- `model.primary`: format `provider/model` (mis. `openai/gpt-5.4`). Jika Anda menghilangkan provider, OpenClaw mencoba alias terlebih dahulu, lalu kecocokan configured-provider unik untuk ID model yang persis sama, dan baru kemudian fallback ke provider default yang dikonfigurasi (perilaku kompatibilitas lama yang sudah deprecated, jadi lebih baik gunakan `provider/model` eksplisit). Jika provider tersebut tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw fallback ke provider/model pertama yang dikonfigurasi alih-alih menampilkan default provider usang dari provider yang sudah dihapus. -- `models`: katalog model dan allowlist yang dikonfigurasi 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. Tetapkan di `agents.defaults.params` (mis. `{ cacheRetention: "long" }`). -- Urutan prioritas penggabungan `params` (konfigurasi): `agents.defaults.params` (dasar global) dioverride oleh `agents.defaults.models["provider/model"].params` (per-model), lalu `agents.list[].params` (ID agen yang cocok) mengoverride per kunci. Lihat [Prompt Caching](/id/reference/prompt-caching) untuk detail. -- `embeddedHarness`: kebijakan runtime agen embedded tingkat rendah default. Gunakan `runtime: "auto"` agar plugin harness terdaftar dapat mengklaim model yang didukung, `runtime: "pi"` untuk memaksa harness PI bawaan, atau ID harness terdaftar seperti `runtime: "codex"`. Tetapkan `fallback: "none"` untuk menonaktifkan fallback PI otomatis. -- Penulis konfigurasi yang memutasi bidang ini (misalnya `/models set`, `/models set-image`, dan perintah tambah/hapus fallback) menyimpan bentuk objek kanonis dan mempertahankan daftar fallback yang ada bila memungkinkan. -- `maxConcurrent`: jumlah maksimum eksekusi agen paralel lintas sesi (setiap sesi tetap diserialisasi). Default: 4. +- `model.primary`: format `provider/model` (mis. `openai/gpt-5.4`). Jika Anda menghilangkan provider, OpenClaw terlebih dahulu mencoba alias, lalu kecocokan configured-provider unik untuk id model persis tersebut, dan baru kemudian kembali ke provider default yang dikonfigurasi (perilaku kompatibilitas yang sudah deprecated, jadi utamakan `provider/model` yang eksplisit). Jika provider tersebut tidak lagi mengekspos model default yang dikonfigurasi, OpenClaw akan kembali 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 penyedia, misalnya `temperature`, `maxTokens`, `cacheRetention`, `context1m`). +- `params`: parameter penyedia default global yang diterapkan ke semua model. Atur di `agents.defaults.params` (mis. `{ cacheRetention: "long" }`). +- Prioritas penggabungan `params` (konfigurasi): `agents.defaults.params` (basis global) dioverride oleh `agents.defaults.models["provider/model"].params` (per-model), lalu `agents.list[].params` (id agen yang cocok) mengoverride per kunci. Lihat [Prompt Caching](/id/reference/prompt-caching) untuk detail. +- `embeddedHarness`: kebijakan runtime agen tertanam tingkat rendah default. Gunakan `runtime: "auto"` agar harness Plugin terdaftar dapat mengklaim model yang didukung, `runtime: "pi"` untuk memaksa harness PI bawaan, atau id harness terdaftar seperti `runtime: "codex"`. Tetapkan `fallback: "none"` untuk menonaktifkan fallback PI otomatis. +- Penulis konfigurasi yang memutasi bidang-bidang ini (misalnya `/models set`, `/models set-image`, dan perintah tambah/hapus fallback) menyimpan bentuk objek kanonis dan mempertahankan daftar fallback yang sudah ada bila memungkinkan. +- `maxConcurrent`: jumlah maksimum eksekusi agen paralel di seluruh sesi (setiap sesi tetap diserialkan). Default: 4. ### `agents.defaults.embeddedHarness` -`embeddedHarness` mengontrol executor tingkat rendah mana yang menjalankan giliran agen embedded. -Sebagian besar deployment sebaiknya tetap menggunakan default `{ runtime: "auto", fallback: "pi" }`. -Gunakan ini ketika plugin tepercaya menyediakan harness native, seperti harness app-server Codex bawaan. +`embeddedHarness` mengontrol eksekutor tingkat rendah yang menjalankan giliran agen tertanam. +Sebagian besar deployment sebaiknya mempertahankan default `{ runtime: "auto", fallback: "pi" }`. +Gunakan ini saat Plugin tepercaya menyediakan harness native, seperti harness app-server +Codex bawaan. ```json5 { @@ -1124,11 +1136,11 @@ Gunakan ini ketika plugin tepercaya menyediakan harness native, seperti harness } ``` -- `runtime`: `"auto"`, `"pi"`, atau ID harness plugin terdaftar. Plugin Codex bawaan mendaftarkan `codex`. -- `fallback`: `"pi"` atau `"none"`. `"pi"` mempertahankan harness PI bawaan sebagai fallback kompatibilitas. `"none"` membuat pemilihan harness plugin yang hilang atau tidak didukung gagal alih-alih diam-diam menggunakan PI. +- `runtime`: `"auto"`, `"pi"`, atau id harness Plugin terdaftar. Plugin Codex bawaan mendaftarkan `codex`. +- `fallback`: `"pi"` atau `"none"`. `"pi"` mempertahankan harness PI bawaan sebagai fallback kompatibilitas. `"none"` membuat pemilihan harness Plugin yang hilang atau tidak didukung gagal alih-alih diam-diam menggunakan PI. - Override environment: `OPENCLAW_AGENT_RUNTIME=` mengoverride `runtime`; `OPENCLAW_AGENT_HARNESS_FALLBACK=none` menonaktifkan fallback PI untuk proses tersebut. - Untuk deployment khusus Codex, tetapkan `model: "codex/gpt-5.4"`, `embeddedHarness.runtime: "codex"`, dan `embeddedHarness.fallback: "none"`. -- Ini hanya mengontrol harness chat embedded. Pembuatan media, vision, PDF, musik, video, dan TTS tetap menggunakan pengaturan provider/model masing-masing. +- Ini hanya mengontrol harness chat tertanam. Pembuatan media, vision, PDF, musik, video, dan TTS tetap menggunakan pengaturan provider/model masing-masing. **Singkatan alias bawaan** (hanya berlaku saat model ada di `agents.defaults.models`): @@ -1143,15 +1155,15 @@ Gunakan ini ketika plugin tepercaya menyediakan harness native, seperti harness | `gemini-flash` | `google/gemini-3-flash-preview` | | `gemini-flash-lite` | `google/gemini-3.1-flash-lite-preview` | -Alias yang Anda konfigurasi selalu mengungguli default. +Alias yang Anda konfigurasi selalu diutamakan dibanding 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 secara default menggunakan thinking `adaptive` saat tidak ada tingkat thinking eksplisit yang diatur. +Model Anthropic Claude 4.6 default ke thinking `adaptive` saat tidak ada tingkat thinking eksplisit yang ditetapkan. ### `agents.defaults.cliBackends` -Backend CLI opsional untuk eksekusi fallback hanya-teks (tanpa panggilan alat). Berguna sebagai cadangan saat provider API gagal. +Backend CLI opsional untuk eksekusi fallback khusus teks (tanpa panggilan alat). Berguna sebagai cadangan saat penyedia API gagal. ```json5 { @@ -1185,7 +1197,7 @@ Backend CLI opsional untuk eksekusi fallback hanya-teks (tanpa panggilan alat). ### `agents.defaults.systemPromptOverride` -Ganti seluruh system prompt yang dirakit OpenClaw dengan string tetap. Tetapkan di tingkat 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. +Ganti seluruh system prompt yang dirakit OpenClaw dengan string tetap. Atur di tingkat 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 { @@ -1199,7 +1211,7 @@ Ganti seluruh system prompt yang dirakit OpenClaw dengan string tetap. Tetapkan ### `agents.defaults.heartbeat` -Eksekusi heartbeat berkala. +Eksekusi Heartbeat berkala. ```json5 { @@ -1226,15 +1238,15 @@ Eksekusi heartbeat berkala. } ``` -- `every`: string durasi (ms/s/m/h). Default: `30m` (auth API-key) atau `1h` (auth OAuth). Tetapkan ke `0m` untuk menonaktifkan. -- `includeSystemPromptSection`: saat false, menghilangkan bagian Heartbeat dari system prompt dan melewati penyuntikan `HEARTBEAT.md` ke konteks bootstrap. Default: `true`. -- `suppressToolErrorWarnings`: saat true, menekan payload peringatan error alat selama eksekusi heartbeat. -- `timeoutSeconds`: waktu maksimum dalam detik yang diizinkan untuk satu giliran agen heartbeat sebelum dibatalkan. Biarkan tidak diatur untuk menggunakan `agents.defaults.timeoutSeconds`. -- `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 dijalankan 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: tetapkan `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. +- `every`: string durasi (ms/s/m/h). Default: `30m` (auth API-key) atau `1h` (auth OAuth). Tetapkan `0m` untuk menonaktifkan. +- `includeSystemPromptSection`: saat false, menghilangkan bagian Heartbeat dari system prompt dan melewati penyisipan `HEARTBEAT.md` ke konteks bootstrap. Default: `true`. +- `suppressToolErrorWarnings`: saat true, menekan payload peringatan error alat selama eksekusi Heartbeat. +- `timeoutSeconds`: waktu maksimum dalam detik yang diizinkan untuk satu giliran agen Heartbeat sebelum dibatalkan. Biarkan tidak diatur untuk menggunakan `agents.defaults.timeoutSeconds`. +- `directPolicy`: kebijakan pengiriman langsung/DM. `allow` (default) mengizinkan pengiriman target langsung. `block` menekan pengiriman target langsung dan memancarkan `reason=dm-blocked`. +- `lightContext`: saat true, eksekusi Heartbeat menggunakan konteks bootstrap ringan dan hanya mempertahankan `HEARTBEAT.md` dari file bootstrap workspace. +- `isolatedSession`: saat true, setiap Heartbeat berjalan dalam sesi baru tanpa riwayat percakapan sebelumnya. Pola isolasi yang sama seperti Cron `sessionTarget: "isolated"`. Mengurangi biaya token per Heartbeat dari ~100K menjadi ~2-5K token. +- Per agen: atur `agents.list[].heartbeat`. Saat ada agen yang mendefinisikan `heartbeat`, **hanya agen tersebut** yang menjalankan Heartbeat. +- Heartbeat menjalankan giliran agen penuh — interval yang lebih pendek menghabiskan lebih banyak token. ### `agents.defaults.compaction` @@ -1244,12 +1256,12 @@ Eksekusi heartbeat berkala. defaults: { compaction: { mode: "safeguard", // default | safeguard - provider: "my-provider", // id dari plugin provider compaction terdaftar (opsional) + provider: "my-provider", // id dari Plugin penyedia compaction terdaftar (opsional) timeoutSeconds: 900, reserveTokensFloor: 24000, identifierPolicy: "strict", // strict | off | custom identifierInstructions: "Preserve deployment IDs, ticket IDs, and host:port pairs exactly.", // digunakan saat identifierPolicy=custom - postCompactionSections: ["Session Startup", "Red Lines"], // [] menonaktifkan penyuntikan ulang + postCompactionSections: ["Session Startup", "Red Lines"], // [] menonaktifkan penyisipan ulang model: "openrouter/anthropic/claude-sonnet-4-6", // override model khusus compaction opsional notifyUser: true, // kirim pemberitahuan singkat saat compaction dimulai (default: false) memoryFlush: { @@ -1264,12 +1276,12 @@ Eksekusi heartbeat berkala. } ``` -- `mode`: `default` atau `safeguard` (peringkasan bertahap untuk riwayat panjang). Lihat [Compaction](/id/concepts/compaction). -- `provider`: id dari plugin provider compaction terdaftar. Saat diatur, `summarize()` milik provider dipanggil alih-alih peringkasan LLM bawaan. Fallback ke bawaan jika gagal. Menetapkan provider memaksa `mode: "safeguard"`. Lihat [Compaction](/id/concepts/compaction). +- `mode`: `default` atau `safeguard` (ringkasan bertahap untuk riwayat panjang). Lihat [Compaction](/id/concepts/compaction). +- `provider`: id dari Plugin penyedia compaction terdaftar. Saat diatur, `summarize()` milik penyedia dipanggil alih-alih peringkasan LLM bawaan. Akan kembali ke bawaan jika gagal. Menetapkan provider memaksa `mode: "safeguard"`. Lihat [Compaction](/id/concepts/compaction). - `timeoutSeconds`: jumlah detik maksimum yang diizinkan untuk satu operasi compaction sebelum OpenClaw membatalkannya. Default: `900`. - `identifierPolicy`: `strict` (default), `off`, atau `custom`. `strict` menambahkan panduan bawaan untuk mempertahankan identifier opak selama peringkasan compaction. -- `identifierInstructions`: teks kustom opsional untuk mempertahankan identifier yang digunakan saat `identifierPolicy=custom`. -- `postCompactionSections`: nama bagian H2/H3 `AGENTS.md` opsional yang akan 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 tersebut, heading lama `Every Session`/`Safety` juga diterima sebagai fallback kompatibilitas lama. +- `identifierInstructions`: teks khusus opsional untuk mempertahankan identifier yang digunakan saat `identifierPolicy=custom`. +- `postCompactionSections`: nama bagian H2/H3 AGENTS.md opsional untuk disisipkan ulang setelah compaction. Default ke `["Session Startup", "Red Lines"]`; tetapkan `[]` untuk menonaktifkan penyisipan ulang. Saat tidak diatur atau secara eksplisit diatur ke pasangan default tersebut, heading lama `Every Session`/`Safety` juga diterima sebagai fallback legacy. - `model`: override `provider/model-id` opsional hanya untuk peringkasan 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 hanya-baca. @@ -1300,18 +1312,18 @@ Memangkas **hasil alat lama** dari konteks dalam memori sebelum dikirim ke LLM. -- `mode: "cache-ttl"` mengaktifkan pass pemangkasan. +- `mode: "cache-ttl"` mengaktifkan proses pemangkasan. - `ttl` mengontrol seberapa sering pemangkasan dapat dijalankan lagi (setelah sentuhan cache terakhir). -- Pemangkasan terlebih dahulu melakukan soft-trim pada hasil alat berukuran besar, lalu hard-clear pada hasil alat yang lebih lama bila diperlukan. +- Pemangkasan pertama-tama melakukan soft-trim pada hasil alat yang terlalu besar, lalu melakukan hard-clear pada hasil alat yang lebih lama jika diperlukan. -**Soft-trim** mempertahankan bagian awal + akhir dan menyisipkan `...` di tengah. +**Soft-trim** mempertahankan awal + akhir dan menyisipkan `...` di tengah. **Hard-clear** mengganti seluruh hasil alat dengan placeholder. Catatan: -- Blok gambar tidak pernah dipangkas/dihapus. -- Rasio berbasis karakter (perkiraan), bukan hitungan token yang tepat. +- Blok gambar tidak pernah di-trim/dihapus. +- Rasio berbasis karakter (perkiraan), bukan jumlah token yang tepat. - Jika ada kurang dari `keepLastAssistants` pesan asisten, pemangkasan dilewati. @@ -1335,10 +1347,10 @@ Lihat [Session Pruning](/id/concepts/session-pruning) untuk detail perilaku. ``` - Channel non-Telegram memerlukan `*.blockStreaming: true` eksplisit untuk mengaktifkan balasan blok. -- Override channel: `channels..blockStreamingCoalesce` (dan varian per akun). Signal/Slack/Discord/Google Chat default `minChars: 1500`. -- `humanDelay`: jeda acak antar balasan blok. `natural` = 800–2500md. Override per agen: `agents.list[].humanDelay`. +- Override channel: `channels..blockStreamingCoalesce` (dan varian per-akun). Signal/Slack/Discord/Google Chat default `minChars: 1500`. +- `humanDelay`: jeda acak antar balasan blok. `natural` = 800–2500ms. Override per-agen: `agents.list[].humanDelay`. -Lihat [Streaming](/id/concepts/streaming) untuk detail perilaku + chunking. +Lihat [Streaming](/id/concepts/streaming) untuk detail perilaku + pemotongan chunk. ### Indikator mengetik @@ -1354,7 +1366,7 @@ Lihat [Streaming](/id/concepts/streaming) untuk detail perilaku + 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). @@ -1362,7 +1374,7 @@ Lihat [Typing Indicators](/id/concepts/typing-indicators). ### `agents.defaults.sandbox` -Sandboxing opsional untuk agen embedded. Lihat [Sandboxing](/id/gateway/sandboxing) untuk panduan lengkap. +Sandboxing opsional untuk agen tertanam. Lihat [Sandboxing](/id/gateway/sandboxing) untuk panduan lengkap. ```json5 { @@ -1462,7 +1474,7 @@ Sandboxing opsional untuk agen embedded. Lihat [Sandboxing](/id/gateway/sandboxi **Backend:** - `docker`: runtime Docker lokal (default) -- `ssh`: runtime jarak jauh umum berbasis SSH +- `ssh`: runtime jarak jauh generik berbasis SSH - `openshell`: runtime OpenShell Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke @@ -1470,11 +1482,11 @@ Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke **Konfigurasi backend SSH:** -- `target`: target SSH dalam bentuk `user@host[:port]` +- `target`: target SSH dalam format `user@host[:port]` - `command`: perintah klien SSH (default: `ssh`) -- `workspaceRoot`: root remote absolut yang digunakan untuk workspace per cakupan +- `workspaceRoot`: root jarak jauh absolut yang digunakan untuk workspace per-scope - `identityFile` / `certificateFile` / `knownHostsFile`: file lokal yang sudah ada dan diteruskan ke OpenSSH -- `identityData` / `certificateData` / `knownHostsData`: konten inline atau SecretRef yang diwujudkan OpenClaw menjadi file sementara saat runtime +- `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:** @@ -1486,25 +1498,25 @@ Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke **Perilaku backend SSH:** -- menanam workspace remote satu kali setelah create atau recreate -- lalu menjaga workspace SSH remote sebagai yang kanonis +- melakukan seed 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 menyinkronkan perubahan remote kembali ke host secara otomatis -- tidak mendukung container browser sandbox +- tidak menyinkronkan perubahan jarak jauh kembali ke host secara otomatis +- tidak mendukung kontainer browser sandbox **Akses workspace:** -- `none`: workspace sandbox per cakupan di bawah `~/.openclaw/sandboxes` -- `ro`: workspace sandbox di `/workspace`, workspace agen dimount hanya-baca di `/agent` -- `rw`: workspace agen dimount baca/tulis di `/workspace` +- `none`: workspace sandbox per-scope di bawah `~/.openclaw/sandboxes` +- `ro`: workspace sandbox di `/workspace`, workspace agen di-mount hanya-baca di `/agent` +- `rw`: workspace agen di-mount baca/tulis di `/workspace` -**Cakupan:** +**Scope:** -- `session`: container + workspace per sesi -- `agent`: satu container + workspace per agen (default) -- `shared`: container dan workspace bersama (tanpa isolasi lintas sesi) +- `session`: kontainer + workspace per-sesi +- `agent`: satu kontainer + workspace per agen (default) +- `shared`: kontainer dan workspace bersama (tanpa isolasi antar sesi) -**Konfigurasi plugin OpenShell:** +**Konfigurasi Plugin OpenShell:** ```json5 { @@ -1532,30 +1544,30 @@ Saat `backend: "openshell"` dipilih, pengaturan khusus runtime dipindahkan ke **Mode OpenShell:** -- `mirror`: tanam remote dari lokal sebelum exec, sinkronkan kembali setelah exec; workspace lokal tetap kanonis -- `remote`: tanam remote satu kali saat sandbox dibuat, lalu jaga workspace remote sebagai yang kanonis +- `mirror`: seed jarak jauh dari lokal sebelum exec, sinkronkan kembali setelah exec; workspace lokal tetap kanonis +- `remote`: seed jarak jauh sekali saat sandbox dibuat, lalu mempertahankan workspace jarak jauh sebagai kanonis -Dalam mode `remote`, edit host-lokal yang dibuat di luar OpenClaw tidak otomatis disinkronkan ke sandbox setelah langkah penanaman. -Transport menggunakan SSH ke sandbox OpenShell, tetapi plugin memiliki lifecycle sandbox dan sinkronisasi mirror opsional. +Dalam mode `remote`, edit lokal host yang dibuat di luar OpenClaw tidak disinkronkan ke sandbox secara otomatis setelah langkah seed. +Transport menggunakan SSH ke sandbox OpenShell, tetapi Plugin memiliki siklus hidup sandbox dan sinkronisasi mirror opsional. -**`setupCommand`** dijalankan satu kali setelah pembuatan container (melalui `sh -lc`). Memerlukan network egress, root yang dapat ditulis, dan pengguna root. +**`setupCommand`** berjalan sekali setelah pembuatan kontainer (melalui `sh -lc`). Membutuhkan network egress, root yang dapat ditulis, dan pengguna root. -**Container default-nya `network: "none"`** — tetapkan ke `"bridge"` (atau jaringan bridge kustom) jika agen memerlukan akses keluar. +**Kontainer default ke `network: "none"`** — atur ke `"bridge"` (atau jaringan bridge kustom) jika agen memerlukan akses keluar. `"host"` diblokir. `"container:"` diblokir secara default kecuali Anda secara eksplisit menetapkan `sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true` (break-glass). -**Lampiran masuk** ditempatkan ke `media/inbound/*` di workspace aktif. +**Lampiran masuk** di-stage ke `media/inbound/*` dalam workspace aktif. -**`docker.binds`** me-mount direktori host tambahan; bind global dan per agen digabungkan. +**`docker.binds`** me-mount direktori host tambahan; bind global dan per-agen digabungkan. -**Browser sandbox** (`sandbox.browser.enabled`): Chromium + CDP di dalam container. URL noVNC disuntikkan ke system prompt. Tidak memerlukan `browser.enabled` di `openclaw.json`. -Akses pengamat noVNC menggunakan autentikasi VNC secara default dan OpenClaw mengeluarkan URL token berumur pendek (alih-alih mengekspos kata sandi di URL bersama). +**Browser sandbox** (`sandbox.browser.enabled`): Chromium + CDP dalam kontainer. URL noVNC disisipkan ke system prompt. Tidak memerlukan `browser.enabled` di `openclaw.json`. +Akses pengamat noVNC menggunakan auth VNC secara default dan OpenClaw menerbitkan URL token berumur pendek (alih-alih mengekspos kata sandi dalam URL bersama). - `allowHostControl: false` (default) memblokir sesi sandbox agar tidak menargetkan browser host. -- `network` default-nya `openclaw-sandbox-browser` (jaringan bridge khusus). Tetapkan ke `bridge` hanya jika Anda secara eksplisit menginginkan konektivitas bridge global. -- `cdpSourceRange` secara opsional membatasi ingress CDP di tepi container ke rentang CIDR (misalnya `172.21.0.1/32`). -- `sandbox.browser.binds` me-mount direktori host tambahan hanya ke container browser sandbox. Saat diatur (termasuk `[]`), ini menggantikan `docker.binds` untuk container browser. -- Default peluncuran didefinisikan di `scripts/sandbox-browser-entrypoint.sh` dan disetel untuk host container: +- `network` default-nya `openclaw-sandbox-browser` (jaringan bridge khusus). Atur ke `bridge` hanya jika Anda secara eksplisit menginginkan konektivitas bridge global. +- `cdpSourceRange` secara opsional membatasi ingress CDP di tepi kontainer ke rentang CIDR (misalnya `172.21.0.1/32`). +- `sandbox.browser.binds` me-mount direktori host tambahan hanya ke dalam kontainer browser sandbox. Saat diatur (termasuk `[]`), ini menggantikan `docker.binds` untuk kontainer browser. +- Default peluncuran didefinisikan di `scripts/sandbox-browser-entrypoint.sh` dan disetel untuk host kontainer: - `--remote-debugging-address=127.0.0.1` - `--remote-debugging-port=` - `--user-data-dir=${HOME}/.chrome` @@ -1572,12 +1584,18 @@ Akses pengamat noVNC menggunakan autentikasi VNC secara default dan OpenClaw men - `--renderer-process-limit=2` - `--no-zygote` - `--metrics-recording-only` - - `--disable-extensions` (diaktifkan secara default) - - `--disable-3d-apis`, `--disable-software-rasterizer`, dan `--disable-gpu` diaktifkan secara default dan dapat dinonaktifkan dengan `OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0` jika penggunaan WebGL/3D memerlukannya. - - `OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0` mengaktifkan kembali ekstensi jika alur kerja Anda bergantung padanya. - - `--renderer-process-limit=2` dapat diubah dengan `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; tetapkan `0` untuk menggunakan 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. + - `--disable-extensions` (aktif secara default) + - `--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 extension jika alur kerja Anda + bergantung padanya. + - `--renderer-process-limit=2` dapat diubah dengan + `OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=`; tetapkan `0` untuk menggunakan + batas proses default Chromium. + - ditambah `--no-sandbox` dan `--disable-setuid-sandbox` saat `noSandbox` diaktifkan. + - Default adalah baseline image kontainer; gunakan image browser kustom dengan entrypoint + kustom untuk mengubah default kontainer. @@ -1607,7 +1625,7 @@ scripts/sandbox-browser-setup.sh # image browser opsional reasoningDefault: "on", // override visibilitas reasoning per agen fastModeDefault: false, // override mode cepat per agen embeddedHarness: { runtime: "auto", fallback: "pi" }, - params: { cacheRetention: "none" }, // mengoverride kunci params defaults.models yang cocok per kunci + params: { cacheRetention: "none" }, // mengoverride params defaults.models yang cocok per kunci skills: ["docs-search"], // menggantikan agents.defaults.skills saat diatur identity: { name: "Samantha", @@ -1639,20 +1657,20 @@ scripts/sandbox-browser-setup.sh # image browser opsional } ``` -- `id`: ID agen stabil (wajib). -- `default`: saat beberapa ditetapkan, yang pertama menang (peringatan dicatat). Jika tidak ada yang ditetapkan, entri daftar pertama menjadi default. -- `model`: bentuk string hanya mengoverride `primary`; bentuk objek `{ primary, fallbacks }` mengoverride keduanya (`[]` menonaktifkan fallback global). Pekerjaan cron yang hanya mengoverride `primary` tetap mewarisi fallback default kecuali Anda menetapkan `fallbacks: []`. -- `params`: params stream per agen yang digabungkan di atas entri model yang dipilih di `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` bila diatur; daftar eksplisit menggantikan default alih-alih digabungkan, dan `[]` berarti tanpa skill. -- `thinkingDefault`: default tingkat thinking per agen opsional (`off | minimal | low | medium | high | xhigh | adaptive`). Mengoverride `agents.defaults.thinkingDefault` untuk agen ini saat tidak ada override per pesan atau sesi. -- `reasoningDefault`: default visibilitas reasoning per agen opsional (`on | off | stream`). Berlaku saat tidak ada override reasoning per pesan atau sesi. -- `fastModeDefault`: default mode cepat per agen opsional (`true | false`). Berlaku saat tidak ada override mode cepat per pesan atau sesi. -- `embeddedHarness`: override kebijakan harness tingkat rendah per agen opsional. Gunakan `{ runtime: "codex", fallback: "none" }` untuk menjadikan satu agen khusus Codex sementara agen lain tetap menggunakan fallback PI default. +- `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 hanya mengoverride `primary`; bentuk objek `{ primary, fallbacks }` mengoverride keduanya (`[]` menonaktifkan fallback global). Tugas Cron yang hanya mengoverride `primary` tetap mewarisi fallback default kecuali Anda menetapkan `fallbacks: []`. +- `params`: parameter stream per agen yang digabungkan di atas entri model terpilih di `agents.defaults.models`. Gunakan ini untuk override khusus agen seperti `cacheRetention`, `temperature`, atau `maxTokens` tanpa menduplikasi seluruh katalog model. +- `skills`: allowlist Skills per agen opsional. Jika dihilangkan, agen mewarisi `agents.defaults.skills` saat diatur; daftar eksplisit menggantikan default alih-alih menggabungkannya, dan `[]` berarti tanpa Skills. +- `thinkingDefault`: tingkat 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 mode cepat (`true | false`). Berlaku saat tidak ada override mode cepat per-pesan atau per-sesi. +- `embeddedHarness`: override kebijakan harness tingkat rendah per agen opsional. Gunakan `{ runtime: "codex", fallback: "none" }` agar satu agen hanya memakai Codex sementara agen lain tetap memakai fallback PI default. - `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: hanya agen yang sama). -- Guard pewarisan sandbox: jika sesi peminta disandbox, `sessions_spawn` menolak target yang akan berjalan tanpa sandbox. +- `subagents.allowAgents`: allowlist id agen untuk `sessions_spawn` (`["*"]` = agen mana pun; default: hanya agen yang sama). +- Guard pewarisan sandbox: jika sesi peminta di-sandbox, `sessions_spawn` menolak target yang akan berjalan tanpa sandbox. - `subagents.requireAgentId`: saat true, blokir panggilan `sessions_spawn` yang menghilangkan `agentId` (memaksa pemilihan profil eksplisit; default: false). --- @@ -1676,16 +1694,16 @@ Jalankan beberapa agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id } ``` -### Bidang kecocokan binding +### Bidang pencocokan binding -- `type` (opsional): `route` untuk perutean normal (type yang hilang default ke route), `acp` untuk binding percakapan ACP persisten. +- `type` (opsional): `route` untuk perutean normal (type yang tidak ada default ke route), `acp` untuk binding percakapan ACP persisten. - `match.channel` (wajib) - `match.accountId` (opsional; `*` = akun apa pun; dihilangkan = akun default) - `match.peer` (opsional; `{ kind: direct|group|channel, id }`) - `match.guildId` / `match.teamId` (opsional; khusus channel) - `acp` (opsional; hanya untuk entri `type: "acp"`): `{ mode, label, cwd, backend }` -**Urutan kecocokan deterministik:** +**Urutan pencocokan deterministik:** 1. `match.peer` 2. `match.guildId` @@ -1694,9 +1712,9 @@ Jalankan beberapa agen terisolasi di dalam satu Gateway. Lihat [Multi-Agent](/id 5. `match.accountId: "*"` (cakupan seluruh channel) 6. Agen default -Dalam setiap tier, entri `bindings` pertama yang cocok akan menang. +Dalam setiap tingkatan, entri `bindings` pertama yang cocok akan menang. -Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan yang persis (`match.channel` + akun + `match.peer.id`) dan tidak menggunakan urutan tier binding route di atas. +Untuk entri `type: "acp"`, OpenClaw me-resolve berdasarkan identitas percakapan yang persis (`match.channel` + akun + `match.peer.id`) dan tidak menggunakan urutan tingkatan binding route di atas. ### Profil akses per agen @@ -1834,7 +1852,7 @@ Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk d idleHours: 24, // default auto-unfocus karena tidak aktif dalam jam (`0` menonaktifkan) maxAgeHours: 0, // default usia maksimum keras dalam jam (`0` menonaktifkan) }, - mainKey: "main", // lama (runtime selalu menggunakan "main") + mainKey: "main", // legacy (runtime selalu menggunakan "main") agentToAgent: { maxPingPongTurns: 5 }, sendPolicy: { rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }], @@ -1846,30 +1864,30 @@ Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk d -- **`scope`**: strategi pengelompokan sesi dasar untuk konteks chat grup. - - `per-sender` (default): setiap pengirim mendapatkan sesi terisolasi di dalam konteks channel. - - `global`: semua peserta dalam konteks channel berbagi satu sesi (gunakan hanya jika konteks bersama memang diinginkan). +- **`scope`**: strategi pengelompokan sesi dasar untuk konteks obrolan grup. + - `per-sender` (default): setiap pengirim mendapatkan sesi terisolasi dalam konteks channel. + - `global`: semua peserta dalam konteks channel berbagi satu sesi (gunakan hanya ketika 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 (direkomendasikan untuk inbox multi-pengguna). - - `per-account-channel-peer`: isolasi per akun + channel + pengirim (direkomendasikan untuk multi-akun). -- **`identityLinks`**: memetakan ID kanonis ke peer berawalan provider untuk berbagi sesi lintas channel. + - `per-peer`: isolasi berdasarkan id pengirim di seluruh channel. + - `per-channel-peer`: isolasi per channel + pengirim (disarankan untuk inbox multi-pengguna). + - `per-account-channel-peer`: isolasi per akun + channel + pengirim (disarankan untuk multi-akun). +- **`identityLinks`**: 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`. Jika keduanya dikonfigurasi, yang kedaluwarsa lebih dulu akan menang. -- **`resetByType`**: override per tipe (`direct`, `group`, `thread`). `dm` lama diterima sebagai alias untuk `direct`. -- **`parentForkMaxTokens`**: `totalTokens` sesi induk maksimum yang diizinkan saat membuat sesi thread bercabang (default `100000`). +- **`resetByType`**: override per jenis (`direct`, `group`, `thread`). `dm` lama diterima sebagai alias untuk `direct`. +- **`parentForkMaxTokens`**: maksimum `totalTokens` sesi induk yang diizinkan saat membuat sesi thread hasil fork (default `100000`). - Jika `totalTokens` induk di atas nilai ini, OpenClaw memulai sesi thread baru alih-alih mewarisi riwayat transkrip induk. - - Tetapkan `0` untuk menonaktifkan guard ini dan selalu mengizinkan fork dari induk. -- **`mainKey`**: bidang lama. Runtime selalu menggunakan `"main"` untuk bucket chat langsung utama. -- **`agentToAgent.maxPingPongTurns`**: jumlah giliran balasan 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 yang cocok akan menang. + - Tetapkan `0` untuk menonaktifkan guard ini dan selalu mengizinkan forking dari induk. +- **`mainKey`**: bidang legacy. Runtime selalu menggunakan `"main"` untuk bucket obrolan langsung utama. +- **`agentToAgent.maxPingPongTurns`**: jumlah maksimum giliran balas-balik 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 legacy `dm`), `keyPrefix`, atau `rawKeyPrefix`. Penolakan pertama yang cocok akan menang. - **`maintenance`**: kontrol pembersihan + retensi penyimpanan sesi. - `mode`: `warn` hanya mengeluarkan peringatan; `enforce` menerapkan pembersihan. - `pruneAfter`: batas usia untuk entri usang (default `30d`). - `maxEntries`: jumlah maksimum entri dalam `sessions.json` (default `500`). - - `rotateBytes`: rotasi `sessions.json` saat melebihi ukuran ini (default `10mb`). - - `resetArchiveRetention`: retensi untuk arsip transkrip `*.reset.`. Default-nya mengikuti `pruneAfter`; tetapkan `false` untuk menonaktifkan. - - `maxDiskBytes`: anggaran disk direktori sesi opsional. Dalam mode `warn`, ini mencatat peringatan; dalam mode `enforce`, ini menghapus artefak/sesi terlama terlebih dahulu. + - `rotateBytes`: rotasikan `sessions.json` ketika melebihi ukuran ini (default `10mb`). + - `resetArchiveRetention`: retensi untuk arsip transkrip `*.reset.`. Default mengikuti `pruneAfter`; tetapkan `false` untuk menonaktifkan. + - `maxDiskBytes`: anggaran disk direktori sesi opsional. Dalam mode `warn`, ini mencatat peringatan; dalam mode `enforce`, ini menghapus artefak/sesi tertua terlebih dahulu. - `highWaterBytes`: target opsional setelah pembersihan anggaran. Default ke `80%` dari `maxDiskBytes`. - **`threadBindings`**: default global untuk fitur sesi terikat thread. - `enabled`: sakelar default utama (provider dapat mengoverride; Discord menggunakan `channels.discord.threadBindings.enabled`) @@ -1910,21 +1928,21 @@ Lihat [Multi-Agent Sandbox & Tools](/id/tools/multi-agent-sandbox-tools) untuk d } ``` -### Awalan respons +### Prefiks respons 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}]`. +Resolusi (yang paling spesifik menang): akun → channel → global. `""` menonaktifkan dan menghentikan kaskade. `"auto"` menurunkan `[{identity.name}]`. -**Variabel template:** +**Variabel templat:** -| Variable | Deskripsi | Contoh | -| ----------------- | --------------------- | --------------------------- | -| `{model}` | Nama model pendek | `claude-opus-4-6` | -| `{modelFull}` | Identifier model penuh | `anthropic/claude-opus-4-6` | -| `{provider}` | Nama provider | `anthropic` | -| `{thinkingLevel}` | Tingkat thinking saat ini | `high`, `low`, `off` | -| `{identity.name}` | Nama identitas agen | (sama seperti `"auto"`) | +| Variabel | Deskripsi | Contoh | +| ----------------- | ---------------------- | --------------------------- | +| `{model}` | Nama model singkat | `claude-opus-4-6` | +| `{modelFull}` | Pengidentifikasi model lengkap | `anthropic/claude-opus-4-6` | +| `{provider}` | Nama provider | `anthropic` | +| `{thinkingLevel}` | Tingkat thinking saat ini | `high`, `low`, `off` | +| `{identity.name}` | Nama identitas agen | (sama seperti `"auto"`) | Variabel tidak peka huruf besar/kecil. `{think}` adalah alias untuk `{thinkingLevel}`. @@ -1936,12 +1954,12 @@ Variabel tidak peka huruf besar/kecil. `{think}` adalah alias untuk `{thinkingLe - Cakupan: `group-mentions` (default), `group-all`, `direct`, `all`. - `removeAckAfterReply`: menghapus ack setelah balasan di Slack, Discord, dan Telegram. - `messages.statusReactions.enabled`: mengaktifkan reaksi status siklus hidup di Slack, Discord, dan Telegram. - Di Slack dan Discord, jika tidak diatur, reaksi status tetap aktif saat reaksi ack aktif. + Di Slack dan Discord, jika tidak diatur maka reaksi status tetap aktif saat reaksi ack aktif. Di Telegram, tetapkan secara eksplisit ke `true` untuk mengaktifkan reaksi status siklus hidup. ### Debounce masuk -Mengelompokkan pesan cepat yang hanya berisi teks dari pengirim yang sama menjadi satu giliran agen. Media/lampiran langsung di-flush. Perintah kontrol melewati debouncing. +Mengelompokkan pesan cepat khusus teks dari pengirim yang sama menjadi satu giliran agen. Media/lampiran langsung melakukan flush. Perintah kontrol melewati debounce. ### TTS (text-to-speech) @@ -1987,9 +2005,9 @@ 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 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-nya `false` (opt-in). -- Kunci API 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 yang kompatibel dengan OpenAI dan melonggarkan validasi model/voice. +- Kunci API menggunakan `ELEVENLABS_API_KEY`/`XI_API_KEY` dan `OPENAI_API_KEY` sebagai cadangan. +- `openai.baseUrl` mengoverride endpoint TTS OpenAI. 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/suara. --- @@ -2019,36 +2037,36 @@ Default untuk mode Talk (macOS/iOS/Android). } ``` -- `talk.provider` harus cocok dengan sebuah kunci di `talk.providers` saat beberapa provider Talk dikonfigurasi. -- Kunci Talk datar lama (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) hanya untuk kompatibilitas dan dimigrasikan otomatis ke `talk.providers.`. -- ID voice fallback ke `ELEVENLABS_VOICE_ID` atau `SAG_VOICE_ID`. +- `talk.provider` harus cocok dengan kunci di `talk.providers` saat beberapa provider Talk dikonfigurasi. +- Kunci Talk datar legacy (`talk.voiceId`, `talk.voiceAliases`, `talk.modelId`, `talk.outputFormat`, `talk.apiKey`) hanya untuk kompatibilitas dan dimigrasikan otomatis ke `talk.providers.`. +- ID suara menggunakan `ELEVENLABS_VOICE_ID` atau `SAG_VOICE_ID` sebagai cadangan. - `providers.*.apiKey` menerima string plaintext atau objek SecretRef. -- Fallback `ELEVENLABS_API_KEY` hanya berlaku saat tidak ada kunci API Talk yang dikonfigurasi. -- `providers.*.voiceAliases` memungkinkan directive Talk menggunakan nama yang ramah. +- Cadangan `ELEVENLABS_API_KEY` hanya berlaku saat tidak ada kunci API Talk yang dikonfigurasi. +- `providers.*.voiceAliases` memungkinkan direktif Talk menggunakan nama yang ramah. - `silenceTimeoutMs` mengontrol berapa lama mode Talk menunggu setelah pengguna diam sebelum mengirim transkrip. Jika tidak diatur, jendela jeda default platform tetap digunakan (`700 ms di macOS dan Android, 900 ms di iOS`). --- -## Tools +## Alat ### Profil alat `tools.profile` menetapkan allowlist dasar sebelum `tools.allow`/`tools.deny`: -Onboarding lokal secara default menetapkan konfigurasi lokal baru ke `tools.profile: "coding"` saat tidak diatur (profil eksplisit yang sudah ada dipertahankan). +Onboarding lokal secara default mengatur konfigurasi lokal baru ke `tools.profile: "coding"` saat tidak diatur (profil eksplisit yang sudah ada dipertahankan). -| Profil | Mencakup | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------ | -| `minimal` | hanya `session_status` | +| Profil | Mencakup | +| ----------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `minimal` | hanya `session_status` | | `coding` | `group:fs`, `group:runtime`, `group:web`, `group:sessions`, `group:memory`, `cron`, `image`, `image_generate`, `video_generate` | -| `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` | -| `full` | Tanpa pembatasan (sama seperti tidak diatur) | +| `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` | +| `full` | Tanpa pembatasan (sama seperti tidak diatur) | ### Grup alat -| Grup | Tools | -| ------------------ | ---------------------------------------------------------------------------------------------------------------------- | -| `group:runtime` | `exec`, `process`, `code_execution` (`bash` diterima sebagai alias untuk `exec`) | +| Grup | Alat | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| `group:runtime` | `exec`, `process`, `code_execution` (`bash` diterima sebagai alias untuk `exec`) | | `group:fs` | `read`, `write`, `edit`, `apply_patch` | | `group:sessions` | `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`, `sessions_yield`, `subagents`, `session_status` | | `group:memory` | `memory_search`, `memory_get` | @@ -2059,7 +2077,7 @@ Onboarding lokal secara default menetapkan konfigurasi lokal baru ke `tools.prof | `group:nodes` | `nodes` | | `group:agents` | `agents_list` | | `group:media` | `image`, `image_generate`, `video_generate`, `tts` | -| `group:openclaw` | Semua alat bawaan (tidak termasuk plugin provider) | +| `group:openclaw` | Semua alat bawaan (tidak termasuk Plugin penyedia) | ### `tools.allow` / `tools.deny` @@ -2073,7 +2091,7 @@ Kebijakan izinkan/tolak alat global (penolakan menang). Tidak peka huruf besar/k ### `tools.byProvider` -Membatasi alat lebih lanjut untuk provider atau model tertentu. Urutan: profil dasar → profil provider → allow/deny. +Batasi lebih lanjut alat untuk provider atau model tertentu. Urutan: profil dasar → profil provider → allow/deny. ```json5 { @@ -2106,7 +2124,7 @@ Mengontrol akses exec elevated di luar sandbox: ``` - 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. +- `/elevated on|off|ask|full` menyimpan status per sesi; direktif inline berlaku untuk satu pesan. - `exec` elevated melewati sandboxing dan menggunakan jalur escape yang dikonfigurasi (`gateway` secara default, atau `node` saat target exec adalah `node`). ### `tools.exec` @@ -2153,13 +2171,13 @@ Pengaturan dapat didefinisikan secara global di `tools.loopDetection` dan diover } ``` -- `historySize`: riwayat panggilan alat maksimum yang disimpan untuk analisis loop. -- `warningThreshold`: ambang pola berulang tanpa kemajuan untuk peringatan. +- `historySize`: riwayat maksimum panggilan alat yang dipertahankan untuk analisis loop. +- `warningThreshold`: ambang pola tanpa kemajuan berulang untuk peringatan. - `criticalThreshold`: ambang pengulangan yang lebih tinggi untuk memblokir loop kritis. -- `globalCircuitBreakerThreshold`: ambang henti keras untuk eksekusi tanpa kemajuan apa pun. -- `detectors.genericRepeat`: beri peringatan pada panggilan alat yang sama dengan argumen yang sama secara berulang. -- `detectors.knownPollNoProgress`: beri peringatan/blokir alat poll yang diketahui (`process.poll`, `command_status`, dll.). -- `detectors.pingPong`: beri peringatan/blokir pola pasangan bergantian tanpa kemajuan. +- `globalCircuitBreakerThreshold`: ambang penghentian keras untuk setiap eksekusi tanpa kemajuan. +- `detectors.genericRepeat`: peringatkan pada panggilan alat yang sama/argumen yang sama berulang. +- `detectors.knownPollNoProgress`: peringatkan/blokir pada alat polling yang dikenal (`process.poll`, `command_status`, dll.). +- `detectors.pingPong`: peringatkan/blokir pada pola pasangan bolak-balik tanpa kemajuan. - Jika `warningThreshold >= criticalThreshold` atau `criticalThreshold >= globalCircuitBreakerThreshold`, validasi gagal. ### `tools.web` @@ -2202,7 +2220,7 @@ Mengonfigurasi pemahaman media masuk (gambar/audio/video): media: { concurrency: 2, asyncCompletion: { - directSend: false, // opt-in: kirim music/video async yang selesai langsung ke channel + directSend: false, // opt-in: kirim musik/video async yang selesai langsung ke channel }, audio: { enabled: true, @@ -2230,20 +2248,20 @@ Mengonfigurasi pemahaman media masuk (gambar/audio/video): **Entri provider** (`type: "provider"` atau dihilangkan): -- `provider`: ID provider API (`openai`, `anthropic`, `google`/`gemini`, `groq`, dll.) -- `model`: override ID model +- `provider`: id provider API (`openai`, `anthropic`, `google`/`gemini`, `groq`, dll.) +- `model`: override id model - `profile` / `preferredProfile`: pemilihan profil `auth-profiles.json` **Entri CLI** (`type: "cli"`): -- `command`: executable yang akan dijalankan +- `command`: executable yang dijalankan - `args`: argumen bertemplat (mendukung `{{MediaPath}}`, `{{Prompt}}`, `{{MaxChars}}`, dll.) **Bidang 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. +- Kegagalan akan kembali ke entri berikutnya. Auth provider mengikuti urutan standar: `auth-profiles.json` → env vars → `models.providers.*.apiKey`. @@ -2251,7 +2269,7 @@ Auth provider mengikuti urutan standar: `auth-profiles.json` → env vars → `m - `asyncCompletion.directSend`: saat `true`, tugas async `music_generate` dan `video_generate` yang selesai mencoba pengiriman channel langsung terlebih dahulu. Default: `false` - (jalur lama requester-session wake/model-delivery). + (jalur wake/model-delivery sesi peminta legacy). @@ -2272,7 +2290,7 @@ Auth provider mengikuti urutan standar: `auth-profiles.json` → env vars → `m Mengontrol sesi mana yang dapat ditargetkan oleh alat sesi (`sessions_list`, `sessions_history`, `sessions_send`). -Default: `tree` (sesi saat ini + sesi yang dibuat olehnya, seperti subagen). +Default: `tree` (sesi saat ini + sesi yang dihasilkan olehnya, seperti subagen). ```json5 { @@ -2288,10 +2306,10 @@ Default: `tree` (sesi saat ini + sesi yang dibuat olehnya, seperti subagen). Catatan: - `self`: hanya kunci sesi saat ini. -- `tree`: sesi saat ini + sesi yang dibuat oleh sesi saat ini (subagen). -- `agent`: sesi apa pun yang dimiliki 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 dihasilkan oleh sesi saat ini (subagen). +- `agent`: sesi apa pun yang dimiliki 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`. -- Pembatasan sandbox: saat sesi saat ini disandbox dan `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibility dipaksa menjadi `tree` meskipun `tools.sessions.visibility="all"`. +- Clamp sandbox: saat sesi saat ini di-sandbox dan `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibility dipaksa menjadi `tree` meskipun `tools.sessions.visibility="all"`. ### `tools.sessions_spawn` @@ -2302,8 +2320,8 @@ Mengontrol dukungan lampiran inline untuk `sessions_spawn`. tools: { sessions_spawn: { attachments: { - enabled: false, // opt-in: set true untuk mengizinkan lampiran file inline - maxTotalBytes: 5242880, // total 5 MB untuk semua file + enabled: false, // opt-in: tetapkan true untuk mengizinkan lampiran file inline + maxTotalBytes: 5242880, // total 5 MB di semua file maxFiles: 50, maxFileBytes: 1048576, // 1 MB per file retainOnSessionKeep: false, // pertahankan lampiran saat cleanup="keep" @@ -2316,15 +2334,15 @@ 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 disensor dari persistensi transkrip. -- Input Base64 divalidasi dengan pemeriksaan alfabet/padding ketat dan guard ukuran sebelum decode. +- File dimaterialisasi ke dalam workspace anak di `.openclaw/attachments//` dengan `.manifest.json`. +- Konten lampiran secara 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`. ### `tools.experimental` -Flag alat bawaan eksperimental. Default nonaktif kecuali aturan auto-enable GPT-5 strict-agentic berlaku. +Flag alat bawaan eksperimental. Default nonaktif kecuali aturan auto-enable GPT-5 agentic ketat berlaku. ```json5 { @@ -2339,8 +2357,8 @@ Flag alat bawaan eksperimental. Default nonaktif kecuali aturan auto-enable GPT- Catatan: - `planTool`: mengaktifkan alat `update_plan` terstruktur untuk pelacakan pekerjaan multi-langkah yang tidak sepele. -- Default: `false` kecuali `agents.defaults.embeddedPi.executionContract` (atau override per agen) diatur ke `"strict-agentic"` untuk eksekusi keluarga GPT-5 OpenAI atau OpenAI Codex. Tetapkan `true` untuk memaksa alat aktif di luar cakupan itu, atau `false` untuk tetap menonaktifkannya bahkan untuk eksekusi GPT-5 strict-agentic. -- Saat diaktifkan, system prompt juga menambahkan panduan penggunaan agar model hanya menggunakannya untuk pekerjaan yang substansial dan menjaga paling banyak satu langkah `in_progress`. +- Default: `false` kecuali `agents.defaults.embeddedPi.executionContract` (atau override per agen) ditetapkan ke `"strict-agentic"` untuk eksekusi keluarga GPT-5 OpenAI atau OpenAI Codex. Tetapkan `true` untuk memaksa alat aktif di luar cakupan itu, atau `false` untuk tetap menonaktifkannya bahkan untuk eksekusi GPT-5 strict-agentic. +- Saat aktif, system prompt juga menambahkan panduan penggunaan agar model hanya menggunakannya untuk pekerjaan substansial dan mempertahankan paling banyak satu langkah `in_progress`. ### `agents.defaults.subagents` @@ -2360,16 +2378,16 @@ Catatan: } ``` -- `model`: model default untuk subagen yang dibuat. Jika dihilangkan, subagen mewarisi model pemanggil. -- `allowAgents`: allowlist default ID agen target untuk `sessions_spawn` saat agen peminta tidak menetapkan `subagents.allowAgents` sendiri (`["*"]` = apa pun; default: hanya agen yang sama). -- `runTimeoutSeconds`: timeout default (detik) untuk `sessions_spawn` saat panggilan alat menghilangkan `runTimeoutSeconds`. `0` berarti tanpa timeout. +- `model`: model default untuk subagen yang dihasilkan. Jika dihilangkan, subagen mewarisi model pemanggil. +- `allowAgents`: allowlist default id agen target untuk `sessions_spawn` saat agen peminta tidak menetapkan `subagents.allowAgents` sendiri (`["*"]` = agen mana pun; default: hanya agen yang sama). +- `runTimeoutSeconds`: timeout default (detik) untuk `sessions_spawn` saat pemanggilan alat menghilangkan `runTimeoutSeconds`. `0` berarti tanpa timeout. - Kebijakan alat per subagen: `tools.subagents.tools.allow` / `tools.subagents.tools.deny`. --- ## Provider kustom dan base URL -OpenClaw menggunakan katalog model bawaan. Tambahkan provider kustom melalui `models.providers` di konfigurasi atau `~/.openclaw/agents//agent/models.json`. +OpenClaw menggunakan katalog model bawaan. Tambahkan provider kustom melalui `models.providers` dalam konfigurasi atau `~/.openclaw/agents//agent/models.json`. ```json5 { @@ -2399,47 +2417,47 @@ OpenClaw menggunakan katalog model bawaan. Tambahkan provider kustom melalui `mo ``` - Gunakan `authHeader: true` + `headers` untuk kebutuhan auth kustom. -- Override root konfigurasi agen dengan `OPENCLAW_AGENT_DIR` (atau `PI_CODING_AGENT_DIR`, alias variabel environment lama). -- Urutan 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 provider tersebut tidak dikelola SecretRef dalam konteks config/auth-profile saat ini. - - Nilai `apiKey` provider yang dikelola SecretRef disegarkan dari penanda sumber (`ENV_VAR_NAME` untuk ref env, `secretref-managed` untuk ref file/exec) alih-alih menyimpan secret yang sudah di-resolve. - - Nilai header provider yang dikelola SecretRef disegarkan dari penanda sumber (`secretref-env:ENV_VAR_NAME` untuk ref env, `secretref-managed` untuk ref file/exec). - - `apiKey`/`baseUrl` agen yang kosong atau tidak ada akan fallback ke `models.providers` di konfigurasi. +- Override root konfigurasi agen dengan `OPENCLAW_AGENT_DIR` (atau `PI_CODING_AGENT_DIR`, alias variabel environment legacy). +- Prioritas penggabungan untuk id provider yang cocok: + - Nilai `baseUrl` `models.json` agen yang tidak kosong akan menang. + - Nilai `apiKey` agen yang tidak kosong hanya menang saat provider tersebut tidak dikelola SecretRef dalam konteks auth-profile/konfigurasi saat ini. + - Nilai `apiKey` provider yang dikelola SecretRef disegarkan dari penanda sumber (`ENV_VAR_NAME` untuk referensi env, `secretref-managed` untuk referensi 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 referensi env, `secretref-managed` untuk referensi file/exec). + - `apiKey`/`baseUrl` agen yang kosong atau tidak ada akan kembali ke `models.providers` dalam konfigurasi. - `contextWindow`/`maxTokens` model yang cocok menggunakan nilai yang lebih tinggi antara konfigurasi eksplisit dan nilai katalog implisit. - `contextTokens` model yang cocok mempertahankan batas runtime eksplisit saat ada; gunakan ini untuk membatasi konteks efektif tanpa mengubah metadata model native. - - Gunakan `models.mode: "replace"` saat Anda ingin konfigurasi menulis ulang `models.json` sepenuhnya. - - Persistensi penanda bersifat source-authoritative: penanda ditulis dari snapshot konfigurasi sumber aktif (pra-resolusi), bukan dari nilai secret runtime yang sudah di-resolve. + - Gunakan `models.mode: "replace"` saat Anda ingin konfigurasi sepenuhnya menulis ulang `models.json`. + - Persistensi marker bersifat source-authoritative: marker ditulis dari snapshot konfigurasi sumber aktif (pra-resolusi), bukan dari nilai rahasia runtime yang sudah di-resolve. ### Detail bidang provider - `models.mode`: perilaku katalog provider (`merge` atau `replace`). -- `models.providers`: peta provider kustom yang dikunci dengan ID provider. +- `models.providers`: peta provider kustom yang dikunci berdasarkan id provider. - `models.providers.*.api`: adaptor permintaan (`openai-completions`, `openai-responses`, `anthropic-messages`, `google-generative-ai`, dll). -- `models.providers.*.apiKey`: kredensial provider (lebih disarankan SecretRef/substitusi env). +- `models.providers.*.apiKey`: kredensial provider (utamakan substitusi SecretRef/env). - `models.providers.*.auth`: strategi auth (`api-key`, `token`, `oauth`, `aws-sdk`). -- `models.providers.*.injectNumCtxForOpenAICompat`: untuk Ollama + `openai-completions`, suntikkan `options.num_ctx` ke permintaan (default: `true`). -- `models.providers.*.authHeader`: paksa transport kredensial di header `Authorization` bila diperlukan. -- `models.providers.*.baseUrl`: base URL API upstream. +- `models.providers.*.injectNumCtxForOpenAICompat`: untuk Ollama + `openai-completions`, sisipkan `options.num_ctx` ke permintaan (default: `true`). +- `models.providers.*.authHeader`: paksa transport kredensial di header `Authorization` saat diperlukan. +- `models.providers.*.baseUrl`: URL dasar API upstream. - `models.providers.*.headers`: header statis tambahan untuk perutean proxy/tenant. - `models.providers.*.request`: override transport untuk permintaan HTTP model-provider. - `request.headers`: header tambahan (digabungkan dengan default provider). Nilai menerima SecretRef. - `request.auth`: override strategi auth. Mode: `"provider-default"` (gunakan auth bawaan provider), `"authorization-bearer"` (dengan `token`), `"header"` (dengan `headerName`, `value`, `prefix` opsional). - - `request.proxy`: override proxy HTTP. Mode: `"env-proxy"` (gunakan env vars `HTTP_PROXY`/`HTTPS_PROXY`), `"explicit-proxy"` (dengan `url`). Kedua mode menerima sub-objek `tls` opsional. + - `request.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` (semuanya menerima SecretRef), `serverName`, `insecureSkipVerify`. - - `request.allowPrivateNetwork`: saat `true`, izinkan HTTPS ke `baseUrl` saat DNS me-resolve ke rentang private, CGNAT, atau serupa, melalui guard fetch HTTP provider (opt-in operator untuk endpoint OpenAI-compatible self-hosted tepercaya). WebSocket menggunakan `request` yang sama untuk header/TLS tetapi bukan guard SSRF fetch tersebut. Default `false`. + - `request.allowPrivateNetwork`: saat `true`, izinkan HTTPS ke `baseUrl` saat DNS me-resolve ke rentang privat, CGNAT, atau serupa, melalui guard fetch HTTP provider (opt-in operator untuk endpoint OpenAI-compatible self-hosted tepercaya). WebSocket menggunakan `request` yang sama untuk header/TLS tetapi tidak untuk gerbang SSRF fetch tersebut. Default `false`. - `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 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/tidak diatur mempertahankan perilaku OpenAI default. -- `models.providers.*.models.*.compat.requiresStringContent`: petunjuk kompatibilitas opsional untuk endpoint chat OpenAI-compatible yang hanya menerima string. Saat `true`, OpenClaw meratakan array `messages[].content` yang hanya berisi teks menjadi string biasa sebelum mengirim permintaan. +- `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/tidak ada mempertahankan perilaku default OpenAI. +- `models.providers.*.models.*.compat.requiresStringContent`: petunjuk kompatibilitas opsional untuk endpoint chat OpenAI-compatible yang hanya menerima string. Saat `true`, OpenClaw meratakan array `messages[].content` teks murni menjadi string biasa sebelum mengirim permintaan. - `plugins.entries.amazon-bedrock.config.discovery`: root pengaturan auto-discovery Bedrock. -- `plugins.entries.amazon-bedrock.config.discovery.enabled`: nyalakan/matikan implicit discovery. +- `plugins.entries.amazon-bedrock.config.discovery.enabled`: nyalakan/matikan 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.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. +- `plugins.entries.amazon-bedrock.config.discovery.providerFilter`: filter id provider opsional untuk discovery yang terarah. +- `plugins.entries.amazon-bedrock.config.discovery.refreshInterval`: interval polling untuk penyegaran discovery. +- `plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow`: jendela konteks cadangan untuk model yang ditemukan. +- `plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens`: token output maksimum cadangan untuk model yang ditemukan. ### Contoh provider @@ -2556,7 +2574,9 @@ Tetapkan `ZAI_API_KEY`. `z.ai/*` dan `z-ai/*` adalah alias yang diterima. Pintas 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 mengunci hal itu berdasarkan kapabilitas endpoint, bukan hanya ID provider bawaan. +Endpoint Moonshot native mengiklankan kompatibilitas penggunaan streaming pada +transport bersama `openai-completions`, dan OpenClaw menguncinya pada kapabilitas endpoint +bukan hanya id provider bawaan. @@ -2656,14 +2676,17 @@ Base URL harus menghilangkan `/v1` (klien Anthropic menambahkannya). Pintasan: ` Tetapkan `MINIMAX_API_KEY`. Pintasan: `openclaw onboard --auth-choice minimax-global-api` atau `openclaw onboard --auth-choice minimax-cn-api`. -Katalog model default-nya hanya M2.7. -Pada jalur streaming yang kompatibel dengan Anthropic, OpenClaw menonaktifkan thinking MiniMax secara default kecuali Anda secara eksplisit menetapkan `thinking` sendiri. `/fast on` atau `params.fastMode: true` menulis ulang `MiniMax-M2.7` menjadi `MiniMax-M2.7-highspeed`. +Katalog model default hanya ke M2.7. +Pada jalur streaming yang kompatibel dengan Anthropic, OpenClaw menonaktifkan thinking MiniMax +secara default kecuali Anda secara eksplisit menetapkan `thinking` sendiri. `/fast on` atau +`params.fastMode: true` menulis ulang `MiniMax-M2.7` menjadi +`MiniMax-M2.7-highspeed`. -Lihat [Local Models](/id/gateway/local-models). Ringkasnya: jalankan model lokal besar melalui LM Studio Responses API pada perangkat keras yang serius; tetap gabungkan model hosted untuk fallback. +Lihat [Local Models](/id/gateway/local-models). Singkatnya: jalankan model lokal besar melalui API LM Studio Responses pada perangkat keras serius; tetap gabungkan model yang di-host sebagai cadangan. @@ -2694,12 +2717,14 @@ Lihat [Local Models](/id/gateway/local-models). Ringkasnya: jalankan model lokal } ``` -- `allowBundled`: allowlist opsional hanya untuk skill bundled (skill managed/workspace tidak terpengaruh). +- `allowBundled`: allowlist opsional hanya untuk skills bawaan (skills managed/workspace tidak terpengaruh). - `load.extraDirs`: root skill bersama tambahan (prioritas terendah). -- `install.preferBrew`: saat true, lebih memilih installer Homebrew ketika `brew` tersedia sebelum fallback ke jenis installer lain. -- `install.nodeManager`: preferensi installer node untuk spesifikasi `metadata.openclaw.install` (`npm` | `pnpm` | `yarn` | `bun`). -- `entries..enabled: false` menonaktifkan skill meskipun skill tersebut bundled/terinstal. -- `entries..apiKey`: kemudahan untuk skill yang mendeklarasikan variabel env utama (string plaintext atau objek SecretRef). +- `install.preferBrew`: saat true, utamakan installer Homebrew saat `brew` + tersedia sebelum kembali ke jenis installer lain. +- `install.nodeManager`: preferensi installer node untuk spesifikasi `metadata.openclaw.install` + (`npm` | `pnpm` | `yarn` | `bun`). +- `entries..enabled: false` menonaktifkan skill bahkan jika dibundel/diinstal. +- `entries..apiKey`: kemudahan untuk skill yang mendeklarasikan env var utama (string plaintext atau objek SecretRef). --- @@ -2728,40 +2753,40 @@ Lihat [Local Models](/id/gateway/local-models). Ringkasnya: jalankan model lokal ``` - Dimuat dari `~/.openclaw/extensions`, `/.openclaw/extensions`, ditambah `plugins.load.paths`. -- Discovery menerima plugin OpenClaw native plus bundle Codex yang kompatibel dan bundle Claude, termasuk bundle Claude tata letak default tanpa manifest. -- **Perubahan konfigurasi memerlukan restart gateway.** -- `allow`: allowlist opsional (hanya plugin yang terdaftar yang dimuat). `deny` menang. -- `plugins.entries..apiKey`: bidang kemudahan kunci API tingkat plugin (bila didukung oleh plugin). -- `plugins.entries..env`: peta variabel env yang dicakup plugin. -- `plugins.entries..hooks.allowPromptInjection`: saat `false`, core memblokir `before_prompt_build` dan mengabaikan bidang yang memutasi prompt dari `before_agent_start` lama, sambil tetap 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 bagi eksekusi subagen di 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 saat tersedia). +- Discovery menerima Plugin OpenClaw native plus bundel Codex yang kompatibel dan bundel Claude, termasuk bundel tata letak default Claude tanpa manifest. +- **Perubahan konfigurasi memerlukan restart Gateway.** +- `allow`: allowlist opsional (hanya Plugin yang tercantum yang dimuat). `deny` menang. +- `plugins.entries..apiKey`: bidang kemudahan kunci API tingkat Plugin (saat didukung oleh Plugin). +- `plugins.entries..env`: peta env var dengan cakupan Plugin. +- `plugins.entries..hooks.allowPromptInjection`: saat `false`, inti memblokir `before_prompt_build` dan mengabaikan bidang legacy yang memutasi prompt dari `before_agent_start`, sambil mempertahankan `modelOverride` dan `providerOverride` legacy. 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 eksekusi untuk eksekusi subagen latar belakang. +- `plugins.entries..subagent.allowedModels`: allowlist opsional target kanonis `provider/model` untuk override subagen tepercaya. Gunakan `"*"` hanya saat 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`: kunci API Firecrawl (menerima SecretRef). Fallback ke `plugins.entries.firecrawl.config.webSearch.apiKey`, `tools.web.fetch.firecrawl.apiKey` lama, atau env var `FIRECRAWL_API_KEY`. - - `baseUrl`: base URL API Firecrawl (default: `https://api.firecrawl.dev`). + - `apiKey`: kunci API Firecrawl (menerima SecretRef). Menggunakan `plugins.entries.firecrawl.config.webSearch.apiKey`, `tools.web.fetch.firecrawl.apiKey` legacy, atau env var `FIRECRAWL_API_KEY` sebagai cadangan. + - `baseUrl`: URL dasar 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 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. +- `plugins.entries.memory-core.config.dreaming`: pengaturan memory dreaming. 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 * * *"`). - - kebijakan fase dan ambang adalah detail implementasi (bukan kunci konfigurasi yang ditujukan ke pengguna). -- Konfigurasi memori lengkap ada di [Referensi konfigurasi memori](/id/reference/memory-config): + - `frequency`: cadence Cron untuk setiap sweep dreaming penuh (default `"0 3 * * *"`). + - kebijakan fase dan ambang adalah detail implementasi (bukan kunci konfigurasi yang ditujukan untuk pengguna). +- Konfigurasi memori lengkap tersedia di [Referensi konfigurasi memori](/id/reference/memory-config): - `agents.defaults.memorySearch.*` - `memory.backend` - `memory.citations` - `memory.qmd.*` - `plugins.entries.memory-core.config.dreaming` -- Plugin bundle Claude yang diaktifkan juga dapat menyumbangkan default Pi embedded dari `settings.json`; OpenClaw menerapkannya sebagai pengaturan agen yang 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.installs`: metadata pemasangan yang dikelola CLI dan digunakan oleh `openclaw plugins update`. +- Plugin bundel Claude yang diaktifkan juga dapat menyumbangkan default Pi tertanam dari `settings.json`; OpenClaw menerapkannya sebagai pengaturan agen yang telah 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 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 state terkelola; lebih disarankan menggunakan perintah CLI daripada edit manual. + - Perlakukan `plugins.installs.*` sebagai state yang dikelola; utamakan perintah CLI daripada edit manual. Lihat [Plugins](/id/tools/plugin). @@ -2776,8 +2801,8 @@ Lihat [Plugins](/id/tools/plugin). evaluateEnabled: true, defaultProfile: "user", ssrfPolicy: { - // dangerouslyAllowPrivateNetwork: true, // opt in hanya untuk akses jaringan private tepercaya - // allowPrivateNetwork: true, // alias lama + // dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access + // allowPrivateNetwork: true, // alias legacy // hostnameAllowlist: ["*.example.com", "example.com"], // allowedHostnames: ["localhost"], }, @@ -2804,23 +2829,28 @@ Lihat [Plugins](/id/tools/plugin). ``` - `evaluateEnabled: false` menonaktifkan `act:evaluate` dan `wait --fn`. -- `ssrfPolicy.dangerouslyAllowPrivateNetwork` dinonaktifkan saat tidak diatur, jadi navigasi browser tetap ketat secara default. -- Tetapkan `ssrfPolicy.dangerouslyAllowPrivateNetwork: true` hanya saat Anda memang memercayai navigasi browser ke jaringan private. -- Dalam mode ketat, endpoint profil CDP remote (`profiles.*.cdpUrl`) tunduk pada pemblokiran jaringan private yang sama selama pemeriksaan keterjangkauan/discovery. -- `ssrfPolicy.allowPrivateNetwork` tetap didukung sebagai alias lama. +- `ssrfPolicy.dangerouslyAllowPrivateNetwork` dinonaktifkan saat tidak diatur, sehingga navigasi browser tetap ketat secara default. +- Tetapkan `ssrfPolicy.dangerouslyAllowPrivateNetwork: true` hanya saat Anda memang mempercayai navigasi browser jaringan privat. +- Dalam mode ketat, endpoint profil CDP jarak jauh (`profiles.*.cdpUrl`) tunduk pada pemblokiran jaringan privat yang sama selama pemeriksaan keterjangkauan/discovery. +- `ssrfPolicy.allowPrivateNetwork` tetap didukung sebagai alias legacy. - Dalam mode ketat, gunakan `ssrfPolicy.hostnameAllowlist` dan `ssrfPolicy.allowedHostnames` untuk pengecualian eksplisit. -- Profil remote bersifat attach-only (start/stop/reset dinonaktifkan). +- 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 provider Anda memberi URL WebSocket DevTools langsung. - Profil `existing-session` hanya untuk 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` 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 CSS-selector, hook upload satu file, tanpa override timeout dialog, dan tanpa `wait --load networkidle`, `responsebody`, ekspor PDF, intersepsi unduhan, atau aksi batch. -- Profil `openclaw` terkelola lokal secara otomatis menetapkan `cdpPort` dan `cdpUrl`; tetapkan `cdpUrl` secara eksplisit hanya untuk CDP remote. -- Urutan auto-detect: browser default jika berbasis Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary. + tindakan berbasis snapshot/ref alih-alih penargetan pemilih CSS, hook upload satu file, + tanpa override timeout dialog, tanpa `wait --load networkidle`, dan tanpa + `responsebody`, ekspor PDF, intersepsi unduhan, atau tindakan batch. +- Profil `openclaw` terkelola lokal otomatis menetapkan `cdpPort` dan `cdpUrl`; hanya + tetapkan `cdpUrl` secara eksplisit untuk CDP jarak jauh. +- Urutan deteksi otomatis: browser default jika berbasis Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary. - Layanan kontrol: hanya loopback (port diturunkan dari `gateway.port`, default `18791`). -- `extraArgs` menambahkan flag peluncuran ekstra ke startup Chromium lokal (misalnya `--disable-gpu`, ukuran jendela, atau flag debug). +- `extraArgs` menambahkan flag peluncuran tambahan ke startup Chromium lokal (misalnya + `--disable-gpu`, pengaturan ukuran jendela, atau flag debug). --- @@ -2832,14 +2862,14 @@ Lihat [Plugins](/id/tools/plugin). seamColor: "#FF4500", assistant: { name: "OpenClaw", - avatar: "CB", // emoji, teks pendek, URL gambar, atau URI data + avatar: "CB", // emoji, teks pendek, URL gambar, atau data URI }, }, } ``` -- `seamColor`: warna aksen untuk chrome UI aplikasi native (warna gelembung Talk Mode, dll.). -- `assistant`: override identitas Control UI. Fallback ke identitas agen aktif. +- `seamColor`: warna aksen untuk chrome UI aplikasi native (tint gelembung Talk Mode, dll.). +- `assistant`: override identitas Control UI. Menggunakan identitas agen aktif sebagai fallback. --- @@ -2875,7 +2905,7 @@ Lihat [Plugins](/id/tools/plugin). // embedSandbox: "scripts", // strict | scripts | trusted // allowExternalEmbedUrls: false, // berbahaya: izinkan URL embed http(s) eksternal absolut // allowedOrigins: ["https://control.example.com"], // wajib untuk Control UI non-loopback - // dangerouslyAllowHostHeaderOriginFallback: false, // mode fallback origin Host-header yang berbahaya + // dangerouslyAllowHostHeaderOriginFallback: false, // mode fallback origin Host-header berbahaya // allowInsecureAuth: false, // dangerouslyDisableDeviceAuth: false, }, @@ -2906,42 +2936,44 @@ Lihat [Plugins](/id/tools/plugin). } ``` - + -- `mode`: `local` (jalankan gateway) atau `remote` (hubungkan ke gateway remote). Gateway menolak untuk mulai kecuali `local`. -- `port`: satu port termultipleks untuk WS + HTTP. Urutan prioritas: `--port` > `OPENCLAW_GATEWAY_PORT` > `gateway.port` > `18789`. +- `mode`: `local` (jalankan Gateway) atau `remote` (terhubung ke Gateway jarak jauh). Gateway menolak untuk memulai kecuali `local`. +- `port`: port tunggal yang dimultipleks 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 jaringan bridge Docker (`-p 18789:18789`), lalu lintas masuk melalui `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 ini berarti token/password bersama atau reverse proxy sadar identitas dengan `gateway.auth.mode: "trusted-proxy"`. Wizard onboarding menghasilkan token secara default. -- Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi (termasuk SecretRef), tetapkan `gateway.auth.mode` secara eksplisit ke `token` atau `password`. Startup dan alur service install/repair gagal saat keduanya dikonfigurasi dan mode tidak diatur. +- **Alias bind legacy**: gunakan nilai mode bind di `gateway.bind` (`auto`, `loopback`, `lan`, `tailnet`, `custom`), bukan alias host (`0.0.0.0`, `127.0.0.1`, `localhost`, `::`, `::1`). +- **Catatan Docker**: bind `loopback` default mendengarkan di `127.0.0.1` di dalam kontainer. Dengan jaringan bridge Docker (`-p 18789:18789`), lalu lintas datang ke `eth0`, sehingga gateway tidak dapat dijangkau. Gunakan `--network host`, atau tetapkan `bind: "lan"` (atau `bind: "custom"` dengan `customBindHost: "0.0.0.0"`) agar mendengarkan di semua antarmuka. +- **Auth**: wajib secara default. Bind non-loopback memerlukan auth Gateway. Dalam praktiknya itu berarti token/kata sandi bersama atau reverse proxy 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`. Alur startup dan instalasi/perbaikan service gagal jika keduanya dikonfigurasi dan mode tidak diatur. - `gateway.auth.mode: "none"`: mode tanpa auth yang eksplisit. Gunakan hanya untuk penyiapan local loopback tepercaya; ini sengaja tidak ditawarkan oleh prompt onboarding. -- `gateway.auth.mode: "trusted-proxy"`: delegasikan auth ke reverse proxy yang sadar identitas dan percayai header identitas dari `gateway.trustedProxies` (lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth)). Mode ini mengharapkan sumber proxy **non-loopback**; reverse proxy loopback pada host yang sama tidak memenuhi auth trusted-proxy. -- `gateway.auth.allowTailscale`: saat `true`, header identitas Tailscale Serve dapat memenuhi auth Control UI/WebSocket (diverifikasi melalui `tailscale whois`). Endpoint HTTP API **tidak** menggunakan auth header Tailscale tersebut; mereka mengikuti mode auth HTTP gateway normal. Alur tanpa token ini mengasumsikan host gateway tepercaya. Default ke `true` saat `tailscale.mode = "serve"`. -- `gateway.auth.rateLimit`: limiter auth gagal opsional. Berlaku per IP klien dan per cakupan auth (shared-secret dan device-token dilacak secara independen). Percobaan yang diblokir mengembalikan `429` + `Retry-After`. - - Pada jalur async Tailscale Serve Control UI, percobaan gagal untuk `{scope, clientIp}` yang sama diserialisasi sebelum penulisan kegagalan. Karena itu, percobaan buruk serentak dari klien yang sama dapat memicu limiter pada permintaan kedua alih-alih keduanya lolos sebagai mismatch biasa. - - `gateway.auth.rateLimit.exemptLoopback` default-nya `true`; tetapkan `false` saat Anda memang ingin lalu lintas localhost juga dibatasi (untuk penyiapan pengujian atau deployment proxy ketat). -- Percobaan auth WS asal browser selalu dibatasi dengan pengecualian loopback dinonaktifkan (defense-in-depth terhadap brute force localhost berbasis browser). -- Pada loopback, lockout asal browser tersebut diisolasi per nilai `Origin` yang dinormalisasi, sehingga kegagalan berulang dari satu origin localhost tidak otomatis mengunci origin lain. +- `gateway.auth.mode: "trusted-proxy"`: delegasikan auth ke reverse proxy sadar identitas dan percayai header identitas dari `gateway.trustedProxies` (lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth)). Mode ini mengharapkan sumber proxy **non-loopback**; reverse proxy loopback pada host yang sama tidak memenuhi auth trusted-proxy. +- `gateway.auth.allowTailscale`: saat `true`, header identitas Tailscale Serve dapat memenuhi auth Control UI/WebSocket (diverifikasi melalui `tailscale whois`). Endpoint HTTP API **tidak** menggunakan auth header Tailscale tersebut; endpoint itu mengikuti mode auth HTTP normal gateway. Alur tanpa token ini mengasumsikan host gateway tepercaya. Default ke `true` saat `tailscale.mode = "serve"`. +- `gateway.auth.rateLimit`: pembatas auth gagal opsional. Berlaku per IP klien dan per cakupan auth (shared-secret dan device-token dilacak secara independen). Percobaan yang diblokir mengembalikan `429` + `Retry-After`. + - Pada jalur async Tailscale Serve Control UI, percobaan gagal untuk `{scope, clientIp}` yang sama diserialisasi sebelum penulisan kegagalan. Karena itu, percobaan buruk bersamaan dari klien yang sama dapat memicu pembatas pada permintaan kedua alih-alih keduanya berlomba lolos sebagai ketidakcocokan biasa. + - `gateway.auth.rateLimit.exemptLoopback` default ke `true`; tetapkan `false` saat Anda memang ingin lalu lintas localhost juga dibatasi lajunya (untuk penyiapan pengujian atau deployment proxy ketat). +- Percobaan auth WS yang berasal dari browser selalu di-throttle dengan pengecualian loopback dinonaktifkan (pertahanan berlapis terhadap brute force localhost berbasis browser). +- Pada loopback, lockout asal-browser tersebut diisolasi per nilai `Origin` + yang telah dinormalisasi, sehingga kegagalan berulang dari satu origin localhost tidak otomatis + mengunci origin lain. - `tailscale.mode`: `serve` (hanya tailnet, bind loopback) atau `funnel` (publik, memerlukan auth). -- `controlUi.allowedOrigins`: allowlist origin browser eksplisit untuk koneksi Gateway WebSocket. Wajib saat klien browser diharapkan datang dari origin non-loopback. -- `controlUi.dangerouslyAllowHostHeaderOriginFallback`: mode berbahaya yang mengaktifkan fallback origin Host-header untuk deployment yang secara sengaja bergantung pada kebijakan origin Host-header. +- `controlUi.allowedOrigins`: allowlist origin browser eksplisit untuk koneksi WebSocket Gateway. Wajib saat klien browser diharapkan berasal dari origin non-loopback. +- `controlUi.dangerouslyAllowHostHeaderOriginFallback`: mode berbahaya yang mengaktifkan fallback origin Host-header untuk deployment yang memang mengandalkan kebijakan origin Host-header. - `remote.transport`: `ssh` (default) atau `direct` (ws/wss). Untuk `direct`, `remote.url` harus `ws://` atau `wss://`. -- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1`: override break-glass sisi klien yang mengizinkan `ws://` plaintext ke IP jaringan private tepercaya; default tetap hanya loopback untuk plaintext. -- `gateway.remote.token` / `.password` adalah bidang kredensial klien remote. Bidang ini tidak mengonfigurasi auth gateway dengan sendirinya. -- `gateway.push.apns.relay.baseUrl`: base HTTPS URL untuk relay APNs eksternal yang digunakan build iOS resmi/TestFlight setelah mereka memublikasikan pendaftaran berbasis relay ke gateway. URL ini harus cocok dengan URL relay yang dikompilasi ke build iOS. -- `gateway.push.apns.relay.timeoutMs`: timeout kirim gateway-ke-relay dalam milidetik. Default ke `10000`. -- Pendaftaran berbasis relay didelegasikan ke identitas gateway tertentu. Aplikasi iOS yang dipasangkan mengambil `gateway.identity.get`, menyertakan identitas tersebut dalam pendaftaran relay, dan meneruskan grant kirim yang dicakup pendaftaran ke gateway. Gateway lain tidak dapat menggunakan ulang pendaftaran tersimpan itu. +- `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1`: override break-glass sisi klien yang mengizinkan `ws://` plaintext ke IP jaringan privat tepercaya; default tetap hanya loopback untuk plaintext. +- `gateway.remote.token` / `.password` adalah bidang kredensial klien jarak jauh. Keduanya tidak mengonfigurasi auth gateway dengan sendirinya. +- `gateway.push.apns.relay.baseUrl`: URL HTTPS dasar 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 dalam build iOS. +- `gateway.push.apns.relay.timeoutMs`: timeout pengiriman gateway-ke-relay dalam milidetik. Default ke `10000`. +- Registrasi berbasis relay didelegasikan ke identitas gateway tertentu. Aplikasi iOS yang dipasangkan mengambil `gateway.identity.get`, menyertakan identitas tersebut dalam registrasi relay, dan meneruskan grant pengiriman yang dibatasi registrasi ke gateway. Gateway lain tidak dapat menggunakan kembali registrasi tersimpan tersebut. - `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 hanya untuk pengembangan bagi URL relay HTTP loopback. URL relay produksi harus tetap menggunakan HTTPS. +- `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 stale-socket dalam menit. Pertahankan nilai ini lebih besar atau sama dengan `gateway.channelHealthCheckMinutes`. Default: `30`. -- `gateway.channelMaxRestartsPerHour`: jumlah restart monitor kesehatan maksimum per channel/akun dalam satu jam bergulir. 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 memiliki prioritas di atas override tingkat channel. -- Jalur pemanggilan gateway lokal dapat menggunakan `gateway.remote.*` sebagai fallback hanya saat `gateway.auth.*` tidak diatur. -- Jika `gateway.auth.token` / `gateway.auth.password` secara eksplisit dikonfigurasi melalui SecretRef dan tidak ter-resolve, resolusi gagal tertutup (tidak ada fallback remote yang menutupi). -- `trustedProxies`: IP reverse proxy yang mengakhiri TLS atau menyuntikkan header klien yang diteruskan. Daftarkan hanya proxy yang Anda kontrol. Entri loopback tetap valid untuk penyiapan proxy lokal/deteksi lokal pada host yang sama (misalnya Tailscale Serve atau reverse proxy lokal), tetapi entri tersebut **tidak** membuat permintaan loopback memenuhi syarat untuk `gateway.auth.mode: "trusted-proxy"`. +- `gateway.channelStaleEventThresholdMinutes`: ambang soket usang dalam menit. Pertahankan ini lebih besar dari atau sama dengan `gateway.channelHealthCheckMinutes`. Default: `30`. +- `gateway.channelMaxRestartsPerHour`: jumlah maksimum restart monitor kesehatan per channel/akun dalam satu jam berjalan. Default: `10`. +- `channels..healthMonitor.enabled`: opt-out per channel untuk restart monitor kesehatan sambil mempertahankan monitor global tetap aktif. +- `channels..accounts..healthMonitor.enabled`: override per akun untuk channel multi-akun. Saat diatur, ini memiliki prioritas lebih tinggi daripada override tingkat channel. +- Jalur panggilan gateway lokal dapat menggunakan `gateway.remote.*` sebagai cadangan hanya ketika `gateway.auth.*` tidak diatur. +- Jika `gateway.auth.token` / `gateway.auth.password` dikonfigurasi secara eksplisit melalui SecretRef dan tidak berhasil di-resolve, resolusi gagal secara fail-closed (tanpa fallback jarak jauh yang menutupi kegagalan). +- `trustedProxies`: IP reverse proxy yang mengakhiri TLS atau menyisipkan header klien-terusan. Cantumkan hanya proxy yang Anda kendalikan. Entri loopback tetap valid untuk penyiapan deteksi proxy lokal/pada host yang sama (misalnya Tailscale Serve atau reverse proxy lokal), tetapi entri itu **tidak** membuat permintaan loopback memenuhi syarat untuk `gateway.auth.mode: "trusted-proxy"`. - `allowRealIpFallback`: saat `true`, gateway menerima `X-Real-IP` jika `X-Forwarded-For` tidak ada. Default `false` untuk perilaku fail-closed. - `gateway.tools.deny`: nama alat tambahan yang diblokir untuk HTTP `POST /tools/invoke` (memperluas daftar penolakan default). - `gateway.tools.allow`: hapus nama alat dari daftar penolakan HTTP default. @@ -2959,11 +2991,11 @@ Lihat [Plugins](/id/tools/plugin). Allowlist kosong diperlakukan sebagai tidak diatur; gunakan `gateway.http.endpoints.responses.files.allowUrl=false` dan/atau `gateway.http.endpoints.responses.images.allowUrl=false` untuk menonaktifkan pengambilan URL. - Header penguatan respons opsional: - - `gateway.http.securityHeaders.strictTransportSecurity` (tetapkan hanya untuk origin HTTPS yang Anda kontrol; lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth#tls-termination-and-hsts)) + - `gateway.http.securityHeaders.strictTransportSecurity` (atur hanya untuk origin HTTPS yang Anda kendalikan; lihat [Trusted Proxy Auth](/id/gateway/trusted-proxy-auth#tls-termination-and-hsts)) ### Isolasi multi-instance -Jalankan beberapa gateway pada satu host dengan port dan direktori state unik: +Jalankan beberapa gateway pada satu host dengan port dan direktori state yang unik: ```bash OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \ @@ -2971,7 +3003,7 @@ OPENCLAW_STATE_DIR=~/.openclaw-a \ openclaw gateway --port 19001 ``` -Flag kemudahan: `--dev` (menggunakan `~/.openclaw-dev` + port `19001`), `--profile ` (menggunakan `~/.openclaw-`). +Flag praktis: `--dev` (menggunakan `~/.openclaw-dev` + port `19001`), `--profile ` (menggunakan `~/.openclaw-`). Lihat [Multiple Gateways](/id/gateway/multiple-gateways). @@ -2992,9 +3024,9 @@ Lihat [Multiple Gateways](/id/gateway/multiple-gateways). ``` - `enabled`: mengaktifkan terminasi TLS pada listener gateway (HTTPS/WSS) (default: `false`). -- `autoGenerate`: menghasilkan otomatis pasangan cert/key self-signed lokal saat file eksplisit tidak dikonfigurasi; hanya untuk penggunaan lokal/dev. +- `autoGenerate`: menghasilkan otomatis pasangan sertifikat/kunci self-signed lokal saat file eksplisit tidak dikonfigurasi; hanya untuk penggunaan lokal/dev. - `certPath`: path filesystem ke file sertifikat TLS. -- `keyPath`: path filesystem ke file private key TLS; batasi izinnya. +- `keyPath`: path filesystem ke file kunci privat TLS; pertahankan dengan izin terbatas. - `caPath`: path bundle CA opsional untuk verifikasi klien atau rantai kepercayaan kustom. ### `gateway.reload` @@ -3011,13 +3043,13 @@ Lihat [Multiple Gateways](/id/gateway/multiple-gateways). } ``` -- `mode`: mengontrol cara edit konfigurasi diterapkan saat runtime. +- `mode`: mengontrol bagaimana edit konfigurasi diterapkan saat runtime. - `"off"`: abaikan edit langsung; perubahan memerlukan restart eksplisit. - `"restart"`: selalu restart proses gateway saat konfigurasi berubah. - `"hot"`: terapkan perubahan di dalam proses tanpa restart. - `"hybrid"` (default): coba hot reload terlebih dahulu; fallback ke restart jika diperlukan. -- `debounceMs`: jendela debounce dalam md sebelum perubahan konfigurasi diterapkan (integer non-negatif). -- `deferralTimeoutMs`: waktu maksimum dalam md untuk menunggu operasi yang sedang berjalan sebelum memaksa restart (default: `300000` = 5 menit). +- `debounceMs`: jendela debounce dalam ms sebelum perubahan konfigurasi diterapkan (integer non-negatif). +- `deferralTimeoutMs`: waktu maksimum dalam ms untuk menunggu operasi yang sedang berjalan sebelum memaksa restart (default: `300000` = 5 menit). --- @@ -3055,12 +3087,12 @@ Lihat [Multiple Gateways](/id/gateway/multiple-gateways). ``` Auth: `Authorization: Bearer ` atau `x-openclaw-token: `. -Token hook query-string ditolak. +Token hook di query string ditolak. Catatan validasi dan keamanan: - `hooks.enabled=true` memerlukan `hooks.token` yang tidak kosong. -- `hooks.token` harus **berbeda** dari `gateway.auth.token`; penggunaan ulang token Gateway ditolak. +- `hooks.token` harus **berbeda** dari `gateway.auth.token`; penggunaan ulang token Gateway akan ditolak. - `hooks.path` tidak boleh `/`; gunakan subpath khusus seperti `/hooks`. - Jika `hooks.allowRequestSessionKey=true`, batasi `hooks.allowedSessionKeyPrefixes` (misalnya `["hook:"]`). @@ -3068,22 +3100,22 @@ Catatan validasi dan keamanan: - `POST /hooks/wake` → `{ text, mode?: "now"|"next-heartbeat" }` - `POST /hooks/agent` → `{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }` - - `sessionKey` dari payload permintaan diterima hanya saat `hooks.allowRequestSessionKey=true` (default: `false`). + - `sessionKey` dari payload permintaan diterima hanya ketika `hooks.allowRequestSessionKey=true` (default: `false`). - `POST /hooks/` → di-resolve melalui `hooks.mappings` -- `match.path` cocok dengan subpath setelah `/hooks` (misalnya `/hooks/gmail` → `gmail`). +- `match.path` cocok dengan sub-path setelah `/hooks` (mis. `/hooks/gmail` → `gmail`). - `match.source` cocok dengan bidang payload untuk path generik. -- Template seperti `{{messages[0].subject}}` membaca dari payload. +- Templat seperti `{{messages[0].subject}}` membaca dari payload. - `transform` dapat menunjuk ke modul JS/TS yang mengembalikan aksi hook. - `transform.module` harus berupa path relatif dan tetap berada di dalam `hooks.transformsDir` (path absolut dan traversal ditolak). -- `agentId` merutekan ke agen tertentu; ID yang tidak dikenal fallback ke default. +- `agentId` merutekan ke agen tertentu; ID yang tidak dikenal akan kembali ke default. - `allowedAgentIds`: membatasi perutean eksplisit (`*` atau dihilangkan = izinkan semua, `[]` = tolak semua). - `defaultSessionKey`: kunci sesi tetap opsional untuk eksekusi agen hook tanpa `sessionKey` eksplisit. - `allowRequestSessionKey`: izinkan pemanggil `/hooks/agent` menetapkan `sessionKey` (default: `false`). -- `allowedSessionKeyPrefixes`: allowlist awalan opsional untuk nilai `sessionKey` eksplisit (permintaan + pemetaan), misalnya `["hook:"]`. -- `deliver: true` mengirim balasan akhir ke channel; `channel` default ke `last`. +- `allowedSessionKeyPrefixes`: allowlist prefiks opsional untuk nilai `sessionKey` eksplisit (permintaan + pemetaan), mis. `["hook:"]`. +- `deliver: true` mengirim balasan final ke channel; `channel` default ke `last`. - `model` mengoverride LLM untuk eksekusi hook ini (harus diizinkan jika katalog model diatur). @@ -3111,12 +3143,12 @@ Catatan validasi dan keamanan: } ``` -- Gateway otomatis menjalankan `gog gmail watch serve` saat boot ketika dikonfigurasi. Tetapkan `OPENCLAW_SKIP_GMAIL_WATCHER=1` untuk menonaktifkan. -- Jangan menjalankan `gog gmail watch serve` terpisah bersamaan dengan Gateway. +- Gateway otomatis memulai `gog gmail watch serve` saat boot jika dikonfigurasi. Tetapkan `OPENCLAW_SKIP_GMAIL_WATCHER=1` untuk menonaktifkannya. +- Jangan jalankan `gog gmail watch serve` terpisah bersamaan dengan Gateway. --- -## Canvas host +## Host canvas ```json5 { @@ -3133,12 +3165,12 @@ Catatan validasi dan keamanan: - `http://:/__openclaw__/a2ui/` - Hanya lokal: pertahankan `gateway.bind: "loopback"` (default). - Bind non-loopback: rute canvas memerlukan auth Gateway (token/password/trusted-proxy), sama seperti permukaan HTTP Gateway lainnya. -- Node WebViews biasanya tidak mengirim header auth; setelah node dipasangkan dan terhubung, Gateway mengiklankan URL kapabilitas bercakupan node untuk akses canvas/A2UI. +- Node WebViews biasanya tidak mengirim header auth; setelah sebuah node dipasangkan dan terhubung, Gateway mengiklankan URL kapabilitas dengan cakupan node untuk akses canvas/A2UI. - URL kapabilitas terikat ke sesi WS node aktif dan cepat kedaluwarsa. Fallback berbasis IP tidak digunakan. -- Menyuntikkan klien live-reload ke HTML yang disajikan. +- Menyisipkan klien live-reload ke HTML yang disajikan. - Otomatis membuat `index.html` awal saat kosong. - Juga menyajikan A2UI di `/__openclaw__/a2ui/`. -- Perubahan memerlukan restart gateway. +- Perubahan memerlukan restart Gateway. - Nonaktifkan live reload untuk direktori besar atau error `EMFILE`. --- @@ -3157,9 +3189,9 @@ Catatan validasi dan keamanan: } ``` -- `minimal` (default): hilangkan `cliPath` + `sshPort` dari record TXT. +- `minimal` (default): hilangkan `cliPath` + `sshPort` dari rekaman TXT. - `full`: sertakan `cliPath` + `sshPort`. -- Hostname default ke `openclaw`. Override dengan `OPENCLAW_MDNS_HOSTNAME`. +- Nama host default ke `openclaw`. Override dengan `OPENCLAW_MDNS_HOSTNAME`. ### Wide-area (DNS-SD) @@ -3179,7 +3211,7 @@ Penyiapan: `openclaw dns setup --apply`. ## Environment -### `env` (variabel env inline) +### `env` (env vars inline) ```json5 { @@ -3196,14 +3228,14 @@ Penyiapan: `openclaw dns setup --apply`. } ``` -- Variabel env inline hanya diterapkan jika env proses tidak memiliki kunci tersebut. -- File `.env`: `.env` CWD + `~/.openclaw/.env` (keduanya tidak mengoverride variabel yang sudah ada). -- `shellEnv`: mengimpor kunci yang diharapkan tetapi belum ada dari profil login shell Anda. -- Lihat [Environment](/id/help/environment) untuk urutan prioritas lengkap. +- Env var inline hanya diterapkan jika env proses tidak memiliki kunci tersebut. +- File `.env`: `.env` CWD + `~/.openclaw/.env` (keduanya tidak mengoverride var yang sudah ada). +- `shellEnv`: mengimpor kunci yang diharapkan tetapi belum ada dari profil shell login Anda. +- Lihat [Environment](/id/help/environment) untuk prioritas lengkap. -### Substitusi variabel env +### Substitusi env var -Rujuk variabel env di string konfigurasi apa pun dengan `${VAR_NAME}`: +Rujuk env vars dalam string konfigurasi apa pun dengan `${VAR_NAME}`: ```json5 { @@ -3213,16 +3245,16 @@ Rujuk variabel env di string konfigurasi apa pun dengan `${VAR_NAME}`: } ``` -- Hanya nama huruf besar yang cocok: `[A-Z_][A-Z0-9_]*`. -- Variabel yang hilang/kosong memunculkan error saat memuat konfigurasi. -- Escape dengan `$${VAR}` untuk `${VAR}` literal. +- Hanya nama huruf besar yang dicocokkan: `[A-Z_][A-Z0-9_]*`. +- Var yang hilang/kosong melempar error saat pemuatan konfigurasi. +- Escape dengan `$${VAR}` untuk literal `${VAR}`. - Bekerja dengan `$include`. --- ## Secrets -Referensi secret bersifat aditif: nilai plaintext tetap berfungsi. +Ref secret bersifat aditif: nilai plaintext tetap berfungsi. ### `SecretRef` @@ -3238,13 +3270,13 @@ Validasi: - pola id `source: "env"`: `^[A-Z][A-Z0-9_]{0,127}$` - id `source: "file"`: pointer JSON absolut (misalnya `"/providers/openai/apiKey"`) - pola id `source: "exec"`: `^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$` -- id `source: "exec"` tidak boleh mengandung segmen path `.` atau `..` yang dipisahkan slash (misalnya `a/../b` ditolak) +- id `source: "exec"` tidak boleh mengandung segmen path dengan pemisah slash `.` atau `..` (misalnya `a/../b` ditolak) ### Permukaan kredensial yang didukung - Matriks kanonis: [Permukaan Kredensial SecretRef](/id/reference/secretref-credential-surface) - `secrets apply` menargetkan path kredensial `openclaw.json` yang didukung. -- Referensi `auth-profiles.json` termasuk dalam cakupan resolusi runtime dan audit. +- Ref `auth-profiles.json` disertakan dalam resolusi runtime dan cakupan audit. ### Konfigurasi provider secret @@ -3278,11 +3310,11 @@ Catatan: - Provider `file` mendukung `mode: "json"` dan `mode: "singleValue"` (`id` harus `"value"` dalam mode singleValue). - Provider `exec` memerlukan path `command` absolut dan menggunakan payload protokol pada stdin/stdout. -- Secara default, path perintah symlink ditolak. Tetapkan `allowSymlinkCommand: true` untuk mengizinkan path symlink sambil memvalidasi path target hasil resolve. -- Jika `trustedDirs` dikonfigurasi, pemeriksaan trusted-dir berlaku pada path target hasil resolve. +- Secara default, path perintah symlink ditolak. Tetapkan `allowSymlinkCommand: true` untuk mengizinkan path symlink sambil memvalidasi path target yang telah di-resolve. +- Jika `trustedDirs` dikonfigurasi, pemeriksaan trusted-dir berlaku pada path target yang telah di-resolve. - Environment child `exec` minimal secara default; teruskan variabel yang diperlukan secara eksplisit dengan `passEnv`. -- Referensi secret di-resolve saat waktu aktivasi ke dalam snapshot dalam memori, lalu jalur permintaan hanya membaca snapshot tersebut. -- Penyaringan permukaan aktif berlaku selama aktivasi: referensi yang tidak ter-resolve pada permukaan aktif menyebabkan startup/reload gagal, sedangkan permukaan tidak aktif dilewati dengan diagnostik. +- Ref secret di-resolve saat aktivasi ke snapshot dalam memori, lalu path permintaan hanya membaca snapshot tersebut. +- Pemfilteran permukaan aktif berlaku selama aktivasi: ref yang tidak berhasil di-resolve pada permukaan aktif membuat startup/reload gagal, sementara permukaan yang tidak aktif dilewati dengan diagnostik. --- @@ -3305,10 +3337,10 @@ Catatan: ``` - Profil per agen disimpan di `/auth-profiles.json`. -- `auth-profiles.json` mendukung referensi tingkat nilai (`keyRef` untuk `api_key`, `tokenRef` untuk `token`) untuk mode kredensial statis. +- `auth-profiles.json` mendukung ref tingkat nilai (`keyRef` untuk `api_key`, `tokenRef` untuk `token`) untuk mode kredensial statis. - Profil mode OAuth (`auth.profiles..mode = "oauth"`) tidak mendukung kredensial auth-profile berbasis SecretRef. -- Kredensial runtime statis berasal dari snapshot ter-resolve dalam memori; entri `auth.json` statis lama dibersihkan saat ditemukan. -- Impor OAuth lama dari `~/.openclaw/credentials/oauth.json`. +- Kredensial runtime statis berasal dari snapshot ter-resolve dalam memori; entri `auth.json` statis legacy dibersihkan saat ditemukan. +- Impor OAuth legacy dari `~/.openclaw/credentials/oauth.json`. - Lihat [OAuth](/id/concepts/oauth). - Perilaku runtime secrets dan alat `audit/configure/apply`: [Secrets Management](/id/gateway/secrets). @@ -3332,15 +3364,21 @@ Catatan: } ``` -- `billingBackoffHours`: backoff dasar dalam jam saat profil gagal karena error billing/kredit tidak cukup yang benar-benar pasti (default: `5`). Teks billing eksplisit masih dapat masuk ke sini bahkan pada respons `401`/`403`, tetapi pencocok teks spesifik provider tetap dibatasi pada provider yang memilikinya (misalnya OpenRouter `Key limit exceeded`). Pesan jendela penggunaan `402` HTTP yang dapat dicoba ulang atau batas pengeluaran organisasi/workspace tetap masuk ke jalur `rate_limit`. -- `billingBackoffHoursByProvider`: override per provider opsional untuk jam backoff billing. -- `billingMaxHours`: batas dalam jam untuk pertumbuhan eksponensial backoff billing (default: `24`). -- `authPermanentBackoffMinutes`: backoff dasar dalam menit untuk kegagalan `auth_permanent` dengan keyakinan tinggi (default: `10`). -- `authPermanentMaxMinutes`: batas dalam menit untuk pertumbuhan backoff `auth_permanent` (default: `60`). -- `failureWindowHours`: jendela bergulir dalam jam yang digunakan untuk penghitung backoff (default: `24`). -- `overloadedProfileRotations`: jumlah rotasi auth-profile maksimum untuk provider yang sama pada error overloaded sebelum beralih ke fallback model (default: `1`). Bentuk provider-sibuk seperti `ModelNotReadyException` masuk ke sini. -- `overloadedBackoffMs`: penundaan tetap sebelum mencoba ulang rotasi provider/profile yang overloaded (default: `0`). -- `rateLimitedProfileRotations`: jumlah rotasi auth-profile maksimum untuk provider yang sama pada error rate-limit sebelum beralih ke fallback model (default: `1`). Bucket rate-limit itu mencakup teks berbentuk provider seperti `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, `workers_ai ... quota limit exceeded`, dan `resource exhausted`. +- `billingBackoffHours`: backoff dasar dalam jam saat sebuah profil gagal karena error + billing/kredit tidak cukup yang nyata (default: `5`). Teks billing eksplisit masih + dapat masuk ke sini bahkan pada respons `401`/`403`, tetapi matcher teks khusus provider + tetap dibatasi pada provider yang memilikinya (misalnya OpenRouter + `Key limit exceeded`). Pesan retryable HTTP `402` usage-window atau + batas pengeluaran organisasi/workspace tetap berada di jalur `rate_limit` + sebagai gantinya. +- `billingBackoffHoursByProvider`: override per-provider opsional untuk jam backoff billing. +- `billingMaxHours`: batas maksimum dalam jam untuk pertumbuhan eksponensial backoff billing (default: `24`). +- `authPermanentBackoffMinutes`: backoff dasar dalam menit untuk kegagalan `auth_permanent` berkeyakinan tinggi (default: `10`). +- `authPermanentMaxMinutes`: batas maksimum dalam menit untuk pertumbuhan backoff `auth_permanent` (default: `60`). +- `failureWindowHours`: jendela berjalan dalam jam yang digunakan untuk penghitung backoff (default: `24`). +- `overloadedProfileRotations`: jumlah maksimum rotasi auth-profile provider yang sama untuk error overloaded sebelum beralih ke fallback model (default: `1`). Bentuk provider sibuk seperti `ModelNotReadyException` masuk ke sini. +- `overloadedBackoffMs`: jeda tetap sebelum mencoba ulang rotasi provider/profil yang overloaded (default: `0`). +- `rateLimitedProfileRotations`: jumlah maksimum rotasi auth-profile provider yang sama untuk error rate-limit sebelum beralih ke fallback model (default: `1`). Bucket rate-limit itu mencakup teks berbentuk provider seperti `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, `workers_ai ... quota limit exceeded`, dan `resource exhausted`. --- @@ -3361,8 +3399,8 @@ Catatan: - File log default: `/tmp/openclaw/openclaw-YYYY-MM-DD.log`. - Tetapkan `logging.file` untuk path yang stabil. -- `consoleLevel` naik ke `debug` saat `--verbose`. -- `maxFileBytes`: ukuran file log maksimum dalam byte sebelum penulisan ditekan (integer positif; default: `524288000` = 500 MB). Gunakan rotasi log eksternal untuk deployment produksi. +- `consoleLevel` naik menjadi `debug` saat `--verbose`. +- `maxFileBytes`: ukuran maksimum file log dalam byte sebelum penulisan ditekan (integer positif; default: `524288000` = 500 MB). Gunakan rotasi log eksternal untuk deployment produksi. --- @@ -3401,18 +3439,18 @@ Catatan: - `enabled`: sakelar utama untuk output instrumentasi (default: `true`). - `flags`: array string flag yang mengaktifkan output log terarah (mendukung wildcard seperti `"telegram.*"` atau `"*"`). -- `stuckSessionWarnMs`: ambang usia dalam md untuk mengeluarkan peringatan sesi macet saat sesi tetap berada dalam status pemrosesan. +- `stuckSessionWarnMs`: ambang usia dalam ms untuk mengeluarkan peringatan sesi macet saat sebuah sesi tetap berada dalam status pemrosesan. - `otel.enabled`: mengaktifkan pipeline ekspor OpenTelemetry (default: `false`). - `otel.endpoint`: URL collector untuk ekspor OTel. - `otel.protocol`: `"http/protobuf"` (default) atau `"grpc"`. - `otel.headers`: header metadata HTTP/gRPC tambahan yang dikirim bersama permintaan ekspor OTel. - `otel.serviceName`: nama layanan untuk atribut resource. -- `otel.traces` / `otel.metrics` / `otel.logs`: aktifkan ekspor trace, metrics, atau log. +- `otel.traces` / `otel.metrics` / `otel.logs`: aktifkan ekspor trace, metrik, atau log. - `otel.sampleRate`: laju sampling trace `0`–`1`. -- `otel.flushIntervalMs`: interval flush telemetri berkala dalam md. +- `otel.flushIntervalMs`: interval flush telemetri periodik dalam ms. - `cacheTrace.enabled`: catat snapshot jejak cache untuk eksekusi embedded (default: `false`). -- `cacheTrace.filePath`: path output untuk cache trace JSONL (default: `$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl`). -- `cacheTrace.includeMessages` / `includePrompt` / `includeSystem`: mengontrol apa yang disertakan dalam output cache trace (semuanya default: `true`). +- `cacheTrace.filePath`: path output untuk JSONL jejak cache (default: `$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl`). +- `cacheTrace.includeMessages` / `includePrompt` / `includeSystem`: mengontrol apa yang disertakan dalam output jejak cache (semuanya default: `true`). --- @@ -3434,12 +3472,12 @@ Catatan: } ``` -- `channel`: channel rilis untuk pemasangan npm/git — `"stable"`, `"beta"`, atau `"dev"`. +- `channel`: channel rilis untuk instalasi npm/git — `"stable"`, `"beta"`, atau `"dev"`. - `checkOnStart`: periksa pembaruan npm saat gateway dimulai (default: `true`). -- `auto.enabled`: aktifkan auto-update latar belakang untuk package install (default: `false`). +- `auto.enabled`: aktifkan auto-update latar belakang untuk instalasi paket (default: `false`). - `auto.stableDelayHours`: penundaan minimum dalam jam sebelum auto-apply channel stable (default: `6`; maks: `168`). - `auto.stableJitterHours`: jendela penyebaran rollout channel stable tambahan dalam jam (default: `12`; maks: `168`). -- `auto.betaCheckIntervalHours`: seberapa sering pemeriksaan channel beta berjalan dalam jam (default: `1`; maks: `24`). +- `auto.betaCheckIntervalHours`: seberapa sering pemeriksaan channel beta dijalankan dalam jam (default: `1`; maks: `24`). --- @@ -3474,20 +3512,20 @@ Catatan: - `enabled`: gerbang fitur ACP global (default: `false`). - `dispatch.enabled`: gerbang independen untuk dispatch giliran sesi ACP (default: `true`). Tetapkan `false` agar perintah ACP tetap tersedia sambil memblokir eksekusi. -- `backend`: ID backend runtime ACP default (harus cocok dengan plugin runtime ACP terdaftar). -- `defaultAgent`: ID agen target ACP fallback saat spawn tidak menentukan target eksplisit. -- `allowedAgents`: allowlist ID agen yang diizinkan untuk sesi runtime ACP; kosong berarti tidak ada pembatasan tambahan. -- `maxConcurrentSessions`: jumlah sesi ACP aktif bersamaan maksimum. -- `stream.coalesceIdleMs`: jendela flush idle dalam md untuk teks yang di-stream. -- `stream.maxChunkChars`: ukuran chunk maksimum sebelum proyeksi blok stream dipecah. -- `stream.repeatSuppression`: menekan baris status/alat yang berulang per giliran (default: `true`). -- `stream.deliveryMode`: `"live"` melakukan streaming bertahap; `"final_only"` menahan hingga giliran mencapai peristiwa terminal. -- `stream.hiddenBoundarySeparator`: pemisah sebelum teks terlihat setelah peristiwa alat tersembunyi (default: `"paragraph"`). +- `backend`: id backend runtime ACP default (harus cocok dengan Plugin runtime ACP yang terdaftar). +- `defaultAgent`: id agen target ACP fallback saat spawn tidak menentukan target eksplisit. +- `allowedAgents`: allowlist id agen yang diizinkan untuk sesi runtime ACP; kosong berarti tidak ada pembatasan tambahan. +- `maxConcurrentSessions`: jumlah maksimum sesi ACP yang aktif secara bersamaan. +- `stream.coalesceIdleMs`: jendela flush idle dalam ms untuk teks yang di-stream. +- `stream.maxChunkChars`: ukuran chunk maksimum sebelum memecah proyeksi blok yang di-stream. +- `stream.repeatSuppression`: menekan baris status/alat berulang per giliran (default: `true`). +- `stream.deliveryMode`: `"live"` melakukan stream secara bertahap; `"final_only"` melakukan buffer hingga giliran mencapai event terminal. +- `stream.hiddenBoundarySeparator`: pemisah sebelum teks terlihat setelah event alat tersembunyi (default: `"paragraph"`). - `stream.maxOutputChars`: jumlah karakter output asisten maksimum yang diproyeksikan per giliran ACP. - `stream.maxSessionUpdateChars`: jumlah karakter maksimum untuk baris status/pembaruan ACP yang diproyeksikan. -- `stream.tagVisibility`: catatan nama tag ke override visibilitas boolean untuk peristiwa yang di-stream. -- `runtime.ttlMinutes`: TTL idle dalam menit untuk worker sesi ACP sebelum memenuhi syarat untuk dibersihkan. -- `runtime.installCommand`: perintah pemasangan opsional yang dijalankan saat melakukan bootstrap environment runtime ACP. +- `stream.tagVisibility`: catatan nama tag ke override visibilitas boolean untuk event yang di-stream. +- `runtime.ttlMinutes`: TTL idle dalam menit untuk worker sesi ACP sebelum layak dibersihkan. +- `runtime.installCommand`: perintah instalasi opsional yang dijalankan saat bootstrap environment runtime ACP. --- @@ -3504,8 +3542,8 @@ Catatan: ``` - `cli.banner.taglineMode` mengontrol gaya tagline banner: - - `"random"` (default): tagline lucu/musiman yang bergilir. - - `"default"`: tagline netral tetap (`Semua chat Anda, satu OpenClaw.`). + - `"random"` (default): tagline lucu/musiman yang berputar. + - `"default"`: tagline netral tetap (`All your chats, one OpenClaw.`). - `"off"`: tanpa teks tagline (judul/versi banner tetap ditampilkan). - Untuk menyembunyikan seluruh banner (bukan hanya tagline), tetapkan env `OPENCLAW_HIDE_BANNER=1`. @@ -3535,11 +3573,11 @@ Lihat bidang identity `agents.list` di bawah [Default agen](#agent-defaults). --- -## Bridge (lama, dihapus) +## Bridge (legacy, dihapus) -Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui Gateway WebSocket. Kunci `bridge.*` tidak lagi menjadi bagian dari skema konfigurasi (validasi gagal sampai dihapus; `openclaw doctor --fix` dapat menghapus kunci yang tidak dikenal). +Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui WebSocket Gateway. Kunci `bridge.*` tidak lagi menjadi bagian dari skema konfigurasi (validasi gagal sampai dihapus; `openclaw doctor --fix` dapat menghapus kunci yang tidak dikenal). - + ```json { @@ -3566,7 +3604,7 @@ Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui Gateway cron: { enabled: true, maxConcurrentRuns: 2, - webhook: "https://example.invalid/legacy", // fallback deprecated untuk job tersimpan dengan notify:true + webhook: "https://example.invalid/legacy", // fallback deprecated untuk pekerjaan notify:true yang tersimpan webhookToken: "replace-with-dedicated-token", // token bearer opsional untuk auth webhook keluar sessionRetention: "24h", // string durasi atau false runLog: { @@ -3577,11 +3615,11 @@ Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui Gateway } ``` -- `sessionRetention`: berapa lama mempertahankan sesi eksekusi cron terisolasi yang sudah selesai sebelum dipangkas dari `sessions.json`. Juga mengontrol pembersihan transkrip cron terarsip yang dihapus. Default: `24h`; tetapkan `false` untuk menonaktifkan. +- `sessionRetention`: berapa lama menyimpan sesi eksekusi Cron terisolasi yang telah selesai sebelum dipangkas dari `sessions.json`. Juga mengontrol pembersihan transkrip Cron terhapus yang diarsipkan. Default: `24h`; tetapkan `false` untuk menonaktifkan. - `runLog.maxBytes`: ukuran maksimum per file log eksekusi (`cron/runs/.jsonl`) sebelum dipangkas. Default: `2_000_000` byte. - `runLog.keepLines`: baris terbaru yang dipertahankan saat pemangkasan run-log dipicu. Default: `2000`. -- `webhookToken`: token bearer yang digunakan untuk pengiriman POST webhook cron (`delivery.mode = "webhook"`); jika dihilangkan, tidak ada header auth yang dikirim. -- `webhook`: fallback webhook lama yang deprecated berupa URL (http/https) dan hanya digunakan untuk job tersimpan yang masih memiliki `notify: true`. +- `webhookToken`: token bearer yang digunakan untuk pengiriman POST webhook Cron (`delivery.mode = "webhook"`), jika dihilangkan tidak ada header auth yang dikirim. +- `webhook`: URL webhook fallback legacy yang sudah deprecated (http/https) dan hanya digunakan untuk pekerjaan tersimpan yang masih memiliki `notify: true`. ### `cron.retry` @@ -3597,11 +3635,11 @@ Build saat ini tidak lagi menyertakan bridge TCP. Node terhubung melalui Gateway } ``` -- `maxAttempts`: jumlah retry maksimum untuk job one-shot pada error sementara (default: `3`; rentang: `0`–`10`). -- `backoffMs`: array penundaan backoff dalam md untuk setiap percobaan ulang (default: `[30000, 60000, 300000]`; 1–10 entri). -- `retryOn`: jenis error yang memicu retry — `"rate_limit"`, `"overloaded"`, `"network"`, `"timeout"`, `"server_error"`. Hilangkan untuk mencoba ulang semua jenis sementara. +- `maxAttempts`: jumlah maksimum retry untuk pekerjaan one-shot pada error sementara (default: `3`; rentang: `0`–`10`). +- `backoffMs`: array penundaan backoff dalam ms untuk setiap percobaan retry (default: `[30000, 60000, 300000]`; 1–10 entri). +- `retryOn`: jenis error yang memicu retry — `"rate_limit"`, `"overloaded"`, `"network"`, `"timeout"`, `"server_error"`. Hilangkan untuk me-retry semua jenis sementara. -Hanya berlaku untuk job cron one-shot. Job berulang menggunakan penanganan kegagalan terpisah. +Berlaku hanya untuk pekerjaan Cron one-shot. Pekerjaan berulang menggunakan penanganan kegagalan terpisah. ### `cron.failureAlert` @@ -3619,11 +3657,11 @@ Hanya berlaku untuk job cron one-shot. Job berulang menggunakan penanganan kegag } ``` -- `enabled`: aktifkan peringatan kegagalan untuk job cron (default: `false`). +- `enabled`: aktifkan peringatan kegagalan untuk pekerjaan Cron (default: `false`). - `after`: jumlah kegagalan berturut-turut sebelum peringatan dikirim (integer positif, min: `1`). -- `cooldownMs`: milidetik minimum antara peringatan berulang untuk job yang sama (integer non-negatif). -- `mode`: mode pengiriman — `"announce"` mengirim melalui pesan channel; `"webhook"` melakukan POST ke webhook yang dikonfigurasi. -- `accountId`: ID akun atau channel opsional untuk membatasi cakupan pengiriman peringatan. +- `cooldownMs`: milidetik minimum antara peringatan berulang untuk pekerjaan yang sama (integer non-negatif). +- `mode`: mode pengiriman — `"announce"` mengirim melalui pesan channel; `"webhook"` mem-post ke webhook yang dikonfigurasi. +- `accountId`: id akun atau channel opsional untuk membatasi pengiriman peringatan. ### `cron.failureDestination` @@ -3640,45 +3678,45 @@ Hanya berlaku untuk job cron one-shot. Job berulang menggunakan penanganan kegag } ``` -- Tujuan default untuk notifikasi kegagalan cron di seluruh job. +- Tujuan default untuk notifikasi kegagalan Cron di semua pekerjaan. - `mode`: `"announce"` atau `"webhook"`; default ke `"announce"` saat data target yang cukup tersedia. - `channel`: override channel untuk pengiriman announce. `"last"` menggunakan ulang channel pengiriman terakhir yang diketahui. - `to`: target announce eksplisit atau URL webhook. Wajib untuk mode webhook. - `accountId`: override akun opsional untuk pengiriman. -- `delivery.failureDestination` per job mengoverride default global ini. -- Saat tujuan kegagalan global maupun per job tidak diatur, job yang sudah mengirim melalui `announce` akan fallback ke target announce utama tersebut saat gagal. -- `delivery.failureDestination` hanya didukung untuk job `sessionTarget="isolated"` kecuali `delivery.mode` utama job adalah `"webhook"`. +- `delivery.failureDestination` per pekerjaan mengoverride default global ini. +- Saat tidak ada tujuan kegagalan global maupun per pekerjaan yang ditetapkan, pekerjaan yang sudah mengirim melalui `announce` akan kembali ke target announce utama tersebut saat gagal. +- `delivery.failureDestination` hanya didukung untuk pekerjaan `sessionTarget="isolated"` kecuali `delivery.mode` utama pekerjaan tersebut adalah `"webhook"`. -Lihat [Cron Jobs](/id/automation/cron-jobs). Eksekusi cron terisolasi dilacak sebagai [background tasks](/id/automation/tasks). +Lihat [Cron Jobs](/id/automation/cron-jobs). Eksekusi Cron terisolasi dilacak sebagai [background tasks](/id/automation/tasks). --- -## Variabel template model media +## Variabel templat model media -Placeholder template yang diekspansi di `tools.media.models[].args`: +Placeholder templat yang diperluas dalam `tools.media.models[].args`: -| Variable | Deskripsi | -| ------------------ | ---------------------------------------------- | -| `{{Body}}` | Isi pesan masuk penuh | -| `{{RawBody}}` | Isi mentah (tanpa pembungkus riwayat/pengirim) | -| `{{BodyStripped}}` | Isi dengan mention grup dihapus | -| `{{From}}` | Identifier pengirim | -| `{{To}}` | Identifier tujuan | -| `{{MessageSid}}` | ID pesan channel | -| `{{SessionId}}` | UUID sesi saat ini | -| `{{IsNewSession}}` | `"true"` saat sesi baru dibuat | -| `{{MediaUrl}}` | Pseudo-URL media masuk | -| `{{MediaPath}}` | Path media lokal | -| `{{MediaType}}` | Jenis media (image/audio/document/…) | -| `{{Transcript}}` | Transkrip audio | -| `{{Prompt}}` | Prompt media ter-resolve untuk entri CLI | -| `{{MaxChars}}` | Jumlah karakter output maksimum ter-resolve untuk entri CLI | -| `{{ChatType}}` | `"direct"` atau `"group"` | -| `{{GroupSubject}}` | Subjek grup (best effort) | -| `{{GroupMembers}}` | Pratinjau anggota grup (best effort) | -| `{{SenderName}}` | Nama tampilan pengirim (best effort) | -| `{{SenderE164}}` | Nomor telepon pengirim (best effort) | -| `{{Provider}}` | Petunjuk provider (whatsapp, telegram, discord, dll.) | +| Variabel | Deskripsi | +| ------------------ | ------------------------------------------------ | +| `{{Body}}` | Isi pesan masuk lengkap | +| `{{RawBody}}` | Isi mentah (tanpa wrapper riwayat/pengirim) | +| `{{BodyStripped}}` | Isi dengan mention grup dihapus | +| `{{From}}` | Pengidentifikasi pengirim | +| `{{To}}` | Pengidentifikasi tujuan | +| `{{MessageSid}}` | id pesan channel | +| `{{SessionId}}` | UUID sesi saat ini | +| `{{IsNewSession}}` | `"true"` saat sesi baru dibuat | +| `{{MediaUrl}}` | pseudo-URL media masuk | +| `{{MediaPath}}` | path media lokal | +| `{{MediaType}}` | Jenis media (image/audio/document/…) | +| `{{Transcript}}` | Transkrip audio | +| `{{Prompt}}` | prompt media yang telah di-resolve untuk entri CLI | +| `{{MaxChars}}` | karakter output maksimum yang telah di-resolve untuk entri CLI | +| `{{ChatType}}` | `"direct"` atau `"group"` | +| `{{GroupSubject}}` | Subjek grup (best effort) | +| `{{GroupMembers}}` | pratinjau anggota grup (best effort) | +| `{{SenderName}}` | nama tampilan pengirim (best effort) | +| `{{SenderE164}}` | nomor telepon pengirim (best effort) | +| `{{Provider}}` | petunjuk provider (whatsapp, telegram, discord, dll.) | --- @@ -3699,13 +3737,13 @@ Pisahkan konfigurasi ke beberapa file: **Perilaku penggabungan:** -- Satu file: menggantikan objek yang memuatnya. -- Array file: di-deep-merge sesuai urutan (yang belakangan mengoverride yang sebelumnya). -- Kunci saudara: digabungkan setelah include (mengoverride nilai yang di-include). -- Include bertingkat: hingga 10 level kedalaman. -- Path: di-resolve relatif terhadap file yang melakukan include, tetapi harus tetap berada di dalam direktori konfigurasi tingkat atas (`dirname` dari `openclaw.json`). Bentuk absolut/`../` diizinkan hanya jika hasil resolve tetap berada di dalam batas tersebut. -- Error: pesan yang jelas untuk file hilang, error parse, dan include melingkar. +- File tunggal: menggantikan objek yang memuatnya. +- Array file: digabungkan secara mendalam sesuai urutan (yang belakangan mengoverride yang lebih awal). +- Kunci sibling: digabungkan setelah include (mengoverride nilai yang di-include). +- Include bertingkat: hingga 10 tingkat kedalaman. +- Path: di-resolve relatif terhadap file yang melakukan include, tetapi harus tetap berada di dalam direktori konfigurasi tingkat atas (`dirname` dari `openclaw.json`). Bentuk absolut/`../` hanya diizinkan jika tetap di-resolve di dalam batas tersebut. +- Error: pesan yang jelas untuk file yang hilang, error parse, dan include melingkar. --- -_Terkait: [Konfigurasi](/id/gateway/configuration) · [Contoh Konfigurasi](/id/gateway/configuration-examples) · [Doctor](/id/gateway/doctor)_ +_Terkait: [Configuration](/id/gateway/configuration) · [Configuration Examples](/id/gateway/configuration-examples) · [Doctor](/id/gateway/doctor)_ diff --git a/docs/id/gateway/local-models.md b/docs/id/gateway/local-models.md index 12d51b471..4c5a858ff 100644 --- a/docs/id/gateway/local-models.md +++ b/docs/id/gateway/local-models.md @@ -1,28 +1,28 @@ --- read_when: - Anda ingin menyajikan model dari mesin GPU Anda sendiri - - Anda sedang menghubungkan LM Studio atau proksi yang kompatibel dengan OpenAI + - Anda sedang menyiapkan LM Studio atau proxy yang kompatibel dengan OpenAI - Anda memerlukan panduan model lokal yang paling aman summary: Jalankan OpenClaw pada LLM lokal (LM Studio, vLLM, LiteLLM, endpoint OpenAI kustom) title: Model Lokal x-i18n: - generated_at: "2026-04-15T09:14:51Z" + generated_at: "2026-04-15T14:40:33Z" model: gpt-5.4 provider: openai - source_hash: 8778cc1c623a356ff3cf306c494c046887f9417a70ec71e659e4a8aae912a780 + source_hash: 7a506ff83e4c2870d3878339f646c906584454a156ecd618c360f592cf3b0011 source_path: gateway/local-models.md workflow: 15 --- # Model lokal -Penggunaan lokal memungkinkan, tetapi OpenClaw mengharapkan konteks besar + pertahanan kuat terhadap injeksi prompt. Kartu kecil akan memangkas konteks dan melemahkan keamanan. Targetkan spesifikasi tinggi: **≥2 Mac Studio dengan konfigurasi maksimal atau rig GPU setara (~$30k+)**. Satu GPU **24 GB** hanya cocok untuk prompt yang lebih ringan dengan latensi lebih tinggi. Gunakan **varian model terbesar / ukuran penuh yang dapat Anda jalankan**; checkpoint yang sangat dikuantisasi atau “kecil” meningkatkan risiko injeksi prompt (lihat [Keamanan](/id/gateway/security)). +Lokal bisa dilakukan, tetapi OpenClaw mengharapkan konteks besar + pertahanan yang kuat terhadap injeksi prompt. Kartu kecil memotong konteks dan melemahkan keamanan. Targetkan tinggi: **≥2 Mac Studio yang dimaksimalkan atau rig GPU setara (~$30k+)**. Satu GPU **24 GB** hanya cocok untuk prompt yang lebih ringan dengan latensi lebih tinggi. Gunakan **varian model terbesar / ukuran penuh yang bisa Anda jalankan**; checkpoint yang dikuantisasi secara agresif atau “kecil” meningkatkan risiko injeksi prompt (lihat [Keamanan](/id/gateway/security)). -Jika Anda menginginkan penyiapan lokal dengan hambatan paling rendah, mulai dengan [LM Studio](/id/providers/lmstudio) atau [Ollama](/id/providers/ollama) dan `openclaw onboard`. Halaman ini adalah panduan beropini untuk stack lokal kelas atas dan server lokal kustom yang kompatibel dengan OpenAI. +Jika Anda menginginkan penyiapan lokal dengan hambatan paling rendah, mulai dengan [LM Studio](/id/providers/lmstudio) atau [Ollama](/id/providers/ollama) dan `openclaw onboard`. Halaman ini adalah panduan yang bersifat opini untuk stack lokal kelas atas dan server lokal kustom yang kompatibel dengan OpenAI. ## Direkomendasikan: LM Studio + model lokal besar (Responses API) -Stack lokal terbaik saat ini. Muat model besar di LM Studio (misalnya, build Qwen, DeepSeek, atau Llama ukuran penuh), aktifkan server lokal (default `http://127.0.0.1:1234`), dan gunakan Responses API untuk memisahkan penalaran dari teks akhir. +Stack lokal terbaik saat ini. Muat model besar di LM Studio (misalnya build Qwen, DeepSeek, atau Llama ukuran penuh), aktifkan server lokal (default `http://127.0.0.1:1234`), dan gunakan Responses API untuk memisahkan penalaran dari teks akhir. ```json5 { @@ -62,15 +62,15 @@ Stack lokal terbaik saat ini. Muat model besar di LM Studio (misalnya, build Qwe **Daftar periksa penyiapan** - Instal LM Studio: [https://lmstudio.ai](https://lmstudio.ai) -- Di LM Studio, unduh **build model terbesar yang tersedia** (hindari varian “small”/yang sangat dikuantisasi), jalankan server, pastikan `http://127.0.0.1:1234/v1/models` menampilkannya. -- Ganti `my-local-model` dengan ID model sebenarnya yang ditampilkan di LM Studio. +- Di LM Studio, unduh **build model terbesar yang tersedia** (hindari varian “small”/yang dikuantisasi berat), mulai server, pastikan `http://127.0.0.1:1234/v1/models` menampilkannya. +- Ganti `my-local-model` dengan ID model aktual yang ditampilkan di LM Studio. - Pastikan model tetap dimuat; cold-load menambah latensi startup. - Sesuaikan `contextWindow`/`maxTokens` jika build LM Studio Anda berbeda. - Untuk WhatsApp, tetap gunakan Responses API agar hanya teks akhir yang dikirim. -Tetap konfigurasikan model ter-hosting meskipun berjalan secara lokal; gunakan `models.mode: "merge"` agar fallback tetap tersedia. +Tetap konfigurasikan model yang dihosting bahkan saat berjalan secara lokal; gunakan `models.mode: "merge"` agar fallback tetap tersedia. -### Konfigurasi hibrida: primer ter-hosting, fallback lokal +### Konfigurasi hibrida: hosted sebagai utama, lokal sebagai fallback ```json5 { @@ -111,16 +111,16 @@ Tetap konfigurasikan model ter-hosting meskipun berjalan secara lokal; gunakan ` } ``` -### Lokal sebagai prioritas dengan jaring pengaman ter-hosting +### Lokal lebih dulu dengan jaring pengaman hosted -Tukar urutan primer dan fallback; pertahankan blok provider yang sama dan `models.mode: "merge"` agar Anda dapat fallback ke Sonnet atau Opus saat mesin lokal tidak aktif. +Tukar urutan primary dan fallback; pertahankan blok provider yang sama dan `models.mode: "merge"` agar Anda dapat beralih ke Sonnet atau Opus saat mesin lokal tidak aktif. ### Hosting regional / perutean data -- Varian MiniMax/Kimi/GLM ter-hosting juga tersedia di OpenRouter dengan endpoint yang dipatok ke wilayah tertentu (misalnya, di-host di AS). Pilih varian regional di sana agar lalu lintas tetap berada dalam yurisdiksi pilihan Anda sambil tetap menggunakan `models.mode: "merge"` untuk fallback Anthropic/OpenAI. -- Hanya lokal tetap menjadi jalur privasi terkuat; perutean regional ter-hosting adalah jalan tengah saat Anda membutuhkan fitur provider tetapi tetap ingin mengendalikan aliran data. +- Varian MiniMax/Kimi/GLM yang dihosting juga tersedia di OpenRouter dengan endpoint yang dipatok ke wilayah tertentu (misalnya dihosting di AS). Pilih varian regional di sana agar trafik tetap berada dalam yurisdiksi pilihan Anda sambil tetap menggunakan `models.mode: "merge"` untuk fallback Anthropic/OpenAI. +- Hanya-lokal tetap merupakan jalur privasi terkuat; perutean regional yang dihosting adalah jalan tengah saat Anda memerlukan fitur penyedia tetapi ingin mengendalikan aliran data. -## Proksi lokal lain yang kompatibel dengan OpenAI +## Proxy lokal lain yang kompatibel dengan OpenAI vLLM, LiteLLM, OAI-proxy, atau gateway kustom dapat digunakan jika mereka mengekspos endpoint `/v1` bergaya OpenAI. Ganti blok provider di atas dengan endpoint dan ID model Anda: @@ -150,30 +150,46 @@ vLLM, LiteLLM, OAI-proxy, atau gateway kustom dapat digunakan jika mereka mengek } ``` -Pertahankan `models.mode: "merge"` agar model ter-hosting tetap tersedia sebagai fallback. +Pertahankan `models.mode: "merge"` agar model yang dihosting tetap tersedia sebagai fallback. -Catatan perilaku untuk backend `/v1` lokal/proksi: +Catatan perilaku untuk backend `/v1` lokal/proxy: -- OpenClaw memperlakukan ini sebagai rute kompatibel OpenAI bergaya proksi, bukan endpoint OpenAI native -- pembentukan permintaan khusus OpenAI native tidak berlaku di sini: tidak ada `service_tier`, tidak ada Responses `store`, tidak ada pembentukan payload kompatibilitas penalaran OpenAI, dan tidak ada petunjuk cache prompt -- header atribusi OpenClaw tersembunyi (`originator`, `version`, `User-Agent`) tidak disisipkan pada URL proksi kustom ini +- OpenClaw memperlakukan ini sebagai rute proxy bergaya OpenAI yang kompatibel, bukan endpoint OpenAI native +- pembentukan permintaan khusus OpenAI native tidak berlaku di sini: tidak ada + `service_tier`, tidak ada Responses `store`, tidak ada pembentukan payload kompatibilitas reasoning OpenAI, + dan tidak ada petunjuk prompt-cache +- header atribusi OpenClaw tersembunyi (`originator`, `version`, `User-Agent`) + tidak disisipkan pada URL proxy kustom ini -Catatan kompatibilitas untuk backend yang kompatibel dengan OpenAI tetapi lebih ketat: +Catatan kompatibilitas untuk backend kompatibel OpenAI yang lebih ketat: -- Beberapa server hanya menerima `messages[].content` berbentuk string pada Chat Completions, bukan array bagian konten terstruktur. Atur `models.providers..models[].compat.requiresStringContent: true` untuk endpoint tersebut. -- Beberapa backend lokal yang lebih kecil atau lebih ketat tidak stabil dengan bentuk prompt runtime agen penuh milik OpenClaw, terutama saat skema tool disertakan. Jika backend berfungsi untuk panggilan `/v1/chat/completions` langsung yang kecil tetapi gagal pada giliran agen OpenClaw normal, pertama coba `agents.defaults.localModelMode: "lean"` untuk menghapus tool default yang berat seperti `browser`, `cron`, dan `message`; jika masih gagal, coba `models.providers..models[].compat.supportsTools: false`. -- Jika backend masih gagal hanya pada eksekusi OpenClaw yang lebih besar, masalah yang tersisa biasanya adalah kapasitas model/server upstream atau bug backend, bukan lapisan transport OpenClaw. +- Beberapa server hanya menerima `messages[].content` berbentuk string pada Chat Completions, bukan + array content-part terstruktur. Atur + `models.providers..models[].compat.requiresStringContent: true` untuk + endpoint tersebut. +- Beberapa backend lokal yang lebih kecil atau lebih ketat tidak stabil dengan bentuk prompt + runtime agen penuh OpenClaw, terutama saat skema tool disertakan. Jika + backend berfungsi untuk panggilan langsung `/v1/chat/completions` yang kecil tetapi gagal pada giliran agen + OpenClaw normal, pertama coba + `agents.defaults.experimental.localModelLean: true` untuk menghapus tool default + yang berat seperti `browser`, `cron`, dan `message`; ini adalah flag + eksperimental, bukan pengaturan mode-default yang stabil. Lihat + [Fitur Eksperimental](/id/concepts/experimental-features). Jika masih gagal, coba + `models.providers..models[].compat.supportsTools: false`. +- Jika backend masih gagal hanya pada proses OpenClaw yang lebih besar, masalah yang tersisa + biasanya adalah kapasitas model/server di hulu atau bug backend, bukan lapisan + transport OpenClaw. ## Pemecahan masalah -- Gateway dapat menjangkau proksi? `curl http://127.0.0.1:1234/v1/models`. -- Model LM Studio tidak dimuat? Muat ulang; cold start adalah penyebab umum “macet”. -- OpenClaw memperingatkan saat jendela konteks yang terdeteksi berada di bawah **32k** dan memblokir di bawah **16k**. Jika Anda menemui preflight itu, tingkatkan batas konteks server/model atau pilih model yang lebih besar. -- Error konteks? Turunkan `contextWindow` atau naikkan batas server Anda. +- Gateway dapat menjangkau proxy? `curl http://127.0.0.1:1234/v1/models`. +- Model LM Studio dibongkar? Muat ulang; cold start adalah penyebab umum “menggantung”. +- OpenClaw memperingatkan ketika context window yang terdeteksi di bawah **32k** dan memblokir di bawah **16k**. Jika Anda menemui preflight itu, tingkatkan batas konteks server/model atau pilih model yang lebih besar. +- Error konteks? Turunkan `contextWindow` atau tingkatkan batas server Anda. - Server yang kompatibel dengan OpenAI mengembalikan `messages[].content ... expected a string`? Tambahkan `compat.requiresStringContent: true` pada entri model tersebut. -- Panggilan `/v1/chat/completions` langsung yang kecil berfungsi, tetapi `openclaw infer model run` +- Panggilan langsung `/v1/chat/completions` yang kecil berfungsi, tetapi `openclaw infer model run` gagal pada Gemma atau model lokal lain? Nonaktifkan skema tool terlebih dahulu dengan `compat.supportsTools: false`, lalu uji lagi. Jika server masih crash hanya - pada prompt OpenClaw yang lebih besar, anggap ini sebagai keterbatasan model/server upstream. -- Keamanan: model lokal melewati filter sisi provider; pertahankan agen tetap sempit dan Compaction aktif untuk membatasi radius dampak injeksi prompt. + pada prompt OpenClaw yang lebih besar, anggap ini sebagai keterbatasan server/model di hulu. +- Keamanan: model lokal melewati filter sisi penyedia; batasi agen dan biarkan compaction aktif untuk membatasi dampak injeksi prompt. diff --git a/docs/id/help/testing.md b/docs/id/help/testing.md index 6c3a6d074..2a5d5c36c 100644 --- a/docs/id/help/testing.md +++ b/docs/id/help/testing.md @@ -2,40 +2,40 @@ read_when: - Menjalankan pengujian secara lokal atau di CI - Menambahkan regresi untuk bug model/provider - - Men-debug perilaku Gateway + agen + - Men-debug perilaku gateway + agen summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan cakupan masing-masing pengujian' title: Pengujian x-i18n: - generated_at: "2026-04-15T09:15:13Z" + generated_at: "2026-04-15T14:40:33Z" model: gpt-5.4 provider: openai - source_hash: fbf647a5cf13b5861a3ba0cb367dc816c57f0e9c60d3cd6320da193bfadf5609 + source_hash: ec3632cafa1f38b27510372391b84af744266df96c58f7fac98aa03763465db8 source_path: help/testing.md workflow: 15 --- # Pengujian -OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sekumpulan kecil runner Docker. +OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sejumlah kecil runner Docker. Dokumen ini adalah panduan “cara kami menguji”: -- Apa yang dicakup tiap suite (dan apa yang dengan sengaja _tidak_ dicakup) -- Perintah mana yang dijalankan untuk alur kerja umum (lokal, sebelum push, debugging) -- Bagaimana pengujian live menemukan kredensial dan memilih model/provider +- Apa yang dicakup setiap suite (dan apa yang memang _tidak_ dicakup) +- Perintah mana yang dijalankan untuk alur kerja umum (lokal, pra-push, debugging) +- Cara pengujian live menemukan kredensial dan memilih model/provider - Cara menambahkan regresi untuk masalah model/provider di dunia nyata ## Mulai cepat -Pada kebanyakan hari: +Sebagian besar hari: - Gate penuh (diharapkan sebelum push): `pnpm build && pnpm check && pnpm test` -- Menjalankan suite penuh lokal yang lebih cepat pada mesin yang lega: `pnpm test:max` +- Menjalankan suite penuh lokal yang lebih cepat pada mesin yang lapang: `pnpm test:max` - Loop watch Vitest langsung: `pnpm test:watch` - Penargetan file langsung sekarang juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- Utamakan menjalankan target yang spesifik lebih dulu saat Anda sedang mengiterasi satu kegagalan. +- Utamakan run yang ditargetkan terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. - Situs QA berbasis Docker: `pnpm qa:lab:up` -- Lane QA berbasis VM Linux: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` +- Jalur QA berbasis Linux VM: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` Saat Anda menyentuh pengujian atau menginginkan keyakinan tambahan: @@ -44,59 +44,59 @@ Saat Anda menyentuh pengujian atau menginginkan keyakinan tambahan: Saat men-debug provider/model nyata (memerlukan kredensial nyata): -- Suite live (probe model + alat/gambar Gateway): `pnpm test:live` -- Target satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` +- Suite live (probe model + tool/image gateway): `pnpm test:live` +- Targetkan satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` -Tip: saat Anda hanya membutuhkan satu kasus yang gagal, utamakan mempersempit pengujian live melalui env var allowlist yang dijelaskan di bawah. +Tip: saat Anda hanya memerlukan satu kasus gagal, utamakan mempersempit pengujian live melalui env var allowlist yang dijelaskan di bawah. ## Runner khusus QA -Perintah-perintah ini berada di samping suite pengujian utama saat Anda membutuhkan realisme QA-lab: +Perintah-perintah ini berada di samping suite pengujian utama saat Anda memerlukan realisme QA-lab: - `pnpm openclaw qa suite` - Menjalankan skenario QA berbasis repo langsung di host. - - Secara bawaan menjalankan beberapa skenario terpilih secara paralel dengan worker Gateway terisolasi, hingga 64 worker atau jumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk lane serial yang lebih lama. + - Menjalankan beberapa skenario terpilih secara paralel secara default dengan worker gateway terisolasi, hingga 64 worker atau sejumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk jalur serial yang lebih lama. - `pnpm openclaw qa suite --runner multipass` - Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai. - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` di host. - - Menggunakan ulang flag pemilihan provider/model yang sama seperti `qa suite`. - - Run live meneruskan input auth QA yang didukung dan praktis untuk guest: - kunci provider berbasis env, path konfigurasi provider live QA, dan `CODEX_HOME` bila ada. + - Menggunakan kembali flag pemilihan provider/model yang sama seperti `qa suite`. + - Run live meneruskan input autentikasi QA yang didukung dan praktis untuk guest: + key provider berbasis env, path config provider live QA, dan `CODEX_HOME` bila ada. - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis balik melalui workspace yang di-mount. - Menulis laporan + ringkasan QA normal serta log Multipass di bawah `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - Memulai situs QA berbasis Docker untuk pekerjaan QA gaya operator. - `pnpm openclaw qa matrix` - - Menjalankan lane QA live Matrix terhadap homeserver Tuwunel berbasis Docker sekali pakai. - - Host QA ini saat ini hanya untuk repo/dev. Instalasi OpenClaw yang dipaketkan tidak mengirimkan `qa-lab`, jadi tidak mengekspos `openclaw qa`. + - Menjalankan jalur QA live Matrix terhadap homeserver Tuwunel berbasis Docker sekali pakai. + - Host QA ini saat ini hanya untuk repo/dev. Instalasi OpenClaw yang dikemas tidak menyertakan `qa-lab`, jadi tidak mengekspos `openclaw qa`. - Checkout repo memuat runner bawaan secara langsung; tidak diperlukan langkah instalasi plugin terpisah. - - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) ditambah satu ruang privat, lalu memulai child Gateway QA dengan plugin Matrix nyata sebagai transport SUT. - - Secara bawaan menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1`. Override dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` saat Anda perlu menguji image lain. - - Matrix tidak mengekspos flag sumber kredensial bersama karena lane ini menyediakan pengguna sekali pakai secara lokal. - - Menulis laporan QA Matrix, ringkasan, dan artefak peristiwa-teramati di bawah `.artifacts/qa-e2e/...`. + - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) ditambah satu room privat, lalu memulai child gateway QA dengan plugin Matrix nyata sebagai transport SUT. + - Menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1` secara default. Override dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` saat Anda perlu menguji image yang berbeda. + - Matrix tidak mengekspos flag sumber kredensial bersama karena jalur ini menyediakan pengguna sekali pakai secara lokal. + - Menulis laporan QA Matrix, ringkasan, dan artefak observed-events di bawah `.artifacts/qa-e2e/...`. - `pnpm openclaw qa telegram` - - Menjalankan lane QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. + - Menjalankan jalur QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa ID chat Telegram numerik. - - Mendukung `--credential-source convex` untuk kredensial bersama yang dipool. Gunakan mode env secara bawaan, atau set `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk memilih lease pool. + - Mendukung `--credential-source convex` untuk kredensial bersama yang dipool. Gunakan mode env secara default, atau tetapkan `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk memilih lease yang dipool. - Memerlukan dua bot berbeda di grup privat yang sama, dengan bot SUT mengekspos username Telegram. - Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. - - Menulis laporan QA Telegram, ringkasan, dan artefak pesan-teramati di bawah `.artifacts/qa-e2e/...`. + - Menulis laporan QA Telegram, ringkasan, dan artefak observed-messages di bawah `.artifacts/qa-e2e/...`. -Lane transport live berbagi satu kontrak standar agar transport baru tidak menyimpang: +Jalur transport live berbagi satu kontrak standar agar transport baru tidak mengalami penyimpangan: `qa-channel` tetap menjadi suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live. -| Lane | Canary | Penyaringan mention | Blok allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah bantuan | -| -------- | ------ | ------------------- | -------------- | -------------------- | ---------------------- | -------------------- | -------------- | ---------------- | ---------------- | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| Jalur | Canary | Mention gating | Blok allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaction | Perintah help | +| -------- | ------ | -------------- | --------------- | -------------------- | ---------------------- | -------------------- | -------------- | ------------------ | ------------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | ### Kredensial Telegram bersama melalui Convex (v1) Saat `--credential-source convex` (atau `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) diaktifkan untuk `openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool berbasis Convex, mengirim heartbeat -untuk lease tersebut selama lane berjalan, dan melepaskan lease saat shutdown. +untuk lease tersebut selama jalur berjalan, dan melepaskan lease saat shutdown. Scaffold proyek Convex referensi: @@ -110,19 +110,19 @@ Env var yang diperlukan: - `OPENCLAW_QA_CONVEX_SECRET_CI` untuk `ci` - Pemilihan peran kredensial: - CLI: `--credential-role maintainer|ci` - - Bawaan env: `OPENCLAW_QA_CREDENTIAL_ROLE` (bawaan `maintainer`) + - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default `maintainer`) Env var opsional: -- `OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS` (bawaan `1200000`) -- `OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (bawaan `30000`) -- `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (bawaan `90000`) -- `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (bawaan `15000`) -- `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (bawaan `/qa-credentials/v1`) +- `OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS` (default `1200000`) +- `OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (default `30000`) +- `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (default `90000`) +- `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (default `15000`) +- `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (default `/qa-credentials/v1`) - `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (ID pelacakan opsional) -- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex `http://` loopback hanya untuk pengembangan lokal. +- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex `http://` loopback untuk pengembangan lokal saja. -`OPENCLAW_QA_CONVEX_SITE_URL` sebaiknya menggunakan `https://` dalam operasi normal. +`OPENCLAW_QA_CONVEX_SITE_URL` seharusnya menggunakan `https://` dalam operasi normal. Perintah admin maintainer (tambah/hapus/daftar pool) secara khusus memerlukan `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER`. @@ -137,34 +137,34 @@ pnpm openclaw qa credentials remove --credential-id Gunakan `--json` untuk output yang dapat dibaca mesin dalam skrip dan utilitas CI. -Kontrak endpoint bawaan (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): +Kontrak endpoint default (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): - `POST /acquire` - - Permintaan: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` + - Request: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` - Berhasil: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` - - Habis/dapat dicoba lagi: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` + - Habis/dapat dicoba ulang: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` - `POST /heartbeat` - - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` + - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) - `POST /release` - - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken }` + - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken }` - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) -- `POST /admin/add` (khusus secret maintainer) - - Permintaan: `{ kind, actorId, payload, note?, status? }` +- `POST /admin/add` (hanya secret maintainer) + - Request: `{ kind, actorId, payload, note?, status? }` - Berhasil: `{ status: "ok", credential }` -- `POST /admin/remove` (khusus secret maintainer) - - Permintaan: `{ credentialId, actorId }` +- `POST /admin/remove` (hanya secret maintainer) + - Request: `{ credentialId, actorId }` - Berhasil: `{ status: "ok", changed, credential }` - - Penjaga lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` -- `POST /admin/list` (khusus secret maintainer) - - Permintaan: `{ kind?, status?, includePayload?, limit? }` + - Guard lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` +- `POST /admin/list` (hanya secret maintainer) + - Request: `{ kind?, status?, includePayload?, limit? }` - Berhasil: `{ status: "ok", credentials, count }` Bentuk payload untuk jenis Telegram: - `{ groupId: string, driverToken: string, sutToken: string }` - `groupId` harus berupa string ID chat Telegram numerik. -- `admin/add` memvalidasi bentuk ini untuk `kind: "telegram"` dan menolak payload yang malformed. +- `admin/add` memvalidasi bentuk ini untuk `kind: "telegram"` dan menolak payload yang tidak valid. ### Menambahkan channel ke QA @@ -173,7 +173,7 @@ Menambahkan channel ke sistem QA markdown memerlukan tepat dua hal: 1. Adapter transport untuk channel tersebut. 2. Paket skenario yang menjalankan kontrak channel. -Jangan menambahkan root perintah QA tingkat atas baru ketika host bersama `qa-lab` dapat +Jangan tambahkan root perintah QA tingkat atas baru ketika host bersama `qa-lab` dapat memiliki alur tersebut. `qa-lab` memiliki mekanisme host bersama: @@ -188,35 +188,35 @@ memiliki alur tersebut. Plugin runner memiliki kontrak transport: -- bagaimana `openclaw qa ` dipasang di bawah root `qa` bersama -- bagaimana Gateway dikonfigurasi untuk transport tersebut -- bagaimana kesiapan diperiksa -- bagaimana event masuk diinjeksi -- bagaimana pesan keluar diamati -- bagaimana transkrip dan status transport yang dinormalisasi diekspos -- bagaimana aksi berbasis transport dijalankan -- bagaimana reset atau cleanup khusus transport ditangani +- cara `openclaw qa ` di-mount di bawah root `qa` bersama +- cara gateway dikonfigurasi untuk transport tersebut +- cara readiness diperiksa +- cara event masuk disuntikkan +- cara pesan keluar diamati +- cara transkrip dan status transport yang dinormalisasi diekspos +- cara aksi berbasis transport dijalankan +- cara reset atau cleanup khusus transport ditangani Batas adopsi minimum untuk channel baru adalah: 1. Tetap jadikan `qa-lab` sebagai pemilik root `qa` bersama. -2. Implementasikan runner transport pada seam host bersama `qa-lab`. -3. Simpan mekanisme khusus transport di dalam plugin runner atau harness channel. -4. Pasang runner sebagai `openclaw qa ` alih-alih mendaftarkan root perintah pesaing. +2. Implementasikan runner transport pada seam host `qa-lab` bersama. +3. Simpan mekanisme khusus transport di dalam plugin runner atau harness plugin channel. +4. Mount runner sebagai `openclaw qa ` alih-alih mendaftarkan root perintah pesaing. Plugin runner harus mendeklarasikan `qaRunners` di `openclaw.plugin.json` dan mengekspor array `qaRunnerCliRegistrations` yang sesuai dari `runtime-api.ts`. - Jaga `runtime-api.ts` tetap ringan; CLI malas dan eksekusi runner harus tetap berada di balik entrypoint terpisah. + Jaga agar `runtime-api.ts` tetap ringan; eksekusi CLI dan runner yang lazy harus tetap berada di balik entrypoint terpisah. 5. Tulis atau adaptasi skenario markdown di bawah `qa/scenarios/`. 6. Gunakan helper skenario generik untuk skenario baru. 7. Pertahankan alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja. -Aturan keputusannya ketat: +Aturan keputusan bersifat ketat: -- Jika perilaku bisa diekspresikan sekali di `qa-lab`, taruh di `qa-lab`. +- Jika perilaku dapat diekspresikan satu kali di `qa-lab`, letakkan di `qa-lab`. - Jika perilaku bergantung pada satu transport channel, simpan di plugin runner atau harness plugin tersebut. -- Jika suatu skenario memerlukan kapabilitas baru yang dapat digunakan lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. -- Jika suatu perilaku hanya bermakna untuk satu transport, buat skenario tetap khusus transport dan nyatakan itu secara eksplisit dalam kontrak skenario. +- Jika skenario memerlukan capability baru yang dapat digunakan lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. +- Jika suatu perilaku hanya bermakna untuk satu transport, pertahankan skenario tetap khusus transport dan jelaskan itu secara eksplisit dalam kontrak skenario. -Nama helper generik yang disarankan untuk skenario baru adalah: +Nama helper generik yang diprioritaskan untuk skenario baru adalah: - `waitForTransportReady` - `waitForChannelReady` @@ -239,245 +239,245 @@ Alias kompatibilitas tetap tersedia untuk skenario yang ada, termasuk: - `formatConversationTranscript` - `resetBus` -Pekerjaan channel baru sebaiknya menggunakan nama helper generik. -Alias kompatibilitas ada untuk menghindari migrasi besar sekaligus, bukan sebagai model untuk +Pekerjaan channel baru harus menggunakan nama helper generik. +Alias kompatibilitas ada untuk menghindari migrasi flag day, bukan sebagai model untuk penulisan skenario baru. ## Suite pengujian (apa yang berjalan di mana) -Bayangkan suite sebagai “realisme yang meningkat” (serta meningkatnya flakiness/biaya): +Anggap suite sebagai “realisme yang meningkat” (dan meningkatnya flakiness/biaya): -### Unit / integrasi (bawaan) +### Unit / integrasi (default) - Perintah: `pnpm test` - Konfigurasi: sepuluh run shard berurutan (`vitest.full-*.config.ts`) di atas project Vitest terlingkup yang sudah ada - File: inventaris core/unit di bawah `src/**/*.test.ts`, `packages/**/*.test.ts`, `test/**/*.test.ts`, dan pengujian node `ui` yang di-whitelist yang dicakup oleh `vitest.unit.config.ts` - Cakupan: - Pengujian unit murni - - Pengujian integrasi in-process (auth Gateway, routing, tooling, parsing, config) + - Pengujian integrasi in-process (autentikasi gateway, routing, tooling, parsing, config) - Regresi deterministik untuk bug yang sudah diketahui - Ekspektasi: - Berjalan di CI - - Tidak memerlukan kunci nyata + - Tidak memerlukan key nyata - Harus cepat dan stabil - Catatan project: - - `pnpm test` tanpa target sekarang menjalankan sebelas konfigurasi shard yang lebih kecil (`core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang besar. Ini mengurangi RSS puncak pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension menghambat suite yang tidak terkait. - - `pnpm test --watch` tetap menggunakan graf project native root `vitest.config.ts`, karena loop watch multi-shard tidak praktis. - - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane terlingkup terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` tidak perlu membayar biaya startup penuh root project. - - `pnpm test:changed` memperluas path git yang berubah ke lane terlingkup yang sama saat diff hanya menyentuh file sumber/pengujian yang dapat dirutekan; edit config/setup tetap fallback ke rerun root-project yang luas. - - Pengujian unit ringan impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file stateful/berat saat runtime tetap berada di lane yang ada. - - Beberapa file sumber helper `plugin-sdk` dan `commands` yang dipilih juga memetakan run mode-changed ke pengujian sibling eksplisit di lane ringan tersebut, sehingga edit helper menghindari rerun suite berat penuh untuk direktori itu. - - `auto-reply` sekarang memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness balasan terberat agar tidak masuk ke pengujian status/chunk/token yang murah. + - `pnpm test` tanpa target sekarang menjalankan sebelas konfigurasi shard yang lebih kecil (`core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang besar. Ini mengurangi puncak RSS pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension menghambat suite yang tidak terkait. + - `pnpm test --watch` tetap menggunakan graph project native root `vitest.config.ts`, karena loop watch multi-shard tidak praktis. + - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui jalur terlingkup terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` tidak perlu membayar biaya startup penuh root project. + - `pnpm test:changed` memperluas path git yang berubah ke jalur terlingkup yang sama ketika diff hanya menyentuh file source/test yang dapat dirutekan; edit config/setup tetap fallback ke rerun root-project yang luas. + - Pengujian unit ringan impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui jalur `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file stateful/berat runtime tetap berada di jalur yang ada. + - Beberapa file source helper `plugin-sdk` dan `commands` yang dipilih juga memetakan run mode changed ke pengujian sibling eksplisit di jalur ringan tersebut, sehingga edit helper tidak memicu rerun suite berat penuh untuk direktori itu. + - `auto-reply` sekarang memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness reply yang paling berat agar tidak membebani pengujian status/chunk/token yang murah. - Catatan embedded runner: - - Saat Anda mengubah input discovery message-tool atau konteks runtime Compaction, + - Saat Anda mengubah input penemuan message-tool atau konteks runtime Compaction, pertahankan kedua tingkat cakupan. - Tambahkan regresi helper yang terfokus untuk batas routing/normalisasi murni. - - Juga jaga suite integrasi embedded runner tetap sehat: + - Juga pertahankan suite integrasi embedded runner tetap sehat: `src/agents/pi-embedded-runner/compact.hooks.test.ts`, `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`, dan `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - Suite tersebut memverifikasi bahwa id terlingkup dan perilaku Compaction tetap mengalir - melalui path `run.ts` / `compact.ts` yang nyata; pengujian helper saja bukan + - Suite tersebut memverifikasi bahwa ID terlingkup dan perilaku Compaction tetap mengalir + melalui path nyata `run.ts` / `compact.ts`; pengujian helper saja bukan pengganti yang memadai untuk path integrasi tersebut. - Catatan pool: - - Konfigurasi dasar Vitest sekarang bawaan ke `threads`. - - Konfigurasi Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh konfigurasi root projects, e2e, dan live. - - Lane UI root mempertahankan setup dan optimizer `jsdom`-nya, tetapi sekarang juga berjalan pada runner non-isolated bersama. - - Tiap shard `pnpm test` mewarisi bawaan `threads` + `isolate: false` yang sama dari konfigurasi Vitest bersama. - - Launcher bersama `scripts/run-vitest.mjs` sekarang juga menambahkan `--no-maglev` untuk proses child Node Vitest secara bawaan guna mengurangi churn kompilasi V8 selama run lokal besar. Set `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkannya dengan perilaku V8 bawaan. + - Konfigurasi dasar Vitest sekarang menggunakan default `threads`. + - Konfigurasi Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh konfigurasi root project, e2e, dan live. + - Jalur UI root mempertahankan setup dan optimizer `jsdom`, tetapi sekarang juga berjalan pada runner non-isolated bersama. + - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari konfigurasi Vitest bersama. + - Launcher bersama `scripts/run-vitest.mjs` sekarang juga menambahkan `--no-maglev` untuk proses Node child Vitest secara default guna mengurangi churn kompilasi V8 selama run lokal besar. Tetapkan `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan dengan perilaku V8 bawaan. - Catatan iterasi lokal cepat: - - `pnpm test:changed` merutekan melalui lane terlingkup saat path yang berubah terpetakan dengan rapi ke suite yang lebih kecil. + - `pnpm test:changed` merutekan melalui jalur terlingkup ketika path yang berubah dipetakan dengan bersih ke suite yang lebih kecil. - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku routing yang sama, hanya dengan batas worker yang lebih tinggi. - - Auto-scaling worker lokal sekarang memang dibuat konservatif dan juga mundur saat load average host sudah tinggi, sehingga beberapa run Vitest serentak secara bawaan mengurangi dampak. - - Konfigurasi dasar Vitest menandai project/file config sebagai `forceRerunTriggers` agar rerun mode-changed tetap benar saat wiring pengujian berubah. - - Konfigurasi mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; set `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. + - Auto-scaling worker lokal sekarang sengaja lebih konservatif dan juga mengurangi beban saat load average host sudah tinggi, sehingga beberapa run Vitest serentak secara default tidak terlalu merusak. + - Konfigurasi dasar Vitest menandai project/file konfigurasi sebagai `forceRerunTriggers` agar rerun mode changed tetap benar saat wiring pengujian berubah. + - Konfigurasi mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; tetapkan `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. - Catatan debug performa: - - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest plus output rincian impor. - - `pnpm test:perf:imports:changed` mencakup tampilan profiling yang sama ke file yang berubah sejak `origin/main`. -- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan terhadap path native root-project untuk diff yang sudah di-commit tersebut dan mencetak wall time plus RSS maksimum macOS. -- `pnpm test:perf:changed:bench -- --worktree` membenchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi root Vitest. - - `pnpm test:perf:profile:main` menulis profil CPU thread utama untuk overhead startup dan transform Vitest/Vite. + - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest beserta output rincian impor. + - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke file yang berubah sejak `origin/main`. +- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan dengan path native root-project untuk diff yang sudah di-commit tersebut dan mencetak wall time serta RSS maksimum macOS. +- `pnpm test:perf:changed:bench -- --worktree` melakukan benchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi root Vitest. + - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk startup Vitest/Vite dan overhead transform. - `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk suite unit dengan paralelisme file dinonaktifkan. -### E2E (smoke Gateway) +### E2E (smoke gateway) - Perintah: `pnpm test:e2e` - Konfigurasi: `vitest.e2e.config.ts` - File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts` -- Bawaan runtime: +- Default runtime: - Menggunakan Vitest `threads` dengan `isolate: false`, sesuai dengan bagian repo lainnya. - - Menggunakan worker adaptif (CI: hingga 2, lokal: 1 secara bawaan). - - Berjalan dalam mode senyap secara bawaan untuk mengurangi overhead I/O konsol. + - Menggunakan worker adaptif (CI: hingga 2, lokal: 1 secara default). + - Berjalan dalam mode senyap secara default untuk mengurangi overhead I/O konsol. - Override yang berguna: - `OPENCLAW_E2E_WORKERS=` untuk memaksa jumlah worker (dibatasi hingga 16). - `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali output konsol verbose. - Cakupan: - - Perilaku end-to-end Gateway multi-instance - - Surface WebSocket/HTTP, pairing Node, dan jaringan yang lebih berat + - Perilaku end-to-end gateway multi-instance + - Surface WebSocket/HTTP, pairing node, dan networking yang lebih berat - Ekspektasi: - - Berjalan di CI (saat diaktifkan dalam pipeline) - - Tidak memerlukan kunci nyata - - Lebih banyak komponen bergerak dibanding pengujian unit (bisa lebih lambat) + - Berjalan di CI (saat diaktifkan di pipeline) + - Tidak memerlukan key nyata + - Lebih banyak bagian bergerak dibanding pengujian unit (bisa lebih lambat) ### E2E: smoke backend OpenShell - Perintah: `pnpm test:e2e:openshell` - File: `test/openshell-sandbox.e2e.test.ts` - Cakupan: - - Memulai Gateway OpenShell terisolasi di host melalui Docker + - Memulai gateway OpenShell terisolasi pada host melalui Docker - Membuat sandbox dari Dockerfile lokal sementara - - Menjalankan backend OpenShell OpenClaw melalui `sandbox ssh-config` + exec SSH nyata + - Menjalankan backend OpenShell milik OpenClaw melalui `sandbox ssh-config` nyata + eksekusi SSH - Memverifikasi perilaku filesystem remote-canonical melalui bridge fs sandbox - Ekspektasi: - - Hanya opt-in; bukan bagian dari run bawaan `pnpm test:e2e` - - Memerlukan CLI `openshell` lokal plus daemon Docker yang berfungsi - - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan Gateway dan sandbox pengujian + - Hanya opt-in; bukan bagian dari run default `pnpm test:e2e` + - Memerlukan CLI `openshell` lokal serta daemon Docker yang berfungsi + - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan gateway dan sandbox pengujian - Override yang berguna: - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manual - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI nonbawaan atau skrip wrapper + - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk mengarahkan ke biner CLI non-default atau wrapper script ### Live (provider nyata + model nyata) - Perintah: `pnpm test:live` - Konfigurasi: `vitest.live.config.ts` - File: `src/**/*.live.test.ts` -- Bawaan: **diaktifkan** oleh `pnpm test:live` (mengatur `OPENCLAW_LIVE_TEST=1`) +- Default: **diaktifkan** oleh `pnpm test:live` (menetapkan `OPENCLAW_LIVE_TEST=1`) - Cakupan: - “Apakah provider/model ini benar-benar berfungsi _hari ini_ dengan kredensial nyata?” - - Menangkap perubahan format provider, keanehan pemanggilan tool, masalah auth, dan perilaku rate limit + - Menangkap perubahan format provider, keanehan tool-calling, masalah autentikasi, dan perilaku rate limit - Ekspektasi: - - Secara desain tidak stabil di CI (jaringan nyata, kebijakan provider nyata, kuota, gangguan) - - Menghabiskan biaya / menggunakan rate limit - - Utamakan menjalankan subset yang dipersempit alih-alih “semuanya” -- Run live mengambil sumber `~/.profile` untuk mengambil kunci API yang belum ada. -- Secara bawaan, run live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara agar fixture unit tidak dapat memodifikasi `~/.openclaw` Anda yang nyata. -- Set `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang sengaja memerlukan pengujian live untuk menggunakan direktori home nyata Anda. -- `pnpm test:live` sekarang secara bawaan menggunakan mode yang lebih senyap: mempertahankan output progres `[live] ...`, tetapi menyembunyikan pemberitahuan `~/.profile` tambahan dan membisukan log bootstrap Gateway/obrolan Bonjour. Set `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup lengkap kembali. -- Rotasi kunci API (khusus provider): set `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian mencoba ulang pada respons rate limit. + - Secara desain tidak stabil di CI (jaringan nyata, kebijakan provider nyata, kuota, outage) + - Berbiaya / menggunakan rate limit + - Utamakan menjalankan subset yang dipersempit, bukan “semuanya” +- Run live mengambil source `~/.profile` untuk mengambil API key yang belum ada. +- Secara default, run live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara agar fixture unit tidak dapat mengubah `~/.openclaw` Anda yang nyata. +- Tetapkan `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang sengaja memerlukan pengujian live menggunakan direktori home nyata Anda. +- `pnpm test:live` sekarang default ke mode yang lebih senyap: ia mempertahankan output progres `[live] ...`, tetapi menekan notifikasi `~/.profile` tambahan dan membisukan log bootstrap gateway/chatter Bonjour. Tetapkan `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup lengkap kembali. +- Rotasi API key (khusus provider): tetapkan `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian melakukan retry pada respons rate limit. - Output progres/heartbeat: - - Suite live sekarang memancarkan baris progres ke stderr sehingga pemanggilan provider yang panjang tampak aktif bahkan saat penangkapan konsol Vitest senyap. - - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/Gateway mengalir segera selama run live. + - Suite live sekarang mengirim baris progres ke stderr sehingga panggilan provider yang panjang tampak aktif bahkan saat penangkapan konsol Vitest sedang senyap. + - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway langsung di-stream selama run live. - Sesuaikan heartbeat direct-model dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. - - Sesuaikan heartbeat Gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - Sesuaikan heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. ## Suite mana yang sebaiknya saya jalankan? Gunakan tabel keputusan ini: -- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda banyak mengubah) -- Menyentuh jaringan Gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` -- Men-debug “bot saya down” / kegagalan khusus provider / pemanggilan tool: jalankan `pnpm test:live` yang dipersempit +- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda mengubah banyak hal) +- Menyentuh networking gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` +- Men-debug “bot saya down” / kegagalan khusus provider / tool calling: jalankan `pnpm test:live` yang dipersempit -## Live: sapuan kapabilitas Node Android +## Live: penyisiran capability node Android - Pengujian: `src/gateway/android-node.capabilities.live.test.ts` - Skrip: `pnpm android:test:integration` -- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh Node Android yang terhubung dan menegaskan perilaku kontrak perintah. +- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh node Android yang terhubung dan menegaskan perilaku kontrak perintah. - Cakupan: - - Setup manual/prasyarat (suite ini tidak menginstal/menjalankan/melakukan pairing aplikasi). - - Validasi `node.invoke` Gateway per perintah untuk Node Android yang dipilih. + - Setup manual/prasyarat (suite ini tidak memasang/menjalankan/melakukan pairing aplikasi). + - Validasi gateway `node.invoke` per perintah untuk node Android yang dipilih. - Pra-setup yang diperlukan: - - Aplikasi Android sudah terhubung + dipairing ke Gateway. + - Aplikasi Android sudah terhubung + dipairing ke gateway. - Aplikasi tetap berada di foreground. - - Izin/persetujuan capture diberikan untuk kapabilitas yang Anda harapkan lolos. + - Izin/persetujuan capture diberikan untuk capability yang Anda harapkan lolos. - Override target opsional: - `OPENCLAW_ANDROID_NODE_ID` atau `OPENCLAW_ANDROID_NODE_NAME`. - `OPENCLAW_ANDROID_GATEWAY_URL` / `OPENCLAW_ANDROID_GATEWAY_TOKEN` / `OPENCLAW_ANDROID_GATEWAY_PASSWORD`. -- Detail setup Android lengkap: [Aplikasi Android](/id/platforms/android) +- Detail setup Android lengkap: [Android App](/id/platforms/android) -## Live: smoke model (kunci profile) +## Live: smoke model (key profil) -Pengujian live dibagi menjadi dua lapisan agar kita bisa mengisolasi kegagalan: +Pengujian live dibagi menjadi dua lapisan sehingga kita dapat mengisolasi kegagalan: -- “Direct model” memberi tahu kita apakah provider/model dapat menjawab sama sekali dengan kunci yang diberikan. -- “Gateway smoke” memberi tahu kita apakah pipeline Gateway+agen penuh berfungsi untuk model tersebut (sesi, riwayat, tool, kebijakan sandbox, dll.). +- “Direct model” memberi tahu kita apakah provider/model dapat menjawab sama sekali dengan key yang diberikan. +- “Gateway smoke” memberi tahu kita apakah pipeline gateway+agen penuh berfungsi untuk model tersebut (session, riwayat, tools, kebijakan sandbox, dll.). -### Lapisan 1: penyelesaian model langsung (tanpa Gateway) +### Lapisan 1: Penyelesaian model langsung (tanpa gateway) - Pengujian: `src/agents/models.profiles.live.test.ts` - Tujuan: - - Menginventarisasi model yang ditemukan + - Mengenumerasi model yang ditemukan - Menggunakan `getApiKeyForModel` untuk memilih model yang Anda miliki kredensialnya - - Menjalankan penyelesaian kecil per model (dan regresi terarah bila perlu) + - Menjalankan completion kecil per model (dan regresi terarah bila diperlukan) - Cara mengaktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) -- Set `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) untuk benar-benar menjalankan suite ini; jika tidak, suite ini dilewati agar `pnpm test:live` tetap fokus pada smoke Gateway +- Tetapkan `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite akan skip agar `pnpm test:live` tetap fokus pada smoke gateway - Cara memilih model: - `OPENCLAW_LIVE_MODELS=modern` untuk menjalankan allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_MODELS=all` adalah alias untuk allowlist modern - atau `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist dipisahkan koma) - - Sapuan modern/all secara bawaan menggunakan batas terkurasi dengan sinyal tinggi; set `OPENCLAW_LIVE_MAX_MODELS=0` untuk sapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Penyisiran modern/all secara default dibatasi pada kurasi dengan sinyal tinggi; tetapkan `OPENCLAW_LIVE_MAX_MODELS=0` untuk penyisiran modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. - Cara memilih provider: - `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist dipisahkan koma) -- Dari mana kunci berasal: - - Secara bawaan: profile store dan fallback env - - Set `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksakan **profile store** saja -- Mengapa ini ada: - - Memisahkan “API provider rusak / kunci tidak valid” dari “pipeline agen Gateway rusak” - - Memuat regresi kecil dan terisolasi (contoh: replay reasoning OpenAI Responses/Codex Responses + alur tool-call) +- Asal key: + - Secara default: profile store dan fallback env + - Tetapkan `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa **hanya** profile store +- Alasan ini ada: + - Memisahkan “API provider rusak / key tidak valid” dari “pipeline agen gateway rusak” + - Menampung regresi kecil dan terisolasi (contoh: replay penalaran OpenAI Responses/Codex Responses + alur tool-call) -### Lapisan 2: smoke Gateway + agen dev (apa yang sebenarnya dilakukan "@openclaw") +### Lapisan 2: smoke Gateway + agen dev (yang sebenarnya dilakukan "@openclaw") - Pengujian: `src/gateway/gateway-models.profiles.live.test.ts` - Tujuan: - - Menyalakan Gateway in-process - - Membuat/menambal sesi `agent:dev:*` (override model per run) - - Mengiterasi model-dengan-kunci dan menegaskan: - - respons yang “bermakna” (tanpa tool) - - pemanggilan tool nyata berfungsi (probe `read`) - - probe tool tambahan opsional (probe `exec+read`) + - Menyalakan gateway in-process + - Membuat/menambal session `agent:dev:*` (override model per run) + - Mengiterasi model-dengan-key dan menegaskan: + - respons yang “bermakna” (tanpa tools) + - satu pemanggilan tool nyata berfungsi (probe read) + - probe tool tambahan opsional (probe exec+read) - path regresi OpenAI (hanya tool-call → tindak lanjut) tetap berfungsi -- Detail probe (agar Anda bisa menjelaskan kegagalan dengan cepat): - - probe `read`: pengujian menulis file nonce di workspace lalu meminta agen untuk `read` file itu dan menggemakan nonce kembali. - - probe `exec+read`: pengujian meminta agen untuk menulis nonce ke file sementara melalui `exec`, lalu `read` file itu kembali. - - probe image: pengujian melampirkan PNG yang dihasilkan (kucing + kode acak) dan mengharapkan model mengembalikan `cat `. +- Detail probe (agar Anda dapat menjelaskan kegagalan dengan cepat): + - probe `read`: pengujian menulis file nonce di workspace dan meminta agen untuk `read` file itu dan mengembalikan nonce tersebut. + - probe `exec+read`: pengujian meminta agen untuk menulis nonce ke file sementara melalui `exec`, lalu membacanya kembali dengan `read`. + - probe image: pengujian melampirkan PNG yang dibuat secara generatif (kucing + kode yang diacak) dan mengharapkan model mengembalikan `cat `. - Referensi implementasi: `src/gateway/gateway-models.profiles.live.test.ts` dan `src/gateway/live-image-probe.ts`. - Cara mengaktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - Cara memilih model: - - Bawaan: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) + - Default: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_GATEWAY_MODELS=all` adalah alias untuk allowlist modern - - Atau set `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit - - Sapuan Gateway modern/all secara bawaan menggunakan batas terkurasi dengan sinyal tinggi; set `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Atau tetapkan `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit + - Penyisiran gateway modern/all secara default dibatasi pada kurasi dengan sinyal tinggi; tetapkan `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk penyisiran modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. - Cara memilih provider (hindari “semua OpenRouter”): - `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"` (allowlist dipisahkan koma) - Probe tool + image selalu aktif dalam pengujian live ini: - probe `read` + probe `exec+read` (stress tool) - probe image berjalan saat model mengiklankan dukungan input image - Alur (tingkat tinggi): - - Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) + - Pengujian membuat PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) - Mengirimkannya melalui `agent` `attachments: [{ mimeType: "image/png", content: "" }]` - - Gateway mem-parse lampiran ke `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) + - Gateway mengurai lampiran menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) - Agen embedded meneruskan pesan pengguna multimodal ke model - Penegasan: balasan berisi `cat` + kode tersebut (toleransi OCR: kesalahan kecil diperbolehkan) -Tip: untuk melihat apa yang bisa Anda uji di mesin Anda (dan id `provider/model` yang tepat), jalankan: +Tip: untuk melihat apa yang dapat Anda uji di mesin Anda (dan ID `provider/model` yang tepat), jalankan: ```bash openclaw models list openclaw models list --json ``` -## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lain) +## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lainnya) - Pengujian: `src/gateway/gateway-cli-backend.live.test.ts` -- Tujuan: memvalidasi pipeline Gateway + agen menggunakan backend CLI lokal, tanpa menyentuh config bawaan Anda. -- Bawaan smoke khusus backend berada bersama definisi `cli-backend.ts` milik extension yang memilikinya. +- Tujuan: memvalidasi pipeline Gateway + agen menggunakan backend CLI lokal, tanpa menyentuh config default Anda. +- Default smoke khusus backend berada bersama definisi `cli-backend.ts` milik extension yang memilikinya. - Aktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - `OPENCLAW_LIVE_CLI_BACKEND=1` -- Bawaan: - - Provider/model bawaan: `claude-cli/claude-sonnet-4-6` - - Perilaku perintah/argumen/image berasal dari metadata plugin backend CLI yang memilikinya. +- Default: + - Provider/model default: `claude-cli/claude-sonnet-4-6` + - Perilaku command/args/image berasal dari metadata plugin backend CLI yang memilikinya. - Override (opsional): - `OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"` - `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"` - `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'` - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran image nyata (path diinjeksi ke prompt). + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran image nyata (path disuntikkan ke prompt). - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path file image sebagai argumen CLI alih-alih injeksi prompt. - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol bagaimana argumen image diteruskan saat `IMAGE_ARG` diatur. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol cara argumen image diteruskan saat `IMAGE_ARG` ditetapkan. - `OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1` untuk mengirim giliran kedua dan memvalidasi alur resume. - - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas sesi yang sama bawaan Claude Sonnet -> Opus (set ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). + - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas session yang sama Claude Sonnet -> Opus secara default (tetapkan ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). Contoh: @@ -505,24 +505,24 @@ pnpm test:docker:live-cli-backend:gemini Catatan: - Runner Docker berada di `scripts/test-live-cli-backend-docker.sh`. -- Runner ini menjalankan smoke CLI-backend live di dalam image Docker repo sebagai pengguna `node` non-root. -- Runner ini menyelesaikan metadata smoke CLI dari extension yang memilikinya, lalu memasang paket CLI Linux yang sesuai (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (bawaan: `~/.cache/openclaw/docker-cli-tools`). -- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth langganan portabel Claude Code melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Runner ini terlebih dahulu membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env var kunci API Anthropic. Lane subscription ini menonaktifkan probe MCP/tool dan image Claude secara bawaan karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas normal paket langganan. -- Smoke CLI-backend live sekarang menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI Gateway. -- Smoke bawaan Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi bahwa sesi yang dilanjutkan masih mengingat catatan sebelumnya. +- Runner ini menjalankan smoke CLI-backend live di dalam image Docker repo sebagai pengguna non-root `node`. +- Runner ini menyelesaikan metadata smoke CLI dari extension yang memilikinya, lalu memasang paket CLI Linux yang sesuai (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix yang dapat ditulis dan di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`). +- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth subscription Claude Code portabel melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Runner ini pertama-tama membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env var API key Anthropic. Jalur subscription ini menonaktifkan probe Claude MCP/tool dan image secara default karena saat ini Claude merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas paket subscription normal. +- Smoke CLI-backend live sekarang menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI gateway. +- Smoke default Claude juga menambal session dari Sonnet ke Opus dan memverifikasi bahwa session yang dilanjutkan masih mengingat catatan sebelumnya. ## Live: smoke bind ACP (`/acp spawn ... --bind here`) - Pengujian: `src/gateway/gateway-acp-bind.live.test.ts` -- Tujuan: memvalidasi alur conversation-bind ACP nyata dengan agen ACP live: +- Tujuan: memvalidasi alur bind percakapan ACP nyata dengan agen ACP live: - kirim `/acp spawn --bind here` - bind percakapan message-channel sintetis di tempat - kirim tindak lanjut normal pada percakapan yang sama - - verifikasi bahwa tindak lanjut masuk ke transkrip sesi ACP yang di-bind + - verifikasi bahwa tindak lanjut masuk ke transkrip session ACP yang dibind - Aktifkan: - `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts` - `OPENCLAW_LIVE_ACP_BIND=1` -- Bawaan: +- Default: - Agen ACP di Docker: `claude,codex,gemini` - Agen ACP untuk `pnpm test:live ...` langsung: `claude` - Channel sintetis: konteks percakapan gaya DM Slack @@ -534,8 +534,8 @@ Catatan: - `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini` - `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@'` - Catatan: - - Lane ini menggunakan surface Gateway `chat.send` dengan field originating-route sintetis khusus admin agar pengujian dapat melampirkan konteks message-channel tanpa berpura-pura mengirimkannya secara eksternal. - - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak diatur, pengujian menggunakan registry agen bawaan milik plugin `acpx` embedded untuk agen harness ACP yang dipilih. + - Jalur ini menggunakan surface gateway `chat.send` dengan field originating-route sintetis khusus admin agar pengujian dapat melampirkan konteks message-channel tanpa berpura-pura mengirim secara eksternal. + - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak ditetapkan, pengujian menggunakan registry agen bawaan plugin `acpx` embedded untuk agen harness ACP yang dipilih. Contoh: @@ -562,31 +562,30 @@ pnpm test:docker:live-acp-bind:gemini Catatan Docker: - Runner Docker berada di `scripts/test-live-acp-bind-docker.sh`. -- Secara bawaan, runner ini menjalankan smoke bind ACP terhadap semua agen CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. +- Secara default, runner ini menjalankan smoke bind ACP terhadap semua agen CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. - Gunakan `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude`, `OPENCLAW_LIVE_ACP_BIND_AGENTS=codex`, atau `OPENCLAW_LIVE_ACP_BIND_AGENTS=gemini` untuk mempersempit matriks. -- Runner ini mengambil sumber `~/.profile`, men-stage materi auth CLI yang sesuai ke container, memasang `acpx` ke prefix npm writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. -- Di dalam Docker, runner menetapkan `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx mempertahankan env var provider dari profile yang di-source tetap tersedia untuk CLI harness child. +- Runner ini mengambil source `~/.profile`, men-stage materi autentikasi CLI yang sesuai ke dalam container, memasang `acpx` ke prefix npm yang dapat ditulis, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. +- Di dalam Docker, runner menetapkan `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx tetap menyediakan env var provider dari profile yang di-source ke CLI harness child. ## Live: smoke harness app-server Codex -- Tujuan: memvalidasi harness Codex milik plugin melalui metode `agent` - Gateway normal: +- Tujuan: memvalidasi harness Codex milik plugin melalui method + `agent` gateway normal: - memuat plugin `codex` bawaan - memilih `OPENCLAW_AGENT_RUNTIME=codex` - - mengirim giliran agen Gateway pertama ke `codex/gpt-5.4` - - mengirim giliran kedua ke sesi OpenClaw yang sama dan memverifikasi bahwa thread app-server + - mengirim giliran agen gateway pertama ke `codex/gpt-5.4` + - mengirim giliran kedua ke session OpenClaw yang sama dan memverifikasi bahwa thread app-server dapat dilanjutkan - - menjalankan `/codex status` dan `/codex models` melalui path perintah Gateway - yang sama + - menjalankan `/codex status` dan `/codex models` melalui path perintah gateway yang sama - Pengujian: `src/gateway/gateway-codex-harness.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_CODEX_HARNESS=1` -- Model bawaan: `codex/gpt-5.4` +- Model default: `codex/gpt-5.4` - Probe image opsional: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` - Probe MCP/tool opsional: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` -- Smoke ini menetapkan `OPENCLAW_AGENT_HARNESS_FALLBACK=none` agar harness Codex yang rusak - tidak bisa lolos dengan diam-diam fallback ke PI. -- Auth: `OPENAI_API_KEY` dari shell/profile, ditambah salinan opsional - `~/.codex/auth.json` dan `~/.codex/config.toml` +- Smoke ini menetapkan `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex yang rusak + tidak dapat lolos dengan diam-diam fallback ke PI. +- Auth: `OPENAI_API_KEY` dari shell/profile, ditambah opsional + `~/.codex/auth.json` dan `~/.codex/config.toml` yang disalin Resep lokal: @@ -609,45 +608,45 @@ pnpm test:docker:live-codex-harness Catatan Docker: - Runner Docker berada di `scripts/test-live-codex-harness-docker.sh`. -- Runner ini mengambil sumber `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file auth CLI Codex - saat ada, memasang `@openai/codex` ke prefix npm writable yang di-mount, +- Runner ini mengambil source `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file + auth CLI Codex jika ada, memasang `@openai/codex` ke prefix npm yang dapat ditulis dan di-mount, men-stage source tree, lalu hanya menjalankan pengujian live Codex-harness. -- Docker mengaktifkan probe image dan MCP/tool secara bawaan. Set +- Docker mengaktifkan probe image dan MCP/tool secara default. Tetapkan `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0` atau `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` saat Anda memerlukan run debug yang lebih sempit. - Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, sesuai dengan konfigurasi pengujian live - sehingga fallback `openai-codex/*` atau PI tidak dapat menyembunyikan regresi - harness Codex. + sehingga fallback `openai-codex/*` atau PI tidak dapat menyembunyikan + regresi harness Codex. ### Resep live yang direkomendasikan -Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling tidak flaky: +Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling tidak flakey: -- Model tunggal, langsung (tanpa Gateway): +- Model tunggal, langsung (tanpa gateway): - `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts` -- Model tunggal, smoke Gateway: +- Model tunggal, smoke gateway: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -- Pemanggilan tool di beberapa provider: +- Tool calling di beberapa provider: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -- Fokus Google (kunci API Gemini + Antigravity): - - Gemini (kunci API): `OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` +- Fokus Google (API key Gemini + Antigravity): + - Gemini (API key): `OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` - Antigravity (OAuth): `OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` Catatan: -- `google/...` menggunakan API Gemini (kunci API). +- `google/...` menggunakan API Gemini (API key). - `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agen gaya Cloud Code Assist). -- `google-gemini-cli/...` menggunakan CLI Gemini lokal di mesin Anda (auth terpisah + keanehan tooling). -- API Gemini vs CLI Gemini: - - API: OpenClaw memanggil API Gemini hosted milik Google melalui HTTP (auth kunci API / profile); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”. - - CLI: OpenClaw melakukan shell-out ke biner `gemini` lokal; ia memiliki auth sendiri dan bisa berperilaku berbeda (streaming/dukungan tool/version skew). +- `google-gemini-cli/...` menggunakan Gemini CLI lokal di mesin Anda (autentikasi terpisah + keanehan tooling). +- Gemini API vs Gemini CLI: + - API: OpenClaw memanggil API Gemini yang di-host Google melalui HTTP (autentikasi API key / profil); inilah yang biasanya dimaksud kebanyakan pengguna dengan “Gemini”. + - CLI: OpenClaw menjalankan biner `gemini` lokal; ia memiliki autentikasinya sendiri dan dapat berperilaku berbeda (streaming/dukungan tool/perbedaan versi). ## Live: matriks model (apa yang kami cakup) -Tidak ada “daftar model CI” yang tetap (live bersifat opt-in), tetapi ini adalah model-model **yang direkomendasikan** untuk dicakup secara rutin di mesin dev dengan kunci. +Tidak ada “daftar model CI” yang tetap (live bersifat opt-in), tetapi berikut adalah model yang **direkomendasikan** untuk dicakup secara rutin pada mesin dev dengan key. ### Set smoke modern (tool calling + image) @@ -661,7 +660,7 @@ Ini adalah run “model umum” yang kami harapkan tetap berfungsi: - Z.AI (GLM): `zai/glm-4.7` - MiniMax: `minimax/MiniMax-M2.7` -Jalankan smoke Gateway dengan tool + image: +Jalankan smoke gateway dengan tools + image: `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` ### Baseline: tool calling (Read + Exec opsional) @@ -676,42 +675,42 @@ Pilih setidaknya satu per keluarga provider: Cakupan tambahan opsional (bagus jika ada): -- xAI: `xai/grok-4` (atau versi terbaru yang tersedia) -- Mistral: `mistral/`… (pilih satu model yang mampu `tools` yang Anda aktifkan) -- Cerebras: `cerebras/`… (jika Anda punya akses) +- xAI: `xai/grok-4` (atau yang terbaru tersedia) +- Mistral: `mistral/`… (pilih satu model yang mampu menjalankan tools dan telah Anda aktifkan) +- Cerebras: `cerebras/`… (jika Anda memiliki akses) - LM Studio: `lmstudio/`… (lokal; tool calling bergantung pada mode API) ### Vision: pengiriman image (lampiran → pesan multimodal) -Sertakan setidaknya satu model yang mampu memproses image dalam `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dll.) untuk menjalankan probe image. +Sertakan setidaknya satu model yang mendukung image dalam `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dll.) untuk menjalankan probe image. -### Agregator / Gateway alternatif +### Aggregator / gateway alternatif -Jika Anda mengaktifkan kunci, kami juga mendukung pengujian melalui: +Jika Anda telah mengaktifkan key, kami juga mendukung pengujian melalui: - OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mendukung tool+image) -- OpenCode: `opencode/...` untuk Zen dan `opencode-go/...` untuk Go (auth melalui `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) +- OpenCode: `opencode/...` untuk Zen dan `opencode-go/...` untuk Go (autentikasi melalui `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) -Provider lain yang bisa Anda sertakan dalam matriks live (jika Anda punya kredensial/config): +Provider lain yang dapat Anda sertakan dalam matriks live (jika Anda memiliki kredensial/config): - Bawaan: `openai`, `openai-codex`, `anthropic`, `google`, `google-vertex`, `google-antigravity`, `google-gemini-cli`, `zai`, `openrouter`, `opencode`, `opencode-go`, `xai`, `groq`, `cerebras`, `mistral`, `github-copilot` -- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), ditambah proxy yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.) +- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), ditambah proxy apa pun yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.) -Tip: jangan mencoba meng-hardcode “semua model” di dokumen. Daftar yang otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + kunci apa pun yang tersedia. +Tip: jangan mencoba melakukan hardcode “semua model” di dokumen. Daftar otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + key apa pun yang tersedia. -## Kredensial (jangan pernah commit) +## Kredensial (jangan pernah di-commit) Pengujian live menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktis: -- Jika CLI berfungsi, pengujian live seharusnya menemukan kunci yang sama. +- Jika CLI berfungsi, pengujian live seharusnya menemukan key yang sama. - Jika pengujian live mengatakan “tidak ada kredensial”, debug dengan cara yang sama seperti Anda men-debug `openclaw models list` / pemilihan model. -- Profile auth per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud dengan “kunci profile” dalam pengujian live) +- Profil autentikasi per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah arti “profile keys” dalam pengujian live) - Config: `~/.openclaw/openclaw.json` (atau `OPENCLAW_CONFIG_PATH`) -- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live yang di-stage saat ada, tetapi bukan penyimpanan utama kunci profile) -- Run lokal live secara bawaan menyalin config aktif, file `auth-profiles.json` per agen, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara; home live yang di-stage melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap tidak menyentuh workspace host nyata Anda. +- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live yang di-stage jika ada, tetapi bukan penyimpanan utama profile key) +- Run lokal live secara default menyalin config aktif, file `auth-profiles.json` per agen, `credentials/` lama, dan direktori autentikasi CLI eksternal yang didukung ke home pengujian sementara; home live yang di-stage melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap berada di luar workspace host nyata Anda. -Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile` Anda), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (mereka dapat me-mount `~/.profile` ke dalam container). +Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile` Anda), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (mereka dapat me-mount `~/.profile` ke dalam container). ## Live Deepgram (transkripsi audio) @@ -724,26 +723,26 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile` Anda), - Aktifkan: `BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts` - Override model opsional: `BYTEPLUS_CODING_MODEL=ark-code-latest` -## Live media alur kerja ComfyUI +## Live media workflow ComfyUI - Pengujian: `extensions/comfy/comfy.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts` - Cakupan: - Menjalankan path image, video, dan `music_generate` comfy bawaan - - Melewati tiap kapabilitas kecuali `models.providers.comfy.` dikonfigurasi - - Berguna setelah mengubah pengiriman alur kerja comfy, polling, unduhan, atau registrasi plugin + - Melewati setiap capability kecuali `models.providers.comfy.` telah dikonfigurasi + - Berguna setelah mengubah pengiriman workflow comfy, polling, unduhan, atau pendaftaran plugin -## Live pembuatan image +## Live generasi image - Pengujian: `src/image-generation/runtime.live.test.ts` - Perintah: `pnpm test:live src/image-generation/runtime.live.test.ts` - Harness: `pnpm test:live:media image` - Cakupan: - - Menginventarisasi setiap plugin provider pembuatan image yang terdaftar + - Mengenumerasi setiap plugin provider generasi image yang terdaftar - Memuat env var provider yang belum ada dari shell login Anda (`~/.profile`) sebelum probing - - Secara bawaan menggunakan kunci API live/env sebelum profile auth yang tersimpan, sehingga kunci pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profile/model yang dapat digunakan - - Menjalankan varian pembuatan image stok melalui kapabilitas runtime bersama: + - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga key pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider tanpa auth/profil/model yang dapat digunakan + - Menjalankan varian generasi image bawaan melalui capability runtime bersama: - `google:flash-generate` - `google:pro-generate` - `google:pro-edit` @@ -756,66 +755,66 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile` Anda), - `OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"` - `OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"` - Perilaku auth opsional: - - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksakan auth profile store dan mengabaikan override khusus env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile store dan mengabaikan override yang hanya berbasis env -## Live pembuatan musik +## Live generasi musik - Pengujian: `extensions/music-generation-providers.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts` - Harness: `pnpm test:live:media music` - Cakupan: - - Menjalankan path provider pembuatan musik bawaan bersama + - Menjalankan path provider generasi musik bawaan bersama - Saat ini mencakup Google dan MiniMax - Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing - - Secara bawaan menggunakan kunci API live/env sebelum profile auth yang tersimpan, sehingga kunci pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profile/model yang dapat digunakan + - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga key pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider tanpa auth/profil/model yang dapat digunakan - Menjalankan kedua mode runtime yang dideklarasikan saat tersedia: - `generate` dengan input hanya prompt - `edit` saat provider mendeklarasikan `capabilities.edit.enabled` - - Cakupan lane bersama saat ini: + - Cakupan jalur bersama saat ini: - `google`: `generate`, `edit` - `minimax`: `generate` - - `comfy`: file live Comfy terpisah, bukan sapuan bersama ini + - `comfy`: file live Comfy terpisah, bukan penyisiran bersama ini - Penyempitan opsional: - `OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"` - `OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"` - Perilaku auth opsional: - - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksakan auth profile store dan mengabaikan override khusus env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile store dan mengabaikan override yang hanya berbasis env -## Live pembuatan video +## Live generasi video - Pengujian: `extensions/video-generation-providers.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts` - Harness: `pnpm test:live:media video` - Cakupan: - - Menjalankan path provider pembuatan video bawaan bersama - - Secara bawaan menggunakan path smoke yang aman untuk rilis: provider non-FAL, satu permintaan text-to-video per provider, prompt lobster satu detik, dan batas operasi per provider dari `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` secara bawaan) - - Melewati FAL secara bawaan karena latensi antrean di sisi provider dapat mendominasi waktu rilis; teruskan `--video-providers fal` atau `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"` untuk menjalankannya secara eksplisit + - Menjalankan path provider generasi video bawaan bersama + - Secara default menggunakan path smoke yang aman untuk rilis: provider non-FAL, satu request text-to-video per provider, prompt lobster satu detik, dan batas operasi per provider dari `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS` (`180000` secara default) + - Secara default melewati FAL karena latensi antrean sisi provider dapat mendominasi waktu rilis; berikan `--video-providers fal` atau `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"` untuk menjalankannya secara eksplisit - Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing - - Secara bawaan menggunakan kunci API live/env sebelum profile auth yang tersimpan, sehingga kunci pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profile/model yang dapat digunakan - - Secara bawaan hanya menjalankan `generate` - - Set `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` untuk juga menjalankan mode transform yang dideklarasikan saat tersedia: - - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input image lokal berbasis buffer dalam sapuan bersama - - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam sapuan bersama - - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: - - `vydra` karena `veo3` bawaan hanya teks dan `kling` bawaan memerlukan URL image jarak jauh + - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga key pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider tanpa auth/profil/model yang dapat digunakan + - Secara default hanya menjalankan `generate` + - Tetapkan `OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1` untuk juga menjalankan mode transform yang dideklarasikan saat tersedia: + - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input image lokal berbasis buffer dalam penyisiran bersama + - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam penyisiran bersama + - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam penyisiran bersama: + - `vydra` karena `veo3` bawaan hanya mendukung teks dan `kling` bawaan memerlukan URL image remote - Cakupan Vydra khusus provider: - `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts` - - file itu menjalankan `veo3` text-to-video plus lane `kling` yang secara bawaan menggunakan fixture URL image jarak jauh + - file tersebut menjalankan `veo3` text-to-video ditambah jalur `kling` yang secara default menggunakan fixture URL image remote - Cakupan live `videoToVideo` saat ini: - - `runway` hanya saat model yang dipilih adalah `runway/gen4_aleph` - - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: - - `alibaba`, `qwen`, `xai` karena path tersebut saat ini memerlukan URL referensi jarak jauh `http(s)` / MP4 - - `google` karena lane Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan path itu tidak diterima dalam sapuan bersama - - `openai` karena lane bersama saat ini tidak memiliki jaminan akses inpaint/remix video khusus org + - hanya `runway` saat model yang dipilih adalah `runway/gen4_aleph` + - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam penyisiran bersama: + - `alibaba`, `qwen`, `xai` karena path tersebut saat ini memerlukan URL referensi remote `http(s)` / MP4 + - `google` karena jalur Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan path itu tidak diterima dalam penyisiran bersama + - `openai` karena jalur bersama saat ini tidak memiliki jaminan akses video inpaint/remix khusus org - Penyempitan opsional: - `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="google,openai,runway"` - `OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"` - - `OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""` untuk menyertakan setiap provider dalam sapuan bawaan, termasuk FAL - - `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000` untuk mengurangi batas operasi tiap provider demi run smoke yang agresif + - `OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""` untuk menyertakan setiap provider dalam penyisiran default, termasuk FAL + - `OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000` untuk mengurangi batas operasi tiap provider untuk run smoke yang agresif - Perilaku auth opsional: - - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksakan auth profile store dan mengabaikan override khusus env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile store dan mengabaikan override yang hanya berbasis env ## Harness live media @@ -823,30 +822,30 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile` Anda), - Tujuan: - Menjalankan suite live image, musik, dan video bersama melalui satu entrypoint native repo - Memuat otomatis env var provider yang belum ada dari `~/.profile` - - Secara bawaan mempersempit otomatis tiap suite ke provider yang saat ini memiliki auth yang dapat digunakan - - Menggunakan ulang `scripts/test-live.mjs`, sehingga perilaku heartbeat dan mode senyap tetap konsisten + - Secara default mempersempit otomatis setiap suite ke provider yang saat ini memiliki auth yang dapat digunakan + - Menggunakan kembali `scripts/test-live.mjs`, sehingga perilaku heartbeat dan mode senyap tetap konsisten - Contoh: - `pnpm test:live:media` - `pnpm test:live:media image video --providers openai,google,minimax` - `pnpm test:live:media video --video-providers openai,runway --all-providers` - `pnpm test:live:media music --quiet` -## Runner Docker (opsional, pemeriksaan "berfungsi di Linux") +## Runner Docker (opsional, pemeriksaan “berfungsi di Linux”) Runner Docker ini terbagi menjadi dua kelompok: -- Runner live-model: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config dan workspace lokal Anda (serta mengambil sumber `~/.profile` jika di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. -- Runner live Docker secara bawaan menggunakan batas smoke yang lebih kecil agar sapuan Docker penuh tetap praktis: - `test:docker:live-models` secara bawaan menggunakan `OPENCLAW_LIVE_MAX_MODELS=12`, dan - `test:docker:live-gateway` secara bawaan menggunakan `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, +- Runner live-model: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config dan workspace lokal Anda (serta mengambil source `~/.profile` jika di-mount). Entrypoint lokal yang sesuai adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. +- Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar penyisiran Docker penuh tetap praktis: + `test:docker:live-models` secara default menetapkan `OPENCLAW_LIVE_MAX_MODELS=12`, dan + `test:docker:live-gateway` secara default menetapkan `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`, `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`, dan `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override env var tersebut saat Anda - memang ingin pemindaian menyeluruh yang lebih besar. -- `test:docker:all` membangun image Docker live satu kali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane Docker live tersebut. -- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` menyalakan satu atau lebih container nyata dan memverifikasi path integrasi tingkat lebih tinggi. + memang menginginkan pemindaian menyeluruh yang lebih besar. +- `test:docker:all` membangun image Docker live satu kali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua jalur live Docker tersebut. +- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` menyalakan satu atau lebih container nyata dan memverifikasi path integrasi tingkat tinggi. -Runner Docker live-model juga melakukan bind-mount hanya pada home auth CLI yang diperlukan (atau semuanya yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run sehingga OAuth CLI eksternal dapat menyegarkan token tanpa memodifikasi penyimpanan auth host: +Runner Docker live-model juga hanya melakukan bind-mount pada home auth CLI yang diperlukan (atau semuanya yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run sehingga OAuth CLI eksternal dapat menyegarkan token tanpa mengubah penyimpanan auth host: - Model langsung: `pnpm test:docker:live-models` (skrip: `scripts/test-live-models-docker.sh`) - Smoke bind ACP: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`) @@ -855,102 +854,103 @@ Runner Docker live-model juga melakukan bind-mount hanya pada home auth CLI yang - Gateway + agen dev: `pnpm test:docker:live-gateway` (skrip: `scripts/test-live-gateway-models-docker.sh`) - Smoke live Open WebUI: `pnpm test:docker:openwebui` (skrip: `scripts/e2e/openwebui-docker.sh`) - Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (skrip: `scripts/e2e/onboard-docker.sh`) -- Jaringan Gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) +- Jaringan gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) - Bridge channel MCP (Gateway ber-seed + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) -- Plugin (smoke instalasi + alias `/plugin` + semantik restart bundle Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) +- Plugins (smoke install + alias `/plugin` + semantik restart bundel Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) -Runner Docker live-model juga melakukan bind-mount checkout saat ini sebagai read-only dan +Runner Docker live-model juga melakukan bind-mount pada checkout saat ini dalam mode read-only dan men-stage-nya ke workdir sementara di dalam container. Ini menjaga image runtime -tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang tepat. -Langkah staging melewati cache lokal besar dan output build aplikasi seperti -`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, dan direktori output `.build` lokal aplikasi atau -Gradle sehingga run live Docker tidak menghabiskan beberapa menit untuk menyalin -artefak khusus mesin. -Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` agar probe live Gateway tidak memulai -worker channel nyata Telegram/Discord/dll. di dalam container. +tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang persis. +Langkah staging melewati cache besar yang hanya lokal dan output build aplikasi seperti +`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, dan direktori output `.build` atau +Gradle lokal aplikasi agar run live Docker tidak menghabiskan waktu ber menit-menit untuk menyalin +artefak yang spesifik per mesin. +Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` agar probe live gateway tidak memulai +worker channel Telegram/Discord/dll. nyata di dalam container. `test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan juga -`OPENCLAW_LIVE_GATEWAY_*` saat Anda perlu mempersempit atau mengecualikan cakupan live -Gateway dari lane Docker tersebut. -`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ia memulai -container Gateway OpenClaw dengan endpoint HTTP yang kompatibel OpenAI diaktifkan, -memulai container Open WebUI yang dipin terhadap Gateway tersebut, sign in melalui +`OPENCLAW_LIVE_GATEWAY_*` saat Anda perlu mempersempit atau mengecualikan cakupan +live gateway dari jalur Docker tersebut. +`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ini memulai +container gateway OpenClaw dengan endpoint HTTP yang kompatibel dengan OpenAI diaktifkan, +memulai container Open WebUI yang dipin terhadap gateway tersebut, masuk melalui Open WebUI, memverifikasi `/api/models` mengekspos `openclaw/default`, lalu mengirim -permintaan chat nyata melalui proxy `/api/chat/completions` Open WebUI. +request chat nyata melalui proxy `/api/chat/completions` milik Open WebUI. Run pertama dapat terasa jauh lebih lambat karena Docker mungkin perlu menarik image Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start-nya sendiri. -Lane ini mengharapkan kunci model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` -(`~/.profile` secara bawaan) adalah cara utama untuk menyediakannya pada run dalam Docker. +Jalur ini mengharapkan key model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` +(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam run berbasis Docker. Run yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": "openclaw/default", ... }`. `test:docker:mcp-channels` sengaja dibuat deterministik dan tidak memerlukan -akun Telegram, Discord, atau iMessage nyata. Ia menyalakan container Gateway -ber-seed, memulai container kedua yang menjalankan `openclaw mcp serve`, lalu +akun Telegram, Discord, atau iMessage nyata. Jalur ini menyalakan Gateway ber-seed +dalam container, memulai container kedua yang memunculkan `openclaw mcp serve`, lalu memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, -perilaku antrean event live, routing pengiriman outbound, dan notifikasi channel + -izin gaya Claude melalui bridge MCP stdio nyata. Pemeriksaan notifikasi tersebut -menginspeksi frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang -sebenarnya dipancarkan bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. +perilaku antrean event live, routing pengiriman keluar, serta notifikasi channel + +izin gaya Claude melalui bridge MCP stdio nyata. Pemeriksaan notifikasi +memeriksa frame MCP stdio mentah secara langsung sehingga smoke ini memvalidasi apa yang benar-benar dipancarkan oleh bridge, +bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. -Smoke thread bahasa alami ACP manual (bukan CI): +Smoke thread ACP bahasa alami manual (bukan CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- Pertahankan skrip ini untuk alur kerja regresi/debug. Ini mungkin diperlukan lagi untuk validasi routing thread ACP, jadi jangan dihapus. +- Pertahankan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin diperlukan lagi untuk validasi routing thread ACP, jadi jangan dihapus. Env var yang berguna: -- `OPENCLAW_CONFIG_DIR=...` (bawaan: `~/.openclaw`) di-mount ke `/home/node/.openclaw` -- `OPENCLAW_WORKSPACE_DIR=...` (bawaan: `~/.openclaw/workspace`) di-mount ke `/home/node/.openclaw/workspace` -- `OPENCLAW_PROFILE_FILE=...` (bawaan: `~/.profile`) di-mount ke `/home/node/.profile` dan di-source sebelum menjalankan pengujian -- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (bawaan: `~/.cache/openclaw/docker-cli-tools`) di-mount ke `/home/node/.npm-global` untuk instalasi CLI yang di-cache di dalam Docker -- Direktori/file auth CLI eksternal di bawah `$HOME` di-mount sebagai read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum pengujian dimulai - - Direktori bawaan: `.minimax` - - File bawaan: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` - - Run provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang diinferensikan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - Override secara manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` +- `OPENCLAW_CONFIG_DIR=...` (default: `~/.openclaw`) di-mount ke `/home/node/.openclaw` +- `OPENCLAW_WORKSPACE_DIR=...` (default: `~/.openclaw/workspace`) di-mount ke `/home/node/.openclaw/workspace` +- `OPENCLAW_PROFILE_FILE=...` (default: `~/.profile`) di-mount ke `/home/node/.profile` dan di-source sebelum menjalankan pengujian +- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` untuk memverifikasi hanya env var yang di-source dari `OPENCLAW_PROFILE_FILE`, menggunakan direktori config/workspace sementara dan tanpa mount auth CLI eksternal +- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (default: `~/.cache/openclaw/docker-cli-tools`) di-mount ke `/home/node/.npm-global` untuk instalasi CLI yang di-cache di dalam Docker +- Direktori/file auth CLI eksternal di bawah `$HOME` di-mount read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum pengujian dimulai + - Direktori default: `.minimax` + - File default: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` + - Run provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang disimpulkan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` - `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit run - `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter provider di dalam container -- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan ulang image `openclaw:local-live` yang ada untuk rerun yang tidak memerlukan rebuild +- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan kembali image `openclaw:local-live` yang ada untuk rerun yang tidak memerlukan rebuild - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memastikan kredensial berasal dari profile store (bukan env) -- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh Gateway untuk smoke Open WebUI -- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk override prompt nonce-check yang digunakan oleh smoke Open WebUI -- `OPENWEBUI_IMAGE=...` untuk override tag image Open WebUI yang dipin +- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos gateway untuk smoke Open WebUI +- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk meng-override prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI +- `OPENWEBUI_IMAGE=...` untuk meng-override tag image Open WebUI yang dipin -## Sanitasi dokumen +## Pemeriksaan kewarasan dokumen -Jalankan pemeriksaan dokumen setelah mengedit dokumen: `pnpm check:docs`. -Jalankan validasi anchor Mintlify penuh saat Anda juga membutuhkan pemeriksaan heading dalam halaman: `pnpm docs:check-links:anchors`. +Jalankan pemeriksaan dokumen setelah edit dokumen: `pnpm check:docs`. +Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading dalam halaman: `pnpm docs:check-links:anchors`. ## Regresi offline (aman untuk CI) Ini adalah regresi “pipeline nyata” tanpa provider nyata: -- Pemanggilan tool Gateway (mock OpenAI, Gateway nyata + loop agen): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") -- Wizard Gateway (WS `wizard.start`/`wizard.next`, menulis config + auth ditegakkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") +- Tool calling gateway (mock OpenAI, gateway nyata + loop agen): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- Wizard gateway (WS `wizard.start`/`wizard.next`, menulis config + auth ditegakkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") -## Evals keandalan agen (Skills) +## Evaluasi keandalan agen (Skills) -Kami sudah memiliki beberapa pengujian aman-CI yang berperilaku seperti “evals keandalan agen”: +Kami sudah memiliki beberapa pengujian aman-CI yang berperilaku seperti “evaluasi keandalan agen”: -- Mock tool-calling melalui Gateway nyata + loop agen (`src/gateway/gateway.test.ts`). -- Alur wizard end-to-end yang memvalidasi wiring sesi dan efek config (`src/gateway/gateway.test.ts`). +- Mock tool-calling melalui gateway nyata + loop agen (`src/gateway/gateway.test.ts`). +- Alur wizard end-to-end yang memvalidasi wiring session dan efek config (`src/gateway/gateway.test.ts`). -Yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): +Apa yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): -- **Pengambilan keputusan:** saat Skills dicantumkan di prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)? +- **Pengambilan keputusan:** saat Skills dicantumkan dalam prompt, apakah agen memilih skill yang tepat (atau menghindari skill yang tidak relevan)? - **Kepatuhan:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? -- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan tool, carryover riwayat sesi, dan batas sandbox. +- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan tool, pembawaan riwayat session, dan batas sandbox. -Evals mendatang sebaiknya tetap deterministik terlebih dahulu: +Evaluasi mendatang sebaiknya tetap deterministik terlebih dahulu: -- Runner skenario yang menggunakan mock provider untuk menegaskan pemanggilan tool + urutan, pembacaan file skill, dan wiring sesi. -- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, injeksi prompt). -- Evals live opsional (opt-in, digerbangkan env) hanya setelah suite aman-CI tersedia. +- Runner skenario yang menggunakan mock provider untuk menegaskan pemanggilan tool + urutannya, pembacaan file skill, dan wiring session. +- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, prompt injection). +- Evaluasi live opsional (opt-in, dibatasi env) hanya setelah suite aman-CI tersedia. ## Pengujian kontrak (bentuk plugin dan channel) -Pengujian kontrak memverifikasi bahwa setiap plugin dan channel terdaftar sesuai dengan -kontrak interface-nya. Mereka mengiterasi seluruh plugin yang ditemukan dan menjalankan suite -penegasan bentuk dan perilaku. Lane unit bawaan `pnpm test` dengan sengaja +Pengujian kontrak memverifikasi bahwa setiap plugin dan channel yang terdaftar sesuai dengan +kontrak interface-nya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan rangkaian +penegasan bentuk dan perilaku. Jalur unit default `pnpm test` sengaja melewati file seam dan smoke bersama ini; jalankan perintah kontrak secara eksplisit saat Anda menyentuh surface channel atau provider bersama. @@ -962,28 +962,28 @@ saat Anda menyentuh surface channel atau provider bersama. ### Kontrak channel -Berada di `src/channels/plugins/contracts/*.contract.test.ts`: +Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: -- **plugin** - Bentuk plugin dasar (id, nama, kapabilitas) +- **plugin** - Bentuk plugin dasar (id, nama, capability) - **setup** - Kontrak wizard setup -- **session-binding** - Perilaku binding sesi +- **session-binding** - Perilaku session binding - **outbound-payload** - Struktur payload pesan - **inbound** - Penanganan pesan masuk - **actions** - Handler aksi channel - **threading** - Penanganan ID thread - **directory** - API direktori/roster -- **group-policy** - Penegakan kebijakan grup +- **group-policy** - Penerapan kebijakan grup ### Kontrak status provider -Berada di `src/plugins/contracts/*.contract.test.ts`. +Terletak di `src/plugins/contracts/*.contract.test.ts`. - **status** - Probe status channel - **registry** - Bentuk registry plugin ### Kontrak provider -Berada di `src/plugins/contracts/*.contract.test.ts`: +Terletak di `src/plugins/contracts/*.contract.test.ts`: - **auth** - Kontrak alur auth - **auth-choice** - Pilihan/seleksi auth @@ -994,23 +994,23 @@ Berada di `src/plugins/contracts/*.contract.test.ts`: - **shape** - Bentuk/interface plugin - **wizard** - Wizard setup -### Kapan dijalankan +### Kapan harus menjalankan - Setelah mengubah ekspor atau subpath plugin-sdk - Setelah menambahkan atau memodifikasi plugin channel atau provider -- Setelah merombak registrasi atau penemuan plugin +- Setelah me-refactor pendaftaran atau penemuan plugin -Pengujian kontrak berjalan di CI dan tidak memerlukan kunci API nyata. +Pengujian kontrak berjalan di CI dan tidak memerlukan API key nyata. ## Menambahkan regresi (panduan) -Saat Anda memperbaiki masalah provider/model yang ditemukan dalam live: +Saat Anda memperbaiki masalah provider/model yang ditemukan di live: -- Tambahkan regresi aman-CI jika memungkinkan (mock/stub provider, atau tangkap transformasi bentuk permintaan yang tepat) -- Jika secara inheren hanya live (rate limit, kebijakan auth), buat pengujian live tetap sempit dan opt-in melalui env var -- Utamakan menargetkan lapisan terkecil yang menangkap bug: - - bug konversi/replay permintaan provider → pengujian model langsung - - bug pipeline sesi/riwayat/tool Gateway → smoke live Gateway atau pengujian mock Gateway aman-CI +- Tambahkan regresi yang aman-CI jika memungkinkan (mock/stub provider, atau tangkap transformasi bentuk request yang tepat) +- Jika secara inheren hanya-live (rate limit, kebijakan auth), pertahankan pengujian live tetap sempit dan opt-in melalui env var +- Pilih lapisan terkecil yang menangkap bug tersebut: + - bug konversi/replay request provider → pengujian direct models + - bug pipeline gateway session/riwayat/tool → smoke gateway live atau pengujian mock gateway aman-CI - Guardrail traversal SecretRef: - - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registry (`listSecretTargetRegistryEntries()`), lalu menegaskan bahwa id exec segmen traversal ditolak. - - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian tersebut. Pengujian ini sengaja gagal pada id target yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam. + - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registry (`listSecretTargetRegistryEntries()`), lalu menegaskan bahwa ID exec segmen traversal ditolak. + - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian tersebut. Pengujian ini sengaja gagal pada ID target yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam. diff --git a/docs/id/providers/github-copilot.md b/docs/id/providers/github-copilot.md index 625738765..55c08fbfc 100644 --- a/docs/id/providers/github-copilot.md +++ b/docs/id/providers/github-copilot.md @@ -1,31 +1,27 @@ --- read_when: - - Anda ingin menggunakan GitHub Copilot sebagai provider model + - Anda ingin menggunakan GitHub Copilot sebagai penyedia model - Anda memerlukan alur `openclaw models auth login-github-copilot` -summary: Masuk ke GitHub Copilot dari OpenClaw menggunakan device flow +summary: Masuk ke GitHub Copilot dari OpenClaw menggunakan alur perangkat title: GitHub Copilot x-i18n: - generated_at: "2026-04-12T23:30:48Z" + generated_at: "2026-04-15T14:40:35Z" model: gpt-5.4 provider: openai - source_hash: 51fee006e7d4e78e37b0c29356b0090b132de727d99b603441767d3fb642140b + source_hash: b8258fecff22fb73b057de878462941f6eb86d0c5f775c5eac4840e95ba5eccf source_path: providers/github-copilot.md workflow: 15 --- # GitHub Copilot -GitHub Copilot adalah asisten coding AI dari GitHub. Ini menyediakan akses ke model -Copilot untuk akun dan paket GitHub Anda. OpenClaw dapat menggunakan Copilot sebagai provider model -dengan dua cara yang berbeda. +GitHub Copilot adalah asisten coding AI dari GitHub. Layanan ini memberikan akses ke model Copilot untuk akun dan paket GitHub Anda. OpenClaw dapat menggunakan Copilot sebagai penyedia model dengan dua cara yang berbeda. ## Dua cara menggunakan Copilot di OpenClaw - - Gunakan alur login perangkat native untuk mendapatkan token GitHub, lalu menukarkannya dengan - token API Copilot saat OpenClaw berjalan. Ini adalah jalur **default** dan paling sederhana - karena tidak memerlukan VS Code. + + Gunakan alur login perangkat bawaan untuk memperoleh token GitHub, lalu menukarkannya dengan token API Copilot saat OpenClaw berjalan. Ini adalah jalur **default** dan paling sederhana karena tidak memerlukan VS Code. @@ -33,10 +29,9 @@ dengan dua cara yang berbeda. openclaw models auth login-github-copilot ``` - Anda akan diminta mengunjungi URL dan memasukkan kode satu kali. Biarkan - terminal tetap terbuka sampai selesai. + Anda akan diminta mengunjungi URL dan memasukkan kode sekali pakai. Biarkan terminal tetap terbuka sampai proses selesai. - + ```bash openclaw models set github-copilot/gpt-4o ``` @@ -53,13 +48,11 @@ dengan dua cara yang berbeda. - - Gunakan ekstensi VS Code **Copilot Proxy** sebagai bridge lokal. OpenClaw berbicara ke - endpoint `/v1` milik proxy dan menggunakan daftar model yang Anda konfigurasikan di sana. + + Gunakan ekstensi VS Code **Copilot Proxy** sebagai jembatan lokal. OpenClaw berkomunikasi dengan endpoint `/v1` milik proxy dan menggunakan daftar model yang Anda konfigurasikan di sana. - Pilih ini ketika Anda sudah menjalankan Copilot Proxy di VS Code atau perlu merutekan - melaluinya. Anda harus mengaktifkan Plugin dan menjaga ekstensi VS Code tetap berjalan. + Pilih ini jika Anda sudah menjalankan Copilot Proxy di VS Code atau perlu merutekan melalui layanan tersebut. Anda harus mengaktifkan Plugin dan tetap menjalankan ekstensi VS Code. @@ -67,70 +60,100 @@ dengan dua cara yang berbeda. ## Flag opsional -| Flag | Deskripsi | -| --------------- | ---------------------------------------------------- | -| `--yes` | Lewati prompt konfirmasi | -| `--set-default` | Terapkan juga model default yang direkomendasikan provider | +| Flag | Deskripsi | +| --------------- | --------------------------------------------------- | +| `--yes` | Lewati prompt konfirmasi | +| `--set-default` | Juga terapkan model default yang direkomendasikan penyedia | ```bash # Lewati konfirmasi openclaw models auth login-github-copilot --yes -# Login dan setel model default dalam satu langkah +# Login dan tetapkan model default dalam satu langkah openclaw models auth login --provider github-copilot --method device --set-default ``` - - Alur login perangkat memerlukan TTY interaktif. Jalankan langsung di - terminal, bukan di skrip non-interaktif atau pipeline CI. + + Alur login perangkat memerlukan TTY interaktif. Jalankan langsung di terminal, bukan dalam skrip non-interaktif atau pipeline CI. - Ketersediaan model Copilot bergantung pada paket GitHub Anda. Jika suatu model - ditolak, coba ID lain (misalnya `github-copilot/gpt-4.1`). + Ketersediaan model Copilot bergantung pada paket GitHub Anda. Jika sebuah model ditolak, coba ID lain (misalnya `github-copilot/gpt-4.1`). - ID model Claude menggunakan transport Anthropic Messages secara otomatis. GPT, - model seri-o, dan Gemini tetap menggunakan transport OpenAI Responses. OpenClaw - memilih transport yang benar berdasarkan ref model. + ID model Claude secara otomatis menggunakan transport Anthropic Messages. Model GPT, o-series, dan Gemini tetap menggunakan transport OpenAI Responses. OpenClaw memilih transport yang benar berdasarkan ref model. - - OpenClaw menyelesaikan auth Copilot dari variabel environment dalam - urutan prioritas berikut: + + OpenClaw menyelesaikan auth Copilot dari variabel lingkungan dengan urutan prioritas berikut: - | Prioritas | Variabel | Catatan | - | --------- | --------------------- | ------------------------------------- | - | 1 | `COPILOT_GITHUB_TOKEN` | Prioritas tertinggi, khusus Copilot | - | 2 | `GH_TOKEN` | Token GitHub CLI (fallback) | - | 3 | `GITHUB_TOKEN` | Token GitHub standar (terendah) | + | Priority | Variable | Notes | + | -------- | --------------------- | -------------------------------- | + | 1 | `COPILOT_GITHUB_TOKEN` | Prioritas tertinggi, khusus Copilot | + | 2 | `GH_TOKEN` | Token GitHub CLI (fallback) | + | 3 | `GITHUB_TOKEN` | Token GitHub standar (terendah) | - Saat beberapa variabel disetel, OpenClaw menggunakan yang berprioritas tertinggi. - Alur login perangkat (`openclaw models auth login-github-copilot`) menyimpan - tokennya di penyimpanan profil auth dan memiliki prioritas di atas semua - variabel environment. + Saat beberapa variabel ditetapkan, OpenClaw menggunakan yang prioritasnya paling tinggi. + Alur login perangkat (`openclaw models auth login-github-copilot`) menyimpan tokennya di penyimpanan profil auth dan memiliki prioritas lebih tinggi daripada semua variabel lingkungan. - Login menyimpan token GitHub di penyimpanan profil auth dan menukarkannya - dengan token API Copilot saat OpenClaw berjalan. Anda tidak perlu mengelola - token secara manual. + Login menyimpan token GitHub di penyimpanan profil auth dan menukarkannya dengan token API Copilot saat OpenClaw berjalan. Anda tidak perlu mengelola token secara manual. -Memerlukan TTY interaktif. Jalankan perintah login langsung di terminal, bukan -di dalam skrip headless atau job CI. +Memerlukan TTY interaktif. Jalankan perintah login langsung di terminal, bukan di dalam skrip headless atau job CI. +## Embedding pencarian memori + +GitHub Copilot juga dapat berfungsi sebagai penyedia embedding untuk +[pencarian memori](/id/concepts/memory-search). Jika Anda memiliki langganan Copilot dan +sudah login, OpenClaw dapat menggunakannya untuk embedding tanpa kunci API terpisah. + +### Deteksi otomatis + +Saat `memorySearch.provider` adalah `"auto"` (default), GitHub Copilot dicoba +pada prioritas 15 -- setelah embedding lokal tetapi sebelum OpenAI dan penyedia +berbayar lainnya. Jika token GitHub tersedia, OpenClaw menemukan model +embedding yang tersedia dari API Copilot dan secara otomatis memilih yang terbaik. + +### Config eksplisit + +```json5 +{ + agents: { + defaults: { + memorySearch: { + provider: "github-copilot", + // Opsional: ganti model yang ditemukan secara otomatis + model: "text-embedding-3-small", + }, + }, + }, +} +``` + +### Cara kerjanya + +1. OpenClaw menyelesaikan token GitHub Anda (dari variabel lingkungan atau profil auth). +2. Menukarkannya dengan token API Copilot berumur pendek. +3. Mengueri endpoint `/models` Copilot untuk menemukan model embedding yang tersedia. +4. Memilih model terbaik (lebih memilih `text-embedding-3-small`). +5. Mengirim permintaan embedding ke endpoint `/embeddings` Copilot. + +Ketersediaan model bergantung pada paket GitHub Anda. Jika tidak ada model embedding yang +tersedia, OpenClaw melewati Copilot dan mencoba penyedia berikutnya. + ## Terkait - Memilih provider, ref model, dan perilaku failover. + Memilih penyedia, ref model, dan perilaku failover. Detail auth dan aturan penggunaan ulang kredensial. diff --git a/docs/id/providers/ollama.md b/docs/id/providers/ollama.md index 5e96cbf29..1c21f2eba 100644 --- a/docs/id/providers/ollama.md +++ b/docs/id/providers/ollama.md @@ -5,29 +5,29 @@ read_when: summary: Jalankan OpenClaw dengan Ollama (model cloud dan lokal) title: Ollama x-i18n: - generated_at: "2026-04-12T23:31:51Z" + generated_at: "2026-04-15T14:40:48Z" model: gpt-5.4 provider: openai - source_hash: ec796241b884ca16ec7077df4f3f1910e2850487bb3ea94f8fdb37c77e02b219 + source_hash: 098e083e0fc484bddb5270eb630c55d7832039b462d1710372b6afece5cefcdf source_path: providers/ollama.md workflow: 15 --- # Ollama -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 melakukan opt-in dengan `OLLAMA_API_KEY` (atau profil auth) dan tidak mendefinisikan entri `models.providers.ollama` secara eksplisit. +OpenClaw terintegrasi dengan API native Ollama (`/api/chat`) untuk model cloud yang dihosting dan server Ollama lokal/self-hosted. Anda dapat menggunakan Ollama dalam tiga mode: `Cloud + Local` melalui host Ollama yang dapat dijangkau, `Cloud only` terhadap `https://ollama.com`, atau `Local only` terhadap host Ollama yang dapat dijangkau. -**Pengguna Ollama remote**: Jangan gunakan URL OpenAI-compatible `/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`). +**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`). ## Memulai -Pilih metode penyiapan dan mode yang Anda inginkan. +Pilih metode dan mode penyiapan yang Anda inginkan. - **Terbaik untuk:** jalur tercepat menuju penyiapan Ollama yang berfungsi dengan penemuan model otomatis. + **Paling cocok untuk:** cara tercepat menuju penyiapan Ollama cloud atau lokal yang berfungsi. @@ -35,18 +35,17 @@ Pilih metode penyiapan dan mode yang Anda inginkan. openclaw onboard ``` - Pilih **Ollama** dari daftar provider. + Pilih **Ollama** dari daftar penyedia. - - **Cloud + Local** — model yang dihosting di cloud dan model lokal sekaligus - - **Local** — hanya model lokal - - Jika Anda memilih **Cloud + Local** dan belum masuk ke ollama.com, onboarding akan membuka alur masuk browser. + - **Cloud + Local** — host Ollama lokal ditambah model cloud yang dirutekan melalui host tersebut + - **Cloud only** — model Ollama yang dihosting melalui `https://ollama.com` + - **Local only** — hanya model lokal - Onboarding menemukan model yang tersedia dan menyarankan default. Onboarding akan otomatis menarik model yang dipilih jika model tersebut belum tersedia secara lokal. + `Cloud only` meminta `OLLAMA_API_KEY` dan menyarankan default cloud yang dihosting. `Cloud + Local` dan `Local only` meminta URL dasar Ollama, menemukan model yang tersedia, dan secara otomatis menarik model lokal yang dipilih jika belum tersedia. `Cloud + Local` juga memeriksa apakah host Ollama tersebut sudah masuk untuk akses cloud. - + ```bash openclaw models list --provider ollama ``` @@ -61,7 +60,7 @@ Pilih metode penyiapan dan mode yang Anda inginkan. --accept-risk ``` - Secara opsional tentukan base URL atau model kustom: + Secara opsional tentukan URL dasar atau model kustom: ```bash openclaw onboard --non-interactive \ @@ -74,13 +73,15 @@ Pilih metode penyiapan dan mode yang Anda inginkan. - **Terbaik untuk:** kontrol penuh atas instalasi, penarikan model, dan konfigurasi. + **Paling cocok untuk:** kontrol penuh atas penyiapan cloud atau lokal. - - Unduh dari [ollama.com/download](https://ollama.com/download). + + - **Cloud + Local**: instal Ollama, masuk dengan `ollama signin`, dan rutekan permintaan cloud melalui host tersebut + - **Cloud only**: gunakan `https://ollama.com` dengan `OLLAMA_API_KEY` + - **Local only**: instal Ollama dari [ollama.com/download](https://ollama.com/download) - + ```bash ollama pull gemma4 # atau @@ -89,31 +90,27 @@ Pilih metode penyiapan dan mode yang Anda inginkan. ollama pull llama3.3 ``` - - Jika Anda juga menginginkan model cloud: - - ```bash - ollama signin - ``` - - Setel nilai apa pun untuk API key (Ollama tidak memerlukan key sungguhan): + Untuk `Cloud only`, gunakan `OLLAMA_API_KEY` asli Anda. Untuk penyiapan berbasis host, nilai placeholder apa pun dapat digunakan: ```bash - # Setel variabel environment + # Cloud + export OLLAMA_API_KEY="your-ollama-api-key" + + # Hanya lokal export OLLAMA_API_KEY="ollama-local" - # Atau konfigurasi di file config Anda - openclaw config set models.providers.ollama.apiKey "ollama-local" + # Atau konfigurasi di file konfigurasi Anda + openclaw config set models.providers.ollama.apiKey "OLLAMA_API_KEY" ``` - + ```bash openclaw models list openclaw models set ollama/gemma4 ``` - Atau setel default di konfigurasi: + Atau atur default di konfigurasi: ```json5 { @@ -134,41 +131,46 @@ Pilih metode penyiapan dan mode yang Anda inginkan. - Model cloud memungkinkan Anda menjalankan model yang dihosting di cloud bersama model lokal Anda. Contohnya termasuk `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, dan `glm-5.1:cloud` -- model-model ini **tidak** memerlukan `ollama pull` lokal. + `Cloud + Local` menggunakan host Ollama yang dapat dijangkau sebagai titik kontrol untuk model lokal dan cloud. Ini adalah alur hibrida yang direkomendasikan oleh Ollama. - 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. + Gunakan **Cloud + Local** saat penyiapan. OpenClaw meminta URL dasar Ollama, menemukan model lokal dari host tersebut, dan memeriksa apakah host sudah masuk untuk akses cloud dengan `ollama signin`. Saat host sudah masuk, OpenClaw juga menyarankan default cloud yang dihosting seperti `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, dan `glm-5.1:cloud`. - Anda juga dapat masuk langsung di [ollama.com/signin](https://ollama.com/signin). - - OpenClaw saat ini menyarankan default cloud berikut: `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`. + Jika host belum masuk, OpenClaw akan mempertahankan penyiapan hanya lokal sampai Anda menjalankan `ollama signin`. - - Dalam mode hanya lokal, OpenClaw menemukan model dari instance Ollama lokal. Tidak perlu masuk ke cloud. + + `Cloud only` berjalan terhadap API hosted Ollama di `https://ollama.com`. + + Gunakan **Cloud only** saat penyiapan. OpenClaw meminta `OLLAMA_API_KEY`, menetapkan `baseUrl: "https://ollama.com"`, dan mengisi daftar model cloud yang dihosting. Jalur ini **tidak** memerlukan server Ollama lokal atau `ollama signin`. + + + + + Dalam mode hanya lokal, OpenClaw menemukan model dari instance Ollama yang dikonfigurasi. Jalur ini ditujukan untuk server Ollama lokal atau self-hosted. OpenClaw saat ini menyarankan `gemma4` sebagai default lokal. -## Penemuan model (provider implisit) +## Penemuan model (penyedia implisit) -Saat Anda menyetel `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`. -| Behavior | Detail | -| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Kueri katalog | Mengueri `/api/tags` | -| Deteksi kemampuan | Menggunakan lookup `/api/show` best-effort untuk membaca `contextWindow` dan mendeteksi kemampuan (termasuk vision) | -| Model vision | Model dengan kemampuan `vision` yang dilaporkan oleh `/api/show` ditandai sebagai mampu-gambar (`input: ["text", "image"]`), sehingga OpenClaw otomatis menyuntikkan gambar ke prompt | -| Deteksi reasoning | Menandai `reasoning` dengan heuristik nama model (`r1`, `reasoning`, `think`) | -| Batas token | Menyetel `maxTokens` ke batas maksimum token default Ollama yang digunakan oleh OpenClaw | -| Biaya | Menyetel semua biaya ke `0` | +| Perilaku | Detail | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Kueri katalog | Mengueri `/api/tags` | +| Deteksi kapabilitas | Menggunakan lookup `/api/show` best-effort untuk membaca `contextWindow` dan mendeteksi kapabilitas (termasuk vision) | +| Model vision | Model dengan kapabilitas `vision` yang dilaporkan oleh `/api/show` ditandai sebagai mampu menerima gambar (`input: ["text", "image"]`), sehingga OpenClaw secara otomatis menyisipkan gambar ke prompt | +| Deteksi penalaran | Menandai `reasoning` dengan heuristik nama model (`r1`, `reasoning`, `think`) | +| Batas token | Menetapkan `maxTokens` ke batas maksimum token Ollama default yang digunakan oleh OpenClaw | +| Biaya | Menetapkan semua biaya ke `0` | Ini menghindari entri model manual sambil menjaga katalog tetap selaras dengan instance Ollama lokal. ```bash -# Lihat model apa saja yang tersedia +# Lihat model yang tersedia ollama list openclaw models list ``` @@ -179,48 +181,48 @@ Untuk menambahkan model baru, cukup tarik dengan Ollama: ollama pull mistral ``` -Model baru akan otomatis ditemukan dan tersedia untuk digunakan. +Model baru akan ditemukan secara otomatis dan tersedia untuk digunakan. -Jika Anda menyetel `models.providers.ollama` secara eksplisit, penemuan otomatis dilewati dan Anda harus mendefinisikan model secara manual. Lihat bagian konfigurasi eksplisit di bawah. +Jika Anda menetapkan `models.providers.ollama` secara eksplisit, penemuan otomatis dilewati dan Anda harus mendefinisikan model secara manual. Lihat bagian konfigurasi eksplisit di bawah. ## Konfigurasi - Cara paling sederhana untuk mengaktifkan Ollama adalah melalui variabel environment: + Jalur aktivasi hanya lokal yang paling sederhana adalah melalui variabel lingkungan: ```bash export OLLAMA_API_KEY="ollama-local" ``` - Jika `OLLAMA_API_KEY` disetel, Anda dapat menghilangkan `apiKey` pada entri provider dan OpenClaw akan mengisinya untuk pemeriksaan ketersediaan. + Jika `OLLAMA_API_KEY` ditetapkan, Anda dapat menghilangkan `apiKey` di entri penyedia dan OpenClaw akan mengisinya untuk pemeriksaan ketersediaan. - Gunakan konfigurasi eksplisit saat Ollama berjalan di host/port lain, Anda ingin memaksakan context window atau daftar model tertentu, atau Anda menginginkan definisi model yang sepenuhnya manual. + Gunakan konfigurasi eksplisit saat Anda menginginkan penyiapan cloud yang dihosting, Ollama berjalan di host/port lain, Anda ingin memaksakan jendela konteks atau daftar model tertentu, atau Anda ingin definisi model sepenuhnya manual. ```json5 { models: { providers: { ollama: { - baseUrl: "http://ollama-host:11434", - apiKey: "ollama-local", + baseUrl: "https://ollama.com", + apiKey: "OLLAMA_API_KEY", api: "ollama", models: [ { - id: "gpt-oss:20b", - name: "GPT-OSS 20B", + id: "kimi-k2.5:cloud", + name: "kimi-k2.5:cloud", reasoning: false, - input: ["text"], + input: ["text", "image"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 8192, - maxTokens: 8192 * 10 + contextWindow: 128000, + maxTokens: 8192 } ] } @@ -231,7 +233,7 @@ Jika Anda menyetel `models.providers.ollama` secara eksplisit, penemuan otomatis - + Jika Ollama berjalan di host atau port yang berbeda (konfigurasi eksplisit menonaktifkan penemuan otomatis, jadi definisikan model secara manual): ```json5 @@ -241,7 +243,7 @@ Jika Anda menyetel `models.providers.ollama` secara eksplisit, penemuan otomatis ollama: { apiKey: "ollama-local", baseUrl: "http://ollama-host:11434", // Tanpa /v1 - gunakan URL API native Ollama - api: "ollama", // Setel secara eksplisit untuk menjamin perilaku pemanggilan tool native + api: "ollama", // Tetapkan secara eksplisit untuk menjamin perilaku pemanggilan tool native }, }, }, @@ -249,7 +251,7 @@ Jika Anda menyetel `models.providers.ollama` secara eksplisit, penemuan otomatis ``` - Jangan tambahkan `/v1` ke URL. Jalur `/v1` menggunakan mode OpenAI-compatible, di mana pemanggilan tool tidak andal. Gunakan URL dasar Ollama tanpa sufiks path. + Jangan tambahkan `/v1` ke URL. Jalur `/v1` menggunakan mode kompatibel OpenAI, tempat pemanggilan tool tidak andal. Gunakan URL dasar Ollama tanpa sufiks jalur. @@ -272,17 +274,17 @@ Setelah dikonfigurasi, semua model Ollama Anda tersedia: } ``` -## Ollama Web Search +## Pencarian Web Ollama -OpenClaw mendukung **Ollama Web Search** sebagai provider `web_search` bawaan. +OpenClaw mendukung **Ollama Web Search** sebagai penyedia `web_search` bawaan. -| Property | Detail | -| ----------- | ----------------------------------------------------------------------------------------------------------------- | -| Host | Menggunakan host Ollama yang dikonfigurasi (`models.providers.ollama.baseUrl` jika disetel, jika tidak `http://127.0.0.1:11434`) | -| Auth | Tanpa key | -| Requirement | Ollama harus berjalan dan sudah masuk dengan `ollama signin` | +| Properti | Detail | +| ----------- | ------------------------------------------------------------------------------------------------------------------ | +| Host | Menggunakan host Ollama yang dikonfigurasi (`models.providers.ollama.baseUrl` jika ditetapkan, jika tidak `http://127.0.0.1:11434`) | +| Auth | Tidak memerlukan kunci | +| Persyaratan | Ollama harus berjalan dan sudah masuk dengan `ollama signin` | -Pilih **Ollama Web Search** saat `openclaw onboard` atau `openclaw configure --section web`, atau setel: +Pilih **Ollama Web Search** saat `openclaw onboard` atau `openclaw configure --section web`, atau atur: ```json5 { @@ -297,18 +299,18 @@ Pilih **Ollama Web Search** saat `openclaw onboard` atau `openclaw configure --s ``` -Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools/ollama-search). +Untuk detail lengkap penyiapan dan perilaku, lihat [Ollama Web Search](/id/tools/ollama-search). ## Konfigurasi lanjutan - + - **Pemanggilan tool tidak andal dalam mode OpenAI-compatible.** Gunakan mode ini hanya jika Anda memerlukan format OpenAI untuk proxy dan tidak bergantung pada perilaku pemanggilan tool native. + **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. - Jika Anda perlu menggunakan endpoint OpenAI-compatible sebagai gantinya (misalnya, di balik proxy yang hanya mendukung format OpenAI), setel `api: "openai-completions"` secara eksplisit: + Jika Anda perlu menggunakan endpoint kompatibel OpenAI sebagai gantinya (misalnya, di balik proxy yang hanya mendukung format OpenAI), tetapkan `api: "openai-completions"` secara eksplisit: ```json5 { @@ -326,9 +328,9 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools } ``` - Mode ini mungkin tidak mendukung streaming dan pemanggilan tool secara bersamaan. Anda mungkin perlu menonaktifkan streaming dengan `params: { streaming: false }` di konfigurasi model. + Mode ini mungkin tidak mendukung streaming dan pemanggilan tool secara bersamaan. Anda mungkin perlu menonaktifkan streaming dengan `params: { streaming: false }` dalam konfigurasi model. - Saat `api: "openai-completions"` digunakan dengan Ollama, OpenClaw secara default menyuntikkan `options.num_ctx` agar Ollama tidak diam-diam kembali 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 secara default menyisipkan `options.num_ctx` agar Ollama tidak diam-diam kembali ke jendela konteks 4096. Jika proxy/upstream Anda menolak field `options` yang tidak dikenal, nonaktifkan perilaku ini: ```json5 { @@ -348,10 +350,10 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools - - Untuk model yang ditemukan otomatis, OpenClaw menggunakan context window yang dilaporkan oleh Ollama bila tersedia, jika tidak maka kembali ke context window default Ollama yang digunakan oleh OpenClaw. + + Untuk model yang ditemukan secara otomatis, OpenClaw menggunakan jendela konteks yang dilaporkan oleh Ollama jika tersedia, jika tidak maka akan kembali ke jendela konteks Ollama default yang digunakan oleh OpenClaw. - Anda dapat menimpa `contextWindow` dan `maxTokens` dalam konfigurasi provider eksplisit: + Anda dapat mengganti `contextWindow` dan `maxTokens` dalam konfigurasi penyedia eksplisit: ```json5 { @@ -374,7 +376,7 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools - OpenClaw memperlakukan model dengan nama seperti `deepseek-r1`, `reasoning`, atau `think` sebagai model yang mampu reasoning secara default. + OpenClaw memperlakukan model dengan nama seperti `deepseek-r1`, `reasoning`, atau `think` sebagai model yang mendukung reasoning secara default. ```bash ollama pull deepseek-r1:32b @@ -385,20 +387,20 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools - Ollama gratis dan berjalan secara lokal, jadi semua biaya model disetel ke $0. Ini berlaku untuk model yang ditemukan otomatis maupun yang didefinisikan secara manual. + Ollama gratis dan berjalan secara lokal, jadi semua biaya model ditetapkan ke $0. Ini berlaku untuk model yang ditemukan secara otomatis maupun yang didefinisikan secara manual. - Plugin Ollama bawaan mendaftarkan provider embedding memori untuk - [pencarian memori](/id/concepts/memory). Ini menggunakan base URL Ollama dan - API key yang dikonfigurasi. + Plugin Ollama bawaan mendaftarkan penyedia embedding memori untuk + [pencarian memori](/id/concepts/memory). Ini menggunakan URL dasar Ollama + dan API key yang dikonfigurasi. - | Property | Value | + | Properti | Nilai | | ------------- | ------------------- | - | Default model | `nomic-embed-text` | - | Auto-pull | Ya — model embedding ditarik secara otomatis jika belum ada secara lokal | + | Model default | `nomic-embed-text` | + | Tarik otomatis | Ya — model embedding ditarik secara otomatis jika belum ada secara lokal | - Untuk memilih Ollama sebagai provider embedding pencarian memori: + Untuk memilih Ollama sebagai penyedia embedding pencarian memori: ```json5 { @@ -416,7 +418,7 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools Integrasi Ollama OpenClaw menggunakan **API native Ollama** (`/api/chat`) secara default, yang sepenuhnya mendukung streaming dan pemanggilan tool secara bersamaan. Tidak diperlukan konfigurasi khusus. - Jika Anda perlu menggunakan endpoint OpenAI-compatible, lihat bagian "Mode OpenAI-compatible lama" di atas. Streaming dan pemanggilan tool mungkin tidak berfungsi secara bersamaan dalam mode tersebut. + Jika Anda perlu menggunakan endpoint yang kompatibel dengan OpenAI, lihat bagian "Mode kompatibel OpenAI lama" di atas. Streaming dan pemanggilan tool mungkin tidak berfungsi secara bersamaan dalam mode tersebut. @@ -426,7 +428,7 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools - Pastikan Ollama berjalan dan Anda telah menyetel `OLLAMA_API_KEY` (atau profil auth), serta Anda **tidak** mendefinisikan entri `models.providers.ollama` secara eksplisit: + Pastikan Ollama sedang berjalan dan Anda telah menetapkan `OLLAMA_API_KEY` (atau profil autentikasi), dan Anda **tidak** mendefinisikan entri `models.providers.ollama` eksplisit: ```bash ollama serve @@ -444,7 +446,7 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools Jika model Anda tidak tercantum, tarik model tersebut secara lokal atau definisikan secara eksplisit di `models.providers.ollama`. ```bash - ollama list # Lihat apa yang terinstal + ollama list # Lihat yang terinstal ollama pull gemma4 ollama pull gpt-oss:20b ollama pull llama3.3 # Atau model lain @@ -452,11 +454,11 @@ Untuk detail penyiapan dan perilaku lengkap, lihat [Ollama Web Search](/id/tools - + Periksa bahwa Ollama berjalan pada port yang benar: ```bash - # Periksa apakah Ollama sedang berjalan + # Periksa apakah Ollama berjalan ps aux | grep ollama # Atau mulai ulang Ollama @@ -473,8 +475,8 @@ Bantuan lebih lanjut: [Pemecahan masalah](/id/help/troubleshooting) dan [FAQ](/i ## Terkait - - Ringkasan semua provider, ref model, dan perilaku failover. + + Ikhtisar semua penyedia, ref model, dan perilaku failover. Cara memilih dan mengonfigurasi model. diff --git a/docs/id/reference/memory-config.md b/docs/id/reference/memory-config.md index 1320e697d..720aca4a4 100644 --- a/docs/id/reference/memory-config.md +++ b/docs/id/reference/memory-config.md @@ -1,97 +1,98 @@ --- read_when: - - Anda ingin mengonfigurasi provider pencarian memori atau model embedding + - Anda ingin mengonfigurasi penyedia pencarian memori atau model embedding - Anda ingin menyiapkan backend QMD - - Anda ingin menyetel pencarian hibrida, MMR, atau temporal decay + - Anda ingin menyesuaikan pencarian hibrida, MMR, atau peluruhan temporal - Anda ingin mengaktifkan pengindeksan memori multimodal -summary: Semua knob konfigurasi untuk pencarian memori, provider embedding, QMD, pencarian hibrida, dan pengindeksan multimodal +summary: Semua opsi konfigurasi untuk pencarian memori, penyedia embedding, QMD, pencarian hibrida, dan pengindeksan multimodal title: Referensi konfigurasi memori x-i18n: - generated_at: "2026-04-12T23:33:38Z" + generated_at: "2026-04-15T14:41:00Z" model: gpt-5.4 provider: openai - source_hash: 299ca9b69eea292ea557a2841232c637f5c1daf2bc0f73c0a42f7c0d8d566ce2 + source_hash: 334c3c4dac08e864487047d3822c75f96e9e7a97c38be4b4e0cd9e63c4489a53 source_path: reference/memory-config.md workflow: 15 --- # Referensi konfigurasi memori -Halaman ini mencantumkan setiap knob konfigurasi untuk pencarian memori OpenClaw. Untuk -ikhtisar konseptual, lihat: +Halaman ini mencantumkan setiap opsi konfigurasi untuk pencarian memori OpenClaw. Untuk gambaran konseptual, lihat: - [Ikhtisar Memori](/id/concepts/memory) -- cara kerja memori -- [Builtin Engine](/id/concepts/memory-builtin) -- backend SQLite default -- [QMD Engine](/id/concepts/memory-qmd) -- sidecar local-first -- [Pencarian Memori](/id/concepts/memory-search) -- pipeline pencarian dan penyetelan -- [Active Memory](/id/concepts/active-memory) -- mengaktifkan sub-agent memori untuk sesi interaktif +- [Mesin Bawaan](/id/concepts/memory-builtin) -- backend SQLite default +- [Mesin QMD](/id/concepts/memory-qmd) -- sidecar yang mengutamakan lokal +- [Pencarian Memori](/id/concepts/memory-search) -- pipeline pencarian dan penyesuaian +- [Active Memory](/id/concepts/active-memory) -- mengaktifkan sub-agen memori untuk sesi interaktif -Semua pengaturan pencarian memori berada di bawah `agents.defaults.memorySearch` dalam -`openclaw.json` kecuali jika disebutkan lain. +Semua pengaturan pencarian memori berada di bawah `agents.defaults.memorySearch` di +`openclaw.json` kecuali jika dinyatakan lain. -Jika Anda mencari toggle fitur **Active Memory** dan config sub-agent, +Jika Anda mencari tombol fitur **active memory** dan config sub-agen, itu berada di bawah `plugins.entries.active-memory`, bukan `memorySearch`. -Active Memory menggunakan model dua gerbang: +Active memory menggunakan model dua gerbang: -1. plugin harus diaktifkan dan menargetkan id agent saat ini +1. plugin harus diaktifkan dan menargetkan id agen saat ini 2. permintaan harus berupa sesi chat persisten interaktif yang memenuhi syarat Lihat [Active Memory](/id/concepts/active-memory) untuk model aktivasi, -config milik plugin, persistensi transkrip, dan pola rollout yang aman. +config milik plugin, persistensi transkrip, dan pola peluncuran yang aman. --- -## Pemilihan provider +## Pemilihan penyedia -| Key | Tipe | Default | Deskripsi | -| ---------- | --------- | ---------------- | ----------------------------------------------------------------------------------------- | -| `provider` | `string` | terdeteksi otomatis | ID adapter embedding: `openai`, `gemini`, `voyage`, `mistral`, `bedrock`, `ollama`, `local` | -| `model` | `string` | default provider | Nama model embedding | -| `fallback` | `string` | `"none"` | ID adapter fallback saat yang utama gagal | -| `enabled` | `boolean` | `true` | Mengaktifkan atau menonaktifkan pencarian memori | +| Key | Type | Default | Description | +| ---------- | --------- | ---------------- | ------------------------------------------------------------------------------------------------------------- | +| `provider` | `string` | terdeteksi otomatis | ID adaptor embedding: `bedrock`, `gemini`, `github-copilot`, `local`, `mistral`, `ollama`, `openai`, `voyage` | +| `model` | `string` | default penyedia | Nama model embedding | +| `fallback` | `string` | `"none"` | ID adaptor fallback saat yang utama gagal | +| `enabled` | `boolean` | `true` | Mengaktifkan atau menonaktifkan pencarian memori | ### Urutan deteksi otomatis Saat `provider` tidak ditetapkan, OpenClaw memilih yang pertama tersedia: 1. `local` -- jika `memorySearch.local.modelPath` dikonfigurasi dan file tersebut ada. -2. `openai` -- jika key OpenAI dapat di-resolve. -3. `gemini` -- jika key Gemini dapat di-resolve. -4. `voyage` -- jika key Voyage dapat di-resolve. -5. `mistral` -- jika key Mistral dapat di-resolve. -6. `bedrock` -- jika rantai kredensial AWS SDK dapat di-resolve (instance role, access key, profile, SSO, web identity, atau shared config). +2. `github-copilot` -- jika token GitHub Copilot dapat di-resolve (variabel lingkungan atau profil auth). +3. `openai` -- jika kunci OpenAI dapat di-resolve. +4. `gemini` -- jika kunci Gemini dapat di-resolve. +5. `voyage` -- jika kunci Voyage dapat di-resolve. +6. `mistral` -- jika kunci Mistral dapat di-resolve. +7. `bedrock` -- jika rantai kredensial AWS SDK berhasil di-resolve (peran instance, access key, profil, SSO, identitas web, atau config bersama). -`ollama` didukung tetapi tidak terdeteksi otomatis (tetapkan secara eksplisit). +`ollama` didukung tetapi tidak dideteksi otomatis (tetapkan secara eksplisit). ### Resolusi kunci API Embedding jarak jauh memerlukan kunci API. Bedrock menggunakan rantai kredensial default AWS SDK -sebagai gantinya (instance role, SSO, access key). +sebagai gantinya (peran instance, SSO, access key). -| Provider | Env var | Key config | -| -------- | ------------------------------ | ---------------------------------- | -| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` | -| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` | -| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` | -| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` | -| Bedrock | Rantai kredensial AWS | Tidak memerlukan kunci API | -| Ollama | `OLLAMA_API_KEY` (placeholder) | -- | +| Provider | Env var | Config key | +| -------------- | -------------------------------------------------- | --------------------------------- | +| Bedrock | rantai kredensial AWS | Tidak memerlukan kunci API | +| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` | +| GitHub Copilot | `COPILOT_GITHUB_TOKEN`, `GH_TOKEN`, `GITHUB_TOKEN` | Profil auth melalui login perangkat | +| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` | +| Ollama | `OLLAMA_API_KEY` (placeholder) | -- | +| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` | +| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` | -Codex OAuth hanya mencakup chat/completions dan tidak memenuhi permintaan +OAuth Codex hanya mencakup chat/completions dan tidak memenuhi permintaan embedding. --- ## Config endpoint jarak jauh -Untuk endpoint kustom yang kompatibel dengan OpenAI atau mengoverride default provider: +Untuk endpoint kompatibel OpenAI kustom atau menimpa default penyedia: -| Key | Tipe | Deskripsi | -| ---------------- | -------- | ------------------------------------------------ | -| `remote.baseUrl` | `string` | Base URL API kustom | -| `remote.apiKey` | `string` | Override kunci API | -| `remote.headers` | `object` | Header HTTP tambahan (digabung dengan default provider) | +| Key | Type | Description | +| ---------------- | -------- | -------------------------------------------------- | +| `remote.baseUrl` | `string` | URL dasar API kustom | +| `remote.apiKey` | `string` | Timpa kunci API | +| `remote.headers` | `object` | Header HTTP tambahan (digabungkan dengan default penyedia) | ```json5 { @@ -114,13 +115,13 @@ Untuk endpoint kustom yang kompatibel dengan OpenAI atau mengoverride default pr ## Config khusus Gemini -| Key | Tipe | Default | Deskripsi | -| ---------------------- | -------- | ---------------------- | ---------------------------------------- | +| Key | Type | Default | Description | +| ---------------------- | -------- | ---------------------- | ------------------------------------------ | | `model` | `string` | `gemini-embedding-001` | Juga mendukung `gemini-embedding-2-preview` | -| `outputDimensionality` | `number` | `3072` | Untuk Embedding 2: 768, 1536, atau 3072 | +| `outputDimensionality` | `number` | `3072` | Untuk Embedding 2: 768, 1536, atau 3072 | -Mengubah model atau `outputDimensionality` memicu reindex penuh otomatis. +Mengubah model atau `outputDimensionality` memicu pengindeksan ulang penuh secara otomatis. --- @@ -128,8 +129,8 @@ Mengubah model atau `outputDimensionality` memicu reindex penuh otomatis. ## Config embedding Bedrock Bedrock menggunakan rantai kredensial default AWS SDK -- tidak memerlukan kunci API. -Jika OpenClaw berjalan di EC2 dengan instance role yang mengaktifkan Bedrock, cukup tetapkan -provider dan model: +Jika OpenClaw berjalan di EC2 dengan peran instance yang mendukung Bedrock, cukup tetapkan +penyedia dan model: ```json5 { @@ -144,47 +145,47 @@ provider dan model: } ``` -| Key | Tipe | Default | Deskripsi | -| ---------------------- | -------- | ------------------------------ | ---------------------------- | -| `model` | `string` | `amazon.titan-embed-text-v2:0` | ID model embedding Bedrock apa pun | +| Key | Type | Default | Description | +| ---------------------- | -------- | ------------------------------ | ------------------------------- | +| `model` | `string` | `amazon.titan-embed-text-v2:0` | ID model embedding Bedrock apa pun | | `outputDimensionality` | `number` | default model | Untuk Titan V2: 256, 512, atau 1024 | ### Model yang didukung Model berikut didukung (dengan deteksi keluarga dan default dimensi): -| ID Model | Provider | Dims Default | Dims yang Dapat Dikonfigurasi | -| ------------------------------------------ | ---------- | ------------ | ----------------------------- | -| `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256, 512, 1024 | -| `amazon.titan-embed-text-v1` | Amazon | 1536 | -- | -| `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- | -| `amazon.titan-embed-image-v1` | Amazon | 1024 | -- | -| `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256, 384, 1024, 3072 | -| `cohere.embed-english-v3` | Cohere | 1024 | -- | -| `cohere.embed-multilingual-v3` | Cohere | 1024 | -- | -| `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 | -| `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- | -| `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- | +| Model ID | Provider | Default Dims | Configurable Dims | +| ------------------------------------------ | ---------- | ------------ | -------------------- | +| `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256, 512, 1024 | +| `amazon.titan-embed-text-v1` | Amazon | 1536 | -- | +| `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- | +| `amazon.titan-embed-image-v1` | Amazon | 1024 | -- | +| `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256, 384, 1024, 3072 | +| `cohere.embed-english-v3` | Cohere | 1024 | -- | +| `cohere.embed-multilingual-v3` | Cohere | 1024 | -- | +| `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 | +| `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- | +| `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- | Varian dengan sufiks throughput (misalnya, `amazon.titan-embed-text-v1:2:8k`) mewarisi -konfigurasi model dasarnya. +config model dasarnya. ### Autentikasi -Autentikasi Bedrock menggunakan urutan resolusi kredensial AWS SDK standar: +Auth Bedrock menggunakan urutan resolusi kredensial AWS SDK standar: 1. Variabel lingkungan (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`) 2. Cache token SSO -3. Kredensial token web identity -4. File shared credentials dan config +3. Kredensial token identitas web +4. File kredensial dan config bersama 5. Kredensial metadata ECS atau EC2 -Region di-resolve dari `AWS_REGION`, `AWS_DEFAULT_REGION`, `baseUrl` provider +Region di-resolve dari `AWS_REGION`, `AWS_DEFAULT_REGION`, `baseUrl` penyedia `amazon-bedrock`, atau default ke `us-east-1`. ### Izin IAM -Role atau user IAM memerlukan: +Peran atau pengguna IAM memerlukan: ```json { @@ -194,7 +195,7 @@ Role atau user IAM memerlukan: } ``` -Untuk least-privilege, batasi `InvokeModel` ke model tertentu: +Untuk hak istimewa minimum, batasi `InvokeModel` ke model tertentu: ``` arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0 @@ -204,9 +205,9 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0 ## Config embedding lokal -| Key | Tipe | Default | Deskripsi | -| --------------------- | -------- | ---------------------- | ---------------------------- | -| `local.modelPath` | `string` | diunduh otomatis | Path ke file model GGUF | +| Key | Type | Default | Description | +| --------------------- | -------- | ---------------------- | ------------------------------- | +| `local.modelPath` | `string` | diunduh otomatis | Path ke file model GGUF | | `local.modelCacheDir` | `string` | default node-llama-cpp | Direktori cache untuk model yang diunduh | Model default: `embeddinggemma-300m-qat-Q8_0.gguf` (~0.6 GB, diunduh otomatis). @@ -216,30 +217,30 @@ Memerlukan build native: `pnpm approve-builds` lalu `pnpm rebuild node-llama-cpp ## Config pencarian hibrida -Semua berada di bawah `memorySearch.query.hybrid`: +Semua di bawah `memorySearch.query.hybrid`: -| Key | Tipe | Default | Deskripsi | -| --------------------- | --------- | ------- | --------------------------------- | -| `enabled` | `boolean` | `true` | Aktifkan pencarian hibrida BM25 + vector | -| `vectorWeight` | `number` | `0.7` | Bobot untuk skor vector (0-1) | +| Key | Type | Default | Description | +| --------------------- | --------- | ------- | ---------------------------------- | +| `enabled` | `boolean` | `true` | Aktifkan pencarian hibrida BM25 + vektor | +| `vectorWeight` | `number` | `0.7` | Bobot untuk skor vektor (0-1) | | `textWeight` | `number` | `0.3` | Bobot untuk skor BM25 (0-1) | -| `candidateMultiplier` | `number` | `4` | Pengali ukuran kumpulan kandidat | +| `candidateMultiplier` | `number` | `4` | Pengali ukuran kumpulan kandidat | -### MMR (keragaman) +### MMR (keberagaman) -| Key | Tipe | Default | Deskripsi | +| Key | Type | Default | Description | | ------------- | --------- | ------- | ------------------------------------ | -| `mmr.enabled` | `boolean` | `false` | Aktifkan pemeringkatan ulang MMR | -| `mmr.lambda` | `number` | `0.7` | 0 = keragaman maksimum, 1 = relevansi maksimum | +| `mmr.enabled` | `boolean` | `false` | Aktifkan pemeringkatan ulang MMR | +| `mmr.lambda` | `number` | `0.7` | 0 = keberagaman maksimum, 1 = relevansi maksimum | -### Temporal decay (keterkinian) +### Peluruhan temporal (keterkinian) -| Key | Tipe | Default | Deskripsi | -| ---------------------------- | --------- | ------- | ---------------------------- | -| `temporalDecay.enabled` | `boolean` | `false` | Aktifkan peningkatan keterkinian | -| `temporalDecay.halfLifeDays` | `number` | `30` | Skor menjadi setengah setiap N hari | +| Key | Type | Default | Description | +| ---------------------------- | --------- | ------- | ------------------------- | +| `temporalDecay.enabled` | `boolean` | `false` | Aktifkan peningkatan skor keterkinian | +| `temporalDecay.halfLifeDays` | `number` | `30` | Skor berkurang setengah setiap N hari | -File evergreen (`MEMORY.md`, file tanpa tanggal di `memory/`) tidak pernah dikenai decay. +File evergreen (`MEMORY.md`, file tanpa tanggal di `memory/`) tidak pernah dikenai peluruhan. ### Contoh lengkap @@ -266,8 +267,8 @@ File evergreen (`MEMORY.md`, file tanpa tanggal di `memory/`) tidak pernah diken ## Path memori tambahan -| Key | Tipe | Deskripsi | -| ------------ | ---------- | -------------------------------------- | +| Key | Type | Description | +| ------------ | ---------- | ---------------------------------------- | | `extraPaths` | `string[]` | Direktori atau file tambahan untuk diindeks | ```json5 @@ -284,17 +285,17 @@ File evergreen (`MEMORY.md`, file tanpa tanggal di `memory/`) tidak pernah diken Path dapat berupa absolut atau relatif terhadap workspace. Direktori dipindai secara rekursif untuk file `.md`. Penanganan symlink bergantung pada backend aktif: -builtin engine mengabaikan symlink, sedangkan QMD mengikuti perilaku scanner QMD +mesin bawaan mengabaikan symlink, sedangkan QMD mengikuti perilaku pemindai QMD yang mendasarinya. -Untuk pencarian transkrip lintas-agent yang dibatasi agent, gunakan +Untuk pencarian transkrip lintas agen dengan cakupan agen, gunakan `agents.list[].memorySearch.qmd.extraCollections` alih-alih `memory.qmd.paths`. -Extra collection tersebut mengikuti bentuk `{ path, name, pattern? }` yang sama, tetapi -digabung per agent dan dapat mempertahankan nama bersama yang eksplisit saat path -menunjuk ke luar workspace saat ini. -Jika path hasil resolve yang sama muncul di `memory.qmd.paths` dan +Koleksi tambahan tersebut mengikuti bentuk `{ path, name, pattern? }` yang sama, tetapi +digabungkan per agen dan dapat mempertahankan nama bersama yang eksplisit saat path +mengarah ke luar workspace saat ini. +Jika path hasil resolve yang sama muncul baik di `memory.qmd.paths` maupun `memorySearch.qmd.extraCollections`, QMD mempertahankan entri pertama dan melewati -duplikatnya. +duplikat tersebut. --- @@ -302,13 +303,13 @@ duplikatnya. Indeks gambar dan audio bersama Markdown menggunakan Gemini Embedding 2: -| Key | Tipe | Default | Deskripsi | -| ------------------------- | ---------- | ---------- | ---------------------------------------- | -| `multimodal.enabled` | `boolean` | `false` | Aktifkan pengindeksan multimodal | +| Key | Type | Default | Description | +| ------------------------- | ---------- | ---------- | -------------------------------------- | +| `multimodal.enabled` | `boolean` | `false` | Aktifkan pengindeksan multimodal | | `multimodal.modalities` | `string[]` | -- | `["image"]`, `["audio"]`, atau `["all"]` | -| `multimodal.maxFileBytes` | `number` | `10000000` | Ukuran file maksimum untuk pengindeksan | +| `multimodal.maxFileBytes` | `number` | `10000000` | Ukuran file maksimum untuk pengindeksan | -Hanya berlaku untuk file di `extraPaths`. Root memori default tetap hanya Markdown. +Hanya berlaku untuk file di `extraPaths`. Root memori default tetap khusus Markdown. Memerlukan `gemini-embedding-2-preview`. `fallback` harus `"none"`. Format yang didukung: `.jpg`, `.jpeg`, `.png`, `.webp`, `.gif`, `.heic`, `.heif` @@ -318,24 +319,24 @@ Format yang didukung: `.jpg`, `.jpeg`, `.png`, `.webp`, `.gif`, `.heic`, `.heif` ## Cache embedding -| Key | Tipe | Default | Deskripsi | -| ------------------ | --------- | ------- | ----------------------------------- | -| `cache.enabled` | `boolean` | `false` | Cache embedding chunk di SQLite | -| `cache.maxEntries` | `number` | `50000` | Jumlah maksimum embedding yang di-cache | +| Key | Type | Default | Description | +| ------------------ | --------- | ------- | -------------------------------- | +| `cache.enabled` | `boolean` | `false` | Cache embedding chunk di SQLite | +| `cache.maxEntries` | `number` | `50000` | Embedding yang di-cache maksimum | -Mencegah embedding ulang teks yang tidak berubah selama reindex atau pembaruan transkrip. +Mencegah embedding ulang pada teks yang tidak berubah selama pengindeksan ulang atau pembaruan transkrip. --- ## Pengindeksan batch -| Key | Tipe | Default | Deskripsi | -| ----------------------------- | --------- | ------- | ----------------------------- | -| `remote.batch.enabled` | `boolean` | `false` | Aktifkan API embedding batch | -| `remote.batch.concurrency` | `number` | `2` | Job batch paralel | -| `remote.batch.wait` | `boolean` | `true` | Tunggu batch selesai | -| `remote.batch.pollIntervalMs` | `number` | -- | Interval polling | -| `remote.batch.timeoutMinutes` | `number` | -- | Timeout batch | +| Key | Type | Default | Description | +| ----------------------------- | --------- | ------- | -------------------------- | +| `remote.batch.enabled` | `boolean` | `false` | Aktifkan API embedding batch | +| `remote.batch.concurrency` | `number` | `2` | Job batch paralel | +| `remote.batch.wait` | `boolean` | `true` | Tunggu penyelesaian batch | +| `remote.batch.pollIntervalMs` | `number` | -- | Interval polling | +| `remote.batch.timeoutMinutes` | `number` | -- | Batas waktu batch | Tersedia untuk `openai`, `gemini`, dan `voyage`. Batch OpenAI biasanya paling cepat dan paling murah untuk backfill besar. @@ -346,34 +347,34 @@ paling cepat dan paling murah untuk backfill besar. Indeks transkrip sesi dan tampilkan melalui `memory_search`: -| Key | Tipe | Default | Deskripsi | -| ----------------------------- | ---------- | ------------ | ---------------------------------------- | -| `experimental.sessionMemory` | `boolean` | `false` | Aktifkan pengindeksan sesi | +| Key | Type | Default | Description | +| ----------------------------- | ---------- | ------------ | --------------------------------------- | +| `experimental.sessionMemory` | `boolean` | `false` | Aktifkan pengindeksan sesi | | `sources` | `string[]` | `["memory"]` | Tambahkan `"sessions"` untuk menyertakan transkrip | -| `sync.sessions.deltaBytes` | `number` | `100000` | Ambang byte untuk reindex | -| `sync.sessions.deltaMessages` | `number` | `50` | Ambang jumlah pesan untuk reindex | +| `sync.sessions.deltaBytes` | `number` | `100000` | Ambang byte untuk pengindeksan ulang | +| `sync.sessions.deltaMessages` | `number` | `50` | Ambang pesan untuk pengindeksan ulang | -Pengindeksan sesi bersifat opt-in dan berjalan secara asinkron. Hasil dapat sedikit -stale. Log sesi berada di disk, jadi perlakukan akses filesystem sebagai batas +Pengindeksan sesi bersifat opt-in dan berjalan secara asinkron. Hasilnya bisa sedikit +tidak mutakhir. Log sesi berada di disk, jadi perlakukan akses filesystem sebagai batas kepercayaan. --- -## Akselerasi vector SQLite (`sqlite-vec`) +## Akselerasi vektor SQLite (sqlite-vec) -| Key | Tipe | Default | Deskripsi | -| ---------------------------- | --------- | ------- | ---------------------------------- | -| `store.vector.enabled` | `boolean` | `true` | Gunakan `sqlite-vec` untuk query vector | -| `store.vector.extensionPath` | `string` | bundled | Override path `sqlite-vec` | +| Key | Type | Default | Description | +| ---------------------------- | --------- | ------- | --------------------------------- | +| `store.vector.enabled` | `boolean` | `true` | Gunakan sqlite-vec untuk kueri vektor | +| `store.vector.extensionPath` | `string` | bundled | Timpa path sqlite-vec | -Saat `sqlite-vec` tidak tersedia, OpenClaw otomatis kembali ke cosine -similarity dalam proses. +Saat sqlite-vec tidak tersedia, OpenClaw secara otomatis beralih ke +similaritas cosine dalam proses. --- ## Penyimpanan indeks -| Key | Tipe | Default | Deskripsi | +| Key | Type | Default | Description | | --------------------- | -------- | ------------------------------------- | ------------------------------------------- | | `store.path` | `string` | `~/.openclaw/memory/{agentId}.sqlite` | Lokasi indeks (mendukung token `{agentId}`) | | `store.fts.tokenizer` | `string` | `unicode61` | Tokenizer FTS5 (`unicode61` atau `trigram`) | @@ -382,52 +383,53 @@ similarity dalam proses. ## Config backend QMD -Tetapkan `memory.backend = "qmd"` untuk mengaktifkan. Semua pengaturan QMD berada di bawah +Tetapkan `memory.backend = "qmd"` untuk mengaktifkannya. Semua pengaturan QMD berada di bawah `memory.qmd`: -| Key | Tipe | Default | Deskripsi | -| ------------------------ | --------- | -------- | ------------------------------------------- | -| `command` | `string` | `qmd` | Path executable QMD | +| Key | Type | Default | Description | +| ------------------------ | --------- | -------- | -------------------------------------------- | +| `command` | `string` | `qmd` | Path executable QMD | | `searchMode` | `string` | `search` | Perintah pencarian: `search`, `vsearch`, `query` | -| `includeDefaultMemory` | `boolean` | `true` | Otomatis mengindeks `MEMORY.md` + `memory/**/*.md` | -| `paths[]` | `array` | -- | Path tambahan: `{ name, path, pattern? }` | -| `sessions.enabled` | `boolean` | `false` | Indeks transkrip sesi | -| `sessions.retentionDays` | `number` | -- | Retensi transkrip | -| `sessions.exportDir` | `string` | -- | Direktori ekspor | +| `includeDefaultMemory` | `boolean` | `true` | Indeks otomatis `MEMORY.md` + `memory/**/*.md` | +| `paths[]` | `array` | -- | Path tambahan: `{ name, path, pattern? }` | +| `sessions.enabled` | `boolean` | `false` | Indeks transkrip sesi | +| `sessions.retentionDays` | `number` | -- | Retensi transkrip | +| `sessions.exportDir` | `string` | -- | Direktori ekspor | -OpenClaw lebih memilih bentuk collection dan query MCP QMD saat ini, tetapi tetap -membuat rilis QMD lama berfungsi dengan kembali ke flag collection `--mask` lama -dan nama tool MCP lama bila diperlukan. +OpenClaw mengutamakan koleksi QMD saat ini dan bentuk kueri MCP, tetapi tetap +membuat rilis QMD yang lebih lama tetap berfungsi dengan beralih ke flag koleksi +`--mask` lama dan nama tool MCP yang lebih lama bila diperlukan. -Override model QMD tetap berada di sisi QMD, bukan config OpenClaw. Jika Anda perlu -mengoverride model QMD secara global, tetapkan variabel lingkungan seperti -`QMD_EMBED_MODEL`, `QMD_RERANK_MODEL`, dan `QMD_GENERATE_MODEL` di lingkungan runtime gateway. +Penggantian model QMD tetap berada di sisi QMD, bukan config OpenClaw. Jika Anda perlu +menimpa model QMD secara global, tetapkan variabel lingkungan seperti +`QMD_EMBED_MODEL`, `QMD_RERANK_MODEL`, dan `QMD_GENERATE_MODEL` di lingkungan runtime +Gateway. ### Jadwal pembaruan -| Key | Tipe | Default | Deskripsi | -| ------------------------- | --------- | ------- | -------------------------------------- | -| `update.interval` | `string` | `5m` | Interval refresh | -| `update.debounceMs` | `number` | `15000` | Debounce perubahan file | -| `update.onBoot` | `boolean` | `true` | Refresh saat startup | -| `update.waitForBootSync` | `boolean` | `false` | Blok startup sampai refresh selesai | -| `update.embedInterval` | `string` | -- | Cadence embedding terpisah | -| `update.commandTimeoutMs` | `number` | -- | Timeout untuk perintah QMD | -| `update.updateTimeoutMs` | `number` | -- | Timeout untuk operasi update QMD | -| `update.embedTimeoutMs` | `number` | -- | Timeout untuk operasi embed QMD | +| Key | Type | Default | Description | +| ------------------------- | --------- | ------- | ------------------------------------- | +| `update.interval` | `string` | `5m` | Interval penyegaran | +| `update.debounceMs` | `number` | `15000` | Debounce perubahan file | +| `update.onBoot` | `boolean` | `true` | Segarkan saat startup | +| `update.waitForBootSync` | `boolean` | `false` | Blokir startup sampai penyegaran selesai | +| `update.embedInterval` | `string` | -- | Irama embedding terpisah | +| `update.commandTimeoutMs` | `number` | -- | Batas waktu untuk perintah QMD | +| `update.updateTimeoutMs` | `number` | -- | Batas waktu untuk operasi pembaruan QMD | +| `update.embedTimeoutMs` | `number` | -- | Batas waktu untuk operasi embedding QMD | ### Batas -| Key | Tipe | Default | Deskripsi | -| ------------------------- | -------- | ------- | ----------------------------- | -| `limits.maxResults` | `number` | `6` | Jumlah maksimum hasil pencarian | -| `limits.maxSnippetChars` | `number` | -- | Batasi panjang snippet | -| `limits.maxInjectedChars` | `number` | -- | Batasi total karakter yang diinjeksi | -| `limits.timeoutMs` | `number` | `4000` | Timeout pencarian | +| Key | Type | Default | Description | +| ------------------------- | -------- | ------- | -------------------------- | +| `limits.maxResults` | `number` | `6` | Hasil pencarian maksimum | +| `limits.maxSnippetChars` | `number` | -- | Batasi panjang cuplikan | +| `limits.maxInjectedChars` | `number` | -- | Batasi total karakter yang disuntikkan | +| `limits.timeoutMs` | `number` | `4000` | Batas waktu pencarian | ### Cakupan -Mengontrol sesi mana yang dapat menerima hasil pencarian QMD. Skemanya sama dengan +Mengontrol sesi mana yang dapat menerima hasil pencarian QMD. Skema yang sama seperti [`session.sendPolicy`](/id/gateway/configuration-reference#session): ```json5 @@ -446,20 +448,20 @@ Mengontrol sesi mana yang dapat menerima hasil pencarian QMD. Skemanya sama deng Default bawaan mengizinkan sesi direct dan channel, sambil tetap menolak grup. -Default-nya hanya DM. `match.keyPrefix` mencocokkan key sesi yang dinormalisasi; -`match.rawKeyPrefix` mencocokkan key mentah termasuk `agent::`. +Default adalah khusus DM. `match.keyPrefix` cocok dengan kunci sesi yang dinormalisasi; +`match.rawKeyPrefix` cocok dengan kunci mentah termasuk `agent::`. ### Sitasi `memory.citations` berlaku untuk semua backend: -| Value | Perilaku | -| ---------------- | ---------------------------------------------------- | -| `auto` (default) | Sertakan footer `Source: ` di snippet | +| Value | Behavior | +| ---------------- | --------------------------------------------------- | +| `auto` (default) | Sertakan footer `Source: ` dalam cuplikan | | `on` | Selalu sertakan footer | -| `off` | Hilangkan footer (path tetap diteruskan ke agent secara internal) | +| `off` | Hilangkan footer (path tetap diteruskan ke agen secara internal) | -### Contoh QMD lengkap +### Contoh lengkap QMD ```json5 { @@ -482,7 +484,7 @@ Default-nya hanya DM. `match.keyPrefix` mencocokkan key sesi yang dinormalisasi; --- -## Dreaming (eksperimental) +## Dreaming Dreaming dikonfigurasi di bawah `plugins.entries.memory-core.config.dreaming`, bukan di bawah `agents.defaults.memorySearch`. @@ -494,10 +496,10 @@ Untuk perilaku konseptual dan slash command, lihat [Dreaming](/id/concepts/dream ### Pengaturan pengguna -| Key | Tipe | Default | Deskripsi | -| ----------- | --------- | ----------- | ------------------------------------------------ | -| `enabled` | `boolean` | `false` | Aktifkan atau nonaktifkan Dreaming sepenuhnya | -| `frequency` | `string` | `0 3 * * *` | Cadence Cron opsional untuk sapuan Dreaming penuh | +| Key | Type | Default | Description | +| ----------- | --------- | ----------- | ------------------------------------------------- | +| `enabled` | `boolean` | `false` | Aktifkan atau nonaktifkan Dreaming sepenuhnya | +| `frequency` | `string` | `0 3 * * *` | Irama Cron opsional untuk keseluruhan sapuan Dreaming | ### Contoh @@ -522,4 +524,4 @@ Catatan: - Dreaming menulis status mesin ke `memory/.dreams/`. - Dreaming menulis output naratif yang dapat dibaca manusia ke `DREAMS.md` (atau `dreams.md` yang sudah ada). -- Kebijakan fase light/deep/REM dan ambangnya adalah perilaku internal, bukan config yang menghadap pengguna. +- Kebijakan dan ambang fase light/deep/REM adalah perilaku internal, bukan config yang ditujukan untuk pengguna. diff --git a/docs/id/reference/wizard.md b/docs/id/reference/wizard.md index fef401990..8206add36 100644 --- a/docs/id/reference/wizard.md +++ b/docs/id/reference/wizard.md @@ -7,10 +7,10 @@ sidebarTitle: Onboarding Reference summary: 'Referensi lengkap untuk onboarding CLI: setiap langkah, flag, dan field konfigurasi' title: Referensi Onboarding x-i18n: - generated_at: "2026-04-07T09:20:03Z" + generated_at: "2026-04-15T14:41:01Z" model: gpt-5.4 provider: openai - source_hash: a142b9ec4323fabb9982d05b64375d2b4a4007dffc910acbee3a38ff871a7236 + source_hash: 1db3ff789422617634e6624f9d12c18b6a6c573721226b9c0fa6f6b7956ef33d source_path: reference/wizard.md workflow: 15 --- @@ -25,31 +25,31 @@ Untuk ikhtisar tingkat tinggi, lihat [Onboarding (CLI)](/id/start/wizard). - Jika `~/.openclaw/openclaw.json` ada, pilih **Keep / Modify / Reset**. - - Menjalankan ulang onboarding **tidak** menghapus apa pun kecuali Anda secara eksplisit memilih **Reset** + - Menjalankan onboarding kembali **tidak** menghapus apa pun kecuali Anda secara eksplisit memilih **Reset** (atau memberikan `--reset`). - - CLI `--reset` secara default menggunakan `config+creds+sessions`; gunakan `--reset-scope full` + - CLI `--reset` default ke `config+creds+sessions`; gunakan `--reset-scope full` untuk juga menghapus workspace. - - Jika konfigurasi tidak valid atau berisi key lama, wizard berhenti dan meminta + - Jika konfigurasi tidak valid atau berisi kunci lama, wizard berhenti dan meminta Anda menjalankan `openclaw doctor` sebelum melanjutkan. - Reset menggunakan `trash` (bukan `rm`) dan menawarkan cakupan: - Hanya konfigurasi - Konfigurasi + kredensial + sesi - Reset penuh (juga menghapus workspace) - + - **Kunci API Anthropic**: menggunakan `ANTHROPIC_API_KEY` jika ada atau meminta kunci, lalu menyimpannya untuk penggunaan daemon. - **Kunci API Anthropic**: pilihan asisten Anthropic yang diutamakan dalam onboarding/configure. - - **Anthropic setup-token**: masih tersedia di onboarding/configure, meskipun OpenClaw sekarang lebih memilih penggunaan ulang Claude CLI bila tersedia. - - **Langganan OpenAI Code (Codex) (Codex CLI)**: jika `~/.codex/auth.json` ada, onboarding dapat menggunakannya kembali. Kredensial Codex CLI yang digunakan ulang tetap dikelola oleh Codex CLI; saat kedaluwarsa OpenClaw membaca ulang sumber itu terlebih dahulu dan, ketika provider dapat menyegarkannya, menulis kembali kredensial yang disegarkan ke penyimpanan Codex alih-alih mengambil alih pengelolaannya sendiri. + - **Anthropic setup-token**: masih tersedia dalam onboarding/configure, meskipun OpenClaw kini lebih memilih penggunaan ulang Claude CLI jika tersedia. + - **Langganan OpenAI Code (Codex) (Codex CLI)**: jika `~/.codex/auth.json` ada, onboarding dapat menggunakannya kembali. Kredensial Codex CLI yang digunakan kembali tetap dikelola oleh Codex CLI; saat kedaluwarsa OpenClaw terlebih dahulu membaca ulang sumber tersebut dan, ketika penyedianya dapat menyegarkannya, menulis kembali kredensial yang disegarkan ke penyimpanan Codex alih-alih mengambil alih pengelolaannya sendiri. - **Langganan OpenAI Code (Codex) (OAuth)**: alur browser; tempel `code#state`. - - Menetapkan `agents.defaults.model` ke `openai-codex/gpt-5.4` saat model belum ditetapkan atau `openai/*`. - - **Kunci API OpenAI**: menggunakan `OPENAI_API_KEY` jika ada atau meminta kunci, lalu menyimpannya di auth profile. - - Menetapkan `agents.defaults.model` ke `openai/gpt-5.4` saat model belum ditetapkan, `openai/*`, atau `openai-codex/*`. - - **Kunci API xAI (Grok)**: meminta `XAI_API_KEY` dan mengonfigurasi xAI sebagai provider model. + - Menetapkan `agents.defaults.model` ke `openai-codex/gpt-5.4` saat model belum disetel atau `openai/*`. + - **Kunci API OpenAI**: menggunakan `OPENAI_API_KEY` jika ada atau meminta kunci, lalu menyimpannya dalam profil auth. + - Menetapkan `agents.defaults.model` ke `openai/gpt-5.4` saat model belum disetel, `openai/*`, atau `openai-codex/*`. + - **Kunci API xAI (Grok)**: meminta `XAI_API_KEY` dan mengonfigurasi xAI sebagai penyedia model. - **OpenCode**: meminta `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`, dapatkan di https://opencode.ai/auth) dan memungkinkan Anda memilih katalog Zen atau Go. - - **Ollama**: meminta base URL Ollama, menawarkan mode **Cloud + Local** atau **Local**, mendeteksi model yang tersedia, dan otomatis menarik model lokal yang dipilih bila diperlukan. + - **Ollama**: terlebih dahulu menawarkan **Cloud + Local**, **Cloud only**, atau **Local only**. `Cloud only` meminta `OLLAMA_API_KEY` dan menggunakan `https://ollama.com`; mode berbasis host meminta URL dasar Ollama, menemukan model yang tersedia, dan otomatis menarik model lokal yang dipilih bila diperlukan; `Cloud + Local` juga memeriksa apakah host Ollama tersebut sudah masuk untuk akses cloud. - Detail lebih lanjut: [Ollama](/id/providers/ollama) - - **API key**: menyimpan kunci untuk Anda. + - **Kunci API**: menyimpan kunci untuk Anda. - **Vercel AI Gateway (proxy multi-model)**: meminta `AI_GATEWAY_API_KEY`. - Detail lebih lanjut: [Vercel AI Gateway](/id/providers/vercel-ai-gateway) - **Cloudflare AI Gateway**: meminta Account ID, Gateway ID, dan `CLOUDFLARE_AI_GATEWAY_API_KEY`. @@ -58,26 +58,26 @@ Untuk ikhtisar tingkat tinggi, lihat [Onboarding (CLI)](/id/start/wizard). Penyiapan kunci API menggunakan `minimax/...`, dan penyiapan OAuth menggunakan `minimax-portal/...`. - Detail lebih lanjut: [MiniMax](/id/providers/minimax) - - **StepFun**: konfigurasi ditulis otomatis untuk StepFun standard atau Step Plan pada endpoint China atau global. - - Standard saat ini mencakup `step-3.5-flash`, dan Step Plan juga mencakup `step-3.5-flash-2603`. + - **StepFun**: konfigurasi ditulis otomatis untuk StepFun standar atau Step Plan pada endpoint China atau global. + - Standar saat ini mencakup `step-3.5-flash`, dan Step Plan juga mencakup `step-3.5-flash-2603`. - Detail lebih lanjut: [StepFun](/id/providers/stepfun) - - **Synthetic (kompatibel dengan Anthropic)**: meminta `SYNTHETIC_API_KEY`. + - **Synthetic (kompatibel Anthropic)**: meminta `SYNTHETIC_API_KEY`. - Detail lebih lanjut: [Synthetic](/id/providers/synthetic) - **Moonshot (Kimi K2)**: konfigurasi ditulis otomatis. - **Kimi Coding**: konfigurasi ditulis otomatis. - Detail lebih lanjut: [Moonshot AI (Kimi + Kimi Coding)](/id/providers/moonshot) - - **Skip**: belum ada autentikasi yang dikonfigurasi. - - Pilih model default dari opsi yang terdeteksi (atau masukkan provider/model secara manual). Untuk kualitas terbaik dan risiko prompt injection yang lebih rendah, pilih model generasi terbaru terkuat yang tersedia dalam stack provider Anda. - - Onboarding menjalankan pemeriksaan model dan memperingatkan jika model yang dikonfigurasi tidak dikenal atau autentikasinya tidak ada. - - Mode penyimpanan kunci API secara default menggunakan nilai auth-profile plaintext. Gunakan `--secret-input-mode ref` untuk menyimpan ref berbasis env sebagai gantinya (misalnya `keyRef: { source: "env", provider: "default", id: "OPENAI_API_KEY" }`). - - Auth profile berada di `~/.openclaw/agents//agent/auth-profiles.json` (kunci API + OAuth). `~/.openclaw/credentials/oauth.json` adalah sumber impor lama saja. + - **Lewati**: auth belum dikonfigurasi. + - Pilih model default dari opsi yang terdeteksi (atau masukkan penyedia/model secara manual). Untuk kualitas terbaik dan risiko prompt injection yang lebih rendah, pilih model generasi terbaru terkuat yang tersedia di stack penyedia Anda. + - Onboarding menjalankan pemeriksaan model dan memperingatkan jika model yang dikonfigurasi tidak dikenal atau auth tidak ada. + - Mode penyimpanan kunci API default ke nilai profil auth plaintext. Gunakan `--secret-input-mode ref` untuk menyimpan ref berbasis env sebagai gantinya (misalnya `keyRef: { source: "env", provider: "default", id: "OPENAI_API_KEY" }`). + - Profil auth berada di `~/.openclaw/agents//agent/auth-profiles.json` (kunci API + OAuth). `~/.openclaw/credentials/oauth.json` adalah warisan dan hanya untuk impor. - Detail lebih lanjut: [/concepts/oauth](/id/concepts/oauth) - Tip headless/server: selesaikan OAuth di mesin yang memiliki browser, lalu salin + Tip headless/server: selesaikan OAuth pada mesin dengan browser, lalu salin `auth-profiles.json` agen tersebut (misalnya `~/.openclaw/agents//agent/auth-profiles.json`, atau path `$OPENCLAW_STATE_DIR/...` yang sesuai) ke host gateway. `credentials/oauth.json` - hanya merupakan sumber impor lama. + hanya merupakan sumber impor warisan. @@ -86,55 +86,55 @@ Untuk ikhtisar tingkat tinggi, lihat [Onboarding (CLI)](/id/start/wizard). - Tata letak workspace lengkap + panduan cadangan: [Workspace agen](/id/concepts/agent-workspace) - - Port, bind, mode autentikasi, eksposur Tailscale. - - Rekomendasi autentikasi: tetap gunakan **Token** bahkan untuk loopback agar klien WS lokal harus terautentikasi. + - Port, bind, mode auth, eksposur Tailscale. + - Rekomendasi auth: tetap gunakan **Token** bahkan untuk loopback agar klien WS lokal tetap harus diautentikasi. - Dalam mode token, penyiapan interaktif menawarkan: - - **Generate/store plaintext token** (default) - - **Use SecretRef** (opsional) - - Quickstart menggunakan ulang SecretRef `gateway.auth.token` yang ada di provider `env`, `file`, dan `exec` untuk probe onboarding/bootstrap dashboard. - - Jika SecretRef tersebut dikonfigurasi tetapi tidak dapat di-resolve, onboarding gagal lebih awal dengan pesan perbaikan yang jelas alih-alih secara diam-diam menurunkan autentikasi runtime. - - Dalam mode password, penyiapan interaktif juga mendukung penyimpanan plaintext atau SecretRef. + - **Hasilkan/simpan token plaintext** (default) + - **Gunakan SecretRef** (opsional) + - Quickstart menggunakan ulang SecretRef `gateway.auth.token` yang ada di seluruh penyedia `env`, `file`, dan `exec` untuk bootstrap probe/dashboard onboarding. + - Jika SecretRef tersebut dikonfigurasi tetapi tidak dapat di-resolve, onboarding gagal lebih awal dengan pesan perbaikan yang jelas alih-alih menurunkan auth runtime secara diam-diam. + - Dalam mode kata sandi, penyiapan interaktif juga mendukung penyimpanan plaintext atau SecretRef. - Path SecretRef token non-interaktif: `--gateway-token-ref-env `. - - Memerlukan env var yang tidak kosong di lingkungan proses onboarding. + - Memerlukan env var yang tidak kosong dalam environment proses onboarding. - Tidak dapat digabungkan dengan `--gateway-token`. - - Nonaktifkan autentikasi hanya jika Anda sepenuhnya memercayai setiap proses lokal. - - Bind non-loopback tetap memerlukan autentikasi. + - Nonaktifkan auth hanya jika Anda sepenuhnya memercayai setiap proses lokal. + - Bind non-loopback tetap memerlukan auth. - + - [WhatsApp](/id/channels/whatsapp): login QR opsional. - - [Telegram](/id/channels/telegram): bot token. - - [Discord](/id/channels/discord): bot token. - - [Google Chat](/id/channels/googlechat): JSON service account + webhook audience. - - [Mattermost](/id/channels/mattermost) (plugin): bot token + base URL. + - [Telegram](/id/channels/telegram): token bot. + - [Discord](/id/channels/discord): token bot. + - [Google Chat](/id/channels/googlechat): JSON akun layanan + audience webhook. + - [Mattermost](/id/channels/mattermost) (Plugin): token bot + URL dasar. - [Signal](/id/channels/signal): instalasi `signal-cli` opsional + konfigurasi akun. - - [BlueBubbles](/id/channels/bluebubbles): **direkomendasikan untuk iMessage**; URL server + password + webhook. + - [BlueBubbles](/id/channels/bluebubbles): **direkomendasikan untuk iMessage**; URL server + kata sandi + Webhook. - [iMessage](/id/channels/imessage): path CLI `imsg` lama + akses DB. - Keamanan DM: default-nya adalah pairing. DM pertama mengirim kode; setujui melalui `openclaw pairing approve ` atau gunakan allowlist. - - Pilih provider yang didukung seperti Brave, DuckDuckGo, Exa, Firecrawl, Gemini, Grok, Kimi, MiniMax Search, Ollama Web Search, Perplexity, SearXNG, atau Tavily (atau lewati). - - Provider berbasis API dapat menggunakan env var atau konfigurasi yang ada untuk penyiapan cepat; provider tanpa kunci menggunakan prasyarat khusus provider masing-masing. + - Pilih penyedia yang didukung seperti Brave, DuckDuckGo, Exa, Firecrawl, Gemini, Grok, Kimi, MiniMax Search, Ollama Web Search, Perplexity, SearXNG, atau Tavily (atau lewati). + - Penyedia berbasis API dapat menggunakan env vars atau konfigurasi yang ada untuk penyiapan cepat; penyedia tanpa kunci menggunakan prasyarat khusus penyedianya. - Lewati dengan `--skip-search`. - Konfigurasikan nanti: `openclaw configure --section web`. - macOS: LaunchAgent - - Memerlukan sesi pengguna yang login; untuk headless, gunakan LaunchDaemon kustom (tidak disertakan). - - Linux (dan Windows melalui WSL2): unit systemd pengguna - - Onboarding mencoba mengaktifkan lingering melalui `loginctl enable-linger ` agar Gateway tetap aktif setelah logout. - - Mungkin meminta sudo (menulis ke `/var/lib/systemd/linger`); pertama-tama mencoba tanpa sudo. + - Memerlukan sesi pengguna yang sedang login; untuk headless, gunakan LaunchDaemon kustom (tidak disertakan). + - Linux (dan Windows melalui WSL2): unit pengguna systemd + - Onboarding mencoba mengaktifkan lingering melalui `loginctl enable-linger ` agar Gateway tetap berjalan setelah logout. + - Mungkin meminta sudo (menulis ke `/var/lib/systemd/linger`); pertama-tama dicoba tanpa sudo. - **Pemilihan runtime:** Node (direkomendasikan; diperlukan untuk WhatsApp/Telegram). Bun **tidak direkomendasikan**. - - Jika autentikasi token memerlukan token dan `gateway.auth.token` dikelola SecretRef, instalasi daemon memvalidasinya tetapi tidak menyimpan nilai token plaintext yang sudah di-resolve ke metadata lingkungan layanan supervisor. - - Jika autentikasi token memerlukan token dan token SecretRef yang dikonfigurasi belum di-resolve, instalasi daemon diblokir dengan panduan yang dapat ditindaklanjuti. - - Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi dan `gateway.auth.mode` belum ditetapkan, instalasi daemon diblokir sampai mode ditetapkan secara eksplisit. + - Jika auth token memerlukan token dan `gateway.auth.token` dikelola oleh SecretRef, instalasi daemon memvalidasinya tetapi tidak menyimpan nilai token plaintext yang sudah di-resolve ke metadata environment layanan supervisor. + - Jika auth token memerlukan token dan token SecretRef yang dikonfigurasi belum di-resolve, instalasi daemon diblokir dengan panduan yang dapat ditindaklanjuti. + - Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi dan `gateway.auth.mode` belum disetel, instalasi daemon diblokir sampai mode ditetapkan secara eksplisit. - Memulai Gateway (jika perlu) dan menjalankan `openclaw health`. - - Tip: `openclaw status --deep` menambahkan probe kesehatan gateway live ke output status, termasuk probe channel bila didukung (memerlukan gateway yang dapat dijangkau). + - Tip: `openclaw status --deep` menambahkan probe kesehatan gateway langsung ke output status, termasuk probe channel bila didukung (memerlukan gateway yang dapat dijangkau). - + - Membaca Skills yang tersedia dan memeriksa persyaratan. - - Memungkinkan Anda memilih node manager: **npm / pnpm** (bun tidak direkomendasikan). + - Memungkinkan Anda memilih pengelola node: **npm / pnpm** (bun tidak direkomendasikan). - Menginstal dependensi opsional (beberapa menggunakan Homebrew di macOS). @@ -144,7 +144,7 @@ Untuk ikhtisar tingkat tinggi, lihat [Onboarding (CLI)](/id/start/wizard). Jika tidak ada GUI yang terdeteksi, onboarding mencetak instruksi port-forward SSH untuk Control UI alih-alih membuka browser. -Jika aset Control UI tidak ada, onboarding mencoba membangunnya; fallback-nya adalah `pnpm ui:build` (otomatis menginstal dependensi UI). +Jika aset Control UI tidak ada, onboarding mencoba membangunnya; fallback-nya adalah `pnpm ui:build` (secara otomatis menginstal dependensi UI). ## Mode non-interaktif @@ -165,7 +165,7 @@ openclaw onboard --non-interactive \ Tambahkan `--json` untuk ringkasan yang dapat dibaca mesin. -Gateway token SecretRef dalam mode non-interaktif: +SecretRef token gateway dalam mode non-interaktif: ```bash export OPENCLAW_GATEWAY_TOKEN="your-token" @@ -182,7 +182,7 @@ openclaw onboard --non-interactive \ `--json` **tidak** menyiratkan mode non-interaktif. Gunakan `--non-interactive` (dan `--workspace`) untuk skrip. -Contoh perintah khusus provider ada di [CLI Automation](/id/start/wizard-cli-automation#provider-specific-examples). +Contoh perintah khusus penyedia ada di [Otomatisasi CLI](/id/start/wizard-cli-automation#provider-specific-examples). Gunakan halaman referensi ini untuk semantik flag dan urutan langkah. ### Tambah agen (non-interaktif) @@ -196,7 +196,7 @@ openclaw agents add work \ --json ``` -## RPC wizard Gateway +## Gateway wizard RPC Gateway mengekspos alur onboarding melalui RPC (`wizard.start`, `wizard.next`, `wizard.cancel`, `wizard.status`). Klien (aplikasi macOS, Control UI) dapat merender langkah-langkah tanpa mengimplementasikan ulang logika onboarding. @@ -212,23 +212,23 @@ Onboarding dapat menginstal `signal-cli` dari rilis GitHub: Catatan: - Build JVM memerlukan **Java 21**. -- Build native digunakan bila tersedia. +- Build native digunakan jika tersedia. - Windows menggunakan WSL2; instalasi signal-cli mengikuti alur Linux di dalam WSL. -## Apa yang ditulis wizard +## Yang ditulis oleh wizard Field umum di `~/.openclaw/openclaw.json`: - `agents.defaults.workspace` - `agents.defaults.model` / `models.providers` (jika Minimax dipilih) -- `tools.profile` (onboarding lokal secara default menggunakan `"coding"` saat belum ditetapkan; nilai eksplisit yang sudah ada dipertahankan) -- `gateway.*` (mode, bind, autentikasi, tailscale) +- `tools.profile` (onboarding lokal secara default menggunakan `"coding"` saat belum disetel; nilai eksplisit yang sudah ada akan dipertahankan) +- `gateway.*` (mode, bind, auth, Tailscale) - `session.dmScope` (detail perilaku: [Referensi Penyiapan CLI](/id/start/wizard-cli-reference#outputs-and-internals)) - `channels.telegram.botToken`, `channels.discord.token`, `channels.matrix.*`, `channels.signal.*`, `channels.imessage.*` -- Allowlist channel (Slack/Discord/Matrix/Microsoft Teams) saat Anda memilih ikut serta selama prompt (nama di-resolve ke ID bila memungkinkan). +- Allowlist channel (Slack/Discord/Matrix/Microsoft Teams) saat Anda memilihnya selama prompt (nama di-resolve menjadi ID bila memungkinkan). - `skills.install.nodeManager` - `setup --node-manager` menerima `npm`, `pnpm`, atau `bun`. - - Konfigurasi manual masih dapat menggunakan `yarn` dengan menetapkan `skills.install.nodeManager` secara langsung. + - Konfigurasi manual tetap dapat menggunakan `yarn` dengan menetapkan `skills.install.nodeManager` secara langsung. - `wizard.lastRunAt` - `wizard.lastRunVersion` - `wizard.lastRunCommit` @@ -240,13 +240,13 @@ Field umum di `~/.openclaw/openclaw.json`: Kredensial WhatsApp disimpan di `~/.openclaw/credentials/whatsapp//`. Sesi disimpan di `~/.openclaw/agents//sessions/`. -Beberapa channel dikirimkan sebagai plugin. Saat Anda memilih salah satunya selama penyiapan, onboarding +Beberapa channel disediakan sebagai Plugin. Saat Anda memilih salah satunya selama penyiapan, onboarding akan meminta untuk menginstalnya (npm atau path lokal) sebelum dapat dikonfigurasi. -## Dokumentasi terkait +## Dokumen terkait - Ikhtisar onboarding: [Onboarding (CLI)](/id/start/wizard) - Onboarding aplikasi macOS: [Onboarding](/id/start/onboarding) - Referensi konfigurasi: [Konfigurasi Gateway](/id/gateway/configuration) -- Provider: [WhatsApp](/id/channels/whatsapp), [Telegram](/id/channels/telegram), [Discord](/id/channels/discord), [Google Chat](/id/channels/googlechat), [Signal](/id/channels/signal), [BlueBubbles](/id/channels/bluebubbles) (iMessage), [iMessage](/id/channels/imessage) (lama) +- Penyedia: [WhatsApp](/id/channels/whatsapp), [Telegram](/id/channels/telegram), [Discord](/id/channels/discord), [Google Chat](/id/channels/googlechat), [Signal](/id/channels/signal), [BlueBubbles](/id/channels/bluebubbles) (iMessage), [iMessage](/id/channels/imessage) (lama) - Skills: [Skills](/id/tools/skills), [Konfigurasi Skills](/id/tools/skills-config) diff --git a/docs/id/start/wizard-cli-reference.md b/docs/id/start/wizard-cli-reference.md index c39b22123..82146b3d5 100644 --- a/docs/id/start/wizard-cli-reference.md +++ b/docs/id/start/wizard-cli-reference.md @@ -3,18 +3,18 @@ read_when: - Anda memerlukan perilaku terperinci untuk `openclaw onboard` - Anda sedang men-debug hasil onboarding atau mengintegrasikan klien onboarding sidebarTitle: CLI reference -summary: Referensi lengkap untuk alur setup CLI, setup auth/model, output, dan detail internal -title: Referensi Setup CLI +summary: Referensi lengkap untuk alur penyiapan CLI, penyiapan autentikasi/model, output, dan detail internal +title: Referensi Penyiapan CLI x-i18n: - generated_at: "2026-04-06T03:11:46Z" + generated_at: "2026-04-15T14:41:06Z" model: gpt-5.4 provider: openai - source_hash: 92f379b34a2b48c68335dae4f759117c770f018ec51b275f4f40421c6b3abb23 + source_hash: 61ca679caca3b43fa02388294007f89db22d343e49e10b61d8d118cd8fbb7369 source_path: start/wizard-cli-reference.md workflow: 15 --- -# Referensi Setup CLI +# Referensi Penyiapan CLI Halaman ini adalah referensi lengkap untuk `openclaw onboard`. Untuk panduan singkat, lihat [Onboarding (CLI)](/id/start/wizard). @@ -23,60 +23,60 @@ Untuk panduan singkat, lihat [Onboarding (CLI)](/id/start/wizard). Mode lokal (default) memandu Anda melalui: -- Setup model dan auth (OAuth subscription OpenAI Code, Anthropic Claude CLI atau API key, serta opsi MiniMax, GLM, Ollama, Moonshot, StepFun, dan AI Gateway) +- Penyiapan model dan autentikasi (OAuth langganan OpenAI Code, Anthropic Claude CLI atau API key, serta opsi MiniMax, GLM, Ollama, Moonshot, StepFun, dan AI Gateway) - Lokasi workspace dan file bootstrap -- Pengaturan gateway (port, bind, auth, Tailscale) -- Channel dan provider (Telegram, WhatsApp, Discord, Google Chat, Mattermost, Signal, BlueBubbles, dan plugin channel bawaan lainnya) -- Instalasi daemon (LaunchAgent, systemd user unit, atau native Windows Scheduled Task dengan fallback Startup-folder) +- Pengaturan Gateway (port, bind, auth, tailscale) +- Channel dan provider (Telegram, WhatsApp, Discord, Google Chat, Mattermost, Signal, BlueBubbles, dan Plugin channel bawaan lainnya) +- Instalasi daemon (LaunchAgent, systemd user unit, atau Scheduled Task Windows native dengan fallback folder Startup) - Pemeriksaan kesehatan -- Setup Skills +- Penyiapan Skills Mode remote mengonfigurasi mesin ini untuk terhubung ke gateway di tempat lain. -Mode ini tidak menginstal atau memodifikasi apa pun di host remote. +Mode ini tidak menginstal atau mengubah apa pun di host remote. ## Detail alur lokal - + - Jika `~/.openclaw/openclaw.json` ada, pilih Keep, Modify, atau Reset. - - Menjalankan ulang wizard tidak menghapus apa pun kecuali Anda secara eksplisit memilih Reset (atau memberikan `--reset`). - - `--reset` pada CLI default ke `config+creds+sessions`; gunakan `--reset-scope full` untuk juga menghapus workspace. - - Jika config tidak valid atau berisi kunci legacy, wizard berhenti dan meminta Anda menjalankan `openclaw doctor` sebelum melanjutkan. + - Menjalankan ulang wizard tidak akan menghapus apa pun kecuali Anda secara eksplisit memilih Reset (atau memberikan `--reset`). + - CLI `--reset` default ke `config+creds+sessions`; gunakan `--reset-scope full` untuk juga menghapus workspace. + - Jika konfigurasi tidak valid atau berisi key lama, wizard berhenti dan meminta Anda menjalankan `openclaw doctor` sebelum melanjutkan. - Reset menggunakan `trash` dan menawarkan cakupan: - - Hanya config - - Config + kredensial + sesi + - Hanya konfigurasi + - Konfigurasi + kredensial + sesi - Reset penuh (juga menghapus workspace) - - - Matriks opsi lengkap ada di [Opsi auth dan model](#opsi-auth-dan-model). + + - Matriks opsi lengkap ada di [Opsi autentikasi dan model](#auth-and-model-options). - Default `~/.openclaw/workspace` (dapat dikonfigurasi). - - Mengisi file workspace yang diperlukan untuk ritual bootstrap saat pertama kali dijalankan. + - Menyiapkan file workspace yang diperlukan untuk ritual bootstrap saat pertama kali dijalankan. - Tata letak workspace: [Workspace agen](/id/concepts/agent-workspace). - - Meminta port, bind, mode auth, dan eksposur Tailscale. - - Disarankan: tetap aktifkan auth token bahkan untuk loopback agar klien WS lokal harus melakukan autentikasi. - - Dalam mode token, setup interaktif menawarkan: - - **Buat/simpan token plaintext** (default) - - **Gunakan SecretRef** (opt-in) - - Dalam mode password, setup interaktif juga mendukung penyimpanan plaintext atau SecretRef. - - Path SecretRef token non-interaktif: `--gateway-token-ref-env `. - - Memerlukan env var yang tidak kosong dalam lingkungan proses onboarding. + - Meminta port, bind, mode auth, dan eksposur tailscale. + - Direkomendasikan: tetap aktifkan auth token bahkan untuk loopback agar klien WS lokal harus melakukan autentikasi. + - Dalam mode token, penyiapan interaktif menawarkan: + - **Generate/store plaintext token** (default) + - **Use SecretRef** (opsional) + - Dalam mode kata sandi, penyiapan interaktif juga mendukung penyimpanan plaintext atau SecretRef. + - Jalur SecretRef token non-interaktif: `--gateway-token-ref-env `. + - Memerlukan env var yang tidak kosong di environment proses onboarding. - Tidak dapat digabungkan dengan `--gateway-token`. - Nonaktifkan auth hanya jika Anda sepenuhnya memercayai setiap proses lokal. - Bind non-loopback tetap memerlukan auth. - [WhatsApp](/id/channels/whatsapp): login QR opsional - - [Telegram](/id/channels/telegram): bot token - - [Discord](/id/channels/discord): bot token - - [Google Chat](/id/channels/googlechat): JSON service account + webhook audience - - [Mattermost](/id/channels/mattermost): bot token + base URL - - [Signal](/id/channels/signal): instalasi `signal-cli` opsional + config akun - - [BlueBubbles](/id/channels/bluebubbles): direkomendasikan untuk iMessage; URL server + password + webhook - - [iMessage](/id/channels/imessage): path `imsg` CLI legacy + akses DB + - [Telegram](/id/channels/telegram): token bot + - [Discord](/id/channels/discord): token bot + - [Google Chat](/id/channels/googlechat): JSON akun layanan + audiens webhook + - [Mattermost](/id/channels/mattermost): token bot + URL dasar + - [Signal](/id/channels/signal): instalasi `signal-cli` opsional + konfigurasi akun + - [BlueBubbles](/id/channels/bluebubbles): direkomendasikan untuk iMessage; URL server + kata sandi + webhook + - [iMessage](/id/channels/imessage): jalur CLI `imsg` lama + akses DB - Keamanan DM: default-nya adalah pairing. DM pertama mengirim kode; setujui melalui `openclaw pairing approve ` atau gunakan allowlist. @@ -84,30 +84,30 @@ Mode ini tidak menginstal atau memodifikasi apa pun di host remote. - macOS: LaunchAgent - Memerlukan sesi pengguna yang sedang login; untuk headless, gunakan LaunchDaemon kustom (tidak disertakan). - Linux dan Windows melalui WSL2: systemd user unit - - Wizard mencoba `loginctl enable-linger ` agar gateway tetap aktif setelah logout. - - Dapat meminta sudo (menulis ke `/var/lib/systemd/linger`); pertama-tama mencoba tanpa sudo. - - Native Windows: Scheduled Task terlebih dahulu - - Jika pembuatan task ditolak, OpenClaw fallback ke item login Startup-folder per pengguna dan langsung menyalakan gateway. + - Wizard mencoba `loginctl enable-linger ` agar gateway tetap berjalan setelah logout. + - Mungkin meminta sudo (menulis `/var/lib/systemd/linger`); pertama-tama mencoba tanpa sudo. + - Windows native: Scheduled Task terlebih dahulu + - Jika pembuatan task ditolak, OpenClaw akan fallback ke item login folder Startup per pengguna dan segera memulai gateway. - Scheduled Task tetap lebih disukai karena memberikan status supervisor yang lebih baik. - - Pemilihan runtime: Node (disarankan; wajib untuk WhatsApp dan Telegram). Bun tidak disarankan. + - Pemilihan runtime: Node (direkomendasikan; diperlukan untuk WhatsApp dan Telegram). Bun tidak direkomendasikan. - - Menyalakan gateway (jika perlu) dan menjalankan `openclaw health`. - - `openclaw status --deep` menambahkan probe kesehatan gateway live ke output status, termasuk probe channel bila didukung. + - Memulai gateway (jika perlu) dan menjalankan `openclaw health`. + - `openclaw status --deep` menambahkan probe kesehatan gateway langsung ke output status, termasuk probe channel jika didukung. - Membaca Skills yang tersedia dan memeriksa persyaratan. - Memungkinkan Anda memilih manajer node: npm, pnpm, atau bun. - - Menginstal dependency opsional (sebagian menggunakan Homebrew di macOS). + - Menginstal dependensi opsional (beberapa menggunakan Homebrew di macOS). - - Ringkasan dan langkah selanjutnya, termasuk opsi app iOS, Android, dan macOS. + - Ringkasan dan langkah berikutnya, termasuk opsi aplikasi iOS, Android, dan macOS. Jika tidak ada GUI yang terdeteksi, wizard mencetak instruksi port-forward SSH untuk Control UI alih-alih membuka browser. -Jika aset Control UI tidak ada, wizard mencoba membangunnya; fallback-nya adalah `pnpm ui:build` (secara otomatis menginstal dependency UI). +Jika aset Control UI tidak ada, wizard mencoba membangunnya; fallback-nya adalah `pnpm ui:build` (secara otomatis menginstal dependensi UI). ## Detail mode remote @@ -115,52 +115,52 @@ Jika aset Control UI tidak ada, wizard mencoba membangunnya; fallback-nya adalah Mode remote mengonfigurasi mesin ini untuk terhubung ke gateway di tempat lain. -Mode remote tidak menginstal atau memodifikasi apa pun di host remote. +Mode remote tidak menginstal atau mengubah apa pun di host remote. -Yang Anda tetapkan: +Yang Anda atur: - URL gateway remote (`ws://...`) -- Token jika auth gateway remote diperlukan (disarankan) +- Token jika auth gateway remote diperlukan (direkomendasikan) - Jika gateway hanya loopback, gunakan tunneling SSH atau tailnet. -- Petunjuk penemuan: +- Petunjuk discovery: - macOS: Bonjour (`dns-sd`) - Linux: Avahi (`avahi-browse`) -## Opsi auth dan model +## Opsi autentikasi dan model - + Menggunakan `ANTHROPIC_API_KEY` jika ada atau meminta key, lalu menyimpannya untuk penggunaan daemon. - + Jika `~/.codex/auth.json` ada, wizard dapat menggunakannya kembali. Kredensial Codex CLI yang digunakan ulang tetap dikelola oleh Codex CLI; saat kedaluwarsa OpenClaw - membaca ulang sumber itu terlebih dahulu dan, ketika provider dapat me-refresh-nya, menulis - kredensial yang diperbarui kembali ke penyimpanan Codex alih-alih mengambil alih kepemilikannya + terlebih dahulu membaca ulang sumber tersebut dan, ketika provider dapat me-refresh-nya, menulis + kembali kredensial yang diperbarui ke penyimpanan Codex alih-alih mengambil alih pengelolaannya sendiri. - + Alur browser; tempel `code#state`. - Menetapkan `agents.defaults.model` ke `openai-codex/gpt-5.4` saat model belum ditetapkan atau `openai/*`. + Mengatur `agents.defaults.model` ke `openai-codex/gpt-5.4` saat model belum disetel atau `openai/*`. - - Menggunakan `OPENAI_API_KEY` jika ada atau meminta key, lalu menyimpan kredensial di profil auth. + + Menggunakan `OPENAI_API_KEY` jika ada atau meminta key, lalu menyimpan kredensial dalam profil auth. - Menetapkan `agents.defaults.model` ke `openai/gpt-5.4` saat model belum ditetapkan, `openai/*`, atau `openai-codex/*`. + Mengatur `agents.defaults.model` ke `openai/gpt-5.4` saat model belum disetel, `openai/*`, atau `openai-codex/*`. - + Meminta `XAI_API_KEY` dan mengonfigurasi xAI sebagai provider model. Meminta `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`) dan memungkinkan Anda memilih katalog Zen atau Go. - URL setup: [opencode.ai/auth](https://opencode.ai/auth). + URL penyiapan: [opencode.ai/auth](https://opencode.ai/auth). Menyimpan key untuk Anda. @@ -170,38 +170,40 @@ Yang Anda tetapkan: Detail lebih lanjut: [Vercel AI Gateway](/id/providers/vercel-ai-gateway). - Meminta account ID, gateway ID, dan `CLOUDFLARE_AI_GATEWAY_API_KEY`. + Meminta ID akun, ID gateway, dan `CLOUDFLARE_AI_GATEWAY_API_KEY`. Detail lebih lanjut: [Cloudflare AI Gateway](/id/providers/cloudflare-ai-gateway). - Config ditulis secara otomatis. Default hosted adalah `MiniMax-M2.7`; setup API key menggunakan - `minimax/...`, dan setup OAuth menggunakan `minimax-portal/...`. + Konfigurasi ditulis otomatis. Default host adalah `MiniMax-M2.7`; penyiapan API key menggunakan + `minimax/...`, dan penyiapan OAuth menggunakan `minimax-portal/...`. Detail lebih lanjut: [MiniMax](/id/providers/minimax). - Config ditulis secara otomatis untuk endpoint standar StepFun atau Step Plan pada endpoint China atau global. - Standar saat ini mencakup `step-3.5-flash`, dan Step Plan juga mencakup `step-3.5-flash-2603`. + Konfigurasi ditulis otomatis untuk StepFun standard atau Step Plan pada endpoint China atau global. + Standard saat ini mencakup `step-3.5-flash`, dan Step Plan juga mencakup `step-3.5-flash-2603`. Detail lebih lanjut: [StepFun](/id/providers/stepfun). - + Meminta `SYNTHETIC_API_KEY`. Detail lebih lanjut: [Synthetic](/id/providers/synthetic). - - Meminta base URL (default `http://127.0.0.1:11434`), lalu menawarkan mode Cloud + Local atau Local. - Menemukan model yang tersedia dan menyarankan default. + + Pertama meminta `Cloud + Local`, `Cloud only`, atau `Local only`. + `Cloud only` menggunakan `OLLAMA_API_KEY` dengan `https://ollama.com`. + Mode berbasis host meminta URL dasar (default `http://127.0.0.1:11434`), menemukan model yang tersedia, dan menyarankan default. + `Cloud + Local` juga memeriksa apakah host Ollama tersebut sudah login untuk akses cloud. Detail lebih lanjut: [Ollama](/id/providers/ollama). - Config Moonshot (Kimi K2) dan Kimi Coding ditulis secara otomatis. + Konfigurasi Moonshot (Kimi K2) dan Kimi Coding ditulis otomatis. Detail lebih lanjut: [Moonshot AI (Kimi + Kimi Coding)](/id/providers/moonshot). - Berfungsi dengan endpoint yang kompatibel dengan OpenAI dan kompatibel dengan Anthropic. + Bekerja dengan endpoint yang kompatibel dengan OpenAI dan kompatibel dengan Anthropic. Onboarding interaktif mendukung pilihan penyimpanan API key yang sama seperti alur API key provider lainnya: - - **Tempel API key sekarang** (plaintext) - - **Gunakan secret reference** (env ref atau provider ref yang dikonfigurasi, dengan validasi preflight) + - **Paste API key now** (plaintext) + - **Use secret reference** (referensi env atau referensi provider yang dikonfigurasi, dengan validasi preflight) Flag non-interaktif: - `--auth-choice custom-api-key` @@ -220,63 +222,63 @@ Yang Anda tetapkan: Perilaku model: - Pilih model default dari opsi yang terdeteksi, atau masukkan provider dan model secara manual. -- Saat onboarding dimulai dari pilihan auth provider, pemilih model mengutamakan +- Saat onboarding dimulai dari pilihan auth provider, pemilih model akan memprioritaskan provider tersebut secara otomatis. Untuk Volcengine dan BytePlus, preferensi yang sama juga cocok dengan varian coding-plan mereka (`volcengine-plan/*`, `byteplus-plan/*`). - Jika filter provider yang diprioritaskan itu kosong, pemilih akan fallback ke - katalog penuh alih-alih tidak menampilkan model sama sekali. + katalog lengkap alih-alih tidak menampilkan model apa pun. - Wizard menjalankan pemeriksaan model dan memperingatkan jika model yang dikonfigurasi tidak dikenal atau auth tidak ada. -Path kredensial dan profil: +Jalur kredensial dan profil: - Profil auth (API key + OAuth): `~/.openclaw/agents//agent/auth-profiles.json` -- Impor OAuth legacy: `~/.openclaw/credentials/oauth.json` +- Impor OAuth lama: `~/.openclaw/credentials/oauth.json` Mode penyimpanan kredensial: -- Perilaku onboarding default menyimpan API key sebagai nilai plaintext di profil auth. -- `--secret-input-mode ref` mengaktifkan mode reference alih-alih penyimpanan key plaintext. - Dalam setup interaktif, Anda dapat memilih: - - env variable ref (misalnya `keyRef: { source: "env", provider: "default", id: "OPENAI_API_KEY" }`) - - provider ref yang dikonfigurasi (`file` atau `exec`) dengan alias + id provider -- Mode reference interaktif menjalankan validasi preflight cepat sebelum menyimpan. - - Env refs: memvalidasi nama variabel + nilai tidak kosong dalam lingkungan onboarding saat ini. - - Provider refs: memvalidasi config provider dan menyelesaikan id yang diminta. +- Perilaku onboarding default menyimpan API key sebagai nilai plaintext dalam profil auth. +- `--secret-input-mode ref` mengaktifkan mode referensi alih-alih penyimpanan key plaintext. + Dalam penyiapan interaktif, Anda dapat memilih salah satu: + - referensi env var (misalnya `keyRef: { source: "env", provider: "default", id: "OPENAI_API_KEY" }`) + - referensi provider yang dikonfigurasi (`file` atau `exec`) dengan alias provider + id +- Mode referensi interaktif menjalankan validasi preflight cepat sebelum menyimpan. + - Referensi env: memvalidasi nama variabel + nilai tidak kosong di environment onboarding saat ini. + - Referensi provider: memvalidasi konfigurasi provider dan me-resolve id yang diminta. - Jika preflight gagal, onboarding menampilkan error dan memungkinkan Anda mencoba lagi. -- Dalam mode non-interaktif, `--secret-input-mode ref` hanya didukung berbasis env. - - Tetapkan env var provider dalam lingkungan proses onboarding. - - Flag key inline (misalnya `--openai-api-key`) mengharuskan env var tersebut ditetapkan; jika tidak onboarding akan gagal cepat. +- Dalam mode non-interaktif, `--secret-input-mode ref` hanya didukung dengan env. + - Setel env var provider di environment proses onboarding. + - Flag key inline (misalnya `--openai-api-key`) mensyaratkan env var tersebut disetel; jika tidak, onboarding gagal cepat. - Untuk provider kustom, mode `ref` non-interaktif menyimpan `models.providers..apiKey` sebagai `{ source: "env", provider: "default", id: "CUSTOM_API_KEY" }`. - - Dalam kasus provider kustom tersebut, `--custom-api-key` mengharuskan `CUSTOM_API_KEY` ditetapkan; jika tidak onboarding akan gagal cepat. -- Kredensial auth gateway mendukung pilihan plaintext dan SecretRef dalam setup interaktif: - - Mode token: **Buat/simpan token plaintext** (default) atau **Gunakan SecretRef**. - - Mode password: plaintext atau SecretRef. -- Path SecretRef token non-interaktif: `--gateway-token-ref-env `. -- Setup plaintext yang ada tetap berfungsi tanpa perubahan. + - Dalam kasus provider kustom tersebut, `--custom-api-key` mensyaratkan `CUSTOM_API_KEY` disetel; jika tidak, onboarding gagal cepat. +- Kredensial auth gateway mendukung pilihan plaintext dan SecretRef dalam penyiapan interaktif: + - Mode token: **Generate/store plaintext token** (default) atau **Use SecretRef**. + - Mode kata sandi: plaintext atau SecretRef. +- Jalur SecretRef token non-interaktif: `--gateway-token-ref-env `. +- Penyiapan plaintext yang sudah ada tetap berfungsi tanpa perubahan. -Tip headless dan server: selesaikan OAuth di mesin yang memiliki browser, lalu salin -`auth-profiles.json` milik agen tersebut (misalnya +Tip untuk headless dan server: selesaikan OAuth di mesin dengan browser, lalu salin +`auth-profiles.json` agen tersebut (misalnya `~/.openclaw/agents//agent/auth-profiles.json`, atau path `$OPENCLAW_STATE_DIR/...` yang sesuai) ke host gateway. `credentials/oauth.json` -hanya merupakan sumber impor legacy. +hanya merupakan sumber impor lama. ## Output dan detail internal -Field yang umum di `~/.openclaw/openclaw.json`: +Field umum dalam `~/.openclaw/openclaw.json`: - `agents.defaults.workspace` - `agents.defaults.model` / `models.providers` (jika Minimax dipilih) -- `tools.profile` (onboarding lokal default ke `"coding"` saat belum ditetapkan; nilai eksplisit yang sudah ada dipertahankan) -- `gateway.*` (mode, bind, auth, Tailscale) -- `session.dmScope` (onboarding lokal default-nya `per-channel-peer` saat belum ditetapkan; nilai eksplisit yang sudah ada dipertahankan) +- `tools.profile` (onboarding lokal default ke `"coding"` saat belum disetel; nilai eksplisit yang sudah ada tetap dipertahankan) +- `gateway.*` (mode, bind, auth, tailscale) +- `session.dmScope` (onboarding lokal secara default menetapkan ini ke `per-channel-peer` saat belum disetel; nilai eksplisit yang sudah ada tetap dipertahankan) - `channels.telegram.botToken`, `channels.discord.token`, `channels.matrix.*`, `channels.signal.*`, `channels.imessage.*` -- Allowlist channel (Slack, Discord, Matrix, Microsoft Teams) saat Anda melakukan opt-in selama prompt (nama diselesaikan ke ID bila memungkinkan) +- Allowlist channel (Slack, Discord, Matrix, Microsoft Teams) saat Anda ikut serta selama prompt (nama di-resolve menjadi ID jika memungkinkan) - `skills.install.nodeManager` - Flag `setup --node-manager` menerima `npm`, `pnpm`, atau `bun`. - - Config manual tetap dapat menetapkan `skills.install.nodeManager: "yarn"` nanti. + - Konfigurasi manual masih dapat menetapkan `skills.install.nodeManager: "yarn"` nanti. - `wizard.lastRunAt` - `wizard.lastRunVersion` - `wizard.lastRunCommit` @@ -285,34 +287,34 @@ Field yang umum di `~/.openclaw/openclaw.json`: `openclaw agents add` menulis `agents.list[]` dan `bindings` opsional. -Kredensial WhatsApp berada di `~/.openclaw/credentials/whatsapp//`. -Sesi disimpan di `~/.openclaw/agents//sessions/`. +Kredensial WhatsApp berada di bawah `~/.openclaw/credentials/whatsapp//`. +Sesi disimpan di bawah `~/.openclaw/agents//sessions/`. -Sebagian channel dikirim sebagai plugin. Saat dipilih selama setup, wizard -meminta untuk menginstal plugin tersebut (npm atau path lokal) sebelum konfigurasi channel. +Beberapa channel dikirim sebagai Plugin. Saat dipilih selama penyiapan, wizard +meminta untuk menginstal Plugin (npm atau path lokal) sebelum konfigurasi channel. -RPC wizard gateway: +RPC wizard Gateway: - `wizard.start` - `wizard.next` - `wizard.cancel` - `wizard.status` -Klien (app macOS dan Control UI) dapat merender langkah-langkah tanpa mengimplementasikan ulang logika onboarding. +Klien (aplikasi macOS dan Control UI) dapat merender langkah-langkah tanpa mengimplementasikan ulang logika onboarding. -Perilaku setup Signal: +Perilaku penyiapan Signal: -- Mengunduh release asset yang sesuai -- Menyimpannya di `~/.openclaw/tools/signal-cli//` -- Menulis `channels.signal.cliPath` di config +- Mengunduh aset rilis yang sesuai +- Menyimpannya di bawah `~/.openclaw/tools/signal-cli//` +- Menulis `channels.signal.cliPath` dalam konfigurasi - Build JVM memerlukan Java 21 -- Build native digunakan bila tersedia -- Windows menggunakan WSL2 dan mengikuti alur `signal-cli` Linux di dalam WSL +- Build native digunakan jika tersedia +- Windows menggunakan WSL2 dan mengikuti alur Linux signal-cli di dalam WSL -## Dokumentasi terkait +## Dokumen terkait -- Pusat onboarding: [Onboarding (CLI)](/id/start/wizard) -- Otomasi dan skrip: [Otomasi CLI](/id/start/wizard-cli-automation) +- Hub onboarding: [Onboarding (CLI)](/id/start/wizard) +- Otomatisasi dan skrip: [Otomatisasi CLI](/id/start/wizard-cli-automation) - Referensi perintah: [`openclaw onboard`](/cli/onboard)