Tests
OpenClaw hat drei Vitest-Suites (Unit/Integration, E2E, Live) und eine kleine Gruppe von Docker-Runnern. Dieses Dokument ist ein Leitfaden dazu, wie wir testen:- Was jede Suite abdeckt (und was sie bewusst nicht abdeckt)
- Welche Befehle Sie für gängige Workflows ausführen sollten (lokal, vor dem Push, Debugging)
- Wie Live-Tests Anmeldedaten erkennen und Modelle/Provider auswählen
- Wie Sie Regressionstests für reale Modell-/Provider-Probleme hinzufügen
Schnellstart
An den meisten Tagen:- Vollständige Prüfkette (vor dem Push erwartet):
pnpm build && pnpm check && pnpm test - Schnellere lokale Ausführung der vollständigen Suite auf einem leistungsstarken Rechner:
pnpm test:max - Direkte Vitest-Watch-Schleife:
pnpm test:watch - Direktes Targeting von Dateien leitet jetzt auch Erweiterungs-/Kanalpfade weiter:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Bevorzugen Sie zuerst gezielte Ausführungen, wenn Sie an einem einzelnen Fehler iterieren.
- Docker-gestützte QA-Site:
pnpm qa:lab:up - Linux-VM-gestützte QA-Strecke:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
- Coverage-Prüfung:
pnpm test:coverage - E2E-Suite:
pnpm test:e2e
- Live-Suite (Modelle + Gateway-Tool-/Bild-Prüfungen):
pnpm test:live - Eine einzelne Live-Datei ohne viel Ausgabe ausführen:
pnpm test:live -- src/agents/models.profiles.live.test.ts
QA-spezifische Runner
Diese Befehle stehen neben den Haupttest-Suites zur Verfügung, wenn Sie die Realitätsnähe von QA-lab benötigen:pnpm openclaw qa suite- Führt Repo-gestützte QA-Szenarien direkt auf dem Host aus.
- Führt standardmäßig mehrere ausgewählte Szenarien parallel mit isolierten Gateway-Workern aus, mit bis zu 64 Workern oder der Anzahl der ausgewählten Szenarien. Verwenden Sie
--concurrency <count>, um die Anzahl der Worker anzupassen, oder--concurrency 1für die ältere serielle Strecke.
pnpm openclaw qa suite --runner multipass- Führt dieselbe QA-Suite in einer wegwerfbaren Multipass-Linux-VM aus.
- Behält dasselbe Szenarioauswahlverhalten wie
qa suiteauf dem Host bei. - Verwendet dieselben Flags zur Auswahl von Providern/Modellen wie
qa suite. - Live-Ausführungen leiten die unterstützten QA-Authentifizierungseingaben weiter, die für den Gast praktikabel sind: umgebungsvariablenbasierte Provider-Schlüssel, den QA-Live-Provider-Konfigurationspfad und
CODEX_HOME, falls vorhanden. - Ausgabeverzeichnisse müssen unter dem Repo-Root bleiben, damit der Gast über den eingebundenen Workspace zurückschreiben kann.
- Schreibt den normalen QA-Bericht + die Zusammenfassung sowie Multipass-Logs unter
.artifacts/qa-e2e/....
pnpm qa:lab:up- Startet die Docker-gestützte QA-Site für operatorähnliche QA-Arbeit.
pnpm openclaw qa matrix- Führt die Matrix-Live-QA-Strecke gegen einen wegwerfbaren, Docker-gestützten Tuwunel-Homeserver aus.
- Stellt drei temporäre Matrix-Benutzer (
driver,sut,observer) sowie einen privaten Raum bereit und startet dann ein untergeordnetes QA-Gateway mit dem echten Matrix-Plugin als SUT-Transport. - Verwendet standardmäßig das festgelegte stabile Tuwunel-Image
ghcr.io/matrix-construct/tuwunel:v1.5.1. Überschreiben Sie es mitOPENCLAW_QA_MATRIX_TUWUNEL_IMAGE, wenn Sie ein anderes Image testen müssen. - Schreibt einen Matrix-QA-Bericht, eine Zusammenfassung und ein Artefakt mit beobachteten Ereignissen unter
.artifacts/qa-e2e/....
pnpm openclaw qa telegram- Führt die Telegram-Live-QA-Strecke gegen eine echte private Gruppe aus, unter Verwendung der Driver- und SUT-Bot-Tokens aus der Umgebung.
- Erfordert
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENundOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Die Gruppen-ID muss die numerische Telegram-Chat-ID sein. - Erfordert zwei unterschiedliche Bots in derselben privaten Gruppe, wobei der SUT-Bot einen Telegram-Benutzernamen bereitstellen muss.
- Aktivieren Sie für eine stabile Bot-zu-Bot-Beobachtung den Bot-to-Bot Communication Mode in
@BotFatherfür beide Bots und stellen Sie sicher, dass der Driver-Bot Bot-Datenverkehr in der Gruppe beobachten kann. - Schreibt einen Telegram-QA-Bericht, eine Zusammenfassung und ein Artefakt mit beobachteten Nachrichten unter
.artifacts/qa-e2e/....
qa-channel bleibt die breit angelegte synthetische QA-Suite und ist nicht Teil der Live-Transport-Abdeckungsmatrix.
| Strecke | Canary | Mention-Gating | Allowlist-Blockierung | Antwort auf oberster Ebene | Fortsetzen nach Neustart | Thread-Nachverfolgung | Thread-Isolation | Beobachtung von Reaktionen | Help-Befehl |
|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | x |
Test-Suites (was wo läuft)
Betrachten Sie die Suites als „zunehmend realistisch“ (und zunehmend fehleranfällig/teuer):Unit / Integration (Standard)
- Befehl:
pnpm test - Konfiguration: zehn sequenzielle Shard-Ausführungen (
vitest.full-*.config.ts) über die vorhandenen eingegrenzten Vitest-Projekte - Dateien: Kern-/Unit-Bestände unter
src/**/*.test.ts,packages/**/*.test.ts,test/**/*.test.tsund die auf der Allowlist stehendenui-Node-Tests, die vonvitest.unit.config.tsabgedeckt werden - Umfang:
- Reine Unit-Tests
- In-Process-Integrationstests (Gateway-Authentifizierung, Routing, Tooling, Parsing, Konfiguration)
- Deterministische Regressionstests für bekannte Fehler
- Erwartungen:
- Läuft in CI
- Keine echten Schlüssel erforderlich
- Sollte schnell und stabil sein
- Hinweis zu Projekten:
- Nicht gezieltes
pnpm testführt jetzt elf kleinere Shard-Konfigurationen aus (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) statt eines riesigen nativen Root-Projekt-Prozesses. Das senkt die maximale RSS auf ausgelasteten Rechnern und verhindert, dass Arbeiten an auto-reply/Erweiterungen nicht zusammenhängende Suites ausbremsen. pnpm test --watchverwendet weiterhin den nativen Root-vitest.config.ts-Projektgraphen, weil eine Watch-Schleife über mehrere Shards nicht praktikabel ist.pnpm test,pnpm test:watchundpnpm test:perf:importsleiten explizite Datei-/Verzeichnisziele zuerst über eingegrenzte Strecken weiter, sodasspnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsnicht die vollen Startkosten des Root-Projekts verursacht.pnpm test:changederweitert geänderte Git-Pfade in dieselben eingegrenzten Strecken, wenn der Diff nur routbare Quell-/Testdateien berührt; Konfigurations-/Setup-Änderungen fallen weiterhin auf die breite erneute Ausführung des Root-Projekts zurück.- Import-leichte Unit-Tests aus Agents, Commands, Plugins, auto-reply-Hilfen,
plugin-sdkund ähnlichen reinen Utility-Bereichen werden über die Streckeunit-fastgeleitet, dietest/setup-openclaw-runtime.tsüberspringt; zustandsbehaftete/laufzeitintensive Dateien bleiben auf den vorhandenen Strecken. - Ausgewählte Hilfsquellendateien in
plugin-sdkundcommandsordnen Runs im Changed-Modus ebenfalls explizit benachbarten Tests in diesen leichten Strecken zu, sodass Hilfsänderungen nicht die vollständige schwere Suite für dieses Verzeichnis erneut ausführen. auto-replyhat jetzt drei dedizierte Buckets: Hilfen im Kern der obersten Ebene, Integrations-Tests der obersten Ebenereply.*und den Teilbaumsrc/auto-reply/reply/**. So bleibt die schwerste reply-Harness-Arbeit von günstigen Status-/Chunk-/Token-Tests getrennt.
- Nicht gezieltes
- Hinweis zum eingebetteten Runner:
- Wenn Sie Eingaben für die Nachrichtentool-Erkennung oder den Laufzeitkontext der Kompaktierung ändern, behalten Sie beide Abdeckungsebenen bei.
- Fügen Sie gezielte Hilfs-Regressionstests für reine Routing-/Normalisierungsgrenzen hinzu.
- Halten Sie außerdem die eingebetteten Runner-Integrations-Suites gesund:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsundsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Diese Suites verifizieren, dass eingegrenzte IDs und das Kompaktierungsverhalten weiterhin durch die echten Pfade
run.ts/compact.tsfließen; reine Hilfstests sind kein ausreichender Ersatz für diese Integrationspfade.
- Hinweis zum Pool:
- Die Basis-Vitest-Konfiguration verwendet jetzt standardmäßig
threads. - Die gemeinsame Vitest-Konfiguration setzt außerdem
isolate: falsefest und verwendet den nicht isolierten Runner über Root-Projekte, E2E- und Live-Konfigurationen hinweg. - Die Root-UI-Strecke behält ihr
jsdom-Setup und ihren Optimizer bei, läuft jetzt aber ebenfalls auf dem gemeinsamen nicht isolierten Runner. - Jeder
pnpm test-Shard übernimmt dieselben Standardsthreads+isolate: falseaus der gemeinsamen Vitest-Konfiguration. - Der gemeinsame Launcher
scripts/run-vitest.mjsfügt für untergeordnete Vitest-Node-Prozesse jetzt standardmäßig auch--no-maglevhinzu, um V8-Kompilierungsaufwand bei großen lokalen Ausführungen zu reduzieren. Setzen SieOPENCLAW_VITEST_ENABLE_MAGLEV=1, wenn Sie mit dem Standardverhalten von V8 vergleichen müssen.
- Die Basis-Vitest-Konfiguration verwendet jetzt standardmäßig
- Hinweis zur schnellen lokalen Iteration:
pnpm test:changedleitet über eingegrenzte Strecken, wenn sich die geänderten Pfade sauber einer kleineren Suite zuordnen lassen.pnpm test:maxundpnpm test:changed:maxbehalten dasselbe Routing-Verhalten bei, nur mit einer höheren Worker-Obergrenze.- Die automatische lokale Worker-Skalierung ist jetzt bewusst konservativ und fährt auch zurück, wenn die Load Average des Hosts bereits hoch ist, sodass mehrere gleichzeitige Vitest-Ausführungen standardmäßig weniger Schaden anrichten.
- Die Basis-Vitest-Konfiguration markiert Projekte/Konfigurationsdateien als
forceRerunTriggers, damit erneute Ausführungen im Changed-Modus korrekt bleiben, wenn sich das Test-Wiring ändert. - Die Konfiguration hält
OPENCLAW_VITEST_FS_MODULE_CACHEauf unterstützten Hosts aktiviert; setzen SieOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path, wenn Sie einen expliziten Cache-Speicherort für direktes Profiling möchten.
- Hinweis zum Performance-Debugging:
pnpm test:perf:importsaktiviert die Berichterstellung zur Vitest-Importdauer sowie eine Aufschlüsselung der Importe.pnpm test:perf:imports:changedbegrenzt dieselbe Profiling-Ansicht auf Dateien, die seitorigin/maingeändert wurden.
pnpm test:perf:changed:bench -- --ref <git-ref>vergleicht geroutetestest:changedmit dem nativen Root-Projekt-Pfad für diesen festgeschriebenen Diff und gibt Wall Time sowie macOS-max-RSS aus.pnpm test:perf:changed:bench -- --worktreebenchmarkt den aktuellen verschmutzten Arbeitsbaum, indem die Liste geänderter Dateien überscripts/test-projects.mjsund die Root-Vitest-Konfiguration geleitet wird.pnpm test:perf:profile:mainschreibt ein CPU-Profil des Main-Threads für Vitest-/Vite-Start- und Transformations-Overhead.pnpm test:perf:profile:runnerschreibt CPU- und Heap-Profile des Runners für die Unit-Suite bei deaktivierter Dateiparallelität.
E2E (Gateway-Smoke)
- Befehl:
pnpm test:e2e - Konfiguration:
vitest.e2e.config.ts - Dateien:
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts - Standardwerte der Laufzeit:
- Verwendet Vitest-
threadsmitisolate: falseund entspricht damit dem Rest des Repos. - Verwendet adaptive Worker (CI: bis zu 2, lokal: standardmäßig 1).
- Läuft standardmäßig im stillen Modus, um den Overhead durch Konsolen-I/O zu reduzieren.
- Verwendet Vitest-
- Nützliche Überschreibungen:
OPENCLAW_E2E_WORKERS=<n>, um die Worker-Anzahl zu erzwingen (begrenzt auf 16).OPENCLAW_E2E_VERBOSE=1, um ausführliche Konsolenausgabe wieder zu aktivieren.
- Umfang:
- End-to-End-Verhalten mehrerer Gateway-Instanzen
- WebSocket-/HTTP-Oberflächen, Node-Pairing und schwereres Networking
- Erwartungen:
- Läuft in CI (wenn in der Pipeline aktiviert)
- Keine echten Schlüssel erforderlich
- Mehr bewegliche Teile als Unit-Tests (kann langsamer sein)
E2E: OpenShell-Backend-Smoke
- Befehl:
pnpm test:e2e:openshell - Datei:
test/openshell-sandbox.e2e.test.ts - Umfang:
- Startet über Docker ein isoliertes OpenShell-Gateway auf dem Host
- Erstellt eine Sandbox aus einem temporären lokalen Dockerfile
- Testet OpenClaws OpenShell-Backend über echtes
sandbox ssh-config+ SSH-Ausführung - Verifiziert remote-kanonisches Dateisystemverhalten über die Sandbox-FS-Bridge
- Erwartungen:
- Nur Opt-in; nicht Teil der standardmäßigen Ausführung
pnpm test:e2e - Erfordert eine lokale
openshell-CLI sowie einen funktionierenden Docker-Daemon - Verwendet isoliertes
HOME/XDG_CONFIG_HOMEund zerstört anschließend das Test-Gateway und die Sandbox
- Nur Opt-in; nicht Teil der standardmäßigen Ausführung
- Nützliche Überschreibungen:
OPENCLAW_E2E_OPENSHELL=1, um den Test zu aktivieren, wenn die breitere E2E-Suite manuell ausgeführt wirdOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell, um auf ein nicht standardmäßiges CLI-Binary oder Wrapper-Skript zu verweisen
Live (echte Provider + echte Modelle)
- Befehl:
pnpm test:live - Konfiguration:
vitest.live.config.ts - Dateien:
src/**/*.live.test.ts - Standard: durch
pnpm test:liveaktiviert (setztOPENCLAW_LIVE_TEST=1) - Umfang:
- „Funktioniert dieser Provider/dieses Modell heute mit echten Anmeldedaten tatsächlich?“
- Erfasst Änderungen an Provider-Formaten, Eigenheiten bei Tool-Aufrufen, Authentifizierungsprobleme und Verhalten bei Ratenbegrenzungen
- Erwartungen:
- Von Natur aus nicht CI-stabil (echte Netzwerke, echte Provider-Richtlinien, Quoten, Ausfälle)
- Kostet Geld / verbraucht Ratenlimits
- Bevorzugt eingegrenzte Teilmengen statt „alles“
- Live-Ausführungen laden
~/.profile, um fehlende API-Schlüssel zu übernehmen. - Standardmäßig isolieren Live-Ausführungen weiterhin
HOMEund kopieren Konfigurations-/Authentifizierungsmaterial in ein temporäres Test-Home, damit Unit-Fixtures Ihr echtes~/.openclawnicht verändern können. - Setzen Sie
OPENCLAW_LIVE_USE_REAL_HOME=1nur dann, wenn Live-Tests absichtlich Ihr echtes Home-Verzeichnis verwenden sollen. pnpm test:liveverwendet jetzt standardmäßig einen ruhigeren Modus: Der[live] ...-Fortschritt bleibt sichtbar, aber der zusätzliche Hinweis zu~/.profilewird unterdrückt und Gateway-Bootstrap-Logs/Bonjour-Ausgaben werden stummgeschaltet. Setzen SieOPENCLAW_LIVE_TEST_QUIET=0, wenn Sie die vollständigen Start-Logs wieder sehen möchten.- Rotation von API-Schlüsseln (providerspezifisch): Setzen Sie
*_API_KEYSim Komma-/Semikolon-Format oder*_API_KEY_1,*_API_KEY_2(zum BeispielOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) oder eine Überschreibung pro Live-Test überOPENCLAW_LIVE_*_KEY; Tests versuchen es bei Antworten mit Ratenbegrenzung erneut. - Fortschritts-/Heartbeat-Ausgabe:
- Live-Suites geben jetzt Fortschrittszeilen an stderr aus, sodass bei langen Provider-Aufrufen sichtbar bleibt, dass etwas passiert, auch wenn die Vitest-Konsolenerfassung ruhig ist.
vitest.live.config.tsdeaktiviert die Vitest-Konsolenabfangung, damit Fortschrittszeilen von Provider/Gateway bei Live-Ausführungen sofort gestreamt werden.- Stimmen Sie Heartbeats für direkte Modelle mit
OPENCLAW_LIVE_HEARTBEAT_MSab. - Stimmen Sie Heartbeats für Gateway/Prüfungen mit
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MSab.
Welche Suite sollte ich ausführen?
Verwenden Sie diese Entscheidungstabelle:- Logik/Tests bearbeiten:
pnpm testausführen (undpnpm test:coverage, wenn Sie viel geändert haben) - Gateway-Netzwerk / WS-Protokoll / Pairing berühren: zusätzlich
pnpm test:e2e - „Mein Bot ist ausgefallen“ / providerspezifische Fehler / Tool-Aufrufe debuggen: ein eingegrenztes
pnpm test:liveausführen
Live: Android-Node-Fähigkeitssweep
- Test:
src/gateway/android-node.capabilities.live.test.ts - Skript:
pnpm android:test:integration - Ziel: jeden aktuell beworbenen Befehl eines verbundenen Android-Node aufrufen und das Verhalten gemäß Befehlsvertrag überprüfen.
- Umfang:
- Vorkonfiguriertes/manuelles Setup (die Suite installiert/startet/paart die App nicht).
- Validierung von Gateway-
node.invokeBefehl für Befehl für den ausgewählten Android-Node.
- Erforderliches Vorab-Setup:
- Android-App ist bereits mit dem Gateway verbunden und gepairt.
- App bleibt im Vordergrund.
- Berechtigungen/Zustimmung zur Erfassung sind für die Fähigkeiten erteilt, die erfolgreich sein sollen.
- Optionale Zielüberschreibungen:
OPENCLAW_ANDROID_NODE_IDoderOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- Vollständige Details zum Android-Setup: Android App
Live: Modell-Smoke (Profilschlüssel)
Live-Tests sind in zwei Ebenen aufgeteilt, damit wir Fehler isolieren können:- „Direktes Modell“ sagt uns, ob der Provider/das Modell mit dem angegebenen Schlüssel überhaupt antworten kann.
- „Gateway-Smoke“ sagt uns, ob die vollständige Gateway-+Agent-Pipeline für dieses Modell funktioniert (Sitzungen, Verlauf, Tools, Sandbox-Richtlinie usw.).
Ebene 1: Direkte Modellvervollständigung (ohne Gateway)
- Test:
src/agents/models.profiles.live.test.ts - Ziel:
- Erkannte Modelle aufzählen
getApiKeyForModelverwenden, um Modelle auszuwählen, für die Sie Anmeldedaten haben- Pro Modell eine kleine Vervollständigung ausführen (und gezielte Regressionen, wo nötig)
- Aktivierung:
pnpm test:live(oderOPENCLAW_LIVE_TEST=1, wenn Vitest direkt aufgerufen wird)
- Setzen Sie
OPENCLAW_LIVE_MODELS=modern(oderall, Alias für modern), um diese Suite tatsächlich auszuführen; andernfalls wird sie übersprungen, damit sichpnpm test:liveauf Gateway-Smoke konzentriert - Modellauswahl:
OPENCLAW_LIVE_MODELS=modern, um die moderne Allowlist auszuführen (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)OPENCLAW_LIVE_MODELS=allist ein Alias für die moderne Allowlist- oder
OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."(Komma-Allowlist) - Moderne/alle Sweeps verwenden standardmäßig eine kuratierte Obergrenze mit hohem Signal; setzen Sie
OPENCLAW_LIVE_MAX_MODELS=0für einen vollständigen modernen Sweep oder einen positiven Wert für eine kleinere Obergrenze.
- Providerauswahl:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(Komma-Allowlist)
- Woher die Schlüssel kommen:
- Standardmäßig: Profilspeicher und Umgebungs-Fallbacks
- Setzen Sie
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um ausschließlich den Profilspeicher zu erzwingen
- Warum es das gibt:
- Trennt „Provider-API ist defekt / Schlüssel ist ungültig“ von „Gateway-Agent-Pipeline ist defekt“
- Enthält kleine, isolierte Regressionen (Beispiel: OpenAI-Responses/Codex-Responses-Replay von Reasoning + Tool-Call-Flows)
Ebene 2: Gateway- + Dev-Agent-Smoke (was @openclaw tatsächlich macht)
- Test:
src/gateway/gateway-models.profiles.live.test.ts - Ziel:
- Ein In-Process-Gateway hochfahren
- Eine Sitzung
agent:dev:*erstellen/patchen (Modellüberschreibung pro Ausführung) - Über Modelle mit Schlüsseln iterieren und Folgendes prüfen:
- „sinnvolle“ Antwort (ohne Tools)
- ein echter Tool-Aufruf funktioniert (read-Prüfung)
- optionale zusätzliche Tool-Prüfungen (exec+read-Prüfung)
- OpenAI-Regressionspfade (nur Tool-Call → Folgeaufruf) funktionieren weiterhin
- Details zu den Prüfungen (damit Sie Fehler schnell erklären können):
read-Prüfung: Der Test schreibt eine Nonce-Datei in den Workspace und fordert den Agenten auf, sie mitreadzu lesen und die Nonce zurückzugeben.exec+read-Prüfung: Der Test fordert den Agenten auf, mitexeceine Nonce in eine temporäre Datei zu schreiben und sie dann mitreadwieder zu lesen.- Bildprüfung: Der Test hängt ein erzeugtes PNG an (Katze + zufälliger Code) und erwartet, dass das Modell
cat <CODE>zurückgibt. - Implementierungsreferenz:
src/gateway/gateway-models.profiles.live.test.tsundsrc/gateway/live-image-probe.ts.
- Aktivierung:
pnpm test:live(oderOPENCLAW_LIVE_TEST=1, wenn Vitest direkt aufgerufen wird)
- Modellauswahl:
- Standard: moderne Allowlist (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=allist ein Alias für die moderne Allowlist- Oder setzen Sie
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(oder eine Komma-Liste), um einzugrenzen - Moderne/alle Gateway-Sweeps verwenden standardmäßig eine kuratierte Obergrenze mit hohem Signal; setzen Sie
OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0für einen vollständigen modernen Sweep oder einen positiven Wert für eine kleinere Obergrenze.
- Providerauswahl (vermeidet „alles von OpenRouter“):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(Komma-Allowlist)
- Tool- und Bildprüfungen sind in diesem Live-Test immer aktiviert:
read-Prüfung +exec+read-Prüfung (Tool-Stresstest)- Bildprüfung wird ausgeführt, wenn das Modell Unterstützung für Bildeingaben bewirbt
- Ablauf (überblicksartig):
- Der Test erzeugt ein kleines PNG mit „CAT“ + zufälligem Code (
src/gateway/live-image-probe.ts) - Sendet es über
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - Gateway parst Anhänge in
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - Der eingebettete Agent leitet eine multimodale Benutzernachricht an das Modell weiter
- Prüfung: Die Antwort enthält
cat+ den Code (OCR-Toleranz: kleine Fehler sind erlaubt)
- Der Test erzeugt ein kleines PNG mit „CAT“ + zufälligem Code (
provider/model), führen Sie Folgendes aus:
Live: CLI-Backend-Smoke (Claude, Codex, Gemini oder andere lokale CLIs)
- Test:
src/gateway/gateway-cli-backend.live.test.ts - Ziel: die Gateway-+Agent-Pipeline mit einem lokalen CLI-Backend validieren, ohne Ihre Standardkonfiguration zu berühren.
- Standard-Smoke-Werte pro Backend befinden sich in der Definition
cli-backend.tsder jeweiligen Erweiterung. - Aktivierung:
pnpm test:live(oderOPENCLAW_LIVE_TEST=1, wenn Vitest direkt aufgerufen wird)OPENCLAW_LIVE_CLI_BACKEND=1
- Standardwerte:
- Standard-Provider/-Modell:
claude-cli/claude-sonnet-4-6 - Verhalten von Befehl/Argumenten/Bildern stammt aus den Metadaten des jeweiligen CLI-Backend-Plugins.
- Standard-Provider/-Modell:
- Überschreibungen (optional):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/vollständiger/pfad/zu/codex"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1, um einen echten Bildanhang zu senden (Pfade werden in den Prompt eingefügt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image", um Bilddateipfade als CLI-Argumente statt per Prompt-Injektion zu übergeben.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(oder"list"), um zu steuern, wie Bildargumente übergeben werden, wennIMAGE_ARGgesetzt ist.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1, um einen zweiten Turn zu senden und den Resume-Ablauf zu validieren.OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0, um die standardmäßige Prüfung der Sitzungsfortführung Claude Sonnet -> Opus zu deaktivieren (auf1setzen, um sie zu erzwingen, wenn das ausgewählte Modell ein Wechselziel unterstützt).
- Der Docker-Runner befindet sich unter
scripts/test-live-cli-backend-docker.sh. - Er führt den Live-CLI-Backend-Smoke innerhalb des Repo-Docker-Images als nicht-root-Benutzer
nodeaus. - Er löst CLI-Smoke-Metadaten aus der jeweiligen Erweiterung auf und installiert dann das passende Linux-CLI-Paket (
@anthropic-ai/claude-code,@openai/codexoder@google/gemini-cli) in ein zwischengespeichertes beschreibbares Präfix unterOPENCLAW_DOCKER_CLI_TOOLS_DIR(Standard:~/.cache/openclaw/docker-cli-tools). pnpm test:docker:live-cli-backend:claude-subscriptionerfordert portable Claude-Code-Subscription-OAuth entweder über~/.claude/.credentials.jsonmitclaudeAiOauth.subscriptionTypeoderCLAUDE_CODE_OAUTH_TOKENausclaude setup-token. Es beweist zunächst direktesclaude -pin Docker und führt dann zwei Gateway-CLI-Backend-Turns aus, ohne Anthropic-API-Key-Umgebungsvariablen beizubehalten. Diese Subscription-Strecke deaktiviert standardmäßig die Claude-MCP-/Tool- und Bildprüfungen, weil Claude die Nutzung von Drittanbieter-Apps derzeit über Extra-Usage-Abrechnung statt über normale Abo-Limits abwickelt.- Der Live-CLI-Backend-Smoke testet jetzt denselben vollständigen End-to-End-Ablauf für Claude, Codex und Gemini: Text-Turn, Bildklassifizierungs-Turn und anschließend einen MCP-Tool-Aufruf
cron, der über die Gateway-CLI verifiziert wird. - Claudes Standard-Smoke patcht außerdem die Sitzung von Sonnet auf Opus und verifiziert, dass sich die fortgesetzte Sitzung weiterhin an eine frühere Notiz erinnert.
Live: ACP-Bind-Smoke (/acp spawn ... --bind here)
- Test:
src/gateway/gateway-acp-bind.live.test.ts - Ziel: den echten ACP-Conversation-Bind-Ablauf mit einem Live-ACP-Agenten validieren:
/acp spawn <agent> --bind heresenden- eine synthetische Message-Channel-Konversation direkt vor Ort binden
- eine normale Folge-Nachricht in derselben Konversation senden
- verifizieren, dass die Folge-Nachricht im Transcript der gebundenen ACP-Sitzung landet
- Aktivierung:
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- Standardwerte:
- ACP-Agenten in Docker:
claude,codex,gemini - ACP-Agent für direktes
pnpm test:live ...:claude - Synthetischer Kanal: Slack-DM-artiger Konversationskontext
- ACP-Backend:
acpx
- ACP-Agenten in Docker:
- Überschreibungen:
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>'
- Hinweise:
- Diese Strecke verwendet die Gateway-Oberfläche
chat.sendmit admin-only synthetischen Feldern für die Ursprungsroute, sodass Tests Message-Channel-Kontext anhängen können, ohne vorzugeben, extern zuzustellen. - Wenn
OPENCLAW_LIVE_ACP_BIND_AGENT_COMMANDnicht gesetzt ist, verwendet der Test die integrierte Agent-Registry des eingebetteten Pluginsacpxfür den ausgewählten ACP-Harness-Agenten.
- Diese Strecke verwendet die Gateway-Oberfläche
- Der Docker-Runner befindet sich unter
scripts/test-live-acp-bind-docker.sh. - Standardmäßig führt er den ACP-Bind-Smoke nacheinander gegen alle unterstützten Live-CLI-Agenten aus:
claude,codex, danngemini. - Verwenden Sie
OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,OPENCLAW_LIVE_ACP_BIND_AGENTS=codexoderOPENCLAW_LIVE_ACP_BIND_AGENTS=gemini, um die Matrix einzugrenzen. - Er lädt
~/.profile, stellt das passende CLI-Authentifizierungsmaterial im Container bereit, installiertacpxin ein beschreibbares npm-Präfix und installiert dann die angeforderte Live-CLI (@anthropic-ai/claude-code,@openai/codexoder@google/gemini-cli), falls sie fehlt. - Innerhalb von Docker setzt der Runner
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx, damitacpxdie Provider-Umgebungsvariablen aus dem geladenen Profil für die untergeordnete Harness-CLI verfügbar hält.
Live: Codex-App-Server-Harness-Smoke
- Ziel: den plugin-eigenen Codex-Harness über die normale Gateway-Methode
agentvalidieren:- das gebündelte Plugin
codexladen OPENCLAW_AGENT_RUNTIME=codexauswählen- einen ersten Gateway-Agenten-Turn an
codex/gpt-5.4senden - einen zweiten Turn an dieselbe OpenClaw-Sitzung senden und verifizieren, dass der App-Server-Thread fortgesetzt werden kann
/codex statusund/codex modelsüber denselben Gateway-Befehlspfad ausführen
- das gebündelte Plugin
- Test:
src/gateway/gateway-codex-harness.live.test.ts - Aktivierung:
OPENCLAW_LIVE_CODEX_HARNESS=1 - Standardmodell:
codex/gpt-5.4 - Optionale Bildprüfung:
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 - Optionale MCP-/Tool-Prüfung:
OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 - Der Smoke setzt
OPENCLAW_AGENT_HARNESS_FALLBACK=none, damit ein defekter Codex-Harness nicht dadurch besteht, dass stillschweigend auf PI zurückgefallen wird. - Authentifizierung:
OPENAI_API_KEYaus Shell/Profil sowie optional kopierte~/.codex/auth.jsonund~/.codex/config.toml
- Der Docker-Runner befindet sich unter
scripts/test-live-codex-harness-docker.sh. - Er lädt das eingebundene
~/.profile, übergibtOPENAI_API_KEY, kopiert Codex-CLI-Authentifizierungsdateien, wenn vorhanden, installiert@openai/codexin ein beschreibbares eingebundenes npm-Präfix, stellt den Quellbaum bereit und führt dann nur den Live-Test des Codex-Harness aus. - Docker aktiviert standardmäßig die Bild- und MCP-/Tool-Prüfungen. Setzen Sie
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0oderOPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0, wenn Sie eine stärker eingegrenzte Debug-Ausführung benötigen. - Docker exportiert außerdem
OPENCLAW_AGENT_HARNESS_FALLBACK=noneund entspricht damit der Live-Testkonfiguration, sodassopenai-codex/*oder ein PI-Fallback eine Regression des Codex-Harness nicht verbergen kann.
Empfohlene Live-Rezepte
Schmale, explizite Allowlists sind am schnellsten und am wenigsten fehleranfällig:-
Einzelnes Modell, direkt (ohne Gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
Einzelnes Modell, Gateway-Smoke:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Tool-Aufrufe über mehrere Provider hinweg:
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
-
Google-Fokus (Gemini-API-Schlüssel + Antigravity):
- Gemini (API-Schlüssel):
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-Schlüssel):
google/...verwendet die Gemini-API (API-Schlüssel).google-antigravity/...verwendet die Antigravity-OAuth-Bridge (Agent-Endpunkt im Stil von Cloud Code Assist).google-gemini-cli/...verwendet die lokale Gemini-CLI auf Ihrem Rechner (separate Authentifizierung + Eigenheiten beim Tooling).- Gemini-API vs. Gemini-CLI:
- API: OpenClaw ruft Googles gehostete Gemini-API über HTTP auf (API-Schlüssel / Profil-Authentifizierung); das ist in der Regel das, was die meisten Benutzer mit „Gemini“ meinen.
- CLI: OpenClaw ruft ein lokales Binary
geminiauf; es hat eine eigene Authentifizierung und kann sich anders verhalten (Streaming/Tool-Unterstützung/Versionsabweichung).
Live: Modellmatrix (was wir abdecken)
Es gibt keine feste „CI-Modellliste“ (Live ist Opt-in), aber dies sind die empfohlenen Modelle, die regelmäßig auf einem Entwicklerrechner mit Schlüsseln abgedeckt werden sollten.Moderner Smoke-Satz (Tool-Aufrufe + Bild)
Dies ist die Ausführung für die „gängigen Modelle“, die wir funktionsfähig halten wollen:- OpenAI (ohne Codex):
openai/gpt-5.4(optional:openai/gpt-5.4-mini) - OpenAI Codex:
openai-codex/gpt-5.4 - Anthropic:
anthropic/claude-opus-4-6(oderanthropic/claude-sonnet-4-6) - Google (Gemini-API):
google/gemini-3.1-pro-previewundgoogle/gemini-3-flash-preview(ältere Gemini-2.x-Modelle vermeiden) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingundgoogle-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
Basislinie: Tool-Aufrufe (Read + optional Exec)
Wählen Sie mindestens eines pro Provider-Familie:
- OpenAI:
openai/gpt-5.4(oderopenai/gpt-5.4-mini) - Anthropic:
anthropic/claude-opus-4-6(oderanthropic/claude-sonnet-4-6) - Google:
google/gemini-3-flash-preview(odergoogle/gemini-3.1-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
- xAI:
xai/grok-4(oder die neueste verfügbare Version) - Mistral:
mistral/… (wählen Sie ein „tools“-fähiges Modell aus, das Sie aktiviert haben) - Cerebras:
cerebras/… (falls Sie Zugriff haben) - LM Studio:
lmstudio/… (lokal; Tool-Aufrufe hängen vom API-Modus ab)
Vision: Bild senden (Anhang → multimodale Nachricht)
Nehmen Sie mindestens ein bildfähiges Modell inOPENCLAW_LIVE_GATEWAY_MODELS auf (Claude/Gemini/OpenAI-fähige Vision-Varianten usw.), um die Bildprüfung auszuführen.
Aggregatoren / alternative Gateways
Wenn Sie entsprechende Schlüssel aktiviert haben, unterstützen wir auch Tests über:- OpenRouter:
openrouter/...(Hunderte Modelle; verwenden Sieopenclaw models scan, um Kandidaten mit Tool- und Bildunterstützung zu finden) - OpenCode:
opencode/...für Zen undopencode-go/...für Go (Authentifizierung überOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- Integriert:
openai,openai-codex,anthropic,google,google-vertex,google-antigravity,google-gemini-cli,zai,openrouter,opencode,opencode-go,xai,groq,cerebras,mistral,github-copilot - Über
models.providers(benutzerdefinierte Endpunkte):minimax(Cloud/API) sowie jeder OpenAI-/Anthropic-kompatible Proxy (LM Studio, vLLM, LiteLLM usw.)
discoverModels(...) auf Ihrem Rechner zurückgibt, plus die verfügbaren Schlüssel.
Anmeldedaten (niemals committen)
Live-Tests erkennen Anmeldedaten auf dieselbe Weise wie die CLI. Praktische Auswirkungen:- Wenn die CLI funktioniert, sollten Live-Tests dieselben Schlüssel finden.
-
Wenn ein Live-Test „keine Anmeldedaten“ meldet, debuggen Sie ihn genauso wie
openclaw models list/ Modellauswahl. -
Authentifizierungsprofile pro Agent:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(das ist mit „Profilschlüssel“ in den Live-Tests gemeint) -
Konfiguration:
~/.openclaw/openclaw.json(oderOPENCLAW_CONFIG_PATH) -
Legacy-Statusverzeichnis:
~/.openclaw/credentials/(wird in das bereitgestellte Live-Test-Home kopiert, falls vorhanden, ist aber nicht der Hauptspeicher für Profilschlüssel) -
Lokale Live-Ausführungen kopieren standardmäßig die aktive Konfiguration,
auth-profiles.jsonpro Agent, Legacy-credentials/und unterstützte externe CLI-Authentifizierungsverzeichnisse in ein temporäres Test-Home; bereitgestellte Live-Homes überspringenworkspace/undsandboxes/, und Pfadüberschreibungen füragents.*.workspace/agentDirwerden entfernt, damit Prüfungen nicht auf Ihren echten Host-Workspace zugreifen.
~/.profile exportiert), führen Sie lokale Tests nach source ~/.profile aus oder verwenden Sie die unten aufgeführten Docker-Runner (sie können ~/.profile in den Container einbinden).
Deepgram live (Audiotranskription)
- Test:
src/media-understanding/providers/deepgram/audio.live.test.ts - Aktivierung:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
BytePlus Coding-Plan live
- Test:
src/agents/byteplus.live.test.ts - Aktivierung:
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts - Optionale Modellüberschreibung:
BYTEPLUS_CODING_MODEL=ark-code-latest
ComfyUI-Workflow-Medien live
- Test:
extensions/comfy/comfy.live.test.ts - Aktivierung:
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts - Umfang:
- Testet die gebündelten comfy-Pfade für Bilder, Videos und
music_generate - Überspringt jede Fähigkeit, sofern
models.providers.comfy.<capability>nicht konfiguriert ist - Nützlich nach Änderungen an comfy-Workflow-Übermittlung, Polling, Downloads oder Plugin-Registrierung
- Testet die gebündelten comfy-Pfade für Bilder, Videos und
Bildgenerierung live
- Test:
src/image-generation/runtime.live.test.ts - Befehl:
pnpm test:live src/image-generation/runtime.live.test.ts - Harness:
pnpm test:live:media image - Umfang:
- Zählt jedes registrierte Provider-Plugin für Bildgenerierung auf
- Lädt fehlende Provider-Umgebungsvariablen vor der Prüfung aus Ihrer Login-Shell (
~/.profile) - Verwendet standardmäßig Live-/Umgebungs-API-Schlüssel vor gespeicherten Authentifizierungsprofilen, damit veraltete Testschlüssel in
auth-profiles.jsonechte Shell-Anmeldedaten nicht verdecken - Überspringt Provider ohne verwendbare Authentifizierung/Profil/Modell
- Führt die standardmäßigen Varianten der Bildgenerierung über die gemeinsame Runtime-Fähigkeit aus:
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- Derzeit abgedeckte gebündelte Provider:
openaigoogle
- Optionale Eingrenzung:
OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google"OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"
- Optionales Authentifizierungsverhalten:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um Authentifizierung über den Profilspeicher zu erzwingen und reine Umgebungsüberschreibungen zu ignorieren
Musikgenerierung live
- Test:
extensions/music-generation-providers.live.test.ts - Aktivierung:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts - Harness:
pnpm test:live:media music - Umfang:
- Testet den gemeinsamen gebündelten Provider-Pfad für Musikgenerierung
- Deckt derzeit Google und MiniMax ab
- Lädt Provider-Umgebungsvariablen vor der Prüfung aus Ihrer Login-Shell (
~/.profile) - Verwendet standardmäßig Live-/Umgebungs-API-Schlüssel vor gespeicherten Authentifizierungsprofilen, damit veraltete Testschlüssel in
auth-profiles.jsonechte Shell-Anmeldedaten nicht verdecken - Überspringt Provider ohne verwendbare Authentifizierung/Profil/Modell
- Führt beide deklarierten Runtime-Modi aus, wenn verfügbar:
generatemit Eingabe nur per Promptedit, wenn der Providercapabilities.edit.enableddeklariert
- Aktuelle Abdeckung in der gemeinsamen Strecke:
google:generate,editminimax:generatecomfy: separate Comfy-Live-Datei, nicht dieser gemeinsame Sweep
- Optionale Eingrenzung:
OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"
- Optionales Authentifizierungsverhalten:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um Authentifizierung über den Profilspeicher zu erzwingen und reine Umgebungsüberschreibungen zu ignorieren
Videogenerierung live
- Test:
extensions/video-generation-providers.live.test.ts - Aktivierung:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts - Harness:
pnpm test:live:media video - Umfang:
- Testet den gemeinsamen gebündelten Provider-Pfad für Videogenerierung
- Lädt Provider-Umgebungsvariablen vor der Prüfung aus Ihrer Login-Shell (
~/.profile) - Verwendet standardmäßig Live-/Umgebungs-API-Schlüssel vor gespeicherten Authentifizierungsprofilen, damit veraltete Testschlüssel in
auth-profiles.jsonechte Shell-Anmeldedaten nicht verdecken - Überspringt Provider ohne verwendbare Authentifizierung/Profil/Modell
- Führt beide deklarierten Runtime-Modi aus, wenn verfügbar:
generatemit Eingabe nur per PromptimageToVideo, wenn der Providercapabilities.imageToVideo.enableddeklariert und der ausgewählte Provider/das ausgewählte Modell in der gemeinsamen Strecke lokale Bildeingaben auf Buffer-Basis akzeptiertvideoToVideo, wenn der Providercapabilities.videoToVideo.enableddeklariert und der ausgewählte Provider/das ausgewählte Modell in der gemeinsamen Strecke lokale Videoeingaben auf Buffer-Basis akzeptiert
- Aktuell deklarierte, aber in der gemeinsamen Strecke übersprungene
imageToVideo-Provider:vydra, weil das gebündelteveo3nur Text unterstützt und das gebündelteklingeine entfernte Bild-URL erfordert
- Providerspezifische Vydra-Abdeckung:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts- diese Datei führt
veo3Text-zu-Video sowie standardmäßig einekling-Strecke aus, die eine Fixture mit entfernter Bild-URL verwendet
- Aktuelle
videoToVideo-Live-Abdeckung:- nur
runway, wenn das ausgewählte Modellrunway/gen4_alephist
- nur
- Aktuell deklarierte, aber in der gemeinsamen Strecke übersprungene
videoToVideo-Provider:alibaba,qwen,xai, weil diese Pfade derzeit entfernte Referenz-URLs vom Typhttp(s)/ MP4 erforderngoogle, weil die aktuelle gemeinsame Gemini-/Veo-Strecke lokale Eingaben auf Buffer-Basis verwendet und dieser Pfad in der gemeinsamen Strecke nicht akzeptiert wirdopenai, weil der aktuellen gemeinsamen Strecke Garantien für organisationsspezifischen Zugriff auf Video-Inpainting/Remix fehlen
- Optionale Eingrenzung:
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"
- Optionales Authentifizierungsverhalten:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um Authentifizierung über den Profilspeicher zu erzwingen und reine Umgebungsüberschreibungen zu ignorieren
Media-Live-Harness
- Befehl:
pnpm test:live:media - Zweck:
- Führt die gemeinsamen Live-Suites für Bild, Musik und Video über einen repo-nativen Einstiegspunkt aus
- Lädt fehlende Provider-Umgebungsvariablen automatisch aus
~/.profile - Grenzt jede Suite standardmäßig automatisch auf Provider ein, die aktuell verwendbare Authentifizierung haben
- Verwendet
scripts/test-live.mjserneut, damit Heartbeat- und Quiet-Mode-Verhalten konsistent bleiben
- Beispiele:
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
Docker-Runner (optionale „funktioniert unter Linux“-Prüfungen)
Diese Docker-Runner teilen sich in zwei Gruppen:- Live-Modell-Runner:
test:docker:live-modelsundtest:docker:live-gatewayführen nur ihre jeweilige Live-Datei für Profilschlüssel innerhalb des Repo-Docker-Images aus (src/agents/models.profiles.live.test.tsundsrc/gateway/gateway-models.profiles.live.test.ts), wobei Ihr lokales Konfigurationsverzeichnis und Ihr Workspace eingebunden werden (und~/.profilegeladen wird, falls eingebunden). Die passenden lokalen Einstiegspunkte sindtest:live:models-profilesundtest:live:gateway-profiles. - Docker-Live-Runner verwenden standardmäßig eine kleinere Smoke-Obergrenze, damit ein vollständiger Docker-Sweep praktikabel bleibt:
test:docker:live-modelsverwendet standardmäßigOPENCLAW_LIVE_MAX_MODELS=12, undtest:docker:live-gatewayverwendet standardmäßigOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000undOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Überschreiben Sie diese Umgebungsvariablen, wenn Sie ausdrücklich den größeren vollständigen Scan wollen. test:docker:allbaut das Live-Docker-Image einmal übertest:docker:live-buildund verwendet es dann für die beiden Docker-Live-Strecken erneut.- Container-Smoke-Runner:
test:docker:openwebui,test:docker:onboard,test:docker:gateway-network,test:docker:mcp-channelsundtest:docker:pluginsstarten einen oder mehrere echte Container und verifizieren Integrationspfade auf höherer Ebene.
- Direkte Modelle:
pnpm test:docker:live-models(Skript:scripts/test-live-models-docker.sh) - ACP-Bind-Smoke:
pnpm test:docker:live-acp-bind(Skript:scripts/test-live-acp-bind-docker.sh) - CLI-Backend-Smoke:
pnpm test:docker:live-cli-backend(Skript:scripts/test-live-cli-backend-docker.sh) - Codex-App-Server-Harness-Smoke:
pnpm test:docker:live-codex-harness(Skript:scripts/test-live-codex-harness-docker.sh) - Gateway + Dev-Agent:
pnpm test:docker:live-gateway(Skript:scripts/test-live-gateway-models-docker.sh) - Open-WebUI-Live-Smoke:
pnpm test:docker:openwebui(Skript:scripts/e2e/openwebui-docker.sh) - Onboarding-Assistent (TTY, vollständiges Scaffolding):
pnpm test:docker:onboard(Skript:scripts/e2e/onboard-docker.sh) - Gateway-Netzwerk (zwei Container, WS-Authentifizierung + Health):
pnpm test:docker:gateway-network(Skript:scripts/e2e/gateway-network-docker.sh) - MCP-Kanal-Bridge (vorbefülltes Gateway + stdio-Bridge + Roh-Smoke für Claude-Benachrichtigungsframes):
pnpm test:docker:mcp-channels(Skript:scripts/e2e/mcp-channels-docker.sh) - Plugins (Installations-Smoke +
/plugin-Alias + Neustartsemantik des Claude-Bundles):pnpm test:docker:plugins(Skript:scripts/e2e/plugins-docker.sh)
.pnpm-store, .worktrees, __openclaw_vitest__ und App-lokale .build- oder
Gradle-Ausgabeverzeichnisse, damit Docker-Live-Ausführungen nicht minutenlang
rechnerspezifische Artefakte kopieren.
Sie setzen außerdem OPENCLAW_SKIP_CHANNELS=1, damit Gateway-Live-Prüfungen im Container keine echten Kanal-Worker für Telegram/Discord usw. starten.
test:docker:live-models führt weiterhin pnpm test:live aus; reichen Sie daher auch
OPENCLAW_LIVE_GATEWAY_* durch, wenn Sie in dieser Docker-Strecke die Gateway-Live-Abdeckung eingrenzen oder ausschließen müssen.
test:docker:openwebui ist ein Smoke zur Kompatibilität auf höherer Ebene: Es startet einen
OpenClaw-Gateway-Container mit aktivierten OpenAI-kompatiblen HTTP-Endpunkten, startet einen
festgelegten Open-WebUI-Container gegen dieses Gateway, meldet sich über Open WebUI an,
verifiziert, dass /api/models openclaw/default bereitstellt, und sendet dann eine
echte Chat-Anfrage über den Proxy /api/chat/completions von Open WebUI.
Die erste Ausführung kann merklich langsamer sein, weil Docker möglicherweise das
Open-WebUI-Image ziehen muss und Open WebUI möglicherweise seinen eigenen Kaltstart abschließen muss.
Diese Strecke erwartet einen verwendbaren Live-Modellschlüssel, und OPENCLAW_PROFILE_FILE
(~/.profile standardmäßig) ist die primäre Methode, ihn in dockerisierten Ausführungen bereitzustellen.
Erfolgreiche Ausführungen geben eine kleine JSON-Nutzlast wie { "ok": true, "model": "openclaw/default", ... } aus.
test:docker:mcp-channels ist bewusst deterministisch und benötigt kein
echtes Telegram-, Discord- oder iMessage-Konto. Es startet einen
Container mit vorbefülltem Gateway, startet einen zweiten Container, der openclaw mcp serve startet, und
verifiziert dann geroutete Konversationserkennung, das Lesen von Transcripts, Anhang-Metadaten,
Verhalten der Live-Ereigniswarteschlange, Routing ausgehender Sendungen sowie Benachrichtigungen im Stil von Claude zu Kanal +
Berechtigungen über die echte stdio-MCP-Bridge. Die Benachrichtigungsprüfung
untersucht die rohen stdio-MCP-Frames direkt, sodass der Smoke validiert, was
die Bridge tatsächlich ausgibt, nicht nur das, was ein bestimmtes Client-SDK zufällig sichtbar macht.
Manueller ACP-Simple-Language-Thread-Smoke (nicht CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Behalten Sie dieses Skript für Regressions-/Debug-Workflows bei. Es könnte für die Validierung des ACP-Thread-Routings erneut benötigt werden, also löschen Sie es nicht.
OPENCLAW_CONFIG_DIR=...(Standard:~/.openclaw) wird nach/home/node/.openclaweingebundenOPENCLAW_WORKSPACE_DIR=...(Standard:~/.openclaw/workspace) wird nach/home/node/.openclaw/workspaceeingebundenOPENCLAW_PROFILE_FILE=...(Standard:~/.profile) wird nach/home/node/.profileeingebunden und vor dem Ausführen der Tests geladenOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(Standard:~/.cache/openclaw/docker-cli-tools) wird nach/home/node/.npm-globaleingebunden, um CLI-Installationen in Docker zwischenzuspeichern- Externe CLI-Authentifizierungsverzeichnisse/-dateien unter
$HOMEwerden schreibgeschützt unter/host-auth...eingebunden und dann vor dem Start der Tests nach/home/node/...kopiert- Standardverzeichnisse:
.minimax - Standarddateien:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Eingegrenzte Provider-Ausführungen binden nur die benötigten Verzeichnisse/Dateien ein, die aus
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERSabgeleitet werden - Manuell überschreiben mit
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneoder einer Komma-Liste wieOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Standardverzeichnisse:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=..., um die Ausführung einzugrenzenOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=..., um Provider im Container zu filternOPENCLAW_SKIP_DOCKER_BUILD=1, um ein vorhandenes Imageopenclaw:local-livefür erneute Ausführungen ohne Neubau wiederzuverwendenOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um sicherzustellen, dass Anmeldedaten aus dem Profilspeicher stammen (nicht aus der Umgebung)OPENCLAW_OPENWEBUI_MODEL=..., um das vom Gateway für den Open-WebUI-Smoke bereitgestellte Modell auszuwählenOPENCLAW_OPENWEBUI_PROMPT=..., um den für den Open-WebUI-Smoke verwendeten Prompt zur Nonce-Prüfung zu überschreibenOPENWEBUI_IMAGE=..., um das festgelegte Open-WebUI-Image-Tag zu überschreiben
Plausibilitätsprüfung für Dokumentation
Führen Sie nach Änderungen an der Dokumentation die Doku-Prüfungen aus:pnpm check:docs.
Führen Sie die vollständige Mintlify-Anchor-Validierung aus, wenn Sie zusätzlich Prüfungen für Überschriften innerhalb der Seite benötigen: pnpm docs:check-links:anchors.
Offline-Regression (CI-sicher)
Dies sind Regressionen für die „echte Pipeline“ ohne echte Provider:- Gateway-Tool-Aufrufe (Mock OpenAI, echtes Gateway + Agent-Schleife):
src/gateway/gateway.test.ts(Fall: “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Gateway-Assistent (WS
wizard.start/wizard.next, schreibt Konfiguration + erzwungene Authentifizierung):src/gateway/gateway.test.ts(Fall: “runs wizard over ws and writes auth token config”)
Evals zur Agentenzuverlässigkeit (Skills)
Wir haben bereits einige CI-sichere Tests, die sich wie „Evals zur Agentenzuverlässigkeit“ verhalten:- Mock-Tool-Aufrufe über die echte Gateway- + Agent-Schleife (
src/gateway/gateway.test.ts). - End-to-End-Assistentenabläufe, die Sitzungsverdrahtung und Auswirkungen auf die Konfiguration validieren (
src/gateway/gateway.test.ts).
- Entscheidungsfindung: Wenn Skills im Prompt aufgeführt sind, wählt der Agent dann den richtigen Skill aus (oder vermeidet irrelevante)?
- Compliance: Liest der Agent
SKILL.mdvor der Verwendung und befolgt er erforderliche Schritte/Argumente? - Workflow-Verträge: Mehrturn-Szenarien, die Tool-Reihenfolge, Übernahme des Sitzungsverlaufs und Sandbox-Grenzen prüfen.
- Ein Szenario-Runner mit Mock-Providern, um Tool-Aufrufe + Reihenfolge, das Lesen von Skill-Dateien und Sitzungsverdrahtung zu prüfen.
- Eine kleine Suite von skillfokussierten Szenarien (verwenden vs. vermeiden, Gating, Prompt Injection).
- Optionale Live-Evals (Opt-in, über Umgebungsvariablen gesteuert) erst, nachdem die CI-sichere Suite vorhanden ist.
Vertragstests (Plugin- und Kanalform)
Vertragstests verifizieren, dass jedes registrierte Plugin und jeder Kanal seinem Schnittstellenvertrag entspricht. Sie iterieren über alle erkannten Plugins und führen eine Suite von Prüfungen zu Form und Verhalten aus. Die standardmäßige Unit-Streckepnpm test
überspringt diese gemeinsam genutzten Seam- und Smoke-Dateien absichtlich; führen Sie die
Vertragsbefehle explizit aus, wenn Sie gemeinsame Kanal- oder Provider-Oberflächen ändern.
Befehle
- Alle Verträge:
pnpm test:contracts - Nur Kanalverträge:
pnpm test:contracts:channels - Nur Provider-Verträge:
pnpm test:contracts:plugins
Kanalverträge
Zu finden untersrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - Grundlegende Plugin-Form (id, name, capabilities)
- setup - Vertrag des Setup-Assistenten
- session-binding - Verhalten der Sitzungsbindung
- outbound-payload - Struktur der Nachrichten-Nutzlast
- inbound - Verarbeitung eingehender Nachrichten
- actions - Handler für Kanalaktionen
- threading - Umgang mit Thread-IDs
- directory - API für Verzeichnis/Bestandsliste
- group-policy - Durchsetzung von Gruppenrichtlinien
Provider-Statusverträge
Zu finden untersrc/plugins/contracts/*.contract.test.ts.
- status - Statusprüfungen für Kanäle
- registry - Form der Plugin-Registry
Provider-Verträge
Zu finden untersrc/plugins/contracts/*.contract.test.ts:
- auth - Vertrag des Authentifizierungsablaufs
- auth-choice - Authentifizierungswahl/-auswahl
- catalog - API für den Modellkatalog
- discovery - Plugin-Erkennung
- loader - Plugin-Laden
- runtime - Provider-Runtime
- shape - Plugin-Form/Schnittstelle
- wizard - Setup-Assistent
Wann ausführen
- Nach Änderungen an
plugin-sdk-Exporten oder Subpfaden - Nach dem Hinzufügen oder Ändern eines Kanal- oder Provider-Plugins
- Nach Refaktorierungen der Plugin-Registrierung oder -Erkennung
Regressionen hinzufügen (Leitfaden)
Wenn Sie ein in Live entdecktes Provider-/Modellproblem beheben:- Fügen Sie nach Möglichkeit eine CI-sichere Regression hinzu (Mock/Stub-Provider oder erfassen Sie die exakte Transformation der Anfrageform)
- Wenn das Problem von Natur aus nur live auftritt (Ratenlimits, Authentifizierungsrichtlinien), halten Sie den Live-Test schmal und aktivieren Sie ihn nur per Opt-in über Umgebungsvariablen
- Zielen Sie bevorzugt auf die kleinste Ebene, die den Fehler erfasst:
- Fehler bei Provider-Anfragekonvertierung/-Replay → Test für direkte Modelle
- Fehler in Gateway-Sitzung/Verlauf/Tool-Pipeline → Gateway-Live-Smoke oder CI-sicherer Gateway-Mock-Test
- Guardrail für SecretRef-Durchlauf:
src/secrets/exec-secret-ref-id-parity.test.tsleitet aus Registry-Metadaten (listSecretTargetRegistryEntries()) ein Beispielziel pro SecretRef-Klasse ab und prüft dann, dass Durchlaufsegment-Exec-IDs abgelehnt werden.- Wenn Sie in
src/secrets/target-registry-data.tseine neueincludeInPlan-SecretRef-Zielfamilie hinzufügen, aktualisieren SieclassifyTargetClassin diesem Test. Der Test schlägt absichtlich bei nicht klassifizierten Ziel-IDs fehl, damit neue Klassen nicht stillschweigend übersprungen werden.