chore(i18n): refresh id translations
This commit is contained in:
parent
277b009cc2
commit
a1afd87bfe
File diff suppressed because it is too large
Load Diff
@ -1,25 +1,25 @@
|
||||
---
|
||||
read_when:
|
||||
- Anda memerlukan panduan langkah demi langkah yang tepat tentang loop agen atau peristiwa siklus hidup
|
||||
summary: Siklus hidup loop agen, stream, dan semantik wait
|
||||
summary: Siklus hidup loop agen, aliran, dan semantik penantian
|
||||
title: Loop Agen
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T13:50:47Z"
|
||||
generated_at: "2026-04-09T01:27:55Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 8e562e63c494881e9c345efcb93c5f972d69aaec61445afc3d4ad026b2d26883
|
||||
source_hash: 32d3a73df8dabf449211a6183a70dcfd2a9b6f584dc76d0c4c9147582b2ca6a1
|
||||
source_path: concepts/agent-loop.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Loop Agen (OpenClaw)
|
||||
|
||||
Loop agentik adalah eksekusi “nyata” penuh dari sebuah agen: intake → perakitan konteks → inferensi model →
|
||||
eksekusi tool → balasan streaming → persistensi. Ini adalah jalur otoritatif yang mengubah sebuah pesan
|
||||
Loop agentik adalah keseluruhan proses “nyata” agen: intake → perakitan konteks → inferensi model →
|
||||
eksekusi alat → balasan streaming → persistensi. Ini adalah jalur otoritatif yang mengubah pesan
|
||||
menjadi tindakan dan balasan akhir, sambil menjaga status sesi tetap konsisten.
|
||||
|
||||
Di OpenClaw, sebuah loop adalah satu eksekusi terserialisasi per sesi yang memancarkan peristiwa siklus hidup dan stream
|
||||
saat model berpikir, memanggil tool, dan melakukan streaming output. Dokumen ini menjelaskan bagaimana loop autentik tersebut
|
||||
Di OpenClaw, loop adalah satu proses tunggal yang diserialkan per sesi yang memancarkan peristiwa siklus hidup dan stream
|
||||
saat model berpikir, memanggil alat, dan melakukan streaming output. Dokumen ini menjelaskan bagaimana loop autentik tersebut
|
||||
dirangkai dari ujung ke ujung.
|
||||
|
||||
## Titik masuk
|
||||
@ -29,147 +29,148 @@ dirangkai dari ujung ke ujung.
|
||||
|
||||
## Cara kerjanya (tingkat tinggi)
|
||||
|
||||
1. RPC `agent` memvalidasi parameter, menyelesaikan sesi (sessionKey/sessionId), menyimpan metadata sesi, dan langsung mengembalikan `{ runId, acceptedAt }`.
|
||||
1. RPC `agent` memvalidasi parameter, menyelesaikan sesi (sessionKey/sessionId), menyimpan metadata sesi, dan segera mengembalikan `{ runId, acceptedAt }`.
|
||||
2. `agentCommand` menjalankan agen:
|
||||
- menyelesaikan default model + thinking/verbose
|
||||
- memuat snapshot Skills
|
||||
- memanggil `runEmbeddedPiAgent` (runtime pi-agent-core)
|
||||
- memancarkan **lifecycle end/error** jika loop tersemat tidak memancarkan salah satunya
|
||||
- memancarkan **akhir/error siklus hidup** jika loop tersemat tidak memancarkan salah satunya
|
||||
3. `runEmbeddedPiAgent`:
|
||||
- menserialisasi eksekusi melalui antrean per sesi + global
|
||||
- menserialkan proses melalui antrean per sesi + global
|
||||
- menyelesaikan model + profil auth dan membangun sesi pi
|
||||
- berlangganan ke peristiwa pi dan melakukan streaming delta assistant/tool
|
||||
- menerapkan timeout -> membatalkan eksekusi jika terlampaui
|
||||
- berlangganan ke peristiwa pi dan melakukan streaming delta asisten/alat
|
||||
- menegakkan batas waktu -> membatalkan proses jika terlampaui
|
||||
- mengembalikan payload + metadata penggunaan
|
||||
4. `subscribeEmbeddedPiSession` menjembatani peristiwa pi-agent-core ke stream `agent` OpenClaw:
|
||||
- peristiwa tool => `stream: "tool"`
|
||||
- delta assistant => `stream: "assistant"`
|
||||
- peristiwa lifecycle => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`)
|
||||
- peristiwa alat => `stream: "tool"`
|
||||
- delta asisten => `stream: "assistant"`
|
||||
- peristiwa siklus hidup => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`)
|
||||
5. `agent.wait` menggunakan `waitForAgentRun`:
|
||||
- menunggu **lifecycle end/error** untuk `runId`
|
||||
- menunggu **akhir/error siklus hidup** untuk `runId`
|
||||
- mengembalikan `{ status: ok|error|timeout, startedAt, endedAt, error? }`
|
||||
|
||||
## Antrean + konkurensi
|
||||
|
||||
- Eksekusi diserialisasi per kunci sesi (jalur sesi) dan secara opsional melalui jalur global.
|
||||
- Ini mencegah race tool/sesi dan menjaga riwayat sesi tetap konsisten.
|
||||
- Proses diserialkan per kunci sesi (jalur sesi) dan secara opsional melalui jalur global.
|
||||
- Ini mencegah race pada alat/sesi dan menjaga riwayat sesi tetap konsisten.
|
||||
- Kanal pesan dapat memilih mode antrean (collect/steer/followup) yang masuk ke sistem jalur ini.
|
||||
Lihat [Antrean Perintah](/concepts/queue).
|
||||
Lihat [Antrean Perintah](/id/concepts/queue).
|
||||
|
||||
## Persiapan sesi + workspace
|
||||
|
||||
- Workspace diselesaikan dan dibuat; eksekusi tersandbox dapat mengalihkan ke root workspace sandbox.
|
||||
- Workspace diselesaikan dan dibuat; proses tersandbox dapat dialihkan ke root workspace sandbox.
|
||||
- Skills dimuat (atau digunakan kembali dari snapshot) dan disuntikkan ke env dan prompt.
|
||||
- File bootstrap/konteks diselesaikan dan disuntikkan ke laporan system prompt.
|
||||
- Lock tulis sesi diperoleh; `SessionManager` dibuka dan disiapkan sebelum streaming.
|
||||
- Kunci tulis sesi diperoleh; `SessionManager` dibuka dan disiapkan sebelum streaming.
|
||||
|
||||
## Perakitan prompt + system prompt
|
||||
|
||||
- System prompt dibangun dari prompt dasar OpenClaw, prompt Skills, konteks bootstrap, dan override per eksekusi.
|
||||
- System prompt dibangun dari prompt dasar OpenClaw, prompt Skills, konteks bootstrap, dan override per proses.
|
||||
- Batas khusus model dan token cadangan compaction diterapkan.
|
||||
- Lihat [System prompt](/concepts/system-prompt) untuk mengetahui apa yang dilihat model.
|
||||
- Lihat [System prompt](/id/concepts/system-prompt) untuk apa yang dilihat model.
|
||||
|
||||
## Titik hook (tempat Anda dapat mencegat)
|
||||
|
||||
OpenClaw memiliki dua sistem hook:
|
||||
|
||||
- **Internal hooks** (Gateway hooks): skrip berbasis peristiwa untuk perintah dan peristiwa siklus hidup.
|
||||
- **Plugin hooks**: titik ekstensi di dalam siklus hidup agen/tool dan pipeline gateway.
|
||||
- **Hook internal** (hook Gateway): skrip berbasis peristiwa untuk perintah dan peristiwa siklus hidup.
|
||||
- **Hook plugin**: titik ekstensi di dalam siklus hidup agen/alat dan pipeline gateway.
|
||||
|
||||
### Internal hooks (Gateway hooks)
|
||||
### Hook internal (hook Gateway)
|
||||
|
||||
- **`agent:bootstrap`**: berjalan saat membangun file bootstrap sebelum system prompt difinalkan.
|
||||
Gunakan ini untuk menambahkan/menghapus file konteks bootstrap.
|
||||
- **Command hooks**: `/new`, `/reset`, `/stop`, dan peristiwa perintah lainnya (lihat dokumen Hooks).
|
||||
Gunakan ini untuk menambah/menghapus file konteks bootstrap.
|
||||
- **Hook perintah**: `/new`, `/reset`, `/stop`, dan peristiwa perintah lainnya (lihat dokumen Hooks).
|
||||
|
||||
Lihat [Hooks](/id/automation/hooks) untuk penyiapan dan contoh.
|
||||
|
||||
### Plugin hooks (siklus hidup agen + gateway)
|
||||
### Hook plugin (siklus hidup agen + gateway)
|
||||
|
||||
Hook ini berjalan di dalam loop agen atau pipeline gateway:
|
||||
|
||||
- **`before_model_resolve`**: berjalan sebelum sesi (tanpa `messages`) untuk meng-override provider/model secara deterministik sebelum penyelesaian model.
|
||||
- **`before_prompt_build`**: berjalan setelah sesi dimuat (dengan `messages`) untuk menyuntikkan `prependContext`, `systemPrompt`, `prependSystemContext`, atau `appendSystemContext` sebelum prompt dikirim. Gunakan `prependContext` untuk teks dinamis per giliran dan field system-context untuk panduan stabil yang seharusnya berada di ruang system prompt.
|
||||
- **`before_agent_start`**: hook kompatibilitas lama yang dapat berjalan di salah satu fase; pilih hook eksplisit di atas.
|
||||
- **`before_agent_reply`**: berjalan setelah tindakan inline dan sebelum panggilan LLM, memungkinkan plugin mengklaim giliran dan mengembalikan balasan sintetis atau membisukan giliran sepenuhnya.
|
||||
- **`agent_end`**: memeriksa daftar pesan akhir dan metadata eksekusi setelah selesai.
|
||||
- **`before_model_resolve`**: berjalan pra-sesi (tanpa `messages`) untuk mengganti provider/model secara deterministik sebelum resolusi model.
|
||||
- **`before_prompt_build`**: berjalan setelah sesi dimuat (dengan `messages`) untuk menyuntikkan `prependContext`, `systemPrompt`, `prependSystemContext`, atau `appendSystemContext` sebelum prompt dikirim. Gunakan `prependContext` untuk teks dinamis per giliran dan field konteks sistem untuk panduan stabil yang seharusnya berada di ruang system prompt.
|
||||
- **`before_agent_start`**: hook kompatibilitas lama yang dapat berjalan pada salah satu fase; gunakan hook eksplisit di atas jika memungkinkan.
|
||||
- **`before_agent_reply`**: berjalan setelah tindakan inline dan sebelum pemanggilan LLM, memungkinkan plugin mengklaim giliran dan mengembalikan balasan sintetis atau membisukan giliran sepenuhnya.
|
||||
- **`agent_end`**: memeriksa daftar pesan akhir dan metadata proses setelah selesai.
|
||||
- **`before_compaction` / `after_compaction`**: mengamati atau memberi anotasi pada siklus compaction.
|
||||
- **`before_tool_call` / `after_tool_call`**: mencegat parameter/hasil tool.
|
||||
- **`before_tool_call` / `after_tool_call`**: mencegat parameter/hasil alat.
|
||||
- **`before_install`**: memeriksa temuan pemindaian bawaan dan secara opsional memblokir instalasi skill atau plugin.
|
||||
- **`tool_result_persist`**: secara sinkron mentransformasi hasil tool sebelum ditulis ke transkrip sesi.
|
||||
- **`tool_result_persist`**: secara sinkron mengubah hasil alat sebelum ditulis ke transkrip sesi.
|
||||
- **`message_received` / `message_sending` / `message_sent`**: hook pesan masuk + keluar.
|
||||
- **`session_start` / `session_end`**: batas siklus hidup sesi.
|
||||
- **`gateway_start` / `gateway_stop`**: peristiwa siklus hidup gateway.
|
||||
|
||||
Aturan keputusan hook untuk pengaman keluar/tool:
|
||||
Aturan keputusan hook untuk pengaman keluar/alat:
|
||||
|
||||
- `before_tool_call`: `{ block: true }` bersifat terminal dan menghentikan handler dengan prioritas lebih rendah.
|
||||
- `before_tool_call`: `{ block: true }` bersifat terminal dan menghentikan handler prioritas lebih rendah.
|
||||
- `before_tool_call`: `{ block: false }` adalah no-op dan tidak menghapus blok sebelumnya.
|
||||
- `before_install`: `{ block: true }` bersifat terminal dan menghentikan handler dengan prioritas lebih rendah.
|
||||
- `before_install`: `{ block: true }` bersifat terminal dan menghentikan handler prioritas lebih rendah.
|
||||
- `before_install`: `{ block: false }` adalah no-op dan tidak menghapus blok sebelumnya.
|
||||
- `message_sending`: `{ cancel: true }` bersifat terminal dan menghentikan handler dengan prioritas lebih rendah.
|
||||
- `message_sending`: `{ cancel: true }` bersifat terminal dan menghentikan handler prioritas lebih rendah.
|
||||
- `message_sending`: `{ cancel: false }` adalah no-op dan tidak menghapus cancel sebelumnya.
|
||||
|
||||
Lihat [Plugin hooks](/plugins/architecture#provider-runtime-hooks) untuk API hook dan detail pendaftaran.
|
||||
Lihat [Hook plugin](/id/plugins/architecture#provider-runtime-hooks) untuk API hook dan detail pendaftaran.
|
||||
|
||||
## Streaming + balasan parsial
|
||||
|
||||
- Delta assistant di-stream dari pi-agent-core dan dipancarkan sebagai peristiwa `assistant`.
|
||||
- Block streaming dapat memancarkan balasan parsial baik pada `text_end` maupun `message_end`.
|
||||
- Delta asisten di-stream dari pi-agent-core dan dipancarkan sebagai peristiwa `assistant`.
|
||||
- Streaming blok dapat memancarkan balasan parsial pada `text_end` atau `message_end`.
|
||||
- Streaming reasoning dapat dipancarkan sebagai stream terpisah atau sebagai balasan blok.
|
||||
- Lihat [Streaming](/concepts/streaming) untuk perilaku chunking dan balasan blok.
|
||||
- Lihat [Streaming](/id/concepts/streaming) untuk perilaku chunking dan balasan blok.
|
||||
|
||||
## Eksekusi tool + tool pesan
|
||||
## Eksekusi alat + alat pesan
|
||||
|
||||
- Peristiwa mulai/pembaruan/akhir tool dipancarkan pada stream `tool`.
|
||||
- Hasil tool disanitasi untuk ukuran dan payload gambar sebelum dicatat/dipancarkan.
|
||||
- Pengiriman tool pesan dilacak untuk menekan konfirmasi assistant duplikat.
|
||||
- Peristiwa mulai/pembaruan/akhir alat dipancarkan pada stream `tool`.
|
||||
- Hasil alat disanitasi untuk ukuran dan payload gambar sebelum dicatat/dipancarkan.
|
||||
- Pengiriman alat pesan dilacak untuk menekan konfirmasi asisten duplikat.
|
||||
|
||||
## Pembentukan balasan + penekanan
|
||||
|
||||
- Payload akhir dirakit dari:
|
||||
- teks assistant (dan reasoning opsional)
|
||||
- ringkasan tool inline (saat verbose + diizinkan)
|
||||
- teks error assistant saat model mengalami error
|
||||
- Token senyap persis `NO_REPLY` / `no_reply` difilter dari
|
||||
payload keluar.
|
||||
- Duplikat tool pesan dihapus dari daftar payload akhir.
|
||||
- Jika tidak ada payload yang dapat dirender tersisa dan sebuah tool mengalami error, balasan error tool fallback dipancarkan
|
||||
(kecuali tool pesan sudah mengirim balasan yang terlihat oleh pengguna).
|
||||
- teks asisten (dan reasoning opsional)
|
||||
- ringkasan alat inline (saat verbose + diizinkan)
|
||||
- teks error asisten saat model mengalami error
|
||||
- Token senyap yang tepat `NO_REPLY` / `no_reply` difilter dari payload
|
||||
keluar.
|
||||
- Duplikat alat pesan dihapus dari daftar payload akhir.
|
||||
- Jika tidak ada payload yang dapat dirender yang tersisa dan alat mengalami error, balasan error alat fallback dipancarkan
|
||||
(kecuali alat pesan sudah mengirim balasan yang terlihat oleh pengguna).
|
||||
|
||||
## Compaction + percobaan ulang
|
||||
|
||||
- Auto-compaction memancarkan peristiwa stream `compaction` dan dapat memicu percobaan ulang.
|
||||
- Saat percobaan ulang, buffer dalam memori dan ringkasan tool direset untuk menghindari output duplikat.
|
||||
- Lihat [Compaction](/concepts/compaction) untuk pipeline compaction.
|
||||
- Saat percobaan ulang, buffer dalam memori dan ringkasan alat direset untuk menghindari output duplikat.
|
||||
- Lihat [Compaction](/id/concepts/compaction) untuk pipeline compaction.
|
||||
|
||||
## Stream peristiwa (saat ini)
|
||||
|
||||
- `lifecycle`: dipancarkan oleh `subscribeEmbeddedPiSession` (dan sebagai fallback oleh `agentCommand`)
|
||||
- `assistant`: delta streaming dari pi-agent-core
|
||||
- `tool`: peristiwa tool streaming dari pi-agent-core
|
||||
- `tool`: peristiwa alat streaming dari pi-agent-core
|
||||
|
||||
## Penanganan kanal chat
|
||||
|
||||
- Delta assistant dibuffer menjadi pesan chat `delta`.
|
||||
- Chat `final` dipancarkan pada **lifecycle end/error**.
|
||||
- Delta asisten dibuffer ke dalam pesan chat `delta`.
|
||||
- Chat `final` dipancarkan pada **akhir/error siklus hidup**.
|
||||
|
||||
## Timeout
|
||||
## Batas waktu
|
||||
|
||||
- Default `agent.wait`: 30 dtk (hanya wait). Parameter `timeoutMs` menimpa.
|
||||
- Runtime agen: default `agents.defaults.timeoutSeconds` adalah 172800 dtk (48 jam); diterapkan di timer abort `runEmbeddedPiAgent`.
|
||||
- Default `agent.wait`: 30 detik (hanya penantian). Parameter `timeoutMs` menimpa.
|
||||
- Runtime agen: default `agents.defaults.timeoutSeconds` adalah 172800 dtk (48 jam); ditegakkan dalam timer abort `runEmbeddedPiAgent`.
|
||||
- Batas waktu idle LLM: `agents.defaults.llm.idleTimeoutSeconds` membatalkan permintaan model saat tidak ada potongan respons yang tiba sebelum jendela idle berakhir. Tetapkan ini secara eksplisit untuk model lokal lambat atau provider reasoning/pemanggilan alat; tetapkan ke 0 untuk menonaktifkan. Jika tidak ditetapkan, OpenClaw menggunakan `agents.defaults.timeoutSeconds` jika dikonfigurasi, atau 60 dtk jika tidak. Proses yang dipicu cron tanpa batas waktu LLM atau agen eksplisit menonaktifkan watchdog idle dan bergantung pada batas waktu luar cron.
|
||||
|
||||
## Tempat proses dapat berakhir lebih awal
|
||||
## Tempat proses bisa berakhir lebih awal
|
||||
|
||||
- Timeout agen (abort)
|
||||
- AbortSignal (cancel)
|
||||
- Gateway terputus atau timeout RPC
|
||||
- Timeout `agent.wait` (hanya wait, tidak menghentikan agen)
|
||||
- Batas waktu agen (abort)
|
||||
- AbortSignal (batal)
|
||||
- Gateway terputus atau batas waktu RPC
|
||||
- Batas waktu `agent.wait` (hanya penantian, tidak menghentikan agen)
|
||||
|
||||
## Terkait
|
||||
|
||||
- [Tools](/tools) — tool agen yang tersedia
|
||||
- [Tools](/id/tools) — alat agen yang tersedia
|
||||
- [Hooks](/id/automation/hooks) — skrip berbasis peristiwa yang dipicu oleh peristiwa siklus hidup agen
|
||||
- [Compaction](/concepts/compaction) — bagaimana percakapan panjang diringkas
|
||||
- [Exec Approvals](/tools/exec-approvals) — gerbang persetujuan untuk perintah shell
|
||||
- [Thinking](/tools/thinking) — konfigurasi tingkat thinking/reasoning
|
||||
- [Compaction](/id/concepts/compaction) — cara percakapan panjang diringkas
|
||||
- [Exec Approvals](/id/tools/exec-approvals) — gerbang persetujuan untuk perintah shell
|
||||
- [Thinking](/id/tools/thinking) — konfigurasi tingkat thinking/reasoning
|
||||
|
||||
@ -6,10 +6,10 @@ read_when:
|
||||
summary: Konsolidasi memori latar belakang dengan fase light, deep, dan REM serta Dream Diary
|
||||
title: Dreaming (eksperimental)
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T09:12:40Z"
|
||||
generated_at: "2026-04-09T01:27:50Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 0254f3b0949158264e583c12f36f2b1a83d1b44dc4da01a1b272422d38e8655d
|
||||
source_hash: 26476eddb8260e1554098a6adbb069cf7f5e284cf2e09479c6d9d8f8b93280ef
|
||||
source_path: concepts/dreaming.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -17,17 +17,17 @@ x-i18n:
|
||||
# Dreaming (eksperimental)
|
||||
|
||||
Dreaming adalah sistem konsolidasi memori latar belakang di `memory-core`.
|
||||
Ini membantu OpenClaw memindahkan sinyal jangka pendek yang kuat ke memori yang tahan lama sambil
|
||||
menjaga prosesnya tetap dapat dijelaskan dan ditinjau.
|
||||
Sistem ini membantu OpenClaw memindahkan sinyal jangka pendek yang kuat ke memori tahan lama sambil
|
||||
menjaga agar prosesnya tetap dapat dijelaskan dan ditinjau.
|
||||
|
||||
Dreaming bersifat **opt-in** dan dinonaktifkan secara default.
|
||||
|
||||
## Apa yang ditulis oleh dreaming
|
||||
|
||||
Dreaming menyimpan dua jenis output:
|
||||
Dreaming menyimpan dua jenis keluaran:
|
||||
|
||||
- **Status mesin** di `memory/.dreams/` (penyimpanan recall, sinyal fase, checkpoint ingestion, lock).
|
||||
- **Output yang dapat dibaca manusia** di `DREAMS.md` (atau `dreams.md` yang sudah ada) dan file laporan fase opsional di bawah `memory/dreaming/<phase>/YYYY-MM-DD.md`.
|
||||
- **Status mesin** di `memory/.dreams/` (penyimpanan recall, sinyal fase, checkpoint ingestion, kunci).
|
||||
- **Keluaran yang dapat dibaca manusia** di `DREAMS.md` (atau `dreams.md` yang sudah ada) dan file laporan fase opsional di bawah `memory/dreaming/<phase>/YYYY-MM-DD.md`.
|
||||
|
||||
Promosi jangka panjang tetap hanya menulis ke `MEMORY.md`.
|
||||
|
||||
@ -35,41 +35,42 @@ Promosi jangka panjang tetap hanya menulis ke `MEMORY.md`.
|
||||
|
||||
Dreaming menggunakan tiga fase kooperatif:
|
||||
|
||||
| Fase | Tujuan | Penulisan tahan lama |
|
||||
| ----- | ----------------------------------------- | -------------------- |
|
||||
| Phase | Purpose | Durable write |
|
||||
| ----- | ----------------------------------------- | ----------------- |
|
||||
| Light | Mengurutkan dan menyiapkan materi jangka pendek terbaru | Tidak |
|
||||
| Deep | Menilai dan mempromosikan kandidat tahan lama | Ya (`MEMORY.md`) |
|
||||
| REM | Merefleksikan tema dan ide yang berulang | Tidak |
|
||||
| Deep | Menilai dan mempromosikan kandidat yang 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.
|
||||
Fase-fase ini adalah detail implementasi internal, bukan "mode" terpisah
|
||||
yang dikonfigurasi pengguna.
|
||||
|
||||
### Fase light
|
||||
|
||||
Fase light mengingest sinyal memori harian terbaru dan jejak recall, menghapus duplikasi,
|
||||
dan menyiapkan baris kandidat.
|
||||
|
||||
- Membaca dari status recall jangka pendek, file memori harian terbaru, dan transkrip sesi yang telah disunting bila tersedia.
|
||||
- Menulis blok `## Light Sleep` yang dikelola ketika penyimpanan menyertakan output inline.
|
||||
- Mencatat sinyal reinforcement untuk pemeringkatan deep nanti.
|
||||
- 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 keluaran inline.
|
||||
- Mencatat sinyal penguatan untuk peringkat deep berikutnya.
|
||||
- Tidak pernah menulis ke `MEMORY.md`.
|
||||
|
||||
### Fase deep
|
||||
|
||||
Fase deep menentukan apa yang menjadi memori jangka panjang.
|
||||
|
||||
- Memberi peringkat kandidat menggunakan penilaian berbobot dan ambang batas gerbang.
|
||||
- Memberi peringkat kandidat menggunakan skor berbobot dan ambang batas.
|
||||
- Mengharuskan `minScore`, `minRecallCount`, dan `minUniqueQueries` terpenuhi.
|
||||
- Merehidrasi cuplikan dari file harian aktif sebelum menulis, sehingga cuplikan yang usang/dihapus dilewati.
|
||||
- Melakukan rehidrasi cuplikan dari file harian aktif sebelum menulis, sehingga cuplikan yang usang/dihapus dilewati.
|
||||
- Menambahkan entri yang dipromosikan ke `MEMORY.md`.
|
||||
- Menulis ringkasan `## Deep Sleep` ke `DREAMS.md` dan secara opsional menulis `memory/dreaming/deep/YYYY-MM-DD.md`.
|
||||
- Menulis ringkasan `## Deep Sleep` ke dalam `DREAMS.md` dan secara opsional menulis `memory/dreaming/deep/YYYY-MM-DD.md`.
|
||||
|
||||
### Fase REM
|
||||
|
||||
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 menyertakan output inline.
|
||||
- Mencatat sinyal reinforcement REM yang digunakan oleh pemeringkatan deep.
|
||||
- Menulis blok `## REM Sleep` yang dikelola ketika penyimpanan mencakup keluaran inline.
|
||||
- Mencatat sinyal penguatan REM yang digunakan oleh peringkat deep.
|
||||
- Tidak pernah menulis ke `MEMORY.md`.
|
||||
|
||||
## Ingestion transkrip sesi
|
||||
@ -82,34 +83,49 @@ sebelum ingestion.
|
||||
## Dream Diary
|
||||
|
||||
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.
|
||||
Setelah setiap fase memiliki cukup materi, `memory-core` menjalankan giliran subagent latar belakang
|
||||
best-effort (menggunakan model runtime default) dan menambahkan entri diary singkat.
|
||||
|
||||
Diary ini untuk dibaca manusia di UI Dreams, bukan sumber promosi.
|
||||
|
||||
## Sinyal pemeringkatan deep
|
||||
Ada juga jalur backfill historis yang grounded untuk pekerjaan peninjauan dan pemulihan:
|
||||
|
||||
Pemeringkatan deep menggunakan enam sinyal dasar berbobot ditambah reinforcement fase:
|
||||
- `memory rem-harness --path ... --grounded` mempratinjau keluaran diary grounded dari catatan historis `YYYY-MM-DD.md`.
|
||||
- `memory rem-backfill --path ...` menulis entri diary grounded yang reversibel ke dalam `DREAMS.md`.
|
||||
- `memory rem-backfill --path ... --stage-short-term` menyiapkan kandidat tahan lama yang grounded ke dalam 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 tanpa menyentuh entri diary biasa atau recall jangka pendek aktif.
|
||||
|
||||
| Sinyal | Bobot | Deskripsi |
|
||||
Control UI menyediakan alur backfill/reset diary yang sama sehingga Anda dapat memeriksa
|
||||
hasilnya di scene Dreams sebelum memutuskan apakah kandidat grounded
|
||||
layak dipromosikan. Scene juga menampilkan jalur grounded yang berbeda sehingga Anda dapat melihat
|
||||
entri jangka pendek yang disiapkan mana yang berasal dari replay historis, item yang dipromosikan
|
||||
mana yang dipandu grounded, dan hanya menghapus entri yang disiapkan khusus grounded tanpa
|
||||
menyentuh status jangka pendek aktif biasa.
|
||||
|
||||
## Sinyal peringkat deep
|
||||
|
||||
Peringkat deep menggunakan enam sinyal dasar berbobot ditambah penguatan fase:
|
||||
|
||||
| Signal | Weight | Description |
|
||||
| ------------------- | ------ | ------------------------------------------------- |
|
||||
| Frekuensi | 0.24 | Berapa banyak sinyal jangka pendek yang dikumpulkan entri |
|
||||
| Relevansi | 0.30 | Rata-rata kualitas pengambilan untuk entri |
|
||||
| Keragaman kueri | 0.15 | Konteks kueri/hari berbeda yang memunculkannya |
|
||||
| Kebaruan | 0.15 | Skor kesegaran yang menurun seiring waktu |
|
||||
| Konsolidasi | 0.10 | Kekuatan kemunculan ulang lintas hari |
|
||||
| Kekayaan konseptual | 0.06 | Kepadatan tag konsep dari cuplikan/path |
|
||||
| Frequency | 0.24 | Berapa banyak sinyal jangka pendek yang dikumpulkan entri |
|
||||
| Relevance | 0.30 | Kualitas pengambilan rata-rata untuk entri |
|
||||
| Query diversity | 0.15 | Konteks kueri/hari berbeda yang memunculkannya |
|
||||
| Recency | 0.15 | Skor kesegaran dengan peluruhan waktu |
|
||||
| Consolidation | 0.10 | Kekuatan kemunculan ulang multi-hari |
|
||||
| Conceptual richness | 0.06 | Kepadatan tag konsep dari cuplikan/path |
|
||||
|
||||
Hit fase Light dan REM menambahkan dorongan kecil yang menurun seiring waktu dari
|
||||
Hit fase light dan REM menambahkan peningkatan kecil dengan peluruhan recency dari
|
||||
`memory/.dreams/phase-signals.json`.
|
||||
|
||||
## Penjadwalan
|
||||
|
||||
Saat diaktifkan, `memory-core` mengelola secara otomatis satu cron job untuk satu sapuan dreaming penuh. Setiap sapuan menjalankan fase secara berurutan: light -> REM -> deep.
|
||||
Saat diaktifkan, `memory-core` mengelola secara otomatis satu cron job untuk sapuan dreaming
|
||||
penuh. Setiap sapuan menjalankan fase secara berurutan: light -> REM -> deep.
|
||||
|
||||
Perilaku kadens default:
|
||||
Perilaku cadence default:
|
||||
|
||||
| Pengaturan | Default |
|
||||
| Setting | Default |
|
||||
| -------------------- | ----------- |
|
||||
| `dreaming.frequency` | `0 3 * * *` |
|
||||
|
||||
@ -133,7 +149,7 @@ Aktifkan dreaming:
|
||||
}
|
||||
```
|
||||
|
||||
Aktifkan dreaming dengan kadens sapuan kustom:
|
||||
Aktifkan dreaming dengan cadence sapuan kustom:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -173,7 +189,7 @@ openclaw memory promote --limit 5
|
||||
openclaw memory status --deep
|
||||
```
|
||||
|
||||
`memory promote` manual menggunakan ambang fase deep secara default kecuali dioverride
|
||||
`memory promote` manual menggunakan ambang fase deep secara default kecuali ditimpa
|
||||
dengan flag CLI.
|
||||
|
||||
Jelaskan mengapa kandidat tertentu akan atau tidak akan dipromosikan:
|
||||
@ -183,7 +199,7 @@ openclaw memory promote-explain "router vlan"
|
||||
openclaw memory promote-explain "router vlan" --json
|
||||
```
|
||||
|
||||
Pratinjau refleksi REM, candidate truths, dan output promosi deep tanpa
|
||||
Pratinjau refleksi REM, candidate truths, dan keluaran promosi deep tanpa
|
||||
menulis apa pun:
|
||||
|
||||
```bash
|
||||
@ -201,24 +217,25 @@ Semua pengaturan berada di bawah `plugins.entries.memory-core.config.dreaming`.
|
||||
| `frequency` | `0 3 * * *` |
|
||||
|
||||
Kebijakan fase, ambang batas, dan perilaku penyimpanan adalah detail implementasi internal
|
||||
(bukan konfigurasi yang dihadapkan ke pengguna).
|
||||
(bukan konfigurasi yang ditujukan untuk pengguna).
|
||||
|
||||
Lihat [Referensi konfigurasi memory](/id/reference/memory-config#dreaming-experimental)
|
||||
untuk daftar key lengkap.
|
||||
Lihat [Referensi konfigurasi Memory](/id/reference/memory-config#dreaming-experimental)
|
||||
untuk daftar kunci lengkap.
|
||||
|
||||
## UI Dreams
|
||||
|
||||
Saat diaktifkan, tab **Dreams** di Gateway menampilkan:
|
||||
Saat diaktifkan, tab **Dreams** Gateway menampilkan:
|
||||
|
||||
- status dreaming aktif saat ini
|
||||
- status tingkat fase dan keberadaan managed-sweep
|
||||
- jumlah jangka pendek, jangka panjang, dan yang dipromosikan hari ini
|
||||
- waktu proses terjadwal berikutnya
|
||||
- status tingkat fase dan keberadaan sapuan terkelola
|
||||
- jumlah jangka pendek, grounded, sinyal, dan yang dipromosikan hari ini
|
||||
- waktu eksekusi terjadwal berikutnya
|
||||
- jalur Scene grounded yang berbeda untuk entri replay historis yang disiapkan
|
||||
- pembaca Dream Diary yang dapat diperluas yang didukung oleh `doctor.memory.dreamDiary`
|
||||
|
||||
## Terkait
|
||||
|
||||
- [Memory](/id/concepts/memory)
|
||||
- [Pencarian Memory](/id/concepts/memory-search)
|
||||
- [Memory Search](/id/concepts/memory-search)
|
||||
- [CLI memory](/cli/memory)
|
||||
- [Referensi konfigurasi memory](/id/reference/memory-config)
|
||||
- [Referensi konfigurasi Memory](/id/reference/memory-config)
|
||||
|
||||
@ -2,101 +2,84 @@
|
||||
read_when:
|
||||
- Anda ingin memahami cara kerja memori
|
||||
- Anda ingin mengetahui file memori apa yang harus ditulis
|
||||
summary: Bagaimana OpenClaw mengingat berbagai hal di seluruh sesi
|
||||
summary: Bagaimana OpenClaw mengingat hal-hal di berbagai sesi
|
||||
title: Ikhtisar Memori
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T06:00:59Z"
|
||||
generated_at: "2026-04-09T01:27:51Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 3bb8552341b0b651609edaaae826a22fdc535d240aed4fad4af4b069454004af
|
||||
source_hash: 2fe47910f5bf1c44be379e971c605f1cb3a29befcf2a7ee11fb3833cbe3b9059
|
||||
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 status tersembunyi.
|
||||
|
||||
## Cara kerjanya
|
||||
|
||||
Agen Anda memiliki tiga file yang terkait dengan memori:
|
||||
Agen Anda memiliki tiga file terkait memori:
|
||||
|
||||
- **`MEMORY.md`** -- memori jangka panjang. Fakta, preferensi, dan
|
||||
keputusan yang tahan lama. Dimuat pada 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) -- Buku Harian Mimpi dan ringkasan
|
||||
penyapuan dreaming untuk ditinjau manusia.
|
||||
- **`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.
|
||||
|
||||
File-file ini berada di workspace agen (default `~/.openclaw/workspace`).
|
||||
|
||||
<Tip>
|
||||
Jika Anda ingin agen Anda mengingat sesuatu, cukup minta: "Ingat bahwa saya
|
||||
lebih memilih TypeScript." Agen akan menuliskannya ke file yang sesuai.
|
||||
lebih menyukai TypeScript." Agen akan menuliskannya ke file yang sesuai.
|
||||
</Tip>
|
||||
|
||||
## Alat memori
|
||||
## Tool memori
|
||||
|
||||
Agen memiliki dua alat untuk bekerja dengan memori:
|
||||
Agen memiliki dua tool untuk bekerja dengan memori:
|
||||
|
||||
- **`memory_search`** -- menemukan catatan yang relevan menggunakan pencarian semantik, bahkan saat
|
||||
kata-katanya berbeda dari aslinya.
|
||||
- **`memory_get`** -- membaca file memori tertentu atau rentang baris.
|
||||
- **`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.
|
||||
|
||||
Kedua alat ini disediakan oleh plugin memori yang aktif (default: `memory-core`).
|
||||
Kedua tool disediakan oleh plugin memori yang aktif (default: `memory-core`).
|
||||
|
||||
## Plugin pendamping Memory Wiki
|
||||
|
||||
Jika Anda ingin memori tahan lama berperilaku lebih seperti basis pengetahuan yang dipelihara daripada
|
||||
sekadar catatan mentah, gunakan plugin bawaan `memory-wiki`.
|
||||
Jika Anda ingin memori tahan lama berfungsi lebih seperti basis pengetahuan yang dipelihara daripada sekadar catatan mentah, gunakan plugin bawaan `memory-wiki`.
|
||||
|
||||
`memory-wiki` menyusun pengetahuan tahan lama ke dalam vault wiki dengan:
|
||||
`memory-wiki` mengompilasi pengetahuan tahan 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
|
||||
- alat native wiki seperti `wiki_search`, `wiki_get`, `wiki_apply`, dan `wiki_lint`
|
||||
- tool native wiki seperti `wiki_search`, `wiki_get`, `wiki_apply`, dan `wiki_lint`
|
||||
|
||||
Ini tidak menggantikan plugin memori aktif. Plugin memori aktif tetap
|
||||
memiliki recall, promosi, dan dreaming. `memory-wiki` menambahkan
|
||||
lapisan pengetahuan kaya provenance di sampingnya.
|
||||
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.
|
||||
|
||||
Lihat [Memory Wiki](/id/plugins/memory-wiki).
|
||||
|
||||
## Pencarian memori
|
||||
|
||||
Saat 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 langsung berfungsi setelah Anda memiliki
|
||||
kunci API 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 tanpa konfigurasi tambahan setelah Anda memiliki API key untuk penyedia yang didukung.
|
||||
|
||||
<Info>
|
||||
OpenClaw mendeteksi otomatis penyedia embedding Anda dari kunci API yang tersedia. Jika Anda
|
||||
telah mengonfigurasi kunci OpenAI, Gemini, Voyage, atau Mistral, pencarian memori
|
||||
diaktifkan secara otomatis.
|
||||
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.
|
||||
</Info>
|
||||
|
||||
Untuk detail tentang cara kerja pencarian, opsi penyesuaian, dan penyiapan penyedia, lihat
|
||||
[Pencarian Memori](/id/concepts/memory-search).
|
||||
Untuk detail tentang cara kerja pencarian, opsi penyetelan, dan penyiapan penyedia, lihat
|
||||
[Memory Search](/id/concepts/memory-search).
|
||||
|
||||
## Backend memori
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Bawaan (default)" icon="database" href="/id/concepts/memory-builtin">
|
||||
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. Tanpa dependensi tambahan.
|
||||
</Card>
|
||||
<Card title="QMD" icon="search" href="/id/concepts/memory-qmd">
|
||||
Sidecar local-first dengan reranking, perluasan kueri, dan kemampuan untuk mengindeks
|
||||
direktori di luar workspace.
|
||||
Sidecar local-first dengan reranking, perluasan kueri, dan kemampuan untuk mengindeks direktori di luar workspace.
|
||||
</Card>
|
||||
<Card title="Honcho" icon="brain" href="/id/concepts/memory-honcho">
|
||||
Memori lintas sesi native AI dengan pemodelan pengguna, pencarian semantik, dan
|
||||
kesadaran multi-agen. Instalasi plugin.
|
||||
Memori lintas sesi yang AI-native dengan pemodelan pengguna, pencarian semantik, dan kesadaran multi-agen. Instal plugin.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@ -104,41 +87,60 @@ kesadaran multi-agen. Instalasi plugin.
|
||||
|
||||
<CardGroup cols={1}>
|
||||
<Card title="Memory Wiki" icon="book" href="/id/plugins/memory-wiki">
|
||||
Menyusun memori tahan lama menjadi vault wiki kaya provenance dengan klaim,
|
||||
dasbor, mode bridge, dan alur kerja yang ramah Obsidian.
|
||||
Mengompilasi memori tahan lama menjadi vault wiki kaya provenance dengan klaim, dasbor, mode bridge, dan alur kerja yang ramah Obsidian.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Flush memori otomatis
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
<Tip>
|
||||
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 ringkasan dibuat.
|
||||
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.
|
||||
</Tip>
|
||||
|
||||
## Dreaming (eksperimental)
|
||||
|
||||
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`).
|
||||
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`).
|
||||
|
||||
Ini dirancang untuk menjaga memori jangka panjang tetap bernilai tinggi:
|
||||
Sistem ini dirancang untuk menjaga memori jangka panjang tetap bernilai tinggi:
|
||||
|
||||
- **Opt-in**: dinonaktifkan secara default.
|
||||
- **Terjadwal**: saat diaktifkan, `memory-core` mengelola otomatis satu pekerjaan cron berulang
|
||||
untuk penyapuan dreaming penuh.
|
||||
- **Berambang batas**: promosi harus lolos gerbang skor, frekuensi recall, dan
|
||||
keragaman kueri.
|
||||
- **Dapat ditinjau**: ringkasan fase dan entri buku harian ditulis ke `DREAMS.md`
|
||||
untuk ditinjau manusia.
|
||||
- **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.
|
||||
|
||||
Untuk perilaku fase, sinyal penilaian, dan detail Buku Harian Mimpi, lihat
|
||||
[Dreaming (eksperimental)](/id/concepts/dreaming).
|
||||
Untuk perilaku fase, sinyal penilaian, dan detail Dream Diary, lihat
|
||||
[Dreaming (experimental)](/id/concepts/dreaming).
|
||||
|
||||
## Grounded backfill dan promosi langsung
|
||||
|
||||
Sistem dreaming sekarang memiliki dua jalur tinjauan 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`.
|
||||
|
||||
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.
|
||||
|
||||
Saat Anda menggunakan:
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
- `DREAMS.md` tetap menjadi permukaan tinjauan manusia.
|
||||
- penyimpanan jangka pendek tetap menjadi permukaan pemeringkatan yang berhadapan dengan 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:
|
||||
|
||||
```bash
|
||||
openclaw memory rem-backfill --rollback
|
||||
openclaw memory rem-backfill --rollback-short-term
|
||||
```
|
||||
|
||||
## CLI
|
||||
|
||||
@ -148,15 +150,15 @@ openclaw memory search "query" # Cari dari baris perintah
|
||||
openclaw memory index --force # Bangun ulang indeks
|
||||
```
|
||||
|
||||
## Bacaan lebih lanjut
|
||||
## Bacaan lanjutan
|
||||
|
||||
- [Builtin Memory Engine](/id/concepts/memory-builtin) -- backend SQLite default
|
||||
- [QMD Memory Engine](/id/concepts/memory-qmd) -- sidecar local-first lanjutan
|
||||
- [Honcho Memory](/id/concepts/memory-honcho) -- memori lintas sesi native AI
|
||||
- [Memory Wiki](/id/plugins/memory-wiki) -- vault pengetahuan terkompilasi dan alat native wiki
|
||||
- [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
|
||||
penyesuaian
|
||||
- [Dreaming (eksperimental)](/id/concepts/dreaming) -- promosi latar belakang
|
||||
penyetelan
|
||||
- [Dreaming (experimental)](/id/concepts/dreaming) -- promosi latar belakang
|
||||
dari recall jangka pendek ke memori jangka panjang
|
||||
- [Referensi konfigurasi memori](/id/reference/memory-config) -- semua opsi konfigurasi
|
||||
- [Memory configuration reference](/id/reference/memory-config) -- semua opsi konfigurasi
|
||||
- [Compaction](/id/concepts/compaction) -- bagaimana compaction berinteraksi dengan memori
|
||||
|
||||
@ -5,17 +5,17 @@ read_when:
|
||||
summary: Ikhtisar penyedia model dengan contoh konfigurasi + alur CLI
|
||||
title: Penyedia Model
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T06:02:39Z"
|
||||
generated_at: "2026-04-09T01:29:50Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 558ac9e34b67fcc3dd6791a01bebc17e1c34152fa6c5611593d681e8cfa532d9
|
||||
source_hash: 53e3141256781002bbe1d7e7b78724a18d061fcf36a203baae04a091b8c9ea1b
|
||||
source_path: concepts/model-providers.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Penyedia model
|
||||
|
||||
Halaman ini membahas **LLM/penyedia model** (bukan saluran chat seperti WhatsApp/Telegram).
|
||||
Halaman ini membahas **penyedia LLM/model** (bukan saluran chat seperti WhatsApp/Telegram).
|
||||
Untuk aturan pemilihan model, lihat [/concepts/models](/id/concepts/models).
|
||||
|
||||
## Aturan cepat
|
||||
@ -23,17 +23,18 @@ Untuk aturan pemilihan model, lihat [/concepts/models](/id/concepts/models).
|
||||
- Referensi model menggunakan `provider/model` (contoh: `opencode/claude-opus-4-6`).
|
||||
- Jika Anda menetapkan `agents.defaults.models`, itu menjadi allowlist.
|
||||
- Pembantu CLI: `openclaw onboard`, `openclaw models list`, `openclaw models set <provider/model>`.
|
||||
- Aturan runtime fallback, probe cooldown, dan persistensi override sesi
|
||||
- Aturan runtime fallback, probe cooldown, dan persistensi penggantian sesi
|
||||
didokumentasikan di [/concepts/model-failover](/id/concepts/model-failover).
|
||||
- `models.providers.*.models[].contextWindow` adalah metadata model native;
|
||||
`models.providers.*.models[].contextTokens` adalah batas runtime efektif.
|
||||
- Plugin penyedia dapat menyuntikkan katalog model melalui `registerProvider({ catalog })`;
|
||||
OpenClaw menggabungkan output tersebut ke `models.providers` sebelum menulis
|
||||
OpenClaw menggabungkan output itu ke dalam `models.providers` sebelum menulis
|
||||
`models.json`.
|
||||
- Manifest penyedia dapat mendeklarasikan `providerAuthEnvVars` sehingga probe auth
|
||||
berbasis env generik tidak perlu memuat runtime plugin. Peta env-var inti yang
|
||||
tersisa sekarang hanya untuk penyedia inti/non-plugin dan beberapa kasus
|
||||
prioritas generik seperti onboarding Anthropic dengan API key lebih dulu.
|
||||
- Manifest penyedia dapat mendeklarasikan `providerAuthEnvVars` dan
|
||||
`providerAuthAliases` sehingga probe autentikasi berbasis env generik dan varian penyedia
|
||||
tidak perlu memuat runtime plugin. Peta env-var inti yang tersisa sekarang
|
||||
hanya untuk penyedia non-plugin/inti dan beberapa kasus prioritas generik
|
||||
seperti onboarding Anthropic yang mengutamakan API key.
|
||||
- Plugin penyedia juga dapat memiliki perilaku runtime penyedia melalui
|
||||
`normalizeModelId`, `normalizeTransport`, `normalizeConfig`,
|
||||
`applyNativeStreamingUsageCompat`, `resolveConfigApiKey`,
|
||||
@ -52,17 +53,16 @@ Untuk aturan pemilihan model, lihat [/concepts/models](/id/concepts/models).
|
||||
`resolveDefaultThinkingLevel`, `applyConfigDefaults`, `isModernModelRef`,
|
||||
`prepareRuntimeAuth`, `resolveUsageAuth`, `fetchUsageSnapshot`, dan
|
||||
`onModelSelected`.
|
||||
- Catatan: `capabilities` runtime penyedia adalah metadata runner bersama (keluarga penyedia,
|
||||
keanehan transkrip/perkakas, petunjuk transport/cache). Ini bukan
|
||||
hal yang sama dengan [model capability publik](/id/plugins/architecture#public-capability-model)
|
||||
yang menjelaskan apa yang didaftarkan sebuah plugin (inferensi teks, ucapan, dll.).
|
||||
- Catatan: runtime penyedia `capabilities` adalah metadata runner bersama (keluarga penyedia, kekhasan transkrip/tooling, petunjuk transport/cache). Ini bukan
|
||||
hal yang sama dengan [model kapabilitas publik](/id/plugins/architecture#public-capability-model)
|
||||
yang menjelaskan apa yang didaftarkan plugin (inferensi teks, ucapan, dll.).
|
||||
|
||||
## Perilaku penyedia yang dimiliki plugin
|
||||
|
||||
Plugin penyedia kini dapat memiliki sebagian besar logika khusus penyedia sementara OpenClaw mempertahankan
|
||||
Plugin penyedia sekarang dapat memiliki sebagian besar logika spesifik penyedia sementara OpenClaw tetap menjaga
|
||||
loop inferensi generik.
|
||||
|
||||
Pemisahan tipikal:
|
||||
Pembagian umum:
|
||||
|
||||
- `auth[].run` / `auth[].runNonInteractive`: penyedia memiliki alur onboarding/login
|
||||
untuk `openclaw onboard`, `openclaw models auth`, dan penyiapan headless
|
||||
@ -73,156 +73,156 @@ Pemisahan tipikal:
|
||||
lookup atau kanonisasi
|
||||
- `normalizeTransport`: penyedia menormalkan keluarga transport `api` / `baseUrl`
|
||||
sebelum perakitan model generik; OpenClaw memeriksa penyedia yang cocok terlebih dahulu,
|
||||
lalu plugin penyedia lain yang mendukung hook sampai salah satunya benar-benar mengubah
|
||||
lalu plugin penyedia lain yang mampu hook sampai salah satunya benar-benar mengubah
|
||||
transport
|
||||
- `normalizeConfig`: penyedia menormalkan konfigurasi `models.providers.<id>` sebelum
|
||||
digunakan runtime; OpenClaw memeriksa penyedia yang cocok terlebih dahulu, lalu plugin penyedia lain
|
||||
yang mendukung hook sampai salah satunya benar-benar mengubah konfigurasi. Jika tidak ada
|
||||
hook penyedia yang menulis ulang konfigurasi, helper keluarga Google bawaan yang dibundel tetap
|
||||
runtime menggunakannya; OpenClaw memeriksa penyedia yang cocok terlebih dahulu, lalu plugin penyedia lain yang
|
||||
mampu hook sampai salah satunya benar-benar mengubah konfigurasi. Jika tidak ada
|
||||
hook penyedia yang menulis ulang konfigurasi, pembantu keluarga Google bawaan yang dibundel masih
|
||||
menormalkan entri penyedia Google yang didukung.
|
||||
- `applyNativeStreamingUsageCompat`: penyedia menerapkan penulisan ulang kompatibilitas penggunaan streaming native berbasis endpoint untuk penyedia konfigurasi
|
||||
- `resolveConfigApiKey`: penyedia menyelesaikan auth penanda env untuk penyedia konfigurasi
|
||||
- `applyNativeStreamingUsageCompat`: penyedia menerapkan penulisan ulang kompatibilitas native streaming-usage berbasis endpoint untuk penyedia konfigurasi
|
||||
- `resolveConfigApiKey`: penyedia menyelesaikan autentikasi penanda env untuk penyedia konfigurasi
|
||||
tanpa memaksa pemuatan auth runtime penuh. `amazon-bedrock` juga memiliki
|
||||
resolver penanda env AWS bawaan di sini, meskipun auth runtime Bedrock menggunakan
|
||||
rantai default AWS SDK.
|
||||
- `resolveSyntheticAuth`: penyedia dapat mengekspos ketersediaan auth lokal/self-hosted atau auth berbasis konfigurasi lainnya
|
||||
tanpa menyimpan secret plaintext
|
||||
- `shouldDeferSyntheticProfileAuth`: penyedia dapat menandai placeholder profil sintetis yang tersimpan
|
||||
memiliki prioritas lebih rendah daripada auth berbasis env/konfigurasi
|
||||
- `shouldDeferSyntheticProfileAuth`: penyedia dapat menandai placeholder profil sintetis yang disimpan
|
||||
sebagai prioritas lebih rendah daripada auth berbasis env/konfigurasi
|
||||
- `resolveDynamicModel`: penyedia menerima id model yang belum ada di katalog statis lokal
|
||||
- `prepareDynamicModel`: penyedia memerlukan refresh metadata sebelum mencoba lagi
|
||||
resolusi dinamis
|
||||
- `prepareDynamicModel`: penyedia memerlukan penyegaran metadata sebelum mencoba ulang
|
||||
resolusi model dinamis
|
||||
- `normalizeResolvedModel`: penyedia memerlukan penulisan ulang transport atau base URL
|
||||
- `contributeResolvedModelCompat`: penyedia menyumbangkan flag compat untuk
|
||||
model vendornya bahkan ketika model itu datang melalui transport kompatibel lain
|
||||
- `capabilities`: penyedia menerbitkan keanehan transkrip/perkakas/keluarga penyedia
|
||||
- `normalizeToolSchemas`: penyedia membersihkan schema tool sebelum runner
|
||||
tersemat melihatnya
|
||||
- `inspectToolSchemas`: penyedia memunculkan peringatan schema khusus transport
|
||||
model vendor miliknya bahkan ketika model itu datang melalui transport kompatibel lain
|
||||
- `capabilities`: penyedia menerbitkan kekhasan transkrip/tooling/keluarga penyedia
|
||||
- `normalizeToolSchemas`: penyedia membersihkan skema tool sebelum runner tertanam
|
||||
melihatnya
|
||||
- `inspectToolSchemas`: penyedia menampilkan peringatan skema spesifik transport
|
||||
setelah normalisasi
|
||||
- `resolveReasoningOutputMode`: penyedia memilih kontrak output reasoning native vs bertag
|
||||
- `prepareExtraParams`: penyedia menetapkan default atau menormalkan parameter permintaan per model
|
||||
- `createStreamFn`: penyedia mengganti jalur stream normal dengan transport kustom sepenuhnya
|
||||
- `wrapStreamFn`: penyedia menerapkan wrapper kompatibilitas header/body/model permintaan
|
||||
- `resolveTransportTurnState`: penyedia memasok header atau metadata
|
||||
- `createStreamFn`: penyedia mengganti jalur stream normal dengan transport
|
||||
kustom penuh
|
||||
- `wrapStreamFn`: penyedia menerapkan wrapper kompatibilitas request header/body/model
|
||||
- `resolveTransportTurnState`: penyedia menyuplai header atau metadata
|
||||
transport native per giliran
|
||||
- `resolveWebSocketSessionPolicy`: penyedia memasok header sesi WebSocket native
|
||||
atau kebijakan cooldown sesi
|
||||
- `createEmbeddingProvider`: penyedia memiliki perilaku embedding memori ketika
|
||||
hal itu lebih tepat berada di plugin penyedia daripada switchboard embedding inti
|
||||
- `formatApiKey`: penyedia memformat profil auth yang tersimpan ke dalam string
|
||||
`apiKey` runtime yang diharapkan transport
|
||||
- `refreshOAuth`: penyedia memiliki refresh OAuth ketika refresher bersama `pi-ai`
|
||||
- `resolveWebSocketSessionPolicy`: penyedia menyuplai header sesi native WebSocket
|
||||
atau kebijakan cool-down sesi
|
||||
- `createEmbeddingProvider`: penyedia memiliki perilaku embedding memori ketika itu
|
||||
lebih tepat ditempatkan bersama plugin penyedia daripada switchboard embedding inti
|
||||
- `formatApiKey`: penyedia memformat profil auth yang disimpan ke dalam string
|
||||
`apiKey` runtime yang diharapkan oleh transport
|
||||
- `refreshOAuth`: penyedia memiliki penyegaran OAuth ketika penyegar bersama `pi-ai`
|
||||
tidak memadai
|
||||
- `buildAuthDoctorHint`: penyedia menambahkan panduan perbaikan ketika refresh OAuth
|
||||
- `buildAuthDoctorHint`: penyedia menambahkan panduan perbaikan ketika penyegaran OAuth
|
||||
gagal
|
||||
- `matchesContextOverflowError`: penyedia mengenali error overflow jendela konteks
|
||||
khusus penyedia yang akan terlewat oleh heuristik generik
|
||||
- `classifyFailoverReason`: penyedia memetakan error mentah transport/API
|
||||
khusus penyedia ke alasan failover seperti rate limit atau overload
|
||||
- `matchesContextOverflowError`: penyedia mengenali error luapan context-window spesifik penyedia
|
||||
yang akan terlewat oleh heuristik generik
|
||||
- `classifyFailoverReason`: penyedia memetakan error mentah transport/API spesifik penyedia
|
||||
ke alasan failover seperti rate limit atau overload
|
||||
- `isCacheTtlEligible`: penyedia menentukan id model upstream mana yang mendukung TTL prompt-cache
|
||||
- `buildMissingAuthMessage`: penyedia mengganti error auth-store generik
|
||||
dengan petunjuk pemulihan khusus penyedia
|
||||
- `suppressBuiltInModel`: penyedia menyembunyikan baris upstream yang usang dan dapat mengembalikan
|
||||
dengan petunjuk pemulihan spesifik penyedia
|
||||
- `suppressBuiltInModel`: penyedia menyembunyikan baris upstream usang dan dapat mengembalikan
|
||||
error milik vendor untuk kegagalan resolusi langsung
|
||||
- `augmentModelCatalog`: penyedia menambahkan baris katalog sintetis/final setelah
|
||||
discovery dan penggabungan konfigurasi
|
||||
- `isBinaryThinking`: penyedia memiliki UX thinking biner nyala/mati
|
||||
- `supportsXHighThinking`: penyedia mengikutkan model terpilih ke `xhigh`
|
||||
- `isBinaryThinking`: penyedia memiliki UX thinking on/off biner
|
||||
- `supportsXHighThinking`: penyedia memilih model tertentu agar ikut ke `xhigh`
|
||||
- `resolveDefaultThinkingLevel`: penyedia memiliki kebijakan default `/think` untuk
|
||||
keluarga model
|
||||
- `applyConfigDefaults`: penyedia menerapkan default global khusus penyedia
|
||||
- `applyConfigDefaults`: penyedia menerapkan default global spesifik penyedia
|
||||
selama materialisasi konfigurasi berdasarkan mode auth, env, atau keluarga model
|
||||
- `isModernModelRef`: penyedia memiliki pencocokan model pilihan live/smoke
|
||||
- `prepareRuntimeAuth`: penyedia mengubah kredensial terkonfigurasi menjadi token runtime
|
||||
berumur singkat
|
||||
- `resolveUsageAuth`: penyedia menyelesaikan kredensial usage/kuota untuk `/usage`
|
||||
- `prepareRuntimeAuth`: penyedia mengubah kredensial yang dikonfigurasi menjadi token runtime berdurasi pendek
|
||||
- `resolveUsageAuth`: penyedia menyelesaikan kredensial penggunaan/kuota untuk `/usage`
|
||||
dan permukaan status/pelaporan terkait
|
||||
- `fetchUsageSnapshot`: penyedia memiliki pengambilan/parsing endpoint usage sementara
|
||||
inti tetap memiliki shell ringkasan dan pemformatannya
|
||||
- `fetchUsageSnapshot`: penyedia memiliki pengambilan/penguraian endpoint penggunaan sementara
|
||||
inti tetap memiliki shell ringkasan dan pemformatan
|
||||
- `onModelSelected`: penyedia menjalankan efek samping pasca-pemilihan seperti
|
||||
telemetri atau pencatatan sesi milik penyedia
|
||||
telemetri atau pembukuan sesi milik penyedia
|
||||
|
||||
Contoh bundel saat ini:
|
||||
|
||||
- `anthropic`: fallback kompatibilitas maju Claude 4.6, petunjuk perbaikan auth, pengambilan
|
||||
endpoint usage, metadata cache-TTL/keluarga penyedia, dan default konfigurasi global
|
||||
- `anthropic`: fallback kompatibilitas-maju Claude 4.6, petunjuk perbaikan auth, pengambilan
|
||||
endpoint penggunaan, metadata cache-TTL/keluarga penyedia, dan default konfigurasi global
|
||||
yang sadar auth
|
||||
- `amazon-bedrock`: pencocokan context-overflow milik penyedia dan klasifikasi
|
||||
alasan failover untuk error throttle/not-ready khusus Bedrock, ditambah
|
||||
- `amazon-bedrock`: pencocokan context-overflow milik penyedia dan klasifikasi alasan
|
||||
failover untuk error throttle/belum-siap khusus Bedrock, ditambah
|
||||
keluarga replay bersama `anthropic-by-model` untuk guard kebijakan replay khusus Claude
|
||||
pada lalu lintas Anthropic
|
||||
- `anthropic-vertex`: guard kebijakan replay khusus Claude pada lalu lintas
|
||||
pada trafik Anthropic
|
||||
- `anthropic-vertex`: guard kebijakan replay khusus Claude pada trafik
|
||||
pesan Anthropic
|
||||
- `openrouter`: id model pass-through, wrapper permintaan, petunjuk capability penyedia,
|
||||
sanitasi thought-signature Gemini pada lalu lintas proxy Gemini, injeksi reasoning proxy
|
||||
melalui keluarga stream `openrouter-thinking`, penerusan metadata routing,
|
||||
dan kebijakan cache-TTL
|
||||
- `github-copilot`: onboarding/login perangkat, fallback model kompatibilitas maju,
|
||||
petunjuk transkrip Claude-thinking, pertukaran token runtime, dan pengambilan endpoint
|
||||
usage
|
||||
- `openai`: fallback kompatibilitas maju GPT-5.4, normalisasi transport OpenAI langsung,
|
||||
petunjuk auth hilang yang sadar Codex, penekanan Spark, baris katalog sintetis
|
||||
OpenAI/Codex, kebijakan thinking/model live, normalisasi alias token usage
|
||||
- `openrouter`: id model pass-through, wrapper request, petunjuk kemampuan penyedia,
|
||||
sanitasi thought-signature Gemini pada trafik proxy Gemini, injeksi reasoning
|
||||
proxy melalui keluarga stream `openrouter-thinking`, penerusan metadata
|
||||
routing, dan kebijakan cache-TTL
|
||||
- `github-copilot`: onboarding/login perangkat, fallback model kompatibilitas-maju,
|
||||
petunjuk transkrip Claude-thinking, pertukaran token runtime, dan pengambilan
|
||||
endpoint penggunaan
|
||||
- `openai`: fallback kompatibilitas-maju GPT-5.4, normalisasi transport OpenAI langsung,
|
||||
petunjuk auth hilang yang sadar Codex, suppression Spark, baris katalog
|
||||
OpenAI/Codex sintetis, kebijakan thinking/live-model, normalisasi alias token penggunaan
|
||||
(`input` / `output` dan keluarga `prompt` / `completion`), keluarga stream bersama
|
||||
`openai-responses-defaults` untuk wrapper OpenAI/Codex native, metadata keluarga penyedia,
|
||||
registrasi penyedia pembuatan gambar bundel untuk `gpt-image-1`, dan registrasi penyedia
|
||||
pembuatan video bundel untuk `sora-2`
|
||||
- `google` dan `google-gemini-cli`: fallback kompatibilitas maju Gemini 3.1,
|
||||
validasi replay Gemini native, sanitasi replay bootstrap, mode output
|
||||
reasoning bertag, pencocokan model modern, registrasi penyedia pembuatan gambar bundel
|
||||
untuk model pratinjau gambar Gemini, dan registrasi penyedia pembuatan
|
||||
video bundel untuk model Veo; OAuth Gemini CLI juga memiliki pemformatan token profil auth,
|
||||
parsing token usage, dan pengambilan endpoint kuota untuk permukaan usage
|
||||
`openai-responses-defaults` untuk wrapper native OpenAI/Codex,
|
||||
metadata keluarga penyedia, pendaftaran penyedia pembuatan gambar bundel
|
||||
untuk `gpt-image-1`, dan pendaftaran penyedia pembuatan video bundel
|
||||
untuk `sora-2`
|
||||
- `google` dan `google-gemini-cli`: fallback kompatibilitas-maju Gemini 3.1,
|
||||
validasi replay Gemini native, sanitasi replay bootstrap, mode
|
||||
output reasoning bertag, pencocokan model modern, pendaftaran penyedia pembuatan gambar bundel
|
||||
untuk model pratinjau gambar Gemini, dan pendaftaran
|
||||
penyedia pembuatan video bundel untuk model Veo; Gemini CLI OAuth juga
|
||||
memiliki pemformatan token profil auth, penguraian token penggunaan, dan pengambilan
|
||||
endpoint kuota untuk permukaan penggunaan
|
||||
- `moonshot`: transport bersama, normalisasi payload thinking milik plugin
|
||||
- `kilocode`: transport bersama, header permintaan milik plugin, normalisasi payload reasoning,
|
||||
- `kilocode`: transport bersama, header request milik plugin, normalisasi payload reasoning,
|
||||
sanitasi thought-signature proxy-Gemini, dan kebijakan cache-TTL
|
||||
- `zai`: fallback kompatibilitas maju GLM-5, default `tool_stream`, kebijakan cache-TTL,
|
||||
kebijakan thinking biner/model live, serta auth usage + pengambilan kuota;
|
||||
id `glm-5*` yang tidak dikenal disintesis dari templat `glm-4.7` bawaan
|
||||
- `zai`: fallback kompatibilitas-maju GLM-5, default `tool_stream`, kebijakan cache-TTL,
|
||||
kebijakan binary-thinking/live-model, dan auth penggunaan + pengambilan kuota;
|
||||
id `glm-5*` yang tidak dikenal disintesis dari templat `glm-4.7` yang dibundel
|
||||
- `xai`: normalisasi transport Responses native, penulisan ulang alias `/fast` untuk
|
||||
varian cepat Grok, default `tool_stream`, pembersihan schema tool /
|
||||
payload reasoning khusus xAI, dan registrasi penyedia pembuatan video bundel
|
||||
varian cepat Grok, default `tool_stream`, pembersihan skema tool /
|
||||
payload reasoning khusus xAI, dan pendaftaran penyedia pembuatan video bundel
|
||||
untuk `grok-imagine-video`
|
||||
- `mistral`: metadata capability milik plugin
|
||||
- `opencode` dan `opencode-go`: metadata capability milik plugin plus
|
||||
- `mistral`: metadata kemampuan milik plugin
|
||||
- `opencode` dan `opencode-go`: metadata kemampuan milik plugin plus
|
||||
sanitasi thought-signature proxy-Gemini
|
||||
- `alibaba`: katalog pembuatan video milik plugin untuk referensi model Wan langsung
|
||||
- `alibaba`: katalog video-generation milik plugin untuk referensi model Wan langsung
|
||||
seperti `alibaba/wan2.6-t2v`
|
||||
- `byteplus`: katalog milik plugin plus registrasi penyedia pembuatan video bundel
|
||||
- `byteplus`: katalog milik plugin plus pendaftaran penyedia video-generation bundel
|
||||
untuk model text-to-video/image-to-video Seedance
|
||||
- `fal`: registrasi penyedia pembuatan video bundel untuk image-generation pihak ketiga terhosting
|
||||
registrasi penyedia pembuatan gambar untuk model gambar FLUX plus registrasi penyedia
|
||||
pembuatan video bundel untuk model video pihak ketiga terhosting
|
||||
- `fal`: pendaftaran penyedia video-generation bundel untuk provider image-generation pihak ketiga terhosting
|
||||
bagi model gambar FLUX plus pendaftaran penyedia video-generation bundel untuk model video pihak ketiga terhosting
|
||||
- `cloudflare-ai-gateway`, `huggingface`, `kimi`, `nvidia`, `qianfan`,
|
||||
`stepfun`, `synthetic`, `venice`, `vercel-ai-gateway`, dan `volcengine`:
|
||||
hanya katalog milik plugin
|
||||
- `qwen`: katalog milik plugin untuk model teks plus registrasi penyedia
|
||||
media-understanding dan pembuatan video bersama untuk permukaan multimodalnya;
|
||||
pembuatan video Qwen menggunakan endpoint video DashScope Standar dengan model Wan
|
||||
bundel seperti `wan2.6-t2v` dan `wan2.7-r2v`
|
||||
- `runway`: registrasi penyedia pembuatan video milik plugin untuk model native
|
||||
berbasis tugas Runway seperti `gen4.5`
|
||||
- `minimax`: katalog milik plugin, registrasi penyedia pembuatan video bundel
|
||||
untuk model video Hailuo, registrasi penyedia pembuatan gambar bundel
|
||||
untuk `image-01`, pemilihan kebijakan replay Anthropic/OpenAI hibrida,
|
||||
dan logika auth/snapshot usage
|
||||
- `together`: katalog milik plugin plus registrasi penyedia pembuatan video bundel
|
||||
- `qwen`: katalog milik plugin untuk model teks plus pendaftaran provider
|
||||
media-understanding dan video-generation bersama untuk permukaan multimodalnya;
|
||||
pembuatan video Qwen menggunakan endpoint video DashScope Standar dengan
|
||||
model Wan bundel seperti `wan2.6-t2v` dan `wan2.7-r2v`
|
||||
- `runway`: pendaftaran penyedia video-generation milik plugin untuk model native
|
||||
Runway berbasis tugas seperti `gen4.5`
|
||||
- `minimax`: katalog milik plugin, pendaftaran penyedia video-generation bundel
|
||||
untuk model video Hailuo, pendaftaran penyedia image-generation bundel
|
||||
untuk `image-01`, pemilihan kebijakan replay Anthropic/OpenAI hibrida, dan logika auth/snapshot penggunaan
|
||||
- `together`: katalog milik plugin plus pendaftaran penyedia video-generation bundel
|
||||
untuk model video Wan
|
||||
- `xiaomi`: katalog milik plugin plus logika auth/snapshot usage
|
||||
- `xiaomi`: katalog milik plugin plus logika auth/snapshot penggunaan
|
||||
|
||||
Plugin `openai` yang dibundel sekarang memiliki kedua id penyedia: `openai` dan
|
||||
`openai-codex`.
|
||||
|
||||
Itu mencakup penyedia yang masih sesuai dengan transport normal OpenClaw. Penyedia
|
||||
yang membutuhkan eksekutor permintaan kustom sepenuhnya adalah permukaan ekstensi
|
||||
terpisah yang lebih dalam.
|
||||
yang memerlukan eksekutor permintaan kustom sepenuhnya adalah permukaan ekstensi
|
||||
yang terpisah dan lebih dalam.
|
||||
|
||||
## Rotasi API key
|
||||
|
||||
- Mendukung rotasi penyedia generik untuk penyedia tertentu yang dipilih.
|
||||
- Mendukung rotasi penyedia generik untuk penyedia tertentu.
|
||||
- Konfigurasikan beberapa key melalui:
|
||||
- `OPENCLAW_LIVE_<PROVIDER>_KEY` (override live tunggal, prioritas tertinggi)
|
||||
- `OPENCLAW_LIVE_<PROVIDER>_KEY` (satu override live, prioritas tertinggi)
|
||||
- `<PROVIDER>_API_KEYS` (daftar dipisahkan koma atau titik koma)
|
||||
- `<PROVIDER>_API_KEY` (key utama)
|
||||
- `<PROVIDER>_API_KEY_*` (daftar bernomor, misalnya `<PROVIDER>_API_KEY_1`)
|
||||
@ -237,28 +237,28 @@ concurrent requests`, `ThrottlingException`, `concurrency limit reached`,
|
||||
|
||||
## Penyedia bawaan (katalog pi-ai)
|
||||
|
||||
OpenClaw disertakan dengan katalog pi‑ai. Penyedia ini tidak memerlukan konfigurasi
|
||||
`models.providers`; cukup tetapkan auth + pilih model.
|
||||
OpenClaw dikirim dengan katalog pi-ai. Penyedia ini tidak memerlukan
|
||||
konfigurasi `models.providers`; cukup tetapkan auth + pilih model.
|
||||
|
||||
### OpenAI
|
||||
|
||||
- Penyedia: `openai`
|
||||
- Auth: `OPENAI_API_KEY`
|
||||
- Rotasi opsional: `OPENAI_API_KEYS`, `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, plus `OPENCLAW_LIVE_OPENAI_KEY` (override tunggal)
|
||||
- Rotasi opsional: `OPENAI_API_KEYS`, `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, plus `OPENCLAW_LIVE_OPENAI_KEY` (satu override)
|
||||
- Contoh model: `openai/gpt-5.4`, `openai/gpt-5.4-pro`
|
||||
- CLI: `openclaw onboard --auth-choice openai-api-key`
|
||||
- Transport default adalah `auto` (WebSocket lebih dulu, fallback SSE)
|
||||
- Override per model melalui `agents.defaults.models["openai/<model>"].params.transport` (`"sse"`, `"websocket"`, atau `"auto"`)
|
||||
- Pemanasan WebSocket OpenAI Responses secara default aktif melalui `params.openaiWsWarmup` (`true`/`false`)
|
||||
- Transport default adalah `auto` (mengutamakan WebSocket, fallback SSE)
|
||||
- Ganti per model melalui `agents.defaults.models["openai/<model>"].params.transport` (`"sse"`, `"websocket"`, atau `"auto"`)
|
||||
- Warm-up WebSocket OpenAI Responses secara default diaktifkan melalui `params.openaiWsWarmup` (`true`/`false`)
|
||||
- Pemrosesan prioritas OpenAI dapat diaktifkan melalui `agents.defaults.models["openai/<model>"].params.serviceTier`
|
||||
- `/fast` dan `params.fastMode` memetakan permintaan Responses `openai/*` langsung ke `service_tier=priority` pada `api.openai.com`
|
||||
- Gunakan `params.serviceTier` bila Anda menginginkan tier eksplisit alih-alih toggle `/fast` bersama
|
||||
- `/fast` dan `params.fastMode` memetakan permintaan Responses `openai/*` langsung ke `service_tier=priority` di `api.openai.com`
|
||||
- Gunakan `params.serviceTier` ketika Anda menginginkan tier eksplisit alih-alih toggle bersama `/fast`
|
||||
- Header atribusi OpenClaw tersembunyi (`originator`, `version`,
|
||||
`User-Agent`) hanya berlaku pada lalu lintas OpenAI native ke `api.openai.com`, bukan
|
||||
`User-Agent`) hanya berlaku pada trafik OpenAI native ke `api.openai.com`, bukan
|
||||
proxy generik yang kompatibel dengan OpenAI
|
||||
- Rute OpenAI native juga mempertahankan `store` Responses, petunjuk prompt-cache, dan
|
||||
pembentukan payload kompatibilitas reasoning OpenAI; rute proxy tidak
|
||||
- `openai/gpt-5.3-codex-spark` sengaja ditekan di OpenClaw karena API OpenAI live menolaknya; Spark diperlakukan sebagai khusus Codex
|
||||
- `openai/gpt-5.3-codex-spark` sengaja disuppress di OpenClaw karena OpenAI API live menolaknya; Spark diperlakukan hanya sebagai Codex
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -270,12 +270,12 @@ OpenClaw disertakan dengan katalog pi‑ai. Penyedia ini tidak memerlukan konfig
|
||||
|
||||
- Penyedia: `anthropic`
|
||||
- Auth: `ANTHROPIC_API_KEY`
|
||||
- Rotasi opsional: `ANTHROPIC_API_KEYS`, `ANTHROPIC_API_KEY_1`, `ANTHROPIC_API_KEY_2`, plus `OPENCLAW_LIVE_ANTHROPIC_KEY` (override tunggal)
|
||||
- Rotasi opsional: `ANTHROPIC_API_KEYS`, `ANTHROPIC_API_KEY_1`, `ANTHROPIC_API_KEY_2`, plus `OPENCLAW_LIVE_ANTHROPIC_KEY` (satu override)
|
||||
- Contoh model: `anthropic/claude-opus-4-6`
|
||||
- CLI: `openclaw onboard --auth-choice apiKey`
|
||||
- Permintaan Anthropic publik langsung mendukung toggle `/fast` bersama dan `params.fastMode`, termasuk lalu lintas terautentikasi API key dan OAuth yang dikirim ke `api.anthropic.com`; OpenClaw memetakannya ke Anthropic `service_tier` (`auto` vs `standard_only`)
|
||||
- Catatan Anthropic: staf Anthropic memberi tahu kami bahwa penggunaan Claude CLI gaya OpenClaw diizinkan lagi, jadi OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai diizinkan untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru.
|
||||
- Token setup Anthropic tetap tersedia sebagai jalur token OpenClaw yang didukung, tetapi OpenClaw sekarang lebih mengutamakan penggunaan ulang Claude CLI dan `claude -p` saat tersedia.
|
||||
- Permintaan Anthropic publik langsung mendukung toggle bersama `/fast` dan `params.fastMode`, termasuk trafik yang diautentikasi dengan API key dan OAuth yang dikirim ke `api.anthropic.com`; OpenClaw memetakannya ke Anthropic `service_tier` (`auto` vs `standard_only`)
|
||||
- Catatan Anthropic: staf Anthropic memberi tahu kami bahwa penggunaan Claude CLI bergaya OpenClaw diizinkan lagi, jadi OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai diizinkan untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru.
|
||||
- Setup-token Anthropic tetap tersedia sebagai jalur token OpenClaw yang didukung, tetapi OpenClaw sekarang lebih mengutamakan penggunaan ulang Claude CLI dan `claude -p` bila tersedia.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -289,16 +289,16 @@ OpenClaw disertakan dengan katalog pi‑ai. Penyedia ini tidak memerlukan konfig
|
||||
- Auth: OAuth (ChatGPT)
|
||||
- Contoh model: `openai-codex/gpt-5.4`
|
||||
- CLI: `openclaw onboard --auth-choice openai-codex` atau `openclaw models auth login --provider openai-codex`
|
||||
- Transport default adalah `auto` (WebSocket lebih dulu, fallback SSE)
|
||||
- Override per model melalui `agents.defaults.models["openai-codex/<model>"].params.transport` (`"sse"`, `"websocket"`, atau `"auto"`)
|
||||
- Transport default adalah `auto` (mengutamakan WebSocket, fallback SSE)
|
||||
- Ganti per model melalui `agents.defaults.models["openai-codex/<model>"].params.transport` (`"sse"`, `"websocket"`, atau `"auto"`)
|
||||
- `params.serviceTier` juga diteruskan pada permintaan Responses Codex native (`chatgpt.com/backend-api`)
|
||||
- Header atribusi OpenClaw tersembunyi (`originator`, `version`,
|
||||
`User-Agent`) hanya dilampirkan pada lalu lintas Codex native ke
|
||||
`User-Agent`) hanya dilampirkan pada trafik Codex native ke
|
||||
`chatgpt.com/backend-api`, bukan proxy generik yang kompatibel dengan OpenAI
|
||||
- Berbagi toggle `/fast` dan konfigurasi `params.fastMode` yang sama seperti `openai/*` langsung; OpenClaw memetakannya ke `service_tier=priority`
|
||||
- `openai-codex/gpt-5.3-codex-spark` tetap tersedia ketika katalog OAuth Codex mengeksposnya; bergantung pada entitlement
|
||||
- `openai-codex/gpt-5.4` mempertahankan `contextWindow = 1050000` native dan runtime default `contextTokens = 272000`; override batas runtime dengan `models.providers.openai-codex.models[].contextTokens`
|
||||
- Catatan kebijakan: OAuth OpenAI Codex secara eksplisit didukung untuk tool/alur kerja eksternal seperti OpenClaw.
|
||||
- `openai-codex/gpt-5.4` mempertahankan `contextWindow = 1050000` native dan default runtime `contextTokens = 272000`; ganti batas runtime dengan `models.providers.openai-codex.models[].contextTokens`
|
||||
- Catatan kebijakan: OpenAI Codex OAuth secara eksplisit didukung untuk tool/alur kerja eksternal seperti OpenClaw.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -318,7 +318,7 @@ OpenClaw disertakan dengan katalog pi‑ai. Penyedia ini tidak memerlukan konfig
|
||||
}
|
||||
```
|
||||
|
||||
### Opsi terhosting bergaya langganan lainnya
|
||||
### Opsi hosted bergaya langganan lainnya
|
||||
|
||||
- [Qwen Cloud](/id/providers/qwen): permukaan penyedia Qwen Cloud plus pemetaan endpoint Alibaba DashScope dan Coding Plan
|
||||
- [MiniMax](/id/providers/minimax): akses OAuth atau API key MiniMax Coding Plan
|
||||
@ -342,30 +342,30 @@ OpenClaw disertakan dengan katalog pi‑ai. Penyedia ini tidak memerlukan konfig
|
||||
|
||||
- Penyedia: `google`
|
||||
- Auth: `GEMINI_API_KEY`
|
||||
- Rotasi opsional: `GEMINI_API_KEYS`, `GEMINI_API_KEY_1`, `GEMINI_API_KEY_2`, fallback `GOOGLE_API_KEY`, dan `OPENCLAW_LIVE_GEMINI_KEY` (override tunggal)
|
||||
- Rotasi opsional: `GEMINI_API_KEYS`, `GEMINI_API_KEY_1`, `GEMINI_API_KEY_2`, fallback `GOOGLE_API_KEY`, dan `OPENCLAW_LIVE_GEMINI_KEY` (satu override)
|
||||
- Contoh model: `google/gemini-3.1-pro-preview`, `google/gemini-3-flash-preview`
|
||||
- Kompatibilitas: konfigurasi OpenClaw lama yang menggunakan `google/gemini-3.1-flash-preview` dinormalkan menjadi `google/gemini-3-flash-preview`
|
||||
- CLI: `openclaw onboard --auth-choice gemini-api-key`
|
||||
- Eksekusi Gemini langsung juga menerima `agents.defaults.models["google/<model>"].params.cachedContent`
|
||||
(atau `cached_content` lama) untuk meneruskan handle `cachedContents/...`
|
||||
native penyedia; cache hit Gemini muncul sebagai OpenClaw `cacheRead`
|
||||
(atau `cached_content` lama) untuk meneruskan handle
|
||||
`cachedContents/...` native penyedia; hit cache Gemini muncul sebagai OpenClaw `cacheRead`
|
||||
|
||||
### Google Vertex dan Gemini CLI
|
||||
|
||||
- Penyedia: `google-vertex`, `google-gemini-cli`
|
||||
- Auth: Vertex menggunakan gcloud ADC; Gemini CLI menggunakan alur OAuth-nya
|
||||
- Peringatan: OAuth Gemini CLI di OpenClaw adalah integrasi tidak resmi. Beberapa pengguna melaporkan pembatasan akun Google setelah menggunakan klien pihak ketiga. Tinjau persyaratan Google dan gunakan akun yang tidak kritis jika Anda memilih untuk melanjutkan.
|
||||
- OAuth Gemini CLI dikirim sebagai bagian dari plugin `google` yang dibundel.
|
||||
- Auth: Vertex menggunakan ADC gcloud; Gemini CLI menggunakan alur OAuth-nya
|
||||
- Perhatian: Gemini CLI OAuth di OpenClaw adalah integrasi tidak resmi. Beberapa pengguna melaporkan pembatasan akun Google setelah menggunakan klien pihak ketiga. Tinjau ketentuan Google dan gunakan akun yang tidak kritis jika Anda memilih untuk melanjutkan.
|
||||
- Gemini CLI OAuth dikirim sebagai bagian dari plugin `google` yang dibundel.
|
||||
- Instal Gemini CLI terlebih dahulu:
|
||||
- `brew install gemini-cli`
|
||||
- atau `npm install -g @google/gemini-cli`
|
||||
- Aktifkan: `openclaw plugins enable google`
|
||||
- Login: `openclaw models auth login --provider google-gemini-cli --set-default`
|
||||
- Model default: `google-gemini-cli/gemini-3-flash-preview`
|
||||
- Catatan: Anda **tidak** menempelkan client id atau secret ke dalam `openclaw.json`. Alur login CLI menyimpan
|
||||
token di profil auth pada host gateway.
|
||||
- Jika permintaan gagal setelah login, tetapkan `GOOGLE_CLOUD_PROJECT` atau `GOOGLE_CLOUD_PROJECT_ID` pada host gateway.
|
||||
- Balasan JSON Gemini CLI diparsing dari `response`; usage menggunakan fallback ke
|
||||
- Catatan: Anda **tidak** menempelkan client id atau secret ke `openclaw.json`. Alur login CLI menyimpan
|
||||
token dalam profil auth di host gateway.
|
||||
- Jika permintaan gagal setelah login, tetapkan `GOOGLE_CLOUD_PROJECT` atau `GOOGLE_CLOUD_PROJECT_ID` di host gateway.
|
||||
- Balasan JSON Gemini CLI diurai dari `response`; penggunaan fallback ke
|
||||
`stats`, dengan `stats.cached` dinormalkan menjadi OpenClaw `cacheRead`.
|
||||
|
||||
### Z.AI (GLM)
|
||||
@ -391,11 +391,11 @@ OpenClaw disertakan dengan katalog pi‑ai. Penyedia ini tidak memerlukan konfig
|
||||
- Contoh model: `kilocode/kilo/auto`
|
||||
- CLI: `openclaw onboard --auth-choice kilocode-api-key`
|
||||
- Base URL: `https://api.kilo.ai/api/gateway/`
|
||||
- Katalog fallback statis mengirim `kilocode/kilo/auto`; discovery live
|
||||
- Katalog fallback statis dikirim dengan `kilocode/kilo/auto`; discovery live
|
||||
`https://api.kilo.ai/api/gateway/models` dapat memperluas katalog runtime
|
||||
lebih lanjut.
|
||||
- Routing upstream yang tepat di balik `kilocode/kilo/auto` dimiliki oleh Kilo Gateway,
|
||||
bukan di-hardcode di OpenClaw.
|
||||
bukan di-hardcode dalam OpenClaw.
|
||||
|
||||
Lihat [/providers/kilocode](/id/providers/kilocode) untuk detail penyiapan.
|
||||
|
||||
@ -403,26 +403,25 @@ Lihat [/providers/kilocode](/id/providers/kilocode) untuk detail penyiapan.
|
||||
|
||||
- OpenRouter: `openrouter` (`OPENROUTER_API_KEY`)
|
||||
- Contoh model: `openrouter/auto`
|
||||
- OpenClaw menerapkan header atribusi aplikasi yang didokumentasikan OpenRouter hanya ketika
|
||||
- OpenClaw menerapkan header atribusi aplikasi OpenRouter yang terdokumentasi hanya ketika
|
||||
permintaan benar-benar menargetkan `openrouter.ai`
|
||||
- Penanda `cache_control` Anthropic khusus OpenRouter juga dibatasi ke
|
||||
rute OpenRouter yang terverifikasi, bukan URL proxy sembarang
|
||||
- OpenRouter tetap berada pada jalur kompatibel OpenAI bergaya proxy, jadi pembentukan permintaan
|
||||
native khusus OpenAI (`serviceTier`, Responses `store`,
|
||||
rute OpenRouter terverifikasi, bukan URL proxy sembarang
|
||||
- OpenRouter tetap berada di jalur kompatibel OpenAI bergaya proxy, sehingga pembentukan permintaan khusus OpenAI native (`serviceTier`, Responses `store`,
|
||||
petunjuk prompt-cache, payload kompatibilitas reasoning OpenAI) tidak diteruskan
|
||||
- Referensi OpenRouter berbasis Gemini hanya mempertahankan sanitasi thought-signature proxy-Gemini;
|
||||
validasi replay Gemini native dan penulisan ulang bootstrap tetap nonaktif
|
||||
- Kilo Gateway: `kilocode` (`KILOCODE_API_KEY`)
|
||||
- Contoh model: `kilocode/kilo/auto`
|
||||
- Referensi Kilo berbasis Gemini mempertahankan jalur sanitasi thought-signature
|
||||
proxy-Gemini yang sama; `kilocode/kilo/auto` dan petunjuk lain yang tidak mendukung proxy-reasoning
|
||||
proxy-Gemini yang sama; `kilocode/kilo/auto` dan petunjuk lain yang tidak mendukung reasoning-proxy
|
||||
melewati injeksi reasoning proxy
|
||||
- MiniMax: `minimax` (API key) dan `minimax-portal` (OAuth)
|
||||
- Auth: `MINIMAX_API_KEY` untuk `minimax`; `MINIMAX_OAUTH_TOKEN` atau `MINIMAX_API_KEY` untuk `minimax-portal`
|
||||
- Contoh model: `minimax/MiniMax-M2.7` atau `minimax-portal/MiniMax-M2.7`
|
||||
- Penyiapan onboarding/API key MiniMax menulis definisi model M2.7 eksplisit dengan
|
||||
`input: ["text", "image"]`; katalog penyedia bundel mempertahankan referensi chat
|
||||
hanya teks sampai konfigurasi penyedia itu dimaterialisasikan
|
||||
`input: ["text", "image"]`; katalog penyedia bundel menjaga referensi chat
|
||||
tetap teks-saja sampai konfigurasi penyedia itu dimaterialisasikan
|
||||
- Moonshot: `moonshot` (`MOONSHOT_API_KEY`)
|
||||
- Contoh model: `moonshot/kimi-k2.5`
|
||||
- Kimi Coding: `kimi` (`KIMI_API_KEY` atau `KIMICODE_API_KEY`)
|
||||
@ -448,7 +447,7 @@ Lihat [/providers/kilocode](/id/providers/kilocode) untuk detail penyiapan.
|
||||
- BytePlus: `byteplus` (`BYTEPLUS_API_KEY`)
|
||||
- Contoh model: `byteplus-plan/ark-code-latest`
|
||||
- xAI: `xai` (`XAI_API_KEY`)
|
||||
- Permintaan xAI bundel native menggunakan jalur xAI Responses
|
||||
- Permintaan xAI native bundel menggunakan jalur xAI Responses
|
||||
- `/fast` atau `params.fastMode: true` menulis ulang `grok-3`, `grok-3-mini`,
|
||||
`grok-4`, dan `grok-4-0709` ke varian `*-fast` mereka
|
||||
- `tool_stream` default aktif; tetapkan
|
||||
@ -459,25 +458,25 @@ Lihat [/providers/kilocode](/id/providers/kilocode) untuk detail penyiapan.
|
||||
- CLI: `openclaw onboard --auth-choice mistral-api-key`
|
||||
- Groq: `groq` (`GROQ_API_KEY`)
|
||||
- Cerebras: `cerebras` (`CEREBRAS_API_KEY`)
|
||||
- Model GLM pada Cerebras menggunakan id `zai-glm-4.7` dan `zai-glm-4.6`.
|
||||
- Model GLM di Cerebras menggunakan id `zai-glm-4.7` dan `zai-glm-4.6`.
|
||||
- Base URL kompatibel OpenAI: `https://api.cerebras.ai/v1`.
|
||||
- GitHub Copilot: `github-copilot` (`COPILOT_GITHUB_TOKEN` / `GH_TOKEN` / `GITHUB_TOKEN`)
|
||||
- Contoh model Hugging Face Inference: `huggingface/deepseek-ai/DeepSeek-R1`; CLI: `openclaw onboard --auth-choice huggingface-api-key`. Lihat [Hugging Face (Inference)](/id/providers/huggingface).
|
||||
|
||||
## Penyedia melalui `models.providers` (kustom/base URL)
|
||||
## Penyedia melalui `models.providers` (custom/base URL)
|
||||
|
||||
Gunakan `models.providers` (atau `models.json`) untuk menambahkan penyedia **kustom**
|
||||
atau proxy yang kompatibel dengan OpenAI/Anthropic.
|
||||
Gunakan `models.providers` (atau `models.json`) untuk menambahkan penyedia **kustom** atau
|
||||
proxy yang kompatibel dengan OpenAI/Anthropic.
|
||||
|
||||
Banyak plugin penyedia bundel di bawah ini sudah menerbitkan katalog default.
|
||||
Gunakan entri `models.providers.<id>` yang eksplisit hanya ketika Anda ingin menimpa
|
||||
base URL, header, atau daftar model default.
|
||||
Gunakan entri `models.providers.<id>` eksplisit hanya ketika Anda ingin mengganti
|
||||
default base URL, header, atau daftar model.
|
||||
|
||||
### Moonshot AI (Kimi)
|
||||
|
||||
Moonshot dikirim sebagai plugin penyedia bundel. Gunakan penyedia bawaan secara
|
||||
default, dan tambahkan entri `models.providers.moonshot` yang eksplisit hanya ketika Anda
|
||||
perlu menimpa base URL atau metadata model:
|
||||
default, dan tambahkan entri `models.providers.moonshot` eksplisit hanya ketika Anda
|
||||
perlu mengganti base URL atau metadata model:
|
||||
|
||||
- Penyedia: `moonshot`
|
||||
- Auth: `MOONSHOT_API_KEY`
|
||||
@ -550,13 +549,13 @@ Volcano Engine (火山引擎) menyediakan akses ke Doubao dan model lain di Tion
|
||||
}
|
||||
```
|
||||
|
||||
Onboarding default ke permukaan coding, tetapi katalog umum `volcengine/*`
|
||||
Onboarding secara default menggunakan permukaan coding, tetapi katalog umum `volcengine/*`
|
||||
didaftarkan pada saat yang sama.
|
||||
|
||||
Dalam pemilih model onboarding/konfigurasi, pilihan auth Volcengine lebih mengutamakan kedua
|
||||
baris `volcengine/*` dan `volcengine-plan/*`. Jika model-model itu belum dimuat,
|
||||
OpenClaw kembali ke katalog yang tidak difilter alih-alih menampilkan pemilih
|
||||
bercakupan penyedia yang kosong.
|
||||
Dalam pemilih model onboarding/konfigurasi, pilihan auth Volcengine mengutamakan kedua
|
||||
baris `volcengine/*` dan `volcengine-plan/*`. Jika model tersebut belum dimuat,
|
||||
OpenClaw fallback ke katalog tanpa filter alih-alih menampilkan pemilih
|
||||
yang dibatasi penyedia namun kosong.
|
||||
|
||||
Model yang tersedia:
|
||||
|
||||
@ -576,7 +575,7 @@ Model coding (`volcengine-plan`):
|
||||
|
||||
### BytePlus (Internasional)
|
||||
|
||||
BytePlus ARK menyediakan akses ke model yang sama seperti Volcano Engine untuk pengguna internasional.
|
||||
BytePlus ARK menyediakan akses ke model yang sama dengan Volcano Engine untuk pengguna internasional.
|
||||
|
||||
- Penyedia: `byteplus` (coding: `byteplus-plan`)
|
||||
- Auth: `BYTEPLUS_API_KEY`
|
||||
@ -591,13 +590,13 @@ BytePlus ARK menyediakan akses ke model yang sama seperti Volcano Engine untuk p
|
||||
}
|
||||
```
|
||||
|
||||
Onboarding default ke permukaan coding, tetapi katalog umum `byteplus/*`
|
||||
Onboarding secara default menggunakan permukaan coding, tetapi katalog umum `byteplus/*`
|
||||
didaftarkan pada saat yang sama.
|
||||
|
||||
Dalam pemilih model onboarding/konfigurasi, pilihan auth BytePlus lebih mengutamakan kedua
|
||||
baris `byteplus/*` dan `byteplus-plan/*`. Jika model-model itu belum dimuat,
|
||||
OpenClaw kembali ke katalog yang tidak difilter alih-alih menampilkan pemilih
|
||||
bercakupan penyedia yang kosong.
|
||||
Dalam pemilih model onboarding/konfigurasi, pilihan auth BytePlus mengutamakan kedua
|
||||
baris `byteplus/*` dan `byteplus-plan/*`. Jika model tersebut belum dimuat,
|
||||
OpenClaw fallback ke katalog tanpa filter alih-alih menampilkan pemilih
|
||||
yang dibatasi penyedia namun kosong.
|
||||
|
||||
Model yang tersedia:
|
||||
|
||||
@ -647,23 +646,23 @@ MiniMax dikonfigurasi melalui `models.providers` karena menggunakan endpoint kus
|
||||
|
||||
- MiniMax OAuth (Global): `--auth-choice minimax-global-oauth`
|
||||
- MiniMax OAuth (CN): `--auth-choice minimax-cn-oauth`
|
||||
- API key MiniMax (Global): `--auth-choice minimax-global-api`
|
||||
- API key MiniMax (CN): `--auth-choice minimax-cn-api`
|
||||
- MiniMax API key (Global): `--auth-choice minimax-global-api`
|
||||
- MiniMax API key (CN): `--auth-choice minimax-cn-api`
|
||||
- Auth: `MINIMAX_API_KEY` untuk `minimax`; `MINIMAX_OAUTH_TOKEN` atau
|
||||
`MINIMAX_API_KEY` untuk `minimax-portal`
|
||||
|
||||
Lihat [/providers/minimax](/id/providers/minimax) untuk detail penyiapan, opsi model, dan snippet konfigurasi.
|
||||
Lihat [/providers/minimax](/id/providers/minimax) untuk detail penyiapan, opsi model, dan cuplikan konfigurasi.
|
||||
|
||||
Pada jalur streaming MiniMax yang kompatibel dengan Anthropic, OpenClaw menonaktifkan thinking secara
|
||||
default kecuali Anda menetapkannya secara eksplisit, dan `/fast on` menulis ulang
|
||||
default kecuali Anda secara eksplisit menetapkannya, dan `/fast on` menulis ulang
|
||||
`MiniMax-M2.7` menjadi `MiniMax-M2.7-highspeed`.
|
||||
|
||||
Pemisahan capability milik plugin:
|
||||
Pembagian kapabilitas milik plugin:
|
||||
|
||||
- Default teks/chat tetap pada `minimax/MiniMax-M2.7`
|
||||
- Pembuatan gambar adalah `minimax/image-01` atau `minimax-portal/image-01`
|
||||
- Pemahaman gambar adalah `MiniMax-VL-01` milik plugin pada kedua jalur auth MiniMax
|
||||
- Web search tetap pada id penyedia `minimax`
|
||||
- Pencarian web tetap pada id penyedia `minimax`
|
||||
|
||||
### Ollama
|
||||
|
||||
@ -675,7 +674,7 @@ Ollama dikirim sebagai plugin penyedia bundel dan menggunakan API native Ollama:
|
||||
- Instalasi: [https://ollama.com/download](https://ollama.com/download)
|
||||
|
||||
```bash
|
||||
# Install Ollama, then pull a model:
|
||||
# Instal Ollama, lalu tarik model:
|
||||
ollama pull llama3.3
|
||||
```
|
||||
|
||||
@ -687,20 +686,20 @@ ollama pull llama3.3
|
||||
}
|
||||
```
|
||||
|
||||
Ollama terdeteksi secara lokal di `http://127.0.0.1:11434` ketika Anda memilih ikut serta dengan
|
||||
Ollama dideteksi secara lokal di `http://127.0.0.1:11434` ketika Anda ikut serta dengan
|
||||
`OLLAMA_API_KEY`, dan plugin penyedia bundel menambahkan Ollama langsung ke
|
||||
`openclaw onboard` dan pemilih model. Lihat [/providers/ollama](/id/providers/ollama)
|
||||
untuk onboarding, mode cloud/lokal, dan konfigurasi kustom.
|
||||
|
||||
### vLLM
|
||||
|
||||
vLLM dikirim sebagai plugin penyedia bundel untuk server OpenAI-compatible lokal/self-hosted:
|
||||
vLLM dikirim sebagai plugin penyedia bundel untuk server lokal/self-hosted yang kompatibel dengan OpenAI:
|
||||
|
||||
- Penyedia: `vllm`
|
||||
- Auth: Opsional (tergantung server Anda)
|
||||
- Auth: Opsional (bergantung pada server Anda)
|
||||
- Base URL default: `http://127.0.0.1:8000/v1`
|
||||
|
||||
Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun bisa digunakan jika server Anda tidak memaksa auth):
|
||||
Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun berfungsi jika server Anda tidak menerapkan auth):
|
||||
|
||||
```bash
|
||||
export VLLM_API_KEY="vllm-local"
|
||||
@ -720,15 +719,14 @@ Lihat [/providers/vllm](/id/providers/vllm) untuk detail.
|
||||
|
||||
### SGLang
|
||||
|
||||
SGLang dikirim sebagai plugin penyedia bundel untuk server
|
||||
OpenAI-compatible self-hosted yang cepat:
|
||||
SGLang dikirim sebagai plugin penyedia bundel untuk server self-hosted cepat yang kompatibel dengan OpenAI:
|
||||
|
||||
- Penyedia: `sglang`
|
||||
- Auth: Opsional (tergantung server Anda)
|
||||
- Auth: Opsional (bergantung pada server Anda)
|
||||
- Base URL default: `http://127.0.0.1:30000/v1`
|
||||
|
||||
Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun bisa digunakan jika server Anda tidak
|
||||
memaksa auth):
|
||||
Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun berfungsi jika server Anda tidak
|
||||
menerapkan auth):
|
||||
|
||||
```bash
|
||||
export SGLANG_API_KEY="sglang-local"
|
||||
@ -748,7 +746,7 @@ Lihat [/providers/sglang](/id/providers/sglang) untuk detail.
|
||||
|
||||
### Proxy lokal (LM Studio, vLLM, LiteLLM, dll.)
|
||||
|
||||
Contoh (kompatibel OpenAI):
|
||||
Contoh (kompatibel dengan OpenAI):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -784,19 +782,19 @@ Contoh (kompatibel OpenAI):
|
||||
Catatan:
|
||||
|
||||
- Untuk penyedia kustom, `reasoning`, `input`, `cost`, `contextWindow`, dan `maxTokens` bersifat opsional.
|
||||
Jika dihilangkan, default OpenClaw adalah:
|
||||
Jika dihilangkan, OpenClaw menggunakan default:
|
||||
- `reasoning: false`
|
||||
- `input: ["text"]`
|
||||
- `cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }`
|
||||
- `contextWindow: 200000`
|
||||
- `maxTokens: 8192`
|
||||
- Disarankan: tetapkan nilai eksplisit yang sesuai dengan batas proxy/model Anda.
|
||||
- Untuk `api: "openai-completions"` pada endpoint non-native (setiap `baseUrl` tidak kosong yang host-nya bukan `api.openai.com`), OpenClaw memaksa `compat.supportsDeveloperRole: false` untuk menghindari error 400 penyedia untuk role `developer` yang tidak didukung.
|
||||
- Rute kompatibel OpenAI bergaya proxy juga melewati pembentukan permintaan native khusus OpenAI:
|
||||
- Untuk `api: "openai-completions"` pada endpoint non-native (setiap `baseUrl` tidak kosong yang host-nya bukan `api.openai.com`), OpenClaw memaksa `compat.supportsDeveloperRole: false` untuk menghindari error 400 dari penyedia atas peran `developer` yang tidak didukung.
|
||||
- Rute kompatibel OpenAI bergaya proxy juga melewati pembentukan permintaan khusus OpenAI native:
|
||||
tidak ada `service_tier`, tidak ada Responses `store`, tidak ada petunjuk prompt-cache, tidak ada
|
||||
pembentukan payload kompatibilitas reasoning OpenAI, dan tidak ada header atribusi OpenClaw
|
||||
tersembunyi.
|
||||
- Jika `baseUrl` kosong/dihilangkan, OpenClaw mempertahankan perilaku default OpenAI (yang diselesaikan ke `api.openai.com`).
|
||||
pembentukan payload kompatibilitas reasoning OpenAI, dan tidak ada header
|
||||
atribusi OpenClaw tersembunyi.
|
||||
- Jika `baseUrl` kosong/dihilangkan, OpenClaw mempertahankan perilaku OpenAI default (yang mengarah ke `api.openai.com`).
|
||||
- Demi keamanan, `compat.supportsDeveloperRole: true` yang eksplisit tetap ditimpa pada endpoint `openai-completions` non-native.
|
||||
|
||||
## Contoh CLI
|
||||
@ -812,6 +810,6 @@ Lihat juga: [/gateway/configuration](/id/gateway/configuration) untuk contoh kon
|
||||
## Terkait
|
||||
|
||||
- [Models](/id/concepts/models) — konfigurasi model dan alias
|
||||
- [Model Failover](/id/concepts/model-failover) — rantai fallback dan perilaku percobaan ulang
|
||||
- [Configuration Reference](/id/gateway/configuration-reference#agent-defaults) — kunci konfigurasi model
|
||||
- [Model Failover](/id/concepts/model-failover) — rantai fallback dan perilaku retry
|
||||
- [Configuration Reference](/id/gateway/configuration-reference#agent-defaults) — key konfigurasi model
|
||||
- [Providers](/id/providers) — panduan penyiapan per penyedia
|
||||
|
||||
@ -2,36 +2,36 @@
|
||||
read_when:
|
||||
- Memperluas qa-lab atau qa-channel
|
||||
- Menambahkan skenario QA yang didukung repo
|
||||
- Membangun otomasi QA dengan realisme lebih tinggi di sekitar Dashboard Gateway
|
||||
summary: Bentuk otomasi QA privat untuk qa-lab, qa-channel, skenario seeded, dan laporan protokol
|
||||
title: Otomasi E2E QA
|
||||
- Membangun otomatisasi QA dengan realisme lebih tinggi di sekitar dasbor Gateway
|
||||
summary: Bentuk otomatisasi QA privat untuk qa-lab, qa-channel, skenario ber-seed, dan laporan protokol
|
||||
title: Otomatisasi QA E2E
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T06:00:49Z"
|
||||
generated_at: "2026-04-09T01:27:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 57da147dc06abf9620290104e01a83b42182db1806514114fd9e8467492cda99
|
||||
source_hash: c922607d67e0f3a2489ac82bc9f510f7294ced039c1014c15b676d826441d833
|
||||
source_path: concepts/qa-e2e-automation.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Otomasi E2E QA
|
||||
# Otomatisasi QA E2E
|
||||
|
||||
Stack QA privat dimaksudkan untuk menguji OpenClaw dengan cara yang lebih realistis
|
||||
dan menyerupai channel dibandingkan yang dapat dilakukan oleh satu unit test.
|
||||
Stack QA privat dimaksudkan untuk menguji OpenClaw dengan cara yang lebih realistis,
|
||||
berbentuk kanal, dibandingkan yang dapat dicapai oleh satu unit test.
|
||||
|
||||
Komponen saat ini:
|
||||
|
||||
- `extensions/qa-channel`: channel pesan sintetis dengan permukaan DM, channel, thread,
|
||||
reaksi, edit, dan hapus.
|
||||
- `extensions/qa-channel`: kanal pesan sintetis dengan permukaan DM, channel, thread,
|
||||
reaction, edit, dan delete.
|
||||
- `extensions/qa-lab`: UI debugger dan bus QA untuk mengamati transkrip,
|
||||
menyuntikkan pesan masuk, dan mengekspor laporan Markdown.
|
||||
- `qa/`: aset seed yang didukung repo untuk tugas awal dan skenario QA
|
||||
- `qa/`: aset seed yang didukung repo untuk tugas kickoff dan skenario QA
|
||||
dasar.
|
||||
|
||||
Alur operator QA saat ini adalah situs QA dua panel:
|
||||
|
||||
- Kiri: Dashboard Gateway (Control UI) dengan agen.
|
||||
- Kanan: QA Lab, menampilkan transkrip bergaya Slack dan rencana skenario.
|
||||
- Kiri: dasbor Gateway (Control UI) dengan agen.
|
||||
- Kanan: QA Lab, yang menampilkan transkrip bergaya Slack dan rencana skenario.
|
||||
|
||||
Jalankan dengan:
|
||||
|
||||
@ -39,9 +39,9 @@ Jalankan dengan:
|
||||
pnpm qa:lab:up
|
||||
```
|
||||
|
||||
Itu membangun situs QA, memulai lane gateway berbasis Docker, dan mengekspos
|
||||
halaman QA Lab tempat operator atau loop otomasi dapat memberi agen misi QA,
|
||||
mengamati perilaku channel nyata, dan mencatat apa yang berhasil, gagal, atau
|
||||
Perintah itu membangun situs QA, memulai lane gateway berbasis Docker, dan menampilkan
|
||||
halaman QA Lab tempat operator atau loop otomatisasi dapat memberi agen misi QA,
|
||||
mengamati perilaku kanal nyata, dan mencatat apa yang berhasil, gagal, atau
|
||||
tetap terblokir.
|
||||
|
||||
Untuk iterasi UI QA Lab yang lebih cepat tanpa membangun ulang image Docker setiap kali,
|
||||
@ -54,9 +54,9 @@ pnpm qa:lab:up:fast
|
||||
pnpm qa:lab:watch
|
||||
```
|
||||
|
||||
`qa:lab:up:fast` menjaga layanan Docker tetap berjalan pada image yang sudah dibangun sebelumnya dan me-bind-mount
|
||||
`qa:lab:up:fast` menjaga layanan Docker tetap berjalan pada image yang sudah dibangun sebelumnya dan melakukan bind-mount
|
||||
`extensions/qa-lab/web/dist` ke dalam container `qa-lab`. `qa:lab:watch`
|
||||
membangun ulang bundle tersebut saat ada perubahan, dan browser memuat ulang otomatis ketika hash aset QA Lab berubah.
|
||||
membangun ulang bundle itu saat ada perubahan, dan browser memuat ulang otomatis saat hash aset QA Lab berubah.
|
||||
|
||||
## Seed yang didukung repo
|
||||
|
||||
@ -68,19 +68,19 @@ Aset seed berada di `qa/`:
|
||||
Ini sengaja disimpan di git agar rencana QA terlihat oleh manusia maupun
|
||||
agen. Daftar dasar harus tetap cukup luas untuk mencakup:
|
||||
|
||||
- obrolan DM dan channel
|
||||
- chat DM dan channel
|
||||
- perilaku thread
|
||||
- siklus hidup aksi pesan
|
||||
- callback cron
|
||||
- pemanggilan memori
|
||||
- recall memori
|
||||
- pergantian model
|
||||
- handoff subagen
|
||||
- membaca repo dan membaca dokumen
|
||||
- pembacaan repo dan pembacaan dokumen
|
||||
- satu tugas build kecil seperti Lobster Invaders
|
||||
|
||||
## Pelaporan
|
||||
|
||||
`qa-lab` mengekspor laporan protokol Markdown dari linimasa bus yang diamati.
|
||||
`qa-lab` mengekspor laporan protokol Markdown dari timeline bus yang diamati.
|
||||
Laporan tersebut harus menjawab:
|
||||
|
||||
- Apa yang berhasil
|
||||
@ -88,6 +88,59 @@ Laporan tersebut harus menjawab:
|
||||
- Apa yang tetap terblokir
|
||||
- Skenario tindak lanjut apa yang layak ditambahkan
|
||||
|
||||
Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama di beberapa ref model live
|
||||
dan tulis laporan Markdown yang dinilai:
|
||||
|
||||
```bash
|
||||
pnpm openclaw qa character-eval \
|
||||
--model openai/gpt-5.4,thinking=xhigh \
|
||||
--model openai/gpt-5.2,thinking=xhigh \
|
||||
--model openai/gpt-5,thinking=xhigh \
|
||||
--model anthropic/claude-opus-4-6,thinking=high \
|
||||
--model anthropic/claude-sonnet-4-6,thinking=high \
|
||||
--model zai/glm-5.1,thinking=high \
|
||||
--model moonshot/kimi-k2.5,thinking=high \
|
||||
--model google/gemini-3.1-pro-preview,thinking=high \
|
||||
--judge-model openai/gpt-5.4,thinking=xhigh,fast \
|
||||
--judge-model anthropic/claude-opus-4-6,thinking=high \
|
||||
--blind-judge-models \
|
||||
--concurrency 16 \
|
||||
--judge-concurrency 16
|
||||
```
|
||||
|
||||
Perintah ini menjalankan child process gateway QA lokal, bukan Docker. Skenario evaluasi karakter
|
||||
harus menetapkan persona melalui `SOUL.md`, lalu menjalankan giliran pengguna biasa
|
||||
seperti chat, bantuan workspace, dan tugas file kecil. Model kandidat
|
||||
tidak boleh diberi tahu bahwa model tersebut sedang dievaluasi. Perintah ini mempertahankan setiap
|
||||
transkrip lengkap, mencatat statistik dasar run, lalu meminta model penilai dalam mode cepat dengan
|
||||
penalaran `xhigh` untuk memberi peringkat pada run berdasarkan kealamian, vibe, dan humor.
|
||||
Gunakan `--blind-judge-models` saat membandingkan provider: prompt penilai tetap menerima
|
||||
setiap transkrip dan status run, tetapi ref kandidat diganti dengan label netral
|
||||
seperti `candidate-01`; laporan memetakan kembali peringkat ke ref sebenarnya setelah
|
||||
parsing.
|
||||
Run kandidat secara default menggunakan thinking `high`, dengan `xhigh` untuk model OpenAI yang
|
||||
mendukungnya. Ganti kandidat tertentu secara inline dengan
|
||||
`--model provider/model,thinking=<level>`. `--thinking <level>` tetap menetapkan
|
||||
fallback global, dan bentuk lama `--model-thinking <provider/model=level>` tetap
|
||||
dipertahankan untuk kompatibilitas.
|
||||
Ref kandidat OpenAI secara default menggunakan mode cepat agar pemrosesan prioritas dipakai jika
|
||||
provider mendukungnya. Tambahkan `,fast`, `,no-fast`, atau `,fast=false` secara inline ketika
|
||||
satu kandidat atau penilai memerlukan override. Berikan `--fast` hanya jika Anda ingin
|
||||
memaksa mode cepat aktif untuk setiap model kandidat. Durasi kandidat dan penilai
|
||||
dicatat dalam laporan untuk analisis benchmark, tetapi prompt penilai secara eksplisit menyatakan
|
||||
agar tidak memberi peringkat berdasarkan kecepatan.
|
||||
Run model kandidat dan penilai keduanya secara default menggunakan concurrency 16. Turunkan
|
||||
`--concurrency` atau `--judge-concurrency` ketika batas provider atau tekanan gateway lokal
|
||||
membuat run terlalu bising.
|
||||
Saat tidak ada kandidat `--model` yang diberikan, evaluasi karakter secara default menggunakan
|
||||
`openai/gpt-5.4`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
|
||||
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
|
||||
`moonshot/kimi-k2.5`, dan
|
||||
`google/gemini-3.1-pro-preview` saat tidak ada `--model` yang diberikan.
|
||||
Saat tidak ada `--judge-model` yang diberikan, penilai secara default menggunakan
|
||||
`openai/gpt-5.4,thinking=xhigh,fast` dan
|
||||
`anthropic/claude-opus-4-6,thinking=high`.
|
||||
|
||||
## Dokumen terkait
|
||||
|
||||
- [Testing](/id/help/testing)
|
||||
|
||||
@ -1,26 +1,26 @@
|
||||
---
|
||||
read_when:
|
||||
- Anda menginginkan fallback yang andal saat penyedia API gagal
|
||||
- Anda menjalankan Codex CLI atau CLI AI lokal lain dan ingin menggunakannya kembali
|
||||
- Anda menjalankan Codex CLI atau CLI AI lokal lainnya dan ingin menggunakannya kembali
|
||||
- Anda ingin memahami jembatan loopback MCP untuk akses alat backend CLI
|
||||
summary: 'Backend CLI: fallback CLI AI lokal dengan jembatan alat MCP opsional'
|
||||
title: Backend CLI
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T02:14:26Z"
|
||||
generated_at: "2026-04-09T01:27:54Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: b0e8c41f5f5a8e34466f6b765e5c08585ef1788fa9e9d953257324bcc6cbc414
|
||||
source_hash: 9b458f9fe6fa64c47864c8c180f3dedfd35c5647de470a2a4d31c26165663c20
|
||||
source_path: gateway/cli-backends.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Backend CLI (runtime fallback)
|
||||
|
||||
OpenClaw dapat menjalankan **CLI AI lokal** sebagai **fallback hanya-teks** saat penyedia API sedang down,
|
||||
terkena pembatasan laju, atau sementara berperilaku tidak semestinya. Ini sengaja dibuat konservatif:
|
||||
OpenClaw dapat menjalankan **CLI AI lokal** sebagai **fallback hanya-teks** saat penyedia API sedang tidak tersedia,
|
||||
terkena pembatasan laju, atau untuk sementara berperilaku tidak semestinya. Ini sengaja dibuat konservatif:
|
||||
|
||||
- **Alat OpenClaw tidak disuntikkan secara langsung**, tetapi backend dengan `bundleMcp: true`
|
||||
dapat menerima alat gateway melalui jembatan MCP loopback.
|
||||
dapat menerima alat gateway melalui jembatan loopback MCP.
|
||||
- **Streaming JSONL** untuk CLI yang mendukungnya.
|
||||
- **Sesi didukung** (agar giliran lanjutan tetap koheren).
|
||||
- **Gambar dapat diteruskan** jika CLI menerima path gambar.
|
||||
@ -28,11 +28,11 @@ terkena pembatasan laju, atau sementara berperilaku tidak semestinya. Ini sengaj
|
||||
Ini dirancang sebagai **jaring pengaman** alih-alih jalur utama. Gunakan ini saat Anda
|
||||
menginginkan respons teks yang “selalu berfungsi” tanpa bergantung pada API eksternal.
|
||||
|
||||
Jika Anda menginginkan runtime harness penuh dengan kontrol sesi ACP, tugas latar belakang,
|
||||
Jika Anda menginginkan runtime harness lengkap dengan kontrol sesi ACP, tugas latar belakang,
|
||||
pengikatan thread/percakapan, dan sesi coding eksternal persisten, gunakan
|
||||
[ACP Agents](/id/tools/acp-agents) sebagai gantinya. Backend CLI bukan ACP.
|
||||
|
||||
## Mulai cepat yang ramah pemula
|
||||
## Memulai cepat yang ramah pemula
|
||||
|
||||
Anda dapat menggunakan Codex CLI **tanpa konfigurasi apa pun** (plugin OpenAI bawaan
|
||||
mendaftarkan backend default):
|
||||
@ -42,7 +42,7 @@ openclaw agent --message "hi" --model codex-cli/gpt-5.4
|
||||
```
|
||||
|
||||
Jika gateway Anda berjalan di bawah launchd/systemd dan PATH minimal, tambahkan hanya
|
||||
path perintahnya:
|
||||
path perintah:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -58,11 +58,11 @@ path perintahnya:
|
||||
}
|
||||
```
|
||||
|
||||
Itu saja. Tidak perlu key, tidak perlu konfigurasi auth tambahan selain yang dibutuhkan oleh CLI itu sendiri.
|
||||
Itu saja. Tidak ada key, tidak ada konfigurasi auth tambahan selain yang dibutuhkan oleh CLI itu sendiri.
|
||||
|
||||
Jika Anda menggunakan backend CLI bawaan sebagai **penyedia pesan utama** pada
|
||||
host gateway, OpenClaw sekarang otomatis memuat plugin bawaan pemilik saat konfigurasi Anda
|
||||
secara eksplisit merujuk backend tersebut dalam model ref atau di bawah
|
||||
host gateway, OpenClaw kini memuat otomatis plugin bawaan pemiliknya saat konfigurasi Anda
|
||||
secara eksplisit mereferensikan backend tersebut dalam referensi model atau di bawah
|
||||
`agents.defaults.cliBackends`.
|
||||
|
||||
## Menggunakannya sebagai fallback
|
||||
@ -92,7 +92,7 @@ Catatan:
|
||||
- Jika penyedia utama gagal (auth, pembatasan laju, timeout), OpenClaw akan
|
||||
mencoba backend CLI berikutnya.
|
||||
|
||||
## Gambaran umum konfigurasi
|
||||
## Ringkasan konfigurasi
|
||||
|
||||
Semua backend CLI berada di bawah:
|
||||
|
||||
@ -100,8 +100,8 @@ Semua backend CLI berada di bawah:
|
||||
agents.defaults.cliBackends
|
||||
```
|
||||
|
||||
Setiap entri diberi key dengan **id penyedia** (misalnya `codex-cli`, `my-cli`).
|
||||
Id penyedia menjadi sisi kiri dari model ref Anda:
|
||||
Setiap entri diberi key oleh **id penyedia** (misalnya `codex-cli`, `my-cli`).
|
||||
Id penyedia menjadi sisi kiri dari referensi model Anda:
|
||||
|
||||
```
|
||||
<provider>/<model>
|
||||
@ -131,6 +131,9 @@ Id penyedia menjadi sisi kiri dari model ref Anda:
|
||||
sessionMode: "existing",
|
||||
sessionIdFields: ["session_id", "conversation_id"],
|
||||
systemPromptArg: "--system",
|
||||
// CLI bergaya Codex dapat diarahkan ke file prompt sebagai gantinya:
|
||||
// systemPromptFileConfigArg: "-c",
|
||||
// systemPromptFileConfigKey: "model_instructions_file",
|
||||
systemPromptWhen: "first",
|
||||
imageArg: "--image",
|
||||
imageMode: "repeat",
|
||||
@ -145,49 +148,55 @@ Id penyedia menjadi sisi kiri dari model ref Anda:
|
||||
## Cara kerjanya
|
||||
|
||||
1. **Memilih backend** berdasarkan prefiks penyedia (`codex-cli/...`).
|
||||
2. **Membangun system prompt** menggunakan prompt OpenClaw + konteks workspace yang sama.
|
||||
2. **Menyusun prompt sistem** menggunakan prompt OpenClaw + konteks workspace yang sama.
|
||||
3. **Menjalankan CLI** dengan id sesi (jika didukung) agar riwayat tetap konsisten.
|
||||
4. **Mengurai output** (JSON atau teks biasa) dan mengembalikan teks akhir.
|
||||
5. **Menyimpan id sesi** per backend, sehingga tindak lanjut menggunakan kembali sesi CLI yang sama.
|
||||
|
||||
<Note>
|
||||
Backend `claude-cli` Anthropic bawaan sekarang didukung kembali. Staf Anthropic
|
||||
memberi tahu kami bahwa penggunaan Claude CLI gaya OpenClaw diizinkan kembali, jadi OpenClaw menganggap
|
||||
penggunaan `claude -p` sebagai penggunaan yang disetujui untuk integrasi ini kecuali Anthropic menerbitkan
|
||||
Backend `claude-cli` Anthropic bawaan kini didukung lagi. Staf Anthropic
|
||||
memberi tahu kami bahwa penggunaan Claude CLI bergaya OpenClaw kini diperbolehkan lagi, jadi OpenClaw menganggap
|
||||
penggunaan `claude -p` disetujui untuk integrasi ini kecuali Anthropic menerbitkan
|
||||
kebijakan baru.
|
||||
</Note>
|
||||
|
||||
Backend `codex-cli` OpenAI bawaan meneruskan prompt sistem OpenClaw melalui
|
||||
override konfigurasi `model_instructions_file` Codex (`-c
|
||||
model_instructions_file="..."`). Codex tidak menyediakan flag
|
||||
`--append-system-prompt` seperti Claude, jadi OpenClaw menulis prompt yang telah dirakit ke
|
||||
file sementara untuk setiap sesi Codex CLI baru.
|
||||
|
||||
## Sesi
|
||||
|
||||
- Jika CLI mendukung sesi, atur `sessionArg` (misalnya `--session-id`) atau
|
||||
- Jika CLI mendukung sesi, setel `sessionArg` (misalnya `--session-id`) atau
|
||||
`sessionArgs` (placeholder `{sessionId}`) saat ID perlu disisipkan
|
||||
ke dalam beberapa flag.
|
||||
- Jika CLI menggunakan **subperintah resume** dengan flag yang berbeda, atur
|
||||
`resumeArgs` (menggantikan `args` saat melanjutkan) dan opsional `resumeOutput`
|
||||
ke beberapa flag.
|
||||
- Jika CLI menggunakan **subperintah resume** dengan flag yang berbeda, setel
|
||||
`resumeArgs` (menggantikan `args` saat melanjutkan) dan secara opsional `resumeOutput`
|
||||
(untuk resume non-JSON).
|
||||
- `sessionMode`:
|
||||
- `always`: selalu kirim id sesi (UUID baru jika belum ada yang tersimpan).
|
||||
- `always`: selalu kirim id sesi (UUID baru jika tidak ada yang tersimpan).
|
||||
- `existing`: hanya kirim id sesi jika sebelumnya sudah tersimpan.
|
||||
- `none`: jangan pernah kirim id sesi.
|
||||
|
||||
Catatan serialisasi:
|
||||
|
||||
- `serialize: true` menjaga urutan eksekusi pada lane yang sama.
|
||||
- `serialize: true` menjaga eksekusi pada lane yang sama tetap berurutan.
|
||||
- Sebagian besar CLI melakukan serialisasi pada satu lane penyedia.
|
||||
- OpenClaw membuang penggunaan ulang sesi CLI yang tersimpan ketika status auth backend berubah, termasuk login ulang, rotasi token, atau kredensial profil auth yang berubah.
|
||||
- OpenClaw membuang penggunaan ulang sesi CLI yang tersimpan saat status auth backend berubah, termasuk login ulang, rotasi token, atau perubahan kredensial profil auth.
|
||||
|
||||
## Gambar (pass-through)
|
||||
|
||||
Jika CLI Anda menerima path gambar, atur `imageArg`:
|
||||
Jika CLI Anda menerima path gambar, setel `imageArg`:
|
||||
|
||||
```json5
|
||||
imageArg: "--image",
|
||||
imageMode: "repeat"
|
||||
```
|
||||
|
||||
OpenClaw akan menulis gambar base64 ke file sementara. Jika `imageArg` diatur, path tersebut
|
||||
diteruskan sebagai argumen CLI. Jika `imageArg` tidak ada, OpenClaw menambahkan
|
||||
path file ke prompt (injeksi path), yang cukup untuk CLI yang otomatis
|
||||
OpenClaw akan menulis gambar base64 ke file sementara. Jika `imageArg` disetel, path tersebut
|
||||
diteruskan sebagai arg CLI. Jika `imageArg` tidak ada, OpenClaw menambahkan
|
||||
path file ke prompt (penyuntikan path), yang cukup untuk CLI yang otomatis
|
||||
memuat file lokal dari path biasa.
|
||||
|
||||
## Input / output
|
||||
@ -195,15 +204,15 @@ memuat file lokal dari path biasa.
|
||||
- `output: "json"` (default) mencoba mengurai JSON dan mengekstrak teks + id sesi.
|
||||
- Untuk output JSON Gemini CLI, OpenClaw membaca teks balasan dari `response` dan
|
||||
penggunaan dari `stats` saat `usage` tidak ada atau kosong.
|
||||
- `output: "jsonl"` mengurai stream JSONL (misalnya Codex CLI `--json`) dan mengekstrak pesan agen akhir serta pengenal sesi
|
||||
saat tersedia.
|
||||
- `output: "jsonl"` mengurai stream JSONL (misalnya Codex CLI `--json`) dan mengekstrak pesan agen akhir serta
|
||||
pengenal sesi jika ada.
|
||||
- `output: "text"` memperlakukan stdout sebagai respons akhir.
|
||||
|
||||
Mode input:
|
||||
|
||||
- `input: "arg"` (default) meneruskan prompt sebagai argumen CLI terakhir.
|
||||
- `input: "arg"` (default) meneruskan prompt sebagai arg CLI terakhir.
|
||||
- `input: "stdin"` mengirim prompt melalui stdin.
|
||||
- Jika prompt sangat panjang dan `maxPromptArgChars` diatur, stdin digunakan.
|
||||
- Jika prompt sangat panjang dan `maxPromptArgChars` disetel, stdin digunakan.
|
||||
|
||||
## Default (dimiliki plugin)
|
||||
|
||||
@ -237,26 +246,26 @@ Catatan JSON Gemini CLI:
|
||||
|
||||
- Teks balasan dibaca dari field JSON `response`.
|
||||
- Penggunaan mengambil fallback ke `stats` saat `usage` tidak ada atau kosong.
|
||||
- `stats.cached` dinormalisasi menjadi OpenClaw `cacheRead`.
|
||||
- `stats.cached` dinormalisasi menjadi `cacheRead` OpenClaw.
|
||||
- Jika `stats.input` tidak ada, OpenClaw menurunkan token input dari
|
||||
`stats.input_tokens - stats.cached`.
|
||||
|
||||
Override hanya jika diperlukan (umumnya: path `command` absolut).
|
||||
|
||||
## Default milik plugin
|
||||
## Default yang dimiliki plugin
|
||||
|
||||
Default backend CLI sekarang merupakan bagian dari permukaan plugin:
|
||||
Default backend CLI kini menjadi bagian dari surface plugin:
|
||||
|
||||
- Plugin mendaftarkannya dengan `api.registerCliBackend(...)`.
|
||||
- `id` backend menjadi prefiks penyedia dalam model ref.
|
||||
- Konfigurasi pengguna di `agents.defaults.cliBackends.<id>` tetap meng-override default plugin.
|
||||
- `id` backend menjadi prefiks penyedia dalam referensi model.
|
||||
- Konfigurasi pengguna di `agents.defaults.cliBackends.<id>` tetap menimpa default plugin.
|
||||
- Pembersihan konfigurasi khusus backend tetap dimiliki plugin melalui hook
|
||||
`normalizeConfig` opsional.
|
||||
|
||||
## Overlay bundle MCP
|
||||
|
||||
Backend CLI **tidak** menerima panggilan alat OpenClaw secara langsung, tetapi backend dapat
|
||||
memilih untuk menggunakan overlay konfigurasi MCP yang dihasilkan dengan `bundleMcp: true`.
|
||||
memilih ikut serta dalam overlay konfigurasi MCP yang dihasilkan dengan `bundleMcp: true`.
|
||||
|
||||
Perilaku bawaan saat ini:
|
||||
|
||||
@ -266,32 +275,32 @@ Perilaku bawaan saat ini:
|
||||
|
||||
Saat bundle MCP diaktifkan, OpenClaw:
|
||||
|
||||
- memunculkan server MCP HTTP loopback yang mengekspos alat gateway ke proses CLI
|
||||
- memunculkan server HTTP MCP loopback yang mengekspos alat gateway ke proses CLI
|
||||
- mengautentikasi jembatan dengan token per sesi (`OPENCLAW_MCP_TOKEN`)
|
||||
- membatasi akses alat ke sesi, akun, dan konteks channel saat ini
|
||||
- memuat server bundle-MCP yang diaktifkan untuk workspace saat ini
|
||||
- menggabungkannya dengan bentuk konfigurasi/pengaturan MCP backend yang sudah ada
|
||||
- menulis ulang konfigurasi peluncuran menggunakan mode integrasi milik backend dari ekstensi pemilik
|
||||
- menulis ulang konfigurasi peluncuran menggunakan mode integrasi milik backend dari extension pemiliknya
|
||||
|
||||
Jika tidak ada server MCP yang diaktifkan, OpenClaw tetap menyuntikkan konfigurasi ketat saat sebuah
|
||||
backend memilih bundle MCP agar eksekusi latar belakang tetap terisolasi.
|
||||
Jika tidak ada server MCP yang diaktifkan, OpenClaw tetap menyuntikkan konfigurasi ketat saat
|
||||
backend memilih ikut serta dalam bundle MCP agar eksekusi latar belakang tetap terisolasi.
|
||||
|
||||
## Batasan
|
||||
## Keterbatasan
|
||||
|
||||
- **Tidak ada panggilan alat OpenClaw langsung.** OpenClaw tidak menyuntikkan panggilan alat ke dalam
|
||||
protokol backend CLI. Backend hanya melihat alat gateway saat mereka memilih
|
||||
- **Tidak ada panggilan alat OpenClaw langsung.** OpenClaw tidak menyuntikkan panggilan alat ke
|
||||
protokol backend CLI. Backend hanya melihat alat gateway saat mereka memilih ikut serta pada
|
||||
`bundleMcp: true`.
|
||||
- **Streaming bersifat khusus backend.** Beberapa backend melakukan stream JSONL; yang lain menahan output
|
||||
sampai proses selesai.
|
||||
- **Streaming bersifat khusus backend.** Beberapa backend melakukan streaming JSONL; yang lain menahan buffer
|
||||
hingga keluar.
|
||||
- **Output terstruktur** bergantung pada format JSON CLI.
|
||||
- **Sesi Codex CLI** melanjutkan melalui output teks (tanpa JSONL), yang kurang
|
||||
- **Sesi Codex CLI** dilanjutkan melalui output teks (tanpa JSONL), yang kurang
|
||||
terstruktur dibandingkan eksekusi awal `--json`. Sesi OpenClaw tetap berfungsi
|
||||
secara normal.
|
||||
normal.
|
||||
|
||||
## Pemecahan masalah
|
||||
|
||||
- **CLI tidak ditemukan**: atur `command` ke path lengkap.
|
||||
- **CLI tidak ditemukan**: setel `command` ke path lengkap.
|
||||
- **Nama model salah**: gunakan `modelAliases` untuk memetakan `provider/model` → model CLI.
|
||||
- **Tidak ada kontinuitas sesi**: pastikan `sessionArg` diatur dan `sessionMode` bukan
|
||||
- **Tidak ada kontinuitas sesi**: pastikan `sessionArg` disetel dan `sessionMode` bukan
|
||||
`none` (Codex CLI saat ini tidak dapat melanjutkan dengan output JSON).
|
||||
- **Gambar diabaikan**: atur `imageArg` (dan verifikasi bahwa CLI mendukung path file).
|
||||
- **Gambar diabaikan**: setel `imageArg` (dan pastikan CLI mendukung path file).
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,14 @@
|
||||
---
|
||||
read_when:
|
||||
- Menambahkan atau mengubah migrasi doctor
|
||||
- Memperkenalkan perubahan konfigurasi yang bersifat breaking
|
||||
- Memperkenalkan perubahan konfigurasi yang breaking
|
||||
summary: 'Perintah Doctor: pemeriksaan kesehatan, migrasi konfigurasi, dan langkah perbaikan'
|
||||
title: Doctor
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T02:15:14Z"
|
||||
generated_at: "2026-04-09T01:28:58Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 3761a222d9db7088f78215575fa84e5896794ad701aa716e8bf9039a4424dca6
|
||||
source_hash: 75d321bd1ad0e16c29f2382e249c51edfc3a8d33b55bdceea39e7dbcd4901fce
|
||||
source_path: gateway/doctor.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -16,7 +16,8 @@ x-i18n:
|
||||
# Doctor
|
||||
|
||||
`openclaw doctor` adalah alat perbaikan + migrasi untuk OpenClaw. Alat ini memperbaiki
|
||||
config/status yang usang, memeriksa kesehatan, dan memberikan langkah perbaikan yang dapat ditindaklanjuti.
|
||||
konfigurasi/status yang usang, memeriksa kesehatan, dan menyediakan langkah
|
||||
perbaikan yang dapat ditindaklanjuti.
|
||||
|
||||
## Mulai cepat
|
||||
|
||||
@ -36,20 +37,20 @@ Terima default tanpa prompt (termasuk langkah perbaikan restart/layanan/sandbox
|
||||
openclaw doctor --repair
|
||||
```
|
||||
|
||||
Terapkan perbaikan yang direkomendasikan tanpa prompt (perbaikan + restart jika aman).
|
||||
Terapkan perbaikan yang direkomendasikan tanpa prompt (perbaikan + restart bila aman).
|
||||
|
||||
```bash
|
||||
openclaw doctor --repair --force
|
||||
```
|
||||
|
||||
Terapkan juga perbaikan agresif (menimpa config supervisor kustom).
|
||||
Terapkan juga perbaikan agresif (menimpa konfigurasi supervisor kustom).
|
||||
|
||||
```bash
|
||||
openclaw doctor --non-interactive
|
||||
```
|
||||
|
||||
Jalankan tanpa prompt dan hanya terapkan migrasi yang aman (normalisasi config + pemindahan state di disk). Melewati tindakan restart/layanan/sandbox yang memerlukan konfirmasi manusia.
|
||||
Migrasi state lama berjalan otomatis saat terdeteksi.
|
||||
Jalankan tanpa prompt dan hanya terapkan migrasi yang aman (normalisasi konfigurasi + pemindahan status di disk). Melewati tindakan restart/layanan/sandbox yang memerlukan konfirmasi manusia.
|
||||
Migrasi status lama berjalan otomatis saat terdeteksi.
|
||||
|
||||
```bash
|
||||
openclaw doctor --deep
|
||||
@ -57,7 +58,7 @@ openclaw doctor --deep
|
||||
|
||||
Pindai layanan sistem untuk instalasi gateway tambahan (launchd/systemd/schtasks).
|
||||
|
||||
Jika Anda ingin meninjau perubahan sebelum menulis, buka dulu file config:
|
||||
Jika Anda ingin meninjau perubahan sebelum menulis, buka file konfigurasi terlebih dahulu:
|
||||
|
||||
```bash
|
||||
cat ~/.openclaw/openclaw.json
|
||||
@ -65,73 +66,107 @@ cat ~/.openclaw/openclaw.json
|
||||
|
||||
## Apa yang dilakukan (ringkasan)
|
||||
|
||||
- Pembaruan pra-penerbangan opsional untuk instalasi git (hanya interaktif).
|
||||
- Pemeriksaan kebaruan protokol UI (membangun ulang Control UI ketika skema protokol lebih baru).
|
||||
- Pembaruan pre-flight opsional untuk instalasi git (hanya interaktif).
|
||||
- Pemeriksaan kesegaran protokol UI (membangun ulang Control UI bila skema protokol lebih baru).
|
||||
- Pemeriksaan kesehatan + prompt restart.
|
||||
- Ringkasan status Skills (eligible/missing/blocked) dan status plugin.
|
||||
- Normalisasi config untuk nilai lama.
|
||||
- Migrasi config Talk dari field datar lama `talk.*` ke `talk.provider` + `talk.providers.<provider>`.
|
||||
- Pemeriksaan migrasi browser untuk config ekstensi Chrome lama dan kesiapan Chrome MCP.
|
||||
- Normalisasi konfigurasi untuk nilai lama.
|
||||
- Migrasi konfigurasi Talk dari field datar lama `talk.*` ke `talk.provider` + `talk.providers.<provider>`.
|
||||
- Pemeriksaan migrasi browser untuk konfigurasi ekstensi Chrome lama dan kesiapan Chrome MCP.
|
||||
- Peringatan override provider OpenCode (`models.providers.opencode` / `models.providers.opencode-go`).
|
||||
- Peringatan shadowing OAuth Codex (`models.providers.openai-codex`).
|
||||
- Pemeriksaan prasyarat TLS OAuth untuk profil OAuth OpenAI Codex.
|
||||
- Migrasi state lama di disk (sessions/agent dir/auth WhatsApp).
|
||||
- Migrasi key kontrak manifest plugin lama (`speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`, `webSearchProviders` → `contracts`).
|
||||
- Migrasi penyimpanan cron lama (`jobId`, `schedule.cron`, field delivery/payload tingkat atas, payload `provider`, job fallback webhook sederhana `notify: true`).
|
||||
- Peringatan shadowing Codex OAuth (`models.providers.openai-codex`).
|
||||
- Pemeriksaan prasyarat OAuth TLS untuk profil OpenAI Codex OAuth.
|
||||
- Migrasi status lama di disk (sesi/dir agen/auth WhatsApp).
|
||||
- Migrasi kunci kontrak manifest plugin lama (`speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`, `webSearchProviders` → `contracts`).
|
||||
- Migrasi penyimpanan cron lama (`jobId`, `schedule.cron`, field delivery/payload tingkat atas, payload `provider`, pekerjaan fallback webhook `notify: true` sederhana).
|
||||
- Inspeksi file lock sesi dan pembersihan lock usang.
|
||||
- Pemeriksaan integritas state dan izin akses (sessions, transcript, state dir).
|
||||
- Pemeriksaan izin file config (chmod 600) saat berjalan secara lokal.
|
||||
- Pemeriksaan integritas dan izin status (sessions, transcripts, state dir).
|
||||
- Pemeriksaan izin file konfigurasi (chmod 600) saat berjalan secara lokal.
|
||||
- Kesehatan auth model: memeriksa kedaluwarsa OAuth, dapat me-refresh token yang akan kedaluwarsa, dan melaporkan status cooldown/nonaktif profil auth.
|
||||
- Deteksi direktori workspace tambahan (`~/openclaw`).
|
||||
- Deteksi dir workspace tambahan (`~/openclaw`).
|
||||
- Perbaikan image sandbox saat sandboxing diaktifkan.
|
||||
- Migrasi layanan lama dan deteksi gateway tambahan.
|
||||
- Migrasi state lama channel Matrix (dalam mode `--fix` / `--repair`).
|
||||
- Pemeriksaan runtime gateway (layanan terinstal tetapi tidak berjalan; label launchd yang di-cache).
|
||||
- Peringatan status channel (diprobe dari gateway yang sedang berjalan).
|
||||
- Audit config supervisor (launchd/systemd/schtasks) dengan perbaikan opsional.
|
||||
- Pemeriksaan praktik terbaik runtime gateway (Node vs Bun, path version manager).
|
||||
- Migrasi status lama kanal Matrix (dalam mode `--fix` / `--repair`).
|
||||
- Pemeriksaan runtime gateway (layanan terpasang tetapi tidak berjalan; label launchd yang di-cache).
|
||||
- Peringatan status kanal (diprobe dari gateway yang berjalan).
|
||||
- Audit konfigurasi supervisor (launchd/systemd/schtasks) dengan perbaikan opsional.
|
||||
- Pemeriksaan best practice runtime gateway (Node vs Bun, path version manager).
|
||||
- Diagnostik benturan port gateway (default `18789`).
|
||||
- Peringatan keamanan untuk kebijakan DM yang terbuka.
|
||||
- Pemeriksaan auth gateway untuk mode token lokal (menawarkan pembuatan token saat tidak ada sumber token; tidak menimpa config token SecretRef).
|
||||
- Pemeriksaan `linger` systemd di Linux.
|
||||
- Peringatan keamanan untuk kebijakan DM terbuka.
|
||||
- Pemeriksaan auth gateway untuk mode token lokal (menawarkan pembuatan token saat tidak ada sumber token; tidak menimpa konfigurasi token SecretRef).
|
||||
- Pemeriksaan linger systemd di Linux.
|
||||
- Pemeriksaan ukuran file bootstrap workspace (peringatan pemotongan/hampir batas untuk file konteks).
|
||||
- Pemeriksaan status shell completion dan auto-install/upgrade.
|
||||
- Pemeriksaan kesiapan provider embedding memory search (model lokal, API key jarak jauh, atau biner QMD).
|
||||
- Pemeriksaan kesiapan provider embedding memory search (model lokal, kunci API jarak jauh, atau biner QMD).
|
||||
- Pemeriksaan instalasi sumber (ketidakcocokan workspace pnpm, aset UI hilang, biner tsx hilang).
|
||||
- Menulis config yang diperbarui + metadata wizard.
|
||||
- Menulis konfigurasi yang diperbarui + metadata wizard.
|
||||
|
||||
## Perilaku rinci dan alasannya
|
||||
## Backfill dan reset UI Dreams
|
||||
|
||||
Scene Dreams di Control UI mencakup tindakan **Backfill**, **Reset**, dan **Clear Grounded**
|
||||
untuk alur grounded dreaming. Tindakan ini menggunakan metode RPC
|
||||
bergaya gateway doctor, tetapi **bukan** bagian dari perbaikan/migrasi CLI
|
||||
`openclaw doctor`.
|
||||
|
||||
Yang dilakukan:
|
||||
|
||||
- **Backfill** memindai file `memory/YYYY-MM-DD.md` historis di
|
||||
workspace aktif, menjalankan pass diary REM grounded, dan menulis entri
|
||||
backfill yang dapat dibalik ke `DREAMS.md`.
|
||||
- **Reset** hanya menghapus entri diary backfill bertanda tersebut dari `DREAMS.md`.
|
||||
- **Clear Grounded** hanya menghapus entri jangka pendek staged khusus grounded yang
|
||||
berasal dari replay historis dan belum mengakumulasi recall live atau dukungan
|
||||
harian.
|
||||
|
||||
Yang **tidak** dilakukan dengan sendirinya:
|
||||
|
||||
- tindakan tersebut tidak mengedit `MEMORY.md`
|
||||
- tindakan tersebut tidak menjalankan migrasi doctor penuh
|
||||
- tindakan tersebut tidak otomatis men-stage kandidat grounded ke dalam penyimpanan
|
||||
promosi jangka pendek live kecuali Anda secara eksplisit menjalankan path CLI staged terlebih dahulu
|
||||
|
||||
Jika Anda ingin replay historis grounded memengaruhi lane deep promotion
|
||||
normal, gunakan alur CLI berikut:
|
||||
|
||||
```bash
|
||||
openclaw memory rem-backfill --path ./memory --stage-short-term
|
||||
```
|
||||
|
||||
Perintah itu men-stage kandidat durable grounded ke penyimpanan dreaming jangka pendek sambil
|
||||
tetap menjadikan `DREAMS.md` sebagai permukaan peninjauan.
|
||||
|
||||
## Perilaku dan alasan terperinci
|
||||
|
||||
### 0) Pembaruan opsional (instalasi git)
|
||||
|
||||
Jika ini adalah checkout git dan doctor berjalan secara interaktif, doctor akan menawarkan
|
||||
untuk memperbarui (fetch/rebase/build) sebelum menjalankan doctor.
|
||||
Jika ini adalah checkout git dan doctor berjalan secara interaktif, doctor menawarkan untuk
|
||||
memperbarui (fetch/rebase/build) sebelum menjalankan doctor.
|
||||
|
||||
### 1) Normalisasi config
|
||||
### 1) Normalisasi konfigurasi
|
||||
|
||||
Jika config berisi bentuk nilai lama (misalnya `messages.ackReaction`
|
||||
tanpa override spesifik channel), doctor menormalkannya ke skema
|
||||
Jika konfigurasi berisi bentuk nilai lama (misalnya `messages.ackReaction`
|
||||
tanpa override spesifik kanal), doctor menormalisasikannya ke dalam skema
|
||||
saat ini.
|
||||
|
||||
Itu termasuk field datar Talk lama. Config Talk publik saat ini adalah
|
||||
Itu termasuk field datar Talk lama. Konfigurasi Talk publik saat ini adalah
|
||||
`talk.provider` + `talk.providers.<provider>`. Doctor menulis ulang bentuk lama
|
||||
`talk.voiceId` / `talk.voiceAliases` / `talk.modelId` / `talk.outputFormat` /
|
||||
`talk.apiKey` ke dalam peta provider.
|
||||
|
||||
### 2) Migrasi key config lama
|
||||
### 2) Migrasi kunci konfigurasi lama
|
||||
|
||||
Saat config berisi key yang sudah tidak digunakan lagi, perintah lain akan menolak berjalan dan meminta
|
||||
Anda untuk menjalankan `openclaw doctor`.
|
||||
Saat konfigurasi berisi kunci yang sudah deprecated, perintah lain menolak berjalan dan meminta
|
||||
Anda menjalankan `openclaw doctor`.
|
||||
|
||||
Doctor akan:
|
||||
|
||||
- Menjelaskan key lama mana yang ditemukan.
|
||||
- Menjelaskan kunci lama mana yang ditemukan.
|
||||
- Menampilkan migrasi yang diterapkannya.
|
||||
- Menulis ulang `~/.openclaw/openclaw.json` dengan skema yang diperbarui.
|
||||
|
||||
Gateway juga otomatis menjalankan migrasi doctor saat startup ketika mendeteksi
|
||||
format config lama, sehingga config usang diperbaiki tanpa intervensi manual.
|
||||
Migrasi penyimpanan job cron ditangani oleh `openclaw doctor --fix`.
|
||||
format konfigurasi lama, sehingga konfigurasi usang diperbaiki tanpa intervensi manual.
|
||||
Migrasi penyimpanan pekerjaan cron ditangani oleh `openclaw doctor --fix`.
|
||||
|
||||
Migrasi saat ini:
|
||||
|
||||
@ -155,7 +190,7 @@ Migrasi saat ini:
|
||||
- `plugins.entries.voice-call.config.streaming.openaiApiKey|sttModel|silenceDurationMs|vadThreshold`
|
||||
→ `plugins.entries.voice-call.config.streaming.providers.openai.*`
|
||||
- `bindings[].match.accountID` → `bindings[].match.accountId`
|
||||
- Untuk channel dengan `accounts` bernama tetapi masih memiliki nilai channel tingkat atas single-account, pindahkan nilai dengan cakupan akun tersebut ke akun yang dipromosikan yang dipilih untuk channel itu (`accounts.default` untuk sebagian besar channel; Matrix dapat mempertahankan target bernama/default yang cocok yang sudah ada)
|
||||
- Untuk kanal dengan `accounts` bernama tetapi masih memiliki nilai kanal tingkat atas akun tunggal, pindahkan nilai yang dicakup akun tersebut ke akun yang dipromosikan dan dipilih untuk kanal itu (`accounts.default` untuk sebagian besar kanal; Matrix dapat mempertahankan target bernama/default yang sudah cocok)
|
||||
- `identity` → `agents.list[].identity`
|
||||
- `agent.*` → `agents.defaults` + `tools.*` (tools/elevated/exec/sandbox/subagents)
|
||||
- `agent.model`/`allowedModels`/`modelAliases`/`modelFallbacks`/`imageModelFallbacks`
|
||||
@ -164,108 +199,108 @@ Migrasi saat ini:
|
||||
- `browser.profiles.*.driver: "extension"` → `"existing-session"`
|
||||
- hapus `browser.relayBindHost` (pengaturan relay ekstensi lama)
|
||||
|
||||
Peringatan doctor juga mencakup panduan default akun untuk channel multi-akun:
|
||||
Peringatan doctor juga mencakup panduan account-default untuk kanal multi-akun:
|
||||
|
||||
- Jika dua atau lebih entri `channels.<channel>.accounts` dikonfigurasi tanpa `channels.<channel>.defaultAccount` atau `accounts.default`, doctor memperingatkan bahwa routing fallback dapat memilih akun yang tidak diharapkan.
|
||||
- Jika `channels.<channel>.defaultAccount` disetel ke ID akun yang tidak dikenal, doctor memperingatkan dan mencantumkan ID akun yang dikonfigurasi.
|
||||
- Jika dua atau lebih entri `channels.<channel>.accounts` dikonfigurasi tanpa `channels.<channel>.defaultAccount` atau `accounts.default`, doctor memperingatkan bahwa fallback routing dapat memilih akun yang tidak terduga.
|
||||
- Jika `channels.<channel>.defaultAccount` diatur ke ID akun yang tidak dikenal, doctor memperingatkan dan mencantumkan ID akun yang dikonfigurasi.
|
||||
|
||||
### 2b) Override provider OpenCode
|
||||
|
||||
Jika Anda menambahkan `models.providers.opencode`, `opencode-zen`, atau `opencode-go`
|
||||
secara manual, itu akan menimpa katalog OpenCode bawaan dari `@mariozechner/pi-ai`.
|
||||
Hal itu dapat memaksa model ke API yang salah atau membuat biaya menjadi nol. Doctor memperingatkan agar Anda
|
||||
dapat menghapus override tersebut dan memulihkan routing API + biaya per model.
|
||||
Hal itu dapat memaksa model ke API yang salah atau men-nol-kan biaya. Doctor memperingatkan agar Anda
|
||||
dapat menghapus override dan memulihkan perutean API + biaya per model.
|
||||
|
||||
### 2c) Migrasi browser dan kesiapan Chrome MCP
|
||||
|
||||
Jika config browser Anda masih menunjuk ke jalur ekstensi Chrome yang sudah dihapus, doctor
|
||||
menormalkannya ke model attach Chrome MCP lokal-host saat ini:
|
||||
Jika konfigurasi browser Anda masih menunjuk ke path ekstensi Chrome yang sudah dihapus, doctor
|
||||
menormalisasikannya ke model attach Chrome MCP host-lokal saat ini:
|
||||
|
||||
- `browser.profiles.*.driver: "extension"` menjadi `"existing-session"`
|
||||
- `browser.relayBindHost` dihapus
|
||||
|
||||
Doctor juga mengaudit jalur Chrome MCP lokal-host saat Anda menggunakan `defaultProfile:
|
||||
Doctor juga mengaudit path Chrome MCP host-lokal saat Anda menggunakan `defaultProfile:
|
||||
"user"` atau profil `existing-session` yang dikonfigurasi:
|
||||
|
||||
- memeriksa apakah Google Chrome terinstal pada host yang sama untuk profil
|
||||
auto-connect default
|
||||
- memeriksa versi Chrome yang terdeteksi dan memperingatkan jika di bawah Chrome 144
|
||||
- memeriksa versi Chrome yang terdeteksi dan memperingatkan bila di bawah Chrome 144
|
||||
- mengingatkan Anda untuk mengaktifkan remote debugging di halaman inspect browser (misalnya
|
||||
`chrome://inspect/#remote-debugging`, `brave://inspect/#remote-debugging`,
|
||||
atau `edge://inspect/#remote-debugging`)
|
||||
|
||||
Doctor tidak dapat mengaktifkan pengaturan sisi Chrome untuk Anda. Chrome MCP lokal-host
|
||||
Doctor tidak dapat mengaktifkan pengaturan sisi Chrome untuk Anda. Chrome MCP host-lokal
|
||||
tetap memerlukan:
|
||||
|
||||
- browser berbasis Chromium 144+ pada host gateway/node
|
||||
- browser berjalan secara lokal
|
||||
- remote debugging diaktifkan pada browser tersebut
|
||||
- remote debugging diaktifkan di browser tersebut
|
||||
- menyetujui prompt persetujuan attach pertama di browser
|
||||
|
||||
Kesiapan di sini hanya tentang prasyarat attach lokal. Existing-session mempertahankan
|
||||
batas rute Chrome MCP saat ini; rute lanjutan seperti `responsebody`, ekspor PDF,
|
||||
intersepsi unduhan, dan tindakan batch tetap memerlukan browser terkelola
|
||||
batas route Chrome MCP saat ini; route lanjutan seperti `responsebody`, ekspor PDF,
|
||||
intersepsi unduhan, dan tindakan batch tetap memerlukan browser yang dikelola
|
||||
atau profil CDP mentah.
|
||||
|
||||
Pemeriksaan ini **tidak** berlaku untuk Docker, sandbox, remote-browser, atau alur
|
||||
headless lainnya. Alur tersebut tetap menggunakan CDP mentah.
|
||||
headless lainnya. Semua itu tetap menggunakan CDP mentah.
|
||||
|
||||
### 2d) Prasyarat TLS OAuth
|
||||
### 2d) Prasyarat OAuth TLS
|
||||
|
||||
Saat profil OAuth OpenAI Codex dikonfigurasi, doctor mem-probe endpoint otorisasi OpenAI
|
||||
untuk memverifikasi bahwa stack TLS Node/OpenSSL lokal dapat
|
||||
Saat profil OpenAI Codex OAuth dikonfigurasi, doctor mem-probe endpoint
|
||||
otorisasi OpenAI untuk memverifikasi bahwa stack TLS Node/OpenSSL lokal dapat
|
||||
memvalidasi rantai sertifikat. Jika probe gagal dengan kesalahan sertifikat (misalnya
|
||||
`UNABLE_TO_GET_ISSUER_CERT_LOCALLY`, sertifikat kedaluwarsa, atau sertifikat self-signed),
|
||||
`UNABLE_TO_GET_ISSUER_CERT_LOCALLY`, sertifikat kedaluwarsa, atau self-signed cert),
|
||||
doctor mencetak panduan perbaikan spesifik platform. Di macOS dengan Homebrew Node,
|
||||
perbaikannya biasanya `brew postinstall ca-certificates`. Dengan `--deep`, probe dijalankan
|
||||
perbaikannya biasanya `brew postinstall ca-certificates`. Dengan `--deep`, probe berjalan
|
||||
bahkan jika gateway sehat.
|
||||
|
||||
### 2c) Override provider OAuth Codex
|
||||
### 2c) Override provider Codex OAuth
|
||||
|
||||
Jika sebelumnya Anda menambahkan pengaturan transport OpenAI lama di bawah
|
||||
`models.providers.openai-codex`, pengaturan tersebut dapat membayangi jalur
|
||||
provider OAuth Codex bawaan yang digunakan rilis lebih baru secara otomatis. Doctor memperingatkan saat melihat
|
||||
pengaturan transport lama tersebut bersamaan dengan OAuth Codex agar Anda dapat menghapus atau menulis ulang
|
||||
`models.providers.openai-codex`, pengaturan itu dapat membayangi path provider Codex OAuth
|
||||
bawaan yang digunakan otomatis oleh rilis yang lebih baru. Doctor memperingatkan saat melihat
|
||||
pengaturan transport lama tersebut bersama Codex OAuth agar Anda dapat menghapus atau menulis ulang
|
||||
override transport usang dan mendapatkan kembali perilaku routing/fallback bawaan.
|
||||
Proxy kustom dan override header-only tetap didukung dan tidak
|
||||
Proxy kustom dan override hanya-header tetap didukung dan tidak
|
||||
memicu peringatan ini.
|
||||
|
||||
### 3) Migrasi state lama (tata letak disk)
|
||||
### 3) Migrasi status lama (layout disk)
|
||||
|
||||
Doctor dapat memigrasikan tata letak lama di disk ke struktur saat ini:
|
||||
Doctor dapat memigrasikan layout lama di disk ke struktur saat ini:
|
||||
|
||||
- Penyimpanan sesi + transcript:
|
||||
- Penyimpanan sesi + transkrip:
|
||||
- dari `~/.openclaw/sessions/` ke `~/.openclaw/agents/<agentId>/sessions/`
|
||||
- Direktori agent:
|
||||
- Dir agen:
|
||||
- dari `~/.openclaw/agent/` ke `~/.openclaw/agents/<agentId>/agent/`
|
||||
- State auth WhatsApp (Baileys):
|
||||
- Status auth WhatsApp (Baileys):
|
||||
- dari `~/.openclaw/credentials/*.json` lama (kecuali `oauth.json`)
|
||||
- ke `~/.openclaw/credentials/whatsapp/<accountId>/...` (ID akun default: `default`)
|
||||
|
||||
Migrasi ini bersifat best-effort dan idempoten; doctor akan mengeluarkan peringatan saat
|
||||
masih menyisakan folder lama sebagai cadangan. Gateway/CLI juga memigrasikan otomatis
|
||||
sesi lama + direktori agent saat startup sehingga riwayat/auth/model berada di
|
||||
jalur per-agent tanpa perlu menjalankan doctor secara manual. Auth WhatsApp sengaja hanya
|
||||
dimigrasikan melalui `openclaw doctor`. Normalisasi Talk provider/peta provider kini
|
||||
membandingkan dengan kesetaraan struktural, sehingga perbedaan urutan key saja tidak lagi memicu
|
||||
perubahan no-op `doctor --fix` yang berulang.
|
||||
meninggalkan folder lama sebagai cadangan. Gateway/CLI juga memigrasikan otomatis
|
||||
sesi lama + dir agen saat startup sehingga riwayat/auth/model berada di
|
||||
path per-agen tanpa perlu menjalankan doctor secara manual. Auth WhatsApp sengaja hanya
|
||||
dimigrasikan melalui `openclaw doctor`. Normalisasi provider/peta provider Talk kini
|
||||
membandingkan berdasarkan kesetaraan struktural, sehingga perbedaan urutan kunci saja tidak lagi
|
||||
memicu perubahan no-op `doctor --fix` yang berulang.
|
||||
|
||||
### 3a) Migrasi manifest plugin lama
|
||||
|
||||
Doctor memindai semua manifest plugin yang terinstal untuk key kapabilitas tingkat atas yang sudah usang
|
||||
(`speechProviders`, `realtimeTranscriptionProviders`,
|
||||
Doctor memindai semua manifest plugin yang terinstal untuk kunci kapabilitas tingkat atas
|
||||
yang sudah deprecated (`speechProviders`, `realtimeTranscriptionProviders`,
|
||||
`realtimeVoiceProviders`, `mediaUnderstandingProviders`,
|
||||
`imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`,
|
||||
`webSearchProviders`). Saat ditemukan, doctor menawarkan untuk memindahkannya ke objek `contracts`
|
||||
dan menulis ulang file manifest secara langsung. Migrasi ini idempoten;
|
||||
jika key `contracts` sudah memiliki nilai yang sama, key lama akan dihapus
|
||||
dan menulis ulang file manifest di tempat. Migrasi ini idempoten;
|
||||
jika kunci `contracts` sudah memiliki nilai yang sama, kunci lama dihapus
|
||||
tanpa menduplikasi data.
|
||||
|
||||
### 3b) Migrasi penyimpanan cron lama
|
||||
|
||||
Doctor juga memeriksa penyimpanan job cron (`~/.openclaw/cron/jobs.json` secara default,
|
||||
atau `cron.store` bila dioverride) untuk bentuk job lama yang masih
|
||||
diterima scheduler demi kompatibilitas.
|
||||
Doctor juga memeriksa penyimpanan pekerjaan cron (`~/.openclaw/cron/jobs.json` secara default,
|
||||
atau `cron.store` jika di-override) untuk bentuk pekerjaan lama yang masih diterima
|
||||
scheduler demi kompatibilitas.
|
||||
|
||||
Pembersihan cron saat ini mencakup:
|
||||
|
||||
@ -273,76 +308,82 @@ Pembersihan cron saat ini mencakup:
|
||||
- `schedule.cron` → `schedule.expr`
|
||||
- field payload tingkat atas (`message`, `model`, `thinking`, ...) → `payload`
|
||||
- field delivery tingkat atas (`deliver`, `channel`, `to`, `provider`, ...) → `delivery`
|
||||
- alias delivery `provider` payload → `delivery.channel` yang eksplisit
|
||||
- job fallback webhook lama sederhana `notify: true` → `delivery.mode="webhook"` yang eksplisit dengan `delivery.to=cron.webhook`
|
||||
- alias delivery `provider` pada payload → `delivery.channel` eksplisit
|
||||
- pekerjaan fallback webhook lama `notify: true` sederhana → `delivery.mode="webhook"` eksplisit dengan `delivery.to=cron.webhook`
|
||||
|
||||
Doctor hanya memigrasikan otomatis job `notify: true` bila dapat dilakukan tanpa
|
||||
mengubah perilaku. Jika sebuah job menggabungkan fallback notify lama dengan mode
|
||||
delivery non-webhook yang sudah ada, doctor akan memperingatkan dan membiarkan job itu untuk ditinjau manual.
|
||||
Doctor hanya otomatis memigrasikan pekerjaan `notify: true` bila hal itu dapat dilakukan tanpa
|
||||
mengubah perilaku. Jika suatu pekerjaan menggabungkan fallback notify lama dengan mode
|
||||
delivery non-webhook yang sudah ada, doctor memperingatkan dan membiarkan pekerjaan tersebut untuk ditinjau manual.
|
||||
|
||||
### 3c) Pembersihan lock sesi
|
||||
|
||||
Doctor memindai setiap direktori sesi agent untuk file write-lock usang — file yang tertinggal
|
||||
ketika sebuah sesi berakhir secara abnormal. Untuk setiap file lock yang ditemukan, doctor melaporkan:
|
||||
path, PID, apakah PID masih hidup, usia lock, dan apakah
|
||||
dianggap usang (PID mati atau lebih lama dari 30 menit). Dalam mode `--fix` / `--repair`
|
||||
Doctor memindai setiap direktori sesi agen untuk file write-lock usang — file yang tertinggal
|
||||
saat suatu sesi keluar secara abnormal. Untuk setiap file lock yang ditemukan, doctor melaporkan:
|
||||
path, PID, apakah PID masih hidup, usia lock, dan apakah lock tersebut
|
||||
dianggap usang (PID mati atau lebih tua dari 30 menit). Dalam mode `--fix` / `--repair`
|
||||
doctor menghapus file lock usang secara otomatis; jika tidak, doctor mencetak catatan dan
|
||||
menginstruksikan Anda untuk menjalankan ulang dengan `--fix`.
|
||||
|
||||
### 4) Pemeriksaan integritas state (persistensi sesi, routing, dan keamanan)
|
||||
### 4) Pemeriksaan integritas status (persistensi sesi, routing, dan keamanan)
|
||||
|
||||
Direktori state adalah pusat operasional. Jika hilang, Anda akan kehilangan
|
||||
sesi, kredensial, log, dan config (kecuali jika Anda memiliki cadangan di tempat lain).
|
||||
Direktori status adalah batang otak operasional. Jika direktori ini hilang, Anda akan kehilangan
|
||||
sesi, kredensial, log, dan konfigurasi (kecuali Anda memiliki cadangan di tempat lain).
|
||||
|
||||
Doctor memeriksa:
|
||||
|
||||
- **Direktori state hilang**: memperingatkan tentang kehilangan state yang katastrofik, meminta untuk membuat ulang
|
||||
- **State dir hilang**: memperingatkan kehilangan status yang katastrofik, meminta untuk membuat ulang
|
||||
direktori, dan mengingatkan bahwa doctor tidak dapat memulihkan data yang hilang.
|
||||
- **Izin direktori state**: memverifikasi dapat ditulisi; menawarkan untuk memperbaiki izin
|
||||
- **Izin state dir**: memverifikasi dapat ditulis; menawarkan untuk memperbaiki izin
|
||||
(dan mengeluarkan petunjuk `chown` saat terdeteksi ketidakcocokan owner/group).
|
||||
- **Direktori state tersinkron cloud macOS**: memperingatkan saat state berada di bawah iCloud Drive
|
||||
- **State dir tersinkron cloud di macOS**: memperingatkan saat status ter-resolve di bawah iCloud Drive
|
||||
(`~/Library/Mobile Documents/com~apple~CloudDocs/...`) atau
|
||||
`~/Library/CloudStorage/...` karena path berbasis sinkronisasi dapat menyebabkan I/O lebih lambat
|
||||
`~/Library/CloudStorage/...` karena path yang didukung sinkronisasi dapat menyebabkan I/O lebih lambat
|
||||
dan race lock/sinkronisasi.
|
||||
- **Direktori state pada SD atau eMMC Linux**: memperingatkan saat state berada pada sumber mount `mmcblk*`,
|
||||
karena random I/O berbasis SD atau eMMC bisa lebih lambat dan lebih cepat aus
|
||||
akibat penulisan sesi dan kredensial.
|
||||
- **Direktori sesi hilang**: `sessions/` dan direktori penyimpanan sesi diperlukan
|
||||
untuk mempertahankan riwayat dan menghindari crash `ENOENT`.
|
||||
- **Ketidakcocokan transcript**: memperingatkan saat entri sesi terbaru memiliki
|
||||
file transcript yang hilang.
|
||||
- **Sesi utama “1-line JSONL”**: menandai saat transcript utama hanya memiliki satu
|
||||
baris (riwayat tidak bertambah).
|
||||
- **Beberapa direktori state**: memperingatkan saat ada beberapa folder `~/.openclaw` di
|
||||
berbagai home directory atau saat `OPENCLAW_STATE_DIR` menunjuk ke tempat lain (riwayat dapat terbelah antar instalasi).
|
||||
- **State dir Linux di SD atau eMMC**: memperingatkan saat status ter-resolve ke sumber mount `mmcblk*`,
|
||||
karena random I/O yang didukung SD atau eMMC bisa lebih lambat dan lebih cepat aus
|
||||
di bawah penulisan sesi dan kredensial.
|
||||
- **Dir sesi hilang**: `sessions/` dan direktori penyimpanan sesi
|
||||
diperlukan untuk mempertahankan riwayat dan menghindari crash `ENOENT`.
|
||||
- **Ketidakcocokan transkrip**: memperingatkan saat entri sesi terbaru memiliki file
|
||||
transkrip yang hilang.
|
||||
- **Sesi utama “1-line JSONL”**: menandai saat transkrip utama hanya memiliki satu
|
||||
baris (riwayat tidak terakumulasi).
|
||||
- **Beberapa state dir**: memperingatkan saat beberapa folder `~/.openclaw` ada di berbagai
|
||||
direktori home atau saat `OPENCLAW_STATE_DIR` menunjuk ke tempat lain (riwayat dapat
|
||||
terpecah antar instalasi).
|
||||
- **Pengingat mode remote**: jika `gateway.mode=remote`, doctor mengingatkan Anda untuk menjalankannya
|
||||
di host remote (state berada di sana).
|
||||
- **Izin file config**: memperingatkan jika `~/.openclaw/openclaw.json` dapat dibaca
|
||||
oleh group/world dan menawarkan untuk mengetatkannya ke `600`.
|
||||
di host remote (status berada di sana).
|
||||
- **Izin file konfigurasi**: memperingatkan jika `~/.openclaw/openclaw.json` dapat
|
||||
dibaca group/world dan menawarkan untuk memperketat ke `600`.
|
||||
|
||||
### 5) Kesehatan auth model (kedaluwarsa OAuth)
|
||||
|
||||
Doctor memeriksa profil OAuth dalam penyimpanan auth, memperingatkan saat token
|
||||
akan kedaluwarsa/sudah kedaluwarsa, dan dapat me-refresh-nya bila aman. Jika profil
|
||||
OAuth/token Anthropic usang, doctor menyarankan Anthropic API key atau
|
||||
jalur setup-token Anthropic.
|
||||
Doctor memeriksa profil OAuth di penyimpanan auth, memperingatkan saat token akan
|
||||
kedaluwarsa/sudah kedaluwarsa, dan dapat me-refresh token saat aman. Jika profil
|
||||
OAuth/token Anthropic usang, doctor menyarankan Anthropic API key atau path
|
||||
setup-token Anthropic.
|
||||
Prompt refresh hanya muncul saat berjalan secara interaktif (TTY); `--non-interactive`
|
||||
melewati upaya refresh.
|
||||
|
||||
Saat refresh OAuth gagal permanen (misalnya `refresh_token_reused`,
|
||||
`invalid_grant`, atau provider memberi tahu Anda untuk sign in lagi), doctor melaporkan
|
||||
bahwa re-auth diperlukan dan mencetak perintah `openclaw models auth login --provider ...`
|
||||
yang tepat untuk dijalankan.
|
||||
|
||||
Doctor juga melaporkan profil auth yang sementara tidak dapat digunakan karena:
|
||||
|
||||
- cooldown singkat (rate limit/timeout/kegagalan auth)
|
||||
- penonaktifan yang lebih lama (kegagalan billing/kredit)
|
||||
- penonaktifan lebih lama (kegagalan billing/kredit)
|
||||
|
||||
### 6) Validasi model hooks
|
||||
|
||||
Jika `hooks.gmail.model` disetel, doctor memvalidasi referensi model terhadap
|
||||
katalog dan allowlist serta memperingatkan bila model tidak akan ter-resolve atau tidak diizinkan.
|
||||
Jika `hooks.gmail.model` diatur, doctor memvalidasi referensi model terhadap
|
||||
katalog dan allowlist serta memperingatkan saat referensi itu tidak akan ter-resolve atau tidak diizinkan.
|
||||
|
||||
### 7) Perbaikan image sandbox
|
||||
|
||||
Saat sandboxing diaktifkan, doctor memeriksa image Docker dan menawarkan untuk membangun atau
|
||||
beralih ke nama lama jika image saat ini tidak ada.
|
||||
beralih ke nama lama jika image saat ini hilang.
|
||||
|
||||
### 7b) Dependensi runtime plugin bawaan
|
||||
|
||||
@ -354,51 +395,52 @@ mode `openclaw doctor --fix` / `openclaw doctor --repair`.
|
||||
### 8) Migrasi layanan gateway dan petunjuk pembersihan
|
||||
|
||||
Doctor mendeteksi layanan gateway lama (launchd/systemd/schtasks) dan
|
||||
menawarkan untuk menghapusnya serta menginstal layanan OpenClaw menggunakan port gateway
|
||||
saat ini. Doctor juga dapat memindai layanan tambahan yang mirip gateway dan mencetak petunjuk pembersihan.
|
||||
Layanan gateway OpenClaw bernama profil dianggap kelas satu dan tidak
|
||||
ditandai sebagai "tambahan."
|
||||
menawarkan untuk menghapusnya serta memasang layanan OpenClaw menggunakan port gateway
|
||||
saat ini. Doctor juga dapat memindai layanan mirip gateway tambahan dan mencetak petunjuk pembersihan.
|
||||
Layanan gateway OpenClaw bernama profil dianggap first-class dan tidak
|
||||
ditandai sebagai "tambahan".
|
||||
|
||||
### 8b) Migrasi Matrix saat startup
|
||||
### 8b) Migrasi startup Matrix
|
||||
|
||||
Saat akun channel Matrix memiliki migrasi state lama yang tertunda atau dapat ditindaklanjuti,
|
||||
Saat akun kanal Matrix memiliki migrasi status lama yang tertunda atau dapat ditindaklanjuti,
|
||||
doctor (dalam mode `--fix` / `--repair`) membuat snapshot pra-migrasi lalu
|
||||
menjalankan langkah migrasi best-effort: migrasi state Matrix lama dan persiapan state terenkripsi lama.
|
||||
Kedua langkah bersifat non-fatal; error dicatat dan startup berlanjut. Dalam mode read-only (`openclaw doctor` tanpa `--fix`) pemeriksaan
|
||||
ini dilewati sepenuhnya.
|
||||
menjalankan langkah migrasi best-effort: migrasi status Matrix lama dan persiapan
|
||||
status terenkripsi lama. Kedua langkah bersifat non-fatal; kesalahan dicatat dan
|
||||
startup berlanjut. Dalam mode baca-saja (`openclaw doctor` tanpa `--fix`) pemeriksaan ini
|
||||
dilewati sepenuhnya.
|
||||
|
||||
### 9) Peringatan keamanan
|
||||
|
||||
Doctor mengeluarkan peringatan saat sebuah provider terbuka untuk DM tanpa allowlist, atau
|
||||
Doctor mengeluarkan peringatan saat suatu provider terbuka untuk DM tanpa allowlist, atau
|
||||
saat suatu kebijakan dikonfigurasi dengan cara yang berbahaya.
|
||||
|
||||
### 10) `linger` systemd (Linux)
|
||||
### 10) systemd linger (Linux)
|
||||
|
||||
Jika berjalan sebagai layanan pengguna systemd, doctor memastikan lingering diaktifkan agar
|
||||
gateway tetap hidup setelah logout.
|
||||
|
||||
### 11) Status workspace (Skills, plugin, dan direktori lama)
|
||||
### 11) Status workspace (Skills, plugin, dan dir lama)
|
||||
|
||||
Doctor mencetak ringkasan state workspace untuk agent default:
|
||||
Doctor mencetak ringkasan status workspace untuk agen default:
|
||||
|
||||
- **Status Skills**: menghitung skill yang eligible, missing-requirements, dan allowlist-blocked.
|
||||
- **Direktori workspace lama**: memperingatkan saat `~/openclaw` atau direktori workspace lama lainnya
|
||||
ada berdampingan dengan workspace saat ini.
|
||||
- **Status plugin**: menghitung plugin loaded/disabled/errored; mencantumkan ID plugin untuk setiap
|
||||
error; melaporkan kapabilitas bundled plugin.
|
||||
- **Status Skills**: menghitung Skills yang eligible, missing-requirements, dan allowlist-blocked.
|
||||
- **Dir workspace lama**: memperingatkan saat `~/openclaw` atau direktori workspace lama lain
|
||||
ada bersama workspace saat ini.
|
||||
- **Status plugin**: menghitung plugin loaded/disabled/errored; mencantumkan ID plugin untuk
|
||||
error apa pun; melaporkan kapabilitas bundle plugin.
|
||||
- **Peringatan kompatibilitas plugin**: menandai plugin yang memiliki masalah kompatibilitas dengan
|
||||
runtime saat ini.
|
||||
- **Diagnostik plugin**: menampilkan peringatan atau error waktu muat yang dikeluarkan oleh
|
||||
- **Diagnostik plugin**: menampilkan peringatan atau error saat load yang dikeluarkan oleh
|
||||
registry plugin.
|
||||
|
||||
### 11b) Ukuran file bootstrap
|
||||
|
||||
Doctor memeriksa apakah file bootstrap workspace (misalnya `AGENTS.md`,
|
||||
`CLAUDE.md`, atau file konteks lain yang diinjeksi) mendekati atau melebihi
|
||||
anggaran karakter yang dikonfigurasi. Doctor melaporkan jumlah karakter mentah vs. yang diinjeksi per file, persentase
|
||||
`CLAUDE.md`, atau file konteks injeksi lainnya) mendekati atau melebihi budget karakter
|
||||
yang dikonfigurasi. Doctor melaporkan jumlah karakter mentah vs. yang diinjeksi per file, persentase
|
||||
pemotongan, penyebab pemotongan (`max/file` atau `max/total`), dan total karakter
|
||||
yang diinjeksi sebagai bagian dari total anggaran. Saat file dipotong atau mendekati
|
||||
batas, doctor mencetak tips untuk menyesuaikan `agents.defaults.bootstrapMaxChars`
|
||||
yang diinjeksi sebagai fraksi dari total budget. Saat file dipotong atau mendekati
|
||||
batas, doctor mencetak tips untuk menyetel `agents.defaults.bootstrapMaxChars`
|
||||
dan `agents.defaults.bootstrapTotalMaxChars`.
|
||||
|
||||
### 11c) Shell completion
|
||||
@ -407,9 +449,9 @@ Doctor memeriksa apakah tab completion terinstal untuk shell saat ini
|
||||
(zsh, bash, fish, atau PowerShell):
|
||||
|
||||
- Jika profil shell menggunakan pola dynamic completion yang lambat
|
||||
(`source <(openclaw completion ...)`), doctor meng-upgrade-nya ke
|
||||
varian file cache yang lebih cepat.
|
||||
- Jika completion dikonfigurasi di profil tetapi file cache tidak ada,
|
||||
(`source <(openclaw completion ...)`), doctor meningkatkannya ke varian file cache
|
||||
yang lebih cepat.
|
||||
- Jika completion dikonfigurasi di profil tetapi file cache hilang,
|
||||
doctor meregenerasi cache secara otomatis.
|
||||
- Jika tidak ada completion yang dikonfigurasi sama sekali, doctor meminta untuk menginstalnya
|
||||
(hanya mode interaktif; dilewati dengan `--non-interactive`).
|
||||
@ -420,90 +462,90 @@ Jalankan `openclaw completion --write-state` untuk meregenerasi cache secara man
|
||||
|
||||
Doctor memeriksa kesiapan auth token gateway lokal.
|
||||
|
||||
- Jika mode token membutuhkan token dan tidak ada sumber token, doctor menawarkan untuk membuatnya.
|
||||
- Jika mode token memerlukan token dan tidak ada sumber token, doctor menawarkan untuk membuatnya.
|
||||
- Jika `gateway.auth.token` dikelola SecretRef tetapi tidak tersedia, doctor memperingatkan dan tidak menimpanya dengan plaintext.
|
||||
- `openclaw doctor --generate-gateway-token` memaksa pembuatan hanya saat tidak ada token SecretRef yang dikonfigurasi.
|
||||
|
||||
### 12b) Perbaikan read-only yang sadar SecretRef
|
||||
### 12b) Perbaikan sadar-SecretRef baca-saja
|
||||
|
||||
Beberapa alur perbaikan perlu memeriksa kredensial yang dikonfigurasi tanpa melemahkan perilaku fail-fast runtime.
|
||||
Beberapa alur perbaikan perlu memeriksa kredensial yang dikonfigurasi tanpa melemahkan perilaku fail-fast saat runtime.
|
||||
|
||||
- `openclaw doctor --fix` kini menggunakan model ringkasan SecretRef read-only yang sama seperti keluarga perintah status untuk perbaikan config yang ditargetkan.
|
||||
- Contoh: perbaikan Telegram `allowFrom` / `groupAllowFrom` `@username` mencoba menggunakan kredensial bot yang dikonfigurasi jika tersedia.
|
||||
- Jika token bot Telegram dikonfigurasi melalui SecretRef tetapi tidak tersedia di jalur perintah saat ini, doctor melaporkan bahwa kredensial dikonfigurasi-tetapi-tidak-tersedia dan melewati auto-resolution alih-alih crash atau salah melaporkan token sebagai hilang.
|
||||
- `openclaw doctor --fix` sekarang menggunakan model ringkasan SecretRef baca-saja yang sama seperti keluarga perintah status untuk perbaikan konfigurasi yang terarah.
|
||||
- Contoh: perbaikan Telegram `allowFrom` / `groupAllowFrom` `@username` mencoba menggunakan kredensial bot yang dikonfigurasi bila tersedia.
|
||||
- Jika token bot Telegram dikonfigurasi melalui SecretRef tetapi tidak tersedia dalam path perintah saat ini, doctor melaporkan bahwa kredensial tersebut dikonfigurasi-tetapi-tidak-tersedia dan melewati auto-resolution alih-alih crash atau salah melaporkan token sebagai hilang.
|
||||
|
||||
### 13) Pemeriksaan kesehatan gateway + restart
|
||||
|
||||
Doctor menjalankan pemeriksaan kesehatan dan menawarkan untuk me-restart gateway saat gateway terlihat
|
||||
Doctor menjalankan pemeriksaan kesehatan dan menawarkan untuk merestart gateway saat terlihat
|
||||
tidak sehat.
|
||||
|
||||
### 13b) Kesiapan memory search
|
||||
|
||||
Doctor memeriksa apakah provider embedding memory search yang dikonfigurasi siap
|
||||
untuk agent default. Perilakunya bergantung pada backend dan provider yang dikonfigurasi:
|
||||
untuk agen default. Perilakunya bergantung pada backend dan provider yang dikonfigurasi:
|
||||
|
||||
- **Backend QMD**: mem-probe apakah biner `qmd` tersedia dan dapat dijalankan.
|
||||
Jika tidak, doctor mencetak panduan perbaikan termasuk paket npm dan opsi path biner manual.
|
||||
- **Provider lokal eksplisit**: memeriksa file model lokal atau URL model
|
||||
jarak jauh/dapat diunduh yang dikenali. Jika tidak ada, doctor menyarankan beralih ke provider jarak jauh.
|
||||
- **Provider jarak jauh eksplisit** (`openai`, `voyage`, dll.): memverifikasi bahwa API key
|
||||
ada di environment atau penyimpanan auth. Mencetak petunjuk perbaikan yang dapat ditindaklanjuti jika tidak ada.
|
||||
- **Provider otomatis**: memeriksa ketersediaan model lokal terlebih dahulu, lalu mencoba setiap provider
|
||||
jarak jauh sesuai urutan auto-selection.
|
||||
remote/dapat-diunduh yang dikenali. Jika hilang, doctor menyarankan beralih ke provider remote.
|
||||
- **Provider remote eksplisit** (`openai`, `voyage`, dll.): memverifikasi bahwa API key
|
||||
ada di environment atau penyimpanan auth. Mencetak petunjuk perbaikan yang dapat ditindaklanjuti jika hilang.
|
||||
- **Provider auto**: memeriksa ketersediaan model lokal terlebih dahulu, lalu mencoba setiap
|
||||
provider remote dalam urutan auto-selection.
|
||||
|
||||
Saat hasil probe gateway tersedia (gateway sehat pada saat
|
||||
pemeriksaan), doctor mereferensikan silang hasilnya dengan config yang terlihat oleh CLI dan mencatat
|
||||
pemeriksaan), doctor melakukan cross-reference hasilnya dengan konfigurasi yang terlihat oleh CLI dan mencatat
|
||||
setiap ketidaksesuaian.
|
||||
|
||||
Gunakan `openclaw memory status --deep` untuk memverifikasi kesiapan embedding saat runtime.
|
||||
|
||||
### 14) Peringatan status channel
|
||||
### 14) Peringatan status kanal
|
||||
|
||||
Jika gateway sehat, doctor menjalankan probe status channel dan melaporkan
|
||||
peringatan beserta saran perbaikan.
|
||||
Jika gateway sehat, doctor menjalankan probe status kanal dan melaporkan
|
||||
peringatan dengan perbaikan yang disarankan.
|
||||
|
||||
### 15) Audit + perbaikan config supervisor
|
||||
### 15) Audit konfigurasi supervisor + perbaikan
|
||||
|
||||
Doctor memeriksa config supervisor yang terinstal (launchd/systemd/schtasks) untuk
|
||||
Doctor memeriksa konfigurasi supervisor yang terpasang (launchd/systemd/schtasks) untuk
|
||||
default yang hilang atau usang (misalnya dependensi systemd network-online dan
|
||||
jeda restart). Saat menemukan ketidakcocokan, doctor merekomendasikan pembaruan dan dapat
|
||||
menulis ulang file layanan/task ke default saat ini.
|
||||
restart delay). Saat menemukan ketidakcocokan, doctor merekomendasikan pembaruan dan dapat
|
||||
menulis ulang file/task layanan ke default saat ini.
|
||||
|
||||
Catatan:
|
||||
|
||||
- `openclaw doctor` meminta konfirmasi sebelum menulis ulang config supervisor.
|
||||
- `openclaw doctor` meminta konfirmasi sebelum menulis ulang konfigurasi supervisor.
|
||||
- `openclaw doctor --yes` menerima prompt perbaikan default.
|
||||
- `openclaw doctor --repair` menerapkan perbaikan yang direkomendasikan tanpa prompt.
|
||||
- `openclaw doctor --repair --force` menimpa config supervisor kustom.
|
||||
- Jika auth token memerlukan token dan `gateway.auth.token` dikelola SecretRef, jalur instalasi/perbaikan layanan doctor memvalidasi SecretRef tetapi tidak menyimpan nilai token plaintext yang telah di-resolve ke metadata environment layanan supervisor.
|
||||
- Jika auth token memerlukan token dan token SecretRef yang dikonfigurasi tidak ter-resolve, doctor memblokir jalur instalasi/perbaikan dengan panduan yang dapat ditindaklanjuti.
|
||||
- Jika `gateway.auth.token` dan `gateway.auth.password` keduanya dikonfigurasi dan `gateway.auth.mode` tidak disetel, doctor memblokir instalasi/perbaikan sampai mode disetel secara eksplisit.
|
||||
- `openclaw doctor --repair --force` menimpa konfigurasi supervisor kustom.
|
||||
- Jika auth token memerlukan token dan `gateway.auth.token` dikelola SecretRef, install/perbaikan layanan doctor memvalidasi SecretRef tetapi tidak menyimpan nilai token plaintext yang telah di-resolve ke metadata environment layanan supervisor.
|
||||
- Jika auth token memerlukan token dan token SecretRef yang dikonfigurasi tidak ter-resolve, doctor memblokir path install/perbaikan dengan panduan yang dapat ditindaklanjuti.
|
||||
- Jika `gateway.auth.token` dan `gateway.auth.password` sama-sama dikonfigurasi dan `gateway.auth.mode` tidak diatur, doctor memblokir install/perbaikan sampai mode diatur secara eksplisit.
|
||||
- Untuk unit user-systemd Linux, pemeriksaan drift token doctor kini mencakup sumber `Environment=` dan `EnvironmentFile=` saat membandingkan metadata auth layanan.
|
||||
- Anda selalu dapat memaksa penulisan ulang penuh melalui `openclaw gateway install --force`.
|
||||
|
||||
### 16) Diagnostik runtime + port gateway
|
||||
|
||||
Doctor memeriksa runtime layanan (PID, status keluar terakhir) dan memperingatkan saat
|
||||
layanan terinstal tetapi sebenarnya tidak berjalan. Doctor juga memeriksa benturan port
|
||||
Doctor memeriksa runtime layanan (PID, status exit terakhir) dan memperingatkan saat
|
||||
layanan terpasang tetapi sebenarnya tidak berjalan. Doctor juga memeriksa benturan port
|
||||
pada port gateway (default `18789`) dan melaporkan kemungkinan penyebabnya (gateway sudah
|
||||
berjalan, tunnel SSH).
|
||||
|
||||
### 17) Praktik terbaik runtime gateway
|
||||
### 17) Best practice runtime gateway
|
||||
|
||||
Doctor memperingatkan saat layanan gateway berjalan di Bun atau path Node yang dikelola version manager
|
||||
(`nvm`, `fnm`, `volta`, `asdf`, dll.). Channel WhatsApp + Telegram memerlukan Node,
|
||||
(`nvm`, `fnm`, `volta`, `asdf`, dll.). Kanal WhatsApp + Telegram memerlukan Node,
|
||||
dan path version manager dapat rusak setelah upgrade karena layanan tidak
|
||||
memuat init shell Anda. Doctor menawarkan untuk memigrasikan ke instalasi Node sistem saat
|
||||
memuat init shell Anda. Doctor menawarkan untuk memigrasikan ke instalasi Node sistem bila
|
||||
tersedia (Homebrew/apt/choco).
|
||||
|
||||
### 18) Penulisan config + metadata wizard
|
||||
### 18) Penulisan konfigurasi + metadata wizard
|
||||
|
||||
Doctor menyimpan perubahan config dan menandai metadata wizard untuk mencatat
|
||||
jalannya doctor.
|
||||
Doctor menyimpan setiap perubahan konfigurasi dan memberi cap metadata wizard untuk mencatat
|
||||
run doctor.
|
||||
|
||||
### 19) Tips workspace (cadangan + sistem memori)
|
||||
|
||||
Doctor menyarankan sistem memori workspace bila belum ada dan mencetak tip cadangan
|
||||
Doctor menyarankan sistem memori workspace jika belum ada dan mencetak tip cadangan
|
||||
jika workspace belum berada di bawah git.
|
||||
|
||||
Lihat [/concepts/agent-workspace](/id/concepts/agent-workspace) untuk panduan lengkap tentang
|
||||
|
||||
@ -6,31 +6,31 @@ read_when:
|
||||
summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan cakupan tiap pengujian'
|
||||
title: Pengujian
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T02:17:42Z"
|
||||
generated_at: "2026-04-09T01:30:28Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: ace2c19bfc350780475f4348264a4b55be2b4ccbb26f0d33b4a6af34510943b5
|
||||
source_hash: 01117f41d8b171a4f1da11ed78486ee700e70ae70af54eb6060c57baf64ab21b
|
||||
source_path: help/testing.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Pengujian
|
||||
|
||||
OpenClaw memiliki tiga suite Vitest (unit/integration, e2e, live) dan sekumpulan kecil runner Docker.
|
||||
OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sekumpulan kecil runner Docker.
|
||||
|
||||
Dokumen ini adalah panduan “cara kami menguji”:
|
||||
Dokumen ini adalah panduan “cara kami melakukan pengujian”:
|
||||
|
||||
- Apa yang dicakup tiap suite (dan apa yang sengaja _tidak_ dicakup)
|
||||
- Perintah mana yang dijalankan untuk alur kerja umum (lokal, pra-push, debugging)
|
||||
- Apa yang dicakup oleh setiap suite (dan apa yang sengaja _tidak_ dicakup)
|
||||
- Perintah mana yang dijalankan untuk alur kerja umum (lokal, sebelum push, debugging)
|
||||
- Cara live test menemukan kredensial dan memilih model/provider
|
||||
- Cara menambahkan regresi untuk masalah model/provider di dunia nyata
|
||||
|
||||
## Mulai cepat
|
||||
|
||||
Sebagian besar hari:
|
||||
Hampir setiap hari:
|
||||
|
||||
- Gate penuh (diharapkan sebelum push): `pnpm build && pnpm check && pnpm test`
|
||||
- Menjalankan suite penuh lokal yang lebih cepat pada mesin yang lapang: `pnpm test:max`
|
||||
- Eksekusi full-suite lokal yang lebih cepat pada mesin yang lega: `pnpm test:max`
|
||||
- Loop watch Vitest langsung: `pnpm test:watch`
|
||||
- Penargetan file langsung kini juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
|
||||
- Situs QA berbasis Docker: `pnpm qa:lab:up`
|
||||
@ -42,125 +42,125 @@ Saat Anda menyentuh pengujian atau ingin keyakinan tambahan:
|
||||
|
||||
Saat men-debug provider/model nyata (memerlukan kredensial nyata):
|
||||
|
||||
- Suite live (model + probe tool/image gateway): `pnpm test:live`
|
||||
- Suite live (probe model + tool/image gateway): `pnpm test:live`
|
||||
- Targetkan satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts`
|
||||
|
||||
Tip: ketika Anda hanya memerlukan satu kasus gagal, lebih baik mempersempit live test melalui env var allowlist yang dijelaskan di bawah.
|
||||
Tip: ketika Anda hanya memerlukan satu kasus gagal, sebaiknya persempit live test melalui env var allowlist yang dijelaskan di bawah.
|
||||
|
||||
## Suite pengujian (apa yang berjalan di mana)
|
||||
|
||||
Anggap suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang meningkat):
|
||||
Anggap suite-suite ini sebagai “realisme yang semakin meningkat” (dan flakiness/biaya yang juga meningkat):
|
||||
|
||||
### Unit / integration (default)
|
||||
### Unit / integrasi (default)
|
||||
|
||||
- Perintah: `pnpm test`
|
||||
- Config: sepuluh kali shard run berurutan (`vitest.full-*.config.ts`) di atas project Vitest terlingkup yang ada
|
||||
- Konfigurasi: sepuluh eksekusi shard berurutan (`vitest.full-*.config.ts`) di atas project Vitest terlingkup yang ada
|
||||
- File: inventaris core/unit di bawah `src/**/*.test.ts`, `packages/**/*.test.ts`, `test/**/*.test.ts`, dan pengujian node `ui` yang di-whitelist yang dicakup oleh `vitest.unit.config.ts`
|
||||
- Cakupan:
|
||||
- Pengujian unit murni
|
||||
- Pengujian integrasi in-process (auth gateway, routing, tooling, parsing, config)
|
||||
- Regresi deterministik untuk bug yang diketahui
|
||||
- Regresi deterministik untuk bug yang sudah diketahui
|
||||
- Ekspektasi:
|
||||
- Berjalan di CI
|
||||
- Tidak memerlukan key nyata
|
||||
- Harus cepat dan stabil
|
||||
- Catatan project:
|
||||
- `pnpm test` tanpa target kini menjalankan sebelas config shard yang lebih kecil (`core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses giant native root-project. Ini mengurangi puncak RSS pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension membuat suite yang tidak terkait kelaparan sumber daya.
|
||||
- `pnpm test --watch` masih menggunakan graf project `vitest.config.ts` root native, karena loop watch multi-shard tidak praktis.
|
||||
- `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane terlingkup terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` tidak perlu membayar biaya startup root project penuh.
|
||||
- `pnpm test:changed` memperluas path git yang berubah ke lane terlingkup yang sama ketika diff hanya menyentuh file source/test yang dapat dirutekan; edit config/setup tetap kembali ke rerun root-project yang lebih luas.
|
||||
- Pengujian `plugin-sdk` dan `commands` terpilih juga dirutekan melalui lane ringan khusus yang melewati `test/setup-openclaw-runtime.ts`; file stateful/runtime-heavy tetap berada di lane yang ada.
|
||||
- File source helper `plugin-sdk` dan `commands` terpilih juga memetakan run mode-changed ke pengujian sibling eksplisit di lane ringan tersebut, sehingga edit helper tidak memicu rerun suite berat penuh untuk direktori itu.
|
||||
- `auto-reply` kini memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness balasan terberat tetap terpisah dari pengujian status/chunk/token yang murah.
|
||||
- `pnpm test` tanpa target kini 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 sangat besar. Ini mengurangi puncak RSS pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension mengganggu suite lain yang tidak terkait.
|
||||
- `pnpm test --watch` tetap menggunakan graf project `vitest.config.ts` root native, karena loop watch multi-shard tidak praktis.
|
||||
- `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane terlingkup terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` tidak perlu membayar biaya startup penuh root project.
|
||||
- `pnpm test:changed` memperluas path git yang berubah ke lane terlingkup yang sama saat diff hanya menyentuh file source/test yang dapat dirutekan; edit config/setup tetap fallback ke rerun root-project yang luas.
|
||||
- Pengujian `plugin-sdk` dan `commands` tertentu juga dirutekan melalui lane ringan khusus yang melewati `test/setup-openclaw-runtime.ts`; file stateful/runtime-heavy tetap berada di lane yang ada.
|
||||
- File source helper `plugin-sdk` dan `commands` tertentu juga memetakan eksekusi mode-changed ke pengujian saudara eksplisit di lane 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 terberat tetap terpisah dari pengujian status/chunk/token yang murah.
|
||||
- Catatan embedded runner:
|
||||
- Saat Anda mengubah input penemuan message-tool atau konteks runtime compaction,
|
||||
pertahankan kedua tingkat cakupan.
|
||||
- Tambahkan regresi helper yang terfokus untuk boundary routing/normalisasi murni.
|
||||
- Tambahkan regresi helper yang terfokus untuk batas routing/normalisasi murni.
|
||||
- Jaga juga 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
|
||||
- Suite-suite tersebut memverifikasi bahwa id terlingkup dan perilaku compaction tetap mengalir
|
||||
melalui path `run.ts` / `compact.ts` yang nyata; pengujian helper saja bukan
|
||||
pengganti yang memadai untuk path integrasi tersebut.
|
||||
- Catatan pool:
|
||||
- Config dasar Vitest kini default ke `threads`.
|
||||
- Config Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di root projects, config e2e, dan live.
|
||||
- Lane UI root mempertahankan setup dan optimizer `jsdom`-nya, tetapi kini juga berjalan pada runner non-isolated bersama.
|
||||
- Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari config Vitest bersama.
|
||||
- Launcher bersama `scripts/run-vitest.mjs` kini juga menambahkan `--no-maglev` untuk proses Node anak Vitest secara default guna mengurangi compile churn V8 selama run lokal besar. Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan dengan perilaku V8 bawaan.
|
||||
- Konfigurasi dasar Vitest sekarang menggunakan `threads` secara default.
|
||||
- Konfigurasi Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh konfigurasi root project, e2e, dan live.
|
||||
- Lane 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 anak Vitest secara default guna mengurangi churn kompilasi V8 selama eksekusi 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 ketika path yang berubah terpetakan dengan bersih ke suite yang lebih kecil.
|
||||
- `pnpm test:changed` merutekan melalui lane terlingkup saat 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 sengaja konservatif dan juga mundur ketika load average host sudah tinggi, sehingga beberapa run Vitest serentak secara default menyebabkan kerusakan yang lebih kecil.
|
||||
- Config dasar Vitest menandai file project/config sebagai `forceRerunTriggers` agar rerun mode-changed tetap benar saat wiring pengujian berubah.
|
||||
- Config mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` aktif pada host yang didukung; setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung.
|
||||
- Auto-scaling worker lokal kini sengaja lebih konservatif dan juga mundur saat load average host sudah tinggi, sehingga beberapa eksekusi Vitest bersamaan menimbulkan dampak yang lebih kecil secara default.
|
||||
- Konfigurasi dasar Vitest menandai file projects/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; tetapkan `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda ingin satu lokasi cache eksplisit untuk profiling langsung.
|
||||
- Catatan debug performa:
|
||||
- `pnpm test:perf:imports` mengaktifkan pelaporan durasi import Vitest plus output rincian import.
|
||||
- `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest beserta keluaran 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 <git-ref>` membandingkan `test:changed` yang dirutekan dengan path root-project native untuk diff yang di-commit tersebut dan mencetak wall time plus max RSS macOS.
|
||||
- `pnpm test:perf:changed:bench -- --worktree` membenchmark dirty tree saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan config Vitest root.
|
||||
- `pnpm test:perf:changed:bench -- --ref <git-ref>` membandingkan `test:changed` yang dirutekan dengan path root-project native untuk diff yang telah di-commit tersebut dan mencetak wall time beserta max RSS macOS.
|
||||
- `pnpm test:perf:changed:bench -- --worktree` melakukan benchmark pada tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi Vitest root.
|
||||
- `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk overhead startup dan transform Vitest/Vite.
|
||||
- `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk suite unit dengan paralelisme file dinonaktifkan.
|
||||
|
||||
### E2E (smoke gateway)
|
||||
|
||||
- Perintah: `pnpm test:e2e`
|
||||
- Config: `vitest.e2e.config.ts`
|
||||
- Konfigurasi: `vitest.e2e.config.ts`
|
||||
- File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts`
|
||||
- Default runtime:
|
||||
- Menggunakan Vitest `threads` dengan `isolate: false`, selaras dengan bagian repo lainnya.
|
||||
- Menggunakan Vitest `threads` dengan `isolate: false`, konsisten dengan bagian repo lainnya.
|
||||
- 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=<n>` untuk memaksa jumlah worker (dibatasi hingga 16).
|
||||
- `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali output konsol verbose.
|
||||
- `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali keluaran konsol verbose.
|
||||
- Cakupan:
|
||||
- Perilaku end-to-end gateway multi-instans
|
||||
- Perilaku end-to-end gateway multi-instance
|
||||
- Surface WebSocket/HTTP, pairing node, dan jaringan yang lebih berat
|
||||
- Ekspektasi:
|
||||
- Berjalan di CI (saat diaktifkan dalam pipeline)
|
||||
- Tidak memerlukan key nyata
|
||||
- Memiliki lebih banyak bagian bergerak dibanding pengujian unit (bisa lebih lambat)
|
||||
- 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:
|
||||
- Menjalankan 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` + eksekusi SSH yang nyata
|
||||
- Memverifikasi perilaku filesystem remote-canonical melalui bridge fs sandbox
|
||||
- Ekspektasi:
|
||||
- Hanya opt-in; bukan bagian dari run default `pnpm test:e2e`
|
||||
- Hanya opt-in; bukan bagian dari eksekusi default `pnpm test:e2e`
|
||||
- Memerlukan CLI `openshell` lokal plus daemon Docker yang berfungsi
|
||||
- Menggunakan `HOME` / `XDG_CONFIG_HOME` yang terisolasi, lalu menghancurkan gateway uji dan sandbox
|
||||
- Menggunakan `HOME` / `XDG_CONFIG_HOME` yang terisolasi, lalu menghancurkan gateway dan sandbox pengujian
|
||||
- Override yang berguna:
|
||||
- `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manual
|
||||
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI non-default atau wrapper script
|
||||
- `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI non-default atau skrip wrapper
|
||||
|
||||
### Live (provider nyata + model nyata)
|
||||
|
||||
- Perintah: `pnpm test:live`
|
||||
- Config: `vitest.live.config.ts`
|
||||
- Konfigurasi: `vitest.live.config.ts`
|
||||
- File: `src/**/*.live.test.ts`
|
||||
- Default: **aktif** melalui `pnpm test:live` (menyetel `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?”
|
||||
- “Apakah provider/model ini benar-benar bekerja _hari ini_ dengan kredensial nyata?”
|
||||
- Menangkap perubahan format provider, keanehan tool-calling, masalah auth, dan perilaku rate limit
|
||||
- Ekspektasi:
|
||||
- Tidak stabil untuk CI secara sengaja (jaringan nyata, kebijakan provider nyata, kuota, outage)
|
||||
- Menghabiskan uang / menggunakan rate limit
|
||||
- Lebih baik menjalankan subset yang dipersempit daripada “semuanya”
|
||||
- Live run melakukan source `~/.profile` untuk mengambil API key yang hilang.
|
||||
- Memang tidak stabil untuk CI (jaringan nyata, kebijakan provider nyata, kuota, outage)
|
||||
- Menghabiskan biaya / menggunakan rate limit
|
||||
- Sebaiknya menjalankan subset yang dipersempit, bukan “semuanya”
|
||||
- Live run melakukan source `~/.profile` untuk mengambil API key yang belum ada.
|
||||
- Secara default, live run tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara agar fixture unit tidak dapat mengubah `~/.openclaw` asli Anda.
|
||||
- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya jika Anda memang sengaja memerlukan live test menggunakan home directory asli Anda.
|
||||
- `pnpm test:live` kini default ke mode yang lebih senyap: tetap mempertahankan output progres `[live] ...`, tetapi menekan notifikasi `~/.profile` tambahan dan membisukan log bootstrap gateway/chatter Bonjour. Setel `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali.
|
||||
- Rotasi API key (spesifik provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian akan retry saat menerima respons rate limit.
|
||||
- Output progres/heartbeat:
|
||||
- Suite live kini mengeluarkan baris progres ke stderr sehingga panggilan provider yang lama terlihat aktif meskipun penangkapan konsol Vitest sedang senyap.
|
||||
- `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway mengalir langsung selama live run.
|
||||
- Tetapkan `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang ingin live test menggunakan direktori home asli Anda.
|
||||
- `pnpm test:live` kini default ke mode yang lebih senyap: tetap mempertahankan keluaran 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 penuh kembali.
|
||||
- Rotasi API key (spesifik 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 akan mencoba ulang saat mendapat respons rate limit.
|
||||
- Keluaran progres/heartbeat:
|
||||
- Suite live sekarang mengeluarkan baris progres ke stderr sehingga pemanggilan provider yang lama tetap tampak aktif meskipun capture konsol Vitest senyap.
|
||||
- `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway mengalir segera selama live run.
|
||||
- Atur heartbeat direct-model dengan `OPENCLAW_LIVE_HEARTBEAT_MS`.
|
||||
- Atur heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`.
|
||||
|
||||
@ -168,103 +168,105 @@ Anggap suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang men
|
||||
|
||||
Gunakan tabel keputusan ini:
|
||||
|
||||
- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda banyak mengubah)
|
||||
- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda mengubah banyak hal)
|
||||
- Menyentuh jaringan gateway / protokol WS / pairing: tambahkan `pnpm test:e2e`
|
||||
- Men-debug “bot saya mati” / kegagalan spesifik provider / tool calling: jalankan `pnpm test:live` yang dipersempit
|
||||
- Men-debug “bot saya down” / kegagalan spesifik provider / tool calling: jalankan `pnpm test:live` yang dipersempit
|
||||
|
||||
## Live: penyapuan kapabilitas node Android
|
||||
## Live: sweep kapabilitas node Android
|
||||
|
||||
- Pengujian: `src/gateway/android-node.capabilities.live.test.ts`
|
||||
- Script: `pnpm android:test:integration`
|
||||
- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh node Android yang terhubung dan menegaskan perilaku kontrak perintah.
|
||||
- Skrip: `pnpm android:test:integration`
|
||||
- Tujuan: memanggil **setiap perintah yang saat ini diiklankan** oleh node Android yang terhubung dan memverifikasi perilaku kontrak perintah.
|
||||
- Cakupan:
|
||||
- Setup manual/prasyarat (suite tidak menginstal/menjalankan/memasangkan aplikasi).
|
||||
- Validasi `node.invoke` gateway per perintah untuk node Android yang dipilih.
|
||||
- Setup manual dengan prasyarat (suite ini tidak memasang/menjalankan/mem-pair aplikasi).
|
||||
- Validasi gateway `node.invoke` per perintah untuk node Android yang dipilih.
|
||||
- Pra-setup yang diperlukan:
|
||||
- Aplikasi Android sudah terhubung + dipasangkan ke gateway.
|
||||
- Aplikasi Android sudah terhubung + ter-pair ke gateway.
|
||||
- Aplikasi tetap berada di foreground.
|
||||
- Izin/persetujuan capture diberikan untuk kapabilitas 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 (key profil)
|
||||
|
||||
Live test dibagi menjadi dua lapisan agar kita dapat mengisolasi kegagalan:
|
||||
|
||||
- “Direct model” memberi tahu kita apakah provider/model dapat merespons sama sekali dengan key yang diberikan.
|
||||
- “Gateway smoke” memberi tahu kita apakah pipeline gateway+agent penuh berfungsi untuk model itu (session, 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 seluruh pipeline gateway+agent bekerja untuk model itu (session, history, tools, kebijakan sandbox, dan sebagainya).
|
||||
|
||||
### Lapisan 1: penyelesaian model langsung (tanpa gateway)
|
||||
### Lapisan 1: Penyelesaian direct model (tanpa gateway)
|
||||
|
||||
- Pengujian: `src/agents/models.profiles.live.test.ts`
|
||||
- Tujuan:
|
||||
- Mengenumerasi model yang ditemukan
|
||||
- Menggunakan `getApiKeyForModel` untuk memilih model yang kredensialnya Anda miliki
|
||||
- Menjalankan completion kecil per model (dan regresi yang ditargetkan bila perlu)
|
||||
- Menggunakan `getApiKeyForModel` untuk memilih model yang Anda miliki kredensialnya
|
||||
- Menjalankan penyelesaian kecil per model (dan regresi terarah bila perlu)
|
||||
- Cara mengaktifkan:
|
||||
- `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung)
|
||||
- Setel `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 berfokus pada gateway smoke
|
||||
- Tetapkan `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini akan di-skip agar `pnpm test:live` tetap fokus pada gateway smoke
|
||||
- Cara memilih model:
|
||||
- `OPENCLAW_LIVE_MODELS=modern` untuk menjalankan allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
|
||||
- `OPENCLAW_LIVE_MODELS=all` adalah alias untuk allowlist modern
|
||||
- atau `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist dipisah koma)
|
||||
- atau `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist dipisahkan koma)
|
||||
- Sweep modern/all default ke batas kurasi dengan sinyal tinggi; tetapkan `OPENCLAW_LIVE_MAX_MODELS=0` untuk sweep modern lengkap atau angka positif untuk batas yang lebih kecil.
|
||||
- Cara memilih provider:
|
||||
- `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist dipisah koma)
|
||||
- `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist dipisahkan koma)
|
||||
- Dari mana key berasal:
|
||||
- Secara default: profile store dan fallback env
|
||||
- Setel `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksakan **hanya profile store**
|
||||
- Default: profile store dan fallback env
|
||||
- Tetapkan `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa hanya **profile store**
|
||||
- Mengapa ini ada:
|
||||
- Memisahkan “API provider rusak / key tidak valid” dari “pipeline agent gateway rusak”
|
||||
- Memuat regresi kecil dan terisolasi (contoh: replay reasoning OpenAI Responses/Codex Responses + alur tool-call)
|
||||
- Menampung regresi kecil yang terisolasi (contoh: replay reasoning OpenAI Responses/Codex Responses + alur tool-call)
|
||||
|
||||
### Lapisan 2: smoke gateway + agent dev (apa yang sebenarnya dilakukan "@openclaw")
|
||||
### Lapisan 2: Gateway + smoke dev agent (apa yang sebenarnya dilakukan "@openclaw")
|
||||
|
||||
- Pengujian: `src/gateway/gateway-models.profiles.live.test.ts`
|
||||
- Tujuan:
|
||||
- Menjalankan gateway in-process
|
||||
- Membuat/menambal session `agent:dev:*` (override model per run)
|
||||
- Mengiterasi model-dengan-key dan menegaskan:
|
||||
- respons yang “bermakna” (tanpa tools)
|
||||
- Membuat/menambal session `agent:dev:*` (override model per eksekusi)
|
||||
- Mengiterasi model-dengan-key dan memverifikasi:
|
||||
- respons “bermakna” (tanpa tools)
|
||||
- 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 agent untuk `read` file itu dan menggemakan nonce kembali.
|
||||
- probe `exec+read`: pengujian meminta agent untuk menulis nonce ke file sementara lewat `exec`, lalu `read` kembali.
|
||||
- probe image: pengujian melampirkan PNG yang dibuat (kucing + kode acak) dan mengharapkan model mengembalikan `cat <CODE>`.
|
||||
- Detail probe (agar Anda dapat menjelaskan kegagalan dengan cepat):
|
||||
- probe `read`: pengujian menulis file nonce di workspace lalu meminta agent `read` file tersebut dan mengembalikan nonce.
|
||||
- probe `exec+read`: pengujian meminta agent menulis nonce ke file sementara via `exec`, lalu `read` kembali.
|
||||
- probe gambar: pengujian melampirkan PNG yang dihasilkan (kucing + kode acak) dan mengharapkan model mengembalikan `cat <CODE>`.
|
||||
- Referensi implementasi: `src/gateway/gateway-models.profiles.live.test.ts` dan `src/gateway/live-image-probe.ts`.
|
||||
- Cara mengaktifkan:
|
||||
- `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung)
|
||||
- Cara memilih model:
|
||||
- Default: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
|
||||
- `OPENCLAW_LIVE_GATEWAY_MODELS=all` adalah alias untuk allowlist modern
|
||||
- Atau setel `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisah koma) untuk mempersempit
|
||||
- Atau tetapkan `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (atau daftar dipisahkan koma) untuk mempersempit
|
||||
- Sweep gateway modern/all default ke batas kurasi dengan sinyal tinggi; tetapkan `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sweep modern lengkap 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 dipisah koma)
|
||||
- Probe tool + image selalu aktif dalam live test ini:
|
||||
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"` (allowlist dipisahkan koma)
|
||||
- Probe tool + gambar selalu aktif di live test ini:
|
||||
- probe `read` + probe `exec+read` (stress tool)
|
||||
- probe image berjalan saat model mengiklankan dukungan input image
|
||||
- probe gambar berjalan saat model mengiklankan dukungan input gambar
|
||||
- Alur (tingkat tinggi):
|
||||
- Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`)
|
||||
- Mengirimnya melalui `agent` `attachments: [{ mimeType: "image/png", content: "<base64>" }]`
|
||||
- Gateway mem-parsing attachment ke `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`)
|
||||
- Mengirimkannya melalui `agent` `attachments: [{ mimeType: "image/png", content: "<base64>" }]`
|
||||
- Gateway mem-parsing attachment menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`)
|
||||
- Embedded agent meneruskan pesan pengguna multimodal ke model
|
||||
- Asersi: balasan berisi `cat` + kode tersebut (toleransi OCR: kesalahan kecil diperbolehkan)
|
||||
|
||||
Tip: untuk melihat apa yang dapat Anda uji di mesin Anda (dan id `provider/model` yang tepat), jalankan:
|
||||
Tip: untuk melihat apa yang bisa Anda uji pada 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 lainnya)
|
||||
## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lain)
|
||||
|
||||
- Pengujian: `src/gateway/gateway-cli-backend.live.test.ts`
|
||||
- Tujuan: memvalidasi pipeline Gateway + agent menggunakan backend CLI lokal, tanpa menyentuh config default Anda.
|
||||
- Default smoke spesifik backend berada bersama definisi `cli-backend.ts` milik extension yang memilikinya.
|
||||
- Default smoke spesifik backend berada bersama definisi `cli-backend.ts` milik extension yang bersangkutan.
|
||||
- Aktifkan:
|
||||
- `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung)
|
||||
- `OPENCLAW_LIVE_CLI_BACKEND=1`
|
||||
@ -275,11 +277,11 @@ openclaw models list --json
|
||||
- `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 attachment image nyata (path diinjeksi 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 cara argumen image diteruskan saat `IMAGE_ARG` disetel.
|
||||
- `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim attachment gambar nyata (path disuntikkan ke prompt).
|
||||
- `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path file gambar sebagai argumen CLI alih-alih injeksi prompt.
|
||||
- `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengendalikan cara argumen gambar 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 session yang sama Claude Sonnet -> Opus secara default (setel ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch).
|
||||
- `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas satu session default Claude Sonnet -> Opus (tetapkan ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch).
|
||||
|
||||
Contoh:
|
||||
|
||||
@ -295,7 +297,7 @@ Resep Docker:
|
||||
pnpm test:docker:live-cli-backend
|
||||
```
|
||||
|
||||
Resep Docker provider tunggal:
|
||||
Resep Docker penyedia tunggal:
|
||||
|
||||
```bash
|
||||
pnpm test:docker:live-cli-backend:claude
|
||||
@ -307,8 +309,8 @@ 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 non-root `node`.
|
||||
- Runner ini me-resolve metadata smoke CLI dari extension yang memilikinya, lalu menginstal paket CLI Linux yang cocok (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`).
|
||||
- Smoke CLI-backend live kini menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui gateway CLI.
|
||||
- Runner ini me-resolve metadata smoke CLI dari extension yang memilikinya, lalu memasang paket CLI Linux yang sesuai (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`).
|
||||
- Smoke CLI-backend live sekarang menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi gambar, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI gateway.
|
||||
- Smoke default Claude juga menambal session dari Sonnet ke Opus dan memverifikasi session yang dilanjutkan masih mengingat catatan sebelumnya.
|
||||
|
||||
## Live: smoke bind ACP (`/acp spawn ... --bind here`)
|
||||
@ -316,16 +318,16 @@ Catatan:
|
||||
- Pengujian: `src/gateway/gateway-acp-bind.live.test.ts`
|
||||
- Tujuan: memvalidasi alur bind percakapan ACP nyata dengan agent ACP live:
|
||||
- kirim `/acp spawn <agent> --bind here`
|
||||
- bind percakapan message-channel sintetis secara in-place
|
||||
- bind percakapan message-channel sintetis di tempat
|
||||
- kirim tindak lanjut normal pada percakapan yang sama
|
||||
- verifikasi tindak lanjut mendarat di transcript session ACP yang dibind
|
||||
- verifikasi tindak lanjut masuk ke transkrip session ACP yang terikat
|
||||
- Aktifkan:
|
||||
- `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts`
|
||||
- `OPENCLAW_LIVE_ACP_BIND=1`
|
||||
- Default:
|
||||
- Agent ACP di Docker: `claude,codex,gemini`
|
||||
- Agent ACP untuk `pnpm test:live ...` langsung: `claude`
|
||||
- Channel sintetis: konteks percakapan gaya Slack DM
|
||||
- Channel sintetis: konteks percakapan bergaya Slack DM
|
||||
- Backend ACP: `acpx`
|
||||
- Override:
|
||||
- `OPENCLAW_LIVE_ACP_BIND_AGENT=claude`
|
||||
@ -334,8 +336,8 @@ Catatan:
|
||||
- `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini`
|
||||
- `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'`
|
||||
- Catatan:
|
||||
- Lane ini menggunakan surface gateway `chat.send` dengan field originating-route sintetis admin-only agar pengujian dapat melampirkan konteks message-channel tanpa berpura-pura melakukan pengiriman eksternal.
|
||||
- Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak disetel, pengujian menggunakan registry agent bawaan plugin `acpx` embedded untuk agent harness ACP yang dipilih.
|
||||
- Lane ini menggunakan surface gateway `chat.send` dengan field originating-route sintetis khusus admin agar pengujian dapat melampirkan konteks message-channel tanpa berpura-pura melakukan pengiriman eksternal.
|
||||
- Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak ditetapkan, pengujian ini menggunakan registry agent bawaan plugin `acpx` embedded untuk agent harness ACP yang dipilih.
|
||||
|
||||
Contoh:
|
||||
|
||||
@ -351,7 +353,7 @@ Resep Docker:
|
||||
pnpm test:docker:live-acp-bind
|
||||
```
|
||||
|
||||
Resep Docker single-agent:
|
||||
Resep Docker agen tunggal:
|
||||
|
||||
```bash
|
||||
pnpm test:docker:live-acp-bind:claude
|
||||
@ -364,42 +366,42 @@ Catatan Docker:
|
||||
- Runner Docker berada di `scripts/test-live-acp-bind-docker.sh`.
|
||||
- Secara default, runner ini menjalankan smoke bind ACP terhadap semua agent 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 melakukan source `~/.profile`, men-stage materi auth CLI yang cocok ke dalam container, menginstal `acpx` ke prefix npm yang writable, lalu menginstal CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada.
|
||||
- Di dalam Docker, runner menyetel `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx mempertahankan env var provider dari profile yang di-source tetap tersedia untuk CLI harness anak.
|
||||
- Runner ini melakukan source `~/.profile`, men-stage materi auth CLI yang sesuai ke container, memasang `acpx` ke prefix npm yang writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada.
|
||||
- Di dalam Docker, runner menetapkan `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx mempertahankan env var provider dari profile yang telah di-source tetap tersedia untuk CLI harness anak.
|
||||
|
||||
### Resep live yang direkomendasikan
|
||||
|
||||
Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling tidak flaky:
|
||||
Allowlist yang sempit dan eksplisit paling cepat dan paling sedikit flakey:
|
||||
|
||||
- Model tunggal, langsung (tanpa gateway):
|
||||
- Satu model, direct (tanpa gateway):
|
||||
- `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts`
|
||||
|
||||
- Model tunggal, gateway smoke:
|
||||
- Satu model, gateway smoke:
|
||||
- `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
||||
|
||||
- Tool calling di beberapa provider:
|
||||
- `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 (Gemini API key + Antigravity):
|
||||
- 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 (API key).
|
||||
- `google/...` menggunakan Gemini API (API key).
|
||||
- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agent bergaya Cloud Code Assist).
|
||||
- `google-gemini-cli/...` menggunakan Gemini CLI lokal pada mesin Anda (auth terpisah + keanehan tooling).
|
||||
- `google-gemini-cli/...` menggunakan CLI Gemini lokal di mesin Anda (auth dan keanehan tooling terpisah).
|
||||
- Gemini API vs Gemini CLI:
|
||||
- API: OpenClaw memanggil API Gemini yang di-host Google melalui HTTP (auth API key / profil); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”.
|
||||
- CLI: OpenClaw men-shell out ke biner `gemini` lokal; ia memiliki auth sendiri dan dapat berperilaku berbeda (dukungan streaming/tool/version skew).
|
||||
- API: OpenClaw memanggil Gemini API yang di-host Google melalui HTTP (API key / auth profil); inilah yang biasanya dimaksud kebanyakan pengguna dengan “Gemini”.
|
||||
- CLI: OpenClaw melakukan shell out ke biner `gemini` lokal; ini memiliki auth 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 **yang direkomendasikan** untuk dicakup secara rutin pada mesin dev dengan key.
|
||||
Tidak ada “daftar model CI” yang tetap (live bersifat opt-in), tetapi ini adalah model-model **yang direkomendasikan** untuk dicakup secara rutin di mesin pengembang dengan key.
|
||||
|
||||
### Set smoke modern (tool calling + image)
|
||||
### Set smoke modern (tool calling + gambar)
|
||||
|
||||
Ini adalah run “model umum” yang kami harapkan tetap berfungsi:
|
||||
Ini adalah eksekusi “model umum” yang kami harapkan tetap berfungsi:
|
||||
|
||||
- OpenAI (non-Codex): `openai/gpt-5.4` (opsional: `openai/gpt-5.4-mini`)
|
||||
- OpenAI Codex: `openai-codex/gpt-5.4`
|
||||
@ -409,7 +411,7 @@ Ini adalah run “model umum” yang kami harapkan tetap berfungsi:
|
||||
- Z.AI (GLM): `zai/glm-4.7`
|
||||
- MiniMax: `minimax/MiniMax-M2.7`
|
||||
|
||||
Jalankan gateway smoke dengan tools + image:
|
||||
Jalankan gateway smoke dengan tools + gambar:
|
||||
`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)
|
||||
@ -422,44 +424,44 @@ Pilih setidaknya satu per keluarga provider:
|
||||
- Z.AI (GLM): `zai/glm-4.7`
|
||||
- MiniMax: `minimax/MiniMax-M2.7`
|
||||
|
||||
Cakupan tambahan opsional (bagus jika ada):
|
||||
Cakupan tambahan opsional (bagus untuk dimiliki):
|
||||
|
||||
- xAI: `xai/grok-4` (atau versi terbaru yang tersedia)
|
||||
- Mistral: `mistral/`… (pilih satu model yang mampu `tools` yang Anda aktifkan)
|
||||
- Mistral: `mistral/`… (pilih satu model yang mampu menggunakan tools dan Anda aktifkan)
|
||||
- Cerebras: `cerebras/`… (jika Anda memiliki akses)
|
||||
- LM Studio: `lmstudio/`… (lokal; tool calling bergantung pada mode API)
|
||||
|
||||
### Visi: pengiriman image (attachment → pesan multimodal)
|
||||
### Vision: pengiriman gambar (attachment → pesan multimodal)
|
||||
|
||||
Sertakan setidaknya satu model yang mendukung image di `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dsb.) untuk menjalankan probe image.
|
||||
Sertakan setidaknya satu model yang mendukung gambar di `OPENCLAW_LIVE_GATEWAY_MODELS` (Claude/Gemini/varian OpenAI yang mendukung vision, dan sebagainya) untuk menjalankan probe gambar.
|
||||
|
||||
### Agregator / gateway alternatif
|
||||
|
||||
Jika Anda mengaktifkan key, kami juga mendukung pengujian melalui:
|
||||
|
||||
- OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mendukung tool+image)
|
||||
- OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mendukung tool+gambar)
|
||||
- OpenCode: `opencode/...` untuk Zen dan `opencode-go/...` untuk Go (auth melalui `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`)
|
||||
|
||||
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.)
|
||||
- Built-in: `openai`, `openai-codex`, `anthropic`, `google`, `google-vertex`, `google-antigravity`, `google-gemini-cli`, `zai`, `openrouter`, `opencode`, `opencode-go`, `xai`, `groq`, `cerebras`, `mistral`, `github-copilot`
|
||||
- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), plus proxy apa pun yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.)
|
||||
|
||||
Tip: jangan mencoba melakukan hardcode “semua model” di dokumen. Daftar yang berwenang adalah apa pun yang dikembalikan `discoverModels(...)` pada mesin Anda + key apa pun yang tersedia.
|
||||
Tip: jangan mencoba meng-hardcode “semua model” di dokumentasi. 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)
|
||||
|
||||
Live test menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktis:
|
||||
Live test menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktisnya:
|
||||
|
||||
- Jika CLI berfungsi, live test seharusnya menemukan key yang sama.
|
||||
- Jika live test mengatakan “tidak ada kredensial”, debug dengan cara yang sama seperti saat Anda men-debug `openclaw models list` / pemilihan model.
|
||||
- Jika live test mengatakan “tidak ada kredensial”, debug dengan cara yang sama seperti Anda men-debug `openclaw models list` / pemilihan model.
|
||||
|
||||
- Profil auth per-agent: `~/.openclaw/agents/<agentId>/agent/auth-profiles.json` (inilah yang dimaksud “key profil” pada live test)
|
||||
- Profil auth per-agent: `~/.openclaw/agents/<agentId>/agent/auth-profiles.json` (inilah yang dimaksud dengan “profile keys” di live test)
|
||||
- Config: `~/.openclaw/openclaw.json` (atau `OPENCLAW_CONFIG_PATH`)
|
||||
- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live yang di-stage jika ada, tetapi bukan profile-key store utama)
|
||||
- Run live lokal menyalin config aktif, file `auth-profiles.json` per-agent, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara secara default; home live yang di-stage melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tidak menyentuh workspace host asli Anda.
|
||||
- Direktori status lama: `~/.openclaw/credentials/` (disalin ke home live yang di-stage jika ada, tetapi bukan penyimpanan utama profile-key)
|
||||
- Eksekusi lokal live secara default menyalin config aktif, file `auth-profiles.json` per-agent, `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 tidak menyentuh workspace host asli Anda.
|
||||
|
||||
Jika Anda ingin mengandalkan env key (misalnya diekspor dalam `~/.profile`), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (runner tersebut dapat me-mount `~/.profile` ke dalam container).
|
||||
Jika Anda ingin mengandalkan key env (misalnya diekspor di `~/.profile`), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (runner tersebut dapat me-mount `~/.profile` ke container).
|
||||
|
||||
## Live Deepgram (transkripsi audio)
|
||||
|
||||
@ -479,19 +481,19 @@ Jika Anda ingin mengandalkan env key (misalnya diekspor dalam `~/.profile`), jal
|
||||
- Cakupan:
|
||||
- Menjalankan path image, video, dan `music_generate` comfy bawaan
|
||||
- Melewati setiap kapabilitas kecuali `models.providers.comfy.<capability>` dikonfigurasi
|
||||
- Berguna setelah mengubah pengiriman workflow comfy, polling, unduhan, atau registrasi plugin
|
||||
- Berguna setelah mengubah pengiriman workflow comfy, polling, download, atau registrasi plugin
|
||||
|
||||
## Live pembuatan image
|
||||
## Live pembuatan gambar
|
||||
|
||||
- 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:
|
||||
- Mengenumerasi setiap plugin provider pembuatan image yang terdaftar
|
||||
- Memuat env var provider yang hilang dari shell login Anda (`~/.profile`) sebelum probing
|
||||
- Menggunakan API key live/env mendahului profil auth yang tersimpan secara default, sehingga key pengujian usang dalam `auth-profiles.json` tidak menutupi kredensial shell nyata
|
||||
- Melewati provider tanpa auth/profil/model yang dapat digunakan
|
||||
- Menjalankan varian stock image-generation melalui kapabilitas runtime bersama:
|
||||
- Mengenumerasi setiap plugin provider image-generation yang terdaftar
|
||||
- Memuat env var provider yang hilang dari login shell Anda (`~/.profile`) sebelum melakukan probe
|
||||
- Secara default menggunakan API key live/env lebih dahulu daripada profil auth yang disimpan, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell asli
|
||||
- Melewati provider yang tidak memiliki auth/profil/model yang dapat digunakan
|
||||
- Menjalankan varian image-generation bawaan melalui kapabilitas runtime bersama:
|
||||
- `google:flash-generate`
|
||||
- `google:pro-generate`
|
||||
- `google:pro-edit`
|
||||
@ -504,7 +506,7 @@ Jika Anda ingin mengandalkan env key (misalnya diekspor dalam `~/.profile`), jal
|
||||
- `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 env-only
|
||||
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override khusus env
|
||||
|
||||
## Live pembuatan musik
|
||||
|
||||
@ -512,23 +514,23 @@ Jika Anda ingin mengandalkan env key (misalnya diekspor dalam `~/.profile`), jal
|
||||
- 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 music-generation bawaan bersama
|
||||
- Saat ini mencakup Google dan MiniMax
|
||||
- Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing
|
||||
- Menggunakan API key live/env mendahului profil auth yang tersimpan secara default, sehingga key pengujian usang dalam `auth-profiles.json` tidak menutupi kredensial shell nyata
|
||||
- Melewati provider tanpa auth/profil/model yang dapat digunakan
|
||||
- Memuat env var provider dari login shell Anda (`~/.profile`) sebelum melakukan probe
|
||||
- Secara default menggunakan API key live/env lebih dahulu daripada profil auth yang disimpan, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell asli
|
||||
- Melewati provider yang tidak memiliki auth/profil/model yang dapat digunakan
|
||||
- Menjalankan kedua mode runtime yang dideklarasikan jika tersedia:
|
||||
- `generate` dengan input prompt-only
|
||||
- `generate` dengan input prompt saja
|
||||
- `edit` saat provider mendeklarasikan `capabilities.edit.enabled`
|
||||
- Cakupan shared-lane saat ini:
|
||||
- Cakupan current shared-lane:
|
||||
- `google`: `generate`, `edit`
|
||||
- `minimax`: `generate`
|
||||
- `comfy`: file live Comfy terpisah, bukan sapuan bersama ini
|
||||
- `comfy`: file live Comfy terpisah, bukan sweep 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 env-only
|
||||
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override khusus env
|
||||
|
||||
## Live pembuatan video
|
||||
|
||||
@ -536,163 +538,163 @@ Jika Anda ingin mengandalkan env key (misalnya diekspor dalam `~/.profile`), jal
|
||||
- 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
|
||||
- Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing
|
||||
- Menggunakan API key live/env mendahului profil auth yang tersimpan secara default, sehingga key pengujian usang dalam `auth-profiles.json` tidak menutupi kredensial shell nyata
|
||||
- Melewati provider tanpa auth/profil/model yang dapat digunakan
|
||||
- Menjalankan path provider video-generation bawaan bersama
|
||||
- Memuat env var provider dari login shell Anda (`~/.profile`) sebelum melakukan probe
|
||||
- Secara default menggunakan API key live/env lebih dahulu daripada profil auth yang disimpan, sehingga key pengujian lama di `auth-profiles.json` tidak menutupi kredensial shell asli
|
||||
- Melewati provider yang tidak memiliki auth/profil/model yang dapat digunakan
|
||||
- Menjalankan kedua mode runtime yang dideklarasikan jika tersedia:
|
||||
- `generate` dengan input prompt-only
|
||||
- `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` saat ini yang dideklarasikan tetapi dilewati dalam sapuan bersama:
|
||||
- `vydra` karena `veo3` bawaan hanya teks dan `kling` bawaan memerlukan URL image jarak jauh
|
||||
- `generate` dengan input prompt saja
|
||||
- `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input gambar lokal berbasis buffer dalam sweep bersama
|
||||
- `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam sweep bersama
|
||||
- Provider `imageToVideo` yang saat ini dideklarasikan tetapi di-skip dalam sweep bersama:
|
||||
- `vydra` karena `veo3` bawaan hanya mendukung teks dan `kling` bawaan memerlukan URL gambar jarak jauh
|
||||
- Cakupan Vydra spesifik provider:
|
||||
- `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts`
|
||||
- file tersebut menjalankan text-to-video `veo3` ditambah lane `kling` yang secara default menggunakan fixture URL image jarak jauh
|
||||
- file itu menjalankan lane text-to-video `veo3` plus lane `kling` yang secara default menggunakan fixture URL gambar jarak jauh
|
||||
- Cakupan live `videoToVideo` saat ini:
|
||||
- `runway` hanya ketika model yang dipilih adalah `runway/gen4_aleph`
|
||||
- Provider `videoToVideo` saat ini yang dideklarasikan tetapi dilewati dalam sapuan bersama:
|
||||
- `runway` hanya saat model yang dipilih adalah `runway/gen4_aleph`
|
||||
- Provider `videoToVideo` yang saat ini dideklarasikan tetapi di-skip dalam sweep bersama:
|
||||
- `alibaba`, `qwen`, `xai` karena path tersebut saat ini memerlukan URL referensi `http(s)` / MP4 jarak jauh
|
||||
- `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 video inpaint/remix spesifik organisasi
|
||||
- `google` karena lane Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan path itu tidak diterima dalam sweep bersama
|
||||
- `openai` karena lane bersama saat ini tidak memiliki jaminan akses video inpaint/remix spesifik 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"`
|
||||
- Perilaku auth opsional:
|
||||
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksakan auth profile-store dan mengabaikan override env-only
|
||||
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override khusus env
|
||||
|
||||
## Harness live media
|
||||
|
||||
- Perintah: `pnpm test:live:media`
|
||||
- Tujuan:
|
||||
- Menjalankan suite live image, music, dan video bersama melalui entrypoint native repo tunggal
|
||||
- Menjalankan suite live gambar, musik, dan video bersama melalui satu entrypoint native repo
|
||||
- Memuat otomatis env var provider yang hilang dari `~/.profile`
|
||||
- Mempersempit otomatis tiap suite ke provider yang saat ini memiliki auth yang dapat digunakan secara default
|
||||
- Menggunakan ulang `scripts/test-live.mjs`, sehingga perilaku heartbeat dan quiet-mode 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 quiet-mode 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 untuk 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`), me-mount direktori config lokal dan workspace Anda (serta melakukan 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 sapuan Docker penuh tetap praktis:
|
||||
- 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 melakukan 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 sweep Docker penuh tetap praktis:
|
||||
`test:docker:live-models` default ke `OPENCLAW_LIVE_MAX_MODELS=12`, dan
|
||||
`test:docker:live-gateway` default ke `OPENCLAW_LIVE_GATEWAY_SMOKE=1`,
|
||||
`OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`,
|
||||
`OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`, dan
|
||||
`OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override env var tersebut saat Anda
|
||||
memang menginginkan pemindaian yang lebih besar dan menyeluruh.
|
||||
- `test:docker:all` membangun image live Docker sekali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane live Docker.
|
||||
- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` menjalankan satu atau lebih container nyata dan memverifikasi path integrasi tingkat lebih tinggi.
|
||||
memang ingin pemindaian lengkap yang lebih besar.
|
||||
- `test:docker:all` membangun image live Docker sekali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane live Docker tersebut.
|
||||
- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` mem-boot satu atau lebih container nyata dan memverifikasi path integrasi tingkat lebih tinggi.
|
||||
|
||||
Runner Docker live-model juga hanya bind-mount home auth CLI yang diperlukan (atau semua yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run sehingga OAuth CLI eksternal dapat me-refresh token tanpa mengubah auth store host:
|
||||
Runner Docker live-model juga me-mount hanya home auth CLI yang diperlukan (atau semua yang didukung saat eksekusi tidak dipersempit), lalu menyalinnya ke home container sebelum eksekusi agar OAuth CLI eksternal dapat menyegarkan token tanpa mengubah penyimpanan auth host:
|
||||
|
||||
- Model langsung: `pnpm test:docker:live-models` (script: `scripts/test-live-models-docker.sh`)
|
||||
- Smoke bind ACP: `pnpm test:docker:live-acp-bind` (script: `scripts/test-live-acp-bind-docker.sh`)
|
||||
- Smoke backend CLI: `pnpm test:docker:live-cli-backend` (script: `scripts/test-live-cli-backend-docker.sh`)
|
||||
- Gateway + agent dev: `pnpm test:docker:live-gateway` (script: `scripts/test-live-gateway-models-docker.sh`)
|
||||
- Smoke live Open WebUI: `pnpm test:docker:openwebui` (script: `scripts/e2e/openwebui-docker.sh`)
|
||||
- Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (script: `scripts/e2e/onboard-docker.sh`)
|
||||
- Jaringan gateway (dua container, auth + health WS): `pnpm test:docker:gateway-network` (script: `scripts/e2e/gateway-network-docker.sh`)
|
||||
- Bridge channel MCP (Gateway ter-seed + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (script: `scripts/e2e/mcp-channels-docker.sh`)
|
||||
- Plugin (smoke instalasi + alias `/plugin` + semantik restart bundle Claude): `pnpm test:docker:plugins` (script: `scripts/e2e/plugins-docker.sh`)
|
||||
- Model direct: `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`)
|
||||
- Smoke backend CLI: `pnpm test:docker:live-cli-backend` (skrip: `scripts/test-live-cli-backend-docker.sh`)
|
||||
- Gateway + dev agent: `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 + health WS): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`)
|
||||
- Bridge channel MCP (Gateway seed + bridge stdio + smoke raw Claude notification-frame): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`)
|
||||
- Plugins (smoke instalasi + alias `/plugin` + semantik restart Claude-bundle): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`)
|
||||
|
||||
Runner Docker live-model juga me-bind-mount checkout saat ini sebagai read-only dan
|
||||
Runner Docker live-model juga me-mount checkout saat ini sebagai read-only dan
|
||||
men-stage-nya ke workdir sementara di dalam container. Ini menjaga image runtime
|
||||
tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang tepat.
|
||||
tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda secara persis.
|
||||
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 waktu ber menit-menit menyalin
|
||||
artefak spesifik mesin.
|
||||
Runner ini juga menyetel `OPENCLAW_SKIP_CHANNELS=1` agar probe live gateway tidak memulai
|
||||
`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, serta
|
||||
direktori output `.build` lokal aplikasi atau Gradle sehingga Docker live run tidak
|
||||
menghabiskan waktu beberapa menit untuk menyalin artefak spesifik mesin.
|
||||
Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` sehingga 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 menjalankan
|
||||
container gateway OpenClaw dengan endpoint HTTP yang kompatibel OpenAI diaktifkan,
|
||||
menjalankan container Open WebUI yang dipin terhadap gateway tersebut, masuk melalui
|
||||
`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: runner ini memulai
|
||||
container gateway OpenClaw dengan endpoint HTTP yang kompatibel dengan OpenAI diaktifkan,
|
||||
memulai container Open WebUI yang dipatok terhadap gateway tersebut, melakukan sign in melalui
|
||||
Open WebUI, memverifikasi `/api/models` mengekspos `openclaw/default`, lalu mengirim
|
||||
permintaan chat nyata melalui proxy `/api/chat/completions` milik Open WebUI.
|
||||
Run pertama bisa terasa lebih lambat karena Docker mungkin perlu menarik
|
||||
image Open WebUI dan Open WebUI mungkin perlu menyelesaikan cold-start setup-nya sendiri.
|
||||
Eksekusi pertama bisa terasa lebih lambat karena Docker mungkin perlu menarik image
|
||||
Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start-nya sendiri.
|
||||
Lane ini mengharapkan key model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE`
|
||||
(`~/.profile` secara default) adalah cara utama untuk menyediakannya pada run yang di-Docker-kan.
|
||||
Run yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model":
|
||||
(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam eksekusi berbasis Docker.
|
||||
Eksekusi 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 menjalankan container Gateway
|
||||
ter-seed, memulai container kedua yang memunculkan `openclaw mcp serve`, lalu
|
||||
memverifikasi penemuan percakapan yang dirutekan, pembacaan transcript, metadata attachment,
|
||||
akun Telegram, Discord, atau iMessage nyata. Runner ini mem-boot Gateway seed
|
||||
container, memulai container kedua yang memunculkan `openclaw mcp serve`, lalu
|
||||
memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata attachment,
|
||||
perilaku antrean event live, routing pengiriman keluar, serta notifikasi channel +
|
||||
izin bergaya Claude melalui bridge stdio MCP yang nyata. Pemeriksaan notifikasi
|
||||
izin bergaya Claude melalui bridge MCP stdio yang nyata. Pemeriksaan notifikasi
|
||||
memeriksa frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang
|
||||
benar-benar dikeluarkan oleh bridge, bukan sekadar apa yang kebetulan diekspos oleh SDK klien tertentu.
|
||||
sebenarnya dipancarkan bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu.
|
||||
|
||||
Smoke thread plain-language ACP manual (bukan CI):
|
||||
Smoke thread bahasa alami ACP manual (bukan CI):
|
||||
|
||||
- `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...`
|
||||
- Pertahankan script ini untuk alur kerja regresi/debug. Script 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=...` (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_CLI_TOOLS_DIR=...` (default: `~/.cache/openclaw/docker-cli-tools`) di-mount ke `/home/node/.npm-global` untuk instalasi CLI 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
|
||||
- `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 sebagai 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 sesuai inferensi dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS`
|
||||
- Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisah koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex`
|
||||
- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit run
|
||||
- Eksekusi provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang diinferensikan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS`
|
||||
- Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex`
|
||||
- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit eksekusi
|
||||
- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter provider di dalam container
|
||||
- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memastikan kredensial berasal dari profile store (bukan env)
|
||||
- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos gateway bagi smoke Open WebUI
|
||||
- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk menimpa prompt pemeriksaan nonce yang digunakan smoke Open WebUI
|
||||
- `OPENWEBUI_IMAGE=...` untuk menimpa tag image Open WebUI yang dipin
|
||||
- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos gateway untuk smoke Open WebUI
|
||||
- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk mengganti prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI
|
||||
- `OPENWEBUI_IMAGE=...` untuk mengganti tag image Open WebUI yang dipatok
|
||||
|
||||
## Kewarasan dokumen
|
||||
## Pemeriksaan dokumentasi
|
||||
|
||||
Jalankan pemeriksaan dokumen setelah pengeditan dokumen: `pnpm check:docs`.
|
||||
Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading dalam halaman: `pnpm docs:check-links:anchors`.
|
||||
Jalankan pemeriksaan dokumen setelah mengedit dokumen: `pnpm check:docs`.
|
||||
Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading di dalam halaman: `pnpm docs:check-links:anchors`.
|
||||
|
||||
## Regresi offline (aman untuk CI)
|
||||
|
||||
Ini adalah regresi “pipeline nyata” tanpa provider nyata:
|
||||
|
||||
- Tool calling gateway (OpenAI tiruan, gateway nyata + loop agent): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop")
|
||||
- Tool calling gateway (mock OpenAI, gateway + loop agent nyata): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop")
|
||||
- Wizard gateway (WS `wizard.start`/`wizard.next`, menulis config + auth dipaksakan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config")
|
||||
|
||||
## Evaluasi keandalan agent (Skills)
|
||||
## Evals keandalan agent (Skills)
|
||||
|
||||
Kami sudah memiliki beberapa pengujian aman-CI yang berperilaku seperti “evaluasi keandalan agent”:
|
||||
Kami sudah memiliki beberapa pengujian aman untuk CI yang berperilaku seperti “evals keandalan agent”:
|
||||
|
||||
- Tool-calling tiruan melalui gateway nyata + loop agent (`src/gateway/gateway.test.ts`).
|
||||
- Mock tool-calling melalui gateway + loop agent nyata (`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)):
|
||||
Yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)):
|
||||
|
||||
- **Pengambilan keputusan:** ketika skill dicantumkan dalam prompt, apakah agent memilih skill yang tepat (atau menghindari yang tidak relevan)?
|
||||
- **Pengambilan keputusan:** saat Skills dicantumkan dalam prompt, apakah agent memilih skill yang tepat (atau menghindari yang tidak relevan)?
|
||||
- **Kepatuhan:** apakah agent membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan?
|
||||
- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan tool, carryover riwayat session, dan boundary sandbox.
|
||||
- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan tool, carryover riwayat session, dan batas sandbox.
|
||||
|
||||
Evaluasi di masa depan harus tetap deterministik terlebih dahulu:
|
||||
Evals di masa mendatang sebaiknya tetap deterministik terlebih dahulu:
|
||||
|
||||
- Scenario runner menggunakan provider tiruan untuk menegaskan pemanggilan tool + urutan, pembacaan file skill, dan wiring session.
|
||||
- Suite kecil berisi skenario berfokus pada skill (gunakan vs hindari, gating, injeksi prompt).
|
||||
- Evaluasi live opsional (opt-in, di-gate oleh env) hanya setelah suite aman-CI tersedia.
|
||||
- Runner skenario menggunakan provider mock untuk menegaskan pemanggilan tool + urutan, pembacaan file skill, dan wiring session.
|
||||
- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, prompt injection).
|
||||
- Evals live opsional (opt-in, dibatasi env) hanya setelah suite aman untuk CI tersedia.
|
||||
|
||||
## Contract test (bentuk plugin dan channel)
|
||||
## Contract tests (bentuk plugin dan channel)
|
||||
|
||||
Contract test memverifikasi bahwa setiap plugin dan channel yang terdaftar mematuhi
|
||||
kontrak interface-nya. Contract test mengiterasi semua plugin yang ditemukan dan menjalankan serangkaian
|
||||
asersi bentuk dan perilaku. Lane unit default `pnpm test` sengaja
|
||||
Contract tests memverifikasi bahwa setiap plugin dan channel yang terdaftar mematuhi
|
||||
kontrak antarmukanya. Contract tests mengiterasi semua plugin yang ditemukan dan menjalankan
|
||||
serangkaian asersi bentuk dan perilaku. Lane unit default `pnpm test` sengaja
|
||||
melewati file seam bersama dan smoke ini; jalankan perintah contract secara eksplisit
|
||||
saat Anda menyentuh surface channel atau provider bersama.
|
||||
|
||||
@ -706,9 +708,9 @@ saat Anda menyentuh surface channel atau provider bersama.
|
||||
|
||||
Terletak di `src/channels/plugins/contracts/*.contract.test.ts`:
|
||||
|
||||
- **plugin** - Bentuk plugin dasar (id, name, capabilities)
|
||||
- **setup** - Kontrak setup wizard
|
||||
- **session-binding** - Perilaku session binding
|
||||
- **plugin** - Bentuk plugin dasar (id, nama, kapabilitas)
|
||||
- **setup** - Kontrak wizard setup
|
||||
- **session-binding** - Perilaku pengikatan session
|
||||
- **outbound-payload** - Struktur payload pesan
|
||||
- **inbound** - Penanganan pesan masuk
|
||||
- **actions** - Handler aksi channel
|
||||
@ -733,26 +735,26 @@ Terletak di `src/plugins/contracts/*.contract.test.ts`:
|
||||
- **discovery** - Penemuan plugin
|
||||
- **loader** - Pemuatan plugin
|
||||
- **runtime** - Runtime provider
|
||||
- **shape** - Bentuk/interface plugin
|
||||
- **wizard** - Setup wizard
|
||||
- **shape** - Bentuk/antarmuka plugin
|
||||
- **wizard** - Wizard setup
|
||||
|
||||
### Kapan dijalankan
|
||||
### Kapan menjalankannya
|
||||
|
||||
- Setelah mengubah ekspor atau subpath plugin-sdk
|
||||
- Setelah menambahkan atau mengubah plugin channel atau provider
|
||||
- Setelah merombak registrasi atau penemuan plugin
|
||||
- Setelah menambahkan atau memodifikasi channel atau plugin provider
|
||||
- Setelah merefaktor registrasi atau penemuan plugin
|
||||
|
||||
Contract test berjalan di CI dan tidak memerlukan API key nyata.
|
||||
Contract tests berjalan di CI dan tidak memerlukan API key nyata.
|
||||
|
||||
## Menambahkan regresi (panduan)
|
||||
|
||||
Saat Anda memperbaiki masalah provider/model yang ditemukan di live:
|
||||
Saat Anda memperbaiki masalah provider/model yang ditemukan secara live:
|
||||
|
||||
- Tambahkan regresi aman-CI jika memungkinkan (provider tiruan/stub, atau tangkap transformasi bentuk request yang tepat)
|
||||
- Jika masalah itu secara inheren hanya live (rate limit, kebijakan auth), buat live test tetap sempit dan opt-in melalui env var
|
||||
- Lebih baik menargetkan lapisan terkecil yang menangkap bug:
|
||||
- bug konversi/replay request provider → direct models test
|
||||
- bug pipeline session/riwayat/tool gateway → gateway live smoke atau pengujian tiruan gateway yang aman-CI
|
||||
- Tambahkan regresi yang aman untuk CI jika memungkinkan (mock/stub provider, atau tangkap transformasi bentuk permintaan yang tepat)
|
||||
- Jika secara inheren hanya bisa live (rate limit, kebijakan auth), pertahankan live test tetap sempit dan opt-in melalui env var
|
||||
- Sebaiknya targetkan lapisan terkecil yang menangkap bug:
|
||||
- bug konversi/replay permintaan provider → direct models test
|
||||
- bug pipeline gateway session/history/tool → gateway live smoke atau pengujian mock gateway yang aman untuk CI
|
||||
- Guardrail traversal SecretRef:
|
||||
- `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata 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 sengaja gagal pada id target yang tidak terklasifikasi sehingga kelas baru tidak bisa 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 id exec traversal-segment ditolak.
|
||||
- Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian itu. Pengujian ini sengaja gagal pada id target yang tidak terklasifikasi sehingga kelas baru tidak bisa dilewati secara diam-diam.
|
||||
|
||||
@ -1,584 +0,0 @@
|
||||
---
|
||||
date: 2026-04-05T00:00:00Z
|
||||
status: active
|
||||
title: 'refactor: Menjadikan plugin-sdk paket workspace nyata secara bertahap'
|
||||
type: refactor
|
||||
x-i18n:
|
||||
generated_at: "2026-04-07T09:15:50Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: ea1ca41846363c506a0db6dbca746e840d7c71ca82bbfc5277af9e2ae7f6b070
|
||||
source_path: plans/2026-04-05-002-refactor-real-plugin-sdk-workspace-plan.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# refactor: Menjadikan plugin-sdk paket workspace nyata secara bertahap
|
||||
|
||||
## Ringkasan
|
||||
|
||||
Rencana ini memperkenalkan paket workspace nyata untuk plugin SDK di
|
||||
`packages/plugin-sdk` dan menggunakannya untuk mengikutsertakan gelombang kecil
|
||||
pertama dari ekstensi ke batas paket yang ditegakkan compiler. Tujuannya adalah
|
||||
membuat impor relatif ilegal gagal di bawah `tsc` normal untuk sekumpulan
|
||||
ekstensi provider bawaan yang dipilih, tanpa memaksakan migrasi seluruh repo
|
||||
atau permukaan konflik merge yang besar.
|
||||
|
||||
Langkah inkremental kuncinya adalah menjalankan dua mode secara paralel untuk
|
||||
sementara waktu:
|
||||
|
||||
| Mode | Bentuk impor | Siapa yang menggunakannya | Penegakan |
|
||||
| ----------- | ----------------------- | ------------------------------------ | -------------------------------------------- |
|
||||
| Mode lama | `openclaw/plugin-sdk/*` | semua ekstensi yang belum ikut serta | perilaku permisif saat ini tetap dipertahankan |
|
||||
| Mode opt-in | `@openclaw/plugin-sdk/*` | hanya ekstensi gelombang pertama | `rootDir` lokal-paket + referensi project |
|
||||
|
||||
## Kerangka masalah
|
||||
|
||||
Repo saat ini mengekspor permukaan plugin SDK publik yang besar, tetapi itu
|
||||
bukan paket workspace nyata. Sebaliknya:
|
||||
|
||||
- `tsconfig.json` root memetakan `openclaw/plugin-sdk/*` langsung ke
|
||||
`src/plugin-sdk/*.ts`
|
||||
- ekstensi yang belum ikut serta dalam eksperimen sebelumnya masih berbagi
|
||||
perilaku alias source global tersebut
|
||||
- menambahkan `rootDir` hanya bekerja ketika impor SDK yang diizinkan berhenti
|
||||
di-resolve ke source repo mentah
|
||||
|
||||
Itu berarti repo dapat mendeskripsikan kebijakan batas yang diinginkan, tetapi
|
||||
TypeScript tidak menegakkannya secara bersih untuk sebagian besar ekstensi.
|
||||
|
||||
Yang Anda inginkan adalah jalur inkremental yang:
|
||||
|
||||
- menjadikan `plugin-sdk` nyata
|
||||
- memindahkan SDK menuju paket workspace bernama `@openclaw/plugin-sdk`
|
||||
- hanya mengubah sekitar 10 ekstensi dalam PR pertama
|
||||
- membiarkan sisa tree ekstensi tetap memakai skema lama sampai pembersihan berikutnya
|
||||
- menghindari alur kerja `tsconfig.plugin-sdk.dts.json` + deklarasi hasil generate postinstall
|
||||
sebagai mekanisme utama untuk rollout gelombang pertama
|
||||
|
||||
## Jejak kebutuhan
|
||||
|
||||
- R1. Buat paket workspace nyata untuk plugin SDK di bawah `packages/`.
|
||||
- R2. Beri nama paket baru `@openclaw/plugin-sdk`.
|
||||
- R3. Berikan paket SDK baru `package.json` dan `tsconfig.json` miliknya sendiri.
|
||||
- R4. Tetap buat impor lama `openclaw/plugin-sdk/*` berfungsi untuk ekstensi
|
||||
yang belum ikut serta selama masa migrasi.
|
||||
- R5. Ikutsertakan hanya gelombang kecil pertama ekstensi dalam PR pertama.
|
||||
- R6. Ekstensi gelombang pertama harus gagal tertutup untuk impor relatif yang keluar
|
||||
dari root paket mereka.
|
||||
- R7. Ekstensi gelombang pertama harus mengonsumsi SDK melalui dependensi paket
|
||||
dan referensi project TS, bukan melalui alias `paths` root.
|
||||
- R8. Rencana ini harus menghindari langkah wajib generate postinstall seluruh repo
|
||||
untuk kebenaran editor.
|
||||
- R9. Rollout gelombang pertama harus dapat ditinjau dan dapat di-merge sebagai PR
|
||||
berukuran sedang, bukan refaktor seluruh repo dengan 300+ file.
|
||||
|
||||
## Batas cakupan
|
||||
|
||||
- Tidak ada migrasi penuh semua ekstensi bawaan dalam PR pertama.
|
||||
- Tidak ada keharusan menghapus `src/plugin-sdk` dalam PR pertama.
|
||||
- Tidak ada keharusan memasang ulang setiap path build atau test root agar
|
||||
segera menggunakan paket baru.
|
||||
- Tidak ada upaya memaksa squiggle VS Code untuk setiap ekstensi yang belum ikut serta.
|
||||
- Tidak ada pembersihan lint luas untuk sisa tree ekstensi.
|
||||
- Tidak ada perubahan perilaku runtime besar di luar resolusi impor, kepemilikan
|
||||
paket, dan penegakan batas untuk ekstensi yang ikut serta.
|
||||
|
||||
## Konteks & riset
|
||||
|
||||
### Kode dan pola yang relevan
|
||||
|
||||
- `pnpm-workspace.yaml` sudah mencakup `packages/*` dan `extensions/*`, jadi
|
||||
paket workspace baru di bawah `packages/plugin-sdk` sesuai dengan tata letak
|
||||
repo yang ada.
|
||||
- Paket workspace yang ada seperti `packages/memory-host-sdk/package.json`
|
||||
dan `packages/plugin-package-contract/package.json` sudah menggunakan peta
|
||||
`exports` lokal-paket yang berakar di `src/*.ts`.
|
||||
- `package.json` root saat ini memublikasikan permukaan SDK melalui `./plugin-sdk`
|
||||
dan `./plugin-sdk/*` exports yang didukung oleh `dist/plugin-sdk/*.js` dan
|
||||
`dist/plugin-sdk/*.d.ts`.
|
||||
- `src/plugin-sdk/entrypoints.ts` dan `scripts/lib/plugin-sdk-entrypoints.json`
|
||||
sudah bertindak sebagai inventaris entrypoint kanonis untuk permukaan SDK.
|
||||
- `tsconfig.json` root saat ini memetakan:
|
||||
- `openclaw/plugin-sdk` -> `src/plugin-sdk/index.ts`
|
||||
- `openclaw/plugin-sdk/*` -> `src/plugin-sdk/*.ts`
|
||||
- Eksperimen batas sebelumnya menunjukkan bahwa `rootDir` lokal-paket bekerja untuk
|
||||
impor relatif ilegal hanya setelah impor SDK yang diizinkan berhenti di-resolve ke source mentah
|
||||
di luar paket ekstensi.
|
||||
|
||||
### Kumpulan ekstensi gelombang pertama
|
||||
|
||||
Rencana ini mengasumsikan gelombang pertama adalah kumpulan yang berat di provider
|
||||
dan paling kecil kemungkinannya menarik edge case runtime channel yang kompleks:
|
||||
|
||||
- `extensions/anthropic`
|
||||
- `extensions/exa`
|
||||
- `extensions/firecrawl`
|
||||
- `extensions/groq`
|
||||
- `extensions/mistral`
|
||||
- `extensions/openai`
|
||||
- `extensions/perplexity`
|
||||
- `extensions/tavily`
|
||||
- `extensions/together`
|
||||
- `extensions/xai`
|
||||
|
||||
### Inventaris permukaan SDK gelombang pertama
|
||||
|
||||
Ekstensi gelombang pertama saat ini mengimpor subset subpath SDK yang dapat
|
||||
dikelola. Paket `@openclaw/plugin-sdk` awal hanya perlu mencakup yang berikut:
|
||||
|
||||
- `agent-runtime`
|
||||
- `cli-runtime`
|
||||
- `config-runtime`
|
||||
- `core`
|
||||
- `image-generation`
|
||||
- `media-runtime`
|
||||
- `media-understanding`
|
||||
- `plugin-entry`
|
||||
- `plugin-runtime`
|
||||
- `provider-auth`
|
||||
- `provider-auth-api-key`
|
||||
- `provider-auth-login`
|
||||
- `provider-auth-runtime`
|
||||
- `provider-catalog-shared`
|
||||
- `provider-entry`
|
||||
- `provider-http`
|
||||
- `provider-model-shared`
|
||||
- `provider-onboard`
|
||||
- `provider-stream-family`
|
||||
- `provider-stream-shared`
|
||||
- `provider-tools`
|
||||
- `provider-usage`
|
||||
- `provider-web-fetch`
|
||||
- `provider-web-search`
|
||||
- `realtime-transcription`
|
||||
- `realtime-voice`
|
||||
- `runtime-env`
|
||||
- `secret-input`
|
||||
- `security-runtime`
|
||||
- `speech`
|
||||
- `testing`
|
||||
|
||||
### Pembelajaran institusional
|
||||
|
||||
- Tidak ada entri `docs/solutions/` yang relevan di worktree ini.
|
||||
|
||||
### Referensi eksternal
|
||||
|
||||
- Tidak diperlukan riset eksternal untuk rencana ini. Repo sudah berisi pola
|
||||
paket workspace dan ekspor SDK yang relevan.
|
||||
|
||||
## Keputusan teknis utama
|
||||
|
||||
- Perkenalkan `@openclaw/plugin-sdk` sebagai paket workspace baru sambil
|
||||
mempertahankan permukaan lama root `openclaw/plugin-sdk/*` selama migrasi.
|
||||
Alasan: ini memungkinkan sekumpulan ekstensi gelombang pertama berpindah ke
|
||||
resolusi paket nyata tanpa memaksa setiap ekstensi dan setiap path build root
|
||||
berubah sekaligus.
|
||||
|
||||
- Gunakan config basis batas opt-in khusus seperti
|
||||
`extensions/tsconfig.package-boundary.base.json` alih-alih mengganti basis
|
||||
ekstensi yang ada untuk semua orang.
|
||||
Alasan: repo perlu mendukung mode ekstensi lama dan opt-in secara bersamaan
|
||||
selama migrasi.
|
||||
|
||||
- Gunakan referensi project TS dari ekstensi gelombang pertama ke
|
||||
`packages/plugin-sdk/tsconfig.json` dan set
|
||||
`disableSourceOfProjectReferenceRedirect` untuk mode batas opt-in.
|
||||
Alasan: ini memberi `tsc` graf paket nyata sambil mengurangi fallback editor dan
|
||||
compiler ke penelusuran source mentah.
|
||||
|
||||
- Pertahankan `@openclaw/plugin-sdk` sebagai private pada gelombang pertama.
|
||||
Alasan: tujuan langsungnya adalah penegakan batas internal dan keamanan
|
||||
migrasi, bukan memublikasikan kontrak SDK eksternal kedua sebelum permukaannya
|
||||
stabil.
|
||||
|
||||
- Pindahkan hanya subpath SDK gelombang pertama dalam irisan implementasi pertama,
|
||||
dan pertahankan jembatan kompatibilitas untuk sisanya.
|
||||
Alasan: memindahkan secara fisik semua 315 file `src/plugin-sdk/*.ts` dalam
|
||||
satu PR justru menciptakan permukaan konflik merge yang coba dihindari rencana ini.
|
||||
|
||||
- Jangan mengandalkan `scripts/postinstall-bundled-plugins.mjs` untuk membangun
|
||||
deklarasi SDK pada gelombang pertama.
|
||||
Alasan: alur build/referensi yang eksplisit lebih mudah dipahami dan membuat
|
||||
perilaku repo lebih dapat diprediksi.
|
||||
|
||||
## Pertanyaan terbuka
|
||||
|
||||
### Diselesaikan selama perencanaan
|
||||
|
||||
- Ekstensi mana yang harus masuk gelombang pertama?
|
||||
Gunakan 10 ekstensi provider/web-search yang tercantum di atas karena secara
|
||||
struktural lebih terisolasi dibanding paket channel yang lebih berat.
|
||||
|
||||
- Haruskah PR pertama mengganti seluruh tree ekstensi?
|
||||
Tidak. PR pertama harus mendukung dua mode secara paralel dan hanya
|
||||
mengikutsertakan gelombang pertama.
|
||||
|
||||
- Haruskah gelombang pertama memerlukan build deklarasi postinstall?
|
||||
Tidak. Graf paket/referensi harus eksplisit, dan CI harus menjalankan
|
||||
typecheck lokal-paket yang relevan secara sengaja.
|
||||
|
||||
### Ditunda ke implementasi
|
||||
|
||||
- Apakah paket gelombang pertama dapat menunjuk langsung ke `src/*.ts`
|
||||
lokal-paket hanya melalui referensi project, atau apakah langkah kecil emisi deklarasi
|
||||
masih diperlukan untuk paket `@openclaw/plugin-sdk`.
|
||||
Ini adalah pertanyaan validasi graf TS yang dimiliki implementasi.
|
||||
|
||||
- Apakah paket root `openclaw` seharusnya memproksikan subpath SDK gelombang pertama ke
|
||||
output `packages/plugin-sdk` segera atau tetap menggunakan shim kompatibilitas hasil generate
|
||||
di bawah `src/plugin-sdk`.
|
||||
Ini adalah detail kompatibilitas dan bentuk build yang bergantung pada jalur
|
||||
implementasi minimal yang menjaga CI tetap hijau.
|
||||
|
||||
## Desain teknis tingkat tinggi
|
||||
|
||||
> Ini menggambarkan pendekatan yang dimaksud dan merupakan panduan arah untuk peninjauan, bukan spesifikasi implementasi. Agen pelaksana harus memperlakukannya sebagai konteks, bukan kode yang harus direproduksi.
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph Legacy["Ekstensi lama (tidak berubah)"]
|
||||
L1["extensions/*\nopenclaw/plugin-sdk/*"]
|
||||
L2["paths tsconfig root"]
|
||||
L1 --> L2
|
||||
L2 --> L3["src/plugin-sdk/*"]
|
||||
end
|
||||
|
||||
subgraph OptIn["Ekstensi gelombang pertama"]
|
||||
O1["10 ekstensi yang ikut serta"]
|
||||
O2["extensions/tsconfig.package-boundary.base.json"]
|
||||
O3["rootDir = '.'\nreferensi project"]
|
||||
O4["@openclaw/plugin-sdk"]
|
||||
O1 --> O2
|
||||
O2 --> O3
|
||||
O3 --> O4
|
||||
end
|
||||
|
||||
subgraph SDK["Paket workspace baru"]
|
||||
P1["packages/plugin-sdk/package.json"]
|
||||
P2["packages/plugin-sdk/tsconfig.json"]
|
||||
P3["packages/plugin-sdk/src/<subpath-gelombang-pertama>.ts"]
|
||||
P1 --> P2
|
||||
P2 --> P3
|
||||
end
|
||||
|
||||
O4 --> SDK
|
||||
```
|
||||
|
||||
## Unit implementasi
|
||||
|
||||
- [ ] **Unit 1: Perkenalkan paket workspace nyata `@openclaw/plugin-sdk`**
|
||||
|
||||
**Tujuan:** Buat paket workspace nyata untuk SDK yang dapat memiliki
|
||||
permukaan gelombang pertama tanpa memaksakan migrasi seluruh repo.
|
||||
|
||||
**Kebutuhan:** R1, R2, R3, R8, R9
|
||||
|
||||
**Dependensi:** Tidak ada
|
||||
|
||||
**File:**
|
||||
|
||||
- Buat: `packages/plugin-sdk/package.json`
|
||||
- Buat: `packages/plugin-sdk/tsconfig.json`
|
||||
- Buat: `packages/plugin-sdk/src/index.ts`
|
||||
- Buat: `packages/plugin-sdk/src/*.ts` untuk subpath SDK gelombang pertama
|
||||
- Ubah: `pnpm-workspace.yaml` hanya jika penyesuaian glob paket diperlukan
|
||||
- Ubah: `package.json`
|
||||
- Ubah: `src/plugin-sdk/entrypoints.ts`
|
||||
- Ubah: `scripts/lib/plugin-sdk-entrypoints.json`
|
||||
- Test: `src/plugins/contracts/plugin-sdk-workspace-package.contract.test.ts`
|
||||
|
||||
**Pendekatan:**
|
||||
|
||||
- Tambahkan paket workspace baru bernama `@openclaw/plugin-sdk`.
|
||||
- Mulai hanya dengan subpath SDK gelombang pertama, bukan seluruh tree 315 file.
|
||||
- Jika memindahkan entrypoint gelombang pertama secara langsung akan menciptakan diff yang terlalu besar,
|
||||
PR pertama dapat memperkenalkan subpath tersebut di `packages/plugin-sdk/src` sebagai wrapper paket tipis terlebih dahulu
|
||||
lalu membalik source of truth ke paket dalam PR lanjutan untuk klaster subpath itu.
|
||||
- Gunakan kembali machinery inventaris entrypoint yang ada agar permukaan paket gelombang pertama
|
||||
dideklarasikan di satu tempat kanonis.
|
||||
- Pertahankan ekspor paket root tetap hidup untuk pengguna lama sementara paket workspace
|
||||
menjadi kontrak opt-in yang baru.
|
||||
|
||||
**Pola yang harus diikuti:**
|
||||
|
||||
- `packages/memory-host-sdk/package.json`
|
||||
- `packages/plugin-package-contract/package.json`
|
||||
- `src/plugin-sdk/entrypoints.ts`
|
||||
|
||||
**Skenario test:**
|
||||
|
||||
- Jalur berhasil: paket workspace mengekspor setiap subpath gelombang pertama yang
|
||||
tercantum dalam rencana dan tidak ada ekspor gelombang pertama yang wajib hilang.
|
||||
- Edge case: metadata ekspor paket tetap stabil saat daftar entry gelombang pertama
|
||||
di-generate ulang atau dibandingkan terhadap inventaris kanonis.
|
||||
- Integrasi: ekspor SDK root lama tetap ada setelah memperkenalkan paket workspace baru.
|
||||
|
||||
**Verifikasi:**
|
||||
|
||||
- Repo berisi paket workspace `@openclaw/plugin-sdk` yang valid dengan peta ekspor gelombang pertama
|
||||
yang stabil dan tanpa regresi ekspor lama di `package.json` root.
|
||||
|
||||
- [ ] **Unit 2: Tambahkan mode batas TS opt-in untuk ekstensi yang ditegakkan paket**
|
||||
|
||||
**Tujuan:** Definisikan mode konfigurasi TS yang akan digunakan oleh ekstensi
|
||||
yang ikut serta, sambil membiarkan perilaku TS ekstensi yang ada tidak berubah
|
||||
untuk semua yang lain.
|
||||
|
||||
**Kebutuhan:** R4, R6, R7, R8, R9
|
||||
|
||||
**Dependensi:** Unit 1
|
||||
|
||||
**File:**
|
||||
|
||||
- Buat: `extensions/tsconfig.package-boundary.base.json`
|
||||
- Buat: `tsconfig.boundary-optin.json`
|
||||
- Ubah: `extensions/xai/tsconfig.json`
|
||||
- Ubah: `extensions/openai/tsconfig.json`
|
||||
- Ubah: `extensions/anthropic/tsconfig.json`
|
||||
- Ubah: `extensions/mistral/tsconfig.json`
|
||||
- Ubah: `extensions/groq/tsconfig.json`
|
||||
- Ubah: `extensions/together/tsconfig.json`
|
||||
- Ubah: `extensions/perplexity/tsconfig.json`
|
||||
- Ubah: `extensions/tavily/tsconfig.json`
|
||||
- Ubah: `extensions/exa/tsconfig.json`
|
||||
- Ubah: `extensions/firecrawl/tsconfig.json`
|
||||
- Test: `src/plugins/contracts/extension-package-project-boundaries.test.ts`
|
||||
- Test: `test/extension-package-tsc-boundary.test.ts`
|
||||
|
||||
**Pendekatan:**
|
||||
|
||||
- Biarkan `extensions/tsconfig.base.json` tetap ada untuk ekstensi lama.
|
||||
- Tambahkan config basis opt-in baru yang:
|
||||
- menetapkan `rootDir: "."`
|
||||
- mereferensikan `packages/plugin-sdk`
|
||||
- mengaktifkan `composite`
|
||||
- menonaktifkan pengalihan source referensi project bila diperlukan
|
||||
- Tambahkan config solution khusus untuk graf typecheck gelombang pertama alih-alih
|
||||
membentuk ulang project TS repo root dalam PR yang sama.
|
||||
|
||||
**Catatan eksekusi:** Mulailah dengan typecheck canary lokal-paket yang gagal untuk satu
|
||||
ekstensi yang ikut serta sebelum menerapkan pola tersebut ke semua 10 ekstensi.
|
||||
|
||||
**Pola yang harus diikuti:**
|
||||
|
||||
- Pola `tsconfig.json` lokal-ekstensi yang ada dari pekerjaan batas sebelumnya
|
||||
- Pola paket workspace dari `packages/memory-host-sdk`
|
||||
|
||||
**Skenario test:**
|
||||
|
||||
- Jalur berhasil: setiap ekstensi yang ikut serta berhasil typecheck melalui
|
||||
config TS batas paket.
|
||||
- Jalur error: impor relatif canary dari `../../src/cli/acp-cli.ts` gagal
|
||||
dengan `TS6059` untuk ekstensi yang ikut serta.
|
||||
- Integrasi: ekstensi yang belum ikut serta tetap tidak berubah dan tidak perlu
|
||||
berpartisipasi dalam config solution baru.
|
||||
|
||||
**Verifikasi:**
|
||||
|
||||
- Ada graf typecheck khusus untuk 10 ekstensi yang ikut serta, dan impor relatif
|
||||
buruk dari salah satu di antaranya gagal melalui `tsc` normal.
|
||||
|
||||
- [ ] **Unit 3: Migrasikan ekstensi gelombang pertama ke `@openclaw/plugin-sdk`**
|
||||
|
||||
**Tujuan:** Ubah ekstensi gelombang pertama agar mengonsumsi paket SDK nyata
|
||||
melalui metadata dependensi, referensi project, dan impor nama paket.
|
||||
|
||||
**Kebutuhan:** R5, R6, R7, R9
|
||||
|
||||
**Dependensi:** Unit 2
|
||||
|
||||
**File:**
|
||||
|
||||
- Ubah: `extensions/anthropic/package.json`
|
||||
- Ubah: `extensions/exa/package.json`
|
||||
- Ubah: `extensions/firecrawl/package.json`
|
||||
- Ubah: `extensions/groq/package.json`
|
||||
- Ubah: `extensions/mistral/package.json`
|
||||
- Ubah: `extensions/openai/package.json`
|
||||
- Ubah: `extensions/perplexity/package.json`
|
||||
- Ubah: `extensions/tavily/package.json`
|
||||
- Ubah: `extensions/together/package.json`
|
||||
- Ubah: `extensions/xai/package.json`
|
||||
- Ubah: impor produksi dan test di bawah masing-masing dari 10 root ekstensi yang
|
||||
saat ini mereferensikan `openclaw/plugin-sdk/*`
|
||||
|
||||
**Pendekatan:**
|
||||
|
||||
- Tambahkan `@openclaw/plugin-sdk: workspace:*` ke `devDependencies`
|
||||
ekstensi gelombang pertama.
|
||||
- Ganti impor `openclaw/plugin-sdk/*` di paket tersebut dengan
|
||||
`@openclaw/plugin-sdk/*`.
|
||||
- Pertahankan impor internal-lokal ekstensi pada barrel lokal seperti `./api.ts` dan
|
||||
`./runtime-api.ts`.
|
||||
- Jangan ubah ekstensi yang belum ikut serta dalam PR ini.
|
||||
|
||||
**Pola yang harus diikuti:**
|
||||
|
||||
- Barrel impor lokal-ekstensi yang ada (`api.ts`, `runtime-api.ts`)
|
||||
- Bentuk dependensi paket yang digunakan oleh paket workspace `@openclaw/*` lainnya
|
||||
|
||||
**Skenario test:**
|
||||
|
||||
- Jalur berhasil: setiap ekstensi yang dimigrasikan tetap mendaftar/memuat melalui
|
||||
test plugin yang ada setelah penulisan ulang impor.
|
||||
- Edge case: impor SDK hanya-untuk-test di kumpulan ekstensi yang ikut serta tetap
|
||||
di-resolve dengan benar melalui paket baru.
|
||||
- Integrasi: ekstensi yang dimigrasikan tidak memerlukan alias root
|
||||
`openclaw/plugin-sdk/*` untuk typecheck.
|
||||
|
||||
**Verifikasi:**
|
||||
|
||||
- Ekstensi gelombang pertama build dan test terhadap `@openclaw/plugin-sdk`
|
||||
tanpa memerlukan path alias SDK root lama.
|
||||
|
||||
- [ ] **Unit 4: Pertahankan kompatibilitas lama saat migrasi masih parsial**
|
||||
|
||||
**Tujuan:** Pertahankan sisa repo tetap berfungsi saat SDK ada dalam bentuk lama
|
||||
dan paket baru selama migrasi.
|
||||
|
||||
**Kebutuhan:** R4, R8, R9
|
||||
|
||||
**Dependensi:** Unit 1-3
|
||||
|
||||
**File:**
|
||||
|
||||
- Ubah: `src/plugin-sdk/*.ts` untuk shim kompatibilitas gelombang pertama bila diperlukan
|
||||
- Ubah: `package.json`
|
||||
- Ubah: plumbing build atau ekspor yang merakit artefak SDK
|
||||
- Test: `src/plugins/contracts/plugin-sdk-runtime-api-guardrails.test.ts`
|
||||
- Test: `src/plugins/contracts/plugin-sdk-index.bundle.test.ts`
|
||||
|
||||
**Pendekatan:**
|
||||
|
||||
- Pertahankan root `openclaw/plugin-sdk/*` sebagai permukaan kompatibilitas untuk
|
||||
ekstensi lama dan untuk konsumen eksternal yang belum berpindah.
|
||||
- Gunakan shim hasil generate atau wiring proksi ekspor root untuk subpath
|
||||
gelombang pertama yang sudah dipindahkan ke `packages/plugin-sdk`.
|
||||
- Jangan mencoba memensiunkan permukaan SDK root pada fase ini.
|
||||
|
||||
**Pola yang harus diikuti:**
|
||||
|
||||
- Generate ekspor SDK root yang ada melalui `src/plugin-sdk/entrypoints.ts`
|
||||
- Kompatibilitas ekspor paket yang ada di `package.json` root
|
||||
|
||||
**Skenario test:**
|
||||
|
||||
- Jalur berhasil: impor SDK root lama masih di-resolve untuk ekstensi yang belum ikut serta
|
||||
setelah paket baru ada.
|
||||
- Edge case: subpath gelombang pertama bekerja melalui permukaan root lama dan
|
||||
permukaan paket baru selama masa migrasi.
|
||||
- Integrasi: test kontrak indeks/bundle plugin-sdk tetap melihat permukaan publik
|
||||
yang koheren.
|
||||
|
||||
**Verifikasi:**
|
||||
|
||||
- Repo mendukung mode konsumsi SDK lama dan opt-in tanpa
|
||||
merusak ekstensi yang tidak berubah.
|
||||
|
||||
- [ ] **Unit 5: Tambahkan penegakan terarah dan dokumentasikan kontrak migrasi**
|
||||
|
||||
**Tujuan:** Terapkan panduan CI dan kontributor yang menegakkan perilaku baru untuk
|
||||
gelombang pertama tanpa berpura-pura seluruh tree ekstensi sudah dimigrasikan.
|
||||
|
||||
**Kebutuhan:** R5, R6, R8, R9
|
||||
|
||||
**Dependensi:** Unit 1-4
|
||||
|
||||
**File:**
|
||||
|
||||
- Ubah: `package.json`
|
||||
- Ubah: file workflow CI yang harus menjalankan typecheck batas opt-in
|
||||
- Ubah: `AGENTS.md`
|
||||
- Ubah: `docs/plugins/sdk-overview.md`
|
||||
- Ubah: `docs/plugins/sdk-entrypoints.md`
|
||||
- Ubah: `docs/plans/2026-04-05-001-refactor-extension-package-resolution-boundary-plan.md`
|
||||
|
||||
**Pendekatan:**
|
||||
|
||||
- Tambahkan gate gelombang pertama yang eksplisit, seperti solution `tsc -b` khusus untuk
|
||||
`packages/plugin-sdk` plus 10 ekstensi yang ikut serta.
|
||||
- Dokumentasikan bahwa repo sekarang mendukung mode ekstensi lama dan opt-in,
|
||||
dan bahwa pekerjaan batas ekstensi baru sebaiknya memilih jalur paket baru.
|
||||
- Catat aturan migrasi gelombang berikutnya agar PR berikutnya dapat menambahkan lebih banyak ekstensi
|
||||
tanpa memperdebatkan ulang arsitekturnya.
|
||||
|
||||
**Pola yang harus diikuti:**
|
||||
|
||||
- Test kontrak yang ada di bawah `src/plugins/contracts/`
|
||||
- Pembaruan docs yang ada yang menjelaskan migrasi bertahap
|
||||
|
||||
**Skenario test:**
|
||||
|
||||
- Jalur berhasil: gate typecheck gelombang pertama yang baru lolos untuk paket workspace
|
||||
dan ekstensi yang ikut serta.
|
||||
- Jalur error: memperkenalkan impor relatif ilegal baru di ekstensi yang ikut serta
|
||||
menggagalkan gate typecheck terarah.
|
||||
- Integrasi: CI belum mengharuskan ekstensi yang belum ikut serta memenuhi mode
|
||||
batas paket baru.
|
||||
|
||||
**Verifikasi:**
|
||||
|
||||
- Jalur penegakan gelombang pertama terdokumentasi, teruji, dan dapat dijalankan
|
||||
tanpa memaksa seluruh tree ekstensi bermigrasi.
|
||||
|
||||
## Dampak seluruh sistem
|
||||
|
||||
- **Graf interaksi:** pekerjaan ini menyentuh source of truth SDK, ekspor paket
|
||||
root, metadata paket ekstensi, tata letak graf TS, dan verifikasi CI.
|
||||
- **Propagasi error:** mode kegagalan utama yang dimaksud menjadi error TS saat compile-time
|
||||
(`TS6059`) pada ekstensi yang ikut serta alih-alih kegagalan khusus berbasis script.
|
||||
- **Risiko siklus hidup state:** migrasi dua permukaan memperkenalkan risiko drift antara
|
||||
ekspor kompatibilitas root dan paket workspace baru.
|
||||
- **Paritas permukaan API:** subpath gelombang pertama harus tetap identik secara semantik
|
||||
melalui `openclaw/plugin-sdk/*` dan `@openclaw/plugin-sdk/*` selama
|
||||
transisi.
|
||||
- **Cakupan integrasi:** test unit tidak cukup; typecheck graf paket terarah
|
||||
diperlukan untuk membuktikan batas.
|
||||
- **Invarian yang tidak berubah:** ekstensi yang belum ikut serta mempertahankan perilaku saat ini
|
||||
di PR 1. Rencana ini tidak mengklaim penegakan batas impor seluruh repo.
|
||||
|
||||
## Risiko & dependensi
|
||||
|
||||
| Risiko | Mitigasi |
|
||||
| -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
||||
| Paket gelombang pertama masih di-resolve kembali ke source mentah dan `rootDir` tidak benar-benar gagal tertutup | Jadikan langkah implementasi pertama sebagai canary referensi paket pada satu ekstensi yang ikut serta sebelum diperluas ke set penuh |
|
||||
| Memindahkan terlalu banyak source SDK sekaligus menciptakan kembali masalah konflik merge semula | Pindahkan hanya subpath gelombang pertama dalam PR pertama dan pertahankan jembatan kompatibilitas root |
|
||||
| Permukaan SDK lama dan baru menyimpang secara semantik | Pertahankan inventaris entrypoint tunggal, tambahkan test kontrak kompatibilitas, dan buat paritas dua permukaan menjadi eksplisit |
|
||||
| Path build/test repo root tanpa sengaja mulai bergantung pada paket baru dengan cara yang tidak terkendali | Gunakan config solution opt-in khusus dan jauhkan perubahan topologi TS seluruh root dari PR pertama |
|
||||
|
||||
## Pengiriman bertahap
|
||||
|
||||
### Fase 1
|
||||
|
||||
- Perkenalkan `@openclaw/plugin-sdk`
|
||||
- Definisikan permukaan subpath gelombang pertama
|
||||
- Buktikan satu ekstensi yang ikut serta dapat gagal tertutup melalui `rootDir`
|
||||
|
||||
### Fase 2
|
||||
|
||||
- Ikutsertakan 10 ekstensi gelombang pertama
|
||||
- Pertahankan kompatibilitas root untuk semua yang lain
|
||||
|
||||
### Fase 3
|
||||
|
||||
- Tambahkan lebih banyak ekstensi di PR berikutnya
|
||||
- Pindahkan lebih banyak subpath SDK ke paket workspace
|
||||
- Pensiunkan kompatibilitas root hanya setelah kumpulan ekstensi lama sudah tidak ada
|
||||
|
||||
## Catatan dokumentasi / operasional
|
||||
|
||||
- PR pertama harus secara eksplisit mendeskripsikan dirinya sebagai migrasi dual-mode, bukan
|
||||
penyelesaian penegakan seluruh repo.
|
||||
- Panduan migrasi harus memudahkan PR berikutnya untuk menambahkan lebih banyak ekstensi
|
||||
dengan mengikuti pola paket/dependensi/referensi yang sama.
|
||||
|
||||
## Sumber & referensi
|
||||
|
||||
- Rencana sebelumnya: `docs/plans/2026-04-05-001-refactor-extension-package-resolution-boundary-plan.md`
|
||||
- Konfigurasi workspace: `pnpm-workspace.yaml`
|
||||
- Inventaris entrypoint SDK yang ada: `src/plugin-sdk/entrypoints.ts`
|
||||
- Ekspor SDK root yang ada: `package.json`
|
||||
- Pola paket workspace yang ada:
|
||||
- `packages/memory-host-sdk/package.json`
|
||||
- `packages/plugin-package-contract/package.json`
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,67 +1,67 @@
|
||||
---
|
||||
read_when:
|
||||
- Anda sedang membangun plugin OpenClaw
|
||||
- Anda perlu merilis skema config plugin atau men-debug error validasi plugin
|
||||
summary: Manifest plugin + persyaratan skema JSON (validasi config ketat)
|
||||
title: Manifest Plugin
|
||||
- Anda perlu merilis skema konfigurasi plugin atau men-debug error validasi plugin
|
||||
summary: Manifes plugin + persyaratan skema JSON (validasi konfigurasi ketat)
|
||||
title: Manifes Plugin
|
||||
x-i18n:
|
||||
generated_at: "2026-04-07T09:16:21Z"
|
||||
generated_at: "2026-04-09T01:28:53Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 22d41b9f8748b1b1b066ee856be4a8f41e88b9a8bc073d74fc79d2bb0982f01a
|
||||
source_hash: 9a7ee4b621a801d2a8f32f8976b0e1d9433c7810eb360aca466031fc0ffb286a
|
||||
source_path: plugins/manifest.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Manifest plugin (openclaw.plugin.json)
|
||||
# Manifes plugin (openclaw.plugin.json)
|
||||
|
||||
Halaman ini hanya untuk **manifest plugin OpenClaw native**.
|
||||
Halaman ini hanya untuk **manifes plugin OpenClaw native**.
|
||||
|
||||
Untuk tata letak bundle yang kompatibel, lihat [Plugin bundles](/id/plugins/bundles).
|
||||
Untuk layout bundle yang kompatibel, lihat [Bundle plugin](/id/plugins/bundles).
|
||||
|
||||
Format bundle yang kompatibel menggunakan file manifest yang berbeda:
|
||||
Format bundle yang kompatibel menggunakan file manifes yang berbeda:
|
||||
|
||||
- Bundle Codex: `.codex-plugin/plugin.json`
|
||||
- Bundle Claude: `.claude-plugin/plugin.json` atau tata letak komponen Claude
|
||||
default tanpa manifest
|
||||
- Bundle Claude: `.claude-plugin/plugin.json` atau layout komponen Claude default
|
||||
tanpa manifes
|
||||
- Bundle Cursor: `.cursor-plugin/plugin.json`
|
||||
|
||||
OpenClaw juga mendeteksi otomatis tata letak bundle tersebut, tetapi tidak divalidasi
|
||||
OpenClaw juga mendeteksi otomatis layout bundle tersebut, tetapi tidak divalidasi
|
||||
terhadap skema `openclaw.plugin.json` yang dijelaskan di sini.
|
||||
|
||||
Untuk bundle yang kompatibel, OpenClaw saat ini membaca metadata bundle plus root
|
||||
skill yang dideklarasikan, root perintah Claude, default `settings.json` bundle Claude,
|
||||
default LSP bundle Claude, dan hook pack yang didukung saat tata letaknya cocok
|
||||
Untuk bundle yang kompatibel, OpenClaw saat ini membaca metadata bundle serta
|
||||
root Skills yang dideklarasikan, root perintah Claude, default `settings.json` bundle Claude,
|
||||
default LSP bundle Claude, dan pack hook yang didukung saat layout sesuai
|
||||
dengan ekspektasi runtime OpenClaw.
|
||||
|
||||
Setiap plugin OpenClaw native **harus** menyertakan file `openclaw.plugin.json` di
|
||||
**root plugin**. OpenClaw menggunakan manifest ini untuk memvalidasi konfigurasi
|
||||
**tanpa mengeksekusi kode plugin**. Manifest yang hilang atau tidak valid diperlakukan sebagai
|
||||
error plugin dan memblokir validasi config.
|
||||
**root plugin**. OpenClaw menggunakan manifes ini untuk memvalidasi konfigurasi
|
||||
**tanpa menjalankan kode plugin**. Manifes yang hilang atau tidak valid diperlakukan sebagai
|
||||
error plugin dan memblokir validasi konfigurasi.
|
||||
|
||||
Lihat panduan lengkap sistem plugin: [Plugins](/id/tools/plugin).
|
||||
Untuk model kapabilitas native dan panduan kompatibilitas eksternal saat ini:
|
||||
[Capability model](/id/plugins/architecture#public-capability-model).
|
||||
[Model kapabilitas](/id/plugins/architecture#public-capability-model).
|
||||
|
||||
## Fungsi file ini
|
||||
|
||||
`openclaw.plugin.json` adalah metadata yang dibaca OpenClaw sebelum memuat kode
|
||||
plugin Anda.
|
||||
`openclaw.plugin.json` adalah metadata yang dibaca OpenClaw sebelum memuat
|
||||
kode plugin Anda.
|
||||
|
||||
Gunakan untuk:
|
||||
|
||||
- identitas plugin
|
||||
- validasi config
|
||||
- metadata auth dan onboarding yang harus tersedia tanpa menjalankan runtime
|
||||
- validasi konfigurasi
|
||||
- metadata auth dan onboarding yang harus tersedia tanpa mem-boot runtime
|
||||
plugin
|
||||
- metadata alias dan auto-enable yang harus di-resolve sebelum runtime plugin dimuat
|
||||
- metadata kepemilikan shorthand model-family yang seharusnya mengaktifkan
|
||||
plugin secara otomatis sebelum runtime dimuat
|
||||
- snapshot kepemilikan kapabilitas statis yang digunakan untuk wiring kompatibilitas
|
||||
bawaan dan cakupan kontrak
|
||||
- metadata config khusus channel yang harus digabungkan ke permukaan katalog dan validasi
|
||||
- metadata alias dan auto-enable yang harus diselesaikan sebelum runtime plugin dimuat
|
||||
- metadata kepemilikan keluarga model shorthand yang harus mengaktifkan otomatis
|
||||
plugin sebelum runtime dimuat
|
||||
- snapshot kepemilikan kapabilitas statis yang digunakan untuk wiring kompatibilitas bawaan dan
|
||||
cakupan kontrak
|
||||
- metadata konfigurasi khusus channel yang harus digabungkan ke surface katalog dan validasi
|
||||
tanpa memuat runtime
|
||||
- petunjuk UI config
|
||||
- petunjuk UI konfigurasi
|
||||
|
||||
Jangan gunakan untuk:
|
||||
|
||||
@ -69,7 +69,7 @@ Jangan gunakan untuk:
|
||||
- mendeklarasikan entrypoint kode
|
||||
- metadata instalasi npm
|
||||
|
||||
Hal-hal tersebut milik kode plugin Anda dan `package.json`.
|
||||
Hal-hal tersebut termasuk dalam kode plugin Anda dan `package.json`.
|
||||
|
||||
## Contoh minimal
|
||||
|
||||
@ -90,7 +90,7 @@ Hal-hal tersebut milik kode plugin Anda dan `package.json`.
|
||||
{
|
||||
"id": "openrouter",
|
||||
"name": "OpenRouter",
|
||||
"description": "Plugin provider OpenRouter",
|
||||
"description": "Plugin penyedia OpenRouter",
|
||||
"version": "1.0.0",
|
||||
"providers": ["openrouter"],
|
||||
"modelSupport": {
|
||||
@ -100,6 +100,9 @@ Hal-hal tersebut milik kode plugin Anda dan `package.json`.
|
||||
"providerAuthEnvVars": {
|
||||
"openrouter": ["OPENROUTER_API_KEY"]
|
||||
},
|
||||
"providerAuthAliases": {
|
||||
"openrouter-coding": "openrouter"
|
||||
},
|
||||
"channelEnvVars": {
|
||||
"openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"]
|
||||
},
|
||||
@ -137,58 +140,59 @@ Hal-hal tersebut milik kode plugin Anda dan `package.json`.
|
||||
}
|
||||
```
|
||||
|
||||
## Referensi field tingkat atas
|
||||
## Referensi field level teratas
|
||||
|
||||
| Field | Wajib | Tipe | Artinya |
|
||||
| ----------------------------------- | -------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `id` | Ya | `string` | ID plugin kanonis. Ini adalah ID yang digunakan di `plugins.entries.<id>`. |
|
||||
| `configSchema` | Ya | `object` | JSON Schema inline untuk config plugin ini. |
|
||||
| `enabledByDefault` | Tidak | `true` | Menandai plugin bawaan sebagai aktif secara default. Hilangkan, atau atur ke nilai selain `true`, agar plugin tetap nonaktif secara default. |
|
||||
| `legacyPluginIds` | Tidak | `string[]` | ID lama yang dinormalisasi ke ID plugin kanonis ini. |
|
||||
| `autoEnableWhenConfiguredProviders` | Tidak | `string[]` | ID provider yang seharusnya mengaktifkan plugin ini secara otomatis saat auth, config, atau referensi model menyebutkannya. |
|
||||
| `kind` | Tidak | `"memory"` \| `"context-engine"` | Mendeklarasikan jenis plugin eksklusif yang digunakan oleh `plugins.slots.*`. |
|
||||
| `channels` | Tidak | `string[]` | ID channel yang dimiliki plugin ini. Digunakan untuk discovery dan validasi config. |
|
||||
| `providers` | Tidak | `string[]` | ID provider yang dimiliki plugin ini. |
|
||||
| `modelSupport` | Tidak | `object` | Metadata shorthand model-family milik manifest yang digunakan untuk auto-load plugin sebelum runtime. |
|
||||
| `cliBackends` | Tidak | `string[]` | ID backend inferensi CLI yang dimiliki plugin ini. Digunakan untuk auto-activation saat startup dari referensi config eksplisit. |
|
||||
| `providerAuthEnvVars` | Tidak | `Record<string, string[]>` | Metadata env auth provider yang ringan yang dapat diperiksa OpenClaw tanpa memuat kode plugin. |
|
||||
| `channelEnvVars` | Tidak | `Record<string, string[]>` | Metadata env channel yang ringan yang dapat diperiksa OpenClaw tanpa memuat kode plugin. Gunakan ini untuk permukaan penyiapan channel atau auth berbasis env yang harus terlihat oleh helper startup/config generik. |
|
||||
| `providerAuthChoices` | Tidak | `object[]` | Metadata pilihan auth ringan untuk picker onboarding, resolusi provider pilihan, dan wiring flag CLI sederhana. |
|
||||
| `contracts` | Tidak | `object` | Snapshot kapabilitas bawaan statis untuk speech, realtime transcription, realtime voice, media-understanding, image-generation, music-generation, video-generation, web-fetch, web search, dan kepemilikan tool. |
|
||||
| `channelConfigs` | Tidak | `Record<string, object>` | Metadata config channel milik manifest yang digabungkan ke permukaan discovery dan validasi sebelum runtime dimuat. |
|
||||
| `skills` | Tidak | `string[]` | Direktori Skills yang akan dimuat, relatif terhadap root plugin. |
|
||||
| `name` | Tidak | `string` | Nama plugin yang dapat dibaca manusia. |
|
||||
| `description` | Tidak | `string` | Ringkasan singkat yang ditampilkan di permukaan plugin. |
|
||||
| `version` | Tidak | `string` | Versi plugin informasional. |
|
||||
| `uiHints` | Tidak | `Record<string, object>` | Label UI, placeholder, dan petunjuk sensitivitas untuk field config. |
|
||||
| Field | Wajib | Tipe | Artinya |
|
||||
| ----------------------------------- | -------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| `id` | Ya | `string` | Id plugin kanonis. Ini adalah id yang digunakan di `plugins.entries.<id>`. |
|
||||
| `configSchema` | Ya | `object` | JSON Schema inline untuk konfigurasi plugin ini. |
|
||||
| `enabledByDefault` | Tidak | `true` | Menandai plugin bawaan sebagai aktif secara default. Hilangkan field ini, atau setel nilai apa pun selain `true`, agar plugin tetap nonaktif secara default. |
|
||||
| `legacyPluginIds` | Tidak | `string[]` | Id lama yang dinormalisasi ke id plugin kanonis ini. |
|
||||
| `autoEnableWhenConfiguredProviders` | Tidak | `string[]` | Id penyedia yang harus mengaktifkan otomatis plugin ini saat auth, konfigurasi, atau referensi model menyebutkannya. |
|
||||
| `kind` | Tidak | `"memory"` \| `"context-engine"` | Mendeklarasikan jenis plugin eksklusif yang digunakan oleh `plugins.slots.*`. |
|
||||
| `channels` | Tidak | `string[]` | Id channel yang dimiliki plugin ini. Digunakan untuk discovery dan validasi konfigurasi. |
|
||||
| `providers` | Tidak | `string[]` | Id penyedia yang dimiliki plugin ini. |
|
||||
| `modelSupport` | Tidak | `object` | Metadata keluarga model shorthand yang dimiliki manifes dan digunakan untuk memuat otomatis plugin sebelum runtime. |
|
||||
| `cliBackends` | Tidak | `string[]` | Id backend inferensi CLI yang dimiliki plugin ini. Digunakan untuk auto-aktivasi saat startup dari referensi konfigurasi eksplisit. |
|
||||
| `providerAuthEnvVars` | Tidak | `Record<string, string[]>` | Metadata env auth penyedia ringan yang dapat diperiksa OpenClaw tanpa memuat kode plugin. |
|
||||
| `providerAuthAliases` | Tidak | `Record<string, string>` | Id penyedia yang harus menggunakan ulang id penyedia lain untuk lookup auth, misalnya penyedia coding yang berbagi kunci API penyedia dasar dan profil auth. |
|
||||
| `channelEnvVars` | Tidak | `Record<string, string[]>` | Metadata env channel ringan yang dapat diperiksa OpenClaw tanpa memuat kode plugin. Gunakan ini untuk penyiapan channel berbasis env atau surface auth yang perlu terlihat oleh helper startup/konfigurasi generik. |
|
||||
| `providerAuthChoices` | Tidak | `object[]` | Metadata pilihan auth ringan untuk picker onboarding, resolusi preferred-provider, dan wiring flag CLI sederhana. |
|
||||
| `contracts` | Tidak | `object` | Snapshot kapabilitas bawaan statis untuk speech, realtime transcription, realtime voice, media-understanding, image-generation, music-generation, video-generation, web-fetch, web search, dan kepemilikan alat. |
|
||||
| `channelConfigs` | Tidak | `Record<string, object>` | Metadata konfigurasi channel milik manifes yang digabungkan ke surface discovery dan validasi sebelum runtime dimuat. |
|
||||
| `skills` | Tidak | `string[]` | Direktori Skills yang akan dimuat, relatif ke root plugin. |
|
||||
| `name` | Tidak | `string` | Nama plugin yang dapat dibaca manusia. |
|
||||
| `description` | Tidak | `string` | Ringkasan singkat yang ditampilkan di surface plugin. |
|
||||
| `version` | Tidak | `string` | Versi plugin informasional. |
|
||||
| `uiHints` | Tidak | `Record<string, object>` | Label UI, placeholder, dan petunjuk sensitivitas untuk field konfigurasi. |
|
||||
|
||||
## Referensi `providerAuthChoices`
|
||||
## Referensi providerAuthChoices
|
||||
|
||||
Setiap entri `providerAuthChoices` menjelaskan satu pilihan onboarding atau auth.
|
||||
OpenClaw membacanya sebelum runtime provider dimuat.
|
||||
OpenClaw membacanya sebelum runtime penyedia dimuat.
|
||||
|
||||
| Field | Wajib | Tipe | Artinya |
|
||||
| --------------------- | -------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
||||
| `provider` | Ya | `string` | ID provider tempat pilihan ini berada. |
|
||||
| `method` | Ya | `string` | ID metode auth untuk dispatch. |
|
||||
| `choiceId` | Ya | `string` | ID pilihan auth stabil yang digunakan oleh alur onboarding dan CLI. |
|
||||
| `choiceLabel` | Tidak | `string` | Label yang ditampilkan ke pengguna. Jika dihilangkan, OpenClaw akan fallback ke `choiceId`. |
|
||||
| `choiceHint` | Tidak | `string` | Teks bantuan singkat untuk picker. |
|
||||
| `assistantPriority` | Tidak | `number` | Nilai yang lebih rendah diurutkan lebih awal di picker interaktif yang digerakkan asisten. |
|
||||
| `assistantVisibility` | Tidak | `"visible"` \| `"manual-only"` | Menyembunyikan pilihan dari picker asisten sambil tetap mengizinkan pemilihan CLI manual. |
|
||||
| `deprecatedChoiceIds` | Tidak | `string[]` | ID pilihan lama yang harus mengarahkan pengguna ke pilihan pengganti ini. |
|
||||
| `groupId` | Tidak | `string` | ID grup opsional untuk mengelompokkan pilihan terkait. |
|
||||
| `groupLabel` | Tidak | `string` | Label yang ditampilkan ke pengguna untuk grup tersebut. |
|
||||
| `groupHint` | Tidak | `string` | Teks bantuan singkat untuk grup tersebut. |
|
||||
| `optionKey` | Tidak | `string` | Kunci opsi internal untuk alur auth satu-flag sederhana. |
|
||||
| `cliFlag` | Tidak | `string` | Nama flag CLI, seperti `--openrouter-api-key`. |
|
||||
| `cliOption` | Tidak | `string` | Bentuk opsi CLI lengkap, seperti `--openrouter-api-key <key>`. |
|
||||
| `cliDescription` | Tidak | `string` | Deskripsi yang digunakan dalam bantuan CLI. |
|
||||
| `onboardingScopes` | Tidak | `Array<"text-inference" \| "image-generation">` | Permukaan onboarding tempat pilihan ini harus muncul. Jika dihilangkan, default-nya `["text-inference"]`. |
|
||||
| Field | Wajib | Tipe | Artinya |
|
||||
| --------------------- | -------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
||||
| `provider` | Ya | `string` | Id penyedia tempat pilihan ini berada. |
|
||||
| `method` | Ya | `string` | Id metode auth yang akan digunakan untuk dispatch. |
|
||||
| `choiceId` | Ya | `string` | Id pilihan auth stabil yang digunakan oleh alur onboarding dan CLI. |
|
||||
| `choiceLabel` | Tidak | `string` | Label untuk pengguna. Jika dihilangkan, OpenClaw menggunakan fallback ke `choiceId`. |
|
||||
| `choiceHint` | Tidak | `string` | Teks bantuan singkat untuk picker. |
|
||||
| `assistantPriority` | Tidak | `number` | Nilai yang lebih rendah diurutkan lebih awal dalam picker interaktif yang digerakkan asisten. |
|
||||
| `assistantVisibility` | Tidak | `"visible"` \| `"manual-only"` | Sembunyikan pilihan dari picker asisten sambil tetap mengizinkan pemilihan CLI manual. |
|
||||
| `deprecatedChoiceIds` | Tidak | `string[]` | Id pilihan lama yang harus mengarahkan pengguna ke pilihan pengganti ini. |
|
||||
| `groupId` | Tidak | `string` | Id grup opsional untuk mengelompokkan pilihan yang terkait. |
|
||||
| `groupLabel` | Tidak | `string` | Label untuk pengguna bagi grup tersebut. |
|
||||
| `groupHint` | Tidak | `string` | Teks bantuan singkat untuk grup tersebut. |
|
||||
| `optionKey` | Tidak | `string` | Key opsi internal untuk alur auth sederhana dengan satu flag. |
|
||||
| `cliFlag` | Tidak | `string` | Nama flag CLI, seperti `--openrouter-api-key`. |
|
||||
| `cliOption` | Tidak | `string` | Bentuk opsi CLI lengkap, seperti `--openrouter-api-key <key>`. |
|
||||
| `cliDescription` | Tidak | `string` | Deskripsi yang digunakan dalam bantuan CLI. |
|
||||
| `onboardingScopes` | Tidak | `Array<"text-inference" \| "image-generation">` | Surface onboarding tempat pilihan ini harus ditampilkan. Jika dihilangkan, defaultnya adalah `["text-inference"]`. |
|
||||
|
||||
## Referensi `uiHints`
|
||||
## Referensi uiHints
|
||||
|
||||
`uiHints` adalah peta dari nama field config ke petunjuk rendering kecil.
|
||||
`uiHints` adalah peta dari nama field konfigurasi ke petunjuk rendering kecil.
|
||||
|
||||
```json
|
||||
{
|
||||
@ -205,16 +209,16 @@ OpenClaw membacanya sebelum runtime provider dimuat.
|
||||
|
||||
Setiap petunjuk field dapat mencakup:
|
||||
|
||||
| Field | Tipe | Artinya |
|
||||
| ------------- | ---------- | ---------------------------------------- |
|
||||
| `label` | `string` | Label field yang ditampilkan ke pengguna. |
|
||||
| `help` | `string` | Teks bantuan singkat. |
|
||||
| `tags` | `string[]` | Tag UI opsional. |
|
||||
| `advanced` | `boolean` | Menandai field sebagai lanjutan. |
|
||||
| Field | Tipe | Artinya |
|
||||
| ------------- | ---------- | --------------------------------------- |
|
||||
| `label` | `string` | Label field untuk pengguna. |
|
||||
| `help` | `string` | Teks bantuan singkat. |
|
||||
| `tags` | `string[]` | Tag UI opsional. |
|
||||
| `advanced` | `boolean` | Menandai field sebagai lanjutan. |
|
||||
| `sensitive` | `boolean` | Menandai field sebagai rahasia atau sensitif. |
|
||||
| `placeholder` | `string` | Teks placeholder untuk input formulir. |
|
||||
| `placeholder` | `string` | Teks placeholder untuk input formulir. |
|
||||
|
||||
## Referensi `contracts`
|
||||
## Referensi contracts
|
||||
|
||||
Gunakan `contracts` hanya untuk metadata kepemilikan kapabilitas statis yang dapat
|
||||
dibaca OpenClaw tanpa mengimpor runtime plugin.
|
||||
@ -237,21 +241,21 @@ dibaca OpenClaw tanpa mengimpor runtime plugin.
|
||||
|
||||
Setiap daftar bersifat opsional:
|
||||
|
||||
| Field | Tipe | Artinya |
|
||||
| -------------------------------- | ---------- | ------------------------------------------------------------- |
|
||||
| `speechProviders` | `string[]` | ID provider speech yang dimiliki plugin ini. |
|
||||
| `realtimeTranscriptionProviders` | `string[]` | ID provider realtime-transcription yang dimiliki plugin ini. |
|
||||
| `realtimeVoiceProviders` | `string[]` | ID provider realtime-voice yang dimiliki plugin ini. |
|
||||
| `mediaUnderstandingProviders` | `string[]` | ID provider media-understanding yang dimiliki plugin ini. |
|
||||
| `imageGenerationProviders` | `string[]` | ID provider image-generation yang dimiliki plugin ini. |
|
||||
| `videoGenerationProviders` | `string[]` | ID provider video-generation yang dimiliki plugin ini. |
|
||||
| `webFetchProviders` | `string[]` | ID provider web-fetch yang dimiliki plugin ini. |
|
||||
| `webSearchProviders` | `string[]` | ID provider web-search yang dimiliki plugin ini. |
|
||||
| `tools` | `string[]` | Nama tool agen yang dimiliki plugin ini untuk pemeriksaan kontrak bawaan. |
|
||||
| Field | Tipe | Artinya |
|
||||
| -------------------------------- | ---------- | ---------------------------------------------------------- |
|
||||
| `speechProviders` | `string[]` | Id penyedia speech yang dimiliki plugin ini. |
|
||||
| `realtimeTranscriptionProviders` | `string[]` | Id penyedia transkripsi realtime yang dimiliki plugin ini. |
|
||||
| `realtimeVoiceProviders` | `string[]` | Id penyedia suara realtime yang dimiliki plugin ini. |
|
||||
| `mediaUnderstandingProviders` | `string[]` | Id penyedia pemahaman media yang dimiliki plugin ini. |
|
||||
| `imageGenerationProviders` | `string[]` | Id penyedia pembuatan gambar yang dimiliki plugin ini. |
|
||||
| `videoGenerationProviders` | `string[]` | Id penyedia pembuatan video yang dimiliki plugin ini. |
|
||||
| `webFetchProviders` | `string[]` | Id penyedia pengambilan web yang dimiliki plugin ini. |
|
||||
| `webSearchProviders` | `string[]` | Id penyedia pencarian web yang dimiliki plugin ini. |
|
||||
| `tools` | `string[]` | Nama alat agen yang dimiliki plugin ini untuk pemeriksaan kontrak bawaan. |
|
||||
|
||||
## Referensi `channelConfigs`
|
||||
## Referensi channelConfigs
|
||||
|
||||
Gunakan `channelConfigs` saat plugin channel memerlukan metadata config ringan sebelum
|
||||
Gunakan `channelConfigs` saat plugin channel memerlukan metadata konfigurasi ringan sebelum
|
||||
runtime dimuat.
|
||||
|
||||
```json
|
||||
@ -281,18 +285,18 @@ runtime dimuat.
|
||||
|
||||
Setiap entri channel dapat mencakup:
|
||||
|
||||
| Field | Tipe | Artinya |
|
||||
| ------------- | ------------------------ | ---------------------------------------------------------------------------------------- |
|
||||
| `schema` | `object` | JSON Schema untuk `channels.<id>`. Wajib untuk setiap entri config channel yang dideklarasikan. |
|
||||
| `uiHints` | `Record<string, object>` | Label UI/placeholders/petunjuk sensitif opsional untuk bagian config channel tersebut. |
|
||||
| `label` | `string` | Label channel yang digabungkan ke permukaan picker dan inspect saat metadata runtime belum siap. |
|
||||
| `description` | `string` | Deskripsi channel singkat untuk permukaan inspect dan katalog. |
|
||||
| `preferOver` | `string[]` | ID plugin lama atau berprioritas lebih rendah yang harus dikalahkan channel ini di permukaan pemilihan. |
|
||||
| Field | Tipe | Artinya |
|
||||
| ------------- | ------------------------ | ----------------------------------------------------------------------------------------- |
|
||||
| `schema` | `object` | JSON Schema untuk `channels.<id>`. Wajib untuk setiap entri konfigurasi channel yang dideklarasikan. |
|
||||
| `uiHints` | `Record<string, object>` | Label UI/placeholder/petunjuk sensitif opsional untuk bagian konfigurasi channel tersebut. |
|
||||
| `label` | `string` | Label channel yang digabungkan ke picker dan surface inspect saat metadata runtime belum siap. |
|
||||
| `description` | `string` | Deskripsi channel singkat untuk surface inspect dan katalog. |
|
||||
| `preferOver` | `string[]` | Id plugin lama atau prioritas lebih rendah yang harus dikalahkan channel ini di surface pemilihan. |
|
||||
|
||||
## Referensi `modelSupport`
|
||||
## Referensi modelSupport
|
||||
|
||||
Gunakan `modelSupport` saat OpenClaw harus menyimpulkan plugin provider Anda dari
|
||||
ID model shorthand seperti `gpt-5.4` atau `claude-sonnet-4.6` sebelum runtime plugin
|
||||
Gunakan `modelSupport` saat OpenClaw harus menyimpulkan plugin penyedia Anda dari
|
||||
id model shorthand seperti `gpt-5.4` atau `claude-sonnet-4.6` sebelum runtime plugin
|
||||
dimuat.
|
||||
|
||||
```json
|
||||
@ -306,37 +310,37 @@ dimuat.
|
||||
|
||||
OpenClaw menerapkan prioritas berikut:
|
||||
|
||||
- referensi eksplisit `provider/model` menggunakan metadata manifest `providers` yang memilikinya
|
||||
- referensi `provider/model` eksplisit menggunakan metadata manifes `providers` milik plugin
|
||||
- `modelPatterns` mengalahkan `modelPrefixes`
|
||||
- jika satu plugin non-bawaan dan satu plugin bawaan sama-sama cocok, plugin non-bawaan
|
||||
menang
|
||||
- ambiguitas yang tersisa diabaikan sampai pengguna atau config menentukan provider
|
||||
yang menang
|
||||
- ambiguitas yang tersisa diabaikan sampai pengguna atau konfigurasi menentukan penyedia
|
||||
|
||||
Field:
|
||||
|
||||
| Field | Tipe | Artinya |
|
||||
| --------------- | ---------- | ------------------------------------------------------------------------------ |
|
||||
| `modelPrefixes` | `string[]` | Prefix yang dicocokkan dengan `startsWith` terhadap ID model shorthand. |
|
||||
| `modelPatterns` | `string[]` | Sumber regex yang dicocokkan terhadap ID model shorthand setelah penghapusan suffix profil. |
|
||||
| Field | Tipe | Artinya |
|
||||
| --------------- | ---------- | ------------------------------------------------------------------------------- |
|
||||
| `modelPrefixes` | `string[]` | Prefiks yang dicocokkan dengan `startsWith` terhadap id model shorthand. |
|
||||
| `modelPatterns` | `string[]` | Sumber regex yang dicocokkan terhadap id model shorthand setelah penghapusan sufiks profil. |
|
||||
|
||||
Kunci kapabilitas tingkat atas lama sudah deprecated. Gunakan `openclaw doctor --fix` untuk
|
||||
Key kapabilitas level teratas lama sudah deprecated. Gunakan `openclaw doctor --fix` untuk
|
||||
memindahkan `speechProviders`, `realtimeTranscriptionProviders`,
|
||||
`realtimeVoiceProviders`, `mediaUnderstandingProviders`,
|
||||
`imageGenerationProviders`, `videoGenerationProviders`,
|
||||
`webFetchProviders`, dan `webSearchProviders` ke bawah `contracts`; pemuatan
|
||||
manifest normal აღარ memperlakukan field tingkat atas tersebut sebagai
|
||||
manifes normal tidak lagi memperlakukan field level teratas tersebut sebagai
|
||||
kepemilikan kapabilitas.
|
||||
|
||||
## Manifest versus package.json
|
||||
## Manifes versus package.json
|
||||
|
||||
Kedua file ini memiliki fungsi yang berbeda:
|
||||
|
||||
| File | Gunakan untuk |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `openclaw.plugin.json` | Discovery, validasi config, metadata pilihan auth, dan petunjuk UI yang harus ada sebelum kode plugin berjalan |
|
||||
| `package.json` | Metadata npm, instalasi dependensi, dan blok `openclaw` yang digunakan untuk entrypoint, gating instalasi, penyiapan, atau metadata katalog |
|
||||
| File | Gunakan untuk |
|
||||
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `openclaw.plugin.json` | Discovery, validasi konfigurasi, metadata pilihan auth, dan petunjuk UI yang harus ada sebelum kode plugin berjalan |
|
||||
| `package.json` | Metadata npm, instalasi dependensi, dan blok `openclaw` yang digunakan untuk entrypoint, gating instalasi, setup, atau metadata katalog |
|
||||
|
||||
Jika Anda tidak yakin metadata tertentu harus ditempatkan di mana, gunakan aturan ini:
|
||||
Jika Anda tidak yakin metadata tertentu harus diletakkan di mana, gunakan aturan ini:
|
||||
|
||||
- jika OpenClaw harus mengetahuinya sebelum memuat kode plugin, letakkan di `openclaw.plugin.json`
|
||||
- jika itu terkait packaging, file entry, atau perilaku instalasi npm, letakkan di `package.json`
|
||||
@ -348,30 +352,32 @@ Beberapa metadata plugin pra-runtime memang sengaja ditempatkan di `package.json
|
||||
|
||||
Contoh penting:
|
||||
|
||||
| Field | Artinya |
|
||||
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `openclaw.extensions` | Mendeklarasikan entrypoint plugin native. |
|
||||
| `openclaw.setupEntry` | Entrypoint ringan khusus penyiapan yang digunakan saat onboarding dan startup channel yang ditangguhkan. |
|
||||
| `openclaw.channel` | Metadata katalog channel ringan seperti label, path docs, alias, dan copy pemilihan. |
|
||||
| `openclaw.channel.configuredState` | Metadata pemeriksa configured-state ringan yang dapat menjawab "apakah penyiapan env-only sudah ada?" tanpa memuat runtime channel penuh. |
|
||||
| `openclaw.channel.persistedAuthState` | Metadata pemeriksa persisted-auth ringan yang dapat menjawab "apakah ada sesuatu yang sudah login?" tanpa memuat runtime channel penuh. |
|
||||
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Petunjuk instalasi/pembaruan untuk plugin bawaan dan plugin yang dipublikasikan secara eksternal. |
|
||||
| `openclaw.install.defaultChoice` | Jalur instalasi yang dipilih saat tersedia beberapa sumber instalasi. |
|
||||
| `openclaw.install.minHostVersion` | Versi host OpenClaw minimum yang didukung, menggunakan batas bawah semver seperti `>=2026.3.22`. |
|
||||
| `openclaw.install.allowInvalidConfigRecovery` | Mengizinkan jalur pemulihan reinstal plugin bawaan yang sempit saat config tidak valid. |
|
||||
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Memungkinkan permukaan channel khusus penyiapan dimuat sebelum plugin channel penuh saat startup. |
|
||||
| Field | Artinya |
|
||||
| ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `openclaw.extensions` | Mendeklarasikan entrypoint plugin native. |
|
||||
| `openclaw.setupEntry` | Entrypoint ringan khusus setup yang digunakan saat onboarding dan startup channel tertunda. |
|
||||
| `openclaw.channel` | Metadata katalog channel ringan seperti label, path dokumen, alias, dan copy pemilihan. |
|
||||
| `openclaw.channel.configuredState` | Metadata pemeriksa status terkonfigurasi ringan yang dapat menjawab "apakah setup khusus-env sudah ada?" tanpa memuat runtime channel penuh. |
|
||||
| `openclaw.channel.persistedAuthState` | Metadata pemeriksa auth tersimpan ringan yang dapat menjawab "apakah sudah ada yang login?" tanpa memuat runtime channel penuh. |
|
||||
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Petunjuk instalasi/pembaruan untuk plugin bawaan dan plugin yang dipublikasikan secara eksternal. |
|
||||
| `openclaw.install.defaultChoice` | Jalur instalasi yang dipilih saat beberapa sumber instalasi tersedia. |
|
||||
| `openclaw.install.minHostVersion` | Versi host OpenClaw minimum yang didukung, menggunakan floor semver seperti `>=2026.3.22`. |
|
||||
| `openclaw.install.allowInvalidConfigRecovery` | Mengizinkan jalur pemulihan reinstalasi plugin bawaan yang sempit saat konfigurasi tidak valid. |
|
||||
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Mengizinkan surface channel khusus setup dimuat sebelum plugin channel penuh saat startup. |
|
||||
|
||||
`openclaw.install.minHostVersion` ditegakkan selama instalasi dan pemuatan registry
|
||||
manifest. Nilai yang tidak valid ditolak; nilai yang valid tetapi lebih baru akan melewati
|
||||
`openclaw.install.minHostVersion` ditegakkan selama instalasi dan pemuatan registri
|
||||
manifes. Nilai yang tidak valid ditolak; nilai yang valid tetapi lebih baru akan melewati
|
||||
plugin pada host yang lebih lama.
|
||||
|
||||
`openclaw.install.allowInvalidConfigRecovery` sengaja dibuat sempit. Ini
|
||||
tidak membuat config rusak arbitrer menjadi dapat diinstal. Saat ini fitur ini hanya mengizinkan alur instalasi
|
||||
memulihkan kegagalan peningkatan plugin bawaan usang tertentu, seperti path plugin bawaan yang hilang atau entri `channels.<id>` usang untuk plugin bawaan yang sama tersebut.
|
||||
Error config yang tidak terkait tetap memblokir instalasi dan mengarahkan operator
|
||||
tidak membuat konfigurasi rusak sembarang menjadi dapat diinstal. Saat ini ini hanya memungkinkan alur instalasi
|
||||
memulihkan kegagalan upgrade plugin bawaan lama yang spesifik, seperti
|
||||
path plugin bawaan yang hilang atau entri `channels.<id>` lama untuk plugin bawaan yang sama.
|
||||
Error konfigurasi yang tidak terkait tetap memblokir instalasi dan mengarahkan operator
|
||||
ke `openclaw doctor --fix`.
|
||||
|
||||
`openclaw.channel.persistedAuthState` adalah metadata package untuk modul pemeriksa kecil:
|
||||
`openclaw.channel.persistedAuthState` adalah metadata package untuk modul pemeriksa
|
||||
kecil:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -387,13 +393,12 @@ ke `openclaw doctor --fix`.
|
||||
}
|
||||
```
|
||||
|
||||
Gunakan saat alur penyiapan, doctor, atau configured-state memerlukan probe auth ya/tidak yang ringan
|
||||
Gunakan ini saat alur setup, doctor, atau configured-state memerlukan probe auth ya/tidak yang ringan
|
||||
sebelum plugin channel penuh dimuat. Export target harus berupa fungsi kecil
|
||||
yang hanya membaca persisted state; jangan merutekannya melalui barrel runtime
|
||||
channel penuh.
|
||||
yang hanya membaca state tersimpan; jangan arahkan melalui barrel runtime channel penuh.
|
||||
|
||||
`openclaw.channel.configuredState` mengikuti bentuk yang sama untuk pemeriksaan configured
|
||||
berbasis env yang ringan:
|
||||
`openclaw.channel.configuredState` mengikuti bentuk yang sama untuk pemeriksaan terkonfigurasi
|
||||
khusus-env yang ringan:
|
||||
|
||||
```json
|
||||
{
|
||||
@ -409,61 +414,64 @@ berbasis env yang ringan:
|
||||
}
|
||||
```
|
||||
|
||||
Gunakan saat channel dapat menjawab configured-state dari env atau input kecil non-runtime
|
||||
lainnya. Jika pemeriksaan memerlukan resolusi config penuh atau runtime channel
|
||||
yang sebenarnya, simpan logika tersebut di hook plugin `config.hasConfiguredState`.
|
||||
Gunakan ini saat sebuah channel dapat menjawab configured-state dari env atau input
|
||||
non-runtime kecil lainnya. Jika pemeriksaannya memerlukan resolusi konfigurasi penuh atau runtime
|
||||
channel yang sesungguhnya, simpan logika itu di hook plugin `config.hasConfiguredState`.
|
||||
|
||||
## Persyaratan JSON Schema
|
||||
|
||||
- **Setiap plugin harus menyertakan JSON Schema**, meskipun tidak menerima config apa pun.
|
||||
- **Setiap plugin harus menyertakan JSON Schema**, bahkan jika tidak menerima konfigurasi.
|
||||
- Skema kosong dapat diterima (misalnya, `{ "type": "object", "additionalProperties": false }`).
|
||||
- Skema divalidasi pada waktu baca/tulis config, bukan saat runtime.
|
||||
- Skema divalidasi saat pembacaan/penulisan konfigurasi, bukan saat runtime.
|
||||
|
||||
## Perilaku validasi
|
||||
|
||||
- Kunci `channels.*` yang tidak dikenal adalah **error**, kecuali ID channel tersebut dideklarasikan oleh
|
||||
manifest plugin.
|
||||
- Key `channels.*` yang tidak dikenal adalah **error**, kecuali id channel tersebut dideklarasikan oleh
|
||||
manifes plugin.
|
||||
- `plugins.entries.<id>`, `plugins.allow`, `plugins.deny`, dan `plugins.slots.*`
|
||||
harus mereferensikan ID plugin yang **dapat ditemukan**. ID yang tidak dikenal adalah **error**.
|
||||
- Jika plugin terinstal tetapi memiliki manifest atau skema yang rusak atau hilang,
|
||||
validasi gagal dan Doctor melaporkan error plugin.
|
||||
- Jika config plugin ada tetapi plugin **dinonaktifkan**, config tetap dipertahankan dan
|
||||
harus mereferensikan id plugin yang **dapat ditemukan**. Id yang tidak dikenal adalah **error**.
|
||||
- Jika plugin terinstal tetapi memiliki manifes atau skema yang rusak atau hilang,
|
||||
validasi gagal dan Doctor melaporkan error plugin tersebut.
|
||||
- Jika konfigurasi plugin ada tetapi plugin tersebut **nonaktif**, konfigurasi tetap dipertahankan dan
|
||||
**peringatan** ditampilkan di Doctor + log.
|
||||
|
||||
Lihat [Referensi konfigurasi](/id/gateway/configuration) untuk skema `plugins.*` lengkap.
|
||||
|
||||
## Catatan
|
||||
|
||||
- Manifest ini **wajib untuk plugin OpenClaw native**, termasuk pemuatan dari filesystem lokal.
|
||||
- Runtime tetap memuat modul plugin secara terpisah; manifest hanya untuk
|
||||
- Manifes ini **wajib untuk plugin OpenClaw native**, termasuk pemuatan filesystem lokal.
|
||||
- Runtime tetap memuat modul plugin secara terpisah; manifes hanya untuk
|
||||
discovery + validasi.
|
||||
- Manifest native diparse dengan JSON5, sehingga komentar, trailing comma, dan
|
||||
kunci tanpa tanda kutip diterima selama nilai akhirnya tetap berupa object.
|
||||
- Hanya field manifest yang terdokumentasi yang dibaca oleh manifest loader. Hindari menambahkan
|
||||
kunci tingkat atas kustom di sini.
|
||||
- Manifes native diurai dengan JSON5, jadi komentar, koma penutup, dan
|
||||
key tanpa tanda kutip diterima selama nilai akhirnya tetap berupa objek.
|
||||
- Hanya field manifes yang terdokumentasi yang dibaca oleh pemuat manifes. Hindari menambahkan
|
||||
key level teratas kustom di sini.
|
||||
- `providerAuthEnvVars` adalah jalur metadata ringan untuk probe auth, validasi
|
||||
penanda env, dan permukaan auth provider serupa yang tidak seharusnya menjalankan runtime
|
||||
plugin hanya untuk memeriksa nama env.
|
||||
- `channelEnvVars` adalah jalur metadata ringan untuk fallback shell-env, prompt penyiapan,
|
||||
dan permukaan channel serupa yang tidak seharusnya menjalankan runtime plugin
|
||||
penanda env, dan surface auth penyedia serupa yang tidak seharusnya mem-boot runtime plugin
|
||||
hanya untuk memeriksa nama env.
|
||||
- `providerAuthAliases` memungkinkan varian penyedia menggunakan ulang auth
|
||||
env vars, profil auth, auth berbasis konfigurasi, dan pilihan onboarding kunci API
|
||||
dari penyedia lain tanpa melakukan hardcode hubungan tersebut di core.
|
||||
- `channelEnvVars` adalah jalur metadata ringan untuk fallback shell-env, prompt setup,
|
||||
dan surface channel serupa yang tidak seharusnya mem-boot runtime plugin
|
||||
hanya untuk memeriksa nama env.
|
||||
- `providerAuthChoices` adalah jalur metadata ringan untuk picker pilihan auth,
|
||||
resolusi `--auth-choice`, pemetaan provider pilihan, dan pendaftaran flag CLI onboarding
|
||||
sederhana sebelum runtime provider dimuat. Untuk metadata wizard runtime
|
||||
yang memerlukan kode provider, lihat
|
||||
[Provider runtime hooks](/id/plugins/architecture#provider-runtime-hooks).
|
||||
resolusi `--auth-choice`, pemetaan preferred-provider, dan pendaftaran flag CLI
|
||||
onboarding sederhana sebelum runtime penyedia dimuat. Untuk metadata wizard runtime
|
||||
yang memerlukan kode penyedia, lihat
|
||||
[Hook runtime penyedia](/id/plugins/architecture#provider-runtime-hooks).
|
||||
- Jenis plugin eksklusif dipilih melalui `plugins.slots.*`.
|
||||
- `kind: "memory"` dipilih oleh `plugins.slots.memory`.
|
||||
- `kind: "context-engine"` dipilih oleh `plugins.slots.contextEngine`
|
||||
(default: `legacy` bawaan).
|
||||
- `channels`, `providers`, `cliBackends`, dan `skills` dapat dihilangkan saat
|
||||
plugin tidak memerlukannya.
|
||||
plugin tidak membutuhkannya.
|
||||
- Jika plugin Anda bergantung pada modul native, dokumentasikan langkah build dan
|
||||
persyaratan allowlist package-manager apa pun (misalnya, pnpm `allow-build-scripts`
|
||||
persyaratan allowlist package manager apa pun (misalnya, pnpm `allow-build-scripts`
|
||||
- `pnpm rebuild <package>`).
|
||||
|
||||
## Terkait
|
||||
|
||||
- [Building Plugins](/id/plugins/building-plugins) — memulai dengan plugin
|
||||
- [Plugin Architecture](/id/plugins/architecture) — arsitektur internal
|
||||
- [SDK Overview](/id/plugins/sdk-overview) — referensi Plugin SDK
|
||||
- [Membangun Plugin](/id/plugins/building-plugins) — memulai dengan plugin
|
||||
- [Arsitektur Plugin](/id/plugins/architecture) — arsitektur internal
|
||||
- [Ikhtisar SDK](/id/plugins/sdk-overview) — referensi Plugin SDK
|
||||
|
||||
@ -5,62 +5,62 @@ read_when:
|
||||
- Anda sedang memperbarui plugin ke arsitektur plugin modern
|
||||
- Anda memelihara plugin OpenClaw eksternal
|
||||
sidebarTitle: Migrate to SDK
|
||||
summary: Migrasikan dari lapisan kompatibilitas mundur lama ke plugin SDK modern
|
||||
summary: Bermigrasi dari lapisan kompatibilitas mundur lama ke plugin SDK modern
|
||||
title: Migrasi Plugin SDK
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T09:13:47Z"
|
||||
generated_at: "2026-04-09T01:29:13Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: d9a2ce7f5553563516a549ca87e776a6a71e8dd8533a773c5ddbecfae43e7b77
|
||||
source_hash: 60cbb6c8be30d17770887d490c14e3a4538563339a5206fb419e51e0558bbc07
|
||||
source_path: plugins/sdk-migration.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Migrasi Plugin SDK
|
||||
|
||||
OpenClaw telah beralih dari lapisan kompatibilitas mundur yang luas ke arsitektur
|
||||
plugin modern dengan impor yang terfokus dan terdokumentasi. Jika plugin Anda
|
||||
dibangun sebelum arsitektur baru ini, panduan ini membantu Anda bermigrasi.
|
||||
OpenClaw telah beralih dari lapisan kompatibilitas mundur yang luas ke arsitektur plugin
|
||||
modern dengan impor yang terfokus dan terdokumentasi. Jika plugin Anda dibuat sebelum
|
||||
arsitektur baru, panduan ini membantu Anda bermigrasi.
|
||||
|
||||
## Apa yang berubah
|
||||
|
||||
Sistem plugin lama menyediakan dua surface yang sangat terbuka yang memungkinkan
|
||||
plugin mengimpor apa pun yang mereka perlukan dari satu titik masuk:
|
||||
Sistem plugin lama menyediakan dua permukaan yang sangat terbuka yang memungkinkan plugin mengimpor
|
||||
apa pun yang mereka butuhkan dari satu titik masuk:
|
||||
|
||||
- **`openclaw/plugin-sdk/compat`** — satu impor yang mengekspor ulang puluhan
|
||||
helper. Ini diperkenalkan untuk menjaga plugin berbasis hook lama tetap
|
||||
berfungsi saat arsitektur plugin baru sedang dibangun.
|
||||
- **`openclaw/extension-api`** — sebuah jembatan yang memberi plugin akses
|
||||
langsung ke helper sisi host seperti embedded agent runner.
|
||||
helper. Ini diperkenalkan untuk menjaga plugin berbasis hook yang lebih lama tetap berfungsi saat
|
||||
arsitektur plugin baru sedang dibangun.
|
||||
- **`openclaw/extension-api`** — sebuah jembatan yang memberi plugin akses langsung ke
|
||||
helper sisi host seperti runner agen tersemat.
|
||||
|
||||
Kedua surface sekarang **deprecated**. Keduanya masih berfungsi saat runtime,
|
||||
tetapi plugin baru tidak boleh menggunakannya, dan plugin yang sudah ada harus
|
||||
bermigrasi sebelum rilis mayor berikutnya menghapusnya.
|
||||
Kedua permukaan kini **deprecated**. Keduanya masih berfungsi saat runtime, tetapi plugin
|
||||
baru tidak boleh menggunakannya, dan plugin yang ada harus bermigrasi sebelum rilis mayor
|
||||
berikutnya menghapusnya.
|
||||
|
||||
<Warning>
|
||||
Lapisan kompatibilitas mundur akan dihapus pada rilis mayor mendatang.
|
||||
Plugin yang masih mengimpor dari surface ini akan rusak ketika itu terjadi.
|
||||
Plugin yang masih mengimpor dari permukaan ini akan rusak ketika itu terjadi.
|
||||
</Warning>
|
||||
|
||||
## Mengapa ini berubah
|
||||
|
||||
Pendekatan lama menimbulkan masalah:
|
||||
Pendekatan lama menyebabkan masalah:
|
||||
|
||||
- **Startup lambat** — mengimpor satu helper memuat puluhan modul yang tidak terkait
|
||||
- **Dependensi sirkular** — ekspor ulang yang luas memudahkan terbentuknya siklus impor
|
||||
- **Surface API yang tidak jelas** — tidak ada cara untuk mengetahui ekspor mana yang stabil vs internal
|
||||
- **Dependensi sirkular** — ekspor ulang yang luas memudahkan pembuatan siklus impor
|
||||
- **Permukaan API tidak jelas** — tidak ada cara untuk mengetahui ekspor mana yang stabil vs internal
|
||||
|
||||
Plugin SDK modern memperbaikinya: setiap path impor (`openclaw/plugin-sdk/\<subpath\>`)
|
||||
adalah modul kecil yang mandiri dengan tujuan yang jelas dan kontrak yang terdokumentasi.
|
||||
|
||||
Seam kenyamanan provider lama untuk channel bawaan juga sudah dihapus. Impor
|
||||
Seam kemudahan provider lama untuk kanal bawaan juga sudah tidak ada. Impor
|
||||
seperti `openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
|
||||
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`,
|
||||
seam helper berlabel channel, dan
|
||||
seam helper bermerek kanal, dan
|
||||
`openclaw/plugin-sdk/telegram-core` adalah pintasan mono-repo privat, bukan
|
||||
kontrak plugin yang stabil. Gunakan subpath SDK generik yang sempit sebagai gantinya. Di dalam
|
||||
workspace plugin bawaan, simpan helper milik provider di `api.ts` atau `runtime-api.ts`
|
||||
milik plugin tersebut.
|
||||
workspace plugin bawaan, simpan helper milik provider di
|
||||
`api.ts` atau `runtime-api.ts` plugin tersebut.
|
||||
|
||||
Contoh provider bawaan saat ini:
|
||||
|
||||
@ -74,9 +74,9 @@ Contoh provider bawaan saat ini:
|
||||
## Cara bermigrasi
|
||||
|
||||
<Steps>
|
||||
<Step title="Migrasikan handler native approval ke fakta capability">
|
||||
Plugin channel yang mendukung approval sekarang mengekspos perilaku approval native melalui
|
||||
`approvalCapability.nativeRuntime` ditambah registry runtime-context bersama.
|
||||
<Step title="Migrasikan handler native approval ke capability facts">
|
||||
Plugin kanal yang mendukung approval sekarang mengekspos perilaku approval native melalui
|
||||
`approvalCapability.nativeRuntime` ditambah registry konteks runtime bersama.
|
||||
|
||||
Perubahan utama:
|
||||
|
||||
@ -84,25 +84,25 @@ Contoh provider bawaan saat ini:
|
||||
`approvalCapability.nativeRuntime`
|
||||
- Pindahkan auth/pengiriman khusus approval dari wiring lama `plugin.auth` /
|
||||
`plugin.approvals` ke `approvalCapability`
|
||||
- `ChannelPlugin.approvals` telah dihapus dari kontrak publik
|
||||
plugin channel; pindahkan field delivery/native/render ke `approvalCapability`
|
||||
- `plugin.auth` tetap dipakai hanya untuk alur login/logout channel; hook auth
|
||||
approval di sana tidak lagi dibaca oleh core
|
||||
- Daftarkan objek runtime milik channel seperti client, token, atau aplikasi
|
||||
Bolt melalui `openclaw/plugin-sdk/channel-runtime-context`
|
||||
- Jangan kirim pemberitahuan reroute milik plugin dari handler approval native;
|
||||
core sekarang menangani pemberitahuan dialihkan-ke-tempat-lain dari hasil pengiriman yang sebenarnya
|
||||
- `ChannelPlugin.approvals` telah dihapus dari kontrak publik channel-plugin;
|
||||
pindahkan field delivery/native/render ke `approvalCapability`
|
||||
- `plugin.auth` tetap ada hanya untuk alur login/logout kanal; hook auth approval
|
||||
di sana tidak lagi dibaca oleh core
|
||||
- Daftarkan objek runtime milik kanal seperti klien, token, atau aplikasi Bolt
|
||||
melalui `openclaw/plugin-sdk/channel-runtime-context`
|
||||
- Jangan kirim pemberitahuan pengalihan milik plugin dari handler approval native;
|
||||
core kini menangani pemberitahuan dialihkan-ke-tempat-lain dari hasil pengiriman aktual
|
||||
- Saat meneruskan `channelRuntime` ke `createChannelManager(...)`, sediakan
|
||||
surface `createPluginRuntime().channel` yang nyata. Stub parsial akan ditolak.
|
||||
permukaan `createPluginRuntime().channel` yang nyata. Stub parsial ditolak.
|
||||
|
||||
Lihat `/plugins/sdk-channel-plugins` untuk tata letak capability
|
||||
approval saat ini.
|
||||
Lihat `/plugins/sdk-channel-plugins` untuk
|
||||
tata letak capability approval saat ini.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Audit perilaku fallback wrapper Windows">
|
||||
Jika plugin Anda menggunakan `openclaw/plugin-sdk/windows-spawn`, wrapper
|
||||
Windows `.cmd`/`.bat` yang tidak terpecahkan sekarang gagal tertutup kecuali Anda secara eksplisit meneruskan
|
||||
Jika plugin Anda menggunakan `openclaw/plugin-sdk/windows-spawn`, wrapper Windows
|
||||
`.cmd`/`.bat` yang tidak terselesaikan sekarang gagal secara tertutup kecuali Anda secara eksplisit meneruskan
|
||||
`allowShellFallback: true`.
|
||||
|
||||
```typescript
|
||||
@ -112,19 +112,19 @@ Contoh provider bawaan saat ini:
|
||||
// Sesudah
|
||||
const program = applyWindowsSpawnProgramPolicy({
|
||||
candidate,
|
||||
// Hanya setel ini untuk pemanggil kompatibilitas tepercaya yang secara sengaja
|
||||
// menerima fallback yang dimediasi shell.
|
||||
// Hanya setel ini untuk pemanggil kompatibilitas tepercaya yang memang
|
||||
// menerima fallback melalui shell.
|
||||
allowShellFallback: true,
|
||||
});
|
||||
```
|
||||
|
||||
Jika pemanggil Anda tidak secara sengaja bergantung pada shell fallback, jangan setel
|
||||
Jika pemanggil Anda tidak secara sengaja bergantung pada fallback shell, jangan setel
|
||||
`allowShellFallback` dan tangani error yang dilempar sebagai gantinya.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Temukan impor deprecated">
|
||||
Cari plugin Anda untuk impor dari salah satu surface deprecated:
|
||||
<Step title="Temukan impor yang deprecated">
|
||||
Cari di plugin Anda impor dari salah satu permukaan deprecated:
|
||||
|
||||
```bash
|
||||
grep -r "plugin-sdk/compat" my-plugin/
|
||||
@ -134,7 +134,7 @@ Contoh provider bawaan saat ini:
|
||||
</Step>
|
||||
|
||||
<Step title="Ganti dengan impor yang terfokus">
|
||||
Setiap ekspor dari surface lama dipetakan ke path impor modern tertentu:
|
||||
Setiap ekspor dari permukaan lama dipetakan ke path impor modern tertentu:
|
||||
|
||||
```typescript
|
||||
// Sebelum (lapisan kompatibilitas mundur deprecated)
|
||||
@ -150,7 +150,7 @@ Contoh provider bawaan saat ini:
|
||||
import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth";
|
||||
```
|
||||
|
||||
Untuk helper sisi host, gunakan runtime plugin yang diinjeksi alih-alih mengimpor
|
||||
Untuk helper sisi host, gunakan runtime plugin yang disuntikkan alih-alih mengimpor
|
||||
secara langsung:
|
||||
|
||||
```typescript
|
||||
@ -158,7 +158,7 @@ Contoh provider bawaan saat ini:
|
||||
import { runEmbeddedPiAgent } from "openclaw/extension-api";
|
||||
const result = await runEmbeddedPiAgent({ sessionId, prompt });
|
||||
|
||||
// Sesudah (runtime yang diinjeksi)
|
||||
// Sesudah (runtime yang disuntikkan)
|
||||
const result = await api.runtime.agent.runEmbeddedPiAgent({ sessionId, prompt });
|
||||
```
|
||||
|
||||
@ -190,179 +190,180 @@ Contoh provider bawaan saat ini:
|
||||
| Path impor | Tujuan | Ekspor utama |
|
||||
| --- | --- | --- |
|
||||
| `plugin-sdk/plugin-entry` | Helper entri plugin kanonis | `definePluginEntry` |
|
||||
| `plugin-sdk/core` | Ekspor ulang payung lama untuk definisi/builder entri channel | `defineChannelPluginEntry`, `createChatChannelPlugin` |
|
||||
| `plugin-sdk/config-schema` | Ekspor skema config root | `OpenClawSchema` |
|
||||
| `plugin-sdk/provider-entry` | Helper entri single-provider | `defineSingleProviderPluginEntry` |
|
||||
| `plugin-sdk/channel-core` | Definisi dan builder entri channel yang terfokus | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
|
||||
| `plugin-sdk/core` | Ekspor ulang payung lama untuk definisi/builder entri kanal | `defineChannelPluginEntry`, `createChatChannelPlugin` |
|
||||
| `plugin-sdk/config-schema` | Ekspor schema config root | `OpenClawSchema` |
|
||||
| `plugin-sdk/provider-entry` | Helper entri provider tunggal | `defineSingleProviderPluginEntry` |
|
||||
| `plugin-sdk/channel-core` | Definisi dan builder entri kanal yang terfokus | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
|
||||
| `plugin-sdk/setup` | Helper wizard setup bersama | Prompt allowlist, builder status setup |
|
||||
| `plugin-sdk/setup-runtime` | Helper runtime saat setup | Adapter patch setup yang aman untuk impor, helper catatan lookup, `promptResolvedAllowFrom`, `splitSetupEntries`, proxy setup terdelegasi |
|
||||
| `plugin-sdk/setup-runtime` | Helper runtime saat setup | Adapter patch setup yang aman untuk impor, helper catatan pencarian, `promptResolvedAllowFrom`, `splitSetupEntries`, proxy setup yang didelegasikan |
|
||||
| `plugin-sdk/setup-adapter-runtime` | Helper adapter setup | `createEnvPatchedAccountSetupAdapter` |
|
||||
| `plugin-sdk/setup-tools` | Helper tooling setup | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
||||
| `plugin-sdk/account-core` | Helper multi-account | Helper daftar/config/action-gate akun |
|
||||
| `plugin-sdk/account-core` | Helper multi-akun | Helper daftar/config/gerbang-tindakan akun |
|
||||
| `plugin-sdk/account-id` | Helper account-id | `DEFAULT_ACCOUNT_ID`, normalisasi account-id |
|
||||
| `plugin-sdk/account-resolution` | Helper lookup akun | Helper lookup akun + fallback default |
|
||||
| `plugin-sdk/account-helpers` | Helper akun yang sempit | Helper daftar akun/action akun |
|
||||
| `plugin-sdk/account-resolution` | Helper pencarian akun | Helper pencarian akun + fallback default |
|
||||
| `plugin-sdk/account-helpers` | Helper akun yang sempit | Helper daftar akun/tindakan akun |
|
||||
| `plugin-sdk/channel-setup` | Adapter wizard setup | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
|
||||
| `plugin-sdk/channel-pairing` | Primitive pairing DM | `createChannelPairingController` |
|
||||
| `plugin-sdk/channel-reply-pipeline` | Wiring prefiks balasan + pengetikan | `createChannelReplyPipeline` |
|
||||
| `plugin-sdk/channel-config-helpers` | Factory adapter config | `createHybridChannelConfigAdapter` |
|
||||
| `plugin-sdk/channel-config-schema` | Builder skema config | Tipe skema config channel |
|
||||
| `plugin-sdk/telegram-command-config` | Helper config perintah Telegram | Normalisasi nama perintah, pemangkasan deskripsi, validasi duplikasi/konflik |
|
||||
| `plugin-sdk/channel-config-helpers` | Pabrik adapter config | `createHybridChannelConfigAdapter` |
|
||||
| `plugin-sdk/channel-config-schema` | Builder schema config | Tipe schema config kanal |
|
||||
| `plugin-sdk/telegram-command-config` | Helper config perintah Telegram | Normalisasi nama perintah, pemangkasan deskripsi, validasi duplikat/konflik |
|
||||
| `plugin-sdk/channel-policy` | Resolusi kebijakan grup/DM | `resolveChannelGroupRequireMention` |
|
||||
| `plugin-sdk/channel-lifecycle` | Pelacakan status akun | `createAccountStatusSink` |
|
||||
| `plugin-sdk/inbound-envelope` | Helper envelope inbound | Helper route bersama + builder envelope |
|
||||
| `plugin-sdk/inbound-reply-dispatch` | Helper balasan inbound | Helper record-and-dispatch bersama |
|
||||
| `plugin-sdk/inbound-envelope` | Helper envelope masuk | Helper route bersama + builder envelope |
|
||||
| `plugin-sdk/inbound-reply-dispatch` | Helper balasan masuk | Helper rekam-dan-dispatch bersama |
|
||||
| `plugin-sdk/messaging-targets` | Parsing target pesan | Helper parsing/pencocokan target |
|
||||
| `plugin-sdk/outbound-media` | Helper media outbound | Pemuatan media outbound bersama |
|
||||
| `plugin-sdk/outbound-runtime` | Helper runtime outbound | Helper identitas/delegasi pengiriman outbound |
|
||||
| `plugin-sdk/thread-bindings-runtime` | Helper thread-binding | Lifecycle thread-binding dan helper adapter |
|
||||
| `plugin-sdk/agent-media-payload` | Helper payload media lama | Builder payload media agent untuk tata letak field lama |
|
||||
| `plugin-sdk/channel-runtime` | Shim kompatibilitas deprecated | Hanya utilitas runtime channel lama |
|
||||
| `plugin-sdk/outbound-media` | Helper media keluar | Pemuatan media keluar bersama |
|
||||
| `plugin-sdk/outbound-runtime` | Helper runtime keluar | Helper identitas keluar/delegasi kirim |
|
||||
| `plugin-sdk/thread-bindings-runtime` | Helper thread-binding | Siklus hidup thread-binding dan helper adapter |
|
||||
| `plugin-sdk/agent-media-payload` | Helper payload media lama | Builder payload media agen untuk tata letak field lama |
|
||||
| `plugin-sdk/channel-runtime` | Shim kompatibilitas deprecated | Hanya utilitas runtime kanal lama |
|
||||
| `plugin-sdk/channel-send-result` | Tipe hasil kirim | Tipe hasil balasan |
|
||||
| `plugin-sdk/runtime-store` | Penyimpanan plugin persisten | `createPluginRuntimeStore` |
|
||||
| `plugin-sdk/runtime` | Helper runtime yang luas | Helper runtime/logging/backup/instalasi plugin |
|
||||
| `plugin-sdk/runtime-env` | Helper env runtime yang sempit | Helper logger/runtime env, timeout, retry, dan backoff |
|
||||
| `plugin-sdk/plugin-runtime` | Helper runtime plugin bersama | Helper perintah/hook/http/interaktif plugin |
|
||||
| `plugin-sdk/hook-runtime` | Helper pipeline hook | Helper pipeline webhook/internal hook bersama |
|
||||
| `plugin-sdk/runtime-env` | Helper env runtime yang sempit | Logger/env runtime, timeout, retry, dan helper backoff |
|
||||
| `plugin-sdk/plugin-runtime` | Helper runtime plugin bersama | Helper plugin commands/hooks/http/interactive |
|
||||
| `plugin-sdk/hook-runtime` | Helper pipeline hook | Helper pipeline webhook/hook internal bersama |
|
||||
| `plugin-sdk/lazy-runtime` | Helper runtime lazy | `createLazyRuntimeModule`, `createLazyRuntimeMethod`, `createLazyRuntimeMethodBinder`, `createLazyRuntimeNamedExport`, `createLazyRuntimeSurface` |
|
||||
| `plugin-sdk/process-runtime` | Helper proses | Helper exec bersama |
|
||||
| `plugin-sdk/cli-runtime` | Helper runtime CLI | Pemformatan perintah, wait, helper versi |
|
||||
| `plugin-sdk/gateway-runtime` | Helper gateway | Helper client gateway dan patch status channel |
|
||||
| `plugin-sdk/config-runtime` | Helper config | Helper load/write config |
|
||||
| `plugin-sdk/telegram-command-config` | Helper perintah Telegram | Helper validasi perintah Telegram yang stabil-fallback ketika surface kontrak Telegram bawaan tidak tersedia |
|
||||
| `plugin-sdk/cli-runtime` | Helper runtime CLI | Pemformatan perintah, waits, helper versi |
|
||||
| `plugin-sdk/gateway-runtime` | Helper gateway | Helper klien gateway dan patch status kanal |
|
||||
| `plugin-sdk/config-runtime` | Helper config | Helper muat/tulis config |
|
||||
| `plugin-sdk/telegram-command-config` | Helper perintah Telegram | Helper validasi perintah Telegram stabil-fallback saat permukaan kontrak Telegram bawaan tidak tersedia |
|
||||
| `plugin-sdk/approval-runtime` | Helper prompt approval | Payload approval exec/plugin, helper capability/profile approval, helper routing/runtime approval native |
|
||||
| `plugin-sdk/approval-auth-runtime` | Helper auth approval | Resolusi approver, auth aksi same-chat |
|
||||
| `plugin-sdk/approval-client-runtime` | Helper client approval | Helper profile/filter approval exec native |
|
||||
| `plugin-sdk/approval-auth-runtime` | Helper auth approval | Resolusi approver, auth tindakan chat yang sama |
|
||||
| `plugin-sdk/approval-client-runtime` | Helper klien approval | Helper profile/filter approval exec native |
|
||||
| `plugin-sdk/approval-delivery-runtime` | Helper pengiriman approval | Adapter capability/pengiriman approval native |
|
||||
| `plugin-sdk/approval-gateway-runtime` | Helper gateway approval | Helper resolusi-gateway approval bersama |
|
||||
| `plugin-sdk/approval-handler-adapter-runtime` | Helper adapter approval | Helper pemuatan adapter approval native yang ringan untuk entrypoint channel yang panas |
|
||||
| `plugin-sdk/approval-handler-runtime` | Helper handler approval | Helper runtime handler approval yang lebih luas; prioritaskan seam adapter/gateway yang lebih sempit bila itu sudah cukup |
|
||||
| `plugin-sdk/approval-gateway-runtime` | Helper gateway approval | Helper bersama resolusi gateway approval |
|
||||
| `plugin-sdk/approval-handler-adapter-runtime` | Helper adapter approval | Helper pemuatan adapter approval native yang ringan untuk entrypoint kanal hot |
|
||||
| `plugin-sdk/approval-handler-runtime` | Helper handler approval | Helper runtime handler approval yang lebih luas; utamakan seam adapter/gateway yang lebih sempit jika itu sudah cukup |
|
||||
| `plugin-sdk/approval-native-runtime` | Helper target approval | Helper binding target/akun approval native |
|
||||
| `plugin-sdk/approval-reply-runtime` | Helper balasan approval | Helper payload balasan approval exec/plugin |
|
||||
| `plugin-sdk/channel-runtime-context` | Helper runtime-context channel | Helper register/get/watch runtime-context channel generik |
|
||||
| `plugin-sdk/security-runtime` | Helper keamanan | Helper trust, gating DM, konten eksternal, dan pengumpulan secret bersama |
|
||||
| `plugin-sdk/channel-runtime-context` | Helper konteks runtime kanal | Helper generik register/get/watch konteks runtime kanal |
|
||||
| `plugin-sdk/security-runtime` | Helper keamanan | Helper trust, DM gating, konten eksternal, dan pengumpulan secret bersama |
|
||||
| `plugin-sdk/ssrf-policy` | Helper kebijakan SSRF | Helper allowlist host dan kebijakan jaringan privat |
|
||||
| `plugin-sdk/ssrf-runtime` | Helper runtime SSRF | Helper pinned-dispatcher, guarded fetch, kebijakan SSRF |
|
||||
| `plugin-sdk/ssrf-runtime` | Helper runtime SSRF | Dispatcher tersemat, fetch terlindungi, helper kebijakan SSRF |
|
||||
| `plugin-sdk/collection-runtime` | Helper cache terbatas | `pruneMapToMaxSize` |
|
||||
| `plugin-sdk/diagnostic-runtime` | Helper gating diagnostik | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` |
|
||||
| `plugin-sdk/error-runtime` | Helper pemformatan error | `formatUncaughtError`, `isApprovalNotFoundError`, helper grafik error |
|
||||
| `plugin-sdk/fetch-runtime` | Helper wrapped fetch/proxy | `resolveFetch`, helper proxy |
|
||||
| `plugin-sdk/fetch-runtime` | Helper fetch/proxy terbungkus | `resolveFetch`, helper proxy |
|
||||
| `plugin-sdk/host-runtime` | Helper normalisasi host | `normalizeHostname`, `normalizeScpRemoteHost` |
|
||||
| `plugin-sdk/retry-runtime` | Helper retry | `RetryConfig`, `retryAsync`, runner kebijakan |
|
||||
| `plugin-sdk/retry-runtime` | Helper retry | `RetryConfig`, `retryAsync`, pelaksana kebijakan |
|
||||
| `plugin-sdk/allow-from` | Pemformatan allowlist | `formatAllowFromLowercase` |
|
||||
| `plugin-sdk/allowlist-resolution` | Pemetaan input allowlist | `mapAllowlistResolutionInputs` |
|
||||
| `plugin-sdk/command-auth` | Gating perintah dan helper surface perintah | `resolveControlCommandGate`, helper otorisasi pengirim, helper registry perintah |
|
||||
| `plugin-sdk/command-auth` | Gating perintah dan helper permukaan perintah | `resolveControlCommandGate`, helper otorisasi pengirim, helper registry perintah |
|
||||
| `plugin-sdk/command-status` | Perender status/bantuan perintah | `buildCommandsMessage`, `buildCommandsMessagePaginated`, `buildHelpMessage` |
|
||||
| `plugin-sdk/secret-input` | Parsing input secret | Helper input secret |
|
||||
| `plugin-sdk/webhook-ingress` | Helper request webhook | Utilitas target webhook |
|
||||
| `plugin-sdk/webhook-request-guards` | Helper guard body webhook | Helper baca/batas body request |
|
||||
| `plugin-sdk/reply-runtime` | Runtime balasan bersama | Dispatch inbound, heartbeat, planner balasan, chunking |
|
||||
| `plugin-sdk/reply-dispatch-runtime` | Helper dispatch balasan yang sempit | Helper finalisasi + dispatch provider |
|
||||
| `plugin-sdk/webhook-ingress` | Helper permintaan webhook | Utilitas target webhook |
|
||||
| `plugin-sdk/webhook-request-guards` | Helper guard body webhook | Helper baca/batas body permintaan |
|
||||
| `plugin-sdk/reply-runtime` | Runtime balasan bersama | Dispatch masuk, heartbeat, perencana balasan, chunking |
|
||||
| `plugin-sdk/reply-dispatch-runtime` | Helper dispatch balasan yang sempit | Helper finalize + dispatch provider |
|
||||
| `plugin-sdk/reply-history` | Helper riwayat balasan | `buildHistoryContext`, `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, `clearHistoryEntriesIfEnabled` |
|
||||
| `plugin-sdk/reply-reference` | Perencanaan referensi balasan | `createReplyReferencePlanner` |
|
||||
| `plugin-sdk/reply-chunking` | Helper potongan balasan | Helper chunking teks/markdown |
|
||||
| `plugin-sdk/reply-chunking` | Helper chunk balasan | Helper chunking teks/markdown |
|
||||
| `plugin-sdk/session-store-runtime` | Helper session store | Helper path store + updated-at |
|
||||
| `plugin-sdk/state-paths` | Helper path state | Helper direktori state dan OAuth |
|
||||
| `plugin-sdk/state-paths` | Helper path status | Helper direktori state dan OAuth |
|
||||
| `plugin-sdk/routing` | Helper routing/session-key | `resolveAgentRoute`, `buildAgentSessionKey`, `resolveDefaultAgentBoundAccountId`, helper normalisasi session-key |
|
||||
| `plugin-sdk/status-helpers` | Helper status channel | Builder ringkasan status channel/akun, default runtime-state, helper metadata issue |
|
||||
| `plugin-sdk/target-resolver-runtime` | Helper target resolver | Helper target resolver bersama |
|
||||
| `plugin-sdk/status-helpers` | Helper status kanal | Builder ringkasan status kanal/akun, default status runtime, helper metadata isu |
|
||||
| `plugin-sdk/target-resolver-runtime` | Helper resolver target | Helper resolver target bersama |
|
||||
| `plugin-sdk/string-normalization-runtime` | Helper normalisasi string | Helper normalisasi slug/string |
|
||||
| `plugin-sdk/request-url` | Helper URL request | Mengekstrak URL string dari input mirip request |
|
||||
| `plugin-sdk/run-command` | Helper perintah bertempo | Runner perintah bertempo dengan stdout/stderr ternormalisasi |
|
||||
| `plugin-sdk/request-url` | Helper URL permintaan | Ekstrak URL string dari input mirip request |
|
||||
| `plugin-sdk/run-command` | Helper perintah terwaktu | Runner perintah terwaktu dengan stdout/stderr ternormalisasi |
|
||||
| `plugin-sdk/param-readers` | Pembaca parameter | Pembaca parameter tool/CLI umum |
|
||||
| `plugin-sdk/tool-payload` | Ekstraksi payload tool | Mengekstrak payload ternormalisasi dari objek hasil tool |
|
||||
| `plugin-sdk/tool-send` | Ekstraksi pengiriman tool | Mengekstrak field target kirim kanonis dari argumen tool |
|
||||
| `plugin-sdk/temp-path` | Helper path temp | Helper path unduhan sementara bersama |
|
||||
| `plugin-sdk/logging-core` | Helper logging | Helper logger subsistem dan redaksi |
|
||||
| `plugin-sdk/markdown-table-runtime` | Helper tabel markdown | Helper mode tabel markdown |
|
||||
| `plugin-sdk/tool-payload` | Ekstraksi payload tool | Ekstrak payload ternormalisasi dari objek hasil tool |
|
||||
| `plugin-sdk/tool-send` | Ekstraksi pengiriman tool | Ekstrak field target kirim kanonis dari argumen tool |
|
||||
| `plugin-sdk/temp-path` | Helper path sementara | Helper path unduhan sementara bersama |
|
||||
| `plugin-sdk/logging-core` | Helper logging | Logger subsistem dan helper redaksi |
|
||||
| `plugin-sdk/markdown-table-runtime` | Helper markdown-table | Helper mode tabel markdown |
|
||||
| `plugin-sdk/reply-payload` | Tipe balasan pesan | Tipe payload balasan |
|
||||
| `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted yang terkurasi | Helper penemuan/config provider self-hosted |
|
||||
| `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted terkurasi | Helper penemuan/config provider self-hosted |
|
||||
| `plugin-sdk/self-hosted-provider-setup` | Helper setup provider self-hosted kompatibel OpenAI yang terfokus | Helper penemuan/config provider self-hosted yang sama |
|
||||
| `plugin-sdk/provider-auth-runtime` | Helper auth runtime provider | Helper resolusi API key runtime |
|
||||
| `plugin-sdk/provider-auth-api-key` | Helper setup API key provider | Helper onboarding/profile-write API key |
|
||||
| `plugin-sdk/provider-auth-result` | Helper hasil auth provider | Builder standar hasil auth OAuth |
|
||||
| `plugin-sdk/provider-auth-api-key` | Helper setup API key provider | Helper onboarding/tulis profil API key |
|
||||
| `plugin-sdk/provider-auth-result` | Helper hasil auth provider | Builder hasil auth OAuth standar |
|
||||
| `plugin-sdk/provider-auth-login` | Helper login interaktif provider | Helper login interaktif bersama |
|
||||
| `plugin-sdk/provider-env-vars` | Helper env var provider | Helper lookup env var auth provider |
|
||||
| `plugin-sdk/provider-env-vars` | Helper env var provider | Helper pencarian env var auth provider |
|
||||
| `plugin-sdk/provider-model-shared` | Helper model/replay provider bersama | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, builder kebijakan replay bersama, helper endpoint provider, dan helper normalisasi model-id |
|
||||
| `plugin-sdk/provider-catalog-shared` | Helper katalog provider bersama | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
|
||||
| `plugin-sdk/provider-onboard` | Patch onboarding provider | Helper config onboarding |
|
||||
| `plugin-sdk/provider-http` | Helper HTTP provider | Helper kemampuan HTTP/endpoint provider generik |
|
||||
| `plugin-sdk/provider-http` | Helper HTTP provider | Helper generik kemampuan HTTP/endpoint provider |
|
||||
| `plugin-sdk/provider-web-fetch` | Helper web-fetch provider | Helper registrasi/cache provider web-fetch |
|
||||
| `plugin-sdk/provider-web-search-config-contract` | Helper config web-search provider | Helper config/kredensial web-search yang sempit untuk provider yang tidak memerlukan wiring enable plugin |
|
||||
| `plugin-sdk/provider-web-search-contract` | Helper kontrak web-search provider | Helper kontrak config/kredensial web-search yang sempit seperti `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial terlingkup |
|
||||
| `plugin-sdk/provider-web-search-config-contract` | Helper config web-search provider | Helper config/kredensial web-search sempit untuk provider yang tidak memerlukan wiring enable plugin |
|
||||
| `plugin-sdk/provider-web-search-contract` | Helper kontrak web-search provider | Helper kontrak config/kredensial web-search sempit seperti `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial berskala |
|
||||
| `plugin-sdk/provider-web-search` | Helper web-search provider | Helper registrasi/cache/runtime provider web-search |
|
||||
| `plugin-sdk/provider-tools` | Helper kompatibilitas tool/skema provider | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, pembersihan skema Gemini + diagnostik, dan helper kompatibilitas xAI seperti `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
|
||||
| `plugin-sdk/provider-tools` | Helper kompat schema/tool provider | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, pembersihan schema Gemini + diagnostik, dan helper kompat xAI seperti `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
|
||||
| `plugin-sdk/provider-usage` | Helper penggunaan provider | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage`, dan helper penggunaan provider lainnya |
|
||||
| `plugin-sdk/provider-stream` | Helper pembungkus stream provider | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipe pembungkus stream, dan helper pembungkus bersama Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
|
||||
| `plugin-sdk/keyed-async-queue` | Queue async terurut | `KeyedAsyncQueue` |
|
||||
| `plugin-sdk/provider-stream` | Helper wrapper stream provider | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipe wrapper stream, dan helper wrapper bersama Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
|
||||
| `plugin-sdk/keyed-async-queue` | Antrean async berurutan | `KeyedAsyncQueue` |
|
||||
| `plugin-sdk/media-runtime` | Helper media bersama | Helper fetch/transform/store media plus builder payload media |
|
||||
| `plugin-sdk/media-generation-runtime` | Helper pembuatan media bersama | Helper failover bersama, pemilihan kandidat, dan pesan model hilang untuk pembuatan gambar/video/musik |
|
||||
| `plugin-sdk/media-understanding` | Helper pemahaman media | Tipe provider pemahaman media plus ekspor helper gambar/audio untuk provider |
|
||||
| `plugin-sdk/text-runtime` | Helper teks bersama | Penghapusan teks yang terlihat oleh asisten, helper render/chunking/table markdown, helper redaksi, helper tag direktif, utilitas safe-text, dan helper teks/logging terkait |
|
||||
| `plugin-sdk/text-chunking` | Helper chunking teks | Helper chunking teks outbound |
|
||||
| `plugin-sdk/media-generation-runtime` | Helper media-generation bersama | Helper failover bersama, pemilihan kandidat, dan pesan model hilang untuk pembuatan gambar/video/musik |
|
||||
| `plugin-sdk/media-understanding` | Helper media-understanding | Tipe provider media-understanding plus ekspor helper gambar/audio untuk provider |
|
||||
| `plugin-sdk/text-runtime` | Helper teks bersama | Penghapusan teks yang terlihat asisten, helper render/chunking/tabel markdown, helper redaksi, helper tag direktif, utilitas teks aman, dan helper teks/logging terkait |
|
||||
| `plugin-sdk/text-chunking` | Helper chunking teks | Helper chunking teks keluar |
|
||||
| `plugin-sdk/speech` | Helper speech | Tipe provider speech plus ekspor helper direktif, registry, dan validasi untuk provider |
|
||||
| `plugin-sdk/speech-core` | Inti speech bersama | Tipe provider speech, registry, direktif, normalisasi |
|
||||
| `plugin-sdk/speech-core` | Core speech bersama | Tipe provider speech, registry, direktif, normalisasi |
|
||||
| `plugin-sdk/realtime-transcription` | Helper transkripsi realtime | Tipe provider dan helper registry |
|
||||
| `plugin-sdk/realtime-voice` | Helper suara realtime | Tipe provider dan helper registry |
|
||||
| `plugin-sdk/image-generation-core` | Inti image-generation bersama | Tipe image-generation, failover, auth, dan helper registry |
|
||||
| `plugin-sdk/music-generation` | Helper music-generation | Tipe provider/request/result music-generation |
|
||||
| `plugin-sdk/music-generation-core` | Inti music-generation bersama | Tipe music-generation, helper failover, lookup provider, dan parsing model-ref |
|
||||
| `plugin-sdk/video-generation` | Helper video-generation | Tipe provider/request/result video-generation |
|
||||
| `plugin-sdk/video-generation-core` | Inti video-generation bersama | Tipe video-generation, helper failover, lookup provider, dan parsing model-ref |
|
||||
| `plugin-sdk/image-generation-core` | Core image-generation bersama | Tipe image-generation, failover, auth, dan helper registry |
|
||||
| `plugin-sdk/music-generation` | Helper music-generation | Tipe provider/permintaan/hasil music-generation |
|
||||
| `plugin-sdk/music-generation-core` | Core music-generation bersama | Tipe music-generation, helper failover, pencarian provider, dan parsing model-ref |
|
||||
| `plugin-sdk/video-generation` | Helper video-generation | Tipe provider/permintaan/hasil video-generation |
|
||||
| `plugin-sdk/video-generation-core` | Core video-generation bersama | Tipe video-generation, helper failover, pencarian provider, dan parsing model-ref |
|
||||
| `plugin-sdk/interactive-runtime` | Helper balasan interaktif | Normalisasi/reduksi payload balasan interaktif |
|
||||
| `plugin-sdk/channel-config-primitives` | Primitive config channel | Primitive channel config-schema yang sempit |
|
||||
| `plugin-sdk/channel-config-writes` | Helper penulisan config channel | Helper otorisasi penulisan config channel |
|
||||
| `plugin-sdk/channel-plugin-common` | Prelude channel bersama | Ekspor prelude plugin channel bersama |
|
||||
| `plugin-sdk/channel-status` | Helper status channel | Helper snapshot/ringkasan status channel bersama |
|
||||
| `plugin-sdk/channel-config-primitives` | Primitive config kanal | Primitive channel config-schema yang sempit |
|
||||
| `plugin-sdk/channel-config-writes` | Helper penulisan config kanal | Helper otorisasi penulisan config kanal |
|
||||
| `plugin-sdk/channel-plugin-common` | Prelude kanal bersama | Ekspor prelude plugin kanal bersama |
|
||||
| `plugin-sdk/channel-status` | Helper status kanal | Helper snapshot/ringkasan status kanal bersama |
|
||||
| `plugin-sdk/allowlist-config-edit` | Helper config allowlist | Helper edit/baca config allowlist |
|
||||
| `plugin-sdk/group-access` | Helper akses grup | Helper keputusan akses grup bersama |
|
||||
| `plugin-sdk/direct-dm` | Helper DM langsung | Helper auth/guard DM langsung bersama |
|
||||
| `plugin-sdk/extension-shared` | Helper extension bersama | Primitive helper passive-channel/status dan ambient proxy |
|
||||
| `plugin-sdk/webhook-targets` | Helper target webhook | Registry target webhook dan helper pemasangan route |
|
||||
| `plugin-sdk/extension-shared` | Helper ekstensi bersama | Primitive helper kanal/status pasif dan proxy ambient |
|
||||
| `plugin-sdk/webhook-targets` | Helper target webhook | Registry target webhook dan helper instalasi route |
|
||||
| `plugin-sdk/webhook-path` | Helper path webhook | Helper normalisasi path webhook |
|
||||
| `plugin-sdk/web-media` | Helper media web bersama | Helper pemuatan media jarak jauh/lokal |
|
||||
| `plugin-sdk/web-media` | Helper media web bersama | Helper pemuatan media remote/lokal |
|
||||
| `plugin-sdk/zod` | Ekspor ulang Zod | `zod` yang diekspor ulang untuk konsumen plugin SDK |
|
||||
| `plugin-sdk/memory-core` | Helper memory-core bawaan | Surface helper manajer/config/file/CLI memory |
|
||||
| `plugin-sdk/memory-core-engine-runtime` | Fasad runtime engine memory | Fasad runtime index/search memory |
|
||||
| `plugin-sdk/memory-core` | Helper memory-core bawaan | Permukaan helper memory manager/config/file/CLI |
|
||||
| `plugin-sdk/memory-core-engine-runtime` | Fasad runtime engine memory | Fasad runtime indeks/pencarian memory |
|
||||
| `plugin-sdk/memory-core-host-engine-foundation` | Engine foundation host memory | Ekspor engine foundation host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-embeddings` | Engine embedding host memory | Ekspor engine embedding host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-qmd` | Engine QMD host memory | Ekspor engine QMD host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-storage` | Engine penyimpanan host memory | Ekspor engine penyimpanan host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-storage` | Engine storage host memory | Ekspor engine storage host memory |
|
||||
| `plugin-sdk/memory-core-host-multimodal` | Helper multimodal host memory | Helper multimodal host memory |
|
||||
| `plugin-sdk/memory-core-host-query` | Helper query host memory | Helper query host memory |
|
||||
| `plugin-sdk/memory-core-host-secret` | Helper secret host memory | Helper secret host memory |
|
||||
| `plugin-sdk/memory-core-host-events` | Helper jurnal event host memory | Helper jurnal event host memory |
|
||||
| `plugin-sdk/memory-core-host-events` | Helper jurnal peristiwa host memory | Helper jurnal peristiwa host memory |
|
||||
| `plugin-sdk/memory-core-host-status` | Helper status host memory | Helper status host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-cli` | Runtime CLI host memory | Helper runtime CLI host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-core` | Runtime inti host memory | Helper runtime inti host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-core` | Runtime core host memory | Helper runtime core host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-files` | Helper file/runtime host memory | Helper file/runtime host memory |
|
||||
| `plugin-sdk/memory-host-core` | Alias runtime inti host memory | Alias netral-vendor untuk helper runtime inti host memory |
|
||||
| `plugin-sdk/memory-host-events` | Alias jurnal event host memory | Alias netral-vendor untuk helper jurnal event host memory |
|
||||
| `plugin-sdk/memory-host-core` | Alias runtime core host memory | Alias netral-vendor untuk helper runtime core host memory |
|
||||
| `plugin-sdk/memory-host-events` | Alias jurnal peristiwa host memory | Alias netral-vendor untuk helper jurnal peristiwa host memory |
|
||||
| `plugin-sdk/memory-host-files` | Alias file/runtime host memory | Alias netral-vendor untuk helper file/runtime host memory |
|
||||
| `plugin-sdk/memory-host-markdown` | Helper markdown terkelola | Helper managed-markdown bersama untuk plugin yang berdekatan dengan memory |
|
||||
| `plugin-sdk/memory-host-search` | Fasad pencarian memory aktif | Fasad runtime search-manager active-memory lazy |
|
||||
| `plugin-sdk/memory-host-search` | Fasad pencarian memory aktif | Fasad runtime lazy active-memory search-manager |
|
||||
| `plugin-sdk/memory-host-status` | Alias status host memory | Alias netral-vendor untuk helper status host memory |
|
||||
| `plugin-sdk/memory-lancedb` | Helper memory-lancedb bawaan | Surface helper memory-lancedb |
|
||||
| `plugin-sdk/testing` | Utilitas pengujian | Helper pengujian dan mock |
|
||||
| `plugin-sdk/memory-lancedb` | Helper memory-lancedb bawaan | Permukaan helper memory-lancedb |
|
||||
| `plugin-sdk/testing` | Utilitas pengujian | Helper dan mock pengujian |
|
||||
</Accordion>
|
||||
|
||||
Tabel ini sengaja merupakan subset migrasi umum, bukan seluruh
|
||||
surface SDK. Daftar lengkap 200+ entrypoint ada di
|
||||
permukaan SDK. Daftar lengkap 200+ entrypoint berada di
|
||||
`scripts/lib/plugin-sdk-entrypoints.json`.
|
||||
|
||||
Daftar itu masih mencakup beberapa seam helper bundled-plugin seperti
|
||||
`plugin-sdk/feishu`, `plugin-sdk/feishu-setup`, `plugin-sdk/zalo`,
|
||||
`plugin-sdk/zalo-setup`, dan `plugin-sdk/matrix*`. Itu tetap diekspor untuk
|
||||
`plugin-sdk/zalo-setup`, dan `plugin-sdk/matrix*`. Semuanya tetap diekspor untuk
|
||||
pemeliharaan bundled-plugin dan kompatibilitas, tetapi sengaja
|
||||
dihilangkan dari tabel migrasi umum dan bukan target yang direkomendasikan untuk
|
||||
kode plugin baru.
|
||||
|
||||
Aturan yang sama berlaku untuk keluarga helper bawaan lainnya seperti:
|
||||
Aturan yang sama berlaku untuk keluarga bundled-helper lainnya seperti:
|
||||
|
||||
- helper dukungan browser: `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support`
|
||||
- Matrix: `plugin-sdk/matrix*`
|
||||
- LINE: `plugin-sdk/line*`
|
||||
- IRC: `plugin-sdk/irc*`
|
||||
- surface helper/plugin bawaan seperti `plugin-sdk/googlechat`,
|
||||
- permukaan helper/plugin bawaan seperti `plugin-sdk/googlechat`,
|
||||
`plugin-sdk/zalouser`, `plugin-sdk/bluebubbles*`,
|
||||
`plugin-sdk/mattermost*`, `plugin-sdk/msteams`,
|
||||
`plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`,
|
||||
@ -372,38 +373,38 @@ Aturan yang sama berlaku untuk keluarga helper bawaan lainnya seperti:
|
||||
`plugin-sdk/thread-ownership`, dan `plugin-sdk/voice-call`
|
||||
|
||||
`plugin-sdk/github-copilot-token` saat ini mengekspos
|
||||
surface helper token yang sempit `DEFAULT_COPILOT_API_BASE_URL`,
|
||||
permukaan helper token yang sempit `DEFAULT_COPILOT_API_BASE_URL`,
|
||||
`deriveCopilotApiBaseUrlFromToken`, dan `resolveCopilotApiToken`.
|
||||
|
||||
Gunakan impor tersempit yang sesuai dengan pekerjaan Anda. Jika Anda tidak dapat menemukan ekspor,
|
||||
periksa source di `src/plugin-sdk/` atau tanyakan di Discord.
|
||||
Gunakan impor tersempit yang sesuai dengan pekerjaan. Jika Anda tidak dapat menemukan ekspor,
|
||||
periksa sumber di `src/plugin-sdk/` atau tanyakan di Discord.
|
||||
|
||||
## Linimasa penghapusan
|
||||
|
||||
| Kapan | Apa yang terjadi |
|
||||
| ---------------------- | --------------------------------------------------------------------- |
|
||||
| **Sekarang** | Surface deprecated mengeluarkan peringatan runtime |
|
||||
| **Rilis mayor berikutnya** | Surface deprecated akan dihapus; plugin yang masih menggunakannya akan gagal |
|
||||
| Kapan | Apa yang terjadi |
|
||||
| ---------------------- | ----------------------------------------------------------------------- |
|
||||
| **Sekarang** | Permukaan deprecated memancarkan peringatan runtime |
|
||||
| **Rilis mayor berikutnya** | Permukaan deprecated akan dihapus; plugin yang masih menggunakannya akan gagal |
|
||||
|
||||
Semua plugin core sudah dimigrasikan. Plugin eksternal sebaiknya bermigrasi
|
||||
Semua plugin core sudah dimigrasikan. Plugin eksternal harus bermigrasi
|
||||
sebelum rilis mayor berikutnya.
|
||||
|
||||
## Menyembunyikan peringatan sementara
|
||||
|
||||
Setel variabel environment ini saat Anda sedang melakukan migrasi:
|
||||
Setel variabel environment ini saat Anda sedang mengerjakan migrasi:
|
||||
|
||||
```bash
|
||||
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway run
|
||||
OPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run
|
||||
```
|
||||
|
||||
Ini adalah celah keluar sementara, bukan solusi permanen.
|
||||
Ini adalah jalan keluar sementara, bukan solusi permanen.
|
||||
|
||||
## Terkait
|
||||
|
||||
- [Getting Started](/id/plugins/building-plugins) — bangun plugin pertama Anda
|
||||
- [SDK Overview](/id/plugins/sdk-overview) — referensi lengkap impor subpath
|
||||
- [Channel Plugins](/id/plugins/sdk-channel-plugins) — membangun plugin channel
|
||||
- [Provider Plugins](/id/plugins/sdk-provider-plugins) — membangun plugin provider
|
||||
- [Plugin Internals](/id/plugins/architecture) — pendalaman arsitektur
|
||||
- [Plugin Manifest](/id/plugins/manifest) — referensi skema manifest
|
||||
- [Memulai](/id/plugins/building-plugins) — buat plugin pertama Anda
|
||||
- [Ikhtisar SDK](/id/plugins/sdk-overview) — referensi impor subpath lengkap
|
||||
- [Plugin Kanal](/id/plugins/sdk-channel-plugins) — membangun plugin kanal
|
||||
- [Plugin Provider](/id/plugins/sdk-provider-plugins) — membangun plugin provider
|
||||
- [Internal Plugin](/id/plugins/architecture) — pendalaman arsitektur
|
||||
- [Manifest Plugin](/id/plugins/manifest) — referensi schema manifest
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
---
|
||||
read_when:
|
||||
- Anda perlu mengetahui subpath SDK mana yang harus diimpor dari
|
||||
- Anda perlu mengetahui subpath SDK mana yang harus diimpor
|
||||
- Anda menginginkan referensi untuk semua metode pendaftaran pada OpenClawPluginApi
|
||||
- Anda sedang mencari ekspor SDK tertentu
|
||||
- Anda sedang mencari export SDK tertentu
|
||||
sidebarTitle: SDK Overview
|
||||
summary: Peta impor, referensi API pendaftaran, dan arsitektur SDK
|
||||
summary: Peta import, referensi API pendaftaran, dan arsitektur SDK
|
||||
title: Ikhtisar Plugin SDK
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T09:13:46Z"
|
||||
generated_at: "2026-04-09T01:30:24Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 6e7b420eb0f3faa8916357d52df949f6c9a46f1c843a1e6a0c0b8bb26db6cbff
|
||||
source_hash: bf205af060971931df97dca4af5110ce173d2b7c12f56ad7c62d664a402f2381
|
||||
source_path: plugins/sdk-overview.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -22,9 +22,9 @@ referensi untuk **apa yang harus diimpor** dan **apa yang dapat Anda daftarkan**
|
||||
|
||||
<Tip>
|
||||
**Mencari panduan cara melakukannya?**
|
||||
- Plugin pertama? Mulai dengan [Getting Started](/id/plugins/building-plugins)
|
||||
- Plugin channel? Lihat [Channel Plugins](/id/plugins/sdk-channel-plugins)
|
||||
- Plugin provider? Lihat [Provider Plugins](/id/plugins/sdk-provider-plugins)
|
||||
- Plugin pertama? Mulai dari [Getting Started](/id/plugins/building-plugins)
|
||||
- Plugin channel? Lihat [Plugin Channel](/id/plugins/sdk-channel-plugins)
|
||||
- Plugin penyedia? Lihat [Plugin Penyedia](/id/plugins/sdk-provider-plugins)
|
||||
</Tip>
|
||||
|
||||
## Konvensi impor
|
||||
@ -36,39 +36,38 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
||||
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
||||
```
|
||||
|
||||
Setiap subpath adalah modul kecil yang berdiri sendiri. Ini menjaga startup tetap cepat dan
|
||||
mencegah masalah dependensi melingkar. Untuk helper entry/build khusus channel,
|
||||
utamakan `openclaw/plugin-sdk/channel-core`; gunakan `openclaw/plugin-sdk/core` untuk
|
||||
permukaan payung yang lebih luas dan helper bersama seperti
|
||||
Setiap subpath adalah modul kecil yang mandiri. Ini menjaga startup tetap cepat dan
|
||||
mencegah masalah dependensi sirkular. Untuk helper entry/build khusus channel,
|
||||
pilih `openclaw/plugin-sdk/channel-core`; gunakan `openclaw/plugin-sdk/core` untuk
|
||||
surface payung yang lebih luas dan helper bersama seperti
|
||||
`buildChannelConfigSchema`.
|
||||
|
||||
Jangan tambahkan atau bergantung pada seam kemudahan bernama provider seperti
|
||||
Jangan menambahkan atau bergantung pada seam kenyamanan bernama penyedia seperti
|
||||
`openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
|
||||
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, atau
|
||||
seam helper bermerek channel. Plugin bawaan harus menyusun subpath
|
||||
SDK generik di dalam barrel `api.ts` atau `runtime-api.ts` mereka sendiri, dan core
|
||||
harus menggunakan barrel lokal plugin tersebut atau menambahkan kontrak SDK generik
|
||||
yang sempit saat kebutuhannya benar-benar lintas channel.
|
||||
SDK generik di dalam barrel `api.ts` atau `runtime-api.ts` miliknya sendiri, dan core
|
||||
harus menggunakan barrel lokal plugin tersebut atau menambahkan kontrak SDK generik sempit
|
||||
saat kebutuhannya benar-benar lintas channel.
|
||||
|
||||
Peta ekspor yang dihasilkan masih memuat sejumlah kecil seam helper plugin bawaan
|
||||
seperti `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
|
||||
Peta export yang dihasilkan masih memuat sekumpulan kecil seam helper
|
||||
plugin bawaan seperti `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
|
||||
`plugin-sdk/zalo`, `plugin-sdk/zalo-setup`, dan `plugin-sdk/matrix*`. Subpath
|
||||
tersebut hanya ada untuk pemeliharaan dan kompatibilitas plugin bawaan; subpath itu
|
||||
sengaja tidak dimasukkan dari tabel umum di bawah dan bukan jalur impor yang
|
||||
direkomendasikan untuk plugin pihak ketiga yang baru.
|
||||
tersebut ada hanya untuk pemeliharaan dan kompatibilitas plugin bawaan; sengaja tidak dicantumkan
|
||||
dalam tabel umum di bawah ini dan bukan jalur impor yang direkomendasikan untuk plugin pihak ketiga baru.
|
||||
|
||||
## Referensi subpath
|
||||
|
||||
Subpath yang paling umum digunakan, dikelompokkan berdasarkan tujuan. Daftar lengkap yang dihasilkan
|
||||
berisi lebih dari 200 subpath ada di `scripts/lib/plugin-sdk-entrypoints.json`.
|
||||
Subpath yang paling umum digunakan, dikelompokkan berdasarkan tujuan. Daftar lengkap yang dihasilkan berisi
|
||||
200+ subpath berada di `scripts/lib/plugin-sdk-entrypoints.json`.
|
||||
|
||||
Subpath helper plugin bawaan yang dicadangkan masih muncul dalam daftar yang dihasilkan itu.
|
||||
Perlakukan itu sebagai permukaan detail implementasi/kompatibilitas kecuali suatu halaman dokumentasi
|
||||
Subpath helper plugin bawaan yang dicadangkan masih muncul dalam daftar yang dihasilkan tersebut.
|
||||
Perlakukan itu sebagai detail implementasi/surface kompatibilitas kecuali sebuah halaman dokumen
|
||||
secara eksplisit mempromosikannya sebagai publik.
|
||||
|
||||
### Entri plugin
|
||||
|
||||
| Subpath | Ekspor utama |
|
||||
| Subpath | Export utama |
|
||||
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `plugin-sdk/plugin-entry` | `definePluginEntry` |
|
||||
| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` |
|
||||
@ -77,10 +76,10 @@ secara eksplisit mempromosikannya sebagai publik.
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Subpath channel">
|
||||
| Subpath | Ekspor utama |
|
||||
| Subpath | Export utama |
|
||||
| --- | --- |
|
||||
| `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
|
||||
| `plugin-sdk/config-schema` | Ekspor skema Zod root `openclaw.json` (`OpenClawSchema`) |
|
||||
| `plugin-sdk/config-schema` | Export skema Zod root `openclaw.json` (`OpenClawSchema`) |
|
||||
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, serta `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
|
||||
| `plugin-sdk/setup` | Helper wizard setup bersama, prompt allowlist, builder status setup |
|
||||
| `plugin-sdk/setup-runtime` | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
|
||||
@ -88,215 +87,216 @@ secara eksplisit mempromosikannya sebagai publik.
|
||||
| `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
||||
| `plugin-sdk/account-core` | Helper multi-akun config/action-gate, helper fallback akun default |
|
||||
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, helper normalisasi account-id |
|
||||
| `plugin-sdk/account-resolution` | Helper pencarian akun + fallback default |
|
||||
| `plugin-sdk/account-helpers` | Helper sempit untuk daftar akun/tindakan akun |
|
||||
| `plugin-sdk/account-resolution` | Helper lookup akun + fallback default |
|
||||
| `plugin-sdk/account-helpers` | Helper sempit daftar-aksi akun/aksi akun |
|
||||
| `plugin-sdk/channel-pairing` | `createChannelPairingController` |
|
||||
| `plugin-sdk/channel-reply-pipeline` | `createChannelReplyPipeline` |
|
||||
| `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter` |
|
||||
| `plugin-sdk/channel-config-schema` | Tipe skema config channel |
|
||||
| `plugin-sdk/telegram-command-config` | Helper normalisasi/validasi custom command Telegram dengan fallback kontrak bawaan |
|
||||
| `plugin-sdk/channel-config-schema` | Tipe skema konfigurasi channel |
|
||||
| `plugin-sdk/telegram-command-config` | Helper normalisasi/validasi perintah kustom Telegram dengan fallback kontrak bawaan |
|
||||
| `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` |
|
||||
| `plugin-sdk/channel-lifecycle` | `createAccountStatusSink` |
|
||||
| `plugin-sdk/inbound-envelope` | Helper rute inbound + builder envelope bersama |
|
||||
| `plugin-sdk/inbound-reply-dispatch` | Helper record-and-dispatch inbound bersama |
|
||||
| `plugin-sdk/inbound-envelope` | Helper route inbound + builder envelope bersama |
|
||||
| `plugin-sdk/inbound-reply-dispatch` | Helper pencatatan-dan-dispatch inbound bersama |
|
||||
| `plugin-sdk/messaging-targets` | Helper parsing/pencocokan target |
|
||||
| `plugin-sdk/outbound-media` | Helper pemuatan media outbound bersama |
|
||||
| `plugin-sdk/outbound-runtime` | Helper identitas outbound/delegasi pengiriman |
|
||||
| `plugin-sdk/outbound-runtime` | Helper delegasi identitas/kirim outbound |
|
||||
| `plugin-sdk/thread-bindings-runtime` | Siklus hidup thread-binding dan helper adapter |
|
||||
| `plugin-sdk/agent-media-payload` | Builder payload media agent lama |
|
||||
| `plugin-sdk/conversation-runtime` | Helper binding percakapan/thread, pairing, dan configured-binding |
|
||||
| `plugin-sdk/runtime-config-snapshot` | Helper snapshot config runtime |
|
||||
| `plugin-sdk/runtime-group-policy` | Helper resolusi group-policy runtime |
|
||||
| `plugin-sdk/agent-media-payload` | Builder payload media agen lama |
|
||||
| `plugin-sdk/conversation-runtime` | Helper pengikatan percakapan/thread, pairing, dan configured-binding |
|
||||
| `plugin-sdk/runtime-config-snapshot` | Helper snapshot konfigurasi runtime |
|
||||
| `plugin-sdk/runtime-group-policy` | Helper resolusi kebijakan grup runtime |
|
||||
| `plugin-sdk/channel-status` | Helper snapshot/ringkasan status channel bersama |
|
||||
| `plugin-sdk/channel-config-primitives` | Primitive sempit skema config channel |
|
||||
| `plugin-sdk/channel-config-writes` | Helper otorisasi penulisan config channel |
|
||||
| `plugin-sdk/channel-plugin-common` | Ekspor prelude plugin channel bersama |
|
||||
| `plugin-sdk/allowlist-config-edit` | Helper edit/baca config allowlist |
|
||||
| `plugin-sdk/channel-config-primitives` | Primitif skema konfigurasi channel yang sempit |
|
||||
| `plugin-sdk/channel-config-writes` | Helper otorisasi penulisan konfigurasi channel |
|
||||
| `plugin-sdk/channel-plugin-common` | Export prelude plugin channel bersama |
|
||||
| `plugin-sdk/allowlist-config-edit` | Helper edit/baca konfigurasi allowlist |
|
||||
| `plugin-sdk/group-access` | Helper keputusan akses grup bersama |
|
||||
| `plugin-sdk/direct-dm` | Helper auth/guard direct-DM bersama |
|
||||
| `plugin-sdk/direct-dm` | Helper auth/guard DM langsung bersama |
|
||||
| `plugin-sdk/interactive-runtime` | Helper normalisasi/reduksi payload balasan interaktif |
|
||||
| `plugin-sdk/channel-inbound` | Debounce inbound, pencocokan mention, helper kebijakan mention, dan helper envelope |
|
||||
| `plugin-sdk/channel-inbound` | Helper debounce inbound, pencocokan mention, kebijakan mention, dan helper envelope |
|
||||
| `plugin-sdk/channel-send-result` | Tipe hasil balasan |
|
||||
| `plugin-sdk/channel-actions` | `createMessageToolButtonsSchema`, `createMessageToolCardSchema` |
|
||||
| `plugin-sdk/channel-targets` | Helper parsing/pencocokan target |
|
||||
| `plugin-sdk/channel-contract` | Tipe kontrak channel |
|
||||
| `plugin-sdk/channel-feedback` | Wiring feedback/reaksi |
|
||||
| `plugin-sdk/channel-secret-runtime` | Helper kontrak secret yang sempit seperti `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, dan tipe target secret |
|
||||
| `plugin-sdk/channel-secret-runtime` | Helper kontrak rahasia sempit seperti `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, dan tipe target rahasia |
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Subpath provider">
|
||||
| Subpath | Ekspor utama |
|
||||
<Accordion title="Subpath penyedia">
|
||||
| Subpath | Export utama |
|
||||
| --- | --- |
|
||||
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
|
||||
| `plugin-sdk/provider-setup` | Helper setup provider lokal/self-hosted yang terkurasi |
|
||||
| `plugin-sdk/self-hosted-provider-setup` | Helper setup provider self-hosted kompatibel OpenAI yang terfokus |
|
||||
| `plugin-sdk/provider-setup` | Helper setup penyedia lokal/self-hosted terkurasi |
|
||||
| `plugin-sdk/self-hosted-provider-setup` | Helper setup penyedia self-hosted kompatibel OpenAI yang terfokus |
|
||||
| `plugin-sdk/cli-backend` | Default backend CLI + konstanta watchdog |
|
||||
| `plugin-sdk/provider-auth-runtime` | Helper resolusi API key runtime untuk plugin provider |
|
||||
| `plugin-sdk/provider-auth-runtime` | Helper resolusi API key runtime untuk plugin penyedia |
|
||||
| `plugin-sdk/provider-auth-api-key` | Helper onboarding/penulisan profil API key seperti `upsertApiKeyProfile` |
|
||||
| `plugin-sdk/provider-auth-result` | Builder hasil auth OAuth standar |
|
||||
| `plugin-sdk/provider-auth-login` | Helper login interaktif bersama untuk plugin provider |
|
||||
| `plugin-sdk/provider-env-vars` | Helper pencarian env var auth provider |
|
||||
| `plugin-sdk/provider-auth-login` | Helper login interaktif bersama untuk plugin penyedia |
|
||||
| `plugin-sdk/provider-env-vars` | Helper lookup env var auth penyedia |
|
||||
| `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile`, `upsertApiKeyProfile`, `writeOAuthCredentials` |
|
||||
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, builder kebijakan replay bersama, helper endpoint provider, dan helper normalisasi model-id seperti `normalizeNativeXaiModelId` |
|
||||
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, builder kebijakan replay bersama, helper endpoint penyedia, dan helper normalisasi model-id seperti `normalizeNativeXaiModelId` |
|
||||
| `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
|
||||
| `plugin-sdk/provider-http` | Helper kapabilitas HTTP/endpoint provider generik |
|
||||
| `plugin-sdk/provider-web-fetch-contract` | Helper kontrak config/seleksi web-fetch yang sempit seperti `enablePluginInConfig` dan `WebFetchProviderPlugin` |
|
||||
| `plugin-sdk/provider-web-fetch` | Helper pendaftaran/cache provider web-fetch |
|
||||
| `plugin-sdk/provider-web-search-config-contract` | Helper config/kredensial web-search yang sempit untuk provider yang tidak memerlukan wiring enable plugin |
|
||||
| `plugin-sdk/provider-web-search-contract` | Helper kontrak config/kredensial web-search yang sempit seperti `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial berpencakupan |
|
||||
| `plugin-sdk/provider-web-search` | Helper pendaftaran/cache/runtime provider web-search |
|
||||
| `plugin-sdk/provider-http` | Helper kapabilitas HTTP/endpoint penyedia generik |
|
||||
| `plugin-sdk/provider-web-fetch-contract` | Helper kontrak konfigurasi/seleksi web-fetch sempit seperti `enablePluginInConfig` dan `WebFetchProviderPlugin` |
|
||||
| `plugin-sdk/provider-web-fetch` | Helper pendaftaran/cache penyedia web-fetch |
|
||||
| `plugin-sdk/provider-web-search-config-contract` | Helper sempit konfigurasi/kredensial web search untuk penyedia yang tidak memerlukan wiring plugin-enable |
|
||||
| `plugin-sdk/provider-web-search-contract` | Helper kontrak konfigurasi/kredensial web search sempit seperti `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, dan setter/getter kredensial terlingkup |
|
||||
| `plugin-sdk/provider-web-search` | Helper pendaftaran/cache/runtime penyedia web search |
|
||||
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, pembersihan skema Gemini + diagnostik, dan helper kompatibilitas xAI seperti `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
|
||||
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` dan yang serupa |
|
||||
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` dan sejenisnya |
|
||||
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipe wrapper stream, dan helper wrapper bersama Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
|
||||
| `plugin-sdk/provider-onboard` | Helper patch config onboarding |
|
||||
| `plugin-sdk/global-singleton` | Helper singleton/map/cache lokal proses |
|
||||
| `plugin-sdk/provider-onboard` | Helper patch konfigurasi onboarding |
|
||||
| `plugin-sdk/global-singleton` | Helper singleton/peta/cache lokal proses |
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Subpath auth dan keamanan">
|
||||
| Subpath | Ekspor utama |
|
||||
| Subpath | Export utama |
|
||||
| --- | --- |
|
||||
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, helper registri command, helper otorisasi pengirim |
|
||||
| `plugin-sdk/approval-auth-runtime` | Helper resolusi approver dan auth tindakan obrolan yang sama |
|
||||
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, helper registri perintah, helper otorisasi pengirim |
|
||||
| `plugin-sdk/command-status` | Builder pesan perintah/bantuan seperti `buildCommandsMessagePaginated` dan `buildHelpMessage` |
|
||||
| `plugin-sdk/approval-auth-runtime` | Helper resolusi approver dan auth aksi same-chat |
|
||||
| `plugin-sdk/approval-client-runtime` | Helper profil/filter approval exec native |
|
||||
| `plugin-sdk/approval-delivery-runtime` | Adapter kapabilitas/pengiriman approval native |
|
||||
| `plugin-sdk/approval-delivery-runtime` | Adapter kemampuan/pengiriman approval native |
|
||||
| `plugin-sdk/approval-gateway-runtime` | Helper resolusi gateway approval bersama |
|
||||
| `plugin-sdk/approval-handler-adapter-runtime` | Helper pemuatan adapter approval native ringan untuk entrypoint channel yang sering dipanggil |
|
||||
| `plugin-sdk/approval-handler-runtime` | Helper runtime handler approval yang lebih luas; utamakan seam adapter/gateway yang lebih sempit bila itu sudah cukup |
|
||||
| `plugin-sdk/approval-native-runtime` | Helper target approval native + binding akun |
|
||||
| `plugin-sdk/approval-handler-adapter-runtime` | Helper ringan pemuatan adapter approval native untuk entrypoint channel panas |
|
||||
| `plugin-sdk/approval-handler-runtime` | Helper runtime approval handler yang lebih luas; pilih seam adapter/gateway yang lebih sempit bila sudah cukup |
|
||||
| `plugin-sdk/approval-native-runtime` | Helper target approval native + account-binding |
|
||||
| `plugin-sdk/approval-reply-runtime` | Helper payload balasan approval exec/plugin |
|
||||
| `plugin-sdk/command-auth-native` | Auth command native + helper target sesi native |
|
||||
| `plugin-sdk/command-detection` | Helper deteksi command bersama |
|
||||
| `plugin-sdk/command-surface` | Helper normalisasi badan command dan permukaan command |
|
||||
| `plugin-sdk/command-auth-native` | Helper auth perintah native + target sesi native |
|
||||
| `plugin-sdk/command-detection` | Helper deteksi perintah bersama |
|
||||
| `plugin-sdk/command-surface` | Helper normalisasi badan perintah dan surface perintah |
|
||||
| `plugin-sdk/allow-from` | `formatAllowFromLowercase` |
|
||||
| `plugin-sdk/channel-secret-runtime` | Helper koleksi kontrak secret yang sempit untuk permukaan secret channel/plugin |
|
||||
| `plugin-sdk/secret-ref-runtime` | Helper `coerceSecretRef` yang sempit dan helper tipe SecretRef untuk parsing kontrak secret/config |
|
||||
| `plugin-sdk/security-runtime` | Helper trust, gating DM, konten eksternal, dan pengumpulan secret bersama |
|
||||
| `plugin-sdk/channel-secret-runtime` | Helper pengumpulan kontrak rahasia sempit untuk surface rahasia channel/plugin |
|
||||
| `plugin-sdk/secret-ref-runtime` | Helper sempit `coerceSecretRef` dan typing SecretRef untuk parsing kontrak rahasia/konfigurasi |
|
||||
| `plugin-sdk/security-runtime` | Helper trust, gating DM, konten eksternal, dan pengumpulan rahasia bersama |
|
||||
| `plugin-sdk/ssrf-policy` | Helper allowlist host dan kebijakan SSRF jaringan privat |
|
||||
| `plugin-sdk/ssrf-runtime` | Helper pinned-dispatcher, fetch yang dijaga SSRF, dan kebijakan SSRF |
|
||||
| `plugin-sdk/secret-input` | Helper parsing input secret |
|
||||
| `plugin-sdk/webhook-ingress` | Helper request/target webhook |
|
||||
| `plugin-sdk/webhook-request-guards` | Helper ukuran body/timeout request |
|
||||
| `plugin-sdk/ssrf-runtime` | Helper pinned-dispatcher, fetch berpenjaga SSRF, dan kebijakan SSRF |
|
||||
| `plugin-sdk/secret-input` | Helper parsing input rahasia |
|
||||
| `plugin-sdk/webhook-ingress` | Helper permintaan/target webhook |
|
||||
| `plugin-sdk/webhook-request-guards` | Helper ukuran body request/timeout |
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Subpath runtime dan penyimpanan">
|
||||
| Subpath | Ekspor utama |
|
||||
<Accordion title="Subpath runtime dan storage">
|
||||
| Subpath | Export utama |
|
||||
| --- | --- |
|
||||
| `plugin-sdk/runtime` | Helper runtime/logging/backup/instal plugin yang luas |
|
||||
| `plugin-sdk/runtime-env` | Helper env runtime, logger, timeout, retry, dan backoff yang sempit |
|
||||
| `plugin-sdk/channel-runtime-context` | Helper generik untuk pendaftaran dan pencarian konteks runtime channel |
|
||||
| `plugin-sdk/runtime` | Helper luas runtime/logging/backup/instalasi plugin |
|
||||
| `plugin-sdk/runtime-env` | Helper sempit env runtime, logger, timeout, retry, dan backoff |
|
||||
| `plugin-sdk/channel-runtime-context` | Helper generik pendaftaran dan lookup konteks runtime channel |
|
||||
| `plugin-sdk/runtime-store` | `createPluginRuntimeStore` |
|
||||
| `plugin-sdk/plugin-runtime` | Helper command/hook/http/interaktif plugin bersama |
|
||||
| `plugin-sdk/hook-runtime` | Helper pipeline hook webhook/internal bersama |
|
||||
| `plugin-sdk/lazy-runtime` | Helper impor/binding runtime lazy seperti `createLazyRuntimeModule`, `createLazyRuntimeMethod`, dan `createLazyRuntimeSurface` |
|
||||
| `plugin-sdk/process-runtime` | Helper eksekusi proses |
|
||||
| `plugin-sdk/cli-runtime` | Helper format, tunggu, dan versi CLI |
|
||||
| `plugin-sdk/gateway-runtime` | Helper client gateway dan patch status channel |
|
||||
| `plugin-sdk/config-runtime` | Helper pemuatan/penulisan config |
|
||||
| `plugin-sdk/telegram-command-config` | Normalisasi nama/deskripsi command Telegram dan pemeriksaan duplikat/konflik, bahkan saat permukaan kontrak Telegram bawaan tidak tersedia |
|
||||
| `plugin-sdk/approval-runtime` | Helper approval exec/plugin, builder kapabilitas approval, helper auth/profil, helper routing/runtime native |
|
||||
| `plugin-sdk/plugin-runtime` | Helper bersama perintah/hook/http/interaktif plugin |
|
||||
| `plugin-sdk/hook-runtime` | Helper pipeline webhook/internal hook bersama |
|
||||
| `plugin-sdk/lazy-runtime` | Helper impor/pengikatan runtime lazy seperti `createLazyRuntimeModule`, `createLazyRuntimeMethod`, dan `createLazyRuntimeSurface` |
|
||||
| `plugin-sdk/process-runtime` | Helper exec proses |
|
||||
| `plugin-sdk/cli-runtime` | Helper formatting, wait, dan versi CLI |
|
||||
| `plugin-sdk/gateway-runtime` | Helper klien gateway dan patch status channel |
|
||||
| `plugin-sdk/config-runtime` | Helper pemuatan/penulisan konfigurasi |
|
||||
| `plugin-sdk/telegram-command-config` | Normalisasi nama/deskripsi perintah Telegram dan pemeriksaan duplikat/konflik, bahkan saat surface kontrak Telegram bawaan tidak tersedia |
|
||||
| `plugin-sdk/approval-runtime` | Helper approval exec/plugin, builder kemampuan approval, helper auth/profil, helper routing/runtime native |
|
||||
| `plugin-sdk/reply-runtime` | Helper runtime inbound/balasan bersama, chunking, dispatch, heartbeat, perencana balasan |
|
||||
| `plugin-sdk/reply-dispatch-runtime` | Helper dispatch/finalisasi balasan yang sempit |
|
||||
| `plugin-sdk/reply-history` | Helper riwayat balasan jendela pendek bersama seperti `buildHistoryContext`, `recordPendingHistoryEntry`, dan `clearHistoryEntriesIfEnabled` |
|
||||
| `plugin-sdk/reply-dispatch-runtime` | Helper sempit dispatch/finalize balasan |
|
||||
| `plugin-sdk/reply-history` | Helper bersama riwayat balasan jendela pendek seperti `buildHistoryContext`, `recordPendingHistoryEntry`, dan `clearHistoryEntriesIfEnabled` |
|
||||
| `plugin-sdk/reply-reference` | `createReplyReferencePlanner` |
|
||||
| `plugin-sdk/reply-chunking` | Helper chunking teks/markdown yang sempit |
|
||||
| `plugin-sdk/session-store-runtime` | Helper path penyimpanan sesi + updated-at |
|
||||
| `plugin-sdk/reply-chunking` | Helper sempit chunking teks/markdown |
|
||||
| `plugin-sdk/session-store-runtime` | Helper path store sesi + updated-at |
|
||||
| `plugin-sdk/state-paths` | Helper path direktori state/OAuth |
|
||||
| `plugin-sdk/routing` | Helper rute/kunci sesi/binding akun seperti `resolveAgentRoute`, `buildAgentSessionKey`, dan `resolveDefaultAgentBoundAccountId` |
|
||||
| `plugin-sdk/status-helpers` | Helper ringkasan status channel/akun bersama, default state runtime, dan helper metadata isu |
|
||||
| `plugin-sdk/routing` | Helper route/session-key/account binding seperti `resolveAgentRoute`, `buildAgentSessionKey`, dan `resolveDefaultAgentBoundAccountId` |
|
||||
| `plugin-sdk/status-helpers` | Helper ringkasan status channel/akun bersama, default state runtime, dan helper metadata issue |
|
||||
| `plugin-sdk/target-resolver-runtime` | Helper resolver target bersama |
|
||||
| `plugin-sdk/string-normalization-runtime` | Helper normalisasi slug/string |
|
||||
| `plugin-sdk/request-url` | Ekstrak URL string dari input mirip fetch/request |
|
||||
| `plugin-sdk/run-command` | Runner command bertimer dengan hasil stdout/stderr yang dinormalisasi |
|
||||
| `plugin-sdk/param-readers` | Pembaca param umum untuk tool/CLI |
|
||||
| `plugin-sdk/tool-payload` | Ekstrak payload yang dinormalisasi dari objek hasil tool |
|
||||
| `plugin-sdk/tool-send` | Ekstrak field target pengiriman kanonis dari argumen tool |
|
||||
| `plugin-sdk/run-command` | Runner perintah bertimer dengan hasil stdout/stderr ternormalisasi |
|
||||
| `plugin-sdk/param-readers` | Pembaca param tool/CLI umum |
|
||||
| `plugin-sdk/tool-payload` | Ekstrak payload ternormalisasi dari objek hasil tool |
|
||||
| `plugin-sdk/tool-send` | Ekstrak field target kirim kanonis dari arg tool |
|
||||
| `plugin-sdk/temp-path` | Helper path unduhan sementara bersama |
|
||||
| `plugin-sdk/logging-core` | Helper logger subsistem dan redaksi |
|
||||
| `plugin-sdk/markdown-table-runtime` | Helper mode tabel Markdown |
|
||||
| `plugin-sdk/json-store` | Helper baca/tulis state JSON kecil |
|
||||
| `plugin-sdk/json-store` | Helper kecil baca/tulis state JSON |
|
||||
| `plugin-sdk/file-lock` | Helper file-lock re-entrant |
|
||||
| `plugin-sdk/persistent-dedupe` | Helper cache dedupe berbasis disk |
|
||||
| `plugin-sdk/acp-runtime` | Helper ACP runtime/sesi dan reply-dispatch |
|
||||
| `plugin-sdk/agent-config-primitives` | Primitive sempit skema config runtime agent |
|
||||
| `plugin-sdk/acp-runtime` | Helper runtime/sesi ACP dan reply-dispatch |
|
||||
| `plugin-sdk/agent-config-primitives` | Primitif skema konfigurasi runtime agen yang sempit |
|
||||
| `plugin-sdk/boolean-param` | Pembaca param boolean longgar |
|
||||
| `plugin-sdk/dangerous-name-runtime` | Helper resolusi pencocokan nama berbahaya |
|
||||
| `plugin-sdk/device-bootstrap` | Helper bootstrap perangkat dan token pairing |
|
||||
| `plugin-sdk/extension-shared` | Primitive helper bersama untuk passive-channel, status, dan ambient proxy |
|
||||
| `plugin-sdk/models-provider-runtime` | Helper balasan command/provider `/models` |
|
||||
| `plugin-sdk/skill-commands-runtime` | Helper daftar skill command |
|
||||
| `plugin-sdk/native-command-registry` | Helper registry/build/serialize command native |
|
||||
| `plugin-sdk/provider-zai-endpoint` | Helper deteksi endpoint Z.AI |
|
||||
| `plugin-sdk/infra-runtime` | Helper event sistem/heartbeat |
|
||||
| `plugin-sdk/collection-runtime` | Helper cache kecil yang dibatasi |
|
||||
| `plugin-sdk/extension-shared` | Primitif helper proksi ambient, status, dan passive-channel bersama |
|
||||
| `plugin-sdk/models-provider-runtime` | Helper balasan perintah/penyedia `/models` |
|
||||
| `plugin-sdk/skill-commands-runtime` | Helper daftar perintah Skills |
|
||||
| `plugin-sdk/native-command-registry` | Helper registri/build/serialize perintah native |
|
||||
| `plugin-sdk/provider-zai-endpoint` | Helper deteksi endpoint Z.A.I |
|
||||
| `plugin-sdk/infra-runtime` | Helper system event/heartbeat |
|
||||
| `plugin-sdk/collection-runtime` | Helper cache kecil terbatas |
|
||||
| `plugin-sdk/diagnostic-runtime` | Helper flag dan event diagnostik |
|
||||
| `plugin-sdk/error-runtime` | Helper graf error, formatting, klasifikasi error bersama, `isApprovalNotFoundError` |
|
||||
| `plugin-sdk/fetch-runtime` | Helper fetch terbungkus, proxy, dan pencarian pinned |
|
||||
| `plugin-sdk/error-runtime` | Grafik error, formatting, helper klasifikasi error bersama, `isApprovalNotFoundError` |
|
||||
| `plugin-sdk/fetch-runtime` | Helper wrapped fetch, proxy, dan pinned lookup |
|
||||
| `plugin-sdk/host-runtime` | Helper normalisasi hostname dan host SCP |
|
||||
| `plugin-sdk/retry-runtime` | Helper config retry dan runner retry |
|
||||
| `plugin-sdk/agent-runtime` | Helper direktori/identitas/workspace agent |
|
||||
| `plugin-sdk/directory-runtime` | Query/dedup direktori berbasis config |
|
||||
| `plugin-sdk/retry-runtime` | Helper konfigurasi retry dan runner retry |
|
||||
| `plugin-sdk/agent-runtime` | Helper direktori/identitas/workspace agen |
|
||||
| `plugin-sdk/directory-runtime` | Query/deduplikasi direktori berbasis konfigurasi |
|
||||
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Subpath kapabilitas dan pengujian">
|
||||
| Subpath | Ekspor utama |
|
||||
| Subpath | Export utama |
|
||||
| --- | --- |
|
||||
| `plugin-sdk/media-runtime` | Helper fetch/transform/store media bersama plus builder payload media |
|
||||
| `plugin-sdk/media-generation-runtime` | Helper failover media-generation bersama, pemilihan kandidat, dan pesan model yang hilang |
|
||||
| `plugin-sdk/media-understanding` | Tipe provider media understanding plus ekspor helper gambar/audio yang menghadap provider |
|
||||
| `plugin-sdk/text-runtime` | Helper teks/markdown/logging bersama seperti penghapusan teks yang terlihat oleh asisten, helper render/chunking/tabel markdown, helper redaksi, helper tag arahan, dan utilitas safe-text |
|
||||
| `plugin-sdk/media-runtime` | Helper bersama fetch/transform/store media plus builder payload media |
|
||||
| `plugin-sdk/media-generation-runtime` | Helper bersama failover pembuatan media, pemilihan kandidat, dan pesan model yang hilang |
|
||||
| `plugin-sdk/media-understanding` | Tipe penyedia pemahaman media plus export helper gambar/audio untuk penyedia |
|
||||
| `plugin-sdk/text-runtime` | Helper bersama teks/markdown/logging seperti penghapusan teks yang terlihat oleh asisten, helper render/chunking/tabel markdown, helper redaksi, helper directive-tag, dan utilitas safe-text |
|
||||
| `plugin-sdk/text-chunking` | Helper chunking teks outbound |
|
||||
| `plugin-sdk/speech` | Tipe provider speech plus ekspor helper arahan, registri, dan validasi yang menghadap provider |
|
||||
| `plugin-sdk/speech-core` | Tipe provider speech bersama, registri, arahan, dan helper normalisasi |
|
||||
| `plugin-sdk/realtime-transcription` | Tipe provider realtime transcription dan helper registri |
|
||||
| `plugin-sdk/realtime-voice` | Tipe provider realtime voice dan helper registri |
|
||||
| `plugin-sdk/image-generation` | Tipe provider image generation |
|
||||
| `plugin-sdk/image-generation-core` | Tipe image-generation bersama, failover, auth, dan helper registri |
|
||||
| `plugin-sdk/music-generation` | Tipe provider/request/result music generation |
|
||||
| `plugin-sdk/music-generation-core` | Tipe music-generation bersama, helper failover, pencarian provider, dan parsing model-ref |
|
||||
| `plugin-sdk/video-generation` | Tipe provider/request/result video generation |
|
||||
| `plugin-sdk/video-generation-core` | Tipe video-generation bersama, helper failover, pencarian provider, dan parsing model-ref |
|
||||
| `plugin-sdk/webhook-targets` | Registry target webhook dan helper pemasangan rute |
|
||||
| `plugin-sdk/speech` | Tipe penyedia speech plus helper directive, registri, dan validasi untuk penyedia |
|
||||
| `plugin-sdk/speech-core` | Tipe penyedia speech bersama, helper registri, directive, dan normalisasi |
|
||||
| `plugin-sdk/realtime-transcription` | Tipe penyedia transkripsi realtime dan helper registri |
|
||||
| `plugin-sdk/realtime-voice` | Tipe penyedia suara realtime dan helper registri |
|
||||
| `plugin-sdk/image-generation` | Tipe penyedia pembuatan gambar |
|
||||
| `plugin-sdk/image-generation-core` | Tipe pembuatan gambar bersama, failover, auth, dan helper registri |
|
||||
| `plugin-sdk/music-generation` | Tipe permintaan/hasil/penyedia pembuatan musik |
|
||||
| `plugin-sdk/music-generation-core` | Tipe pembuatan musik bersama, helper failover, lookup penyedia, dan parsing model-ref |
|
||||
| `plugin-sdk/video-generation` | Tipe penyedia/permintaan/hasil pembuatan video |
|
||||
| `plugin-sdk/video-generation-core` | Tipe pembuatan video bersama, helper failover, lookup penyedia, dan parsing model-ref |
|
||||
| `plugin-sdk/webhook-targets` | Registri target webhook dan helper pemasangan route |
|
||||
| `plugin-sdk/webhook-path` | Helper normalisasi path webhook |
|
||||
| `plugin-sdk/web-media` | Helper pemuatan media remote/lokal bersama |
|
||||
| `plugin-sdk/zod` | `zod` yang diekspor ulang untuk konsumen plugin SDK |
|
||||
| `plugin-sdk/web-media` | Helper bersama pemuatan media remote/lokal |
|
||||
| `plugin-sdk/zod` | `zod` yang diekspor ulang untuk konsumen Plugin SDK |
|
||||
| `plugin-sdk/testing` | `installCommonResolveTargetErrorCases`, `shouldAckReaction` |
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Subpath memori">
|
||||
| Subpath | Ekspor utama |
|
||||
<Accordion title="Subpath memory">
|
||||
| Subpath | Export utama |
|
||||
| --- | --- |
|
||||
| `plugin-sdk/memory-core` | Permukaan helper memory-core bawaan untuk helper manager/config/file/CLI |
|
||||
| `plugin-sdk/memory-core-engine-runtime` | Fasad runtime indeks/pencarian memori |
|
||||
| `plugin-sdk/memory-core-host-engine-foundation` | Ekspor engine fondasi host memori |
|
||||
| `plugin-sdk/memory-core-host-engine-embeddings` | Ekspor engine embedding host memori |
|
||||
| `plugin-sdk/memory-core-host-engine-qmd` | Ekspor engine QMD host memori |
|
||||
| `plugin-sdk/memory-core-host-engine-storage` | Ekspor engine penyimpanan host memori |
|
||||
| `plugin-sdk/memory-core-host-multimodal` | Helper multimodal host memori |
|
||||
| `plugin-sdk/memory-core-host-query` | Helper query host memori |
|
||||
| `plugin-sdk/memory-core-host-secret` | Helper secret host memori |
|
||||
| `plugin-sdk/memory-core-host-events` | Helper jurnal event host memori |
|
||||
| `plugin-sdk/memory-core-host-status` | Helper status host memori |
|
||||
| `plugin-sdk/memory-core-host-runtime-cli` | Helper runtime CLI host memori |
|
||||
| `plugin-sdk/memory-core-host-runtime-core` | Helper runtime core host memori |
|
||||
| `plugin-sdk/memory-core-host-runtime-files` | Helper file/runtime host memori |
|
||||
| `plugin-sdk/memory-host-core` | Alias netral-vendor untuk helper runtime inti host memori |
|
||||
| `plugin-sdk/memory-host-events` | Alias netral-vendor untuk helper jurnal event host memori |
|
||||
| `plugin-sdk/memory-host-files` | Alias netral-vendor untuk helper file/runtime host memori |
|
||||
| `plugin-sdk/memory-host-markdown` | Helper managed-markdown bersama untuk plugin yang berdekatan dengan memori |
|
||||
| `plugin-sdk/memory-host-search` | Fasad runtime memori aktif untuk akses search-manager |
|
||||
| `plugin-sdk/memory-host-status` | Alias netral-vendor untuk helper status host memori |
|
||||
| `plugin-sdk/memory-lancedb` | Permukaan helper memory-lancedb bawaan |
|
||||
| `plugin-sdk/memory-core` | Surface helper memory-core bawaan untuk helper manager/config/file/CLI |
|
||||
| `plugin-sdk/memory-core-engine-runtime` | Fasad runtime indeks/pencarian memory |
|
||||
| `plugin-sdk/memory-core-host-engine-foundation` | Export engine fondasi host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-embeddings` | Export engine embedding host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-qmd` | Export engine QMD host memory |
|
||||
| `plugin-sdk/memory-core-host-engine-storage` | Export engine storage host memory |
|
||||
| `plugin-sdk/memory-core-host-multimodal` | Helper multimodal host memory |
|
||||
| `plugin-sdk/memory-core-host-query` | Helper query host memory |
|
||||
| `plugin-sdk/memory-core-host-secret` | Helper rahasia host memory |
|
||||
| `plugin-sdk/memory-core-host-events` | Helper jurnal event host memory |
|
||||
| `plugin-sdk/memory-core-host-status` | Helper status host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-cli` | Helper runtime CLI host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-core` | Helper runtime core host memory |
|
||||
| `plugin-sdk/memory-core-host-runtime-files` | Helper file/runtime host memory |
|
||||
| `plugin-sdk/memory-host-core` | Alias netral vendor untuk helper runtime core host memory |
|
||||
| `plugin-sdk/memory-host-events` | Alias netral vendor untuk helper jurnal event host memory |
|
||||
| `plugin-sdk/memory-host-files` | Alias netral vendor untuk helper file/runtime host memory |
|
||||
| `plugin-sdk/memory-host-markdown` | Helper managed-markdown bersama untuk plugin yang berdekatan dengan memory |
|
||||
| `plugin-sdk/memory-host-search` | Fasad runtime memory aktif untuk akses search-manager |
|
||||
| `plugin-sdk/memory-host-status` | Alias netral vendor untuk helper status host memory |
|
||||
| `plugin-sdk/memory-lancedb` | Surface helper memory-lancedb bawaan |
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Subpath helper bawaan yang dicadangkan">
|
||||
| Family | Subpath saat ini | Penggunaan yang dimaksudkan |
|
||||
| Family | Subpath saat ini | Penggunaan yang dimaksud |
|
||||
| --- | --- | --- |
|
||||
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Helper dukungan plugin browser bawaan (`browser-support` tetap menjadi barrel kompatibilitas) |
|
||||
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Permukaan helper/runtime Matrix bawaan |
|
||||
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Permukaan helper/runtime LINE bawaan |
|
||||
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Permukaan helper IRC bawaan |
|
||||
| Helper khusus channel | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Seam kompatibilitas/helper channel bawaan |
|
||||
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Surface helper/runtime Matrix bawaan |
|
||||
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Surface helper/runtime LINE bawaan |
|
||||
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Surface helper IRC bawaan |
|
||||
| Helper khusus channel | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Seam helper/kompatibilitas channel bawaan |
|
||||
| Helper khusus auth/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Seam helper fitur/plugin bawaan; `plugin-sdk/github-copilot-token` saat ini mengekspor `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken`, dan `resolveCopilotApiToken` |
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -308,56 +308,56 @@ berikut:
|
||||
|
||||
### Pendaftaran kapabilitas
|
||||
|
||||
| Method | Apa yang didaftarkan |
|
||||
| Metode | Yang didaftarkan |
|
||||
| ------------------------------------------------ | -------------------------------- |
|
||||
| `api.registerProvider(...)` | Inferensi teks (LLM) |
|
||||
| `api.registerCliBackend(...)` | Backend inferensi CLI lokal |
|
||||
| `api.registerChannel(...)` | Channel pesan |
|
||||
| `api.registerSpeechProvider(...)` | Sintesis teks-ke-suara / STT |
|
||||
| `api.registerRealtimeTranscriptionProvider(...)` | Transkripsi realtime streaming |
|
||||
| `api.registerRealtimeVoiceProvider(...)` | Sesi suara realtime dupleks |
|
||||
| `api.registerMediaUnderstandingProvider(...)` | Analisis gambar/audio/video |
|
||||
| `api.registerChannel(...)` | Channel pesan |
|
||||
| `api.registerSpeechProvider(...)` | Text-to-speech / sintesis STT |
|
||||
| `api.registerRealtimeTranscriptionProvider(...)` | Transkripsi realtime streaming |
|
||||
| `api.registerRealtimeVoiceProvider(...)` | Sesi suara realtime dupleks |
|
||||
| `api.registerMediaUnderstandingProvider(...)` | Analisis gambar/audio/video |
|
||||
| `api.registerImageGenerationProvider(...)` | Pembuatan gambar |
|
||||
| `api.registerMusicGenerationProvider(...)` | Pembuatan musik |
|
||||
| `api.registerVideoGenerationProvider(...)` | Pembuatan video |
|
||||
| `api.registerWebFetchProvider(...)` | Provider web fetch / scrape |
|
||||
| `api.registerWebSearchProvider(...)` | Pencarian web |
|
||||
| `api.registerMusicGenerationProvider(...)` | Pembuatan musik |
|
||||
| `api.registerVideoGenerationProvider(...)` | Pembuatan video |
|
||||
| `api.registerWebFetchProvider(...)` | Penyedia fetch / scrape web |
|
||||
| `api.registerWebSearchProvider(...)` | Pencarian web |
|
||||
|
||||
### Tools dan command
|
||||
### Alat dan perintah
|
||||
|
||||
| Method | Apa yang didaftarkan |
|
||||
| ------------------------------- | --------------------------------------------- |
|
||||
| `api.registerTool(tool, opts?)` | Tool agent (wajib atau `{ optional: true }`) |
|
||||
| `api.registerCommand(def)` | Command kustom (melewati LLM) |
|
||||
| Metode | Yang didaftarkan |
|
||||
| ------------------------------- | ---------------------------------------------- |
|
||||
| `api.registerTool(tool, opts?)` | Alat agen (wajib atau `{ optional: true }`) |
|
||||
| `api.registerCommand(def)` | Perintah kustom (melewati LLM) |
|
||||
|
||||
### Infrastruktur
|
||||
|
||||
| Method | Apa yang didaftarkan |
|
||||
| ---------------------------------------------- | --------------------------------------- |
|
||||
| `api.registerHook(events, handler, opts?)` | Hook event |
|
||||
| `api.registerHttpRoute(params)` | Endpoint HTTP gateway |
|
||||
| `api.registerGatewayMethod(name, handler)` | Metode RPC gateway |
|
||||
| `api.registerCli(registrar, opts?)` | Subcommand CLI |
|
||||
| `api.registerService(service)` | Layanan latar belakang |
|
||||
| `api.registerInteractiveHandler(registration)` | Handler interaktif |
|
||||
| `api.registerMemoryPromptSupplement(builder)` | Bagian prompt aditif yang berdekatan dengan memori |
|
||||
| `api.registerMemoryCorpusSupplement(adapter)` | Korpus pencarian/baca memori aditif |
|
||||
| Metode | Yang didaftarkan |
|
||||
| ---------------------------------------------- | ----------------------------------- |
|
||||
| `api.registerHook(events, handler, opts?)` | Hook event |
|
||||
| `api.registerHttpRoute(params)` | Endpoint HTTP gateway |
|
||||
| `api.registerGatewayMethod(name, handler)` | Metode RPC gateway |
|
||||
| `api.registerCli(registrar, opts?)` | Subperintah CLI |
|
||||
| `api.registerService(service)` | Layanan latar belakang |
|
||||
| `api.registerInteractiveHandler(registration)` | Handler interaktif |
|
||||
| `api.registerMemoryPromptSupplement(builder)` | Bagian prompt memory-adjacent aditif |
|
||||
| `api.registerMemoryCorpusSupplement(adapter)` | Korpus pencarian/baca memory aditif |
|
||||
|
||||
Namespace admin core yang dicadangkan (`config.*`, `exec.approvals.*`, `wizard.*`,
|
||||
`update.*`) selalu tetap `operator.admin`, meskipun plugin mencoba menetapkan
|
||||
cakupan metode gateway yang lebih sempit. Utamakan prefiks khusus plugin untuk
|
||||
metode yang dimiliki plugin.
|
||||
`update.*`) selalu tetap `operator.admin`, meskipun plugin mencoba menetapkan scope
|
||||
metode gateway yang lebih sempit. Pilih prefiks khusus plugin untuk
|
||||
metode milik plugin.
|
||||
|
||||
### Metadata pendaftaran CLI
|
||||
|
||||
`api.registerCli(registrar, opts?)` menerima dua jenis metadata tingkat atas:
|
||||
`api.registerCli(registrar, opts?)` menerima dua jenis metadata level teratas:
|
||||
|
||||
- `commands`: root command eksplisit yang dimiliki registrar
|
||||
- `descriptors`: deskriptor command saat parse yang digunakan untuk bantuan CLI root,
|
||||
- `commands`: root perintah eksplisit yang dimiliki registrar
|
||||
- `descriptors`: deskriptor perintah saat parse-time yang digunakan untuk bantuan CLI root,
|
||||
routing, dan pendaftaran CLI plugin lazy
|
||||
|
||||
Jika Anda ingin command plugin tetap dimuat secara lazy di jalur CLI root normal,
|
||||
sediakan `descriptors` yang mencakup setiap root command tingkat atas yang diekspos oleh
|
||||
Jika Anda ingin perintah plugin tetap dimuat secara lazy di jalur CLI root normal,
|
||||
berikan `descriptors` yang mencakup setiap root perintah level teratas yang diekspos oleh
|
||||
registrar tersebut.
|
||||
|
||||
```typescript
|
||||
@ -370,7 +370,7 @@ api.registerCli(
|
||||
descriptors: [
|
||||
{
|
||||
name: "matrix",
|
||||
description: "Kelola akun Matrix, verifikasi, perangkat, dan status profil",
|
||||
description: "Kelola akun Matrix, verifikasi, perangkat, dan state profil",
|
||||
hasSubcommands: true,
|
||||
},
|
||||
],
|
||||
@ -378,83 +378,83 @@ api.registerCli(
|
||||
);
|
||||
```
|
||||
|
||||
Gunakan `commands` saja hanya ketika Anda tidak memerlukan pendaftaran CLI root secara lazy.
|
||||
Gunakan `commands` saja hanya ketika Anda tidak memerlukan pendaftaran CLI root lazy.
|
||||
Jalur kompatibilitas eager tersebut tetap didukung, tetapi tidak memasang
|
||||
placeholder berbasis descriptor untuk pemuatan lazy saat parse-time.
|
||||
placeholder berbasis descriptor untuk pemuatan lazy pada parse-time.
|
||||
|
||||
### Pendaftaran backend CLI
|
||||
|
||||
`api.registerCliBackend(...)` memungkinkan plugin memiliki config default untuk backend
|
||||
`api.registerCliBackend(...)` memungkinkan plugin memiliki konfigurasi default untuk backend
|
||||
CLI AI lokal seperti `codex-cli`.
|
||||
|
||||
- `id` backend menjadi prefiks provider dalam model ref seperti `codex-cli/gpt-5`.
|
||||
- `id` backend menjadi prefiks penyedia dalam referensi model seperti `codex-cli/gpt-5`.
|
||||
- `config` backend menggunakan bentuk yang sama seperti `agents.defaults.cliBackends.<id>`.
|
||||
- Config pengguna tetap menang. OpenClaw menggabungkan `agents.defaults.cliBackends.<id>` di atas default
|
||||
plugin sebelum menjalankan CLI.
|
||||
- Konfigurasi pengguna tetap menang. OpenClaw menggabungkan `agents.defaults.cliBackends.<id>` di atas
|
||||
default plugin sebelum menjalankan CLI.
|
||||
- Gunakan `normalizeConfig` saat backend memerlukan penulisan ulang kompatibilitas setelah penggabungan
|
||||
(misalnya menormalisasi bentuk flag lama).
|
||||
(misalnya menormalkan bentuk flag lama).
|
||||
|
||||
### Slot eksklusif
|
||||
|
||||
| Method | Apa yang didaftarkan |
|
||||
| Metode | Yang didaftarkan |
|
||||
| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `api.registerContextEngine(id, factory)` | Engine konteks (satu aktif pada satu waktu). Callback `assemble()` menerima `availableTools` dan `citationsMode` sehingga engine dapat menyesuaikan penambahan prompt. |
|
||||
| `api.registerMemoryCapability(capability)` | Kapabilitas memori terpadu |
|
||||
| `api.registerMemoryPromptSection(builder)` | Builder bagian prompt memori |
|
||||
| `api.registerMemoryFlushPlan(resolver)` | Resolver rencana flush memori |
|
||||
| `api.registerMemoryRuntime(runtime)` | Adapter runtime memori |
|
||||
| `api.registerContextEngine(id, factory)` | Context engine (satu aktif pada satu waktu). Callback `assemble()` menerima `availableTools` dan `citationsMode` agar engine dapat menyesuaikan tambahan prompt. |
|
||||
| `api.registerMemoryCapability(capability)` | Kapabilitas memory terpadu |
|
||||
| `api.registerMemoryPromptSection(builder)` | Builder bagian prompt memory |
|
||||
| `api.registerMemoryFlushPlan(resolver)` | Resolver rencana flush memory |
|
||||
| `api.registerMemoryRuntime(runtime)` | Adapter runtime memory |
|
||||
|
||||
### Adapter embedding memori
|
||||
### Adapter embedding memory
|
||||
|
||||
| Method | Apa yang didaftarkan |
|
||||
| Metode | Yang didaftarkan |
|
||||
| ---------------------------------------------- | ---------------------------------------------- |
|
||||
| `api.registerMemoryEmbeddingProvider(adapter)` | Adapter embedding memori untuk plugin aktif |
|
||||
| `api.registerMemoryEmbeddingProvider(adapter)` | Adapter embedding memory untuk plugin aktif |
|
||||
|
||||
- `registerMemoryCapability` adalah API plugin memori eksklusif yang diutamakan.
|
||||
- `registerMemoryCapability` adalah API plugin memory eksklusif yang direkomendasikan.
|
||||
- `registerMemoryCapability` juga dapat mengekspos `publicArtifacts.listArtifacts(...)`
|
||||
sehingga plugin pendamping dapat menggunakan artefak memori yang diekspor melalui
|
||||
`openclaw/plugin-sdk/memory-host-core` alih-alih menjangkau tata letak privat
|
||||
plugin memori tertentu.
|
||||
agar plugin pendamping dapat mengonsumsi artefak memory yang diekspor melalui
|
||||
`openclaw/plugin-sdk/memory-host-core` alih-alih menjangkau layout privat
|
||||
plugin memory tertentu.
|
||||
- `registerMemoryPromptSection`, `registerMemoryFlushPlan`, dan
|
||||
`registerMemoryRuntime` adalah API plugin memori eksklusif yang kompatibel dengan versi lama.
|
||||
- `registerMemoryEmbeddingProvider` memungkinkan plugin memori aktif mendaftarkan satu
|
||||
atau lebih id adapter embedding (misalnya `openai`, `gemini`, atau id yang ditentukan plugin secara kustom).
|
||||
- Config pengguna seperti `agents.defaults.memorySearch.provider` dan
|
||||
`agents.defaults.memorySearch.fallback` diselesaikan terhadap id adapter yang terdaftar tersebut.
|
||||
`registerMemoryRuntime` adalah API plugin memory eksklusif yang kompatibel dengan versi lama.
|
||||
- `registerMemoryEmbeddingProvider` memungkinkan plugin memory aktif mendaftarkan satu
|
||||
atau lebih id adapter embedding (misalnya `openai`, `gemini`, atau id khusus plugin kustom).
|
||||
- Konfigurasi pengguna seperti `agents.defaults.memorySearch.provider` dan
|
||||
`agents.defaults.memorySearch.fallback` diselesaikan terhadap id adapter terdaftar tersebut.
|
||||
|
||||
### Event dan siklus hidup
|
||||
|
||||
| Method | Fungsinya |
|
||||
| Metode | Fungsinya |
|
||||
| -------------------------------------------- | ----------------------------- |
|
||||
| `api.on(hookName, handler, opts?)` | Hook siklus hidup bertipe |
|
||||
| `api.onConversationBindingResolved(handler)` | Callback binding percakapan |
|
||||
| `api.on(hookName, handler, opts?)` | Hook siklus hidup bertipe |
|
||||
| `api.onConversationBindingResolved(handler)` | Callback pengikatan percakapan |
|
||||
|
||||
### Semantik keputusan hook
|
||||
|
||||
- `before_tool_call`: mengembalikan `{ block: true }` bersifat terminal. Setelah handler mana pun menetapkannya, handler dengan prioritas lebih rendah dilewati.
|
||||
- `before_tool_call`: mengembalikan `{ block: true }` bersifat terminal. Setelah ada handler yang menetapkannya, handler prioritas lebih rendah dilewati.
|
||||
- `before_tool_call`: mengembalikan `{ block: false }` diperlakukan sebagai tidak ada keputusan (sama seperti menghilangkan `block`), bukan sebagai override.
|
||||
- `before_install`: mengembalikan `{ block: true }` bersifat terminal. Setelah handler mana pun menetapkannya, handler dengan prioritas lebih rendah dilewati.
|
||||
- `before_install`: mengembalikan `{ block: true }` bersifat terminal. Setelah ada handler yang menetapkannya, handler prioritas lebih rendah dilewati.
|
||||
- `before_install`: mengembalikan `{ block: false }` diperlakukan sebagai tidak ada keputusan (sama seperti menghilangkan `block`), bukan sebagai override.
|
||||
- `reply_dispatch`: mengembalikan `{ handled: true, ... }` bersifat terminal. Setelah handler mana pun mengklaim dispatch, handler dengan prioritas lebih rendah dan jalur dispatch model default dilewati.
|
||||
- `message_sending`: mengembalikan `{ cancel: true }` bersifat terminal. Setelah handler mana pun menetapkannya, handler dengan prioritas lebih rendah dilewati.
|
||||
- `reply_dispatch`: mengembalikan `{ handled: true, ... }` bersifat terminal. Setelah ada handler yang mengklaim dispatch, handler prioritas lebih rendah dan jalur dispatch model default dilewati.
|
||||
- `message_sending`: mengembalikan `{ cancel: true }` bersifat terminal. Setelah ada handler yang menetapkannya, handler prioritas lebih rendah dilewati.
|
||||
- `message_sending`: mengembalikan `{ cancel: false }` diperlakukan sebagai tidak ada keputusan (sama seperti menghilangkan `cancel`), bukan sebagai override.
|
||||
|
||||
### Field objek API
|
||||
|
||||
| Field | Type | Deskripsi |
|
||||
| Field | Tipe | Deskripsi |
|
||||
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
|
||||
| `api.id` | `string` | Id plugin |
|
||||
| `api.name` | `string` | Nama tampilan |
|
||||
| `api.version` | `string?` | Versi plugin (opsional) |
|
||||
| `api.description` | `string?` | Deskripsi plugin (opsional) |
|
||||
| `api.version` | `string?` | Versi plugin (opsional) |
|
||||
| `api.description` | `string?` | Deskripsi plugin (opsional) |
|
||||
| `api.source` | `string` | Path sumber plugin |
|
||||
| `api.rootDir` | `string?` | Direktori root plugin (opsional) |
|
||||
| `api.config` | `OpenClawConfig` | Snapshot config saat ini (snapshot runtime dalam memori yang aktif bila tersedia) |
|
||||
| `api.pluginConfig` | `Record<string, unknown>` | Config khusus plugin dari `plugins.entries.<id>.config` |
|
||||
| `api.runtime` | `PluginRuntime` | [Helper runtime](/id/plugins/sdk-runtime) |
|
||||
| `api.logger` | `PluginLogger` | Logger berpencakupan (`debug`, `info`, `warn`, `error`) |
|
||||
| `api.config` | `OpenClawConfig` | Snapshot konfigurasi saat ini (snapshot runtime dalam memori yang aktif jika tersedia) |
|
||||
| `api.pluginConfig` | `Record<string, unknown>` | Konfigurasi khusus plugin dari `plugins.entries.<id>.config` |
|
||||
| `api.runtime` | `PluginRuntime` | [Helper runtime](/id/plugins/sdk-runtime) |
|
||||
| `api.logger` | `PluginLogger` | Logger terlingkup (`debug`, `info`, `warn`, `error`) |
|
||||
| `api.registrationMode` | `PluginRegistrationMode` | Mode pemuatan saat ini; `"setup-runtime"` adalah jendela startup/setup ringan sebelum entri penuh |
|
||||
| `api.resolvePath(input)` | `(string) => string` | Menyelesaikan path relatif terhadap root plugin |
|
||||
| `api.resolvePath(input)` | `(string) => string` | Menyelesaikan path relatif terhadap root plugin |
|
||||
|
||||
## Konvensi modul internal
|
||||
|
||||
@ -462,49 +462,49 @@ Di dalam plugin Anda, gunakan file barrel lokal untuk impor internal:
|
||||
|
||||
```
|
||||
my-plugin/
|
||||
api.ts # Ekspor publik untuk konsumen eksternal
|
||||
runtime-api.ts # Ekspor runtime khusus internal
|
||||
index.ts # Entry point plugin
|
||||
setup-entry.ts # Entri setup ringan saja (opsional)
|
||||
api.ts # Export publik untuk konsumen eksternal
|
||||
runtime-api.ts # Export runtime khusus internal
|
||||
index.ts # Titik masuk plugin
|
||||
setup-entry.ts # Entri ringan khusus setup (opsional)
|
||||
```
|
||||
|
||||
<Warning>
|
||||
Jangan pernah mengimpor plugin Anda sendiri melalui `openclaw/plugin-sdk/<your-plugin>`
|
||||
dari kode production. Arahkan impor internal melalui `./api.ts` atau
|
||||
`./runtime-api.ts`. Path SDK hanya merupakan kontrak eksternal.
|
||||
dari kode produksi. Arahkan impor internal melalui `./api.ts` atau
|
||||
`./runtime-api.ts`. Jalur SDK hanya merupakan kontrak eksternal.
|
||||
</Warning>
|
||||
|
||||
Permukaan publik plugin bawaan yang dimuat melalui fasad (`api.ts`, `runtime-api.ts`,
|
||||
`index.ts`, `setup-entry.ts`, dan file entri publik serupa) kini mengutamakan
|
||||
snapshot config runtime aktif saat OpenClaw sudah berjalan. Jika snapshot runtime
|
||||
belum ada, permukaan tersebut akan fallback ke file config di disk yang telah diselesaikan.
|
||||
Surface publik plugin bawaan yang dimuat melalui facade (`api.ts`, `runtime-api.ts`,
|
||||
`index.ts`, `setup-entry.ts`, dan file entri publik serupa) kini memilih
|
||||
snapshot konfigurasi runtime aktif saat OpenClaw sudah berjalan. Jika snapshot runtime
|
||||
belum ada, surface tersebut menggunakan fallback ke file konfigurasi ter-resolve di disk.
|
||||
|
||||
Plugin provider juga dapat mengekspos barrel kontrak lokal plugin yang sempit ketika suatu
|
||||
helper memang khusus provider dan belum cocok ditempatkan dalam subpath SDK generik.
|
||||
Contoh bawaan saat ini: provider Anthropic menyimpan helper stream Claude
|
||||
di seam publik `api.ts` / `contract-api.ts` miliknya sendiri alih-alih
|
||||
mempromosikan logika header beta Anthropic dan `service_tier` ke dalam kontrak
|
||||
`plugin-sdk/*` generik.
|
||||
Plugin penyedia juga dapat mengekspos barrel kontrak lokal plugin yang sempit ketika sebuah
|
||||
helper memang khusus penyedia dan belum layak dimasukkan ke subpath SDK generik.
|
||||
Contoh bawaan saat ini: penyedia Anthropic menyimpan helper stream Claude di seam
|
||||
publik `api.ts` / `contract-api.ts` miliknya sendiri alih-alih mempromosikan logika
|
||||
header beta Anthropic dan `service_tier` ke kontrak generik
|
||||
`plugin-sdk/*`.
|
||||
|
||||
Contoh bawaan lain saat ini:
|
||||
Contoh bawaan saat ini lainnya:
|
||||
|
||||
- `@openclaw/openai-provider`: `api.ts` mengekspor builder provider,
|
||||
helper model default, dan builder provider realtime
|
||||
- `@openclaw/openrouter-provider`: `api.ts` mengekspor builder provider plus
|
||||
helper onboarding/config
|
||||
- `@openclaw/openai-provider`: `api.ts` mengekspor builder penyedia,
|
||||
helper model default, dan builder penyedia realtime
|
||||
- `@openclaw/openrouter-provider`: `api.ts` mengekspor builder penyedia plus
|
||||
helper onboarding/konfigurasi
|
||||
|
||||
<Warning>
|
||||
Kode production extension juga harus menghindari impor `openclaw/plugin-sdk/<other-plugin>`.
|
||||
Jika suatu helper benar-benar dibagikan, promosikan helper tersebut ke subpath SDK netral
|
||||
seperti `openclaw/plugin-sdk/speech`, `.../provider-model-shared`, atau
|
||||
permukaan berorientasi kapabilitas lainnya alih-alih memasangkan dua plugin secara langsung.
|
||||
Kode produksi extension juga harus menghindari impor `openclaw/plugin-sdk/<other-plugin>`.
|
||||
Jika sebuah helper benar-benar digunakan bersama, promosikan ke subpath SDK netral
|
||||
seperti `openclaw/plugin-sdk/speech`, `.../provider-model-shared`, atau surface
|
||||
berorientasi kapabilitas lainnya alih-alih menggabungkan dua plugin secara erat.
|
||||
</Warning>
|
||||
|
||||
## Terkait
|
||||
|
||||
- [Entry Points](/id/plugins/sdk-entrypoints) — opsi `definePluginEntry` dan `defineChannelPluginEntry`
|
||||
- [Runtime Helpers](/id/plugins/sdk-runtime) — referensi namespace `api.runtime` lengkap
|
||||
- [Setup and Config](/id/plugins/sdk-setup) — packaging, manifes, skema config
|
||||
- [Testing](/id/plugins/sdk-testing) — utilitas pengujian dan aturan lint
|
||||
- [SDK Migration](/id/plugins/sdk-migration) — migrasi dari permukaan yang sudah usang
|
||||
- [Plugin Internals](/id/plugins/architecture) — arsitektur mendalam dan model kapabilitas
|
||||
- [Titik Entri](/id/plugins/sdk-entrypoints) — opsi `definePluginEntry` dan `defineChannelPluginEntry`
|
||||
- [Helper Runtime](/id/plugins/sdk-runtime) — referensi lengkap namespace `api.runtime`
|
||||
- [Setup dan Konfigurasi](/id/plugins/sdk-setup) — packaging, manifes, skema konfigurasi
|
||||
- [Pengujian](/id/plugins/sdk-testing) — utilitas pengujian dan aturan lint
|
||||
- [Migrasi SDK](/id/plugins/sdk-migration) — migrasi dari surface yang deprecated
|
||||
- [Internal Plugin](/id/plugins/architecture) — arsitektur mendalam dan model kapabilitas
|
||||
|
||||
@ -1,29 +1,29 @@
|
||||
---
|
||||
read_when:
|
||||
- Anda sedang membangun plugin penyedia model baru
|
||||
- Anda sedang membangun plugin provider model baru
|
||||
- Anda ingin menambahkan proxy yang kompatibel dengan OpenAI atau LLM kustom ke OpenClaw
|
||||
- Anda perlu memahami autentikasi provider, katalog, dan hook runtime
|
||||
- Anda perlu memahami auth provider, katalog, dan hook runtime
|
||||
sidebarTitle: Provider Plugins
|
||||
summary: Panduan langkah demi langkah untuk membangun plugin penyedia model untuk OpenClaw
|
||||
summary: Panduan langkah demi langkah untuk membangun plugin provider model untuk OpenClaw
|
||||
title: Membangun Plugin Provider
|
||||
x-i18n:
|
||||
generated_at: "2026-04-07T09:18:38Z"
|
||||
generated_at: "2026-04-09T01:30:17Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 4da82a353e1bf4fe6dc09e14b8614133ac96565679627de51415926014bd3990
|
||||
source_hash: 38d9af522dc19e49c81203a83a4096f01c2398b1df771c848a30ad98f251e9e1
|
||||
source_path: plugins/sdk-provider-plugins.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Membangun Plugin Provider
|
||||
|
||||
Panduan ini memandu Anda melalui pembangunan plugin provider yang menambahkan provider model
|
||||
(LLM) ke OpenClaw. Di akhir panduan, Anda akan memiliki provider dengan katalog model,
|
||||
autentikasi kunci API, dan resolusi model dinamis.
|
||||
Panduan ini memandu Anda membangun plugin provider yang menambahkan provider model
|
||||
(LLM) ke OpenClaw. Pada akhirnya Anda akan memiliki provider dengan katalog model,
|
||||
auth API key, dan resolusi model dinamis.
|
||||
|
||||
<Info>
|
||||
Jika Anda belum pernah membuat plugin OpenClaw sebelumnya, baca
|
||||
[Memulai](/id/plugins/building-plugins) terlebih dahulu untuk struktur paket
|
||||
Jika Anda belum pernah membangun plugin OpenClaw sebelumnya, baca
|
||||
[Getting Started](/id/plugins/building-plugins) terlebih dahulu untuk struktur paket
|
||||
dasar dan penyiapan manifest.
|
||||
</Info>
|
||||
|
||||
@ -65,6 +65,9 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
"providerAuthEnvVars": {
|
||||
"acme-ai": ["ACME_AI_API_KEY"]
|
||||
},
|
||||
"providerAuthAliases": {
|
||||
"acme-ai-coding": "acme-ai"
|
||||
},
|
||||
"providerAuthChoices": [
|
||||
{
|
||||
"provider": "acme-ai",
|
||||
@ -87,9 +90,10 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
</CodeGroup>
|
||||
|
||||
Manifest mendeklarasikan `providerAuthEnvVars` agar OpenClaw dapat mendeteksi
|
||||
kredensial tanpa memuat runtime plugin Anda. `modelSupport` bersifat opsional
|
||||
dan memungkinkan OpenClaw memuat otomatis plugin provider Anda dari ID model singkat
|
||||
seperti `acme-large` sebelum hook runtime tersedia. Jika Anda memublikasikan
|
||||
kredensial tanpa memuat runtime plugin Anda. Tambahkan `providerAuthAliases`
|
||||
saat sebuah varian provider harus menggunakan ulang auth milik id provider lain. `modelSupport`
|
||||
bersifat opsional dan memungkinkan OpenClaw memuat otomatis plugin provider Anda dari shorthand
|
||||
model id seperti `acme-large` sebelum hook runtime tersedia. Jika Anda menerbitkan
|
||||
provider di ClawHub, field `openclaw.compat` dan `openclaw.build` tersebut
|
||||
wajib ada di `package.json`.
|
||||
|
||||
@ -171,8 +175,8 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
`openclaw onboard --acme-ai-api-key <key>` dan memilih
|
||||
`acme-ai/acme-large` sebagai model mereka.
|
||||
|
||||
Untuk provider bawaan yang hanya mendaftarkan satu provider teks dengan autentikasi
|
||||
kunci API ditambah satu runtime berbasis katalog, gunakan helper yang lebih sempit
|
||||
Untuk provider bawaan yang hanya mendaftarkan satu provider teks dengan API-key
|
||||
auth ditambah satu runtime berbasis katalog, pilih helper yang lebih sempit
|
||||
`defineSingleProviderPluginEntry(...)`:
|
||||
|
||||
```typescript
|
||||
@ -208,30 +212,30 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
});
|
||||
```
|
||||
|
||||
Jika alur autentikasi Anda juga perlu menambal `models.providers.*`, alias, dan
|
||||
Jika alur auth Anda juga perlu menambal `models.providers.*`, alias, dan
|
||||
model default agen selama onboarding, gunakan helper preset dari
|
||||
`openclaw/plugin-sdk/provider-onboard`. Helper yang paling sempit adalah
|
||||
`createDefaultModelPresetAppliers(...)`,
|
||||
`createDefaultModelsPresetAppliers(...)`, dan
|
||||
`createModelCatalogPresetAppliers(...)`.
|
||||
|
||||
Ketika endpoint native suatu provider mendukung blok penggunaan yang di-streaming pada
|
||||
transport `openai-completions` normal, gunakan helper katalog bersama di
|
||||
Saat endpoint native provider mendukung blok usage streaming pada
|
||||
transport `openai-completions` normal, pilih helper katalog bersama di
|
||||
`openclaw/plugin-sdk/provider-catalog-shared` alih-alih melakukan hardcode pemeriksaan
|
||||
provider-id. `supportsNativeStreamingUsageCompat(...)` dan
|
||||
`applyProviderNativeStreamingUsageCompat(...)` mendeteksi dukungan dari peta kapabilitas
|
||||
endpoint, sehingga endpoint native bergaya Moonshot/DashScope tetap ikut serta
|
||||
bahkan ketika plugin menggunakan provider id kustom.
|
||||
`applyProviderNativeStreamingUsageCompat(...)` mendeteksi dukungan dari
|
||||
peta kapabilitas endpoint, sehingga endpoint native bergaya Moonshot/DashScope tetap
|
||||
ikut serta meskipun plugin menggunakan id provider kustom.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Tambahkan resolusi model dinamis">
|
||||
Jika provider Anda menerima ID model arbitrer (seperti proxy atau router),
|
||||
Jika provider Anda menerima model ID arbitrer (seperti proxy atau router),
|
||||
tambahkan `resolveDynamicModel`:
|
||||
|
||||
```typescript
|
||||
api.registerProvider({
|
||||
// ... id, label, auth, catalog from above
|
||||
// ... id, label, auth, dan catalog dari atas
|
||||
|
||||
resolveDynamicModel: (ctx) => ({
|
||||
id: ctx.modelId,
|
||||
@ -249,7 +253,7 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
```
|
||||
|
||||
Jika resolusi memerlukan panggilan jaringan, gunakan `prepareDynamicModel` untuk
|
||||
pemanasan asinkron — `resolveDynamicModel` akan dijalankan lagi setelah itu selesai.
|
||||
warm-up async — `resolveDynamicModel` berjalan lagi setelah itu selesai.
|
||||
|
||||
</Step>
|
||||
|
||||
@ -283,10 +287,10 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
| Family | Yang dihubungkan |
|
||||
| --- | --- |
|
||||
| `openai-compatible` | Kebijakan replay bergaya OpenAI bersama untuk transport yang kompatibel dengan OpenAI, termasuk sanitasi tool-call-id, perbaikan urutan assistant-first, dan validasi turn Gemini generik saat transport memerlukannya |
|
||||
| `anthropic-by-model` | Kebijakan replay sadar-Claude yang dipilih berdasarkan `modelId`, sehingga transport Anthropic-message hanya mendapatkan pembersihan blok thinking khusus Claude saat model yang di-resolve benar-benar merupakan id Claude |
|
||||
| `google-gemini` | Kebijakan replay Gemini native plus sanitasi replay bootstrap dan mode output reasoning bertag |
|
||||
| `anthropic-by-model` | Kebijakan replay sadar-Claude yang dipilih berdasarkan `modelId`, sehingga transport pesan Anthropic hanya menerima pembersihan thinking-block spesifik Claude saat model yang di-resolve benar-benar merupakan id Claude |
|
||||
| `google-gemini` | Kebijakan replay Gemini native ditambah sanitasi replay bootstrap dan mode reasoning-output bertag |
|
||||
| `passthrough-gemini` | Sanitasi thought-signature Gemini untuk model Gemini yang berjalan melalui transport proxy yang kompatibel dengan OpenAI; tidak mengaktifkan validasi replay Gemini native atau penulisan ulang bootstrap |
|
||||
| `hybrid-anthropic-openai` | Kebijakan hibrida untuk provider yang mencampurkan permukaan model Anthropic-message dan OpenAI-compatible dalam satu plugin; penghapusan blok thinking opsional yang hanya untuk Claude tetap dibatasi pada sisi Anthropic |
|
||||
| `hybrid-anthropic-openai` | Kebijakan hybrid untuk provider yang mencampurkan permukaan model pesan Anthropic dan yang kompatibel dengan OpenAI dalam satu plugin; penghapusan thinking-block khusus Claude yang opsional tetap dibatasi ke sisi Anthropic |
|
||||
|
||||
Contoh bawaan nyata:
|
||||
|
||||
@ -300,13 +304,13 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
|
||||
| Family | Yang dihubungkan |
|
||||
| --- | --- |
|
||||
| `google-thinking` | Normalisasi payload thinking Gemini pada jalur stream bersama |
|
||||
| `kilocode-thinking` | Wrapper reasoning Kilo pada jalur stream proxy bersama, dengan `kilo/auto` dan reasoning id proxy yang tidak didukung melewati thinking yang disuntikkan |
|
||||
| `moonshot-thinking` | Pemetaan payload native-thinking biner Moonshot dari konfigurasi + level `/think` |
|
||||
| `minimax-fast-mode` | Penulisan ulang model fast-mode MiniMax pada jalur stream bersama |
|
||||
| `openai-responses-defaults` | Wrapper native OpenAI/Codex Responses bersama: header atribusi, `/fast`/`serviceTier`, verbositas teks, pencarian web Codex native, pembentukan payload kompatibilitas reasoning, dan pengelolaan konteks Responses |
|
||||
| `openrouter-thinking` | Wrapper reasoning OpenRouter untuk rute proxy, dengan lompatan unsupported-model/`auto` ditangani secara terpusat |
|
||||
| `tool-stream-default-on` | Wrapper `tool_stream` aktif secara default untuk provider seperti Z.AI yang menginginkan streaming tool kecuali dinonaktifkan secara eksplisit |
|
||||
| `google-thinking` | Normalisasi payload thinking Gemini pada path stream bersama |
|
||||
| `kilocode-thinking` | Wrapper reasoning Kilo pada path stream proxy bersama, dengan `kilo/auto` dan id reasoning proxy yang tidak didukung melewati thinking yang diinjeksi |
|
||||
| `moonshot-thinking` | Pemetaan payload native-thinking biner Moonshot dari config + level `/think` |
|
||||
| `minimax-fast-mode` | Penulisan ulang model fast-mode MiniMax pada path stream bersama |
|
||||
| `openai-responses-defaults` | Wrapper native OpenAI/Codex Responses bersama: attribution headers, `/fast`/`serviceTier`, text verbosity, web search Codex native, pembentukan payload reasoning-compat, dan manajemen konteks Responses |
|
||||
| `openrouter-thinking` | Wrapper reasoning OpenRouter untuk route proxy, dengan skip unsupported-model/`auto` ditangani secara terpusat |
|
||||
| `tool-stream-default-on` | Wrapper `tool_stream` default aktif untuk provider seperti Z.AI yang menginginkan tool streaming kecuali dinonaktifkan secara eksplisit |
|
||||
|
||||
Contoh bawaan nyata:
|
||||
|
||||
@ -319,8 +323,8 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
- `zai`: `tool-stream-default-on`
|
||||
|
||||
`openclaw/plugin-sdk/provider-model-shared` juga mengekspor enum replay-family
|
||||
beserta helper bersama yang menjadi dasar keluarga tersebut. Ekspor publik
|
||||
yang umum mencakup:
|
||||
plus helper bersama yang menjadi dasar keluarga tersebut. Ekspor publik yang umum
|
||||
mencakup:
|
||||
|
||||
- `ProviderReplayFamily`
|
||||
- `buildProviderReplayFamilyHooks(...)`
|
||||
@ -334,9 +338,9 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
`normalizeProviderId(...)`, `normalizeGooglePreviewModelId(...)`, dan
|
||||
`normalizeNativeXaiModelId(...)`
|
||||
|
||||
`openclaw/plugin-sdk/provider-stream` mengekspor builder family dan
|
||||
helper wrapper publik yang digunakan kembali oleh family tersebut. Ekspor publik
|
||||
yang umum mencakup:
|
||||
`openclaw/plugin-sdk/provider-stream` mengekspos builder keluarga dan
|
||||
helper wrapper publik yang digunakan ulang oleh keluarga tersebut. Ekspor publik umum
|
||||
mencakup:
|
||||
|
||||
- `ProviderStreamFamily`
|
||||
- `buildProviderStreamFamilyHooks(...)`
|
||||
@ -354,41 +358,41 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
saat ini: `@openclaw/anthropic-provider` mengekspor
|
||||
`wrapAnthropicProviderStream`, `resolveAnthropicBetas`,
|
||||
`resolveAnthropicFastMode`, `resolveAnthropicServiceTier`, dan
|
||||
builder wrapper Anthropic tingkat lebih rendah dari seam publik `api.ts` /
|
||||
builder wrapper Anthropic level rendah dari seam publik `api.ts` /
|
||||
`contract-api.ts`. Helper tersebut tetap spesifik Anthropic karena
|
||||
juga mengenkode penanganan beta OAuth Claude dan gating `context1m`.
|
||||
juga mengodekan penanganan beta Claude OAuth dan gating `context1m`.
|
||||
|
||||
Provider bawaan lain juga mempertahankan wrapper spesifik transport secara lokal ketika
|
||||
perilakunya tidak dapat dibagikan secara bersih antar family. Contoh saat ini: plugin xAI
|
||||
bawaan menyimpan pembentukan Responses xAI native dalam
|
||||
Provider bawaan lain juga menjaga wrapper spesifik transport tetap lokal saat
|
||||
perilakunya tidak dapat dibagikan dengan bersih lintas keluarga. Contoh saat ini: plugin xAI
|
||||
bawaan menyimpan pembentukan Responses xAI native di
|
||||
`wrapStreamFn` miliknya sendiri, termasuk penulisan ulang alias `/fast`, `tool_stream`
|
||||
default, pembersihan strict-tool yang tidak didukung, dan penghapusan
|
||||
payload reasoning khusus xAI.
|
||||
|
||||
`openclaw/plugin-sdk/provider-tools` saat ini mengekspos satu family
|
||||
schema tool bersama plus helper schema/compat bersama:
|
||||
`openclaw/plugin-sdk/provider-tools` saat ini mengekspos satu
|
||||
keluarga tool-schema bersama plus helper schema/compat bersama:
|
||||
|
||||
- `ProviderToolCompatFamily` mendokumentasikan inventaris family bersama saat ini.
|
||||
- `buildProviderToolCompatFamilyHooks("gemini")` menghubungkan pembersihan
|
||||
schema Gemini + diagnostik untuk provider yang memerlukan schema tool aman-Gemini.
|
||||
- `ProviderToolCompatFamily` mendokumentasikan inventaris keluarga bersama saat ini.
|
||||
- `buildProviderToolCompatFamilyHooks("gemini")` menghubungkan pembersihan schema Gemini
|
||||
+ diagnostik untuk provider yang memerlukan schema tool yang aman untuk Gemini.
|
||||
- `normalizeGeminiToolSchemas(...)` dan `inspectGeminiToolSchemas(...)`
|
||||
adalah helper schema Gemini publik yang mendasarinya.
|
||||
- `resolveXaiModelCompatPatch()` mengembalikan patch kompatibilitas xAI bawaan:
|
||||
- `resolveXaiModelCompatPatch()` mengembalikan patch compat xAI bawaan:
|
||||
`toolSchemaProfile: "xai"`, keyword schema yang tidak didukung, dukungan
|
||||
`web_search` native, dan dekode argumen tool-call entitas HTML.
|
||||
- `applyXaiModelCompat(model)` menerapkan patch kompatibilitas xAI yang sama ke model
|
||||
yang sudah di-resolve sebelum mencapai runner.
|
||||
- `applyXaiModelCompat(model)` menerapkan patch compat xAI yang sama itu pada
|
||||
model yang di-resolve sebelum mencapai runner.
|
||||
|
||||
Contoh bawaan nyata: plugin xAI menggunakan `normalizeResolvedModel` plus
|
||||
`contributeResolvedModelCompat` untuk menjaga metadata kompatibilitas itu tetap dimiliki oleh
|
||||
`contributeResolvedModelCompat` untuk menjaga metadata compat itu tetap dimiliki oleh
|
||||
provider alih-alih melakukan hardcode aturan xAI di core.
|
||||
|
||||
Pola package-root yang sama juga mendasari provider bawaan lainnya:
|
||||
Pola package-root yang sama juga mendukung provider bawaan lainnya:
|
||||
|
||||
- `@openclaw/openai-provider`: `api.ts` mengekspor builder provider,
|
||||
helper model default, dan builder provider realtime
|
||||
- `@openclaw/openrouter-provider`: `api.ts` mengekspor builder provider
|
||||
plus helper onboarding/konfigurasi
|
||||
plus helper onboarding/config
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Pertukaran token">
|
||||
@ -409,7 +413,7 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
Untuk provider yang memerlukan header permintaan kustom atau modifikasi body:
|
||||
|
||||
```typescript
|
||||
// wrapStreamFn returns a StreamFn derived from ctx.streamFn
|
||||
// wrapStreamFn mengembalikan StreamFn yang diturunkan dari ctx.streamFn
|
||||
wrapStreamFn: (ctx) => {
|
||||
if (!ctx.streamFn) return undefined;
|
||||
const inner = ctx.streamFn;
|
||||
@ -424,7 +428,7 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
```
|
||||
</Tab>
|
||||
<Tab title="Identitas transport native">
|
||||
Untuk provider yang memerlukan header atau metadata permintaan/sesi native pada
|
||||
Untuk provider yang memerlukan header atau metadata request/session native pada
|
||||
transport HTTP atau WebSocket generik:
|
||||
|
||||
```typescript
|
||||
@ -445,8 +449,8 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
}),
|
||||
```
|
||||
</Tab>
|
||||
<Tab title="Penggunaan dan penagihan">
|
||||
Untuk provider yang mengekspos data penggunaan/penagihan:
|
||||
<Tab title="Usage dan penagihan">
|
||||
Untuk provider yang mengekspos data usage/penagihan:
|
||||
|
||||
```typescript
|
||||
resolveUsageAuth: async (ctx) => {
|
||||
@ -465,69 +469,70 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
|
||||
| # | Hook | Kapan digunakan |
|
||||
| --- | --- | --- |
|
||||
| 1 | `catalog` | Katalog model atau default `baseUrl` |
|
||||
| 1 | `catalog` | Katalog model atau default base URL |
|
||||
| 2 | `applyConfigDefaults` | Default global milik provider selama materialisasi konfigurasi |
|
||||
| 3 | `normalizeModelId` | Pembersihan alias model-id legacy/preview sebelum pencarian |
|
||||
| 4 | `normalizeTransport` | Pembersihan `api` / `baseUrl` family-provider sebelum perakitan model generik |
|
||||
| 5 | `normalizeConfig` | Normalisasi konfigurasi `models.providers.<id>` |
|
||||
| 6 | `applyNativeStreamingUsageCompat` | Penulisan ulang kompatibilitas streaming-usage native untuk provider konfigurasi |
|
||||
| 7 | `resolveConfigApiKey` | Resolusi autentikasi env-marker milik provider |
|
||||
| 8 | `resolveSyntheticAuth` | Autentikasi sintetis berbasis lokal/self-hosted atau konfigurasi |
|
||||
| 9 | `shouldDeferSyntheticProfileAuth` | Menurunkan placeholder profil tersimpan sintetis di bawah autentikasi env/config |
|
||||
| 10 | `resolveDynamicModel` | Menerima ID model upstream arbitrer |
|
||||
| 11 | `prepareDynamicModel` | Pengambilan metadata asinkron sebelum resolusi |
|
||||
| 3 | `normalizeModelId` | Pembersihan alias model-id lama/pratinjau sebelum lookup |
|
||||
| 4 | `normalizeTransport` | Pembersihan `api` / `baseUrl` keluarga provider sebelum perakitan model generik |
|
||||
| 5 | `normalizeConfig` | Menormalisasi konfigurasi `models.providers.<id>` |
|
||||
| 6 | `applyNativeStreamingUsageCompat` | Penulisan ulang compat streaming-usage native untuk provider config |
|
||||
| 7 | `resolveConfigApiKey` | Resolusi auth env-marker milik provider |
|
||||
| 8 | `resolveSyntheticAuth` | Auth sintetis lokal/self-hosted atau berbasis config |
|
||||
| 9 | `shouldDeferSyntheticProfileAuth` | Turunkan placeholder profil tersimpan sintetis di bawah auth env/config |
|
||||
| 10 | `resolveDynamicModel` | Menerima model ID upstream arbitrer |
|
||||
| 11 | `prepareDynamicModel` | Pengambilan metadata async sebelum resolusi |
|
||||
| 12 | `normalizeResolvedModel` | Penulisan ulang transport sebelum runner |
|
||||
|
||||
Catatan fallback runtime:
|
||||
Catatan fallback runtime:
|
||||
|
||||
- `normalizeConfig` memeriksa provider yang cocok terlebih dahulu, lalu plugin provider lain
|
||||
yang mendukung hook sampai salah satunya benar-benar mengubah konfigurasi.
|
||||
Jika tidak ada hook provider yang menulis ulang entri konfigurasi keluarga Google yang didukung, normalizer konfigurasi Google bawaan
|
||||
tetap diterapkan.
|
||||
- `resolveConfigApiKey` menggunakan hook provider jika diekspos. Jalur bawaan
|
||||
`amazon-bedrock` juga memiliki resolver env-marker AWS bawaan di sini,
|
||||
meskipun autentikasi runtime Bedrock sendiri masih menggunakan rantai default AWS SDK.
|
||||
| 13 | `contributeResolvedModelCompat` | Flag kompatibilitas untuk model vendor di balik transport kompatibel lainnya |
|
||||
| 14 | `capabilities` | Kantong kapabilitas statis legacy; hanya untuk kompatibilitas |
|
||||
| 15 | `normalizeToolSchemas` | Pembersihan schema tool milik provider sebelum pendaftaran |
|
||||
| 16 | `inspectToolSchemas` | Diagnostik schema tool milik provider |
|
||||
| 17 | `resolveReasoningOutputMode` | Kontrak output reasoning bertag vs native |
|
||||
| 18 | `prepareExtraParams` | Parameter permintaan default |
|
||||
- `normalizeConfig` memeriksa provider yang cocok terlebih dahulu, lalu
|
||||
plugin provider lain yang mampu menangani hook sampai salah satunya benar-benar
|
||||
mengubah konfigurasi.
|
||||
Jika tidak ada hook provider yang menulis ulang entri konfigurasi keluarga Google yang didukung,
|
||||
normalizer konfigurasi Google bawaan tetap diterapkan.
|
||||
- `resolveConfigApiKey` menggunakan hook provider saat diekspos. Path bawaan
|
||||
`amazon-bedrock` juga memiliki resolver env-marker AWS bawaan di sini,
|
||||
meskipun auth runtime Bedrock sendiri masih menggunakan rantai default AWS SDK.
|
||||
| 13 | `contributeResolvedModelCompat` | Flag compat untuk model vendor di balik transport kompatibel lain |
|
||||
| 14 | `capabilities` | Kumpulan kapabilitas statis lama; hanya untuk kompatibilitas |
|
||||
| 15 | `normalizeToolSchemas` | Pembersihan tool-schema milik provider sebelum registrasi |
|
||||
| 16 | `inspectToolSchemas` | Diagnostik tool-schema milik provider |
|
||||
| 17 | `resolveReasoningOutputMode` | Kontrak reasoning-output bertag vs native |
|
||||
| 18 | `prepareExtraParams` | Parameter request default |
|
||||
| 19 | `createStreamFn` | Transport StreamFn kustom sepenuhnya |
|
||||
| 20 | `wrapStreamFn` | Wrapper header/body kustom pada jalur stream normal |
|
||||
| 20 | `wrapStreamFn` | Wrapper header/body kustom pada path stream normal |
|
||||
| 21 | `resolveTransportTurnState` | Header/metadata native per-turn |
|
||||
| 22 | `resolveWebSocketSessionPolicy` | Header sesi WS native/cool-down |
|
||||
| 22 | `resolveWebSocketSessionPolicy` | Header/cool-down sesi WS native |
|
||||
| 23 | `formatApiKey` | Bentuk token runtime kustom |
|
||||
| 24 | `refreshOAuth` | Refresh OAuth kustom |
|
||||
| 25 | `buildAuthDoctorHint` | Panduan perbaikan autentikasi |
|
||||
| 25 | `buildAuthDoctorHint` | Panduan perbaikan auth |
|
||||
| 26 | `matchesContextOverflowError` | Deteksi overflow milik provider |
|
||||
| 27 | `classifyFailoverReason` | Klasifikasi rate-limit/overload milik provider |
|
||||
| 28 | `isCacheTtlEligible` | Gating TTL cache prompt |
|
||||
| 29 | `buildMissingAuthMessage` | Petunjuk ketiadaan autentikasi kustom |
|
||||
| 29 | `buildMissingAuthMessage` | Petunjuk auth yang hilang kustom |
|
||||
| 30 | `suppressBuiltInModel` | Sembunyikan baris upstream usang |
|
||||
| 31 | `augmentModelCatalog` | Baris sintetis forward-compat |
|
||||
| 32 | `isBinaryThinking` | Thinking biner hidup/mati |
|
||||
| 31 | `augmentModelCatalog` | Baris kompatibilitas maju sintetis |
|
||||
| 32 | `isBinaryThinking` | Thinking biner aktif/nonaktif |
|
||||
| 33 | `supportsXHighThinking` | Dukungan reasoning `xhigh` |
|
||||
| 34 | `resolveDefaultThinkingLevel` | Kebijakan default `/think` |
|
||||
| 35 | `isModernModelRef` | Pencocokan model live/smoke |
|
||||
| 36 | `prepareRuntimeAuth` | Pertukaran token sebelum inferensi |
|
||||
| 37 | `resolveUsageAuth` | Penguraian kredensial penggunaan kustom |
|
||||
| 38 | `fetchUsageSnapshot` | Endpoint penggunaan kustom |
|
||||
| 39 | `createEmbeddingProvider` | Adapter embedding milik provider untuk memori/pencarian |
|
||||
| 37 | `resolveUsageAuth` | Parsing kredensial usage kustom |
|
||||
| 38 | `fetchUsageSnapshot` | Endpoint usage kustom |
|
||||
| 39 | `createEmbeddingProvider` | Adapter embedding milik provider untuk memory/search |
|
||||
| 40 | `buildReplayPolicy` | Kebijakan replay/pemadatan transkrip kustom |
|
||||
| 41 | `sanitizeReplayHistory` | Penulisan ulang replay spesifik provider setelah pembersihan generik |
|
||||
| 42 | `validateReplayTurns` | Validasi replay-turn ketat sebelum runner tersemat |
|
||||
| 43 | `onModelSelected` | Callback pasca-pemilihan (mis. telemetri) |
|
||||
| 42 | `validateReplayTurns` | Validasi replay-turn ketat sebelum runner tertanam |
|
||||
| 43 | `onModelSelected` | Callback pasca-pemilihan (misalnya telemetri) |
|
||||
|
||||
Catatan penyetelan prompt:
|
||||
Catatan tuning prompt:
|
||||
|
||||
- `resolveSystemPromptContribution` memungkinkan provider menyuntikkan
|
||||
panduan system-prompt yang sadar-cache untuk family model. Utamakan ini dibanding
|
||||
`before_prompt_build` ketika perilaku tersebut dimiliki oleh satu family provider/model
|
||||
dan harus mempertahankan pemisahan cache stabil/dinamis.
|
||||
panduan system-prompt yang sadar-cache untuk keluarga model. Pilih ini alih-alih
|
||||
`before_prompt_build` saat perilaku tersebut milik satu keluarga provider/model
|
||||
dan harus mempertahankan pemisahan cache stable/dynamic yang stabil.
|
||||
|
||||
Untuk deskripsi mendetail dan contoh dunia nyata, lihat
|
||||
[Internal: Hook Runtime Provider](/id/plugins/architecture#provider-runtime-hooks).
|
||||
Untuk deskripsi terperinci dan contoh dunia nyata, lihat
|
||||
[Internals: Provider Runtime Hooks](/id/plugins/architecture#provider-runtime-hooks).
|
||||
</Accordion>
|
||||
|
||||
</Step>
|
||||
@ -536,7 +541,7 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
<a id="step-5-add-extra-capabilities"></a>
|
||||
Plugin provider dapat mendaftarkan speech, transkripsi realtime, voice realtime,
|
||||
pemahaman media, pembuatan gambar, pembuatan video, web fetch,
|
||||
dan web search di samping inferensi teks:
|
||||
dan web search bersama inferensi teks:
|
||||
|
||||
```typescript
|
||||
register(api) {
|
||||
@ -646,18 +651,18 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
|
||||
OpenClaw mengklasifikasikan ini sebagai plugin **hybrid-capability**. Ini adalah
|
||||
pola yang direkomendasikan untuk plugin perusahaan (satu plugin per vendor). Lihat
|
||||
[Internal: Kepemilikan Kapabilitas](/id/plugins/architecture#capability-ownership-model).
|
||||
[Internals: Capability Ownership](/id/plugins/architecture#capability-ownership-model).
|
||||
|
||||
Untuk pembuatan video, utamakan bentuk kapabilitas yang sadar-mode seperti ditunjukkan di atas:
|
||||
Untuk pembuatan video, pilih bentuk kapabilitas yang sadar mode seperti ditunjukkan di atas:
|
||||
`generate`, `imageToVideo`, dan `videoToVideo`. Field agregat datar seperti
|
||||
`maxInputImages`, `maxInputVideos`, dan `maxDurationSeconds` tidak
|
||||
cukup untuk mengiklankan dukungan mode transformasi atau mode yang dinonaktifkan dengan rapi.
|
||||
cukup untuk mengiklankan dukungan mode transform atau mode yang dinonaktifkan dengan jelas.
|
||||
|
||||
Provider pembuatan musik harus mengikuti pola yang sama:
|
||||
`generate` untuk pembuatan berbasis prompt saja dan `edit` untuk
|
||||
pembuatan berbasis gambar referensi. Field agregat datar seperti `maxInputImages`,
|
||||
`supportsLyrics`, dan `supportsFormat` tidak cukup untuk mengiklankan
|
||||
dukungan edit; blok `generate` / `edit` eksplisit adalah kontrak yang diharapkan.
|
||||
`supportsLyrics`, dan `supportsFormat` tidak cukup untuk mengiklankan dukungan
|
||||
edit; blok `generate` / `edit` eksplisit adalah kontrak yang diharapkan.
|
||||
|
||||
</Step>
|
||||
|
||||
@ -665,7 +670,7 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
<a id="step-6-test"></a>
|
||||
```typescript src/provider.test.ts
|
||||
import { describe, it, expect } from "vitest";
|
||||
// Export your provider config object from index.ts or a dedicated file
|
||||
// Ekspor objek konfigurasi provider Anda dari index.ts atau file khusus
|
||||
import { acmeProvider } from "./provider.js";
|
||||
|
||||
describe("acme-ai provider", () => {
|
||||
@ -696,16 +701,16 @@ autentikasi kunci API, dan resolusi model dinamis.
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
## Publikasikan ke ClawHub
|
||||
## Terbitkan ke ClawHub
|
||||
|
||||
Plugin provider dipublikasikan dengan cara yang sama seperti plugin kode eksternal lainnya:
|
||||
Plugin provider diterbitkan dengan cara yang sama seperti plugin kode eksternal lainnya:
|
||||
|
||||
```bash
|
||||
clawhub package publish your-org/your-plugin --dry-run
|
||||
clawhub package publish your-org/your-plugin
|
||||
```
|
||||
|
||||
Jangan gunakan alias publish legacy yang hanya untuk skill di sini; paket plugin harus menggunakan
|
||||
Jangan gunakan alias publish lama yang khusus Skills di sini; paket plugin harus menggunakan
|
||||
`clawhub package publish`.
|
||||
|
||||
## Struktur file
|
||||
@ -713,11 +718,11 @@ Jangan gunakan alias publish legacy yang hanya untuk skill di sini; paket plugin
|
||||
```
|
||||
<bundled-plugin-root>/acme-ai/
|
||||
├── package.json # metadata openclaw.providers
|
||||
├── openclaw.plugin.json # Manifest dengan providerAuthEnvVars
|
||||
├── openclaw.plugin.json # Manifest dengan metadata auth provider
|
||||
├── index.ts # definePluginEntry + registerProvider
|
||||
└── src/
|
||||
├── provider.test.ts # Pengujian
|
||||
└── usage.ts # Endpoint penggunaan (opsional)
|
||||
├── provider.test.ts # Tes
|
||||
└── usage.ts # Endpoint usage (opsional)
|
||||
```
|
||||
|
||||
## Referensi urutan katalog
|
||||
@ -727,14 +732,14 @@ provider bawaan:
|
||||
|
||||
| Order | Kapan | Kasus penggunaan |
|
||||
| --------- | ------------- | ---------------------------------------------- |
|
||||
| `simple` | Lintasan awal | Provider kunci API biasa |
|
||||
| `profile` | Setelah simple | Provider yang digating oleh profil autentikasi |
|
||||
| `paired` | Setelah profile | Mensintesis beberapa entri terkait |
|
||||
| `late` | Lintasan terakhir | Menimpa provider yang ada (menang saat bentrok) |
|
||||
| `simple` | Pass pertama | Provider API-key biasa |
|
||||
| `profile` | Setelah simple | Provider yang digating pada profil auth |
|
||||
| `paired` | Setelah profile | Menyintesis beberapa entri terkait |
|
||||
| `late` | Pass terakhir | Menimpa provider yang ada (menang saat bentrok) |
|
||||
|
||||
## Langkah berikutnya
|
||||
|
||||
- [Plugin Channel](/id/plugins/sdk-channel-plugins) — jika plugin Anda juga menyediakan channel
|
||||
- [SDK Runtime](/id/plugins/sdk-runtime) — helper `api.runtime` (TTS, pencarian, subagen)
|
||||
- [Ikhtisar SDK](/id/plugins/sdk-overview) — referensi impor subpath lengkap
|
||||
- [Internal Plugin](/id/plugins/architecture#provider-runtime-hooks) — detail hook dan contoh bawaan
|
||||
- [Channel Plugins](/id/plugins/sdk-channel-plugins) — jika plugin Anda juga menyediakan channel
|
||||
- [SDK Runtime](/id/plugins/sdk-runtime) — helper `api.runtime` (TTS, search, subagent)
|
||||
- [SDK Overview](/id/plugins/sdk-overview) — referensi impor subpath lengkap
|
||||
- [Plugin Internals](/id/plugins/architecture#provider-runtime-hooks) — detail hook dan contoh bawaan
|
||||
|
||||
@ -6,10 +6,10 @@ read_when:
|
||||
summary: Jalankan OpenClaw melalui inferrs (server lokal yang kompatibel dengan OpenAI)
|
||||
title: inferrs
|
||||
x-i18n:
|
||||
generated_at: "2026-04-08T02:16:58Z"
|
||||
generated_at: "2026-04-09T01:29:31Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: d84f660d49a682d0c0878707eebe1bc1e83dd115850687076ea3938b9f9c86c6
|
||||
source_hash: 03b9d5a9935c75fd369068bacb7807a5308cd0bd74303b664227fb664c3a2098
|
||||
source_path: providers/inferrs.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -17,11 +17,11 @@ x-i18n:
|
||||
# inferrs
|
||||
|
||||
[inferrs](https://github.com/ericcurtin/inferrs) dapat menyajikan model lokal di balik
|
||||
API `/v1` yang kompatibel dengan OpenAI. OpenClaw bekerja dengan `inferrs` melalui jalur
|
||||
`openai-completions` generik.
|
||||
API `/v1` yang kompatibel dengan OpenAI. OpenClaw bekerja dengan `inferrs` melalui jalur generik
|
||||
`openai-completions`.
|
||||
|
||||
Saat ini, `inferrs` paling baik diperlakukan sebagai backend OpenAI-compatible self-hosted
|
||||
kustom, bukan plugin provider OpenClaw khusus.
|
||||
Saat ini, `inferrs` paling baik diperlakukan sebagai
|
||||
backend OpenAI-compatible self-hosted kustom, bukan plugin provider OpenClaw khusus.
|
||||
|
||||
## Mulai cepat
|
||||
|
||||
@ -30,7 +30,7 @@ kustom, bukan plugin provider OpenClaw khusus.
|
||||
Contoh:
|
||||
|
||||
```bash
|
||||
inferrs serve gg-hf-gg/gemma-4-E2B-it \
|
||||
inferrs serve google/gemma-4-E2B-it \
|
||||
--host 127.0.0.1 \
|
||||
--port 8080 \
|
||||
--device metal
|
||||
@ -43,9 +43,9 @@ curl http://127.0.0.1:8080/health
|
||||
curl http://127.0.0.1:8080/v1/models
|
||||
```
|
||||
|
||||
3. Tambahkan entri provider OpenClaw eksplisit dan arahkan model default Anda ke entri itu.
|
||||
3. Tambahkan entri provider OpenClaw eksplisit dan arahkan model default Anda ke sana.
|
||||
|
||||
## Contoh konfigurasi lengkap
|
||||
## Contoh config lengkap
|
||||
|
||||
Contoh ini menggunakan Gemma 4 pada server `inferrs` lokal.
|
||||
|
||||
@ -53,9 +53,9 @@ Contoh ini menggunakan Gemma 4 pada server `inferrs` lokal.
|
||||
{
|
||||
agents: {
|
||||
defaults: {
|
||||
model: { primary: "inferrs/gg-hf-gg/gemma-4-E2B-it" },
|
||||
model: { primary: "inferrs/google/gemma-4-E2B-it" },
|
||||
models: {
|
||||
"inferrs/gg-hf-gg/gemma-4-E2B-it": {
|
||||
"inferrs/google/gemma-4-E2B-it": {
|
||||
alias: "Gemma 4 (inferrs)",
|
||||
},
|
||||
},
|
||||
@ -70,7 +70,7 @@ Contoh ini menggunakan Gemma 4 pada server `inferrs` lokal.
|
||||
api: "openai-completions",
|
||||
models: [
|
||||
{
|
||||
id: "gg-hf-gg/gemma-4-E2B-it",
|
||||
id: "google/gemma-4-E2B-it",
|
||||
name: "Gemma 4 E2B (inferrs)",
|
||||
reasoning: false,
|
||||
input: ["text"],
|
||||
@ -90,10 +90,10 @@ Contoh ini menggunakan Gemma 4 pada server `inferrs` lokal.
|
||||
|
||||
## Mengapa `requiresStringContent` penting
|
||||
|
||||
Beberapa rute Chat Completions `inferrs` hanya menerima string pada
|
||||
`messages[].content`, bukan array content-part terstruktur.
|
||||
Beberapa rute `inferrs` Chat Completions hanya menerima
|
||||
`messages[].content` berupa string, bukan array bagian-konten terstruktur.
|
||||
|
||||
Jika eksekusi OpenClaw gagal dengan error seperti:
|
||||
Jika proses OpenClaw gagal dengan error seperti:
|
||||
|
||||
```text
|
||||
messages[1].content: invalid type: sequence, expected a string
|
||||
@ -107,14 +107,14 @@ compat: {
|
||||
}
|
||||
```
|
||||
|
||||
OpenClaw akan meratakan content part teks murni menjadi string biasa sebelum mengirim
|
||||
OpenClaw akan meratakan bagian konten teks murni menjadi string biasa sebelum mengirim
|
||||
permintaan.
|
||||
|
||||
## Gemma dan catatan skema tool
|
||||
## Gemma dan catatan tentang schema tool
|
||||
|
||||
Beberapa kombinasi `inferrs` + Gemma saat ini menerima permintaan
|
||||
`/v1/chat/completions` langsung yang kecil, tetapi tetap gagal pada giliran runtime agen
|
||||
OpenClaw penuh.
|
||||
Beberapa kombinasi `inferrs` + Gemma saat ini menerima permintaan kecil langsung ke
|
||||
`/v1/chat/completions` tetapi tetap gagal pada giliran runtime agen OpenClaw
|
||||
penuh.
|
||||
|
||||
Jika itu terjadi, coba ini terlebih dahulu:
|
||||
|
||||
@ -125,12 +125,12 @@ compat: {
|
||||
}
|
||||
```
|
||||
|
||||
Itu menonaktifkan permukaan skema tool OpenClaw untuk model tersebut dan dapat mengurangi tekanan prompt
|
||||
Itu menonaktifkan permukaan schema tool OpenClaw untuk model tersebut dan dapat mengurangi tekanan prompt
|
||||
pada backend lokal yang lebih ketat.
|
||||
|
||||
Jika permintaan langsung kecil masih berfungsi tetapi giliran agen OpenClaw normal tetap
|
||||
crash di dalam `inferrs`, masalah yang tersisa biasanya adalah perilaku model/server upstream,
|
||||
bukan lapisan transport OpenClaw.
|
||||
Jika permintaan langsung kecil tetap berfungsi tetapi giliran agen OpenClaw normal terus
|
||||
crash di dalam `inferrs`, masalah yang tersisa biasanya adalah perilaku model/server hulu
|
||||
daripada lapisan transport OpenClaw.
|
||||
|
||||
## Uji smoke manual
|
||||
|
||||
@ -139,39 +139,39 @@ Setelah dikonfigurasi, uji kedua lapisan:
|
||||
```bash
|
||||
curl http://127.0.0.1:8080/v1/chat/completions \
|
||||
-H 'content-type: application/json' \
|
||||
-d '{"model":"gg-hf-gg/gemma-4-E2B-it","messages":[{"role":"user","content":"What is 2 + 2?"}],"stream":false}'
|
||||
-d '{"model":"google/gemma-4-E2B-it","messages":[{"role":"user","content":"What is 2 + 2?"}],"stream":false}'
|
||||
|
||||
openclaw infer model run \
|
||||
--model inferrs/gg-hf-gg/gemma-4-E2B-it \
|
||||
--model inferrs/google/gemma-4-E2B-it \
|
||||
--prompt "What is 2 + 2? Reply with one short sentence." \
|
||||
--json
|
||||
```
|
||||
|
||||
Jika perintah pertama berfungsi tetapi yang kedua gagal, gunakan catatan pemecahan masalah
|
||||
di bawah.
|
||||
Jika perintah pertama berhasil tetapi yang kedua gagal, gunakan catatan pemecahan masalah
|
||||
di bawah ini.
|
||||
|
||||
## Pemecahan masalah
|
||||
|
||||
- `curl /v1/models` gagal: `inferrs` tidak berjalan, tidak dapat dijangkau, atau tidak
|
||||
terikat pada host/port yang diharapkan.
|
||||
terikat ke host/port yang diharapkan.
|
||||
- `messages[].content ... expected a string`: setel
|
||||
`compat.requiresStringContent: true`.
|
||||
- Panggilan `/v1/chat/completions` langsung yang kecil berhasil, tetapi `openclaw infer model run`
|
||||
- Panggilan langsung `/v1/chat/completions` kecil lolos, tetapi `openclaw infer model run`
|
||||
gagal: coba `compat.supportsTools: false`.
|
||||
- OpenClaw tidak lagi mendapatkan error skema, tetapi `inferrs` masih crash pada giliran
|
||||
agen yang lebih besar: perlakukan ini sebagai batasan `inferrs` atau model upstream dan kurangi
|
||||
- OpenClaw tidak lagi mendapatkan error schema, tetapi `inferrs` masih crash pada
|
||||
giliran agen yang lebih besar: perlakukan ini sebagai keterbatasan `inferrs` atau model hulu dan kurangi
|
||||
tekanan prompt atau ganti backend/model lokal.
|
||||
|
||||
## Perilaku gaya proxy
|
||||
## Perilaku bergaya proxy
|
||||
|
||||
`inferrs` diperlakukan sebagai backend `/v1` gaya proxy yang kompatibel dengan OpenAI, bukan
|
||||
`inferrs` diperlakukan sebagai backend `/v1` OpenAI-compatible bergaya proxy, bukan
|
||||
endpoint OpenAI native.
|
||||
|
||||
- pembentukan permintaan khusus OpenAI native tidak berlaku di sini
|
||||
- tidak ada `service_tier`, tidak ada Responses `store`, tidak ada hint prompt-cache, dan tidak ada
|
||||
- tidak ada `service_tier`, tidak ada Responses `store`, tidak ada petunjuk prompt-cache, dan tidak ada
|
||||
pembentukan payload kompatibilitas reasoning OpenAI
|
||||
- header atribusi OpenClaw tersembunyi (`originator`, `version`, `User-Agent`)
|
||||
tidak disisipkan pada base URL `inferrs` kustom
|
||||
tidak disuntikkan pada base URL `inferrs` kustom
|
||||
|
||||
## Lihat juga
|
||||
|
||||
|
||||
@ -5,10 +5,10 @@ read_when:
|
||||
summary: Gunakan Qwen Cloud melalui provider qwen bawaan OpenClaw
|
||||
title: Qwen
|
||||
x-i18n:
|
||||
generated_at: "2026-04-06T03:10:43Z"
|
||||
generated_at: "2026-04-09T01:30:01Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: f175793693ab6a4c3f1f4d42040e673c15faf7603a500757423e9e06977c989d
|
||||
source_hash: 4786df2cb6ec1ab29d191d012c61dcb0e5468bf0f8561fbbb50eed741efad325
|
||||
source_path: providers/qwen.md
|
||||
workflow: 15
|
||||
---
|
||||
@ -20,15 +20,15 @@ x-i18n:
|
||||
**Qwen OAuth telah dihapus.** Integrasi OAuth tingkat gratis
|
||||
(`qwen-portal`) yang menggunakan endpoint `portal.qwen.ai` tidak lagi tersedia.
|
||||
Lihat [Issue #49557](https://github.com/openclaw/openclaw/issues/49557) untuk
|
||||
latar belakangnya.
|
||||
latar belakang.
|
||||
|
||||
</Warning>
|
||||
|
||||
## Rekomendasi: Qwen Cloud
|
||||
|
||||
OpenClaw sekarang memperlakukan Qwen sebagai provider bawaan kelas satu dengan id kanonis
|
||||
OpenClaw kini memperlakukan Qwen sebagai provider bawaan kelas satu dengan id kanonis
|
||||
`qwen`. Provider bawaan ini menargetkan endpoint Qwen Cloud / Alibaba DashScope dan
|
||||
Coding Plan serta tetap mendukung id `modelstudio` lama sebagai
|
||||
Coding Plan serta menjaga id lama `modelstudio` tetap berfungsi sebagai
|
||||
alias kompatibilitas.
|
||||
|
||||
- Provider: `qwen`
|
||||
@ -40,24 +40,24 @@ Jika Anda ingin `qwen3.6-plus`, gunakan endpoint **Standard (pay-as-you-go)**.
|
||||
Dukungan Coding Plan dapat tertinggal dari katalog publik.
|
||||
|
||||
```bash
|
||||
# Global Coding Plan endpoint
|
||||
# Endpoint Coding Plan Global
|
||||
openclaw onboard --auth-choice qwen-api-key
|
||||
|
||||
# China Coding Plan endpoint
|
||||
# Endpoint Coding Plan China
|
||||
openclaw onboard --auth-choice qwen-api-key-cn
|
||||
|
||||
# Global Standard (pay-as-you-go) endpoint
|
||||
# Endpoint Standard (pay-as-you-go) Global
|
||||
openclaw onboard --auth-choice qwen-standard-api-key
|
||||
|
||||
# China Standard (pay-as-you-go) endpoint
|
||||
# Endpoint Standard (pay-as-you-go) China
|
||||
openclaw onboard --auth-choice qwen-standard-api-key-cn
|
||||
```
|
||||
|
||||
Id `auth-choice` `modelstudio-*` lama dan referensi model `modelstudio/...` masih
|
||||
berfungsi sebagai alias kompatibilitas, tetapi alur penyiapan baru sebaiknya menggunakan
|
||||
id `auth-choice` `qwen-*` kanonis dan referensi model `qwen/...`.
|
||||
Id `auth-choice` lama `modelstudio-*` dan ref model `modelstudio/...` masih
|
||||
berfungsi sebagai alias kompatibilitas, tetapi alur setup baru sebaiknya menggunakan
|
||||
id `auth-choice` kanonis `qwen-*` dan ref model `qwen/...`.
|
||||
|
||||
Setelah onboarding, tetapkan model default:
|
||||
Setelah onboarding, setel model default:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -71,22 +71,22 @@ Setelah onboarding, tetapkan model default:
|
||||
|
||||
## Jenis paket dan endpoint
|
||||
|
||||
| Paket | Wilayah | Auth choice | Endpoint |
|
||||
| -------------------------- | ------- | -------------------------- | ------------------------------------------------ |
|
||||
| Standard (pay-as-you-go) | China | `qwen-standard-api-key-cn` | `dashscope.aliyuncs.com/compatible-mode/v1` |
|
||||
| Standard (pay-as-you-go) | Global | `qwen-standard-api-key` | `dashscope-intl.aliyuncs.com/compatible-mode/v1` |
|
||||
| Coding Plan (langganan) | China | `qwen-api-key-cn` | `coding.dashscope.aliyuncs.com/v1` |
|
||||
| Coding Plan (langganan) | Global | `qwen-api-key` | `coding-intl.dashscope.aliyuncs.com/v1` |
|
||||
| Paket | Wilayah | Pilihan auth | Endpoint |
|
||||
| -------------------------- | ------ | -------------------------- | ------------------------------------------------ |
|
||||
| Standard (pay-as-you-go) | China | `qwen-standard-api-key-cn` | `dashscope.aliyuncs.com/compatible-mode/v1` |
|
||||
| Standard (pay-as-you-go) | Global | `qwen-standard-api-key` | `dashscope-intl.aliyuncs.com/compatible-mode/v1` |
|
||||
| Coding Plan (langganan) | China | `qwen-api-key-cn` | `coding.dashscope.aliyuncs.com/v1` |
|
||||
| Coding Plan (langganan) | Global | `qwen-api-key` | `coding-intl.dashscope.aliyuncs.com/v1` |
|
||||
|
||||
Provider secara otomatis memilih endpoint berdasarkan auth choice Anda. Pilihan
|
||||
kanonis menggunakan keluarga `qwen-*`; `modelstudio-*` tetap hanya untuk kompatibilitas.
|
||||
Provider secara otomatis memilih endpoint berdasarkan pilihan auth Anda. Pilihan kanonis
|
||||
menggunakan keluarga `qwen-*`; `modelstudio-*` tetap khusus untuk kompatibilitas.
|
||||
Anda dapat menimpa dengan `baseUrl` kustom di config.
|
||||
|
||||
Endpoint Model Studio native mengiklankan kompatibilitas penggunaan streaming pada
|
||||
transport bersama `openai-completions`. OpenClaw sekarang mengaitkannya berdasarkan
|
||||
kapabilitas endpoint, sehingga id provider kustom yang kompatibel dengan DashScope dan menargetkan
|
||||
Endpoint native Model Studio mengiklankan kompatibilitas penggunaan streaming pada
|
||||
transport bersama `openai-completions`. OpenClaw kini mengaitkannya ke
|
||||
kapabilitas endpoint, sehingga id provider kustom DashScope-compatible yang menargetkan
|
||||
host native yang sama mewarisi perilaku penggunaan streaming yang sama alih-alih
|
||||
mewajibkan id provider bawaan `qwen` secara khusus.
|
||||
secara khusus mewajibkan id provider bawaan `qwen`.
|
||||
|
||||
## Dapatkan API key Anda
|
||||
|
||||
@ -95,21 +95,23 @@ mewajibkan id provider bawaan `qwen` secara khusus.
|
||||
|
||||
## Katalog bawaan
|
||||
|
||||
OpenClaw saat ini menyediakan katalog Qwen bawaan berikut:
|
||||
OpenClaw saat ini menyediakan katalog Qwen bawaan ini. Katalog yang dikonfigurasi
|
||||
bergantung pada endpoint: config Coding Plan menghilangkan model yang hanya diketahui berfungsi pada
|
||||
endpoint Standard.
|
||||
|
||||
| Referensi model | Input | Konteks | Catatan |
|
||||
| -------------------------- | ----------- | --------- | -------------------------------------------------- |
|
||||
| `qwen/qwen3.5-plus` | text, image | 1,000,000 | Model default |
|
||||
| `qwen/qwen3.6-plus` | text, image | 1,000,000 | Gunakan endpoint Standard saat memerlukan model ini |
|
||||
| `qwen/qwen3-max-2026-01-23`| text | 262,144 | Lini Qwen Max |
|
||||
| `qwen/qwen3-coder-next` | text | 262,144 | Coding |
|
||||
| `qwen/qwen3-coder-plus` | text | 1,000,000 | Coding |
|
||||
| `qwen/MiniMax-M2.5` | text | 1,000,000 | Reasoning diaktifkan |
|
||||
| `qwen/glm-5` | text | 202,752 | GLM |
|
||||
| `qwen/glm-4.7` | text | 202,752 | GLM |
|
||||
| `qwen/kimi-k2.5` | text, image | 262,144 | Moonshot AI via Alibaba |
|
||||
| Ref model | Input | Konteks | Catatan |
|
||||
| --------------------------- | ----------- | --------- | -------------------------------------------------- |
|
||||
| `qwen/qwen3.5-plus` | text, image | 1,000,000 | Model default |
|
||||
| `qwen/qwen3.6-plus` | text, image | 1,000,000 | Gunakan endpoint Standard jika Anda memerlukan model ini |
|
||||
| `qwen/qwen3-max-2026-01-23` | text | 262,144 | Lini Qwen Max |
|
||||
| `qwen/qwen3-coder-next` | text | 262,144 | Coding |
|
||||
| `qwen/qwen3-coder-plus` | text | 1,000,000 | Coding |
|
||||
| `qwen/MiniMax-M2.5` | text | 1,000,000 | Reasoning diaktifkan |
|
||||
| `qwen/glm-5` | text | 202,752 | GLM |
|
||||
| `qwen/glm-4.7` | text | 202,752 | GLM |
|
||||
| `qwen/kimi-k2.5` | text, image | 262,144 | Moonshot AI melalui Alibaba |
|
||||
|
||||
Ketersediaan tetap dapat berbeda menurut endpoint dan paket penagihan meskipun suatu model
|
||||
Ketersediaan tetap dapat bervariasi menurut endpoint dan paket penagihan meskipun suatu model
|
||||
ada dalam katalog bawaan.
|
||||
|
||||
Kompatibilitas penggunaan native-streaming berlaku untuk host Coding Plan dan
|
||||
@ -134,15 +136,15 @@ endpoint/key Coding Plan.
|
||||
## Rencana kapabilitas
|
||||
|
||||
Ekstensi `qwen` sedang diposisikan sebagai rumah vendor untuk seluruh permukaan Qwen
|
||||
Cloud, bukan hanya model coding/teks.
|
||||
Cloud, bukan hanya model coding/text.
|
||||
|
||||
- Model teks/chat: sudah dibundel
|
||||
- Tool calling, output terstruktur, thinking: diwariskan dari transport yang kompatibel dengan OpenAI
|
||||
- Model text/chat: sudah bawaan sekarang
|
||||
- Pemanggilan tool, output terstruktur, thinking: diwarisi dari transport yang kompatibel dengan OpenAI
|
||||
- Pembuatan gambar: direncanakan di lapisan provider-plugin
|
||||
- Pemahaman gambar/video: sudah dibundel pada endpoint Standard
|
||||
- Pemahaman gambar/video: sudah bawaan sekarang pada endpoint Standard
|
||||
- Speech/audio: direncanakan di lapisan provider-plugin
|
||||
- Embedding/reranking memori: direncanakan melalui permukaan adapter embedding
|
||||
- Pembuatan video: sudah dibundel melalui kapabilitas video-generation bersama
|
||||
- Embedding/reranking memory: direncanakan melalui permukaan adapter embedding
|
||||
- Pembuatan video: sudah bawaan sekarang melalui capability video-generation bersama
|
||||
|
||||
## Add-on multimodal
|
||||
|
||||
@ -159,20 +161,20 @@ Ekstensi `qwen` sekarang juga mengekspos:
|
||||
Permukaan multimodal ini menggunakan endpoint DashScope **Standard**, bukan
|
||||
endpoint Coding Plan.
|
||||
|
||||
- URL dasar Standard Global/Intl: `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`
|
||||
- URL dasar Standard China: `https://dashscope.aliyuncs.com/compatible-mode/v1`
|
||||
- Base URL Standard Global/Intl: `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`
|
||||
- Base URL Standard China: `https://dashscope.aliyuncs.com/compatible-mode/v1`
|
||||
|
||||
Untuk pembuatan video, OpenClaw memetakan wilayah Qwen yang dikonfigurasi ke host
|
||||
DashScope AIGC regional yang sesuai sebelum mengirim job:
|
||||
Untuk pembuatan video, OpenClaw memetakan wilayah Qwen yang dikonfigurasi ke
|
||||
host AIGC DashScope yang sesuai sebelum mengirimkan pekerjaan:
|
||||
|
||||
- Global/Intl: `https://dashscope-intl.aliyuncs.com`
|
||||
- China: `https://dashscope.aliyuncs.com`
|
||||
|
||||
Artinya `models.providers.qwen.baseUrl` normal yang menunjuk ke salah satu host
|
||||
Qwen Coding Plan atau Standard tetap menjaga pembuatan video berada pada endpoint video DashScope
|
||||
Itu berarti `models.providers.qwen.baseUrl` normal yang menunjuk ke salah satu
|
||||
host Qwen Coding Plan atau Standard tetap menjaga pembuatan video pada endpoint video DashScope
|
||||
regional yang benar.
|
||||
|
||||
Untuk pembuatan video, tetapkan model default secara eksplisit:
|
||||
Untuk pembuatan video, setel model default secara eksplisit:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -186,20 +188,20 @@ Untuk pembuatan video, tetapkan model default secara eksplisit:
|
||||
|
||||
Batas pembuatan video Qwen bawaan saat ini:
|
||||
|
||||
- Maksimal **1** video output per permintaan
|
||||
- Maksimal **1** gambar input
|
||||
- Maksimal **4** video input
|
||||
- Durasi maksimal **10 detik**
|
||||
- Hingga **1** video output per permintaan
|
||||
- Hingga **1** gambar input
|
||||
- Hingga **4** video input
|
||||
- Durasi hingga **10 detik**
|
||||
- Mendukung `size`, `aspectRatio`, `resolution`, `audio`, dan `watermark`
|
||||
- Mode gambar/video referensi saat ini mewajibkan **URL http(s) jarak jauh**. Path
|
||||
file lokal ditolak di awal karena endpoint video DashScope tidak
|
||||
- Mode gambar/video referensi saat ini memerlukan **URL http(s) jarak jauh**. Path file lokal
|
||||
ditolak di awal karena endpoint video DashScope tidak
|
||||
menerima buffer lokal yang diunggah untuk referensi tersebut.
|
||||
|
||||
Lihat [Video Generation](/tools/video-generation) untuk parameter tool
|
||||
bersama, pemilihan provider, dan perilaku failover.
|
||||
Lihat [Pembuatan Video](/id/tools/video-generation) untuk
|
||||
parameter tool bersama, pemilihan provider, dan perilaku failover.
|
||||
|
||||
## Catatan environment
|
||||
|
||||
Jika Gateway berjalan sebagai daemon (launchd/systemd), pastikan `QWEN_API_KEY`
|
||||
tersedia bagi proses tersebut (misalnya, di `~/.openclaw/.env` atau melalui
|
||||
tersedia untuk proses tersebut (misalnya, di `~/.openclaw/.env` atau melalui
|
||||
`env.shellEnv`).
|
||||
|
||||
Loading…
Reference in New Issue
Block a user