Langsung ke konten utama

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
Saat Anda menyentuh pengujian atau ingin keyakinan ekstra:
  • Gate cakupan: pnpm test:coverage
  • Suite E2E: pnpm test:e2e
Saat men-debug penyedia/model nyata (memerlukan kredensial nyata):
  • 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_KEY disetel, jalankan openclaw models list --provider moonshot --json, lalu jalankan openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json yang terisolasi terhadap moonshot/kimi-k2.6. Verifikasi bahwa JSON melaporkan Moonshot/K2.6 dan transkrip asisten menyimpan usage.cost yang dinormalisasi.
Tip: saat Anda hanya memerlukan satu kasus gagal, utamakan mempersempit pengujian live melalui variabel env allowlist yang dijelaskan di bawah.

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-channel default ke konkurensi 4 (dibatasi oleh jumlah skenario yang dipilih). Gunakan --concurrency <count> untuk menyetel jumlah worker, atau --concurrency 1 untuk lane serial lama.
    • Keluar dengan kode non-zero saat ada skenario yang gagal. Gunakan --allow-failures saat Anda ingin artefak tanpa kode keluar gagal.
    • Mendukung mode penyedia live-frontier, mock-openai, dan aimock. aimock memulai server penyedia berbasis AIMock lokal untuk cakupan fixture dan mock protokol eksperimental tanpa menggantikan lane mock-openai yang 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 suite di 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_HOME bila 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 mengekspos openclaw 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.1 secara default. Override dengan OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE saat Anda perlu menguji image yang berbeda.
    • Matrix tidak mengekspos flag sumber kredensial bersama karena 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, dan OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. ID grup harus berupa ID chat Telegram numerik.
    • Mendukung --credential-source convex untuk kredensial gabungan bersama. Gunakan mode env secara default, atau setel OPENCLAW_QA_CREDENTIAL_SOURCE=convex untuk ikut serta pada lease gabungan.
    • Keluar dengan kode non-zero saat ada skenario yang gagal. Gunakan --allow-failures saat 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 @BotFather untuk 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/....
Lane transport live berbagi satu kontrak standar sehingga transport baru tidak menyimpang: qa-channel tetap menjadi suite QA sintetis yang luas dan bukan bagian dari matriks cakupan transport live.
LaneCanaryPemfilteran penyebutanBlok allowlistBalasan tingkat atasLanjutkan setelah restartTindak lanjut threadIsolasi threadObservasi reaksiPerintah help
Matrixxxxxxxxx
Telegramxx

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/
Variabel env yang diperlukan:
  • OPENCLAW_QA_CONVEX_SITE_URL (misalnya 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 ci di CI, maintainer selain itu)
Variabel env 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 jejak opsional)
  • OPENCLAW_QA_ALLOW_INSECURE_HTTP=1 mengizinkan URL Convex http:// 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:
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 <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 }
    • Penjaga 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 kanal ke QA

Menambahkan kanal ke sistem QA markdown memerlukan tepat dua hal:
  1. Adaptor transport untuk kanal tersebut.
  2. Paket skenario yang menjalankan kontrak kanal tersebut.
Jangan tambahkan root perintah QA tingkat atas baru ketika host 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-channel lama
Plugin runner memiliki kontrak transport:
  • bagaimana openclaw qa <runner> dipasang di bawah root qa bersama
  • 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
Batas adopsi minimum untuk kanal baru adalah:
  1. Pertahankan qa-lab sebagai pemilik root qa bersama.
  2. Implementasikan runner transport pada seam host qa-lab bersama.
  3. Pertahankan mekanisme khusus transport di dalam Plugin runner atau harness kanal.
  4. Mount runner sebagai openclaw qa <runner> alih-alih mendaftarkan root perintah pesaing. Plugin runner harus mendeklarasikan qaRunners di openclaw.plugin.json dan mengekspor array qaRunnerCliRegistrations yang cocok dari runtime-api.ts. Jaga agar runtime-api.ts tetap ringan; eksekusi CLI dan runner yang lazy harus tetap berada di balik entrypoint terpisah.
  5. Tulis atau adaptasi skenario markdown di bawah direktori bertema qa/scenarios/.
  6. Gunakan helper skenario generik untuk skenario baru.
  7. Pertahankan alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja.
Aturan keputusan ini ketat:
  • Jika perilaku dapat diekspresikan sekali di qa-lab, letakkan di qa-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.
Nama helper generik yang disukai untuk skenario baru adalah:
  • waitForTransportReady
  • waitForChannelReady
  • injectInboundMessage
  • injectOutboundMessage
  • waitForTransportOutboundMessage
  • waitForChannelOutboundMessage
  • waitForNoTransportOutbound
  • getTransportSnapshot
  • readTransportMessage
  • readTransportTranscript
  • formatTransportTranscript
  • resetTransport
Alias kompatibilitas tetap tersedia untuk skenario yang ada, termasuk:
  • waitForQaChannelReady
  • waitForOutboundMessage
  • waitForNoOutbound
  • formatConversationTranscript
  • resetBus
Pekerjaan kanal baru harus menggunakan nama helper generik. Alias kompatibilitas ada untuk menghindari migrasi serentak, bukan sebagai model untuk penulisan skenario baru.

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 node ui yang di-whitelist yang dicakup oleh vitest.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 test tanpa target kini menjalankan sebelas config shard yang lebih kecil (core-unit-src, core-unit-security, core-unit-ui, core-unit-support, core-support-boundary, core-contracts, core-bundled, core-runtime, agentic, auto-reply, extensions) alih-alih satu proses 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 --watch tetap menggunakan graf project root native vitest.config.ts, karena loop watch multi-shard tidak praktis.
    • pnpm test, pnpm test:watch, dan pnpm test:perf:imports merutekan target file/direktori eksplisit melalui lane terscope terlebih dahulu, sehingga pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts menghindari biaya startup penuh root project.
    • pnpm test:changed memperluas 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:changed adalah 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 lane unit-fast, yang melewati test/setup-openclaw-runtime.ts; file yang stateful/berat pada runtime tetap di lane yang ada.
    • File sumber helper plugin-sdk dan commands tertentu 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-reply kini memiliki tiga bucket khusus: helper core tingkat atas, pengujian integrasi reply.* tingkat atas, dan subtree src/auto-reply/reply/**. Ini menjaga pekerjaan harness balasan terberat tetap 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, dan src/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.ts yang 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: false dan 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 test mewarisi default threads + isolate: false yang sama dari config Vitest bersama.
    • Launcher bersama scripts/run-vitest.mjs kini juga menambahkan --no-maglev untuk proses child Node Vitest secara default guna mengurangi churn kompilasi V8 selama eksekusi lokal besar. Setel OPENCLAW_VITEST_ENABLE_MAGLEV=1 jika Anda perlu membandingkan dengan perilaku V8 bawaan.
  • Catatan iterasi lokal cepat:
    • pnpm changed:lanes menunjukkan lane arsitektural mana yang dipicu oleh sebuah diff.
    • Hook pre-commit menjalankan pnpm check:changed --staged setelah 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:changed merutekan melalui lane terscope ketika path yang berubah dapat dipetakan dengan bersih ke suite yang lebih kecil.
    • pnpm test:max dan pnpm test:changed:max mempertahankan 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 forceRerunTriggers sehingga rerun mode changed tetap benar saat wiring pengujian berubah.
    • Config mempertahankan OPENCLAW_VITEST_FS_MODULE_CACHE tetap aktif pada host yang didukung; setel OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path jika Anda ingin satu lokasi cache eksplisit untuk profiling langsung.
  • Catatan debug performa:
    • pnpm test:perf:imports mengaktifkan pelaporan durasi 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 <git-ref> membandingkan test:changed yang 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 -- --worktree melakukan benchmark pada tree kotor saat ini dengan merutekan daftar file yang berubah melalui scripts/test-projects.mjs dan config 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)

  • Perintah: pnpm test:e2e
  • Config: vitest.e2e.config.ts
  • File: src/**/*.e2e.test.ts, test/**/*.e2e.test.ts
  • Default runtime:
    • Menggunakan Vitest threads dengan isolate: 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.
  • Override yang berguna:
    • OPENCLAW_E2E_WORKERS=<n> 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
    • 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 openshell lokal plus daemon Docker yang berfungsi
    • Menggunakan HOME / XDG_CONFIG_HOME terisolasi, lalu menghancurkan gateway dan sandbox pengujian
  • Override yang berguna:
    • OPENCLAW_E2E_OPENSHELL=1 untuk mengaktifkan pengujian saat menjalankan suite e2e yang lebih luas secara manual
    • OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell untuk menunjuk ke 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 (menyetel OPENCLAW_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 ~/.profile untuk mengambil API key yang belum ada.
  • 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 ingin 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 penyedia): 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 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.ts menonaktifkan 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 (dan pnpm test:coverage jika 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:live yang 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.invoke gateway 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_ID atau OPENCLAW_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 getApiKeyForModel untuk memilih model yang Anda miliki kredensialnya
    • Menjalankan penyelesaian kecil per model (dan regresi yang ditargetkan bila perlu)
  • Cara mengaktifkan:
    • pnpm test:live (atau OPENCLAW_LIVE_TEST=1 jika memanggil Vitest secara langsung)
  • Setel OPENCLAW_LIVE_MODELS=modern (atau all, alias untuk modern) agar suite ini benar-benar berjalan; jika tidak, suite ini dilewati agar pnpm test:live tetap berfokus 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)
    • Penyapuan modern/all secara default menggunakan batas sinyal tinggi yang dikurasi; setel OPENCLAW_LIVE_MAX_MODELS=0 untuk 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=1 untuk 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 untuk read file itu lalu menggemakan nonce kembali.
    • probe exec+read: pengujian meminta agen untuk menulis nonce ke file sementara melalui exec, lalu read kembali.
    • probe gambar: pengujian melampirkan PNG yang dihasilkan (kucing + kode acak) dan mengharapkan model mengembalikan cat <CODE>.
    • Referensi implementasi: src/gateway/gateway-models.profiles.live.test.ts dan src/gateway/live-image-probe.ts.
  • Cara mengaktifkan:
    • pnpm test:live (atau OPENCLAW_LIVE_TEST=1 jika memanggil Vitest secara langsung)
  • Cara memilih model:
    • Default: allowlist modern (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
    • OPENCLAW_LIVE_GATEWAY_MODELS=all adalah alias untuk allowlist modern
    • Atau setel OPENCLAW_LIVE_GATEWAY_MODELS="provider/model" (atau daftar dipisahkan koma) untuk mempersempit
    • Penyapuan gateway modern/all secara default menggunakan batas sinyal tinggi yang dikurasi; setel OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0 untuk 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 + probe exec+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 agent attachments: [{ 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)
Tip: untuk melihat apa yang dapat Anda uji di mesin Anda (dan ID provider/model yang tepat), jalankan:
openclaw models list
openclaw models list --json

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.ts milik extension pemilik.
  • Aktifkan:
    • pnpm test:live (atau OPENCLAW_LIVE_TEST=1 jika 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.
  • 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 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 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 default Claude Sonnet -> Opus (setel ke 1 untuk memaksanya aktif saat model yang dipilih mendukung target switch).
Contoh:
OPENCLAW_LIVE_CLI_BACKEND=1 \
  OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4" \
  pnpm test:live src/gateway/gateway-cli-backend.live.test.ts
Resep Docker:
pnpm test:docker:live-cli-backend
Resep Docker penyedia tunggal:
pnpm test:docker:live-cli-backend:claude
pnpm test:docker:live-cli-backend:claude-subscription
pnpm test:docker:live-cli-backend:codex
pnpm test:docker:live-cli-backend:gemini
Catatan:
  • 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 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. 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 cron yang 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
  • Aktifkan:
    • pnpm test:live src/gateway/gateway-acp-bind.live.test.ts
    • OPENCLAW_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
  • Override:
    • OPENCLAW_LIVE_ACP_BIND_AGENT=claude
    • OPENCLAW_LIVE_ACP_BIND_AGENT=codex
    • OPENCLAW_LIVE_ACP_BIND_AGENT=gemini
    • OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini
    • OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'
  • Catatan:
    • Lane ini menggunakan permukaan gateway chat.send dengan 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_COMMAND tidak disetel, pengujian menggunakan registri agen bawaan Plugin acpx tertanam untuk agen harness ACP yang dipilih.
Contoh:
OPENCLAW_LIVE_ACP_BIND=1 \
  OPENCLAW_LIVE_ACP_BIND_AGENT=claude \
  pnpm test:live src/gateway/gateway-acp-bind.live.test.ts
Resep Docker:
pnpm test:docker:live-acp-bind
Resep Docker agen tunggal:
pnpm test:docker:live-acp-bind:claude
pnpm test:docker:live-acp-bind:codex
pnpm test:docker:live-acp-bind:gemini
Catatan Docker:
  • 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, 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 memuat ~/.profile, men-stage materi auth CLI yang sesuai ke dalam container, memasang acpx ke prefix npm yang writable, lalu memasang CLI live yang diminta (@anthropic-ai/claude-code, @openai/codex, atau @google/gemini-cli) jika belum ada.
  • Di dalam Docker, runner menetapkan OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx sehingga 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 agent gateway 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 dapat dilanjutkan
    • jalankan /codex status dan /codex models melalui jalur 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 dapat lolos dengan diam-diam menggunakan fallback ke Pi.
  • Auth: OPENAI_API_KEY dari shell/profile, plus salinan opsional ~/.codex/auth.json dan ~/.codex/config.toml
Resep lokal:
source ~/.profile
OPENCLAW_LIVE_CODEX_HARNESS=1 \
  OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 \
  OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 \
  OPENCLAW_LIVE_CODEX_HARNESS_MODEL=codex/gpt-5.4 \
  pnpm test:live -- src/gateway/gateway-codex-harness.live.test.ts
Resep Docker:
source ~/.profile
pnpm test:docker:live-codex-harness
Catatan Docker:
  • Runner Docker berada di scripts/test-live-codex-harness-docker.sh.
  • Runner ini memuat ~/.profile yang di-mount, meneruskan OPENAI_API_KEY, menyalin file auth Codex CLI saat tersedia, memasang @openai/codex ke 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=0 atau OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 saat Anda memerlukan eksekusi debug yang lebih sempit.
  • Docker juga mengekspor OPENCLAW_AGENT_HARNESS_FALLBACK=none, sesuai dengan config pengujian live sehingga fallback openai-codex/* atau Pi tidak dapat menyembunyikan regresi harness Codex.

Resep live yang direkomendasikan

Allowlist yang sempit dan eksplisit adalah yang tercepat dan paling 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
Catatan:
  • 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 gemini lokal; 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 (atau anthropic/claude-sonnet-4-6)
  • Google (API Gemini): google/gemini-3.1-pro-preview dan google/gemini-3-flash-preview (hindari model Gemini 2.x yang lebih lama)
  • Google (Antigravity): google-antigravity/claude-opus-4-6-thinking dan google-antigravity/gemini-3-flash
  • Z.AI (GLM): zai/glm-4.7
  • MiniMax: minimax/MiniMax-M2.7
Jalankan smoke gateway dengan alat + gambar: OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts

Baseline: pemanggilan alat (Read + Exec opsional)

Pilih setidaknya satu per keluarga penyedia:
  • OpenAI: openai/gpt-5.4 (atau openai/gpt-5.4-mini)
  • Anthropic: anthropic/claude-opus-4-6 (atau anthropic/claude-sonnet-4-6)
  • Google: google/gemini-3-flash-preview (atau google/gemini-3.1-pro-preview)
  • Z.AI (GLM): zai/glm-4.7
  • MiniMax: minimax/MiniMax-M2.7
Cakupan tambahan opsional (bagus untuk dimiliki):
  • xAI: xai/grok-4 (atau yang terbaru tersedia)
  • Mistral: mistral/… (pilih satu model yang mampu tools yang 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 di OPENCLAW_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; gunakan openclaw models scan untuk menemukan kandidat yang mampu tool+image)
  • OpenCode: opencode/... untuk Zen dan opencode-go/... untuk Go (auth melalui OPENCODE_API_KEY / OPENCODE_ZEN_API_KEY)
Lebih banyak penyedia yang dapat Anda sertakan dalam matriks live (jika Anda memiliki kredensial/config):
  • Bawaan: openai, openai-codex, anthropic, google, google-vertex, google-antigravity, google-gemini-cli, zai, openrouter, opencode, opencode-go, xai, groq, cerebras, mistral, github-copilot
  • Melalui models.providers (endpoint kustom): minimax (cloud/API), plus proxy apa pun yang kompatibel dengan OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, dll.)
Tip: jangan mencoba hardcode “semua model” di dokumen. Daftar otoritatif adalah apa pun yang dikembalikan 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 (atau OPENCLAW_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.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 jauh dari workspace host nyata Anda.
Jika Anda ingin bergantung pada key env (misalnya diekspor di ~/.profile), jalankan pengujian lokal setelah source ~/.profile, atau gunakan runner Docker di bawah (runner tersebut dapat me-mount ~/.profile ke 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_generate comfy bawaan
    • Melewati setiap kapabilitas kecuali models.providers.comfy.<capability> dikonfigurasi
    • Berguna setelah mengubah submission workflow comfy, polling, unduhan, atau registrasi Plugin

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.json tidak menutupi kredensial shell nyata
    • Melewati penyedia tanpa auth/profil/model yang dapat digunakan
    • Menjalankan varian pembuatan gambar bawaan melalui kapabilitas runtime bersama:
      • google:flash-generate
      • google:pro-generate
      • google:pro-edit
      • openai:default-generate
  • Penyedia bundel saat ini yang dicakup:
    • openai
    • google
  • 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=1 untuk 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.json tidak menutupi kredensial shell nyata
    • Melewati penyedia tanpa auth/profil/model yang dapat digunakan
    • Menjalankan kedua mode runtime yang dideklarasikan saat tersedia:
      • generate dengan input hanya prompt
      • edit saat penyedia mendeklarasikan capabilities.edit.enabled
    • Cakupan shared-lane saat ini:
      • google: generate, edit
      • minimax: generate
      • comfy: 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=1 untuk 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 (180000 secara default)
    • Melewati FAL secara default karena latensi antrean sisi penyedia dapat mendominasi waktu rilis; teruskan --video-providers fal atau OPENCLAW_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.json tidak 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=1 untuk juga menjalankan mode transform yang dideklarasikan saat tersedia:
      • imageToVideo saat penyedia mendeklarasikan capabilities.imageToVideo.enabled dan penyedia/model yang dipilih menerima input gambar lokal berbasis buffer dalam penyapuan bersama
      • videoToVideo saat penyedia mendeklarasikan capabilities.videoToVideo.enabled dan penyedia/model yang dipilih menerima input video lokal berbasis buffer dalam penyapuan bersama
    • Penyedia imageToVideo yang saat ini dideklarasikan tetapi dilewati dalam penyapuan bersama:
      • vydra karena veo3 bundel hanya teks dan kling bundel 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 veo3 text-to-video plus lane kling yang secara default menggunakan fixture URL gambar jarak jauh
    • Cakupan live videoToVideo saat ini:
      • runway hanya saat model yang dipilih adalah runway/gen4_aleph
    • Penyedia videoToVideo yang saat ini dideklarasikan tetapi dilewati dalam penyapuan bersama:
      • alibaba, qwen, xai karena jalur 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 jalur itu tidak diterima dalam penyapuan bersama
      • openai karena 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 FAL
    • OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000 untuk mengurangi batas operasi setiap penyedia demi eksekusi smoke yang agresif
  • Perilaku auth opsional:
    • OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 untuk 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:media
    • pnpm test:live:media image video --providers openai,google,minimax
    • pnpm test:live:media video --video-providers openai,runway --all-providers
    • pnpm test:live:media music --quiet

Runner Docker (opsional, pemeriksaan “berfungsi di Linux”)

Runner Docker ini terbagi ke dua kelompok:
  • Runner model live: test:docker:live-models dan test:docker:live-gateway hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (src/agents/models.profiles.live.test.ts dan src/gateway/gateway-models.profiles.live.test.ts), dengan me-mount direktori config dan workspace lokal Anda (serta memuat ~/.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 penyapuan Docker penuh tetap praktis: test:docker:live-models default ke OPENCLAW_LIVE_MAX_MODELS=12, dan test:docker:live-gateway default ke OPENCLAW_LIVE_GATEWAY_SMOKE=1, OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8, OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000, dan OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Override variabel env tersebut saat Anda secara eksplisit menginginkan pemindaian menyeluruh yang lebih besar.
  • test:docker:all membangun image Docker live satu kali melalui test:docker:live-build, lalu menggunakannya kembali untuk dua lane Docker live.
  • Runner smoke container: test:docker:openwebui, test:docker:onboard, test:docker:gateway-network, test:docker:mcp-channels, dan test:docker:plugins mem-boot satu atau lebih container nyata dan memverifikasi jalur integrasi tingkat lebih tinggi.
Runner Docker model live juga hanya melakukan bind-mount home auth CLI yang diperlukan (atau semua yang didukung saat eksekusi tidak dipersempit), lalu menyalinnya ke home container sebelum eksekusi agar OAuth CLI eksternal dapat me-refresh token tanpa mengubah penyimpanan auth host:
  • 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)
Runner Docker model live juga melakukan bind-mount checkout saat ini hanya-baca dan men-stage-nya ke workdir sementara di dalam container. Ini menjaga image runtime tetap ramping sambil tetap menjalankan Vitest terhadap source/config lokal Anda yang persis. Langkah staging melewati cache lokal besar dan output build aplikasi seperti .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.
Variabel env 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 dimuat sebelum menjalankan pengujian
  • OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1 untuk memverifikasi hanya variabel env yang dimuat dari OPENCLAW_PROFILE_FILE, menggunakan direktori config/workspace sementara dan tanpa mount auth CLI eksternal
  • OPENCLAW_DOCKER_CLI_TOOLS_DIR=... (default: ~/.cache/openclaw/docker-cli-tools) di-mount ke /home/node/.npm-global untuk instalasi CLI ter-cache di dalam Docker
  • Direktori/file auth CLI eksternal di bawah $HOME di-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 seperti OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
  • OPENCLAW_LIVE_GATEWAY_MODELS=... / OPENCLAW_LIVE_MODELS=... untuk mempersempit eksekusi
  • OPENCLAW_LIVE_GATEWAY_PROVIDERS=... / OPENCLAW_LIVE_PROVIDERS=... untuk memfilter penyedia di dalam container
  • OPENCLAW_SKIP_DOCKER_BUILD=1 untuk menggunakan ulang image openclaw:local-live yang ada untuk eksekusi ulang yang tidak memerlukan rebuild
  • OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 untuk memastikan kredensial berasal dari penyimpanan profil (bukan env)
  • OPENCLAW_OPENWEBUI_MODEL=... untuk memilih model yang diekspos oleh gateway untuk smoke Open WebUI
  • OPENCLAW_OPENWEBUI_PROMPT=... untuk mengoverride prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI
  • OPENWEBUI_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).
Yang masih kurang untuk Skills (lihat Skills):
  • Pengambilan keputusan: saat Skills dicantumkan 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.
Evaluasi mendatang harus tetap deterministik terlebih dahulu:
  • 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 unit pnpm 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 di src/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 di src/plugins/contracts/*.contract.test.ts.
  • status - Probe status kanal
  • registry - Bentuk registri Plugin

Kontrak penyedia

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
  • 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
Pengujian kontrak berjalan di CI dan tidak memerlukan API key nyata.

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.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 tersebut. Pengujian ini sengaja gagal pada id target yang tidak terklasifikasi sehingga kelas baru tidak dapat dilewati secara diam-diam.