Pengujian
OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sekumpulan kecil runner Docker. Dokumen ini adalah panduan “cara kami menguji”:- Apa yang dicakup oleh setiap suite (dan apa yang sengaja tidak dicakup)
- Perintah mana yang dijalankan untuk alur kerja umum (lokal, pra-push, debugging)
- Bagaimana pengujian live menemukan kredensial dan memilih model/penyedia
- Cara menambahkan regresi untuk masalah model/penyedia di dunia nyata
Mulai cepat
Sebagian besar hari:- Gate penuh (diharapkan sebelum push):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Menjalankan full-suite lokal yang lebih cepat di mesin yang lapang:
pnpm test:max - Loop watch Vitest langsung:
pnpm test:watch - Penargetan file langsung kini juga merutekan path extension/channel:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Utamakan menjalankan target yang sempit terlebih dahulu saat Anda mengiterasi satu kegagalan.
- Situs QA berbasis Docker:
pnpm qa:lab:up - Lane QA berbasis Linux VM:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
- Gate cakupan:
pnpm test:coverage - Suite E2E:
pnpm test:e2e
- Suite live (probe model + alat/gambar gateway):
pnpm test:live - Targetkan satu file live secara senyap:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Smoke biaya Moonshot/Kimi: dengan
MOONSHOT_API_KEYdisetel, jalankanopenclaw models list --provider moonshot --json, lalu jalankanopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonyang terisolasi terhadapmoonshot/kimi-k2.6. Verifikasi bahwa JSON melaporkan Moonshot/K2.6 dan transkrip asisten menyimpanusage.costyang dinormalisasi.
Runner khusus QA
Perintah-perintah ini berada di samping suite pengujian utama saat Anda memerlukan realisme qa-lab:pnpm openclaw qa suite- Menjalankan skenario QA berbasis repo langsung di host.
- Menjalankan beberapa skenario yang dipilih secara paralel secara default dengan worker gateway yang terisolasi.
qa-channeldefault ke konkurensi 4 (dibatasi oleh jumlah skenario yang dipilih). Gunakan--concurrency <count>untuk menyetel jumlah worker, atau--concurrency 1untuk lane serial lama. - Keluar dengan kode non-zero saat ada skenario yang gagal. Gunakan
--allow-failuressaat Anda ingin artefak tanpa kode keluar gagal. - Mendukung mode penyedia
live-frontier,mock-openai, danaimock.aimockmemulai server penyedia berbasis AIMock lokal untuk cakupan fixture dan mock protokol eksperimental tanpa menggantikan lanemock-openaiyang sadar skenario.
pnpm openclaw qa suite --runner multipass- Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai.
- Mempertahankan perilaku pemilihan skenario yang sama seperti
qa suitedi host. - Menggunakan ulang flag pemilihan penyedia/model yang sama seperti
qa suite. - Pengujian live meneruskan input auth QA yang didukung dan praktis untuk guest:
kunci penyedia berbasis env, path config penyedia live QA, dan
CODEX_HOMEbila ada. - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis kembali melalui workspace yang di-mount.
- Menulis laporan + ringkasan QA normal serta log Multipass di bawah
.artifacts/qa-e2e/....
pnpm qa:lab:up- Memulai situs QA berbasis Docker untuk pekerjaan QA gaya operator.
pnpm test:docker:bundled-channel-deps- Memaketkan dan memasang build OpenClaw saat ini di Docker, memulai Gateway dengan OpenAI yang telah dikonfigurasi, lalu mengaktifkan Telegram dan Discord melalui edit config.
- Memverifikasi bahwa restart Gateway pertama memasang dependensi runtime setiap plugin kanal bundel sesuai permintaan, dan restart kedua tidak memasang ulang dependensi yang sudah diaktifkan.
- Juga memasang baseline npm lama yang diketahui, mengaktifkan Telegram sebelum menjalankan
openclaw update --tag <candidate>, dan memverifikasi bahwa doctor pasca-pembaruan milik kandidat memperbaiki dependensi runtime kanal bundel tanpa perbaikan postinstall sisi harness.
pnpm openclaw qa aimock- Hanya memulai server penyedia AIMock lokal untuk smoke testing protokol langsung.
pnpm openclaw qa matrix- Menjalankan lane QA live Matrix terhadap homeserver Tuwunel berbasis Docker sekali pakai.
- Host QA ini saat ini hanya untuk repo/dev. Instalasi OpenClaw yang dipaketkan tidak menyertakan
qa-lab, sehingga tidak mengeksposopenclaw qa. - Checkout repo memuat runner bundel secara langsung; tidak diperlukan langkah pemasangan plugin terpisah.
- Menyediakan tiga pengguna Matrix sementara (
driver,sut,observer) plus satu room privat, lalu memulai child gateway QA dengan Plugin Matrix nyata sebagai transport SUT. - Menggunakan image Tuwunel stabil yang dipin
ghcr.io/matrix-construct/tuwunel:v1.5.1secara default. Override denganOPENCLAW_QA_MATRIX_TUWUNEL_IMAGEsaat Anda perlu menguji image yang berbeda. - Matrix tidak mengekspos flag sumber kredensial bersama karena lane ini menyediakan pengguna sementara secara lokal.
- Menulis laporan QA Matrix, ringkasan, artefak observed-events, dan log gabungan stdout/stderr di bawah
.artifacts/qa-e2e/....
pnpm openclaw qa telegram- Menjalankan lane QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env.
- Memerlukan
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN, danOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. ID grup harus berupa ID chat Telegram numerik. - Mendukung
--credential-source convexuntuk kredensial gabungan bersama. Gunakan mode env secara default, atau setelOPENCLAW_QA_CREDENTIAL_SOURCE=convexuntuk ikut serta pada lease gabungan. - Keluar dengan kode non-zero saat ada skenario yang gagal. Gunakan
--allow-failuressaat Anda ingin artefak tanpa kode keluar gagal. - Memerlukan dua bot berbeda di grup privat yang sama, dengan bot SUT mengekspos username Telegram.
- Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di
@BotFatheruntuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot di grup. - Menulis laporan QA Telegram, ringkasan, dan artefak observed-messages di bawah
.artifacts/qa-e2e/....
qa-channel tetap menjadi suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live.
| Lane | Canary | Pemfilteran penyebutan | Blok allowlist | Balasan tingkat atas | Lanjutkan 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/
OPENCLAW_QA_CONVEX_SITE_URL(misalnyahttps://your-deployment.convex.site)- Satu secret untuk peran yang dipilih:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERuntukmaintainerOPENCLAW_QA_CONVEX_SECRET_CIuntukci
- Pemilihan peran kredensial:
- CLI:
--credential-role maintainer|ci - Default env:
OPENCLAW_QA_CREDENTIAL_ROLE(default kecidi CI,maintainerselain itu)
- CLI:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(default1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(default30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(default90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(default15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(default/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(ID jejak opsional)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1mengizinkan URL Convexhttp://loopback 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:
--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", ... }
- Permintaan:
POST /heartbeat- Permintaan:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Berhasil:
{ status: "ok" }(atau2xxkosong)
- Permintaan:
POST /release- Permintaan:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Berhasil:
{ status: "ok" }(atau2xxkosong)
- Permintaan:
POST /admin/add(hanya secret maintainer)- Permintaan:
{ kind, actorId, payload, note?, status? } - Berhasil:
{ status: "ok", credential }
- Permintaan:
POST /admin/remove(hanya secret maintainer)- Permintaan:
{ credentialId, actorId } - Berhasil:
{ status: "ok", changed, credential } - Penjaga lease aktif:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Permintaan:
POST /admin/list(hanya secret maintainer)- Permintaan:
{ kind?, status?, includePayload?, limit? } - Berhasil:
{ status: "ok", credentials, count }
- Permintaan:
{ groupId: string, driverToken: string, sutToken: string }groupIdharus berupa string ID chat Telegram numerik.admin/addmemvalidasi bentuk ini untukkind: "telegram"dan menolak payload yang tidak valid.
Menambahkan kanal ke QA
Menambahkan kanal ke sistem QA markdown memerlukan tepat dua hal:- Adaptor transport untuk kanal tersebut.
- Paket skenario yang menjalankan kontrak kanal tersebut.
qa-lab bersama dapat
memiliki alur tersebut.
qa-lab memiliki mekanisme host bersama:
- root perintah
openclaw qa - startup dan teardown suite
- konkurensi worker
- penulisan artefak
- pembuatan laporan
- eksekusi skenario
- alias kompatibilitas untuk skenario
qa-channellama
- bagaimana
openclaw qa <runner>dipasang di bawah rootqabersama - bagaimana gateway dikonfigurasi untuk transport tersebut
- bagaimana kesiapan diperiksa
- bagaimana peristiwa masuk disuntikkan
- bagaimana pesan keluar diamati
- bagaimana transkrip dan state transport yang dinormalisasi diekspos
- bagaimana aksi yang didukung transport dijalankan
- bagaimana reset atau pembersihan khusus transport ditangani
- Pertahankan
qa-labsebagai pemilik rootqabersama. - Implementasikan runner transport pada seam host
qa-labbersama. - Pertahankan mekanisme khusus transport di dalam Plugin runner atau harness kanal.
- Mount runner sebagai
openclaw qa <runner>alih-alih mendaftarkan root perintah pesaing. Plugin runner harus mendeklarasikanqaRunnersdiopenclaw.plugin.jsondan mengekspor arrayqaRunnerCliRegistrationsyang cocok dariruntime-api.ts. Jaga agarruntime-api.tstetap ringan; eksekusi CLI dan runner yang lazy harus tetap berada di balik entrypoint terpisah. - Tulis atau adaptasi skenario markdown di bawah direktori bertema
qa/scenarios/. - Gunakan helper skenario generik untuk skenario baru.
- Pertahankan alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja.
- Jika perilaku dapat diekspresikan sekali di
qa-lab, letakkan diqa-lab. - Jika perilaku bergantung pada satu transport kanal, pertahankan di Plugin runner atau harness Plugin tersebut.
- Jika sebuah skenario membutuhkan kapabilitas baru yang dapat digunakan oleh lebih dari satu kanal, tambahkan helper generik alih-alih cabang khusus kanal di
suite.ts. - Jika suatu perilaku hanya bermakna untuk satu transport, pertahankan skenario itu tetap khusus transport dan buat hal itu eksplisit dalam kontrak skenario.
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
waitForQaChannelReadywaitForOutboundMessagewaitForNoOutboundformatConversationTranscriptresetBus
Suite pengujian (apa yang berjalan di mana)
Anggap suite ini sebagai “realisme yang meningkat” (dan flakiness/biaya yang meningkat):Unit / integrasi (default)
- Perintah:
pnpm test - Config: sepuluh eksekusi shard berurutan (
vitest.full-*.config.ts) atas project Vitest terscope yang sudah ada - File: inventaris core/unit di bawah
src/**/*.test.ts,packages/**/*.test.ts,test/**/*.test.ts, dan pengujian nodeuiyang di-whitelist yang dicakup olehvitest.unit.config.ts - Cakupan:
- Pengujian unit murni
- Pengujian integrasi in-process (auth gateway, perutean, tooling, parsing, config)
- Regresi deterministik untuk bug yang diketahui
- Ekspektasi:
- Berjalan di CI
- Tidak memerlukan key nyata
- Harus cepat dan stabil
- Catatan project:
pnpm testtanpa target kini menjalankan sebelas config shard yang lebih kecil (core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) alih-alih satu proses root-project native raksasa. Ini memangkas RSS puncak pada mesin yang sibuk dan menghindari pekerjaan auto-reply/extension membuat suite lain kelaparan sumber daya.pnpm test --watchtetap menggunakan graf project root nativevitest.config.ts, karena loop watch multi-shard tidak praktis.pnpm test,pnpm test:watch, danpnpm test:perf:importsmerutekan target file/direktori eksplisit melalui lane terscope terlebih dahulu, sehinggapnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsmenghindari biaya startup penuh root project.pnpm test:changedmemperluas path git yang berubah ke lane terscope yang sama saat diff hanya menyentuh file sumber/pengujian yang dapat dirutekan; edit config/setup tetap menggunakan fallback ke rerun root-project yang luas.pnpm check:changedadalah gate lokal pintar normal untuk pekerjaan sempit. Ini mengklasifikasikan diff ke core, pengujian core, extensions, pengujian extension, apps, docs, metadata rilis, dan tooling, lalu menjalankan lane typecheck/lint/test yang cocok. Perubahan Plugin SDK publik dan kontrak plugin menyertakan validasi extension karena extension bergantung pada kontrak core tersebut. Kenaikan versi yang hanya menyentuh metadata rilis menjalankan pemeriksaan versi/config/dependensi-root yang ditargetkan alih-alih suite penuh, dengan penjaga yang menolak perubahan package di luar field versi tingkat atas.- Pengujian unit ringan impor dari agents, commands, plugins, helper auto-reply,
plugin-sdk, dan area utilitas murni serupa dirutekan melalui laneunit-fast, yang melewatitest/setup-openclaw-runtime.ts; file yang stateful/berat pada runtime tetap di lane yang ada. - File sumber helper
plugin-sdkdancommandstertentu juga memetakan eksekusi mode changed ke pengujian sibling eksplisit di lane ringan tersebut, sehingga edit helper menghindari rerun suite berat penuh untuk direktori itu. auto-replykini memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasireply.*tingkat atas, dan subtreesrc/auto-reply/reply/**. Ini menjaga pekerjaan harness balasan terberat tetap jauh dari pengujian status/chunk/token yang murah.
- Catatan embedded runner:
- Saat Anda mengubah input penemuan message-tool atau konteks runtime Compaction, pertahankan kedua tingkat cakupan.
- Tambahkan regresi helper terfokus untuk batas perutean/normalisasi murni.
- Jaga juga suite integrasi embedded runner tetap sehat:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.ts, dansrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Suite tersebut memverifikasi bahwa id terscope dan perilaku Compaction tetap mengalir
melalui path
run.ts/compact.tsyang nyata; pengujian helper saja bukan pengganti yang memadai untuk path integrasi tersebut.
- Catatan pool:
- Config Vitest dasar kini default ke
threads. - Config Vitest bersama juga menetapkan
isolate: falsedan menggunakan runner non-terisolasi di seluruh root project, config e2e, dan live. - Lane UI root mempertahankan setup dan optimizer
jsdom, tetapi kini juga berjalan pada runner non-terisolasi bersama. - Setiap shard
pnpm testmewarisi defaultthreads+isolate: falseyang sama dari config Vitest bersama. - Launcher bersama
scripts/run-vitest.mjskini juga menambahkan--no-maglevuntuk proses child Node Vitest secara default guna mengurangi churn kompilasi V8 selama eksekusi lokal besar. SetelOPENCLAW_VITEST_ENABLE_MAGLEV=1jika Anda perlu membandingkan dengan perilaku V8 bawaan.
- Config Vitest dasar kini default ke
- Catatan iterasi lokal cepat:
pnpm changed:lanesmenunjukkan lane arsitektural mana yang dipicu oleh sebuah diff.- Hook pre-commit menjalankan
pnpm check:changed --stagedsetelah format/lint bertahap, sehingga commit yang hanya menyentuh core tidak membayar biaya pengujian extension kecuali menyentuh kontrak publik yang berhadapan dengan extension. Commit yang hanya menyentuh metadata rilis tetap berada di lane versi/config/dependensi-root yang ditargetkan. pnpm test:changedmerutekan melalui lane terscope ketika path yang berubah dapat dipetakan dengan bersih ke suite yang lebih kecil.pnpm test:maxdanpnpm test:changed:maxmempertahankan perilaku perutean yang sama, hanya dengan batas worker yang lebih tinggi.- Autoscaling worker lokal sekarang sengaja konservatif dan juga mundur saat load average host sudah tinggi, sehingga beberapa eksekusi Vitest bersamaan secara default lebih sedikit menimbulkan kerusakan.
- Config Vitest dasar menandai file project/config sebagai
forceRerunTriggerssehingga rerun mode changed tetap benar saat wiring pengujian berubah. - Config mempertahankan
OPENCLAW_VITEST_FS_MODULE_CACHEtetap aktif pada host yang didukung; setelOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathjika Anda ingin satu lokasi cache eksplisit untuk profiling langsung.
- Catatan debug performa:
pnpm test:perf:importsmengaktifkan pelaporan durasi impor Vitest plus output rincian impor.pnpm test:perf:imports:changedmembatasi tampilan profiling yang sama ke file yang berubah sejakorigin/main.
pnpm test:perf:changed:bench -- --ref <git-ref>membandingkantest:changedyang dirutekan dengan path root-project native untuk diff yang sudah di-commit tersebut dan mencetak wall time plus RSS maksimum macOS.pnpm test:perf:changed:bench -- --worktreemelakukan benchmark pada tree kotor saat ini dengan merutekan daftar file yang berubah melaluiscripts/test-projects.mjsdan config root Vitest.pnpm test:perf:profile:mainmenulis profil CPU main-thread untuk overhead startup dan transform Vitest/Vite.pnpm test:perf:profile:runnermenulis profil CPU+heap runner untuk suite unit dengan paralelisme file dinonaktifkan.
E2E (smoke gateway)
- Perintah:
pnpm test:e2e - Config:
vitest.e2e.config.ts - File:
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts - Default runtime:
- Menggunakan Vitest
threadsdenganisolate: false, sama seperti 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.
- Menggunakan Vitest
- Override yang berguna:
OPENCLAW_E2E_WORKERS=<n>untuk memaksa jumlah worker (dibatasi hingga 16).OPENCLAW_E2E_VERBOSE=1untuk mengaktifkan kembali output konsol verbose.
- Cakupan:
- Perilaku end-to-end gateway multi-instance
- Permukaan WebSocket/HTTP, pairing Node, dan jaringan yang lebih berat
- Ekspektasi:
- Berjalan di CI (saat diaktifkan di pipeline)
- Tidak memerlukan key nyata
- Lebih banyak komponen bergerak dibanding pengujian unit (bisa lebih lambat)
E2E: smoke backend OpenShell
- Perintah:
pnpm test:e2e:openshell - File:
test/openshell-sandbox.e2e.test.ts - Cakupan:
- Memulai Gateway OpenShell terisolasi di host melalui Docker
- Membuat sandbox dari Dockerfile lokal sementara
- 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 - Memerlukan CLI
openshelllokal plus daemon Docker yang berfungsi - Menggunakan
HOME/XDG_CONFIG_HOMEterisolasi, lalu menghancurkan gateway dan sandbox pengujian
- Hanya opt-in; bukan bagian dari eksekusi default
- Override yang berguna:
OPENCLAW_E2E_OPENSHELL=1untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manualOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshelluntuk menunjuk ke binary CLI non-default atau wrapper script
Live (penyedia nyata + model nyata)
- Perintah:
pnpm test:live - Config:
vitest.live.config.ts - File:
src/**/*.live.test.ts - Default: aktif oleh
pnpm test:live(menyetelOPENCLAW_LIVE_TEST=1) - Cakupan:
- “Apakah penyedia/model ini benar-benar berfungsi hari ini dengan kredensial nyata?”
- Menangkap perubahan format penyedia, keunikan pemanggilan alat, masalah auth, dan perilaku rate limit
- Ekspektasi:
- Secara desain tidak stabil di CI (jaringan nyata, kebijakan penyedia nyata, kuota, outage)
- Menghabiskan uang / menggunakan rate limit
- Utamakan menjalankan subset yang dipersempit alih-alih “semuanya”
- Eksekusi live memuat
~/.profileuntuk mengambil API key yang belum ada. - Secara default, eksekusi live tetap mengisolasi
HOMEdan menyalin materi config/auth ke home pengujian sementara sehingga fixture unit tidak dapat mengubah~/.openclawAnda yang nyata. - Setel
OPENCLAW_LIVE_USE_REAL_HOME=1hanya saat Anda memang ingin pengujian live menggunakan direktori home nyata Anda. pnpm test:livekini default ke mode yang lebih senyap: tetap mempertahankan output progres[live] ..., tetapi menekan notifikasi~/.profiletambahan dan membisukan log bootstrap gateway/obrolan Bonjour. SetelOPENCLAW_LIVE_TEST_QUIET=0jika Anda ingin log startup penuh kembali.- Rotasi API key (khusus penyedia): setel
*_API_KEYSdengan format koma/titik koma atau*_API_KEY_1,*_API_KEY_2(misalnyaOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) atau override per-live melaluiOPENCLAW_LIVE_*_KEY; pengujian mencoba ulang pada respons rate limit. - Output progres/heartbeat:
- Suite live kini mengeluarkan baris progres ke stderr sehingga panggilan penyedia yang lama terlihat tetap aktif bahkan saat penangkapan konsol Vitest senyap.
vitest.live.config.tsmenonaktifkan intersepsi konsol Vitest sehingga baris progres penyedia/gateway mengalir segera selama eksekusi live.- Setel heartbeat model langsung dengan
OPENCLAW_LIVE_HEARTBEAT_MS. - Setel heartbeat gateway/probe dengan
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Suite mana yang harus saya jalankan?
Gunakan tabel keputusan ini:- Mengedit logika/pengujian: jalankan
pnpm test(danpnpm test:coveragejika Anda banyak mengubah) - Menyentuh jaringan gateway / protokol WS / pairing: tambahkan
pnpm test:e2e - Men-debug “bot saya mati” / kegagalan khusus penyedia / pemanggilan alat: jalankan
pnpm test:liveyang dipersempit
Live: penyapuan kapabilitas Node Android
- Pengujian:
src/gateway/android-node.capabilities.live.test.ts - Skrip:
pnpm android:test:integration - Tujuan: memanggil setiap perintah yang saat ini diiklankan oleh Node Android yang terhubung dan menegaskan perilaku kontrak perintah.
- Cakupan:
- Penyiapan manual/prasyarat (suite ini tidak memasang/menjalankan/melakukan pairing aplikasi).
- Validasi
node.invokegateway per perintah untuk Node Android yang dipilih.
- Pra-penyiapan yang diperlukan:
- Aplikasi Android sudah terhubung + dipairing ke gateway.
- Aplikasi tetap berada di foreground.
- Izin/persetujuan capture diberikan untuk kapabilitas yang Anda harapkan lolos.
- Override target opsional:
OPENCLAW_ANDROID_NODE_IDatauOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- Detail penyiapan Android lengkap: Aplikasi Android
Live: smoke model (key profil)
Pengujian live dibagi menjadi dua lapisan sehingga kita dapat mengisolasi kegagalan:- “Model langsung” memberi tahu kita apakah penyedia/model bisa menjawab sama sekali dengan key yang diberikan.
- “Smoke gateway” memberi tahu kita apakah pipeline gateway+agen penuh bekerja untuk model tersebut (sesi, riwayat, alat, kebijakan sandbox, dan sebagainya).
Lapisan 1: Penyelesaian model langsung (tanpa gateway)
- Pengujian:
src/agents/models.profiles.live.test.ts - Tujuan:
- Menginventarisasi model yang ditemukan
- Menggunakan
getApiKeyForModeluntuk memilih model yang Anda miliki kredensialnya - Menjalankan penyelesaian kecil per model (dan regresi yang ditargetkan bila perlu)
- Cara mengaktifkan:
pnpm test:live(atauOPENCLAW_LIVE_TEST=1jika memanggil Vitest secara langsung)
- Setel
OPENCLAW_LIVE_MODELS=modern(atauall, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini dilewati agarpnpm test:livetetap berfokus pada smoke gateway - Cara memilih model:
OPENCLAW_LIVE_MODELS=modernuntuk menjalankan allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)OPENCLAW_LIVE_MODELS=alladalah alias untuk allowlist modern- atau
OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."(allowlist dipisahkan koma) - Penyapuan modern/all secara default menggunakan batas sinyal tinggi yang dikurasi; setel
OPENCLAW_LIVE_MAX_MODELS=0untuk penyapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil.
- Cara memilih penyedia:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(allowlist dipisahkan koma)
- Asal key:
- Secara default: penyimpanan profil dan fallback env
- Setel
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1untuk memaksa hanya penyimpanan profil
- Alasan fitur ini ada:
- Memisahkan “API penyedia rusak / key tidak valid” dari “pipeline agen gateway rusak”
- Memuat regresi kecil dan terisolasi (contoh: replay reasoning OpenAI Responses/Codex Responses + alur tool-call)
Lapisan 2: Smoke Gateway + agen dev (apa yang sebenarnya dilakukan “@openclaw”)
- Pengujian:
src/gateway/gateway-models.profiles.live.test.ts - Tujuan:
- Memutar gateway in-process
- Membuat/menambal sesi
agent:dev:*(override model per eksekusi) - Mengiterasi model-dengan-key dan menegaskan:
- respons yang “bermakna” (tanpa alat)
- pemanggilan alat nyata berfungsi (probe read)
- probe alat tambahan opsional (probe exec+read)
- path regresi OpenAI (hanya tool-call → tindak lanjut) tetap berfungsi
- Detail probe (agar Anda dapat menjelaskan kegagalan dengan cepat):
- probe
read: pengujian menulis file nonce di workspace dan meminta agen untukreadfile itu lalu menggemakan nonce kembali. - probe
exec+read: pengujian meminta agen untuk menulis nonce ke file sementara melaluiexec, lalureadkembali. - probe gambar: pengujian melampirkan PNG yang dihasilkan (kucing + kode acak) dan mengharapkan model mengembalikan
cat <CODE>. - Referensi implementasi:
src/gateway/gateway-models.profiles.live.test.tsdansrc/gateway/live-image-probe.ts.
- probe
- Cara mengaktifkan:
pnpm test:live(atauOPENCLAW_LIVE_TEST=1jika memanggil Vitest secara langsung)
- Cara memilih model:
- Default: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=alladalah alias untuk allowlist modern- Atau setel
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(atau daftar dipisahkan koma) untuk mempersempit - Penyapuan gateway modern/all secara default menggunakan batas sinyal tinggi yang dikurasi; setel
OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0untuk penyapuan modern yang menyeluruh atau angka positif untuk batas yang lebih kecil.
- Cara memilih penyedia (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+ probeexec+read(stres alat) - probe gambar berjalan saat model mengiklankan dukungan input gambar
- Alur (tingkat tinggi):
- Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (
src/gateway/live-image-probe.ts) - Mengirimkannya melalui
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - Gateway mem-parse attachment ke
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - Agen tertanam meneruskan pesan pengguna multimodal ke model
- Penegasan: balasan berisi
cat+ kode tersebut (toleransi OCR: kesalahan kecil diperbolehkan)
- Pengujian menghasilkan PNG kecil dengan “CAT” + kode acak (
- probe
provider/model yang tepat), jalankan:
Live: smoke backend CLI (Claude, Codex, Gemini, atau CLI lokal lain)
- 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.tsmilik extension pemilik. - Aktifkan:
pnpm test:live(atauOPENCLAW_LIVE_TEST=1jika memanggil Vitest secara langsung)OPENCLAW_LIVE_CLI_BACKEND=1
- Default:
- Penyedia/model default:
claude-cli/claude-sonnet-4-6 - Perilaku command/args/gambar berasal dari metadata Plugin backend CLI pemilik.
- Penyedia/model default:
- 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=1untuk mengirim attachment gambar nyata (path disuntikkan ke prompt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"untuk meneruskan path file gambar sebagai arg CLI alih-alih injeksi prompt.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(atau"list") untuk mengendalikan cara arg gambar diteruskan saatIMAGE_ARGdisetel.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1untuk mengirim giliran kedua dan memvalidasi alur resume.OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0untuk menonaktifkan probe kontinuitas sesi yang sama default Claude Sonnet -> Opus (setel ke1untuk memaksanya aktif saat model yang dipilih mendukung target switch).
- Runner Docker berada di
scripts/test-live-cli-backend-docker.sh. - Runner ini menjalankan smoke backend CLI live di dalam image Docker repo sebagai pengguna non-root
node. - Runner ini me-resolve metadata smoke CLI dari extension pemilik, lalu memasang paket CLI Linux yang cocok (
@anthropic-ai/claude-code,@openai/codex, atau@google/gemini-cli) ke prefix writable yang di-cache diOPENCLAW_DOCKER_CLI_TOOLS_DIR(default:~/.cache/openclaw/docker-cli-tools). pnpm test:docker:live-cli-backend:claude-subscriptionmemerlukan OAuth subscription Claude Code portabel melalui~/.claude/.credentials.jsondenganclaudeAiOauth.subscriptionTypeatauCLAUDE_CODE_OAUTH_TOKENdariclaude setup-token. Runner ini pertama-tama membuktikanclaude -plangsung di Docker, lalu menjalankan dua giliran Gateway CLI-backend tanpa mempertahankan env API key Anthropic. Lane subscription ini menonaktifkan probe MCP/tool dan gambar Claude secara default karena Claude saat ini merutekan penggunaan aplikasi pihak ketiga melalui penagihan penggunaan tambahan alih-alih batas paket subscription normal.- Smoke backend CLI live kini menjalankan alur end-to-end yang sama untuk Claude, Codex, dan Gemini: giliran teks, giliran klasifikasi gambar, lalu pemanggilan alat MCP
cronyang diverifikasi melalui CLI gateway. - Smoke default Claude juga menambal sesi dari Sonnet ke Opus dan memverifikasi bahwa sesi yang dilanjutkan masih mengingat catatan sebelumnya.
Live: smoke binding ACP (/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 <agent> --bind here - ikat percakapan message-channel sintetis di tempat
- kirim tindak lanjut normal pada percakapan yang sama
- verifikasi tindak lanjut masuk ke transkrip sesi ACP yang terikat
- kirim
- Aktifkan:
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- Default:
- Agen ACP di Docker:
claude,codex,gemini - Agen ACP untuk
pnpm test:live ...langsung:claude - Kanal sintetis: konteks percakapan gaya DM Slack
- Backend ACP:
acpx
- Agen ACP di Docker:
- Override:
OPENCLAW_LIVE_ACP_BIND_AGENT=claudeOPENCLAW_LIVE_ACP_BIND_AGENT=codexOPENCLAW_LIVE_ACP_BIND_AGENT=geminiOPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,geminiOPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'
- Catatan:
- Lane ini menggunakan permukaan gateway
chat.senddengan field originating-route sintetis khusus admin sehingga pengujian dapat melampirkan konteks message-channel tanpa berpura-pura mengirim secara eksternal. - Saat
OPENCLAW_LIVE_ACP_BIND_AGENT_COMMANDtidak disetel, pengujian menggunakan registri agen bawaan Pluginacpxtertanam untuk agen harness ACP yang dipilih.
- Lane ini menggunakan permukaan gateway
- Runner Docker berada di
scripts/test-live-acp-bind-docker.sh. - Secara default, runner ini menjalankan smoke binding ACP terhadap semua agen CLI live yang didukung secara berurutan:
claude,codex, lalugemini. - Gunakan
OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,OPENCLAW_LIVE_ACP_BIND_AGENTS=codex, atauOPENCLAW_LIVE_ACP_BIND_AGENTS=geminiuntuk mempersempit matriks. - Runner ini memuat
~/.profile, men-stage materi auth CLI yang sesuai ke dalam container, memasangacpxke prefix npm yang writable, lalu memasang CLI live yang diminta (@anthropic-ai/claude-code,@openai/codex, atau@google/gemini-cli) jika belum ada. - Di dalam Docker, runner menetapkan
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpxsehingga acpx mempertahankan env penyedia dari profile yang dimuat tetap tersedia bagi CLI child harness.
Live: smoke harness app-server Codex
- Tujuan: memvalidasi harness Codex milik Plugin melalui metode
agentgateway normal:- muat Plugin
codexbawaan - 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 dapat dilanjutkan
- jalankan
/codex statusdan/codex modelsmelalui jalur perintah gateway yang sama
- muat Plugin
- 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=nonesehingga harness Codex yang rusak tidak dapat lolos dengan diam-diam menggunakan fallback ke Pi. - Auth:
OPENAI_API_KEYdari shell/profile, plus salinan opsional~/.codex/auth.jsondan~/.codex/config.toml
- Runner Docker berada di
scripts/test-live-codex-harness-docker.sh. - Runner ini memuat
~/.profileyang di-mount, meneruskanOPENAI_API_KEY, menyalin file auth Codex CLI saat tersedia, memasang@openai/codexke prefix npm yang writable dan di-mount, men-stage source tree, lalu hanya menjalankan pengujian live Codex-harness. - Docker mengaktifkan probe gambar dan MCP/alat secara default. Setel
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0atauOPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0saat Anda memerlukan eksekusi debug yang lebih sempit. - Docker juga mengekspor
OPENCLAW_AGENT_HARNESS_FALLBACK=none, sesuai dengan config pengujian live sehingga fallbackopenai-codex/*atau Pi tidak dapat menyembunyikan regresi harness Codex.
Resep live yang direkomendasikan
Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling sedikit flakiness-nya:-
Satu model, langsung (tanpa gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
Satu model, 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 penyedia:
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):
- Gemini (API key):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity (OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini (API key):
google/...menggunakan API Gemini (API key).google-antigravity/...menggunakan bridge OAuth Antigravity (endpoint agen bergaya Cloud Code Assist).google-gemini-cli/...menggunakan Gemini CLI lokal di mesin Anda (auth + keunikan tooling yang terpisah).- API Gemini vs Gemini CLI:
- API: OpenClaw memanggil API Gemini yang di-host Google melalui HTTP (auth API key / profil); inilah yang dimaksud sebagian besar pengguna dengan “Gemini”.
- CLI: OpenClaw melakukan shell out ke binary
geminilokal; ini memiliki auth sendiri dan dapat berperilaku berbeda (dukungan streaming/alat/ketidaksamaan 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 key.Kumpulan smoke modern (pemanggilan alat + gambar)
Ini adalah eksekusi “model umum” yang kami harapkan tetap berfungsi:- OpenAI (non-Codex):
openai/gpt-5.4(opsional:openai/gpt-5.4-mini) - OpenAI Codex:
openai-codex/gpt-5.4 - Anthropic:
anthropic/claude-opus-4-6(atauanthropic/claude-sonnet-4-6) - Google (API Gemini):
google/gemini-3.1-pro-previewdangoogle/gemini-3-flash-preview(hindari model Gemini 2.x yang lebih lama) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingdangoogle-antigravity/gemini-3-flash - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
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)
Pilih setidaknya satu per keluarga penyedia:- OpenAI:
openai/gpt-5.4(atauopenai/gpt-5.4-mini) - Anthropic:
anthropic/claude-opus-4-6(atauanthropic/claude-sonnet-4-6) - Google:
google/gemini-3-flash-preview(ataugoogle/gemini-3.1-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
- xAI:
xai/grok-4(atau yang terbaru tersedia) - Mistral:
mistral/… (pilih satu model yang mamputoolsyang telah Anda aktifkan) - Cerebras:
cerebras/… (jika Anda memiliki akses) - LM Studio:
lmstudio/… (lokal; pemanggilan alat bergantung pada mode API)
Vision: pengiriman gambar (attachment → pesan multimodal)
Sertakan setidaknya satu model yang mampu menangani gambar diOPENCLAW_LIVE_GATEWAY_MODELS (varian Claude/Gemini/OpenAI yang mampu vision, dll.) untuk menjalankan probe gambar.
Aggregator / gateway alternatif
Jika Anda memiliki key yang diaktifkan, kami juga mendukung pengujian melalui:- OpenRouter:
openrouter/...(ratusan model; gunakanopenclaw models scanuntuk menemukan kandidat yang mampu tool+image) - OpenCode:
opencode/...untuk Zen danopencode-go/...untuk Go (auth melaluiOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- 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 apa pun yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.)
discoverModels(...) pada mesin Anda + key apa pun yang tersedia.
Kredensial (jangan pernah commit)
Pengujian live menemukan kredensial dengan cara yang sama seperti CLI. Implikasi praktisnya:- Jika CLI berfungsi, pengujian live seharusnya menemukan key yang sama.
-
Jika sebuah pengujian live mengatakan “tidak ada kredensial”, debug dengan cara yang sama seperti Anda men-debug
openclaw models list/ pemilihan model. -
Profil auth per agen:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(inilah yang dimaksud dengan “profile keys” dalam pengujian live) -
Config:
~/.openclaw/openclaw.json(atauOPENCLAW_CONFIG_PATH) -
Direktori state lama:
~/.openclaw/credentials/(disalin ke home live bertahap saat ada, tetapi bukan penyimpanan utama profile-key) -
Eksekusi lokal live secara default menyalin config aktif, file
auth-profiles.jsonper-agen,credentials/lama, dan direktori auth CLI eksternal yang didukung ke home pengujian sementara; home live bertahap melewatiworkspace/dansandboxes/, dan override pathagents.*.workspace/agentDirdihapus agar probe tetap jauh dari workspace host nyata Anda.
~/.profile), 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 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 - Override model opsional:
BYTEPLUS_CODING_MODEL=ark-code-latest
Live media workflow ComfyUI
- Pengujian:
extensions/comfy/comfy.live.test.ts - Aktifkan:
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts - Cakupan:
- Menjalankan path gambar, video, dan
music_generatecomfy bawaan - Melewati setiap kapabilitas kecuali
models.providers.comfy.<capability>dikonfigurasi - Berguna setelah mengubah submission workflow comfy, polling, unduhan, atau registrasi Plugin
- Menjalankan path gambar, video, dan
Live pembuatan gambar
- Pengujian:
src/image-generation/runtime.live.test.ts - Perintah:
pnpm test:live src/image-generation/runtime.live.test.ts - Harness:
pnpm test:live:media image - Cakupan:
- Menginventarisasi setiap Plugin penyedia pembuatan gambar yang terdaftar
- Memuat variabel env penyedia yang hilang dari shell login Anda (
~/.profile) sebelum probing - Menggunakan API key live/env lebih dahulu daripada profil auth yang tersimpan secara default, sehingga key pengujian usang di
auth-profiles.jsontidak menutupi kredensial shell nyata - Melewati penyedia tanpa auth/profil/model yang dapat digunakan
- Menjalankan varian pembuatan gambar bawaan melalui kapabilitas runtime bersama:
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- Penyedia bundel saat ini yang dicakup:
openaigoogle
- Penyempitan opsional:
OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google"OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-2,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=1untuk memaksa auth penyimpanan profil dan mengabaikan override yang hanya dari env
Live pembuatan musik
- Pengujian:
extensions/music-generation-providers.live.test.ts - Aktifkan:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts - Harness:
pnpm test:live:media music - Cakupan:
- Menjalankan jalur penyedia pembuatan musik bundel bersama
- Saat ini mencakup Google dan MiniMax
- Memuat variabel env penyedia dari shell login Anda (
~/.profile) sebelum probing - Menggunakan API key live/env lebih dahulu daripada profil auth yang tersimpan secara default, sehingga key pengujian usang di
auth-profiles.jsontidak menutupi kredensial shell nyata - Melewati penyedia tanpa auth/profil/model yang dapat digunakan
- Menjalankan kedua mode runtime yang dideklarasikan saat tersedia:
generatedengan input hanya prompteditsaat penyedia mendeklarasikancapabilities.edit.enabled
- Cakupan shared-lane saat ini:
google:generate,editminimax:generatecomfy: file live Comfy terpisah, bukan penyapuan bersama ini
- Penyempitan opsional:
OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"
- Perilaku auth opsional:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1untuk memaksa auth penyimpanan profil dan mengabaikan override yang hanya dari env
Live pembuatan video
- Pengujian:
extensions/video-generation-providers.live.test.ts - Aktifkan:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts - Harness:
pnpm test:live:media video - Cakupan:
- Menjalankan jalur penyedia pembuatan video bundel bersama
- Default ke jalur smoke yang aman untuk rilis: penyedia non-FAL, satu permintaan text-to-video per penyedia, prompt lobster satu detik, dan batas operasi per penyedia dari
OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS(180000secara default) - Melewati FAL secara default karena latensi antrean sisi penyedia dapat mendominasi waktu rilis; teruskan
--video-providers falatauOPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"untuk menjalankannya secara eksplisit - Memuat variabel env penyedia dari shell login Anda (
~/.profile) sebelum probing - Menggunakan API key live/env lebih dahulu daripada profil auth yang tersimpan secara default, sehingga key pengujian usang di
auth-profiles.jsontidak menutupi kredensial shell nyata - Melewati penyedia tanpa auth/profil/model yang dapat digunakan
- Secara default hanya menjalankan
generate - Setel
OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1untuk juga menjalankan mode transform yang dideklarasikan saat tersedia:imageToVideosaat penyedia mendeklarasikancapabilities.imageToVideo.enableddan penyedia/model yang dipilih menerima input gambar lokal berbasis buffer dalam penyapuan bersamavideoToVideosaat penyedia mendeklarasikancapabilities.videoToVideo.enableddan penyedia/model yang dipilih menerima input video lokal berbasis buffer dalam penyapuan bersama
- Penyedia
imageToVideoyang saat ini dideklarasikan tetapi dilewati dalam penyapuan bersama:vydrakarenaveo3bundel hanya teks danklingbundel memerlukan URL gambar jarak jauh
- Cakupan Vydra khusus penyedia:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts- file tersebut menjalankan
veo3text-to-video plus laneklingyang secara default menggunakan fixture URL gambar jarak jauh
- Cakupan live
videoToVideosaat ini:runwayhanya saat model yang dipilih adalahrunway/gen4_aleph
- Penyedia
videoToVideoyang saat ini dideklarasikan tetapi dilewati dalam penyapuan bersama:alibaba,qwen,xaikarena jalur tersebut saat ini memerlukan URL referensihttp(s)/ MP4 jarak jauhgooglekarena lane Gemini/Veo bersama saat ini menggunakan input lokal berbasis buffer dan jalur itu tidak diterima dalam penyapuan bersamaopenaikarena lane bersama saat ini tidak memiliki jaminan akses video inpaint/remix khusus org
- Penyempitan opsional:
OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="google,openai,runway"OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""untuk menyertakan setiap penyedia dalam penyapuan default, termasuk FALOPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000untuk mengurangi batas operasi setiap penyedia demi eksekusi smoke yang agresif
- Perilaku auth opsional:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1untuk memaksa auth penyimpanan profil dan mengabaikan override yang hanya dari env
Harness live media
- Perintah:
pnpm test:live:media - Tujuan:
- Menjalankan suite live gambar, musik, dan video bersama melalui satu entrypoint native repo
- Memuat otomatis variabel env penyedia yang hilang dari
~/.profile - Mempersempit otomatis setiap suite ke penyedia yang saat ini memiliki auth yang dapat digunakan secara default
- Menggunakan ulang
scripts/test-live.mjs, sehingga perilaku heartbeat dan mode senyap tetap konsisten
- Contoh:
pnpm test:live:mediapnpm test:live:media image video --providers openai,google,minimaxpnpm test:live:media video --video-providers openai,runway --all-providerspnpm test:live:media music --quiet
Runner Docker (opsional, pemeriksaan “berfungsi di Linux”)
Runner Docker ini terbagi ke dua kelompok:- Runner model live:
test:docker:live-modelsdantest:docker:live-gatewayhanya menjalankan file live profile-key yang cocok di dalam image Docker repo (src/agents/models.profiles.live.test.tsdansrc/gateway/gateway-models.profiles.live.test.ts), dengan me-mount direktori config dan workspace lokal Anda (serta memuat~/.profilejika di-mount). Entrypoint lokal yang cocok adalahtest:live:models-profilesdantest:live:gateway-profiles. - Runner live Docker secara default menggunakan batas smoke yang lebih kecil agar penyapuan Docker penuh tetap praktis:
test:docker:live-modelsdefault keOPENCLAW_LIVE_MAX_MODELS=12, dantest:docker:live-gatewaydefault keOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000, danOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Override variabel env tersebut saat Anda secara eksplisit menginginkan pemindaian menyeluruh yang lebih besar. test:docker:allmembangun image Docker live satu kali melaluitest:docker:live-build, lalu menggunakannya kembali untuk dua lane Docker live.- Runner smoke container:
test:docker:openwebui,test:docker:onboard,test:docker:gateway-network,test:docker:mcp-channels, dantest:docker:pluginsmem-boot satu atau lebih container nyata dan memverifikasi jalur integrasi tingkat lebih tinggi.
- Model langsung:
pnpm test:docker:live-models(skrip:scripts/test-live-models-docker.sh) - Smoke binding ACP:
pnpm test:docker:live-acp-bind(skrip:scripts/test-live-acp-bind-docker.sh) - Smoke backend CLI:
pnpm test:docker:live-cli-backend(skrip:scripts/test-live-cli-backend-docker.sh) - 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 kanal MCP (Gateway yang diseed + bridge stdio + smoke raw Claude notification-frame):
pnpm test:docker:mcp-channels(skrip:scripts/e2e/mcp-channels-docker.sh) - Plugins (smoke install + alias
/plugin+ semantik restart bundel Claude):pnpm test:docker:plugins(skrip:scripts/e2e/plugins-docker.sh)
.pnpm-store, .worktrees, __openclaw_vitest__, dan direktori output .build atau
Gradle lokal aplikasi sehingga eksekusi 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 kanal Telegram/Discord/dll. nyata di dalam container.
test:docker:live-models tetap menjalankan pnpm test:live, jadi teruskan juga
OPENCLAW_LIVE_GATEWAY_* saat Anda perlu mempersempit atau mengecualikan cakupan
live gateway dari lane Docker tersebut.
test:docker:openwebui adalah smoke kompatibilitas tingkat lebih tinggi: 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 penyiapan cold-start-nya sendiri.
Lane ini mengharapkan key model live yang dapat digunakan, dan OPENCLAW_PROFILE_FILE
(~/.profile secara default) adalah cara utama untuk menyediakannya pada eksekusi yang didockerisasi.
Eksekusi yang berhasil mencetak payload JSON kecil seperti { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels sengaja deterministik dan tidak memerlukan akun
Telegram, Discord, atau iMessage nyata. Runner ini mem-boot container Gateway yang diseed,
memulai container kedua yang menjalankan openclaw mcp serve, lalu
memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran,
perilaku antrean peristiwa live, perutean pengiriman keluar, serta notifikasi kanal +
izin gaya Claude melalui bridge MCP stdio nyata. Pemeriksaan notifikasi
menginspeksi frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang
sebenarnya dipancarkan bridge, bukan hanya apa yang kebetulan ditampilkan SDK klien tertentu.
Smoke thread ACP plain-language manual (bukan CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Pertahankan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin diperlukan lagi untuk validasi perutean thread ACP, jadi jangan hapus.
OPENCLAW_CONFIG_DIR=...(default:~/.openclaw) di-mount ke/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(default:~/.openclaw/workspace) di-mount ke/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(default:~/.profile) di-mount ke/home/node/.profiledan dimuat sebelum menjalankan pengujianOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1untuk memverifikasi hanya variabel env yang dimuat dariOPENCLAW_PROFILE_FILE, menggunakan direktori config/workspace sementara dan tanpa mount auth CLI eksternalOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(default:~/.cache/openclaw/docker-cli-tools) di-mount ke/home/node/.npm-globaluntuk instalasi CLI ter-cache di dalam Docker- Direktori/file auth CLI eksternal di bawah
$HOMEdi-mount hanya-baca di bawah/host-auth..., lalu disalin ke/home/node/...sebelum pengujian dimulai- Direktori default:
.minimax - File default:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Eksekusi penyedia 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 sepertiOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Direktori default:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...untuk mempersempit eksekusiOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...untuk memfilter penyedia di dalam containerOPENCLAW_SKIP_DOCKER_BUILD=1untuk menggunakan ulang imageopenclaw:local-liveyang ada untuk eksekusi ulang yang tidak memerlukan rebuildOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1untuk memastikan kredensial berasal dari penyimpanan profil (bukan env)OPENCLAW_OPENWEBUI_MODEL=...untuk memilih model yang diekspos oleh gateway untuk smoke Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...untuk mengoverride prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUIOPENWEBUI_IMAGE=...untuk mengoverride tag image Open WebUI yang dipin
Kewarasan docs
Jalankan pemeriksaan docs setelah mengedit docs:pnpm check:docs.
Jalankan validasi anchor Mintlify penuh saat Anda juga memerlukan pemeriksaan heading dalam halaman: pnpm docs:check-links:anchors.
Regresi offline (aman untuk CI)
Ini adalah regresi “pipeline nyata” tanpa penyedia nyata:- Pemanggilan alat Gateway (mock OpenAI, gateway nyata + loop agen):
src/gateway/gateway.test.ts(kasus: “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Wizard Gateway (WS
wizard.start/wizard.next, penulisan config + auth ditegakkan):src/gateway/gateway.test.ts(kasus: “runs wizard over ws and writes auth token config”)
Evaluasi keandalan agen (Skills)
Kami sudah memiliki beberapa pengujian aman-CI yang berperilaku seperti “evaluasi keandalan agen”:- Mock tool-calling melalui gateway nyata + loop agen (
src/gateway/gateway.test.ts). - Alur wizard end-to-end yang memvalidasi wiring sesi dan efek config (
src/gateway/gateway.test.ts).
- Pengambilan keputusan: saat Skills dicantumkan dalam prompt, apakah agen memilih Skill yang tepat (atau menghindari yang tidak relevan)?
- Kepatuhan: apakah agen membaca
SKILL.mdsebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? - Kontrak alur kerja: skenario multi-giliran yang menegaskan urutan alat, carryover riwayat sesi, dan batas sandbox.
- Runner skenario yang menggunakan penyedia mock untuk menegaskan pemanggilan alat + urutannya, pembacaan file skill, dan wiring sesi.
- Sekumpulan kecil skenario yang berfokus pada skill (gunakan vs hindari, pemfilteran, injeksi prompt).
- Evaluasi live opsional (opt-in, dipagari env) hanya setelah suite aman-CI tersedia.
Pengujian kontrak (bentuk Plugin dan kanal)
Pengujian kontrak memverifikasi bahwa setiap Plugin dan kanal yang terdaftar sesuai dengan kontrak antarmukanya. Pengujian ini mengiterasi semua Plugin yang ditemukan dan menjalankan rangkaian penegasan bentuk dan perilaku. Lane unitpnpm test default sengaja
melewati file seam bersama dan smoke ini; jalankan perintah kontrak secara eksplisit
saat Anda menyentuh permukaan kanal atau penyedia bersama.
Perintah
- Semua kontrak:
pnpm test:contracts - Hanya kontrak kanal:
pnpm test:contracts:channels - Hanya kontrak penyedia:
pnpm test:contracts:plugins
Kontrak kanal
Terletak disrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - Bentuk dasar Plugin (id, nama, kapabilitas)
- setup - Kontrak wizard penyiapan
- session-binding - Perilaku binding sesi
- outbound-payload - Struktur payload pesan
- inbound - Penanganan pesan masuk
- actions - Handler aksi kanal
- threading - Penanganan ID thread
- directory - API direktori/roster
- group-policy - Penegakan kebijakan grup
Kontrak status penyedia
Terletak disrc/plugins/contracts/*.contract.test.ts.
- status - Probe status kanal
- registry - Bentuk registri Plugin
Kontrak penyedia
Terletak disrc/plugins/contracts/*.contract.test.ts:
- auth - Kontrak alur auth
- auth-choice - Pilihan/seleksi auth
- catalog - API katalog model
- discovery - Penemuan Plugin
- loader - Pemuatan Plugin
- runtime - Runtime penyedia
- shape - Bentuk/antarmuka Plugin
- wizard - Wizard penyiapan
Kapan dijalankan
- Setelah mengubah ekspor atau subpath plugin-sdk
- Setelah menambahkan atau memodifikasi Plugin kanal atau penyedia
- Setelah me-refactor registrasi atau penemuan Plugin
Menambahkan regresi (panduan)
Saat Anda memperbaiki masalah penyedia/model yang ditemukan secara live:- Tambahkan regresi yang aman-CI jika memungkinkan (penyedia mock/stub, atau tangkap transformasi bentuk permintaan yang tepat)
- Jika secara inheren hanya live (rate limit, kebijakan auth), pertahankan pengujian live tetap sempit dan opt-in melalui variabel env
- Utamakan menargetkan lapisan terkecil yang menangkap bug:
- bug konversi/replay permintaan penyedia → pengujian model langsung
- bug pipeline sesi/riwayat/alat gateway → smoke live gateway atau pengujian mock gateway yang aman-CI
- Guardrail traversal SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsmenurunkan satu target sampel per kelas SecretRef dari metadata registri (listSecretTargetRegistryEntries()), lalu menegaskan bahwa id exec segmen traversal ditolak.- Jika Anda menambahkan keluarga target SecretRef
includeInPlanbaru disrc/secrets/target-registry-data.ts, perbaruiclassifyTargetClassdalam pengujian tersebut. Pengujian ini sengaja gagal pada id target yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam.