From d7fec5d1817f2e59ffc63cd0a9fc17f2024f53c1 Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Mon, 13 Apr 2026 08:53:58 +0000 Subject: [PATCH] chore(i18n): refresh id translations --- docs/id/concepts/model-providers.md | 564 +++++++++---------- docs/id/concepts/qa-e2e-automation.md | 162 ++++-- docs/id/gateway/local-models.md | 73 ++- docs/id/help/testing.md | 779 ++++++++++++++------------ docs/id/providers/index.md | 28 +- docs/id/providers/lmstudio.md | 163 ++++++ docs/id/reference/api-usage-costs.md | 119 ++-- 7 files changed, 1077 insertions(+), 811 deletions(-) create mode 100644 docs/id/providers/lmstudio.md diff --git a/docs/id/concepts/model-providers.md b/docs/id/concepts/model-providers.md index 845fd18d9..9b6caab1a 100644 --- a/docs/id/concepts/model-providers.md +++ b/docs/id/concepts/model-providers.md @@ -5,17 +5,17 @@ read_when: summary: Ikhtisar penyedia model dengan contoh konfigurasi + alur CLI title: Penyedia Model x-i18n: - generated_at: "2026-04-11T02:44:22Z" + generated_at: "2026-04-13T08:50:45Z" model: gpt-5.4 provider: openai - source_hash: 910ea7895e74c03910757d9d3e02825754b779b204eca7275b28422647ed0151 + source_hash: 66ba688c4b4366eec07667571e835d4cfeee684896e2ffae11d601b5fa0a4b98 source_path: concepts/model-providers.md workflow: 15 --- # Penyedia model -Halaman ini membahas **penyedia LLM/model** (bukan channel 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 @@ -27,15 +27,15 @@ Untuk aturan pemilihan model, lihat [/concepts/models](/id/concepts/models). 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 provider dapat menyuntikkan katalog model melalui `registerProvider({ catalog })`; - OpenClaw menggabungkan output tersebut ke dalam `models.providers` sebelum menulis +- Plugin penyedia dapat menyuntikkan katalog model melalui `registerProvider({ catalog })`; + OpenClaw menggabungkan keluaran tersebut ke dalam `models.providers` sebelum menulis `models.json`. -- Manifes provider dapat mendeklarasikan `providerAuthEnvVars` dan - `providerAuthAliases` sehingga probe autentikasi berbasis env generik dan varian provider - tidak perlu memuat runtime plugin. Peta env-var inti yang tersisa sekarang - hanya untuk provider inti/non-plugin dan beberapa kasus prioritas generik +- Manifes penyedia dapat mendeklarasikan `providerAuthEnvVars` dan + `providerAuthAliases` sehingga probe autentikasi generik berbasis env 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 provider juga dapat memiliki perilaku runtime provider melalui +- Plugin penyedia juga dapat memiliki perilaku runtime penyedia melalui `normalizeModelId`, `normalizeTransport`, `normalizeConfig`, `applyNativeStreamingUsageCompat`, `resolveConfigApiKey`, `resolveSyntheticAuth`, `shouldDeferSyntheticProfileAuth`, @@ -53,223 +53,179 @@ Untuk aturan pemilihan model, lihat [/concepts/models](/id/concepts/models). `resolveDefaultThinkingLevel`, `applyConfigDefaults`, `isModernModelRef`, `prepareRuntimeAuth`, `resolveUsageAuth`, `fetchUsageSnapshot`, dan `onModelSelected`. -- Catatan: `capabilities` runtime provider adalah metadata runner bersama (keluarga provider, - keunikan transkrip/tooling, petunjuk transport/cache). Ini bukan hal yang - sama dengan [model capability publik](/id/plugins/architecture#public-capability-model) - yang menjelaskan apa yang didaftarkan oleh sebuah plugin (inferensi teks, ucapan, dll.). -- Provider `codex` bawaan dipasangkan dengan harness agen Codex bawaan. - Gunakan `codex/gpt-*` saat Anda menginginkan login milik Codex, penemuan model, - resume thread native, dan eksekusi app-server. Referensi `openai/gpt-*` biasa tetap - menggunakan provider OpenAI dan transport provider OpenClaw normal. +- Catatan: runtime penyedia `capabilities` adalah metadata runner bersama (keluarga penyedia, kekhasan transkrip/tooling, petunjuk transport/cache). Ini bukan + hal yang sama dengan [model capability publik](/id/plugins/architecture#public-capability-model) + yang menjelaskan apa yang didaftarkan oleh sebuah Plugin (inferensi teks, ucapan, dll.). +- Penyedia `codex` bawaan dipasangkan dengan harness agen Codex bawaan. + Gunakan `codex/gpt-*` saat Anda menginginkan login yang dimiliki Codex, penemuan model, resume thread native, dan eksekusi server aplikasi. Referensi `openai/gpt-*` biasa tetap + menggunakan penyedia OpenAI dan transport penyedia OpenClaw normal. Deployment khusus Codex dapat menonaktifkan fallback PI otomatis dengan `agents.defaults.embeddedHarness.fallback: "none"`; lihat [Codex Harness](/id/plugins/codex-harness). -## Perilaku provider yang dimiliki plugin +## Perilaku penyedia yang dimiliki Plugin -Plugin provider kini dapat memiliki sebagian besar logika khusus provider sementara OpenClaw tetap menangani +Plugin penyedia kini dapat memiliki sebagian besar logika khusus penyedia sementara OpenClaw mempertahankan loop inferensi generik. -Pembagian umumnya: +Pembagian umum: -- `auth[].run` / `auth[].runNonInteractive`: provider memiliki alur onboarding/login - untuk `openclaw onboard`, `openclaw models auth`, dan setup headless -- `wizard.setup` / `wizard.modelPicker`: provider memiliki label pilihan autentikasi, - alias lama, petunjuk allowlist onboarding, dan entri setup di pemilih onboarding/model -- `catalog`: provider muncul di `models.providers` -- `normalizeModelId`: provider menormalkan id model legacy/pratinjau sebelum - lookup atau kanonikalisasi -- `normalizeTransport`: provider menormalkan keluarga transport `api` / `baseUrl` - sebelum perakitan model generik; OpenClaw memeriksa provider yang cocok terlebih dahulu, - lalu plugin provider lain yang mendukung hook sampai salah satunya benar-benar mengubah +- `auth[].run` / `auth[].runNonInteractive`: penyedia memiliki alur onboarding/login + untuk `openclaw onboard`, `openclaw models auth`, dan penyiapan headless +- `wizard.setup` / `wizard.modelPicker`: penyedia memiliki label pilihan autentikasi, + alias lama, petunjuk allowlist onboarding, dan entri penyiapan di pemilih onboarding/model +- `catalog`: penyedia muncul di `models.providers` +- `normalizeModelId`: penyedia menormalkan id model lama/pratinjau sebelum + pencarian atau kanonisasi +- `normalizeTransport`: penyedia menormalkan `api` / `baseUrl` keluarga transport + sebelum perakitan model generik; OpenClaw memeriksa penyedia yang cocok terlebih dahulu, + lalu Plugin penyedia lain yang mampu menjalankan hook sampai salah satunya benar-benar mengubah transport -- `normalizeConfig`: provider menormalkan konfigurasi `models.providers.` sebelum - runtime menggunakannya; OpenClaw 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 konfigurasi, helper keluarga Google bawaan tetap - menormalkan entri provider Google yang didukung. -- `applyNativeStreamingUsageCompat`: provider menerapkan penulisan ulang kompatibilitas penggunaan streaming native berbasis endpoint untuk provider konfigurasi -- `resolveConfigApiKey`: provider menyelesaikan autentikasi penanda env untuk provider konfigurasi +- `normalizeConfig`: penyedia menormalkan konfigurasi `models.providers.` sebelum + runtime menggunakannya; OpenClaw memeriksa penyedia yang cocok terlebih dahulu, lalu Plugin penyedia lain + yang mampu menjalankan hook sampai salah satunya benar-benar mengubah konfigurasi. Jika tidak ada + hook penyedia yang menulis ulang konfigurasi, helper keluarga Google bawaan tetap + menormalkan entri penyedia Google yang didukung. +- `applyNativeStreamingUsageCompat`: penyedia menerapkan penulisan ulang kompatibilitas penggunaan streaming native berbasis endpoint untuk penyedia konfigurasi +- `resolveConfigApiKey`: penyedia menyelesaikan autentikasi penanda env untuk penyedia konfigurasi tanpa memaksa pemuatan autentikasi runtime penuh. `amazon-bedrock` juga memiliki resolver penanda env AWS bawaan di sini, meskipun autentikasi runtime Bedrock menggunakan rantai default AWS SDK. -- `resolveSyntheticAuth`: provider dapat mengekspos ketersediaan autentikasi lokal/self-hosted atau autentikasi berbasis konfigurasi lainnya - tanpa menyimpan secret plaintext -- `shouldDeferSyntheticProfileAuth`: provider dapat menandai placeholder profil sintetis yang disimpan +- `resolveSyntheticAuth`: penyedia dapat mengekspos ketersediaan autentikasi lokal/self-hosted atau + autentikasi lain yang didukung konfigurasi tanpa menyimpan secret plaintext +- `shouldDeferSyntheticProfileAuth`: penyedia dapat menandai placeholder profil sintetis yang disimpan sebagai prioritas lebih rendah daripada autentikasi berbasis env/konfigurasi -- `resolveDynamicModel`: provider menerima id model yang belum ada di katalog statis lokal -- `prepareDynamicModel`: provider memerlukan penyegaran metadata sebelum mencoba kembali +- `resolveDynamicModel`: penyedia menerima id model yang belum ada di + katalog statis lokal +- `prepareDynamicModel`: penyedia memerlukan refresh metadata sebelum mencoba lagi resolusi model dinamis -- `normalizeResolvedModel`: provider memerlukan penulisan ulang transport atau base URL -- `contributeResolvedModelCompat`: provider menyumbangkan flag kompatibilitas untuk - model vendor miliknya bahkan ketika model tersebut datang melalui transport kompatibel lain -- `capabilities`: provider memublikasikan keunikan transkrip/tooling/keluarga provider -- `normalizeToolSchemas`: provider membersihkan skema tool sebelum runner tersemat - melihatnya -- `inspectToolSchemas`: provider menampilkan peringatan skema khusus transport +- `normalizeResolvedModel`: penyedia memerlukan penulisan ulang transport atau base URL +- `contributeResolvedModelCompat`: penyedia menyumbangkan flag kompatibilitas untuk + model vendor mereka bahkan ketika model tersebut datang melalui transport kompatibel lain +- `capabilities`: penyedia memublikasikan kekhasan transkrip/tooling/keluarga penyedia +- `normalizeToolSchemas`: penyedia membersihkan skema tool sebelum + runner tertanam melihatnya +- `inspectToolSchemas`: penyedia menampilkan peringatan skema khusus transport setelah normalisasi -- `resolveReasoningOutputMode`: provider memilih kontrak output reasoning +- `resolveReasoningOutputMode`: penyedia memilih kontrak keluaran reasoning native vs bertag -- `prepareExtraParams`: provider menetapkan default atau menormalkan parameter permintaan per model -- `createStreamFn`: provider menggantikan jalur stream normal dengan transport +- `prepareExtraParams`: penyedia menetapkan default atau menormalkan parameter permintaan per model +- `createStreamFn`: penyedia mengganti jalur stream normal dengan transport kustom sepenuhnya -- `wrapStreamFn`: provider menerapkan wrapper kompatibilitas header/body/model permintaan -- `resolveTransportTurnState`: provider menyediakan header transport native per giliran - atau metadata -- `resolveWebSocketSessionPolicy`: provider menyediakan header sesi WebSocket native - atau kebijakan cooldown sesi -- `createEmbeddingProvider`: provider memiliki perilaku embedding memori saat hal itu - berada bersama plugin provider, bukan switchboard embedding inti -- `formatApiKey`: provider memformat profil autentikasi yang disimpan ke dalam string - `apiKey` runtime yang diharapkan oleh transport -- `refreshOAuth`: provider memiliki penyegaran OAuth saat refresher bersama `pi-ai` +- `wrapStreamFn`: penyedia menerapkan wrapper kompatibilitas header/body/model permintaan +- `resolveTransportTurnState`: penyedia menyediakan header atau metadata + transport native per giliran +- `resolveWebSocketSessionPolicy`: penyedia menyediakan header sesi WebSocket native + atau kebijakan cool-down sesi +- `createEmbeddingProvider`: penyedia memiliki perilaku embedding memori saat + perilaku tersebut seharusnya berada pada Plugin penyedia, bukan switchboard embedding inti +- `formatApiKey`: penyedia memformat profil autentikasi yang disimpan menjadi string + runtime `apiKey` yang diharapkan oleh transport +- `refreshOAuth`: penyedia memiliki refresh OAuth ketika refresher bersama `pi-ai` tidak memadai -- `buildAuthDoctorHint`: provider menambahkan panduan perbaikan saat penyegaran OAuth +- `buildAuthDoctorHint`: penyedia menambahkan panduan perbaikan saat refresh OAuth gagal -- `matchesContextOverflowError`: provider mengenali error overflow context-window - khusus provider yang akan terlewat oleh heuristik generik -- `classifyFailoverReason`: provider memetakan error transport/API mentah khusus provider +- `matchesContextOverflowError`: penyedia mengenali error luapan jendela konteks + khusus penyedia yang terlewat oleh heuristik generik +- `classifyFailoverReason`: penyedia memetakan error transport/API mentah khusus penyedia ke alasan failover seperti rate limit atau overload -- `isCacheTtlEligible`: provider menentukan id model upstream mana yang mendukung TTL prompt-cache -- `buildMissingAuthMessage`: provider menggantikan error penyimpanan autentikasi generik - dengan petunjuk pemulihan khusus provider -- `suppressBuiltInModel`: provider menyembunyikan baris upstream yang usang dan dapat mengembalikan - error milik vendor untuk kegagalan resolusi langsung -- `augmentModelCatalog`: provider menambahkan baris katalog sintetis/akhir setelah - discovery dan penggabungan konfigurasi -- `isBinaryThinking`: provider memiliki UX thinking biner hidup/mati -- `supportsXHighThinking`: provider mengikutsertakan model tertentu ke `xhigh` -- `resolveDefaultThinkingLevel`: provider memiliki kebijakan default `/think` untuk - sebuah keluarga model -- `applyConfigDefaults`: provider menerapkan default global khusus provider +- `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 + error yang dimiliki vendor untuk kegagalan resolusi langsung +- `augmentModelCatalog`: penyedia menambahkan baris katalog sintetis/final setelah + penemuan dan penggabungan konfigurasi +- `isBinaryThinking`: penyedia memiliki UX thinking biner nyala/mati +- `supportsXHighThinking`: penyedia memilih model tertentu agar mendukung `xhigh` +- `resolveDefaultThinkingLevel`: penyedia memiliki kebijakan default `/think` untuk + keluarga model +- `applyConfigDefaults`: penyedia menerapkan default global khusus penyedia selama materialisasi konfigurasi berdasarkan mode autentikasi, env, atau keluarga model -- `isModernModelRef`: provider memiliki pencocokan model pilihan live/smoke -- `prepareRuntimeAuth`: provider mengubah kredensial yang dikonfigurasi menjadi token runtime - jangka pendek -- `resolveUsageAuth`: provider menyelesaikan kredensial penggunaan/kuota untuk `/usage` +- `isModernModelRef`: penyedia memiliki pencocokan model pilihan live/smoke +- `prepareRuntimeAuth`: penyedia mengubah kredensial yang dikonfigurasi menjadi token runtime + berumur pendek +- `resolveUsageAuth`: penyedia menyelesaikan kredensial penggunaan/kuota untuk `/usage` dan permukaan status/pelaporan terkait -- `fetchUsageSnapshot`: provider memiliki pengambilan/penguraian endpoint penggunaan sementara - inti tetap memiliki shell ringkasan dan pemformatan -- `onModelSelected`: provider menjalankan efek samping setelah pemilihan model seperti - telemetri atau pencatatan sesi milik provider +- `fetchUsageSnapshot`: penyedia memiliki pengambilan/penguraian endpoint penggunaan sementara + inti tetap memiliki shell ringkasan dan pemformatannya +- `onModelSelected`: penyedia menjalankan efek samping pascapemilihan seperti + telemetri atau pembukuan sesi yang dimiliki penyedia Contoh bawaan saat ini: -- `anthropic`: fallback forward-compat Claude 4.6, petunjuk perbaikan autentikasi, pengambilan endpoint penggunaan, - metadata cache-TTL/keluarga provider, dan default konfigurasi global - yang sadar autentikasi -- `amazon-bedrock`: pencocokan context-overflow dan klasifikasi alasan - failover yang dimiliki provider untuk error throttle/belum-siap khusus Bedrock, ditambah - keluarga replay bersama `anthropic-by-model` untuk guard kebijakan replay khusus Claude - pada traffic Anthropic -- `anthropic-vertex`: guard kebijakan replay khusus Claude pada - traffic pesan Anthropic -- `openrouter`: id model pass-through, wrapper permintaan, petunjuk capability provider, - sanitasi thought-signature Gemini pada traffic proxy Gemini, injeksi - reasoning proxy melalui keluarga stream `openrouter-thinking`, penerusan metadata - routing, dan kebijakan cache-TTL -- `github-copilot`: onboarding/login perangkat, fallback model forward-compat, - petunjuk transkrip Claude-thinking, pertukaran token runtime, dan pengambilan endpoint penggunaan -- `openai`: fallback forward-compat GPT-5.4, normalisasi transport OpenAI langsung, - petunjuk autentikasi-hilang yang sadar Codex, suppression Spark, baris katalog - sintetis OpenAI/Codex, 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 provider, - pendaftaran provider pembuatan gambar bawaan - untuk `gpt-image-1`, dan pendaftaran provider pembuatan video bawaan - untuk `sora-2` -- `google` dan `google-gemini-cli`: fallback forward-compat Gemini 3.1, - validasi replay Gemini native, sanitasi replay bootstrap, mode output - reasoning bertag, pencocokan model modern, pendaftaran provider pembuatan gambar bawaan - untuk model Gemini image-preview, dan pendaftaran provider - pembuatan video bawaan untuk model Veo; OAuth Gemini CLI juga - memiliki pemformatan token profil autentikasi, parsing token penggunaan, dan pengambilan endpoint kuota - untuk permukaan penggunaan -- `moonshot`: transport bersama, normalisasi payload thinking yang dimiliki plugin -- `kilocode`: transport bersama, header permintaan yang dimiliki plugin, normalisasi payload reasoning, - sanitasi thought-signature proxy-Gemini, dan kebijakan cache-TTL -- `zai`: fallback forward-compat GLM-5, default `tool_stream`, kebijakan cache-TTL, - kebijakan binary-thinking/live-model, dan autentikasi penggunaan + pengambilan kuota; - id `glm-5*` yang tidak dikenal disintesis dari templat `glm-4.7` bawaan -- `xai`: normalisasi transport Responses native, penulisan ulang alias `/fast` untuk - varian cepat Grok, default `tool_stream`, pembersihan skema-tool / - payload reasoning khusus xAI, dan pendaftaran provider pembuatan video bawaan - untuk `grok-imagine-video` -- `mistral`: metadata capability yang dimiliki plugin -- `opencode` dan `opencode-go`: metadata capability yang dimiliki plugin ditambah - sanitasi thought-signature proxy-Gemini -- `alibaba`: katalog pembuatan video yang dimiliki plugin untuk referensi model Wan langsung - seperti `alibaba/wan2.6-t2v` -- `byteplus`: katalog yang dimiliki plugin ditambah pendaftaran provider pembuatan video bawaan - untuk model text-to-video/image-to-video Seedance -- `fal`: pendaftaran provider pembuatan video bawaan untuk model pihak ketiga yang dihosting, - pendaftaran provider pembuatan gambar untuk model gambar FLUX, ditambah pendaftaran provider - pembuatan video bawaan untuk model video pihak ketiga yang dihosting +- `anthropic`: fallback kompatibilitas-maju Claude 4.6, petunjuk perbaikan autentikasi, pengambilan endpoint penggunaan, metadata keluarga penyedia/cache-TTL, dan default konfigurasi global yang sadar autentikasi +- `amazon-bedrock`: pencocokan context-overflow yang dimiliki penyedia dan klasifikasi alasan failover untuk error throttle/not-ready khusus Bedrock, ditambah keluarga replay bersama `anthropic-by-model` untuk guard kebijakan replay khusus Claude 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 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 autentikasi hilang yang sadar Codex, penekanan Spark, baris katalog OpenAI/Codex sintetis, kebijakan thinking/model live, normalisasi alias token penggunaan (`input` / `output` dan keluarga `prompt` / `completion`), keluarga stream bersama `openai-responses-defaults` untuk wrapper OpenAI/Codex native, metadata keluarga penyedia, pendaftaran penyedia pembuatan gambar bawaan untuk `gpt-image-1`, dan pendaftaran penyedia pembuatan video bawaan untuk `sora-2` +- `google` dan `google-gemini-cli`: fallback kompatibilitas-maju Gemini 3.1, validasi replay Gemini native, sanitasi replay bootstrap, mode keluaran reasoning bertag, pencocokan model modern, pendaftaran penyedia pembuatan gambar bawaan untuk model image-preview Gemini, dan pendaftaran penyedia pembuatan video bawaan untuk model Veo; OAuth Gemini CLI juga memiliki pemformatan token profil autentikasi, penguraian token penggunaan, dan pengambilan endpoint kuota untuk permukaan penggunaan +- `moonshot`: transport bersama, normalisasi muatan thinking yang dimiliki Plugin +- `kilocode`: transport bersama, header permintaan yang dimiliki Plugin, normalisasi muatan 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, dan autentikasi penggunaan + pengambilan kuota; id `glm-5*` yang tidak dikenal disintesis dari templat `glm-4.7` bawaan +- `xai`: normalisasi transport Responses native, penulisan ulang alias `/fast` untuk varian cepat Grok, default `tool_stream`, pembersihan skema tool / muatan reasoning khusus xAI, dan pendaftaran penyedia pembuatan video bawaan untuk `grok-imagine-video` +- `mistral`: metadata capability yang dimiliki Plugin +- `opencode` dan `opencode-go`: metadata capability yang dimiliki Plugin ditambah sanitasi thought-signature proxy-Gemini +- `alibaba`: katalog pembuatan video yang dimiliki Plugin untuk referensi model Wan langsung seperti `alibaba/wan2.6-t2v` +- `byteplus`: katalog yang dimiliki Plugin ditambah pendaftaran penyedia pembuatan video bawaan untuk model Seedance text-to-video/image-to-video +- `fal`: pendaftaran penyedia pembuatan video bawaan untuk penyedia pembuatan gambar pihak ketiga yang di-hosting untuk model gambar FLUX ditambah pendaftaran penyedia pembuatan video bawaan untuk model video pihak ketiga yang di-hosting - `cloudflare-ai-gateway`, `huggingface`, `kimi`, `nvidia`, `qianfan`, `stepfun`, `synthetic`, `venice`, `vercel-ai-gateway`, dan `volcengine`: - hanya katalog yang dimiliki plugin -- `qwen`: katalog yang dimiliki plugin untuk model teks ditambah pendaftaran provider - media-understanding dan pembuatan video bersama untuk permukaan multimodalnya; - pembuatan video Qwen menggunakan endpoint video DashScope Standar dengan - model Wan bawaan seperti `wan2.6-t2v` dan `wan2.7-r2v` -- `runway`: pendaftaran provider pembuatan video yang dimiliki plugin untuk model native - berbasis tugas Runway seperti `gen4.5` -- `minimax`: katalog yang dimiliki plugin, pendaftaran provider pembuatan video bawaan - untuk model video Hailuo, pendaftaran provider pembuatan gambar bawaan - untuk `image-01`, pemilihan kebijakan replay Anthropic/OpenAI hibrida, - dan logika autentikasi/snapshot penggunaan -- `together`: katalog yang dimiliki plugin ditambah pendaftaran provider pembuatan video bawaan - untuk model video Wan -- `xiaomi`: katalog yang dimiliki plugin ditambah logika autentikasi/snapshot penggunaan + hanya katalog yang dimiliki Plugin +- `qwen`: katalog yang dimiliki Plugin untuk model teks ditambah pendaftaran penyedia media-understanding dan pembuatan video bersama untuk permukaan multimodalnya; pembuatan video Qwen menggunakan endpoint video DashScope Standar dengan model Wan bawaan seperti `wan2.6-t2v` dan `wan2.7-r2v` +- `runway`: pendaftaran penyedia pembuatan video yang dimiliki Plugin untuk model native berbasis tugas Runway seperti `gen4.5` +- `minimax`: katalog yang dimiliki Plugin, pendaftaran penyedia pembuatan video bawaan untuk model video Hailuo, pendaftaran penyedia pembuatan gambar bawaan untuk `image-01`, pemilihan kebijakan replay hibrida Anthropic/OpenAI, dan logika autentikasi/snapshot penggunaan +- `together`: katalog yang dimiliki Plugin ditambah pendaftaran penyedia pembuatan video bawaan untuk model video Wan +- `xiaomi`: katalog yang dimiliki Plugin ditambah logika autentikasi/snapshot penggunaan -Plugin `openai` bawaan sekarang memiliki kedua id provider: `openai` dan +Plugin `openai` bawaan sekarang memiliki kedua id penyedia: `openai` dan `openai-codex`. -Itu mencakup provider yang masih sesuai dengan transport normal OpenClaw. Provider -yang membutuhkan eksekutor permintaan kustom sepenuhnya adalah permukaan ekstensi -yang terpisah dan lebih dalam. +Itu mencakup penyedia yang masih sesuai dengan transport normal OpenClaw. Penyedia +yang memerlukan eksekutor permintaan kustom sepenuhnya adalah permukaan ekstensi +terpisah yang lebih mendalam. ## Rotasi API key -- Mendukung rotasi provider generik untuk provider tertentu. +- Mendukung rotasi penyedia generik untuk penyedia tertentu. - Konfigurasikan beberapa key melalui: - - `OPENCLAW_LIVE__KEY` (override live tunggal, prioritas tertinggi) + - `OPENCLAW_LIVE__KEY` (satu override live, prioritas tertinggi) - `_API_KEYS` (daftar dipisahkan koma atau titik koma) - `_API_KEY` (key utama) - `_API_KEY_*` (daftar bernomor, misalnya `_API_KEY_1`) -- Untuk provider Google, `GOOGLE_API_KEY` juga disertakan sebagai fallback. +- Untuk penyedia Google, `GOOGLE_API_KEY` juga disertakan sebagai fallback. - Urutan pemilihan key mempertahankan prioritas dan menghapus duplikasi nilai. -- Permintaan dicoba ulang dengan key berikutnya hanya pada respons rate-limit (misalnya - `429`, `rate_limit`, `quota`, `resource exhausted`, `Too many +- Permintaan dicoba ulang dengan key berikutnya hanya pada respons rate-limit (misalnya `429`, `rate_limit`, `quota`, `resource exhausted`, `Too many concurrent requests`, `ThrottlingException`, `concurrency limit reached`, - `workers_ai ... quota limit exceeded`, atau pesan batas penggunaan berkala). + `workers_ai ... quota limit exceeded`, atau pesan batas penggunaan periodik). - Kegagalan non-rate-limit langsung gagal; tidak ada rotasi key yang dicoba. -- Ketika semua key kandidat gagal, error akhir dikembalikan dari percobaan terakhir. +- Saat semua key kandidat gagal, error final dikembalikan dari percobaan terakhir. -## Provider bawaan (katalog pi-ai) +## Penyedia bawaan (katalog pi-ai) -OpenClaw dilengkapi dengan katalog pi‑ai. Provider ini tidak memerlukan +OpenClaw dikirim dengan katalog pi-ai. Penyedia ini tidak memerlukan konfigurasi `models.providers`; cukup tetapkan autentikasi + pilih model. ### OpenAI -- Provider: `openai` -- Auth: `OPENAI_API_KEY` -- Rotasi opsional: `OPENAI_API_KEYS`, `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, ditambah `OPENCLAW_LIVE_OPENAI_KEY` (override tunggal) +- Penyedia: `openai` +- Autentikasi: `OPENAI_API_KEY` +- Rotasi opsional: `OPENAI_API_KEYS`, `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, ditambah `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 terlebih dahulu, fallback SSE) +- Transport default adalah `auto` (WebSocket lebih dulu, fallback SSE) - Override per model melalui `agents.defaults.models["openai/"].params.transport` (`"sse"`, `"websocket"`, atau `"auto"`) -- Warm-up WebSocket OpenAI Responses defaultnya aktif melalui `params.openaiWsWarmup` (`true`/`false`) +- Warm-up WebSocket OpenAI Responses default-nya aktif melalui `params.openaiWsWarmup` (`true`/`false`) - Pemrosesan prioritas OpenAI dapat diaktifkan melalui `agents.defaults.models["openai/"].params.serviceTier` -- `/fast` dan `params.fastMode` memetakan permintaan Responses `openai/*` langsung ke `service_tier=priority` di `api.openai.com` -- Gunakan `params.serviceTier` saat Anda menginginkan tier eksplisit, bukan toggle `/fast` bersama +- `/fast` dan `params.fastMode` memetakan permintaan Responses `openai/*` langsung ke `service_tier=priority` pada `api.openai.com` +- Gunakan `params.serviceTier` saat Anda menginginkan tier eksplisit alih-alih toggle `/fast` bersama - Header atribusi OpenClaw tersembunyi (`originator`, `version`, - `User-Agent`) hanya berlaku pada traffic 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 Responses `store`, petunjuk prompt-cache, dan +- 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 disembunyikan di OpenClaw karena API OpenAI live menolaknya; Spark diperlakukan sebagai khusus Codex +- `openai/gpt-5.3-codex-spark` sengaja ditekan di OpenClaw karena API OpenAI live menolaknya; Spark diperlakukan sebagai khusus Codex ```json5 { @@ -279,14 +235,14 @@ konfigurasi `models.providers`; cukup tetapkan autentikasi + pilih model. ### Anthropic -- Provider: `anthropic` -- Auth: `ANTHROPIC_API_KEY` -- Rotasi opsional: `ANTHROPIC_API_KEYS`, `ANTHROPIC_API_KEY_1`, `ANTHROPIC_API_KEY_2`, ditambah `OPENCLAW_LIVE_ANTHROPIC_KEY` (override tunggal) +- Penyedia: `anthropic` +- Autentikasi: `ANTHROPIC_API_KEY` +- Rotasi opsional: `ANTHROPIC_API_KEYS`, `ANTHROPIC_API_KEY_1`, `ANTHROPIC_API_KEY_2`, ditambah `OPENCLAW_LIVE_ANTHROPIC_KEY` (satu override) - Contoh model: `anthropic/claude-opus-4-6` - CLI: `openclaw onboard --auth-choice apiKey` -- Permintaan Anthropic publik langsung juga mendukung toggle `/fast` bersama dan `params.fastMode`, termasuk traffic 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 gaya OpenClaw diizinkan lagi, jadi OpenClaw memperlakukan penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai hal yang diizinkan untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. -- Setup-token Anthropic tetap tersedia sebagai jalur token OpenClaw yang didukung, tetapi OpenClaw sekarang lebih memilih penggunaan ulang Claude CLI dan `claude -p` jika tersedia. +- Permintaan Anthropic publik langsung mendukung toggle `/fast` bersama 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 gaya OpenClaw diperbolehkan lagi, sehingga 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 memilih penggunaan ulang Claude CLI dan `claude -p` saat tersedia. ```json5 { @@ -296,20 +252,20 @@ konfigurasi `models.providers`; cukup tetapkan autentikasi + pilih model. ### OpenAI Code (Codex) -- Provider: `openai-codex` -- Auth: OAuth (ChatGPT) +- Penyedia: `openai-codex` +- Autentikasi: 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 terlebih dahulu, fallback SSE) +- Transport default adalah `auto` (WebSocket lebih dulu, fallback SSE) - Override per model melalui `agents.defaults.models["openai-codex/"].params.transport` (`"sse"`, `"websocket"`, atau `"auto"`) -- `params.serviceTier` juga diteruskan pada permintaan Codex Responses native (`chatgpt.com/backend-api`) +- `params.serviceTier` juga diteruskan pada permintaan Responses Codex native (`chatgpt.com/backend-api`) - Header atribusi OpenClaw tersembunyi (`originator`, `version`, - `User-Agent`) hanya dilampirkan pada traffic 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 +- Berbagi toggle `/fast` dan konfigurasi `params.fastMode` yang sama dengan `openai/*` langsung; OpenClaw memetakannya ke `service_tier=priority` +- `openai-codex/gpt-5.3-codex-spark` tetap tersedia saat katalog OAuth Codex mengeksposnya; bergantung pada entitlement - `openai-codex/gpt-5.4` mempertahankan `contextWindow = 1050000` native dan `contextTokens = 272000` runtime default; override batas runtime dengan `models.providers.openai-codex.models[].contextTokens` -- Catatan kebijakan: OAuth OpenAI Codex didukung secara eksplisit untuk tool/alur kerja eksternal seperti OpenClaw. +- Catatan kebijakan: OAuth OpenAI Codex secara eksplisit didukung untuk tool/alur kerja eksternal seperti OpenClaw. ```json5 { @@ -329,17 +285,17 @@ konfigurasi `models.providers`; cukup tetapkan autentikasi + pilih model. } ``` -### Opsi host bergaya langganan lainnya +### Opsi hosted bergaya langganan lainnya -- [Qwen Cloud](/id/providers/qwen): permukaan provider Qwen Cloud ditambah pemetaan endpoint Alibaba DashScope dan Coding Plan -- [MiniMax](/id/providers/minimax): akses OAuth atau API key MiniMax Coding Plan -- [GLM Models](/id/providers/glm): endpoint Z.AI Coding Plan atau API umum +- [Qwen Cloud](/id/providers/qwen): permukaan penyedia Qwen Cloud ditambah pemetaan endpoint Alibaba DashScope dan Coding Plan +- [MiniMax](/id/providers/minimax): OAuth MiniMax Coding Plan atau akses API key +- [GLM Models](/id/providers/glm): Z.AI Coding Plan atau endpoint API umum ### OpenCode -- Auth: `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`) -- Provider runtime Zen: `opencode` -- Provider runtime Go: `opencode-go` +- Autentikasi: `OPENCODE_API_KEY` (atau `OPENCODE_ZEN_API_KEY`) +- Penyedia runtime Zen: `opencode` +- Penyedia runtime Go: `opencode-go` - Contoh model: `opencode/claude-opus-4-6`, `opencode-go/kimi-k2.5` - CLI: `openclaw onboard --auth-choice opencode-zen` atau `openclaw onboard --auth-choice opencode-go` @@ -351,22 +307,22 @@ konfigurasi `models.providers`; cukup tetapkan autentikasi + pilih model. ### Google Gemini (API key) -- Provider: `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) +- Penyedia: `google` +- Autentikasi: `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` (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` +- Kompatibilitas: konfigurasi OpenClaw lama yang menggunakan `google/gemini-3.1-flash-preview` dinormalisasi menjadi `google/gemini-3-flash-preview` - CLI: `openclaw onboard --auth-choice gemini-api-key` - Eksekusi Gemini langsung juga menerima `agents.defaults.models["google/"].params.cachedContent` (atau `cached_content` lama) untuk meneruskan handle - `cachedContents/...` native milik provider; cache hit Gemini muncul sebagai OpenClaw `cacheRead` + `cachedContents/...` native penyedia; cache hit Gemini muncul sebagai OpenClaw `cacheRead` ### Google Vertex dan Gemini CLI -- Provider: `google-vertex`, `google-gemini-cli` -- Auth: Vertex menggunakan gcloud ADC; Gemini CLI menggunakan alur OAuth-nya +- Penyedia: `google-vertex`, `google-gemini-cli` +- Autentikasi: Vertex menggunakan gcloud ADC; Gemini CLI menggunakan alur OAuth-nya - Perhatian: OAuth Gemini CLI 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. -- OAuth Gemini CLI dikirim sebagai bagian dari plugin `google` bawaan. +- OAuth Gemini CLI dikirim sebagai bagian dari Plugin `google` bawaan. - Instal Gemini CLI terlebih dahulu: - `brew install gemini-cli` - atau `npm install -g @google/gemini-cli` @@ -374,66 +330,66 @@ konfigurasi `models.providers`; cukup tetapkan autentikasi + pilih model. - 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 `openclaw.json`. Alur login CLI menyimpan - token dalam profil autentikasi di host gateway. - - Jika permintaan gagal setelah login, setel `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`. + token dalam profil autentikasi di host Gateway. + - Jika permintaan gagal setelah login, setel `GOOGLE_CLOUD_PROJECT` atau `GOOGLE_CLOUD_PROJECT_ID` di host Gateway. + - Balasan JSON Gemini CLI diurai dari `response`; penggunaan akan fallback ke + `stats`, dengan `stats.cached` dinormalisasi menjadi OpenClaw `cacheRead`. ### Z.AI (GLM) -- Provider: `zai` -- Auth: `ZAI_API_KEY` +- Penyedia: `zai` +- Autentikasi: `ZAI_API_KEY` - Contoh model: `zai/glm-5.1` - CLI: `openclaw onboard --auth-choice zai-api-key` - - Alias: `z.ai/*` dan `z-ai/*` dinormalkan menjadi `zai/*` + - Alias: `z.ai/*` dan `z-ai/*` dinormalisasi menjadi `zai/*` - `zai-api-key` mendeteksi otomatis endpoint Z.AI yang cocok; `zai-coding-global`, `zai-coding-cn`, `zai-global`, dan `zai-cn` memaksa permukaan tertentu ### Vercel AI Gateway -- Provider: `vercel-ai-gateway` -- Auth: `AI_GATEWAY_API_KEY` +- Penyedia: `vercel-ai-gateway` +- Autentikasi: `AI_GATEWAY_API_KEY` - Contoh model: `vercel-ai-gateway/anthropic/claude-opus-4.6` - CLI: `openclaw onboard --auth-choice ai-gateway-api-key` ### Kilo Gateway -- Provider: `kilocode` -- Auth: `KILOCODE_API_KEY` +- Penyedia: `kilocode` +- Autentikasi: `KILOCODE_API_KEY` - Contoh model: `kilocode/kilo/auto` - CLI: `openclaw onboard --auth-choice kilocode-api-key` - Base URL: `https://api.kilo.ai/api/gateway/` -- Katalog fallback statis menyertakan `kilocode/kilo/auto`; discovery live +- Katalog fallback statis dikirim dengan `kilocode/kilo/auto`; penemuan live `https://api.kilo.ai/api/gateway/models` dapat memperluas katalog runtime lebih lanjut. -- Rute upstream yang tepat di balik `kilocode/kilo/auto` dimiliki oleh Kilo Gateway, - bukan di-hardcode di OpenClaw. +- Routing upstream yang tepat di balik `kilocode/kilo/auto` dimiliki oleh Kilo Gateway, + tidak di-hardcode di OpenClaw. Lihat [/providers/kilocode](/id/providers/kilocode) untuk detail penyiapan. -### Plugin provider bawaan lainnya +### Plugin penyedia bawaan lainnya - OpenRouter: `openrouter` (`OPENROUTER_API_KEY`) - Contoh model: `openrouter/auto` -- OpenClaw menerapkan header atribusi aplikasi terdokumentasi milik OpenRouter hanya ketika +- OpenClaw menerapkan header atribusi aplikasi yang didokumentasikan OpenRouter hanya saat 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 di jalur gaya proxy yang kompatibel dengan OpenAI, sehingga +- 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 + validasi replay Gemini native dan penulisan ulang bootstrap tetap dinonaktifkan - 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 proxy-reasoning-tidak-didukung lainnya 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` +- Autentikasi: `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 provider bawaan menjaga referensi chat - tetap hanya teks sampai konfigurasi provider tersebut dimaterialisasi +- Onboarding MiniMax/penyiapan API key menulis definisi model M2.7 eksplisit dengan + `input: ["text", "image"]`; katalog penyedia bawaan mempertahankan referensi chat + hanya teks sampai konfigurasi penyedia tersebut dimaterialisasi - Moonshot: `moonshot` (`MOONSHOT_API_KEY`) - Contoh model: `moonshot/kimi-k2.5` - Kimi Coding: `kimi` (`KIMI_API_KEY` atau `KIMICODE_API_KEY`) @@ -459,10 +415,10 @@ 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 bawaan native menggunakan jalur xAI Responses + - Permintaan xAI native bawaan 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` defaultnya aktif; setel + - `tool_stream` aktif secara default; setel `agents.defaults.models["xai/"].params.tool_stream` ke `false` untuk menonaktifkannya - Mistral: `mistral` (`MISTRAL_API_KEY`) @@ -471,27 +427,27 @@ Lihat [/providers/kilocode](/id/providers/kilocode) untuk detail penyiapan. - Groq: `groq` (`GROQ_API_KEY`) - Cerebras: `cerebras` (`CEREBRAS_API_KEY`) - Model GLM di Cerebras menggunakan id `zai-glm-4.7` dan `zai-glm-4.6`. - - Base URL yang kompatibel dengan OpenAI: `https://api.cerebras.ai/v1`. + - 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). -## Provider melalui `models.providers` (kustom/base URL) +## Penyedia melalui `models.providers` (kustom/base URL) -Gunakan `models.providers` (atau `models.json`) untuk menambahkan provider **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 provider bawaan di bawah ini sudah memublikasikan katalog default. -Gunakan entri `models.providers.` eksplisit hanya ketika Anda ingin menimpa +Banyak Plugin penyedia bawaan di bawah ini sudah memublikasikan katalog default. +Gunakan entri `models.providers.` eksplisit hanya saat Anda ingin mengganti base URL, header, atau daftar model default. ### Moonshot AI (Kimi) -Moonshot dikirim sebagai plugin provider bawaan. Gunakan provider bawaan secara default, -dan tambahkan entri `models.providers.moonshot` eksplisit hanya ketika Anda -perlu menimpa base URL atau metadata model: +Moonshot dikirim sebagai Plugin penyedia bawaan. Gunakan penyedia bawaan secara +default, dan tambahkan entri `models.providers.moonshot` eksplisit hanya saat Anda +perlu mengganti base URL atau metadata model: -- Provider: `moonshot` -- Auth: `MOONSHOT_API_KEY` +- Penyedia: `moonshot` +- Autentikasi: `MOONSHOT_API_KEY` - Contoh model: `moonshot/kimi-k2.5` - CLI: `openclaw onboard --auth-choice moonshot-api-key` atau `openclaw onboard --auth-choice moonshot-api-key-cn` @@ -529,8 +485,8 @@ ID model Kimi K2: Kimi Coding menggunakan endpoint Moonshot AI yang kompatibel dengan Anthropic: -- Provider: `kimi` -- Auth: `KIMI_API_KEY` +- Penyedia: `kimi` +- Autentikasi: `KIMI_API_KEY` - Contoh model: `kimi/kimi-code` ```json5 @@ -546,10 +502,10 @@ Kimi Coding menggunakan endpoint Moonshot AI yang kompatibel dengan Anthropic: ### Volcano Engine (Doubao) -Volcano Engine (火山引擎) menyediakan akses ke Doubao dan model lain di China. +Volcano Engine (火山引擎) menyediakan akses ke Doubao dan model lainnya di Tiongkok. -- Provider: `volcengine` (coding: `volcengine-plan`) -- Auth: `VOLCANO_ENGINE_API_KEY` +- Penyedia: `volcengine` (coding: `volcengine-plan`) +- Autentikasi: `VOLCANO_ENGINE_API_KEY` - Contoh model: `volcengine-plan/ark-code-latest` - CLI: `openclaw onboard --auth-choice volcengine-api-key` @@ -561,13 +517,13 @@ Volcano Engine (火山引擎) menyediakan akses ke Doubao dan model lain di Chin } ``` -Onboarding default ke permukaan coding, tetapi katalog umum `volcengine/*` +Onboarding secara default menggunakan permukaan coding, tetapi katalog umum `volcengine/*` juga didaftarkan pada saat yang sama. -Di pemilih model onboarding/konfigurasi, pilihan autentikasi Volcengine lebih mengutamakan baris -`volcengine/*` dan `volcengine-plan/*`. Jika model tersebut belum dimuat, -OpenClaw fallback ke katalog yang tidak difilter alih-alih menampilkan pemilih -bercakupan provider yang kosong. +Dalam pemilih onboarding/konfigurasi model, pilihan autentikasi Volcengine lebih mengutamakan baris +`volcengine/*` dan `volcengine-plan/*`. Jika model-model tersebut belum dimuat, +OpenClaw akan fallback ke katalog yang tidak difilter alih-alih menampilkan pemilih +bercakupan penyedia yang kosong. Model yang tersedia: @@ -589,8 +545,8 @@ Model coding (`volcengine-plan`): BytePlus ARK menyediakan akses ke model yang sama seperti Volcano Engine untuk pengguna internasional. -- Provider: `byteplus` (coding: `byteplus-plan`) -- Auth: `BYTEPLUS_API_KEY` +- Penyedia: `byteplus` (coding: `byteplus-plan`) +- Autentikasi: `BYTEPLUS_API_KEY` - Contoh model: `byteplus-plan/ark-code-latest` - CLI: `openclaw onboard --auth-choice byteplus-api-key` @@ -602,13 +558,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/*` juga didaftarkan pada saat yang sama. -Di pemilih model onboarding/konfigurasi, pilihan autentikasi BytePlus lebih mengutamakan baris -`byteplus/*` dan `byteplus-plan/*`. Jika model tersebut belum dimuat, -OpenClaw fallback ke katalog yang tidak difilter alih-alih menampilkan pemilih -bercakupan provider yang kosong. +Dalam pemilih onboarding/konfigurasi model, pilihan autentikasi BytePlus lebih mengutamakan baris +`byteplus/*` dan `byteplus-plan/*`. Jika model-model tersebut belum dimuat, +OpenClaw akan fallback ke katalog yang tidak difilter alih-alih menampilkan pemilih +bercakupan penyedia yang kosong. Model yang tersedia: @@ -626,10 +582,10 @@ Model coding (`byteplus-plan`): ### Synthetic -Synthetic menyediakan model yang kompatibel dengan Anthropic di balik provider `synthetic`: +Synthetic menyediakan model yang kompatibel dengan Anthropic di balik penyedia `synthetic`: -- Provider: `synthetic` -- Auth: `SYNTHETIC_API_KEY` +- Penyedia: `synthetic` +- Autentikasi: `SYNTHETIC_API_KEY` - Contoh model: `synthetic/hf:MiniMaxAI/MiniMax-M2.5` - CLI: `openclaw onboard --auth-choice synthetic-api-key` @@ -660,33 +616,55 @@ MiniMax dikonfigurasi melalui `models.providers` karena menggunakan endpoint kus - OAuth MiniMax (CN): `--auth-choice minimax-cn-oauth` - API key MiniMax (Global): `--auth-choice minimax-global-api` - API key MiniMax (CN): `--auth-choice minimax-cn-api` -- Auth: `MINIMAX_API_KEY` untuk `minimax`; `MINIMAX_OAUTH_TOKEN` atau +- Autentikasi: `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 cuplikan konfigurasi. Pada jalur streaming MiniMax yang kompatibel dengan Anthropic, OpenClaw menonaktifkan thinking secara default -kecuali Anda secara eksplisit mengaturnya, dan `/fast on` menulis ulang +kecuali Anda menetapkannya secara eksplisit, dan `/fast on` menulis ulang `MiniMax-M2.7` menjadi `MiniMax-M2.7-highspeed`. -Pembagian capability yang dimiliki plugin: +Pembagian capability yang dimiliki 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 autentikasi MiniMax -- Pencarian web tetap pada id provider `minimax` +- Pemahaman gambar adalah `MiniMax-VL-01` yang dimiliki Plugin pada kedua jalur autentikasi MiniMax +- Pencarian web tetap pada id penyedia `minimax` + +### LM Studio + +LM Studio dikirim sebagai Plugin penyedia bawaan yang menggunakan API native: + +- Penyedia: `lmstudio` +- Autentikasi: `LM_API_TOKEN` +- Base URL inferensi default: `http://localhost:1234/v1` + +Lalu tetapkan model (ganti dengan salah satu ID yang dikembalikan oleh `http://localhost:1234/api/v1/models`): + +```json5 +{ + agents: { + defaults: { model: { primary: "lmstudio/openai/gpt-oss-20b" } }, + }, +} +``` + +OpenClaw menggunakan `/api/v1/models` dan `/api/v1/models/load` native milik LM Studio +untuk penemuan + auto-load, dengan `/v1/chat/completions` untuk inferensi secara default. +Lihat [/providers/lmstudio](/id/providers/lmstudio) untuk penyiapan dan pemecahan masalah. ### Ollama -Ollama dikirim sebagai plugin provider bawaan dan menggunakan API native Ollama: +Ollama dikirim sebagai Plugin penyedia bawaan dan menggunakan API native Ollama: -- Provider: `ollama` -- Auth: Tidak diperlukan (server lokal) +- Penyedia: `ollama` +- Autentikasi: Tidak diperlukan (server lokal) - Contoh model: `ollama/llama3.3` - Instalasi: [https://ollama.com/download](https://ollama.com/download) ```bash -# Instal Ollama, lalu pull sebuah model: +# Instal Ollama, lalu tarik sebuah model: ollama pull llama3.3 ``` @@ -699,26 +677,25 @@ ollama pull llama3.3 ``` Ollama dideteksi secara lokal di `http://127.0.0.1:11434` saat Anda memilih ikut serta dengan -`OLLAMA_API_KEY`, dan plugin provider bawaan menambahkan Ollama langsung ke +`OLLAMA_API_KEY`, dan Plugin penyedia bawaan 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 provider bawaan untuk server -yang kompatibel dengan OpenAI lokal/self-hosted: +vLLM dikirim sebagai Plugin penyedia bawaan untuk server lokal/self-hosted yang kompatibel dengan OpenAI: -- Provider: `vllm` -- Auth: Opsional (bergantung pada server Anda) +- Penyedia: `vllm` +- Autentikasi: Opsional (tergantung server Anda) - Base URL default: `http://127.0.0.1:8000/v1` -Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun berfungsi jika server Anda tidak mewajibkan auth): +Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun berfungsi jika server Anda tidak menegakkan autentikasi): ```bash export VLLM_API_KEY="vllm-local" ``` -Lalu setel sebuah model (ganti dengan salah satu ID yang dikembalikan oleh `/v1/models`): +Lalu tetapkan model (ganti dengan salah satu ID yang dikembalikan oleh `/v1/models`): ```json5 { @@ -732,21 +709,21 @@ Lihat [/providers/vllm](/id/providers/vllm) untuk detail. ### SGLang -SGLang dikirim sebagai plugin provider bawaan untuk server -yang kompatibel dengan OpenAI self-hosted berkecepatan tinggi: +SGLang dikirim sebagai Plugin penyedia bawaan untuk server self-hosted cepat +yang kompatibel dengan OpenAI: -- Provider: `sglang` -- Auth: Opsional (bergantung pada server Anda) +- Penyedia: `sglang` +- Autentikasi: Opsional (tergantung server Anda) - Base URL default: `http://127.0.0.1:30000/v1` Untuk ikut serta dalam auto-discovery secara lokal (nilai apa pun berfungsi jika server Anda tidak -mewajibkan auth): +menegakkan autentikasi): ```bash export SGLANG_API_KEY="sglang-local" ``` -Lalu setel sebuah model (ganti dengan salah satu ID yang dikembalikan oleh `/v1/models`): +Lalu tetapkan model (ganti dengan salah satu ID yang dikembalikan oleh `/v1/models`): ```json5 { @@ -767,14 +744,14 @@ Contoh (kompatibel dengan OpenAI): agents: { defaults: { model: { primary: "lmstudio/my-local-model" }, - models: { "lmstudio/my-local-model": { alias: "Lokal" } }, + models: { "lmstudio/my-local-model": { alias: "Local" } }, }, }, models: { providers: { lmstudio: { baseUrl: "http://localhost:1234/v1", - apiKey: "LMSTUDIO_KEY", + apiKey: "${LM_API_TOKEN}", api: "openai-completions", models: [ { @@ -795,21 +772,20 @@ Contoh (kompatibel dengan OpenAI): Catatan: -- Untuk provider kustom, `reasoning`, `input`, `cost`, `contextWindow`, dan `maxTokens` bersifat opsional. - Jika dihilangkan, OpenClaw default ke: +- Untuk penyedia kustom, `reasoning`, `input`, `cost`, `contextWindow`, dan `maxTokens` bersifat opsional. + 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 provider 400 untuk peran `developer` yang tidak didukung. -- Rute gaya proxy yang kompatibel dengan OpenAI 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/tidak diisi, OpenClaw mempertahankan perilaku OpenAI default (yang meresolusikan ke `api.openai.com`). -- Demi keamanan, `compat.supportsDeveloperRole: true` yang eksplisit tetap dioverride pada endpoint `openai-completions` non-native. +- 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 untuk peran `developer` yang tidak didukung. +- Rute kompatibel OpenAI bergaya proxy juga melewati pembentukan permintaan khusus OpenAI native: + tidak ada `service_tier`, tidak ada `store` Responses, 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 OpenAI default (yang diselesaikan ke `api.openai.com`). +- Demi keamanan, `compat.supportsDeveloperRole: true` eksplisit tetap dioverride pada endpoint `openai-completions` non-native. ## Contoh CLI @@ -824,6 +800,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) — key konfigurasi model -- [Providers](/id/providers) — panduan penyiapan per provider +- [Model Failover](/id/concepts/model-failover) — rantai fallback dan perilaku retry +- [Configuration Reference](/id/gateway/configuration-reference#agent-defaults) — kunci konfigurasi model +- [Providers](/id/providers) — panduan penyiapan per penyedia diff --git a/docs/id/concepts/qa-e2e-automation.md b/docs/id/concepts/qa-e2e-automation.md index 985af8ef8..2967e97c1 100644 --- a/docs/id/concepts/qa-e2e-automation.md +++ b/docs/id/concepts/qa-e2e-automation.md @@ -3,28 +3,32 @@ read_when: - Memperluas qa-lab atau qa-channel - Menambahkan skenario QA yang didukung repo - Membangun otomatisasi QA dengan realisme lebih tinggi di sekitar dasbor Gateway -summary: Bentuk otomatisasi QA privat untuk qa-lab, qa-channel, skenario berseed, dan laporan protokol -title: Otomatisasi QA E2E +summary: Bentuk otomatisasi QA privat untuk qa-lab, qa-channel, skenario seeded, dan laporan protokol +title: Otomatisasi E2E QA x-i18n: - generated_at: "2026-04-12T23:28:10Z" + generated_at: "2026-04-13T08:50:46Z" model: gpt-5.4 provider: openai - source_hash: b9fe27dc049823d5e3eb7ae1eac6aad21ed9e917425611fb1dbcb28ab9210d5e + source_hash: a4a4f5c765163565c95c2a071f201775fd9d8d60cad4ff25d71e4710559c1570 source_path: concepts/qa-e2e-automation.md workflow: 15 --- -# Otomatisasi QA E2E +# Otomatisasi E2E QA -Stack QA privat ditujukan untuk menguji OpenClaw dengan cara yang lebih realistis dan menyerupai channel dibandingkan yang bisa dilakukan oleh satu unit test. +Stack QA privat dimaksudkan untuk menguji OpenClaw dengan cara yang lebih realistis, +berbentuk channel, dibandingkan yang bisa 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-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 dasar. +- `extensions/qa-channel`: channel pesan sintetis dengan permukaan DM, channel, thread, + reaction, edit, dan delete. +- `extensions/qa-lab`: UI debugger dan bus QA untuk mengamati transkrip, + menyuntikkan pesan masuk, dan mengekspor laporan Markdown. +- `qa/`: aset seed yang didukung repo untuk tugas kickoff dan skenario QA + dasar. -Alur operator QA saat ini berupa situs QA dua panel: +Alur operator QA saat ini adalah situs QA dua panel: - Kiri: dasbor Gateway (Control UI) dengan agen. - Kanan: QA Lab, menampilkan transkrip bergaya Slack dan rencana skenario. @@ -35,9 +39,13 @@ Jalankan dengan: pnpm qa:lab:up ``` -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 channel nyata, dan mencatat apa yang berhasil, gagal, atau tetap terblokir. +Perintah itu membangun situs QA, memulai lane Gateway berbasis Docker, dan mengekspos +halaman QA Lab tempat operator atau loop otomatisasi dapat memberi agen +misi QA, mengamati perilaku channel nyata, dan mencatat apa yang berhasil, gagal, atau +tetap terblokir. -Untuk iterasi UI QA Lab yang lebih cepat tanpa membangun ulang image Docker setiap kali, mulai stack dengan bundle QA Lab yang di-bind mount: +Untuk iterasi UI QA Lab yang lebih cepat tanpa membangun ulang image Docker setiap kali, +mulai stack dengan bundle QA Lab yang di-bind-mount: ```bash pnpm openclaw qa docker-build-image @@ -46,45 +54,66 @@ pnpm qa:lab:up:fast pnpm qa:lab:watch ``` -`qa:lab:up:fast` menjaga layanan Docker tetap berjalan pada image yang telah dibangun sebelumnya dan melakukan bind-mount `extensions/qa-lab/web/dist` ke dalam kontainer `qa-lab`. `qa:lab:watch` membangun ulang bundle tersebut saat ada perubahan, dan browser akan memuat ulang secara otomatis ketika hash aset QA Lab berubah. +`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 akan memuat ulang otomatis saat hash aset QA Lab berubah. -Untuk lane smoke Matrix dengan transport nyata, jalankan: +Untuk lane smoke Matrix transport-real, jalankan: ```bash pnpm openclaw qa matrix ``` -Lane tersebut menyediakan homeserver Tuwunel sekali pakai di Docker, mendaftarkan pengguna driver, SUT, dan observer sementara, membuat satu room privat, lalu menjalankan Plugin Matrix nyata di dalam child Gateway QA. Lane transport langsung menjaga config child tetap dibatasi pada transport yang sedang diuji, sehingga Matrix berjalan tanpa `qa-channel` di config child. +Lane itu menyediakan homeserver Tuwunel sekali pakai di Docker, mendaftarkan +pengguna driver, SUT, dan observer sementara, membuat satu room privat, lalu menjalankan +Plugin Matrix nyata di dalam child Gateway QA. Lane transport live menjaga config child tetap terbatas pada transport yang diuji, sehingga Matrix berjalan tanpa +`qa-channel` dalam config child. -Untuk lane smoke Telegram dengan transport nyata, jalankan: +Untuk lane smoke Telegram transport-real, jalankan: ```bash pnpm openclaw qa telegram ``` -Lane tersebut menargetkan satu grup Telegram privat nyata alih-alih menyediakan server sekali pakai. Lane ini memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, serta dua bot berbeda di grup privat yang sama. Bot SUT harus memiliki username Telegram, dan observasi bot-ke-bot bekerja paling baik ketika kedua bot mengaktifkan Bot-to-Bot Communication Mode di `@BotFather`. +Lane itu menargetkan satu grup Telegram privat nyata alih-alih menyediakan server sekali pakai. Lane ini memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, +`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan +`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, serta dua bot berbeda di grup +privat yang sama. Bot SUT harus memiliki username Telegram, dan +observasi bot-ke-bot bekerja paling baik ketika kedua bot mengaktifkan +Bot-to-Bot Communication Mode di `@BotFather`. -Lane transport langsung sekarang berbagi satu kontrak yang lebih kecil alih-alih masing-masing membuat bentuk daftar skenarionya sendiri: +Lane transport live kini berbagi satu kontrak yang lebih kecil alih-alih masing-masing +menciptakan bentuk daftar skenario sendiri: -`qa-channel` tetap menjadi suite perilaku produk sintetis yang luas dan bukan bagian dari matriks cakupan transport langsung. +`qa-channel` tetap menjadi suite luas untuk perilaku produk sintetis dan bukan bagian +dari matriks cakupan transport live. -| Lane | Canary | Penyaringan mention | Blok allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah help | -| -------- | ------ | ------------------- | -------------- | -------------------- | ---------------------- | -------------------- | -------------- | ---------------- | ------------- | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| Lane | Canary | Mention gating | Blokir allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaction | Perintah bantuan | +| -------- | ------ | -------------- | ---------------- | -------------------- | ---------------------- | -------------------- | -------------- | ------------------ | ---------------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | -Ini menjaga `qa-channel` sebagai suite perilaku produk yang luas, sementara Matrix, Telegram, dan transport langsung mendatang berbagi satu checklist kontrak transport yang eksplisit. +Ini menjaga `qa-channel` sebagai suite luas untuk perilaku produk, sementara Matrix, +Telegram, dan transport live mendatang berbagi satu checklist kontrak transport yang eksplisit. -Untuk lane VM Linux sekali pakai tanpa membawa Docker ke dalam jalur QA, jalankan: +Untuk lane VM Linux sekali pakai tanpa membawa Docker ke dalam alur QA, jalankan: ```bash pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline ``` -Ini akan mem-boot guest Multipass baru, menginstal dependensi, membangun OpenClaw di dalam guest, menjalankan `qa suite`, lalu menyalin laporan dan ringkasan QA normal kembali ke `.artifacts/qa-e2e/...` di host. +Ini akan mem-boot guest Multipass baru, menginstal dependensi, membangun OpenClaw +di dalam guest, menjalankan `qa suite`, lalu menyalin laporan QA normal dan +ringkasan kembali ke `.artifacts/qa-e2e/...` di host. Perintah ini menggunakan perilaku pemilihan skenario yang sama seperti `qa suite` di host. -Eksekusi suite di host dan Multipass menjalankan beberapa skenario terpilih secara paralel dengan worker Gateway yang terisolasi secara default, hingga 64 worker atau sebanyak jumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk eksekusi serial. -Eksekusi langsung meneruskan input auth QA yang didukung dan praktis untuk guest: kunci provider berbasis env, path config provider langsung QA, dan `CODEX_HOME` jika ada. Pertahankan `--output-dir` di bawah root repo agar guest dapat menulis kembali melalui workspace yang di-mount. +Eksekusi suite di host dan Multipass menjalankan beberapa skenario terpilih secara paralel +dengan worker Gateway yang terisolasi secara default, hingga 64 worker atau sejumlah +skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau +`--concurrency 1` untuk eksekusi serial. +Eksekusi live meneruskan input auth QA yang didukung dan praktis untuk +guest: key provider berbasis env, path config provider live QA, dan +`CODEX_HOME` bila ada. Pastikan `--output-dir` berada di bawah root repo agar guest +dapat menulis kembali melalui workspace yang di-mount. ## Seed yang didukung repo @@ -93,41 +122,49 @@ Aset seed berada di `qa/`: - `qa/scenarios/index.md` - `qa/scenarios/*.md` -Aset ini sengaja disimpan di git agar rencana QA terlihat oleh manusia maupun agen. +Ini sengaja disimpan di git agar rencana QA terlihat oleh manusia maupun +agen. -`qa-lab` harus tetap menjadi runner Markdown generik. Setiap file Markdown skenario adalah sumber kebenaran untuk satu eksekusi pengujian dan harus mendefinisikan: +`qa-lab` harus tetap menjadi runner markdown generik. Setiap file markdown skenario adalah +source of truth untuk satu eksekusi uji dan harus mendefinisikan: - metadata skenario -- referensi dokumen dan kode +- referensi docs dan kode - persyaratan Plugin opsional - patch config Gateway opsional - `qa-flow` yang dapat dieksekusi +Permukaan runtime yang dapat digunakan ulang dan mendasari `qa-flow` boleh tetap generik +dan lintas-cutting. Misalnya, skenario markdown dapat menggabungkan helper sisi transport +dengan helper sisi browser yang menggerakkan Control UI tersemat melalui seam +Gateway `browser.request` tanpa menambahkan runner khusus. + Daftar dasar harus tetap cukup luas untuk mencakup: - chat DM dan channel - perilaku thread - siklus hidup aksi pesan - callback Cron -- recall memori +- pemanggilan memori - pergantian model - handoff subagen -- pembacaan repo dan pembacaan dokumen +- membaca repo dan docs - satu tugas build kecil seperti Lobster Invaders -## Adaptor transport +## Adapter transport -`qa-lab` memiliki seam generik untuk skenario QA Markdown. -`qa-channel` adalah adaptor pertama pada seam tersebut, tetapi target desainnya lebih luas: -channel nyata atau sintetis di masa mendatang harus terhubung ke runner suite yang sama alih-alih menambahkan runner QA khusus transport. +`qa-lab` memiliki seam transport generik untuk skenario QA markdown. +`qa-channel` adalah adapter pertama pada seam itu, tetapi target desainnya lebih luas: +channel nyata atau sintetis di masa depan harus dapat dipasang ke runner suite yang sama +alih-alih menambahkan runner QA khusus transport. -Pada tingkat arsitektur, pembagiannya adalah: +Pada level arsitektur, pembagiannya adalah: -- `qa-lab` memiliki eksekusi skenario generik, konkurensi worker, penulisan artefak, dan pelaporan. -- adaptor transport memiliki config Gateway, kesiapan, observasi masuk dan keluar, aksi transport, dan status transport ternormalisasi. -- file skenario Markdown di bawah `qa/scenarios/` mendefinisikan eksekusi pengujian; `qa-lab` menyediakan permukaan runtime yang dapat digunakan kembali untuk mengeksekusinya. +- `qa-lab` memiliki eksekusi skenario generik, konkurensi worker, penulisan artifact, dan pelaporan. +- adapter transport memiliki config gateway, kesiapan, observasi inbound dan outbound, aksi transport, dan state transport yang dinormalisasi. +- file skenario markdown di bawah `qa/scenarios/` mendefinisikan eksekusi uji; `qa-lab` menyediakan permukaan runtime yang dapat digunakan ulang untuk mengeksekusinya. -Panduan adopsi untuk maintainer bagi adaptor channel baru tersedia di +Panduan adopsi untuk maintainer bagi adapter channel baru tersedia di [Testing](/id/help/testing#adding-a-channel-to-qa). ## Pelaporan @@ -140,7 +177,8 @@ Laporan tersebut harus menjawab: - Apa yang tetap terblokir - Skenario tindak lanjut apa yang layak ditambahkan -Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama di beberapa ref model langsung dan tulis laporan Markdown yang dinilai: +Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama di beberapa ref model live +dan tulis laporan Markdown hasil penilaian: ```bash pnpm openclaw qa character-eval \ @@ -159,24 +197,40 @@ pnpm openclaw qa character-eval \ --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 eksekusi, lalu meminta model judge dalam mode cepat dengan penalaran `xhigh` untuk memberi peringkat eksekusi berdasarkan kealamian, vibe, dan humor. -Gunakan `--blind-judge-models` saat membandingkan provider: prompt judge tetap menerima setiap transkrip dan status eksekusi, tetapi ref kandidat diganti dengan label netral seperti `candidate-01`; laporan memetakan kembali peringkat ke ref nyata setelah parsing. -Eksekusi kandidat secara default menggunakan thinking `high`, dengan `xhigh` untuk model OpenAI yang mendukungnya. Override kandidat tertentu secara inline dengan -`--model provider/model,thinking=`. `--thinking ` tetap menetapkan fallback global, dan bentuk lama `--model-thinking ` dipertahankan untuk kompatibilitas. -Ref kandidat OpenAI secara default menggunakan mode cepat agar pemrosesan prioritas digunakan jika provider mendukungnya. Tambahkan `,fast`, `,no-fast`, atau `,fast=false` secara inline ketika satu kandidat atau judge memerlukan override. Berikan `--fast` hanya jika Anda ingin memaksa mode cepat aktif untuk setiap model kandidat. Durasi kandidat dan judge dicatat dalam laporan untuk analisis benchmark, tetapi prompt judge secara eksplisit menyatakan agar tidak memberi peringkat berdasarkan kecepatan. -Eksekusi model kandidat dan judge keduanya secara default menggunakan konkurensi 16. Turunkan -`--concurrency` atau `--judge-concurrency` ketika batas provider atau tekanan Gateway lokal membuat eksekusi terlalu berisik. -Saat tidak ada kandidat `--model` yang diberikan, evaluasi karakter secara default menggunakan +Perintah ini menjalankan proses child Gateway QA lokal, bukan Docker. Skenario character eval +harus menetapkan persona melalui `SOUL.md`, lalu menjalankan giliran pengguna biasa +seperti chat, bantuan workspace, dan tugas file kecil. Model kandidat +tidak boleh diberi tahu bahwa model tersebut sedang dievaluasi. Perintah ini mempertahankan setiap +transkrip lengkap, mencatat statistik dasar eksekusi, lalu meminta model juri dalam mode fast dengan +penalaran `xhigh` untuk memberi peringkat eksekusi berdasarkan naturalitas, vibe, dan humor. +Gunakan `--blind-judge-models` saat membandingkan provider: prompt juri tetap menerima +setiap transkrip dan status eksekusi, tetapi ref kandidat diganti dengan label netral +seperti `candidate-01`; laporan memetakan kembali peringkat ke ref asli setelah +parsing. +Eksekusi kandidat secara default menggunakan thinking `high`, dengan `xhigh` untuk model OpenAI yang +mendukungnya. Override kandidat tertentu secara inline dengan +`--model provider/model,thinking=`. `--thinking ` tetap menetapkan +fallback global, dan bentuk lama `--model-thinking ` tetap dipertahankan untuk kompatibilitas. +Ref kandidat OpenAI secara default menggunakan mode fast sehingga pemrosesan prioritas digunakan ketika +provider mendukungnya. Tambahkan `,fast`, `,no-fast`, atau `,fast=false` secara inline ketika +satu kandidat atau juri memerlukan override. Berikan `--fast` hanya jika Anda ingin +memaksa mode fast aktif untuk setiap model kandidat. Durasi kandidat dan juri dicatat +dalam laporan untuk analisis benchmark, tetapi prompt juri secara eksplisit menyatakan +agar tidak memberi peringkat berdasarkan kecepatan. +Eksekusi model kandidat dan juri keduanya secara default menggunakan konkurensi 16. Turunkan +`--concurrency` atau `--judge-concurrency` ketika batas provider atau tekanan Gateway lokal +membuat suatu eksekusi terlalu bising. +Saat tidak ada kandidat `--model` yang diberikan, character eval 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, judge secara default menggunakan +Saat tidak ada `--judge-model` yang diberikan, juri secara default menggunakan `openai/gpt-5.4,thinking=xhigh,fast` dan `anthropic/claude-opus-4-6,thinking=high`. -## Dokumen terkait +## Docs terkait - [Testing](/id/help/testing) - [QA Channel](/id/channels/qa-channel) -- [Dashboard](/web/dashboard) +- [Dasbor](/web/dashboard) diff --git a/docs/id/gateway/local-models.md b/docs/id/gateway/local-models.md index 16a71103e..97415ea13 100644 --- a/docs/id/gateway/local-models.md +++ b/docs/id/gateway/local-models.md @@ -1,28 +1,28 @@ --- read_when: - - Anda ingin menyajikan model dari box GPU Anda sendiri - - Anda sedang menghubungkan LM Studio atau proxy yang kompatibel dengan OpenAI + - Anda ingin menyajikan model dari mesin GPU Anda sendiri + - Anda sedang menyiapkan LM Studio atau proxy yang kompatibel dengan OpenAI - Anda memerlukan panduan model lokal yang paling aman summary: Jalankan OpenClaw pada LLM lokal (LM Studio, vLLM, LiteLLM, endpoint OpenAI kustom) title: Model Lokal x-i18n: - generated_at: "2026-04-08T02:14:50Z" + generated_at: "2026-04-13T08:50:45Z" model: gpt-5.4 provider: openai - source_hash: d619d72b0e06914ebacb7e9f38b746caf1b9ce8908c9c6638c3acdddbaa025e8 + source_hash: 3ecb61b3e6e34d3666f9b688cd694d92c5fb211cf8c420fa876f7ccf5789154a source_path: gateway/local-models.md workflow: 15 --- # Model lokal -Lokal itu memungkinkan, tetapi OpenClaw mengharapkan konteks besar + pertahanan kuat terhadap injeksi prompt. Kartu kecil memotong konteks dan membocorkan safety. Targetkan tinggi: **≥2 Mac Studio yang dimaksimalkan atau rig GPU setara (~$30k+)**. Satu GPU **24 GB** hanya cocok untuk prompt yang lebih ringan dengan latensi lebih tinggi. Gunakan **varian model terbesar / ukuran penuh yang dapat Anda jalankan**; checkpoint yang dikuantisasi secara agresif atau “small” meningkatkan risiko injeksi prompt (lihat [Security](/id/gateway/security)). +Lokal bisa dilakukan, tetapi OpenClaw mengharapkan konteks besar + pertahanan yang kuat terhadap injeksi prompt. Kartu kecil memotong konteks dan membocorkan mekanisme keamanan. Targetkan tinggi: **≥2 Mac Studio dengan spesifikasi maksimum atau rig GPU setara (~$30k+)**. Satu GPU **24 GB** hanya cocok untuk prompt yang lebih ringan dengan latensi lebih tinggi. Gunakan **varian model terbesar / ukuran penuh yang bisa Anda jalankan**; checkpoint yang sangat dikuantisasi atau “small” meningkatkan risiko injeksi prompt (lihat [Security](/id/gateway/security)). -Jika Anda menginginkan penyiapan lokal dengan friksi paling rendah, mulai dengan [Ollama](/id/providers/ollama) dan `openclaw onboard`. Halaman ini adalah panduan yang bersifat opinatif untuk stack lokal kelas atas dan server lokal kustom yang kompatibel dengan OpenAI. +Jika Anda menginginkan setup lokal dengan hambatan paling rendah, mulai dengan [LM Studio](/id/providers/lmstudio) atau [Ollama](/id/providers/ollama) dan `openclaw onboard`. Halaman ini adalah panduan yang opiniatif untuk stack lokal kelas atas dan server lokal kustom yang kompatibel dengan OpenAI. -## Direkomendasikan: LM Studio + model lokal besar (Responses API) +## Rekomendasi: LM Studio + model lokal besar (Responses API) -Stack lokal terbaik saat ini. Muat model besar di LM Studio (misalnya build Qwen, DeepSeek, atau Llama ukuran penuh), aktifkan server lokal (default `http://127.0.0.1:1234`), dan gunakan Responses API agar reasoning tetap terpisah dari teks akhir. +Stack lokal terbaik saat ini. Muat model besar di LM Studio (misalnya, build Qwen, DeepSeek, atau Llama ukuran penuh), aktifkan server lokal (default `http://127.0.0.1:1234`), dan gunakan Responses API untuk menjaga reasoning tetap terpisah dari teks akhir. ```json5 { @@ -59,18 +59,18 @@ Stack lokal terbaik saat ini. Muat model besar di LM Studio (misalnya build Qwen } ``` -**Checklist penyiapan** +**Daftar periksa setup** - Instal LM Studio: [https://lmstudio.ai](https://lmstudio.ai) -- Di LM Studio, unduh **build model terbesar yang tersedia** (hindari varian “small”/yang sangat dikuantisasi), mulai server, pastikan `http://127.0.0.1:1234/v1/models` mencantumkannya. +- Di LM Studio, unduh **build model terbesar yang tersedia** (hindari varian “small”/yang sangat dikuantisasi), mulai server, pastikan `http://127.0.0.1:1234/v1/models` menampilkannya. - Ganti `my-local-model` dengan ID model sebenarnya yang ditampilkan di LM Studio. -- Biarkan model tetap dimuat; cold-load menambah latensi startup. +- Biarkan model tetap dimuat; cold-load menambah latensi saat startup. - Sesuaikan `contextWindow`/`maxTokens` jika build LM Studio Anda berbeda. - Untuk WhatsApp, tetap gunakan Responses API agar hanya teks akhir yang dikirim. -Tetap konfigurasikan model yang dihosting bahkan saat menjalankan model lokal; gunakan `models.mode: "merge"` agar fallback tetap tersedia. +Tetap konfigurasikan model yang di-host bahkan saat menjalankan lokal; gunakan `models.mode: "merge"` agar fallback tetap tersedia. -### Config hibrida: primary yang dihosting, fallback lokal +### Konfigurasi hybrid: hosted primary, fallback lokal ```json5 { @@ -111,14 +111,14 @@ Tetap konfigurasikan model yang dihosting bahkan saat menjalankan model lokal; g } ``` -### Lokal lebih dulu dengan jaring pengaman hosting +### Mengutamakan lokal dengan jaring pengaman hosted -Tukar urutan primary dan fallback; pertahankan blok provider yang sama dan `models.mode: "merge"` agar Anda dapat fallback ke Sonnet atau Opus saat box lokal sedang tidak aktif. +Tukar urutan primary dan fallback; pertahankan blok provider yang sama dan `models.mode: "merge"` agar Anda bisa fallback ke Sonnet atau Opus saat mesin lokal tidak tersedia. ### Hosting regional / perutean data -- Varian MiniMax/Kimi/GLM yang dihosting juga tersedia di OpenRouter dengan endpoint yang dipatok ke wilayah tertentu (misalnya dihosting di AS). Pilih varian regional di sana agar lalu lintas tetap berada di yurisdiksi pilihan Anda sambil tetap menggunakan `models.mode: "merge"` untuk fallback Anthropic/OpenAI. -- Hanya lokal tetap menjadi jalur privasi terkuat; perutean regional yang dihosting adalah jalan tengah saat Anda membutuhkan fitur penyedia tetapi tetap ingin mengendalikan aliran data. +- Varian MiniMax/Kimi/GLM yang di-host juga tersedia di OpenRouter dengan endpoint yang dikunci ke wilayah tertentu (misalnya, di-host di AS). Pilih varian regional di sana untuk menjaga lalu lintas tetap berada dalam yurisdiksi pilihan Anda sambil tetap menggunakan `models.mode: "merge"` untuk fallback Anthropic/OpenAI. +- Hanya-lokal tetap menjadi jalur privasi terkuat; perutean regional yang di-host adalah jalan tengah saat Anda membutuhkan fitur provider tetapi ingin mengontrol aliran data. ## Proxy lokal lain yang kompatibel dengan OpenAI @@ -150,42 +150,35 @@ vLLM, LiteLLM, OAI-proxy, atau gateway kustom dapat digunakan jika mereka mengek } ``` -Pertahankan `models.mode: "merge"` agar model yang dihosting tetap tersedia sebagai fallback. +Pertahankan `models.mode: "merge"` agar model hosted tetap tersedia sebagai fallback. -Catatan perilaku untuk backend `/v1` lokal/berbasis proxy: +Catatan perilaku untuk backend lokal/proksi `/v1`: -- OpenClaw memperlakukan ini sebagai rute kompatibel OpenAI bergaya proxy, bukan - endpoint OpenAI native +- OpenClaw memperlakukan ini sebagai rute gaya proksi yang kompatibel dengan OpenAI, bukan endpoint OpenAI native - pembentukan permintaan khusus OpenAI native tidak berlaku di sini: tidak ada - `service_tier`, tidak ada Responses `store`, tidak ada pembentukan payload kompatibilitas reasoning OpenAI, - dan tidak ada petunjuk cache prompt + `service_tier`, tidak ada `store` pada Responses, tidak ada pembentukan payload kompatibilitas reasoning OpenAI, dan tidak ada petunjuk prompt-cache - header atribusi OpenClaw tersembunyi (`originator`, `version`, `User-Agent`) - tidak disuntikkan pada URL proxy kustom ini + tidak disisipkan pada URL proksi kustom ini -Catatan kompatibilitas untuk backend kompatibel OpenAI yang lebih ketat: +Catatan kompatibilitas untuk backend yang kompatibel dengan OpenAI tetapi lebih ketat: -- Beberapa server hanya menerima `messages[].content` berbentuk string pada Chat Completions, bukan - array part konten terstruktur. Atur +- Beberapa server hanya menerima `messages[].content` berupa string pada Chat Completions, bukan array content-part terstruktur. Atur `models.providers..models[].compat.requiresStringContent: true` untuk endpoint tersebut. -- Beberapa backend lokal yang lebih kecil atau lebih ketat tidak stabil dengan bentuk prompt runtime agen - penuh dari OpenClaw, terutama saat skema alat disertakan. Jika - backend berfungsi untuk panggilan langsung `/v1/chat/completions` kecil tetapi gagal pada giliran agen OpenClaw - normal, coba +- Beberapa backend lokal yang lebih kecil atau lebih ketat tidak stabil dengan bentuk prompt runtime agen penuh milik OpenClaw, terutama saat schema tool disertakan. Jika backend + bekerja untuk panggilan `/v1/chat/completions` langsung yang kecil tetapi gagal pada giliran agen OpenClaw normal, coba `models.providers..models[].compat.supportsTools: false` terlebih dahulu. -- Jika backend masih gagal hanya pada eksekusi OpenClaw yang lebih besar, masalah yang tersisa - biasanya adalah kapasitas model/server upstream atau bug backend, bukan lapisan - transport OpenClaw. +- Jika backend masih gagal hanya pada eksekusi OpenClaw yang lebih besar, masalah yang tersisa biasanya adalah kapasitas model/server upstream atau bug backend, bukan lapisan transport OpenClaw. ## Pemecahan masalah -- Gateway dapat menjangkau proxy? `curl http://127.0.0.1:1234/v1/models`. -- Model LM Studio ter-unload? Muat ulang; cold start adalah penyebab umum “menggantung”. +- Gateway bisa menjangkau proksi? `curl http://127.0.0.1:1234/v1/models`. +- Model LM Studio tidak dimuat? Muat ulang; cold start adalah penyebab umum “macet”. - Error konteks? Turunkan `contextWindow` atau naikkan batas server Anda. - Server yang kompatibel dengan OpenAI mengembalikan `messages[].content ... expected a string`? Tambahkan `compat.requiresStringContent: true` pada entri model tersebut. -- Panggilan langsung `/v1/chat/completions` kecil berhasil, tetapi `openclaw infer model run` - gagal pada Gemma atau model lokal lain? Nonaktifkan skema alat terlebih dahulu dengan +- Panggilan `/v1/chat/completions` langsung yang kecil berhasil, tetapi `openclaw infer model run` + gagal pada Gemma atau model lokal lain? Nonaktifkan schema tool terlebih dahulu dengan `compat.supportsTools: false`, lalu uji lagi. Jika server masih crash hanya - pada prompt OpenClaw yang lebih besar, anggap ini sebagai keterbatasan server/model upstream. -- Safety: model lokal melewati filter sisi penyedia; batasi agen secara sempit dan biarkan compaction aktif untuk membatasi blast radius injeksi prompt. + pada prompt OpenClaw yang lebih besar, anggap itu sebagai keterbatasan server/model upstream. +- Keamanan: model lokal melewati filter sisi provider; jaga agar agen tetap sempit dan Compaction tetap aktif untuk membatasi dampak injeksi prompt. diff --git a/docs/id/help/testing.md b/docs/id/help/testing.md index 697fa410c..89172ffe9 100644 --- a/docs/id/help/testing.md +++ b/docs/id/help/testing.md @@ -2,14 +2,14 @@ read_when: - Menjalankan pengujian secara lokal atau di CI - Menambahkan regresi untuk bug model/provider - - Men-debug perilaku gateway + agen -summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan cakupan setiap pengujian' + - Men-debug perilaku Gateway + agen +summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan apa yang dicakup oleh setiap pengujian' title: Pengujian x-i18n: - generated_at: "2026-04-12T23:28:41Z" + generated_at: "2026-04-13T08:50:45Z" model: gpt-5.4 provider: openai - source_hash: a66ea672c386094ab4a8035a082c8a85d508a14301ad44b628d2a10d9cec3a52 + source_hash: 3db91b4bc36f626cd014958ec66b08b9cecd9faaa20a5746cd3a49ad4b0b1c38 source_path: help/testing.md workflow: 15 --- @@ -18,75 +18,151 @@ x-i18n: OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sejumlah kecil runner Docker. -Dokumen ini adalah panduan “bagaimana kami menguji”: +Dokumen ini adalah panduan “cara kami melakukan pengujian”: -- Apa yang dicakup oleh setiap suite (dan apa yang dengan sengaja _tidak_ dicakup) +- Apa yang dicakup oleh setiap suite (dan apa yang memang _tidak_ dicakup) - Perintah mana yang dijalankan untuk alur kerja umum (lokal, pra-push, debugging) -- Bagaimana pengujian live menemukan kredensial dan memilih model/provider +- Bagaimana 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` -- Eksekusi suite penuh lokal yang lebih cepat pada mesin yang lapang: `pnpm test:max` +- Menjalankan suite penuh lokal yang lebih cepat pada mesin dengan sumber daya besar: `pnpm test:max` - Loop watch Vitest langsung: `pnpm test:watch` -- Penargetan berkas langsung kini juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- Utamakan eksekusi tertarget terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. +- Penargetan file langsung sekarang juga merutekan path extension/channel: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` +- Utamakan run yang ditargetkan terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. - Situs QA berbasis Docker: `pnpm qa:lab:up` -- Jalur QA berbasis VM Linux: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` +- Lane QA berbasis Linux VM: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` -Saat Anda menyentuh pengujian atau ingin keyakinan tambahan: +Saat Anda menyentuh pengujian atau menginginkan keyakinan tambahan: - Gate cakupan: `pnpm test:coverage` - Suite E2E: `pnpm test:e2e` Saat men-debug provider/model nyata (memerlukan kredensial nyata): -- Suite live (probe model + alat/gambar gateway): `pnpm test:live` -- Targetkan satu berkas live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` +- Suite live (probe model + tool/image Gateway): `pnpm test:live` +- Targetkan satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` -Tips: saat Anda hanya membutuhkan satu kasus yang gagal, utamakan mempersempit pengujian live melalui env var allowlist yang dijelaskan di bawah. +Tip: saat Anda hanya membutuhkan satu kasus gagal, utamakan mempersempit live test melalui env var allowlist yang dijelaskan di bawah. ## Runner khusus QA -Perintah-perintah ini berada di samping suite pengujian utama saat Anda membutuhkan realisme qa-lab: +Perintah-perintah ini berada di samping suite pengujian utama saat Anda membutuhkan realisme QA-lab: - `pnpm openclaw qa suite` - - Menjalankan skenario QA berbasis repo langsung pada host. - - Menjalankan beberapa skenario terpilih secara paralel secara default dengan worker gateway yang terisolasi, hingga 64 worker atau jumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyetel jumlah worker, atau `--concurrency 1` untuk jalur serial yang lebih lama. + - Menjalankan skenario QA berbasis repo langsung di host. + - Secara default menjalankan beberapa skenario yang dipilih secara paralel dengan worker Gateway terisolasi, hingga 64 worker atau sebanyak jumlah skenario yang dipilih. Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, atau `--concurrency 1` untuk lane serial yang lebih lama. - `pnpm openclaw qa suite --runner multipass` - - Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai. - - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` pada host. + - Menjalankan suite QA yang sama di dalam Linux VM Multipass sekali pakai. + - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` di host. - Menggunakan kembali flag pemilihan provider/model yang sama seperti `qa suite`. - - Eksekusi live meneruskan input autentikasi QA yang didukung dan praktis untuk guest: + - Live run meneruskan input autentikasi QA yang didukung dan praktis untuk guest: kunci provider berbasis env, path konfigurasi provider live QA, dan `CODEX_HOME` bila ada. - - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis balik melalui workspace yang ter-mount. + - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis kembali melalui workspace yang di-mount. - Menulis laporan + ringkasan QA normal serta log Multipass di bawah `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - Memulai situs QA berbasis Docker untuk pekerjaan QA gaya operator. - `pnpm openclaw qa matrix` - - Menjalankan jalur QA live Matrix terhadap homeserver Tuwunel berbasis Docker sekali pakai. - - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) plus satu room privat, lalu memulai child gateway QA dengan Plugin Matrix nyata sebagai transport SUT. - - Secara default menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1`. Timpa dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` saat Anda perlu menguji image yang berbeda. - - Menulis laporan QA Matrix, ringkasan, dan artefak observed-events di bawah `.artifacts/qa-e2e/...`. + - Menjalankan lane live QA Matrix terhadap homeserver Tuwunel berbasis Docker sekali pakai. + - Menyediakan tiga pengguna Matrix sementara (`driver`, `sut`, `observer`) plus satu room privat, lalu memulai child Gateway QA dengan plugin Matrix nyata sebagai transport SUT. + - Secara default menggunakan image Tuwunel stabil yang dipin `ghcr.io/matrix-construct/tuwunel:v1.5.1`. Override dengan `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` bila Anda perlu menguji image lain. + - Matrix saat ini hanya mendukung `--credential-source env` karena lane ini menyediakan pengguna sekali pakai secara lokal. + - Menulis laporan, ringkasan, dan artefak observed-events QA Matrix di bawah `.artifacts/qa-e2e/...`. - `pnpm openclaw qa telegram` - - Menjalankan jalur QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. - - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa chat id Telegram numerik. + - Menjalankan lane live QA Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. + - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa ID chat Telegram numerik. + - Mendukung `--credential-source convex` untuk kredensial bersama yang dipool. Gunakan mode env sebagai default, atau setel `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk memilih lease yang dipool. - Memerlukan dua bot yang berbeda dalam grup privat yang sama, dengan bot SUT mengekspos username Telegram. - Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. - - Menulis laporan QA Telegram, ringkasan, dan artefak observed-messages di bawah `.artifacts/qa-e2e/...`. + - Menulis laporan, ringkasan, dan artefak observed-messages QA Telegram di bawah `.artifacts/qa-e2e/...`. -Jalur transport live berbagi satu kontrak standar agar transport baru tidak menyimpang: +Lane transport live berbagi satu kontrak standar agar transport baru tidak menyimpang: `qa-channel` tetap menjadi suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live. -| Jalur | Canary | Penyaringan mention | Blok allowlist | Balasan tingkat atas | Lanjutkan setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaction | Perintah help | -| -------- | ------ | ------------------- | -------------- | -------------------- | ------------------------- | -------------------- | -------------- | ------------------ | ------------- | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| Lane | Canary | Gating mention | Blok allowlist | Balasan tingkat atas | Lanjut setelah restart | Tindak lanjut thread | Isolasi thread | Observasi reaksi | Perintah help | +| -------- | ------ | -------------- | --------------- | -------------------- | ---------------------- | -------------------- | -------------- | ---------------- | ------------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | + +### Kredensial Telegram bersama melalui Convex (v1) + +Saat `--credential-source convex` (atau `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) diaktifkan untuk +`openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool berbasis Convex, mengirim Heartbeat +untuk lease tersebut selama lane berjalan, dan melepaskan lease saat shutdown. + +Scaffold proyek Convex referensi: + +- `qa/convex-credential-broker/` + +Env var yang diperlukan: + +- `OPENCLAW_QA_CONVEX_SITE_URL` (contohnya `https://your-deployment.convex.site`) +- Satu secret untuk peran yang dipilih: + - `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` untuk `maintainer` + - `OPENCLAW_QA_CONVEX_SECRET_CI` untuk `ci` +- Pemilihan peran kredensial: + - CLI: `--credential-role maintainer|ci` + - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default ke `maintainer`) + +Env var opsional: + +- `OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS` (default `1200000`) +- `OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (default `30000`) +- `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (default `90000`) +- `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (default `15000`) +- `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (default `/qa-credentials/v1`) +- `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (ID pelacakan opsional) +- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex loopback `http://` untuk pengembangan lokal saja. + +`OPENCLAW_QA_CONVEX_SITE_URL` seharusnya menggunakan `https://` dalam operasi normal. + +Perintah admin maintainer (tambah/hapus/daftar pool) memerlukan +`OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` secara khusus. + +Helper CLI untuk maintainer: + +```bash +pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json +pnpm openclaw qa credentials list --kind telegram +pnpm openclaw qa credentials remove --credential-id +``` + +Gunakan `--json` untuk output yang dapat dibaca mesin dalam skrip dan utilitas CI. + +Kontrak endpoint default (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): + +- `POST /acquire` + - Permintaan: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` + - Berhasil: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` + - Habis/dapat dicoba ulang: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` +- `POST /heartbeat` + - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` + - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) +- `POST /release` + - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken }` + - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) +- `POST /admin/add` (hanya secret maintainer) + - Permintaan: `{ kind, actorId, payload, note?, status? }` + - Berhasil: `{ status: "ok", credential }` +- `POST /admin/remove` (hanya secret maintainer) + - Permintaan: `{ credentialId, actorId }` + - Berhasil: `{ status: "ok", changed, credential }` + - Guard lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` +- `POST /admin/list` (hanya secret maintainer) + - Permintaan: `{ kind?, status?, includePayload?, limit? }` + - Berhasil: `{ status: "ok", credentials, count }` + +Bentuk payload untuk jenis Telegram: + +- `{ groupId: string, driverToken: string, sutToken: string }` +- `groupId` harus berupa string ID chat Telegram numerik. +- `admin/add` memvalidasi bentuk ini untuk `kind: "telegram"` dan menolak payload yang tidak valid. ### Menambahkan channel ke QA @@ -95,10 +171,10 @@ Menambahkan channel ke sistem QA markdown memerlukan tepat dua hal: 1. Adapter transport untuk channel tersebut. 2. Paket skenario yang menjalankan kontrak channel. -Jangan tambahkan runner QA khusus channel ketika runner bersama `qa-lab` dapat +Jangan menambahkan runner QA khusus channel ketika runner bersama `qa-lab` dapat menangani alurnya. -`qa-lab` memiliki mekanisme bersama: +`qa-lab` menangani mekanisme bersama: - startup dan teardown suite - konkurensi worker @@ -107,33 +183,33 @@ menangani alurnya. - eksekusi skenario - alias kompatibilitas untuk skenario `qa-channel` yang lebih lama -Adapter channel memiliki kontrak transport: +Adapter channel menangani kontrak transport: -- bagaimana gateway dikonfigurasi untuk transport tersebut +- bagaimana Gateway dikonfigurasi untuk transport tersebut - bagaimana kesiapan diperiksa -- bagaimana peristiwa masuk disuntikkan +- bagaimana event masuk diinjeksi - bagaimana pesan keluar diamati -- bagaimana transkrip dan status transport ternormalisasi diekspos +- bagaimana transkrip dan status transport yang dinormalisasi diekspos - bagaimana tindakan berbasis transport dijalankan - bagaimana reset atau pembersihan khusus transport ditangani -Batas adopsi minimum untuk channel baru adalah: +Ambang adopsi minimum untuk channel baru adalah: -1. Implementasikan adapter transport pada seam `qa-lab` bersama. -2. Daftarkan adapter di registri transport. +1. Implementasikan adapter transport pada seam bersama `qa-lab`. +2. Daftarkan adapter dalam registri transport. 3. Simpan mekanisme khusus transport di dalam adapter atau harness channel. 4. Tulis atau adaptasi skenario markdown di bawah `qa/scenarios/`. 5. Gunakan helper skenario generik untuk skenario baru. 6. Pertahankan alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja. -Aturan keputusannya ketat: +Aturan pengambilan keputusan bersifat ketat: - Jika perilaku dapat diekspresikan sekali di `qa-lab`, letakkan di `qa-lab`. -- Jika perilaku bergantung pada satu transport channel, simpan di adapter atau harness Plugin tersebut. -- Jika sebuah skenario memerlukan kemampuan baru yang dapat digunakan oleh lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. -- Jika suatu perilaku hanya bermakna untuk satu transport, pertahankan skenario tetap khusus transport dan nyatakan itu secara eksplisit dalam kontrak skenario. +- Jika perilaku bergantung pada satu transport channel, simpan di adapter tersebut atau harness plugin. +- Jika sebuah skenario memerlukan kapabilitas baru yang dapat digunakan lebih dari satu channel, tambahkan helper generik alih-alih cabang khusus channel di `suite.ts`. +- Jika suatu perilaku hanya bermakna untuk satu transport, pertahankan skenario tersebut khusus transport dan buat itu eksplisit dalam kontrak skenario. -Nama helper generik yang diutamakan untuk skenario baru adalah: +Nama helper generik yang disarankan untuk skenario baru adalah: - `waitForTransportReady` - `waitForChannelReady` @@ -157,146 +233,146 @@ Alias kompatibilitas tetap tersedia untuk skenario yang ada, termasuk: - `resetBus` Pekerjaan channel baru sebaiknya menggunakan nama helper generik. -Alias kompatibilitas ada untuk menghindari migrasi flag day, bukan sebagai model untuk +Alias kompatibilitas ada untuk menghindari migrasi besar sekaligus, bukan sebagai model untuk penulisan skenario baru. ## Suite pengujian (apa yang berjalan di mana) -Anggap suite sebagai “realisme yang meningkat” (dan peningkatan flaky/biaya): +Anggap suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang juga meningkat): ### Unit / integrasi (default) - Perintah: `pnpm test` -- Konfigurasi: sepuluh eksekusi shard berurutan (`vitest.full-*.config.ts`) di atas project Vitest terbatas yang sudah ada -- Berkas: 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` +- Konfigurasi: sepuluh run shard berurutan (`vitest.full-*.config.ts`) di atas project Vitest berskala yang sudah ada +- File: inventaris inti/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 (autentikasi gateway, routing, tooling, parsing, config) + - Pengujian integrasi in-process (autentikasi Gateway, routing, tooling, parsing, konfigurasi) - Regresi deterministik untuk bug yang diketahui - Ekspektasi: - Berjalan di CI - Tidak memerlukan kunci nyata - Harus cepat dan stabil - Catatan project: - - `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 besar. Ini memangkas puncak RSS pada mesin yang sedang terbebani dan mencegah pekerjaan auto-reply/extension membuat suite lain yang tidak terkait kelaparan sumber daya. - - `pnpm test --watch` tetap menggunakan graf project native root `vitest.config.ts`, karena loop watch multi-shard tidak praktis. - - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target berkas/direktori eksplisit melalui jalur terbatas terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` tidak perlu membayar biaya startup penuh root project. - - `pnpm test:changed` memperluas path git yang berubah ke jalur terbatas yang sama ketika diff hanya menyentuh berkas source/test yang dapat dirutekan; edit config/setup tetap fallback ke eksekusi ulang root-project yang luas. - - Pengujian unit ringan impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui jalur `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; berkas yang stateful/runtime-berat tetap berada di jalur yang ada. - - Sejumlah berkas source helper `plugin-sdk` dan `commands` yang dipilih juga memetakan eksekusi mode-changed ke pengujian saudara eksplisit di jalur ringan tersebut, sehingga edit helper tidak memicu eksekusi ulang seluruh suite berat 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 reply terberat tetap terpisah dari pengujian status/chunk/token yang murah. -- Catatan runner tersemat: + - `pnpm test` yang tidak ditargetkan sekarang menjalankan sebelas konfigurasi shard yang lebih kecil (`core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang besar. Ini mengurangi puncak RSS pada mesin yang sedang terbebani dan mencegah pekerjaan auto-reply/extension menghambat suite 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 berskala 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 berskala yang sama ketika diff hanya menyentuh file source/test yang dapat dirutekan; pengeditan config/setup tetap fallback ke rerun root-project yang luas. + - Pengujian unit ringan impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file stateful/berat di runtime tetap berada pada lane yang ada. + - File source helper `plugin-sdk` dan `commands` tertentu juga memetakan run mode changed ke pengujian sibling eksplisit dalam lane ringan tersebut, sehingga edit helper menghindari rerun suite berat penuh untuk direktori itu. + - `auto-reply` sekarang memiliki tiga bucket khusus: helper inti tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. Ini menjaga pekerjaan harness reply yang paling berat 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 batas routing/normalisasi murni. - - Juga pertahankan suite integrasi runner tersemat tetap sehat: + - Juga pertahankan suite integrasi embedded runner tetap sehat: `src/agents/pi-embedded-runner/compact.hooks.test.ts`, `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`, dan `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - Suite tersebut memverifikasi bahwa id terbatas dan perilaku Compaction tetap mengalir - melalui jalur nyata `run.ts` / `compact.ts`; pengujian helper saja bukan - pengganti yang memadai untuk jalur integrasi tersebut. + - Suite tersebut memverifikasi bahwa scoped id dan perilaku Compaction tetap mengalir + melalui path `run.ts` / `compact.ts` yang nyata; pengujian helper saja bukan + pengganti yang memadai untuk path integrasi tersebut. - Catatan pool: - - Konfigurasi dasar Vitest kini default ke `threads`. - - Konfigurasi Vitest bersama juga menetapkan `isolate: false` dan menggunakan runner non-isolated di seluruh root projects, config e2e, dan live. - - Jalur UI root mempertahankan setup dan optimizer `jsdom`, tetapi kini juga berjalan pada runner non-isolated bersama. + - Konfigurasi dasar Vitest sekarang default ke `threads`. + - 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` kini juga menambahkan `--no-maglev` untuk proses child Node Vitest secara default untuk mengurangi churn kompilasi V8 selama eksekusi lokal besar. Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkannya dengan perilaku V8 bawaan. + - Launcher bersama `scripts/run-vitest.mjs` sekarang juga menambahkan `--no-maglev` untuk proses child Node Vitest secara default guna mengurangi churn kompilasi V8 selama run lokal besar. Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` jika Anda perlu membandingkan dengan perilaku V8 bawaan. - Catatan iterasi lokal cepat: - - `pnpm test:changed` merutekan melalui jalur terbatas ketika path yang berubah dipetakan dengan bersih ke suite yang lebih kecil. + - `pnpm test:changed` merutekan melalui lane berskala ketika path yang berubah dipetakan dengan bersih ke suite yang lebih kecil. - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku routing yang sama, hanya dengan batas worker yang lebih tinggi. - - Auto-scaling worker lokal sekarang sengaja lebih konservatif dan juga mundur ketika rata-rata beban host sudah tinggi, sehingga beberapa eksekusi Vitest bersamaan secara default menimbulkan dampak yang lebih kecil. - - Konfigurasi dasar Vitest menandai project/berkas config sebagai `forceRerunTriggers` sehingga eksekusi ulang mode-changed tetap benar saat wiring pengujian berubah. - - Konfigurasi tersebut mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. + - Auto-scaling worker lokal sekarang sengaja konservatif dan juga mengurangi skala ketika load average host sudah tinggi, sehingga beberapa run Vitest bersamaan secara default menimbulkan dampak yang lebih kecil. + - Konfigurasi dasar Vitest menandai project/file konfigurasi sebagai `forceRerunTriggers` agar rerun mode changed tetap benar saat wiring pengujian berubah. + - Konfigurasi mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. - Catatan debug performa: - - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest beserta output rincian impor. - - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke berkas yang berubah sejak `origin/main`. -- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan dengan jalur native root-project untuk diff yang sudah di-commit itu dan mencetak wall time plus RSS maksimum macOS. -- `pnpm test:perf:changed:bench -- --worktree` membenchmark tree kotor saat ini dengan merutekan daftar berkas yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi root Vitest. - - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk overhead startup dan transformasi Vitest/Vite. - - `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk suite unit dengan paralelisme berkas dinonaktifkan. + - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest plus output rincian impor. + - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke file yang berubah sejak `origin/main`. +- `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan dengan path root-project native untuk diff yang sudah di-commit tersebut dan mencetak wall time plus max RSS macOS. +- `pnpm test:perf:changed:bench -- --worktree` membenchmark tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan konfigurasi root Vitest. + - `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) +### E2E (smoke Gateway) - Perintah: `pnpm test:e2e` - Konfigurasi: `vitest.e2e.config.ts` -- Berkas: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts` +- File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts` - Default runtime: - - Menggunakan Vitest `threads` dengan `isolate: false`, sesuai 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=` untuk memaksa jumlah worker (dibatasi hingga 16). - `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali output konsol verbose. - Cakupan: - - Perilaku end-to-end gateway multi-instance - - Surface WebSocket/HTTP, pairing Node, dan jaringan yang lebih berat + - Perilaku end-to-end Gateway multi-instance + - Surface WebSocket/HTTP, pairing node, dan jaringan yang lebih berat - Ekspektasi: - - Berjalan di CI (saat diaktifkan di pipeline) + - Berjalan di CI (saat diaktifkan dalam pipeline) - Tidak memerlukan kunci nyata - - Lebih banyak bagian bergerak dibanding pengujian unit (bisa lebih lambat) + - Lebih banyak bagian yang bergerak dibanding pengujian unit (bisa lebih lambat) ### E2E: smoke backend OpenShell - Perintah: `pnpm test:e2e:openshell` -- Berkas: `test/openshell-sandbox.e2e.test.ts` +- File: `test/openshell-sandbox.e2e.test.ts` - Cakupan: - - Memulai gateway OpenShell terisolasi pada host melalui Docker + - Memulai Gateway OpenShell terisolasi di host melalui Docker - Membuat sandbox dari Dockerfile lokal sementara - - Menjalankan backend OpenShell milik OpenClaw melalui `sandbox ssh-config` + SSH exec nyata + - Menjalankan backend OpenShell OpenClaw melalui `sandbox ssh-config` + SSH exec yang nyata - Memverifikasi perilaku filesystem remote-canonical melalui bridge fs sandbox - Ekspektasi: - - Hanya opt-in; bukan bagian dari eksekusi default `pnpm test:e2e` + - Hanya opt-in; bukan bagian dari run default `pnpm test:e2e` - Memerlukan CLI `openshell` lokal plus daemon Docker yang berfungsi - - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan gateway pengujian dan sandbox + - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan Gateway dan sandbox pengujian - Override yang berguna: - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manual - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI atau wrapper script non-default + - `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` - Konfigurasi: `vitest.live.config.ts` -- Berkas: `src/**/*.live.test.ts` -- Default: **diaktifkan** oleh `pnpm test:live` (menetapkan `OPENCLAW_LIVE_TEST=1`) +- File: `src/**/*.live.test.ts` +- Default: **aktif** oleh `pnpm test:live` (menyetel `OPENCLAW_LIVE_TEST=1`) - Cakupan: - - “Apakah provider/model ini benar-benar bekerja _hari ini_ dengan kredensial nyata?” - - Menangkap perubahan format provider, kekhasan pemanggilan alat, masalah autentikasi, dan perilaku rate limit + - “Apakah provider/model ini benar-benar berfungsi _hari ini_ dengan kredensial nyata?” + - Menangkap perubahan format provider, keanehan pemanggilan tool, masalah autentikasi, dan perilaku rate limit - Ekspektasi: - Secara desain tidak stabil untuk CI (jaringan nyata, kebijakan provider nyata, kuota, outage) - Menghabiskan biaya / menggunakan rate limit - - Utamakan menjalankan subset yang dipersempit, bukan “semuanya” -- Eksekusi live melakukan source `~/.profile` untuk mengambil API key yang hilang. -- Secara default, eksekusi live tetap mengisolasi `HOME` dan menyalin materi config/auth ke home pengujian sementara sehingga fixture unit tidak dapat mengubah `~/.openclaw` Anda yang nyata. -- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya saat Anda memang sengaja perlu pengujian live menggunakan direktori home nyata Anda. -- `pnpm test:live` kini default ke mode yang lebih senyap: tetap mempertahankan output progres `[live] ...`, tetapi menekan notifikasi `~/.profile` tambahan dan membisukan log bootstrap gateway/obrolan Bonjour. Setel `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali. -- Rotasi API key (khusus provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian akan mencoba ulang pada respons rate limit. + - Utamakan menjalankan subset yang dipersempit alih-alih “semuanya” +- Live run mengambil source dari `~/.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` Anda yang nyata. +- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya ketika Anda memang sengaja memerlukan live test menggunakan direktori home nyata Anda. +- `pnpm test:live` sekarang default ke mode yang lebih senyap: tetap menampilkan 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 (khusus provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian akan retry pada respons rate limit. - Output progres/Heartbeat: - - Suite live kini memancarkan baris progres ke stderr sehingga pemanggilan provider yang lama tampak tetap aktif bahkan saat penangkapan konsol Vitest sedang senyap. - - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway mengalir segera selama eksekusi live. - - Atur Heartbeat model langsung dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. - - Atur Heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - Suite live sekarang mengeluarkan baris progres ke stderr sehingga pemanggilan provider yang lama tetap terlihat aktif meskipun capture konsol Vitest dalam mode senyap. + - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/Gateway mengalir segera selama live run. + - Sesuaikan Heartbeat model langsung dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. + - Sesuaikan Heartbeat Gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. -## Suite mana yang sebaiknya saya jalankan? +## Suite mana yang harus saya jalankan? Gunakan tabel keputusan ini: -- 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 khusus provider / pemanggilan alat: jalankan `pnpm test:live` yang dipersempit +- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda banyak mengubah hal) +- Menyentuh jaringan Gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` +- Men-debug “bot saya mati” / kegagalan khusus provider / pemanggilan tool: jalankan `pnpm test:live` yang dipersempit -## Live: sweep kapabilitas Node Android +## Live: sapuan 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 menegaskan perilaku kontrak perintah. - Cakupan: - - Setup prasyarat/manual (suite tidak memasang/menjalankan/melakukan pairing aplikasi). - - Validasi `node.invoke` gateway per perintah untuk Node Android yang dipilih. -- Pra-setup yang diwajibkan: - - Aplikasi Android sudah terhubung + dipairing ke gateway. + - Setup manual/prakondisi (suite ini tidak menginstal/menjalankan/melakukan pairing aplikasi). + - Validasi `node.invoke` Gateway per perintah untuk node Android yang dipilih. +- Pra-setup yang diperlukan: + - Aplikasi Android sudah terhubung + dipasangkan ke Gateway. - Aplikasi tetap berada di foreground. - - Izin/persetujuan capture diberikan untuk kapabilitas yang Anda harapkan lolos. + - Izin/persetujuan capture diberikan untuk kapabilitas yang Anda harapkan berhasil. - Override target opsional: - `OPENCLAW_ANDROID_NODE_ID` atau `OPENCLAW_ANDROID_NODE_NAME`. - `OPENCLAW_ANDROID_GATEWAY_URL` / `OPENCLAW_ANDROID_GATEWAY_TOKEN` / `OPENCLAW_ANDROID_GATEWAY_PASSWORD`. @@ -304,50 +380,50 @@ Gunakan tabel keputusan ini: ## Live: smoke model (kunci profil) -Pengujian live dibagi menjadi dua lapisan agar kita dapat mengisolasi kegagalan: +Live test dibagi menjadi dua lapisan agar kita dapat mengisolasi kegagalan: -- “Model langsung” memberi tahu kita apakah provider/model dapat menjawab sama sekali dengan kunci yang diberikan. -- “Smoke gateway” memberi tahu kita apakah pipeline penuh gateway+agen bekerja untuk model tersebut (sesi, riwayat, alat, kebijakan sandbox, dll.). +- “Model langsung” memberi tahu kita bahwa provider/model setidaknya bisa menjawab dengan kunci yang diberikan. +- “Smoke Gateway” memberi tahu kita bahwa pipeline Gateway+agen penuh berfungsi untuk model tersebut (sesi, riwayat, tools, kebijakan sandbox, dan sebagainya). -### Lapisan 1: penyelesaian model langsung (tanpa gateway) +### Lapisan 1: Completion model langsung (tanpa Gateway) - Pengujian: `src/agents/models.profiles.live.test.ts` - Tujuan: - - Menginventarisasi model yang ditemukan + - Mengenumerasi model yang ditemukan - Menggunakan `getApiKeyForModel` untuk memilih model yang Anda miliki kredensialnya - - Menjalankan completion kecil per model (dan regresi tertarget bila diperlukan) + - Menjalankan completion kecil per model (dan regresi yang ditargetkan bila diperlukan) - Cara mengaktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) -- Setel `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) untuk benar-benar menjalankan suite ini; jika tidak, suite akan dilewati agar `pnpm test:live` tetap fokus pada smoke gateway +- Setel `OPENCLAW_LIVE_MODELS=modern` (atau `all`, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini akan skip agar `pnpm test:live` tetap fokus pada smoke Gateway - Cara memilih model: - `OPENCLAW_LIVE_MODELS=modern` untuk menjalankan allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4) - `OPENCLAW_LIVE_MODELS=all` adalah alias untuk allowlist modern - atau `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist dipisahkan koma) - - Sweep modern/all secara default menggunakan batas high-signal yang dikurasi; setel `OPENCLAW_LIVE_MAX_MODELS=0` untuk sweep modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Sapuan modern/all secara default menggunakan batas kurasi dengan sinyal tinggi; setel `OPENCLAW_LIVE_MAX_MODELS=0` untuk sapuan modern yang lengkap atau angka positif untuk batas yang lebih kecil. - Cara memilih provider: - `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist dipisahkan koma) -- Asal kunci: +- Dari mana kunci berasal: - Secara default: profile store dan fallback env - - Setel `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa hanya **profile store** + - Setel `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa **hanya** profile store - Alasan ini ada: - - Memisahkan “API provider rusak / kunci tidak valid” dari “pipeline agen gateway rusak” - - Menampung regresi kecil dan terisolasi (contoh: replay penalaran OpenAI Responses/Codex Responses + alur pemanggilan alat) + - Memisahkan “API provider rusak / kunci tidak valid” dari “pipeline agen Gateway rusak” + - Memuat regresi kecil yang terisolasi (contoh: alur replay reasoning OpenAI Responses/Codex Responses + tool-call) -### Lapisan 2: smoke gateway + agen dev (apa yang sebenarnya dilakukan `@openclaw`) +### Lapisan 2: smoke Gateway + agen dev (apa yang sebenarnya dilakukan "@openclaw") - Pengujian: `src/gateway/gateway-models.profiles.live.test.ts` - Tujuan: - - Menyalakan gateway in-process - - Membuat/menambal sesi `agent:dev:*` (override model per eksekusi) + - Menjalankan Gateway in-process + - Membuat/menambal sesi `agent:dev:*` (override model per run) - Mengiterasi model-dengan-kunci dan menegaskan: - - respons yang “bermakna” (tanpa alat) - - pemanggilan alat nyata berfungsi (probe read) - - probe alat tambahan opsional (probe exec+read) - - jalur regresi OpenAI (hanya-pemanggilan-alat → tindak lanjut) tetap berfungsi -- Detail probe (agar Anda dapat menjelaskan kegagalan dengan cepat): - - probe `read`: pengujian menulis berkas nonce di workspace lalu meminta agen untuk `read` berkas tersebut dan menggaungkan nonce kembali. - - probe `exec+read`: pengujian meminta agen untuk menulis nonce ke berkas sementara lewat `exec`, lalu membacanya kembali lewat `read`. - - probe gambar: pengujian melampirkan PNG yang dihasilkan (kucing + kode acak) dan mengharapkan model mengembalikan `cat `. + - respons yang “bermakna” (tanpa tools) + - pemanggilan tool nyata berfungsi (probe baca) + - probe tool ekstra opsional (probe exec+baca) + - path regresi OpenAI (hanya tool-call → tindak lanjut) tetap berfungsi +- Detail probe (agar Anda bisa menjelaskan kegagalan dengan cepat): + - probe `read`: pengujian menulis file nonce di workspace lalu meminta agen untuk `read` file itu dan menggemakan nonce tersebut kembali. + - probe `exec+read`: pengujian meminta agen untuk menulis nonce ke file sementara melalui `exec`, lalu membacanya kembali dengan `read`. + - probe image: pengujian melampirkan PNG yang dibuat (kucing + kode acak) dan mengharapkan model mengembalikan `cat `. - Referensi implementasi: `src/gateway/gateway-models.profiles.live.test.ts` dan `src/gateway/live-image-probe.ts`. - Cara mengaktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) @@ -355,46 +431,46 @@ Pengujian live dibagi menjadi dua lapisan agar kita dapat mengisolasi kegagalan: - 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 dipisahkan koma) untuk mempersempit - - Sweep gateway modern/all secara default menggunakan batas high-signal yang dikurasi; setel `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sweep modern yang menyeluruh atau angka positif untuk batas yang lebih kecil. + - Sapuan Gateway modern/all secara default menggunakan batas kurasi dengan sinyal tinggi; setel `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` untuk sapuan modern yang 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 dipisahkan koma) -- Probe alat + gambar selalu aktif dalam pengujian live ini: - - probe `read` + probe `exec+read` (stress alat) - - probe gambar berjalan saat model mengiklankan dukungan input gambar +- Probe tool + image selalu aktif dalam live test ini: + - probe `read` + probe `exec+read` (stress tool) + - probe image berjalan saat model mengiklankan dukungan input image - Alur (tingkat tinggi): - - Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) + - Pengujian membuat PNG kecil dengan “CAT” + kode acak (`src/gateway/live-image-probe.ts`) - Mengirimkannya melalui `agent` `attachments: [{ mimeType: "image/png", content: "" }]` - - Gateway mem-parsing lampiran ke `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) - - Agen tersemat meneruskan pesan pengguna multimodal ke model + - Gateway mem-parsing lampiran menjadi `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) + - Agen embedded meneruskan pesan pengguna multimodal ke model - Penegasan: balasan berisi `cat` + kodenya (toleransi OCR: kesalahan kecil diperbolehkan) -Tips: untuk melihat apa yang dapat Anda uji di mesin Anda (dan id `provider/model` yang tepat), jalankan: +Tip: untuk melihat apa yang dapat Anda uji di mesin Anda (dan ID `provider/model` yang tepat), jalankan: ```bash openclaw models list openclaw models list --json ``` -## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lain) +## Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lainnya) - Pengujian: `src/gateway/gateway-cli-backend.live.test.ts` -- Tujuan: memvalidasi pipeline Gateway + agen menggunakan backend CLI lokal, tanpa menyentuh config default Anda. -- Default smoke khusus backend berada bersama definisi `cli-backend.ts` milik extension pemiliknya. +- Tujuan: memvalidasi pipeline Gateway + agen menggunakan backend CLI lokal, tanpa menyentuh konfigurasi default Anda. +- Default smoke khusus backend berada bersama definisi `cli-backend.ts` milik extension yang memilikinya. - Aktifkan: - `pnpm test:live` (atau `OPENCLAW_LIVE_TEST=1` jika memanggil Vitest secara langsung) - `OPENCLAW_LIVE_CLI_BACKEND=1` - Default: - Provider/model default: `claude-cli/claude-sonnet-4-6` - - Perilaku command/args/gambar berasal dari metadata Plugin backend CLI pemiliknya. + - Perilaku command/args/image berasal dari metadata plugin backend CLI yang memilikinya. - Override (opsional): - `OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"` - `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"` - `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'` - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran gambar nyata (path disuntikkan ke prompt). - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path berkas gambar sebagai argumen CLI alih-alih injeksi prompt. - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol bagaimana argumen gambar diteruskan saat `IMAGE_ARG` disetel. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` untuk mengirim lampiran image nyata (path disuntikkan ke prompt). + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` untuk meneruskan path file image sebagai argumen CLI alih-alih injeksi prompt. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (atau `"list"`) untuk mengontrol cara argumen image diteruskan saat `IMAGE_ARG` disetel. - `OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1` untuk mengirim giliran kedua dan memvalidasi alur resume. - - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas sesi yang sama Claude Sonnet -> Opus default (setel ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target perpindahan). + - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` untuk menonaktifkan probe kontinuitas default Claude Sonnet -> Opus pada sesi yang sama (setel ke `1` untuk memaksanya aktif saat model yang dipilih mendukung target switch). Contoh: @@ -423,19 +499,19 @@ 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 menyelesaikan metadata smoke CLI dari extension pemiliknya, lalu memasang paket CLI Linux yang cocok (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) ke prefix writable yang di-cache di `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (default: `~/.cache/openclaw/docker-cli-tools`). -- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth subscription Claude Code portabel melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Runner ini pertama-tama membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env API key Anthropic. Jalur subscription ini menonaktifkan probe alat/gambar Claude MCP secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan extra-usage alih-alih batas paket subscription normal. -- Smoke CLI-backend live sekarang menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi gambar, lalu pemanggilan alat MCP `cron` yang diverifikasi melalui CLI gateway. -- Smoke default Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi sesi yang di-resume masih mengingat catatan sebelumnya. +- 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`). +- `pnpm test:docker:live-cli-backend:claude-subscription` memerlukan OAuth subscription Claude Code portabel melalui `~/.claude/.credentials.json` dengan `claudeAiOauth.subscriptionType` atau `CLAUDE_CODE_OAUTH_TOKEN` dari `claude setup-token`. Runner ini terlebih dahulu membuktikan `claude -p` langsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env API key Anthropic. Lane subscription ini menonaktifkan probe tool/image Claude MCP secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas paket subscription normal. +- Smoke CLI-backend live sekarang menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi image, lalu pemanggilan tool MCP `cron` yang diverifikasi melalui CLI Gateway. +- Smoke default Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi bahwa sesi yang di-resume masih mengingat catatan sebelumnya. -## Live: smoke bind ACP (`/acp spawn ... --bind here`) +## Live: ACP bind smoke (`/acp spawn ... --bind here`) - Pengujian: `src/gateway/gateway-acp-bind.live.test.ts` - Tujuan: memvalidasi alur bind percakapan ACP nyata dengan agen ACP live: - kirim `/acp spawn --bind here` - bind percakapan channel-pesan sintetis di tempat - kirim tindak lanjut normal pada percakapan yang sama - - verifikasi tindak lanjut masuk ke transkrip sesi ACP yang terikat + - verifikasi bahwa tindak lanjut masuk ke transkrip sesi ACP yang terikat - Aktifkan: - `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts` - `OPENCLAW_LIVE_ACP_BIND=1` @@ -451,8 +527,8 @@ Catatan: - `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini` - `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@'` - Catatan: - - Jalur ini menggunakan surface `chat.send` gateway dengan field originating-route sintetis khusus admin sehingga pengujian dapat melampirkan konteks channel pesan tanpa berpura-pura mengirimkan secara eksternal. - - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak disetel, pengujian menggunakan registri agen bawaan Plugin `acpx` tersemat untuk agen harness ACP yang dipilih. + - Lane ini menggunakan surface Gateway `chat.send` dengan field originating-route sintetis khusus admin sehingga pengujian dapat melampirkan konteks channel pesan tanpa berpura-pura mengirimkan secara eksternal. + - Saat `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` tidak disetel, pengujian menggunakan registri agen bawaan plugin `acpx` embedded untuk agen harness ACP yang dipilih. Contoh: @@ -481,27 +557,28 @@ Catatan Docker: - Runner Docker berada di `scripts/test-live-acp-bind-docker.sh`. - Secara default, runner ini menjalankan smoke bind ACP terhadap semua agen CLI live yang didukung secara berurutan: `claude`, `codex`, lalu `gemini`. - Gunakan `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude`, `OPENCLAW_LIVE_ACP_BIND_AGENTS=codex`, atau `OPENCLAW_LIVE_ACP_BIND_AGENTS=gemini` untuk mempersempit matriks. -- Runner ini melakukan source `~/.profile`, men-stage materi autentikasi CLI yang cocok ke dalam container, memasang `acpx` ke prefix npm writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) jika belum ada. -- Di dalam Docker, runner menetapkan `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` sehingga acpx mempertahankan env provider dari profile yang di-source tetap tersedia untuk CLI child harness. +- Runner ini mengambil source dari `~/.profile`, menyiapkan materi autentikasi CLI yang sesuai ke dalam container, memasang `acpx` ke prefix npm writable, lalu memasang CLI live yang diminta (`@anthropic-ai/claude-code`, `@openai/codex`, atau `@google/gemini-cli`) bila belum ada. +- Di dalam Docker, runner menetapkan `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` agar acpx mempertahankan env provider dari profile yang di-source tetap tersedia bagi CLI harness child. ## Live: smoke harness app-server Codex -- Tujuan: memvalidasi harness Codex milik Plugin melalui metode gateway - `agent` normal: - - muat Plugin `codex` bawaan - - pilih `OPENCLAW_AGENT_RUNTIME=codex` - - kirim giliran agen gateway pertama ke `codex/gpt-5.4` - - kirim giliran kedua ke sesi OpenClaw yang sama dan verifikasi thread app-server +- Tujuan: memvalidasi harness Codex milik plugin melalui metode `agent` Gateway + normal: + - memuat plugin `codex` bawaan + - memilih `OPENCLAW_AGENT_RUNTIME=codex` + - mengirim giliran agen Gateway pertama ke `codex/gpt-5.4` + - mengirim giliran kedua ke sesi OpenClaw yang sama dan memverifikasi thread app-server dapat di-resume - - jalankan `/codex status` dan `/codex models` melalui jalur perintah gateway yang sama + - menjalankan `/codex status` dan `/codex models` melalui path perintah Gateway + yang sama - Pengujian: `src/gateway/gateway-codex-harness.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_CODEX_HARNESS=1` - Model default: `codex/gpt-5.4` -- Probe gambar opsional: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` -- Probe MCP/alat opsional: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` -- Smoke ini menetapkan `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex yang rusak - tidak bisa lolos dengan diam-diam fallback ke PI. -- Auth: `OPENAI_API_KEY` dari shell/profile, plus opsional salinan +- Probe image opsional: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` +- Probe MCP/tool opsional: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` +- Smoke ini menetapkan `OPENCLAW_AGENT_HARNESS_FALLBACK=none` sehingga harness Codex + yang rusak tidak dapat lolos dengan diam-diam fallback ke PI. +- Auth: `OPENAI_API_KEY` dari shell/profile, ditambah salinan opsional `~/.codex/auth.json` dan `~/.codex/config.toml` Resep lokal: @@ -525,23 +602,25 @@ pnpm test:docker:live-codex-harness Catatan Docker: - Runner Docker berada di `scripts/test-live-codex-harness-docker.sh`. -- Runner ini melakukan source `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin berkas auth CLI Codex saat ada, memasang `@openai/codex` ke prefix npm writable yang di-mount, men-stage source tree, lalu hanya menjalankan pengujian live Codex-harness. -- Docker mengaktifkan probe gambar dan MCP/alat secara default. Setel +- Runner ini mengambil source dari `~/.profile` yang di-mount, meneruskan `OPENAI_API_KEY`, menyalin file auth CLI Codex bila ada, memasang `@openai/codex` ke prefix npm writable yang di-mount, menyiapkan source tree, lalu hanya menjalankan live test Codex-harness. +- Docker mengaktifkan probe image dan MCP/tool secara default. Setel `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0` atau - `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` saat Anda membutuhkan eksekusi debug yang lebih sempit. -- Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, sesuai dengan konfigurasi pengujian live sehingga fallback `openai-codex/*` atau PI tidak dapat menyembunyikan regresi harness Codex. + `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` saat Anda memerlukan run debug yang lebih sempit. +- Docker juga mengekspor `OPENCLAW_AGENT_HARNESS_FALLBACK=none`, sesuai dengan konfigurasi live + test sehingga fallback `openai-codex/*` atau PI tidak dapat menyembunyikan regresi + harness Codex. ### Resep live yang direkomendasikan -Allowlist yang sempit dan eksplisit adalah yang paling cepat dan paling tidak flaky: +Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling tidak flaky: -- Model tunggal, langsung (tanpa gateway): +- Model tunggal, langsung (tanpa Gateway): - `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts` -- Model tunggal, smoke gateway: +- Model tunggal, smoke Gateway: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -- Pemanggilan alat di beberapa provider: +- Pemanggilan tool di beberapa provider: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` - Fokus Google (API key Gemini + Antigravity): @@ -551,19 +630,19 @@ Allowlist yang sempit dan eksplisit adalah yang paling cepat dan paling tidak fl Catatan: - `google/...` menggunakan API Gemini (API key). -- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agen gaya Cloud Code Assist). -- `google-gemini-cli/...` menggunakan Gemini CLI lokal di mesin Anda (autentikasi terpisah + kekhasan tooling). -- API Gemini vs Gemini CLI: - - API: OpenClaw memanggil API Gemini hosted milik Google melalui HTTP (API key / auth profil); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”. - - CLI: OpenClaw melakukan shell out ke biner `gemini` lokal; ia memiliki autentikasinya sendiri dan dapat berperilaku berbeda (dukungan streaming/alat/perbedaan versi). +- `google-antigravity/...` menggunakan bridge OAuth Antigravity (endpoint agen bergaya Cloud Code Assist). +- `google-gemini-cli/...` menggunakan CLI Gemini lokal di mesin Anda (autentikasi terpisah + keanehan tooling). +- API Gemini vs CLI Gemini: + - API: OpenClaw memanggil API Gemini yang di-host oleh Google melalui HTTP (autentikasi API key / profil); inilah yang dimaksud kebanyakan pengguna dengan “Gemini”. + - CLI: OpenClaw mengeksekusi biner `gemini` lokal; ini memiliki autentikasi 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 berikut adalah model **yang direkomendasikan** untuk dicakup secara rutin pada mesin dev dengan kunci. +Tidak ada “daftar model CI” yang tetap (live bersifat opt-in), tetapi inilah model-model **yang direkomendasikan** untuk dicakup secara rutin pada mesin pengembang dengan kunci. -### Set smoke modern (pemanggilan alat + gambar) +### Set smoke modern (pemanggilan tool + image) -Ini adalah eksekusi “model umum” yang kami harapkan tetap berfungsi: +Ini adalah run “model umum” yang kami harapkan tetap berfungsi: - OpenAI (non-Codex): `openai/gpt-5.4` (opsional: `openai/gpt-5.4-mini`) - OpenAI Codex: `openai-codex/gpt-5.4` @@ -573,10 +652,10 @@ Ini adalah eksekusi “model umum” yang kami harapkan tetap berfungsi: - Z.AI (GLM): `zai/glm-4.7` - MiniMax: `minimax/MiniMax-M2.7` -Jalankan smoke gateway dengan alat + gambar: +Jalankan smoke Gateway dengan tools + image: `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -### Baseline: pemanggilan alat (Read + Exec opsional) +### Baseline: pemanggilan tool (Read + Exec opsional) Pilih setidaknya satu per keluarga provider: @@ -586,51 +665,51 @@ Pilih setidaknya satu per keluarga provider: - Z.AI (GLM): `zai/glm-4.7` - MiniMax: `minimax/MiniMax-M2.7` -Cakupan tambahan opsional (bagus untuk dimiliki): +Cakupan tambahan opsional (bagus jika ada): - xAI: `xai/grok-4` (atau yang terbaru tersedia) -- Mistral: `mistral/`… (pilih satu model berkemampuan “tools” yang Anda aktifkan) +- Mistral: `mistral/`… (pilih satu model yang mampu `tools` dan sudah Anda aktifkan) - Cerebras: `cerebras/`… (jika Anda memiliki akses) -- LM Studio: `lmstudio/`… (lokal; pemanggilan alat bergantung pada mode API) +- LM Studio: `lmstudio/`… (lokal; pemanggilan tool bergantung pada mode API) -### Vision: pengiriman gambar (lampiran → pesan multimodal) +### Vision: pengiriman image (lampiran → pesan multimodal) -Sertakan setidaknya satu model berkemampuan gambar dalam `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dll.) untuk menjalankan probe gambar. +Sertakan setidaknya satu model yang mendukung image di `OPENCLAW_LIVE_GATEWAY_MODELS` (varian Claude/Gemini/OpenAI yang mendukung vision, dll.) untuk menjalankan probe image. -### Aggregator / gateway alternatif +### Aggregator / Gateway alternatif -Jika Anda mengaktifkan kunci, kami juga mendukung pengujian melalui: +Jika Anda memiliki kunci yang diaktifkan, kami juga mendukung pengujian melalui: -- OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mendukung alat+gambar) +- OpenRouter: `openrouter/...` (ratusan model; gunakan `openclaw models scan` untuk menemukan kandidat yang mendukung tool+image) - OpenCode: `opencode/...` untuk Zen dan `opencode-go/...` untuk Go (auth melalui `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) -Lebih banyak provider yang dapat Anda sertakan dalam matriks live (jika Anda memiliki kredensial/config): +Lebih banyak provider yang dapat Anda sertakan dalam matriks live (jika Anda memiliki kredensial/konfigurasi): - Bawaan: `openai`, `openai-codex`, `anthropic`, `google`, `google-vertex`, `google-antigravity`, `google-gemini-cli`, `zai`, `openrouter`, `opencode`, `opencode-go`, `xai`, `groq`, `cerebras`, `mistral`, `github-copilot` -- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), plus proxy yang kompatibel dengan OpenAI/Anthropic apa pun (LM Studio, vLLM, LiteLLM, dll.) +- Melalui `models.providers` (endpoint kustom): `minimax` (cloud/API), plus proxy yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.) -Tips: jangan mencoba meng-hardcode “semua model” di dokumen. Daftar otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + kunci apa pun yang tersedia. +Tip: jangan mencoba meng-hardcode “semua model” dalam dokumen. Daftar otoritatif adalah apa pun yang dikembalikan `discoverModels(...)` di mesin Anda + kunci apa pun yang tersedia. -## Kredensial (jangan pernah commit) +## Kredensial (jangan pernah di-commit) -Pengujian live menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktisnya: +Live test menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktis: -- Jika CLI berfungsi, pengujian live seharusnya menemukan kunci yang sama. -- Jika pengujian live mengatakan “no creds”, debug dengan cara yang sama seperti Anda men-debug `openclaw models list` / pemilihan model. +- Jika CLI berfungsi, live test seharusnya menemukan kunci yang sama. +- Jika live test mengatakan “tidak ada kredensial”, debug dengan cara yang sama seperti Anda men-debug `openclaw models list` / pemilihan model. -- Profil auth per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud dengan “profile keys” dalam pengujian live) -- Config: `~/.openclaw/openclaw.json` (atau `OPENCLAW_CONFIG_PATH`) -- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live yang di-stage saat ada, tetapi bukan store utama profile-key) -- Eksekusi lokal live secara default menyalin config aktif, berkas `auth-profiles.json` per agen, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara; home live yang di-stage melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus sehingga probe tetap berada di luar workspace host nyata Anda. +- Profil auth per agen: `~/.openclaw/agents//agent/auth-profiles.json` (inilah yang dimaksud “kunci profil” dalam live test) +- Konfigurasi: `~/.openclaw/openclaw.json` (atau `OPENCLAW_CONFIG_PATH`) +- Direktori state lama: `~/.openclaw/credentials/` (disalin ke home live bertahap bila ada, tetapi bukan penyimpanan utama kunci profil) +- Live run lokal secara default menyalin konfigurasi aktif, file `auth-profiles.json` per agen, `credentials/` lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara; home live bertahap melewati `workspace/` dan `sandboxes/`, dan override path `agents.*.workspace` / `agentDir` dihapus agar probe tetap menjauh dari workspace host nyata Anda. -Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile`), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (mereka dapat me-mount `~/.profile` ke dalam container). +Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile` Anda), jalankan pengujian lokal setelah `source ~/.profile`, atau gunakan runner Docker di bawah (runner tersebut dapat me-mount `~/.profile` ke dalam container). ## Live Deepgram (transkripsi audio) - Pengujian: `src/media-understanding/providers/deepgram/audio.live.test.ts` - Aktifkan: `DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts` -## Live BytePlus coding plan +## Live rencana coding BytePlus - Pengujian: `src/agents/byteplus.live.test.ts` - Aktifkan: `BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts` @@ -641,21 +720,21 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile`), jala - Pengujian: `extensions/comfy/comfy.live.test.ts` - Aktifkan: `OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts` - Cakupan: - - Menjalankan jalur gambar, video, dan `music_generate` comfy bawaan + - Menjalankan path image, video, dan `music_generate` comfy bawaan - Melewati setiap kapabilitas kecuali `models.providers.comfy.` dikonfigurasi - - Berguna setelah mengubah pengiriman workflow comfy, polling, unduhan, atau pendaftaran Plugin + - Berguna setelah mengubah pengiriman workflow comfy, polling, unduhan, atau registrasi plugin -## Live pembuatan gambar +## Live pembuatan image - Pengujian: `src/image-generation/runtime.live.test.ts` - Perintah: `pnpm test:live src/image-generation/runtime.live.test.ts` - Harness: `pnpm test:live:media image` - Cakupan: - - Menginventarisasi setiap Plugin provider pembuatan gambar yang terdaftar + - Mengenumerasi setiap plugin provider pembuatan image yang terdaftar - Memuat env var provider yang hilang dari shell login Anda (`~/.profile`) sebelum probing - - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga kunci pengujian basi di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profil/model yang dapat digunakan - - Menjalankan varian pembuatan gambar bawaan melalui kapabilitas runtime bersama: + - Secara default menggunakan API key live/env lebih dulu daripada profil auth yang tersimpan, sehingga kunci pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider yang tidak memiliki auth/profil/model yang dapat digunakan + - Menjalankan varian pembuatan image bawaan melalui kapabilitas runtime bersama: - `google:flash-generate` - `google:pro-generate` - `google:pro-edit` @@ -668,7 +747,7 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile`), jala - `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 memaksa auth profile-store dan mengabaikan override yang hanya dari env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override env-only ## Live pembuatan musik @@ -676,23 +755,23 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile`), jala - Aktifkan: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts` - Harness: `pnpm test:live:media music` - Cakupan: - - Menjalankan jalur provider pembuatan musik bawaan bersama + - Menjalankan path provider pembuatan musik bawaan bersama - Saat ini mencakup Google dan MiniMax - Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing - - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga kunci pengujian basi di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profil/model yang dapat digunakan - - Menjalankan kedua mode runtime yang dideklarasikan saat tersedia: - - `generate` dengan input prompt saja - - `edit` saat provider mendeklarasikan `capabilities.edit.enabled` - - Cakupan jalur bersama saat ini: + - Secara default menggunakan API key live/env lebih dulu daripada profil auth yang tersimpan, sehingga kunci pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider yang tidak memiliki auth/profil/model yang dapat digunakan + - Menjalankan kedua mode runtime yang dideklarasikan bila tersedia: + - `generate` dengan input hanya prompt + - `edit` ketika provider mendeklarasikan `capabilities.edit.enabled` + - Cakupan lane bersama saat ini: - `google`: `generate`, `edit` - `minimax`: `generate` - - `comfy`: berkas live Comfy terpisah, bukan sweep bersama ini + - `comfy`: file live Comfy terpisah, bukan sapuan 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 memaksa auth profile-store dan mengabaikan override yang hanya dari env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override env-only ## Live pembuatan video @@ -700,38 +779,38 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile`), jala - Aktifkan: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts` - Harness: `pnpm test:live:media video` - Cakupan: - - Menjalankan jalur provider pembuatan video bawaan bersama + - Menjalankan path provider pembuatan video bawaan bersama - Memuat env var provider dari shell login Anda (`~/.profile`) sebelum probing - - Secara default menggunakan API key live/env sebelum profil auth yang tersimpan, sehingga kunci pengujian basi di `auth-profiles.json` tidak menutupi kredensial shell nyata - - Melewati provider tanpa auth/profil/model yang dapat digunakan - - Menjalankan kedua mode runtime yang dideklarasikan saat tersedia: - - `generate` dengan input prompt saja - - `imageToVideo` saat provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model terpilih menerima input gambar lokal berbasis buffer dalam sweep bersama - - `videoToVideo` saat provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model terpilih menerima input video lokal berbasis buffer dalam sweep bersama - - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sweep bersama: - - `vydra` karena `veo3` bawaan hanya teks dan `kling` bawaan memerlukan URL gambar jarak jauh + - Secara default menggunakan API key live/env lebih dulu daripada profil auth yang tersimpan, sehingga kunci pengujian usang di `auth-profiles.json` tidak menutupi kredensial shell nyata + - Melewati provider yang tidak memiliki auth/profil/model yang dapat digunakan + - Menjalankan kedua mode runtime yang dideklarasikan bila tersedia: + - `generate` dengan input hanya prompt + - `imageToVideo` ketika provider mendeklarasikan `capabilities.imageToVideo.enabled` dan provider/model yang dipilih menerima input image lokal berbasis buffer dalam sapuan bersama + - `videoToVideo` ketika provider mendeklarasikan `capabilities.videoToVideo.enabled` dan provider/model yang dipilih menerima input video lokal berbasis buffer dalam sapuan bersama + - Provider `imageToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan bersama: + - `vydra` karena `veo3` bawaan hanya mendukung teks dan `kling` bawaan memerlukan URL image jarak jauh - Cakupan Vydra khusus provider: - `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts` - - berkas itu menjalankan `veo3` text-to-video plus jalur `kling` yang secara default menggunakan fixture URL gambar jarak jauh + - file tersebut menjalankan `veo3` text-to-video plus lane `kling` yang secara default menggunakan fixture URL image jarak jauh - Cakupan live `videoToVideo` saat ini: - `runway` hanya ketika model yang dipilih adalah `runway/gen4_aleph` - - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sweep bersama: - - `alibaba`, `qwen`, `xai` karena jalur tersebut saat ini memerlukan URL referensi `http(s)` / MP4 jarak jauh - - `google` karena jalur Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan jalur itu tidak diterima dalam sweep bersama - - `openai` karena jalur bersama saat ini tidak memiliki jaminan akses inpaint/remix video khusus org + - Provider `videoToVideo` yang saat ini dideklarasikan tetapi dilewati dalam sapuan 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 tersebut tidak diterima dalam sapuan bersama + - `openai` karena lane bersama saat ini tidak memiliki jaminan akses video inpaint/remix khusus organisasi - 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 memaksa auth profile-store dan mengabaikan override yang hanya dari env + - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memaksa auth profile-store dan mengabaikan override env-only ## Harness live media - Perintah: `pnpm test:live:media` - Tujuan: - - Menjalankan suite live gambar, musik, dan video bersama melalui satu entrypoint native repo + - Menjalankan suite live image, musik, dan video bersama melalui satu entrypoint native repo - Memuat otomatis env var provider yang hilang dari `~/.profile` - - Secara default otomatis mempersempit setiap suite ke provider yang saat ini memiliki auth yang dapat digunakan + - Secara default mempersempit otomatis setiap suite ke provider yang saat ini memiliki auth yang dapat digunakan - Menggunakan kembali `scripts/test-live.mjs`, sehingga perilaku Heartbeat dan mode senyap tetap konsisten - Contoh: - `pnpm test:live:media` @@ -739,142 +818,142 @@ Jika Anda ingin mengandalkan kunci env (misalnya diekspor di `~/.profile`), jala - `pnpm test:live:media video --video-providers openai,runway --all-providers` - `pnpm test:live:media music --quiet` -## Runner Docker (opsional untuk pemeriksaan "berfungsi di Linux") +## Runner Docker (opsional, 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 berkas 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`), sambil me-mount direktori config dan workspace lokal Anda (serta melakukan source `~/.profile` jika di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. -- Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar sweep Docker penuh tetap praktis: - `test:docker:live-models` secara default menetapkan `OPENCLAW_LIVE_MAX_MODELS=12`, dan - `test:docker:live-gateway` secara default menetapkan `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, +- Runner model live: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live kunci-profil yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori config dan workspace lokal Anda (serta mengambil source `~/.profile` jika di-mount). Entrypoint lokal yang sesuai adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. +- Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar sapuan Docker penuh tetap praktis: + `test:docker:live-models` secara default menggunakan `OPENCLAW_LIVE_MAX_MODELS=12`, dan + `test:docker:live-gateway` secara default menggunakan `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`. Timpa env var tersebut saat Anda - secara eksplisit menginginkan pemindaian menyeluruh yang lebih besar. -- `test:docker:all` membangun image Docker live sekali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua jalur Docker live tersebut. -- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` menyalakan satu atau lebih container nyata dan memverifikasi jalur integrasi tingkat lebih tinggi. + `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override env var tersebut saat Anda + memang ingin pemindaian menyeluruh yang lebih besar. +- `test:docker:all` membangun image Docker live satu kali melalui `test:docker:live-build`, lalu menggunakannya kembali untuk dua lane Docker live tersebut. +- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:gateway-network`, `test:docker:mcp-channels`, dan `test:docker:plugins` menyalakan satu atau lebih container nyata dan memverifikasi path integrasi tingkat lebih tinggi. -Runner Docker live-model juga hanya bind-mount home auth CLI yang diperlukan (atau semua yang didukung ketika eksekusi tidak dipersempit), lalu menyalinnya ke home container sebelum eksekusi sehingga OAuth CLI eksternal dapat menyegarkan token tanpa mengubah store auth host: +Runner Docker model live juga hanya melakukan bind-mount pada home auth CLI yang diperlukan (atau semuanya yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run sehingga OAuth CLI eksternal dapat me-refresh 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`) -- Smoke harness app-server Codex: `pnpm test:docker:live-codex-harness` (script: `scripts/test-live-codex-harness-docker.sh`) -- Gateway + agen 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 WS + health): `pnpm test:docker:gateway-network` (script: `scripts/e2e/gateway-network-docker.sh`) -- Bridge channel MCP (Gateway seeded + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (script: `scripts/e2e/mcp-channels-docker.sh`) -- Plugins (smoke install + alias `/plugin` + semantik restart bundel Claude): `pnpm test:docker:plugins` (script: `scripts/e2e/plugins-docker.sh`) +- Model langsung: `pnpm test:docker:live-models` (skrip: `scripts/test-live-models-docker.sh`) +- ACP bind smoke: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`) +- Smoke backend CLI: `pnpm test:docker:live-cli-backend` (skrip: `scripts/test-live-cli-backend-docker.sh`) +- Smoke harness app-server Codex: `pnpm test:docker:live-codex-harness` (skrip: `scripts/test-live-codex-harness-docker.sh`) +- Gateway + agen dev: `pnpm test:docker:live-gateway` (skrip: `scripts/test-live-gateway-models-docker.sh`) +- Smoke live Open WebUI: `pnpm test:docker:openwebui` (skrip: `scripts/e2e/openwebui-docker.sh`) +- Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (skrip: `scripts/e2e/onboard-docker.sh`) +- Jaringan Gateway (dua container, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) +- Bridge channel MCP (Gateway ber-seed + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) +- Plugin (smoke install + alias `/plugin` + semantik restart bundle Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) -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 +Runner Docker model live juga melakukan bind-mount checkout saat ini dalam mode read-only dan +menyiapkannya ke workdir sementara di dalam container. Ini menjaga image runtime tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang persis. -Langkah staging ini melewati cache lokal besar dan output build aplikasi seperti -`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, serta direktori output `.build` -lokal aplikasi atau Gradle sehingga eksekusi live Docker tidak menghabiskan beberapa menit untuk menyalin +Langkah staging ini melewati cache besar yang hanya lokal dan output build aplikasi seperti +`.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, dan direktori output `.build` atau +Gradle lokal aplikasi agar run live Docker tidak menghabiskan menit untuk menyalin artefak khusus mesin. -Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` sehingga probe live gateway tidak memulai -worker channel Telegram/Discord/dll. nyata di dalam container. +Runner ini juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` agar probe live Gateway tidak memulai +worker channel nyata Telegram/Discord/dll. di dalam container. `test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan juga `OPENCLAW_LIVE_GATEWAY_*` saat Anda perlu mempersempit atau mengecualikan cakupan live -gateway dari jalur Docker tersebut. -`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ia memulai -container gateway OpenClaw dengan endpoint HTTP yang kompatibel dengan OpenAI diaktifkan, -memulai container Open WebUI yang dipin terhadap gateway tersebut, masuk melalui +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 dipin terhadap Gateway tersebut, masuk melalui Open WebUI, memverifikasi `/api/models` mengekspos `openclaw/default`, lalu mengirim permintaan chat nyata melalui proxy `/api/chat/completions` milik Open WebUI. -Eksekusi pertama dapat terasa lebih lambat karena Docker mungkin perlu menarik -image Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start miliknya. -Jalur ini mengharapkan kunci model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` -(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam eksekusi yang didockerisasi. -Eksekusi yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": +Run pertama bisa terasa lebih lambat karena Docker mungkin perlu menarik image +Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start miliknya sendiri. +Lane ini mengharapkan kunci model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` +(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam run yang di-Docker-kan. +Run yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": "openclaw/default", ... }`. -`test:docker:mcp-channels` sengaja dibuat deterministik dan tidak memerlukan -akun Telegram, Discord, atau iMessage nyata. Ia menyalakan container Gateway yang telah di-seed, -memulai container kedua yang menjalankan `openclaw mcp serve`, lalu +`test:docker:mcp-channels` sengaja dibuat deterministik dan tidak memerlukan akun +Telegram, Discord, atau iMessage nyata. Runner ini menyalakan container Gateway +ber-seed, memulai container kedua yang menjalankan `openclaw mcp serve`, lalu memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, -perilaku antrean peristiwa live, routing pengiriman keluar, dan notifikasi gaya Claude tentang channel + -izin melalui bridge MCP stdio nyata. Pemeriksaan notifikasi -memeriksa frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang sebenarnya dipancarkan -oleh bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. +perilaku antrean event live, routing pengiriman keluar, serta notifikasi channel + +izin bergaya Claude melalui bridge MCP stdio yang nyata. Pemeriksaan notifikasi +memeriksa frame MCP stdio mentah secara langsung sehingga smoke ini memvalidasi apa yang benar-benar +dipancarkan oleh bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. Smoke thread plain-language ACP manual (bukan CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- Pertahankan script ini untuk alur kerja regresi/debug. Script ini mungkin diperlukan lagi untuk validasi routing thread ACP, jadi jangan hapus. +- Pertahankan skrip ini untuk alur kerja regresi/debug. Ini mungkin diperlukan lagi untuk validasi routing thread ACP, jadi jangan hapus. 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 yang di-cache di dalam Docker -- Direktori/berkas 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 ter-cache di dalam Docker +- Direktori/file auth CLI eksternal di bawah `$HOME` di-mount read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum pengujian dimulai - Direktori default: `.minimax` - - Berkas default: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` - - Eksekusi provider yang dipersempit hanya me-mount direktori/berkas yang diperlukan yang diinferensikan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - Timpa secara manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` -- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit eksekusi + - File default: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` + - Run provider yang dipersempit hanya me-mount direktori/file yang diperlukan yang disimpulkan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - Override manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar dipisahkan koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` +- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit run - `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter provider di dalam container -- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan ulang image `openclaw:local-live` yang sudah ada pada eksekusi ulang yang tidak memerlukan rebuild +- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan kembali image `openclaw:local-live` yang sudah ada untuk rerun yang tidak memerlukan rebuild - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memastikan kredensial berasal dari profile store (bukan env) -- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh gateway bagi smoke Open WebUI -- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk menimpa prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI -- `OPENWEBUI_IMAGE=...` untuk menimpa tag image Open WebUI yang dipin +- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh Gateway untuk smoke Open WebUI +- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk meng-override prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI +- `OPENWEBUI_IMAGE=...` untuk meng-override tag image Open WebUI yang dipin -## Sanity docs +## Kewarasan dokumen -Jalankan pemeriksaan docs setelah edit dokumen: `pnpm check:docs`. +Jalankan pemeriksaan dokumen setelah mengedit dokumen: `pnpm check:docs`. Jalankan validasi anchor Mintlify penuh saat Anda juga membutuhkan pemeriksaan heading di dalam halaman: `pnpm docs:check-links:anchors`. ## Regresi offline (aman untuk CI) Ini adalah regresi “pipeline nyata” tanpa provider nyata: -- Pemanggilan alat gateway (mock OpenAI, gateway + loop agen nyata): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") -- Wizard gateway (WS `wizard.start`/`wizard.next`, menulis config + auth yang ditegakkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") +- Pemanggilan tool Gateway (mock OpenAI, Gateway + loop agen nyata): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- Wizard Gateway (WS `wizard.start`/`wizard.next`, menulis config + auth yang diwajibkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") -## Evals keandalan agen (Skills) +## Evaluasi keandalan agen (Skills) -Kami sudah memiliki beberapa pengujian aman-CI yang berperilaku seperti “evals keandalan agen”: +Kami sudah memiliki beberapa pengujian aman untuk CI yang berperilaku seperti “evaluasi keandalan agen”: -- Pemanggilan alat mock melalui gateway + loop agen nyata (`src/gateway/gateway.test.ts`). -- Alur wizard end-to-end yang memvalidasi wiring sesi dan efek config (`src/gateway/gateway.test.ts`). +- Mock tool-calling melalui Gateway + loop agen nyata (`src/gateway/gateway.test.ts`). +- Alur wizard end-to-end yang memvalidasi wiring sesi dan efek konfigurasi (`src/gateway/gateway.test.ts`). -Apa yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): +Yang masih kurang untuk Skills (lihat [Skills](/id/tools/skills)): -- **Pengambilan keputusan:** saat Skills terdaftar dalam prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)? +- **Pengambilan keputusan:** ketika Skills tercantum dalam prompt, apakah agen memilih Skill yang tepat (atau menghindari yang tidak relevan)? - **Kepatuhan:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? -- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan alat, carryover riwayat sesi, dan batas sandbox. +- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan tool, carryover riwayat sesi, dan batas sandbox. -Evals di masa depan sebaiknya tetap deterministik terlebih dahulu: +Evaluasi di masa depan sebaiknya tetap deterministik terlebih dahulu: -- Runner skenario menggunakan provider mock untuk menegaskan pemanggilan alat + urutannya, pembacaan berkas skill, dan wiring sesi. -- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, injeksi prompt). -- Evals live opsional (opt-in, digating env) hanya setelah suite aman-CI tersedia. +- Runner skenario menggunakan provider mock untuk menegaskan pemanggilan tool + urutannya, pembacaan file Skill, dan wiring sesi. +- Suite kecil skenario yang berfokus pada Skill (gunakan vs hindari, gating, injeksi prompt). +- Evaluasi live opsional (opt-in, digate oleh env) hanya setelah suite aman untuk CI tersedia. -## Pengujian kontrak (bentuk Plugin dan channel) +## Contract test (bentuk plugin dan channel) -Pengujian kontrak memverifikasi bahwa setiap Plugin dan channel yang terdaftar sesuai dengan -kontrak antarmukanya. Pengujian ini mengiterasi semua Plugin yang ditemukan dan menjalankan -suite penegasan bentuk dan perilaku. Jalur unit default `pnpm test` sengaja -melewati berkas seam dan smoke bersama ini; jalankan perintah kontrak secara eksplisit +Contract test memverifikasi bahwa setiap plugin dan channel yang terdaftar mematuhi +kontrak interface-nya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan suite +penegasan 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. ### Perintah -- Semua kontrak: `pnpm test:contracts` -- Hanya kontrak channel: `pnpm test:contracts:channels` -- Hanya kontrak provider: `pnpm test:contracts:plugins` +- Semua contract: `pnpm test:contracts` +- Hanya contract channel: `pnpm test:contracts:channels` +- Hanya contract provider: `pnpm test:contracts:plugins` -### Kontrak channel +### Contract channel Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: -- **plugin** - Bentuk Plugin dasar (id, nama, kapabilitas) +- **plugin** - Bentuk plugin dasar (id, nama, kapabilitas) - **setup** - Kontrak wizard setup -- **session-binding** - Perilaku binding sesi +- **session-binding** - Perilaku session binding - **outbound-payload** - Struktur payload pesan - **inbound** - Penanganan pesan masuk - **actions** - Handler tindakan channel @@ -882,43 +961,43 @@ Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: - **directory** - API direktori/roster - **group-policy** - Penegakan kebijakan grup -### Kontrak status provider +### Contract status provider Terletak di `src/plugins/contracts/*.contract.test.ts`. - **status** - Probe status channel -- **registry** - Bentuk registri Plugin +- **registry** - Bentuk registri plugin -### Kontrak provider +### Contract provider Terletak di `src/plugins/contracts/*.contract.test.ts`: - **auth** - Kontrak alur auth - **auth-choice** - Pilihan/seleksi auth - **catalog** - API katalog model -- **discovery** - Penemuan Plugin -- **loader** - Pemuatan Plugin +- **discovery** - Penemuan plugin +- **loader** - Pemuatan plugin - **runtime** - Runtime provider -- **shape** - Bentuk/antarmuka Plugin +- **shape** - Bentuk/interface plugin - **wizard** - Wizard setup -### Kapan dijalankan +### Kapan harus dijalankan -- Setelah mengubah ekspor atau subpath `plugin-sdk` -- Setelah menambahkan atau memodifikasi Plugin channel atau provider -- Setelah merombak registrasi atau penemuan Plugin +- Setelah mengubah ekspor atau subpath Plugin SDK +- Setelah menambahkan atau memodifikasi plugin channel atau provider +- Setelah memfaktorkan ulang registrasi atau penemuan plugin -Pengujian kontrak berjalan di CI dan tidak memerlukan API key nyata. +Contract test 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 dalam live: -- Tambahkan regresi aman-CI jika memungkinkan (provider mock/stub, atau tangkap transformasi bentuk permintaan yang persis) -- Jika masalah itu secara inheren hanya-live (rate limit, kebijakan auth), pertahankan pengujian live tetap sempit dan opt-in melalui env var +- Tambahkan regresi yang aman untuk CI jika memungkinkan (provider mock/stub, atau tangkap transformasi bentuk permintaan yang tepat) +- Jika masalah tersebut secara inheren hanya-live (rate limit, kebijakan auth), pertahankan live test tetap sempit dan opt-in melalui env var - Utamakan menargetkan lapisan terkecil yang menangkap bug: - bug konversi/replay permintaan provider → pengujian model langsung - - bug pipeline sesi/riwayat/alat gateway → smoke live gateway atau pengujian mock gateway aman-CI + - bug pipeline sesi/riwayat/tool Gateway → smoke live Gateway atau pengujian mock Gateway yang aman untuk CI - Guardrail traversal SecretRef: - - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registri (`listSecretTargetRegistryEntries()`), lalu 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 itu. Pengujian ini 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 registri (`listSecretTargetRegistryEntries()`), lalu menegaskan ID exec segmen traversal ditolak. + - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian tersebut. Pengujian ini sengaja gagal pada ID target yang belum diklasifikasikan agar kelas baru tidak dapat dilewati secara diam-diam. diff --git a/docs/id/providers/index.md b/docs/id/providers/index.md index 508b9c5a7..85516d221 100644 --- a/docs/id/providers/index.md +++ b/docs/id/providers/index.md @@ -1,29 +1,28 @@ --- read_when: - - Anda ingin memilih provider model - - Anda memerlukan gambaran singkat tentang backend LLM yang didukung -summary: Provider model (LLM) yang didukung oleh OpenClaw + - Anda ingin memilih penyedia model + - Anda memerlukan ringkasan cepat tentang backend LLM yang didukung +summary: Penyedia model (LLM) yang didukung oleh OpenClaw title: Direktori Provider x-i18n: - generated_at: "2026-04-08T02:16:42Z" + generated_at: "2026-04-13T08:50:44Z" model: gpt-5.4 provider: openai - source_hash: e7bee5528b7fc9a982b3d0eaa4930cb77f7bded19a47aec00572b6fcbd823a70 + source_hash: 3bc682d008119719826f71f74959ab32bedf14214459f5e6ac9cb70371d3c540 source_path: providers/index.md workflow: 15 --- -# Provider Model +# Penyedia Model -OpenClaw dapat menggunakan banyak provider LLM. Pilih provider, lakukan autentikasi, lalu setel -model default sebagai `provider/model`. +OpenClaw dapat menggunakan banyak penyedia LLM. Pilih penyedia, autentikasi, lalu atur model default sebagai `provider/model`. -Mencari dokumentasi channel chat (WhatsApp/Telegram/Discord/Slack/Mattermost (plugin)/dll.)? Lihat [Channels](/id/channels). +Mencari dokumentasi saluran chat (WhatsApp/Telegram/Discord/Slack/Mattermost (plugin)/dll.)? Lihat [Channels](/id/channels). ## Mulai cepat -1. Lakukan autentikasi dengan provider (biasanya melalui `openclaw onboard`). -2. Setel model default: +1. Autentikasi dengan penyedia (biasanya melalui `openclaw onboard`). +2. Atur model default: ```json5 { @@ -48,10 +47,11 @@ Mencari dokumentasi channel chat (WhatsApp/Telegram/Discord/Slack/Mattermost (pl - [Model GLM](/id/providers/glm) - [Google (Gemini)](/id/providers/google) - [Groq (inferensi LPU)](/id/providers/groq) -- [Hugging Face (Inference)](/id/providers/huggingface) +- [Hugging Face (Inferensi)](/id/providers/huggingface) - [inferrs (model lokal)](/id/providers/inferrs) - [Kilocode](/id/providers/kilocode) - [LiteLLM (gateway terpadu)](/id/providers/litellm) +- [LM Studio (model lokal)](/id/providers/lmstudio) - [MiniMax](/id/providers/minimax) - [Mistral](/id/providers/mistral) - [Moonshot AI (Kimi + Kimi Coding)](/id/providers/moonshot) @@ -78,7 +78,7 @@ Mencari dokumentasi channel chat (WhatsApp/Telegram/Discord/Slack/Mattermost (pl - [Xiaomi](/id/providers/xiaomi) - [Z.AI](/id/providers/zai) -## Halaman gambaran umum bersama +## Halaman ringkasan bersama - [Varian bundel tambahan](/id/providers/models#additional-bundled-provider-variants) - Anthropic Vertex, Copilot Proxy, dan Gemini CLI OAuth - [Pembuatan Gambar](/id/tools/image-generation) - Tool `image_generate` bersama, pemilihan provider, dan failover @@ -94,4 +94,4 @@ Mencari dokumentasi channel chat (WhatsApp/Telegram/Discord/Slack/Mattermost (pl - [Claude Max API Proxy](/id/providers/claude-max-api-proxy) - Proxy komunitas untuk kredensial langganan Claude (verifikasi kebijakan/persyaratan Anthropic sebelum digunakan) Untuk katalog provider lengkap (xAI, Groq, Mistral, dll.) dan konfigurasi lanjutan, -lihat [Provider model](/id/concepts/model-providers). +lihat [Penyedia model](/id/concepts/model-providers). diff --git a/docs/id/providers/lmstudio.md b/docs/id/providers/lmstudio.md new file mode 100644 index 000000000..1716fac7a --- /dev/null +++ b/docs/id/providers/lmstudio.md @@ -0,0 +1,163 @@ +--- +read_when: + - Anda ingin menjalankan OpenClaw dengan model open source melalui LM Studio + - Anda ingin menyiapkan dan mengonfigurasi LM Studio +summary: Jalankan OpenClaw dengan LM Studio +title: LM Studio +x-i18n: + generated_at: "2026-04-13T08:50:46Z" + model: gpt-5.4 + provider: openai + source_hash: 11264584e8277260d4215feb7c751329ce04f59e9228da1c58e147c21cd9ac2c + source_path: providers/lmstudio.md + workflow: 15 +--- + +# LM Studio + +LM Studio adalah aplikasi yang ramah namun andal untuk menjalankan model open-weight di perangkat keras Anda sendiri. Aplikasi ini memungkinkan Anda menjalankan model llama.cpp (GGUF) atau MLX (Apple Silicon). Tersedia dalam paket GUI atau daemon headless (`llmster`). Untuk dokumentasi produk dan penyiapan, lihat [lmstudio.ai](https://lmstudio.ai/). + +## Mulai cepat + +1. Instal LM Studio (desktop) atau `llmster` (headless), lalu jalankan server lokal: + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +2. Mulai server + +Pastikan Anda menjalankan aplikasi desktop atau menjalankan daemon dengan perintah berikut: + +```bash +lms daemon up +``` + +```bash +lms server start --port 1234 +``` + +Jika Anda menggunakan aplikasi, pastikan JIT diaktifkan agar pengalaman tetap lancar. Pelajari lebih lanjut di [panduan LM Studio JIT dan TTL](https://lmstudio.ai/docs/developer/core/ttl-and-auto-evict). + +3. OpenClaw memerlukan nilai token LM Studio. Atur `LM_API_TOKEN`: + +```bash +export LM_API_TOKEN="your-lm-studio-api-token" +``` + +Jika autentikasi LM Studio dinonaktifkan, gunakan nilai token tidak kosong apa pun: + +```bash +export LM_API_TOKEN="placeholder-key" +``` + +Untuk detail penyiapan autentikasi LM Studio, lihat [Autentikasi LM Studio](https://lmstudio.ai/docs/developer/core/authentication). + +4. Jalankan onboarding dan pilih `LM Studio`: + +```bash +openclaw onboard +``` + +5. Dalam onboarding, gunakan prompt `Default model` untuk memilih model LM Studio Anda. + +Anda juga dapat mengatur atau mengubahnya nanti: + +```bash +openclaw models set lmstudio/qwen/qwen3.5-9b +``` + +Kunci model LM Studio mengikuti format `author/model-name` (misalnya `qwen/qwen3.5-9b`). Ref model OpenClaw menambahkan nama penyedia di depan: `lmstudio/qwen/qwen3.5-9b`. Anda dapat menemukan kunci yang tepat untuk suatu model dengan menjalankan `curl http://localhost:1234/api/v1/models` dan melihat field `key`. + +## Onboarding non-interaktif + +Gunakan onboarding non-interaktif saat Anda ingin membuat penyiapan dalam bentuk skrip (CI, provisioning, bootstrap jarak jauh): + +```bash +openclaw onboard \ + --non-interactive \ + --accept-risk \ + --auth-choice lmstudio +``` + +Atau tentukan base URL atau model dengan API key: + +```bash +openclaw onboard \ + --non-interactive \ + --accept-risk \ + --auth-choice lmstudio \ + --custom-base-url http://localhost:1234/v1 \ + --lmstudio-api-key "$LM_API_TOKEN" \ + --custom-model-id qwen/qwen3.5-9b +``` + +`--custom-model-id` menerima kunci model seperti yang dikembalikan oleh LM Studio (misalnya `qwen/qwen3.5-9b`), tanpa prefiks penyedia `lmstudio/`. + +Onboarding non-interaktif memerlukan `--lmstudio-api-key` (atau `LM_API_TOKEN` di env). +Untuk server LM Studio tanpa autentikasi, nilai token tidak kosong apa pun akan berfungsi. + +`--custom-api-key` tetap didukung demi kompatibilitas, tetapi `--lmstudio-api-key` lebih disarankan untuk LM Studio. + +Ini akan menulis `models.providers.lmstudio`, mengatur model default ke +`lmstudio/`, dan menulis profil auth `lmstudio:default`. + +Penyiapan interaktif dapat meminta panjang konteks pemuatan pilihan yang opsional dan menerapkannya ke seluruh model LM Studio yang ditemukan lalu disimpan ke config. + +## Konfigurasi + +### Konfigurasi eksplisit + +```json5 +{ + models: { + providers: { + lmstudio: { + baseUrl: "http://localhost:1234/v1", + apiKey: "${LM_API_TOKEN}", + api: "openai-completions", + models: [ + { + id: "qwen/qwen3-coder-next", + name: "Qwen 3 Coder Next", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 8192, + }, + ], + }, + }, + }, +} +``` + +## Pemecahan masalah + +### LM Studio tidak terdeteksi + +Pastikan LM Studio sedang berjalan dan Anda telah menetapkan `LM_API_TOKEN` (untuk server tanpa autentikasi, nilai token tidak kosong apa pun akan berfungsi): + +```bash +# Mulai melalui aplikasi desktop, atau headless: +lms server start --port 1234 +``` + +Verifikasi bahwa API dapat diakses: + +```bash +curl http://localhost:1234/api/v1/models +``` + +### Kesalahan autentikasi (HTTP 401) + +Jika penyiapan melaporkan HTTP 401, verifikasi API key Anda: + +- Periksa bahwa `LM_API_TOKEN` cocok dengan key yang dikonfigurasi di LM Studio. +- Untuk detail penyiapan auth LM Studio, lihat [Autentikasi LM Studio](https://lmstudio.ai/docs/developer/core/authentication). +- Jika server Anda tidak memerlukan autentikasi, gunakan nilai token tidak kosong apa pun untuk `LM_API_TOKEN`. + +### Pemuatan model just-in-time + +LM Studio mendukung pemuatan model just-in-time (JIT), yaitu model dimuat pada permintaan pertama. Pastikan fitur ini diaktifkan untuk menghindari kesalahan 'Model not loaded'. diff --git a/docs/id/reference/api-usage-costs.md b/docs/id/reference/api-usage-costs.md index c5cc1f7cc..c421c2dea 100644 --- a/docs/id/reference/api-usage-costs.md +++ b/docs/id/reference/api-usage-costs.md @@ -2,90 +2,90 @@ read_when: - Anda ingin memahami fitur mana yang mungkin memanggil API berbayar - Anda perlu mengaudit kunci, biaya, dan visibilitas penggunaan - - Anda sedang menjelaskan pelaporan biaya /status atau /usage -summary: Audit apa saja yang dapat menghabiskan biaya, kunci mana yang digunakan, dan cara melihat penggunaan + - Anda sedang menjelaskan pelaporan biaya `/status` atau `/usage` +summary: Audit apa saja yang bisa menghabiskan uang, kunci apa yang digunakan, dan cara melihat penggunaan title: Penggunaan dan Biaya API x-i18n: - generated_at: "2026-04-07T09:19:17Z" + generated_at: "2026-04-13T08:50:45Z" model: gpt-5.4 provider: openai - source_hash: ab6eefcde9ac014df6cdda7aaa77ef48f16936ab12eaa883d9fe69425a31a2dd + source_hash: f5077e74d38ef781ac7a72603e9f9e3829a628b95c5a9967915ab0f321565429 source_path: reference/api-usage-costs.md workflow: 15 --- -# Penggunaan & biaya API +# Penggunaan dan biaya API -Dokumen ini mencantumkan **fitur yang dapat memanggil kunci API** dan tempat biayanya muncul. Dokumen ini berfokus pada +Dokumen ini mencantumkan **fitur yang dapat memanggil API key** dan tempat biaya tersebut muncul. Dokumen ini berfokus pada fitur OpenClaw yang dapat menghasilkan penggunaan provider atau panggilan API berbayar. -## Tempat biaya muncul (chat + CLI) +## Di mana biaya muncul (chat + CLI) -**Snapshot biaya per sesi** +**Ringkasan biaya per sesi** - `/status` menampilkan model sesi saat ini, penggunaan konteks, dan token respons terakhir. -- Jika model menggunakan **autentikasi kunci API**, `/status` juga menampilkan **perkiraan biaya** untuk balasan terakhir. +- Jika model menggunakan **autentikasi API key**, `/status` juga menampilkan **perkiraan biaya** untuk balasan terakhir. - Jika metadata sesi langsung minim, `/status` dapat memulihkan penghitung token/cache dan label model runtime aktif dari entri penggunaan transkrip - terbaru. Nilai langsung nonzero yang sudah ada tetap diprioritaskan, dan total + terbaru. Nilai live nonnol yang sudah ada tetap diprioritaskan, dan total transkrip berukuran prompt dapat menang ketika total tersimpan tidak ada atau lebih kecil. **Footer biaya per pesan** -- `/usage full` menambahkan footer penggunaan ke setiap balasan, termasuk **perkiraan biaya** (hanya kunci API). +- `/usage full` menambahkan footer penggunaan ke setiap balasan, termasuk **perkiraan biaya** (khusus API key). - `/usage tokens` hanya menampilkan token; alur OAuth/token bergaya langganan dan CLI menyembunyikan biaya dalam dolar. -- Catatan Gemini CLI: ketika CLI mengembalikan output JSON, OpenClaw membaca penggunaan dari +- Catatan Gemini CLI: saat CLI mengembalikan output JSON, OpenClaw membaca penggunaan dari `stats`, menormalkan `stats.cached` menjadi `cacheRead`, dan menurunkan token input dari `stats.input_tokens - stats.cached` bila diperlukan. -Catatan Anthropic: staf Anthropic memberi tahu kami bahwa penggunaan Claude CLI bergaya OpenClaw kini -diizinkan lagi, jadi OpenClaw menganggap penggunaan ulang Claude CLI dan penggunaan `claude -p` sebagai -hal yang disetujui untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. -Anthropic masih tidak mengekspos perkiraan dolar per pesan yang dapat ditampilkan OpenClaw -di `/usage full`. +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 +didukung untuk integrasi ini kecuali Anthropic menerbitkan kebijakan baru. +Anthropic masih tidak mengekspos perkiraan dolar per pesan yang dapat OpenClaw +tampilkan di `/usage full`. **Jendela penggunaan CLI (kuota provider)** - `openclaw status --usage` dan `openclaw channels list` menampilkan **jendela penggunaan** provider (snapshot kuota, bukan biaya per pesan). -- Output yang dapat dibaca manusia dinormalkan menjadi `X% left` di seluruh provider. +- Output yang dapat dibaca manusia dinormalisasi menjadi `X% left` di seluruh provider. - Provider jendela penggunaan saat ini: Anthropic, GitHub Copilot, Gemini CLI, OpenAI Codex, MiniMax, Xiaomi, dan z.ai. - Catatan MiniMax: field mentah `usage_percent` / `usagePercent` berarti kuota - tersisa, jadi OpenClaw membalikkannya sebelum ditampilkan. Field berbasis jumlah tetap diutamakan - saat tersedia. Jika provider mengembalikan `model_remains`, OpenClaw memprioritaskan entri model chat, - menurunkan label jendela dari timestamp bila diperlukan, dan + tersisa, jadi OpenClaw membalikkannya sebelum ditampilkan. Field berbasis jumlah tetap diprioritaskan + bila ada. Jika provider mengembalikan `model_remains`, OpenClaw memprioritaskan entri model chat, + menurunkan label jendela dari stempel waktu bila diperlukan, dan menyertakan nama model dalam label paket. -- Autentikasi penggunaan untuk jendela kuota tersebut berasal dari hook khusus provider jika - tersedia; jika tidak, OpenClaw kembali mencocokkan - kredensial OAuth/kunci API dari profil autentikasi, env, atau konfigurasi. +- Auth penggunaan untuk jendela kuota tersebut berasal dari hook khusus provider saat + tersedia; jika tidak, OpenClaw kembali mencocokkan kredensial OAuth/API key + dari profil auth, env, atau config. Lihat [Penggunaan token & biaya](/id/reference/token-use) untuk detail dan contoh. -## Cara kunci ditemukan +## Bagaimana kunci ditemukan OpenClaw dapat mengambil kredensial dari: -- **Profil autentikasi** (per agen, disimpan di `auth-profiles.json`). -- **Variabel lingkungan** (mis. `OPENAI_API_KEY`, `BRAVE_API_KEY`, `FIRECRAWL_API_KEY`). -- **Konfigurasi** (`models.providers.*.apiKey`, `plugins.entries.*.config.webSearch.apiKey`, +- **Profil auth** (per-agent, disimpan di `auth-profiles.json`). +- **Variabel environment** (mis. `OPENAI_API_KEY`, `BRAVE_API_KEY`, `FIRECRAWL_API_KEY`). +- **Config** (`models.providers.*.apiKey`, `plugins.entries.*.config.webSearch.apiKey`, `plugins.entries.firecrawl.config.webFetch.apiKey`, `memorySearch.*`, `talk.providers.*.apiKey`). - **Skills** (`skills.entries..apiKey`) yang dapat mengekspor kunci ke env proses skill. ## Fitur yang dapat menghabiskan kunci -### 1) Respons model inti (chat + tool) +### 1) Respons model inti (chat + tools) -Setiap balasan atau pemanggilan tool menggunakan **provider model saat ini** (OpenAI, Anthropic, dll.). Ini adalah +Setiap balasan atau pemanggilan tool menggunakan **provider model saat ini** (OpenAI, Anthropic, dll). Ini adalah sumber utama penggunaan dan biaya. -Ini juga mencakup provider terhosting bergaya langganan yang tetap menagih di luar +Ini juga mencakup provider hosted bergaya langganan yang tetap menagih di luar UI lokal OpenClaw, seperti **OpenAI Codex**, **Alibaba Cloud Model Studio Coding Plan**, **MiniMax Coding Plan**, **Z.AI / GLM Coding Plan**, dan jalur login Claude OpenClaw milik Anthropic dengan **Extra Usage** diaktifkan. -Lihat [Model](/id/providers/models) untuk konfigurasi harga dan [Penggunaan token & biaya](/id/reference/token-use) untuk tampilan. +Lihat [Model](/id/providers/models) untuk config harga dan [Penggunaan token & biaya](/id/reference/token-use) untuk tampilan. ### 2) Pemahaman media (audio/gambar/video) @@ -104,9 +104,9 @@ Kapabilitas pembuatan bersama juga dapat menghabiskan kunci provider: - Pembuatan gambar: OpenAI / Google / fal / MiniMax - Pembuatan video: Qwen -Pembuatan gambar dapat menyimpulkan default provider yang didukung autentikasi ketika -`agents.defaults.imageGenerationModel` tidak diatur. Pembuatan video saat ini -memerlukan `agents.defaults.videoGenerationModel` yang eksplisit seperti +Pembuatan gambar dapat menyimpulkan default provider berbasis auth ketika +`agents.defaults.imageGenerationModel` tidak disetel. Pembuatan video saat ini +memerlukan `agents.defaults.videoGenerationModel` eksplisit seperti `qwen/wan2.6-t2v`. Lihat [Pembuatan gambar](/id/tools/image-generation), [Qwen Cloud](/id/providers/qwen), @@ -114,20 +114,21 @@ dan [Model](/id/concepts/models). ### 4) Embedding memori + pencarian semantik -Pencarian memori semantik menggunakan **API embedding** saat dikonfigurasi untuk provider jarak jauh: +Pencarian memori semantik menggunakan **API embedding** saat dikonfigurasi untuk provider remote: - `memorySearch.provider = "openai"` → embedding OpenAI - `memorySearch.provider = "gemini"` → embedding Gemini - `memorySearch.provider = "voyage"` → embedding Voyage - `memorySearch.provider = "mistral"` → embedding Mistral -- `memorySearch.provider = "ollama"` → embedding Ollama (lokal/self-hosted; biasanya tidak ada penagihan API terhosting) -- Fallback opsional ke provider jarak jauh jika embedding lokal gagal +- `memorySearch.provider = "lmstudio"` → embedding LM Studio (lokal/self-hosted) +- `memorySearch.provider = "ollama"` → embedding Ollama (lokal/self-hosted; biasanya tanpa penagihan API hosted) +- Fallback opsional ke provider remote jika embedding lokal gagal Anda dapat tetap lokal dengan `memorySearch.provider = "local"` (tanpa penggunaan API). -Lihat [Memori](/id/concepts/memory). +Lihat [Memory](/id/concepts/memory). -### 5) Tool web search +### 5) Tool pencarian web `web_search` dapat menimbulkan biaya penggunaan tergantung pada provider Anda: @@ -138,24 +139,24 @@ Lihat [Memori](/id/concepts/memory). - **Grok (xAI)**: `XAI_API_KEY` atau `plugins.entries.xai.config.webSearch.apiKey` - **Kimi (Moonshot)**: `KIMI_API_KEY`, `MOONSHOT_API_KEY`, atau `plugins.entries.moonshot.config.webSearch.apiKey` - **MiniMax Search**: `MINIMAX_CODE_PLAN_KEY`, `MINIMAX_CODING_API_KEY`, `MINIMAX_API_KEY`, atau `plugins.entries.minimax.config.webSearch.apiKey` -- **Ollama Web Search**: default-nya tanpa kunci, tetapi memerlukan host Ollama yang dapat dijangkau plus `ollama signin`; juga dapat menggunakan ulang autentikasi bearer provider Ollama normal saat host membutuhkannya +- **Ollama Web Search**: default-nya tanpa kunci, tetapi memerlukan host Ollama yang dapat dijangkau serta `ollama signin`; juga dapat menggunakan ulang auth bearer provider Ollama normal saat host memerlukannya - **Perplexity Search API**: `PERPLEXITY_API_KEY`, `OPENROUTER_API_KEY`, atau `plugins.entries.perplexity.config.webSearch.apiKey` - **Tavily**: `TAVILY_API_KEY` atau `plugins.entries.tavily.config.webSearch.apiKey` - **DuckDuckGo**: fallback tanpa kunci (tanpa penagihan API, tetapi tidak resmi dan berbasis HTML) -- **SearXNG**: `SEARXNG_BASE_URL` atau `plugins.entries.searxng.config.webSearch.baseUrl` (tanpa kunci/self-hosted; tanpa penagihan API terhosting) +- **SearXNG**: `SEARXNG_BASE_URL` atau `plugins.entries.searxng.config.webSearch.baseUrl` (tanpa kunci/self-hosted; tanpa penagihan API hosted) -Jalur provider legacy `tools.web.search.*` masih dimuat melalui shim kompatibilitas sementara, tetapi bukan lagi permukaan konfigurasi yang direkomendasikan. +Path provider legacy `tools.web.search.*` masih dimuat melalui shim kompatibilitas sementara, tetapi tidak lagi menjadi surface config yang direkomendasikan. -**Kredit gratis Brave Search:** Setiap paket Brave menyertakan kredit gratis \$5/bulan yang diperbarui -setiap bulan. Paket Search berbiaya \$5 per 1.000 permintaan, sehingga kredit tersebut mencakup -1.000 permintaan/bulan tanpa biaya. Atur batas penggunaan Anda di dashboard Brave +**Kredit gratis Brave Search:** Setiap paket Brave menyertakan kredit gratis +\$5/bulan yang diperbarui. Paket Search berbiaya \$5 per 1.000 permintaan, jadi kredit tersebut mencakup +1.000 permintaan/bulan tanpa biaya. Tetapkan batas penggunaan Anda di dashboard Brave untuk menghindari biaya tak terduga. Lihat [Tool web](/id/tools/web). ### 5) Tool web fetch (Firecrawl) -`web_fetch` dapat memanggil **Firecrawl** saat kunci API tersedia: +`web_fetch` dapat memanggil **Firecrawl** saat API key tersedia: - `FIRECRAWL_API_KEY` atau `plugins.entries.firecrawl.config.webFetch.apiKey` @@ -165,18 +166,18 @@ Lihat [Tool web](/id/tools/web). ### 6) Snapshot penggunaan provider (status/health) -Beberapa perintah status memanggil **endpoint penggunaan provider** untuk menampilkan jendela kuota atau kesehatan autentikasi. -Ini biasanya panggilan ber-volume rendah tetapi tetap mengenai API provider: +Beberapa perintah status memanggil **endpoint penggunaan provider** untuk menampilkan jendela kuota atau kesehatan auth. +Ini biasanya merupakan panggilan ber-volume rendah tetapi tetap mengenai API provider: - `openclaw status --usage` - `openclaw models status --json` -Lihat [CLI Models](/cli/models). +Lihat [Models CLI](/cli/models). -### 7) Ringkasan perlindungan compaction +### 7) Perangkuman pengaman Compaction -Perlindungan compaction dapat merangkum riwayat sesi menggunakan **model saat ini**, yang -memanggil API provider ketika dijalankan. +Pengaman Compaction dapat merangkum riwayat sesi menggunakan **model saat ini**, yang +memanggil API provider saat dijalankan. Lihat [Manajemen sesi + compaction](/id/reference/session-management-compaction). @@ -185,19 +186,19 @@ Lihat [Manajemen sesi + compaction](/id/reference/session-management-compaction) `openclaw models scan` dapat melakukan probe pada model OpenRouter dan menggunakan `OPENROUTER_API_KEY` saat probe diaktifkan. -Lihat [CLI Models](/cli/models). +Lihat [Models CLI](/cli/models). -### 9) Talk (speech) +### 9) Talk (ucapan) -Mode talk dapat memanggil **ElevenLabs** saat dikonfigurasi: +Mode Talk dapat memanggil **ElevenLabs** saat dikonfigurasi: - `ELEVENLABS_API_KEY` atau `talk.providers.elevenlabs.apiKey` -Lihat [Mode talk](/id/nodes/talk). +Lihat [Mode Talk](/id/nodes/talk). ### 10) Skills (API pihak ketiga) -Skills dapat menyimpan `apiKey` di `skills.entries..apiKey`. Jika suatu skill menggunakan kunci tersebut untuk -API eksternal, hal itu dapat menimbulkan biaya sesuai provider skill tersebut. +Skills dapat menyimpan `apiKey` di `skills.entries..apiKey`. Jika sebuah skill menggunakan kunci tersebut untuk +API eksternal, skill tersebut dapat menimbulkan biaya sesuai provider skill. Lihat [Skills](/id/tools/skills).