Testing
OpenClaw dispose de trois suites Vitest (unitaire/intégration, e2e, live) et d’un petit ensemble de runners Docker. Cette documentation est un guide « comment nous testons » :- Ce que couvre chaque suite (et ce qu’elle ne couvre délibérément pas)
- Quelles commandes exécuter pour les workflows courants (local, avant push, débogage)
- Comment les tests live découvrent les identifiants et sélectionnent les modèles/fournisseurs
- Comment ajouter des régressions pour des problèmes réels de modèle/fournisseur
Démarrage rapide
La plupart des jours :- Porte complète (attendue avant un push) :
pnpm build && pnpm check && pnpm test - Exécution locale plus rapide de la suite complète sur une machine bien dimensionnée :
pnpm test:max - Boucle directe Vitest watch (configuration moderne des projets) :
pnpm test:watch - Le ciblage direct de fichier route désormais aussi les chemins d’extension/canal :
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts
- Porte de couverture :
pnpm test:coverage - Suite E2E :
pnpm test:e2e
- Suite live (modèles + sondes gateway outil/image) :
pnpm test:live - Cibler silencieusement un seul fichier live :
pnpm test:live -- src/agents/models.profiles.live.test.ts
Suites de test (ce qui s’exécute où)
Considérez les suites comme ayant un « réalisme croissant » (et une instabilité/un coût croissants) :Unitaire / intégration (par défaut)
- Commande :
pnpm test - Configuration :
projectsVitest natifs viavitest.config.ts - Fichiers : inventaires core/unit sous
src/**/*.test.ts,packages/**/*.test.ts,test/**/*.test.ts, et les tests nodeuiautorisés couverts parvitest.unit.config.ts - Portée :
- Tests unitaires purs
- Tests d’intégration en processus (authentification gateway, routage, outillage, parsing, configuration)
- Régressions déterministes pour des bugs connus
- Attentes :
- S’exécute en CI
- Aucune vraie clé requise
- Doit être rapide et stable
- Remarque sur les projets :
pnpm test,pnpm test:watchetpnpm test:changedutilisent désormais tous la même configuration racine Vitest nativeprojects.- Les filtres de fichier directs passent nativement par le graphe de projet racine, donc
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsfonctionne sans wrapper personnalisé.
- Remarque sur le runner intégré :
- Lorsque vous modifiez les entrées de découverte de l’outil de message ou le contexte d’exécution de compaction, conservez les deux niveaux de couverture.
- Ajoutez des régressions d’assistants ciblées pour les limites pures de routage/normalisation.
- Gardez également en bon état les suites d’intégration du runner intégré :
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.ts, etsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Ces suites vérifient que les IDs limités en portée et le comportement de compaction passent toujours par les vrais chemins
run.ts/compact.ts; des tests sur assistants uniquement ne remplacent pas suffisamment ces chemins d’intégration.
- Remarque sur le pool :
- La configuration Vitest de base utilise désormais
threadspar défaut. - La configuration Vitest partagée fixe aussi
isolate: falseet utilise le runner non isolé sur les projets racine, e2e et live. - La voie UI racine conserve sa configuration
jsdomet son optimiseur, mais s’exécute désormais aussi sur le runner partagé non isolé. pnpm testhérite des mêmes valeurs par défautthreads+isolate: falsedepuis la configuration de projets devitest.config.ts.- Le lanceur partagé
scripts/run-vitest.mjsajoute désormais aussi--no-maglevpar défaut aux processus Node enfants de Vitest pour réduire l’agitation de compilation V8 lors des grosses exécutions locales. DéfinissezOPENCLAW_VITEST_ENABLE_MAGLEV=1si vous devez comparer avec le comportement V8 standard.
- La configuration Vitest de base utilise désormais
- Remarque sur l’itération locale rapide :
pnpm test:changedexécute la configuration native des projets avec--changed origin/main.pnpm test:maxetpnpm test:changed:maxconservent la même configuration native des projets, simplement avec une limite supérieure de workers.- L’auto-scaling local des workers est désormais volontairement conservateur et réduit aussi l’activité lorsque la charge moyenne de l’hôte est déjà élevée, afin que plusieurs exécutions Vitest simultanées fassent moins de dégâts par défaut.
- La configuration Vitest de base marque désormais les fichiers de projets/configuration comme
forceRerunTriggersafin que les reruns en mode changed restent corrects lorsque le câblage des tests change. - La configuration garde
OPENCLAW_VITEST_FS_MODULE_CACHEactivé sur les hôtes pris en charge ; définissezOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathsi vous souhaitez un emplacement explicite de cache pour le profilage direct.
- Remarque sur le débogage des performances :
pnpm test:perf:importsactive les rapports de durée d’import Vitest ainsi que la ventilation des imports.pnpm test:perf:imports:changedlimite cette même vue de profilage aux fichiers modifiés depuisorigin/main.pnpm test:perf:profile:mainécrit un profil CPU du thread principal pour la surcharge de démarrage et de transformation Vitest/Vite.pnpm test:perf:profile:runnerécrit des profils CPU+heap du runner pour la suite unitaire avec le parallélisme par fichier désactivé.
E2E (gateway smoke)
- Commande :
pnpm test:e2e - Configuration :
vitest.e2e.config.ts - Fichiers :
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts - Valeurs par défaut d’exécution :
- Utilise Vitest
threadsavecisolate: false, en cohérence avec le reste du dépôt. - Utilise des workers adaptatifs (CI : jusqu’à 2, local : 1 par défaut).
- S’exécute en mode silencieux par défaut afin de réduire la surcharge d’E/S console.
- Utilise Vitest
- Remplacements utiles :
OPENCLAW_E2E_WORKERS=<n>pour forcer le nombre de workers (plafonné à 16).OPENCLAW_E2E_VERBOSE=1pour réactiver la sortie console détaillée.
- Portée :
- Comportement E2E multi-instances de la gateway
- Surfaces WebSocket/HTTP, jumelage de nœuds et réseau plus lourd
- Attentes :
- S’exécute en CI (lorsqu’activé dans le pipeline)
- Aucune vraie clé requise
- Davantage d’éléments mobiles que les tests unitaires (peut être plus lent)
E2E : smoke du backend OpenShell
- Commande :
pnpm test:e2e:openshell - Fichier :
test/openshell-sandbox.e2e.test.ts - Portée :
- Démarre une gateway OpenShell isolée sur l’hôte via Docker
- Crée une sandbox à partir d’un Dockerfile local temporaire
- Exerce le backend OpenShell d’OpenClaw via de vrais
sandbox ssh-config+ exécution SSH - Vérifie le comportement du système de fichiers canonique distant via le pont fs de la sandbox
- Attentes :
- Opt-in uniquement ; ne fait pas partie de l’exécution par défaut
pnpm test:e2e - Nécessite une CLI locale
openshellainsi qu’un daemon Docker fonctionnel - Utilise un
HOME/XDG_CONFIG_HOMEisolé, puis détruit la gateway et la sandbox de test
- Opt-in uniquement ; ne fait pas partie de l’exécution par défaut
- Remplacements utiles :
OPENCLAW_E2E_OPENSHELL=1pour activer le test lors de l’exécution manuelle de la suite e2e plus largeOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellpour pointer vers un binaire CLI non standard ou un script wrapper
Live (vrais fournisseurs + vrais modèles)
- Commande :
pnpm test:live - Configuration :
vitest.live.config.ts - Fichiers :
src/**/*.live.test.ts - Par défaut : activé par
pnpm test:live(définitOPENCLAW_LIVE_TEST=1) - Portée :
- « Ce fournisseur/modèle fonctionne-t-il vraiment aujourd’hui avec de vrais identifiants ? »
- Détecter les changements de format fournisseur, les particularités d’appel d’outil, les problèmes d’authentification et le comportement de limitation de débit
- Attentes :
- Non stable en CI par conception (vrais réseaux, vraies politiques fournisseur, quotas, pannes)
- Coûte de l’argent / consomme des limites de débit
- Préférez exécuter des sous-ensembles restreints plutôt que « tout »
- Les exécutions live sourcent
~/.profilepour récupérer les clés API manquantes. - Par défaut, les exécutions live isolent toujours
HOMEet copient la configuration/le matériel d’authentification dans un répertoire temporaire de test afin que les fixtures unitaires ne puissent pas modifier votre vrai~/.openclaw. - Définissez
OPENCLAW_LIVE_USE_REAL_HOME=1uniquement lorsque vous voulez explicitement que les tests live utilisent votre vrai répertoire personnel. pnpm test:liveutilise désormais un mode plus silencieux par défaut : il conserve la sortie de progression[live] ..., mais supprime la notice supplémentaire~/.profileet coupe les journaux de bootstrap gateway / le bruit Bonjour. DéfinissezOPENCLAW_LIVE_TEST_QUIET=0si vous souhaitez retrouver les journaux complets de démarrage.- Rotation de clés API (spécifique au fournisseur) : définissez
*_API_KEYSau format virgule/point-virgule ou*_API_KEY_1,*_API_KEY_2(par exempleOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) ou un remplacement live parOPENCLAW_LIVE_*_KEY; les tests réessaient sur les réponses de limitation de débit. - Sortie de progression/heartbeat :
- Les suites live émettent désormais des lignes de progression sur stderr afin que les appels fournisseur longs restent visiblement actifs même lorsque la capture de console Vitest est silencieuse.
vitest.live.config.tsdésactive l’interception de console Vitest afin que les lignes de progression fournisseur/gateway soient diffusées immédiatement pendant les exécutions live.- Ajustez les heartbeats de modèle direct avec
OPENCLAW_LIVE_HEARTBEAT_MS. - Ajustez les heartbeats gateway/sonde avec
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Quelle suite dois-je exécuter ?
Utilisez ce tableau de décision :- Modifier la logique/les tests : exécutez
pnpm test(etpnpm test:coveragesi vous avez beaucoup changé) - Toucher au réseau gateway / protocole WS / jumelage : ajoutez
pnpm test:e2e - Déboguer « mon bot est en panne » / des échecs spécifiques à un fournisseur / l’appel d’outil : exécutez un
pnpm test:liverestreint
Live : balayage des capacités du nœud Android
- Test :
src/gateway/android-node.capabilities.live.test.ts - Script :
pnpm android:test:integration - Objectif : invoquer chaque commande actuellement annoncée par un nœud Android connecté et vérifier le comportement du contrat de commande.
- Portée :
- Préconfiguration/configuration manuelle (la suite n’installe ni n’exécute ni ne jumelle l’application).
- Validation
node.invokede gateway, commande par commande, pour le nœud Android sélectionné.
- Préconfiguration requise :
- Application Android déjà connectée + jumelée à la gateway.
- Application maintenue au premier plan.
- Permissions/consentements de capture accordés pour les capacités que vous attendez comme réussies.
- Remplacements facultatifs de cible :
OPENCLAW_ANDROID_NODE_IDouOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- Détails complets de configuration Android : Application Android
Live : smoke des modèles (clés de profil)
Les tests live sont divisés en deux couches afin de pouvoir isoler les échecs :- Le « modèle direct » nous indique si le fournisseur/modèle peut répondre tout court avec la clé donnée.
- Le « gateway smoke » nous indique si le pipeline complet gateway+agent fonctionne pour ce modèle (sessions, historique, outils, politique de sandbox, etc.).
Couche 1 : complétion de modèle directe (sans gateway)
- Test :
src/agents/models.profiles.live.test.ts - Objectif :
- Énumérer les modèles découverts
- Utiliser
getApiKeyForModelpour sélectionner les modèles pour lesquels vous avez des identifiants - Exécuter une petite complétion par modèle (et des régressions ciblées si nécessaire)
- Comment activer :
pnpm test:live(ouOPENCLAW_LIVE_TEST=1si vous invoquez Vitest directement)
- Définissez
OPENCLAW_LIVE_MODELS=modern(ouall, alias de modern) pour réellement exécuter cette suite ; sinon elle est ignorée afin quepnpm test:livereste centré sur le gateway smoke - Comment sélectionner les modèles :
OPENCLAW_LIVE_MODELS=modernpour exécuter la liste d’autorisation moderne (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)OPENCLAW_LIVE_MODELS=allest un alias pour la liste d’autorisation moderne- ou
OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."(liste d’autorisation séparée par des virgules)
- Comment sélectionner les fournisseurs :
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(liste d’autorisation séparée par des virgules)
- D’où viennent les clés :
- Par défaut : magasin de profils et replis d’environnement
- Définissez
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour forcer le magasin de profils uniquement
- Pourquoi cela existe :
- Sépare « l’API fournisseur est cassée / la clé est invalide » de « le pipeline d’agent gateway est cassé »
- Contient de petites régressions isolées (exemple : réponses OpenAI / relecture de raisonnement Codex Responses + flux d’appel d’outil)
Couche 2 : gateway + smoke de l’agent dev (ce que fait réellement “@openclaw”)
- Test :
src/gateway/gateway-models.profiles.live.test.ts - Objectif :
- Démarrer une gateway en processus
- Créer/patcher une session
agent:dev:*(remplacement de modèle par exécution) - Itérer sur les modèles-avec-clés et vérifier :
- réponse « significative » (sans outils)
- le fonctionnement d’une vraie invocation d’outil (sonde read)
- des sondes d’outil supplémentaires facultatives (sonde exec+read)
- le maintien des chemins de régression OpenAI (tool-call-only → suivi)
- Détails des sondes (afin que vous puissiez expliquer rapidement les échecs) :
- sonde
read: le test écrit un fichier nonce dans l’espace de travail et demande à l’agent de lereadpuis de renvoyer le nonce. - sonde
exec+read: le test demande à l’agent d’écrire viaexecun nonce dans un fichier temporaire, puis de leread. - sonde image : le test joint un PNG généré (chat + code aléatoire) et attend que le modèle renvoie
cat <CODE>. - Référence d’implémentation :
src/gateway/gateway-models.profiles.live.test.tsetsrc/gateway/live-image-probe.ts.
- sonde
- Comment activer :
pnpm test:live(ouOPENCLAW_LIVE_TEST=1si vous invoquez Vitest directement)
- Comment sélectionner les modèles :
- Par défaut : liste d’autorisation moderne (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=allest un alias pour la liste d’autorisation moderne- Ou définissez
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(ou liste séparée par des virgules) pour restreindre
- Comment sélectionner les fournisseurs (éviter « tout OpenRouter ») :
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(liste d’autorisation séparée par des virgules)
- Les sondes d’outil + image sont toujours activées dans ce test live :
- sonde
read+ sondeexec+read(stress d’outil) - la sonde image s’exécute lorsque le modèle annonce la prise en charge d’entrée image
- Flux (niveau élevé) :
- Le test génère un petit PNG avec « CAT » + un code aléatoire (
src/gateway/live-image-probe.ts) - L’envoie via
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - La gateway analyse les pièces jointes dans
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - L’agent intégré transmet un message utilisateur multimodal au modèle
- Assertion : la réponse contient
cat+ le code (tolérance OCR : erreurs mineures autorisées)
- Le test génère un petit PNG avec « CAT » + un code aléatoire (
- sonde
provider/model), exécutez :
Live : smoke du backend CLI (Claude CLI ou autres CLI locales)
- Test :
src/gateway/gateway-cli-backend.live.test.ts - Objectif : valider le pipeline gateway + agent à l’aide d’un backend CLI local, sans toucher à votre configuration par défaut.
- Activer :
pnpm test:live(ouOPENCLAW_LIVE_TEST=1si vous invoquez Vitest directement)OPENCLAW_LIVE_CLI_BACKEND=1
- Valeurs par défaut :
- Modèle :
claude-cli/claude-sonnet-4-6 - Commande :
claude - Args :
["-p","--output-format","stream-json","--include-partial-messages","--verbose","--permission-mode","bypassPermissions"]
- Modèle :
- Remplacements (facultatifs) :
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","stream-json","--include-partial-messages","--verbose","--permission-mode","bypassPermissions"]'OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1pour envoyer une vraie pièce jointe image (les chemins sont injectés dans le prompt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"pour passer les chemins de fichier image en args CLI au lieu de les injecter dans le prompt.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(ou"list") pour contrôler la façon dont les args image sont passés lorsqueIMAGE_ARGest défini.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1pour envoyer un second tour et valider le flux de reprise.
OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0pour garder activée la configuration MCP de Claude CLI (par défaut injecte une configuration temporaire stricte vide--mcp-configafin que les serveurs MCP globaux/ambiants restent désactivés pendant le smoke).
- Le runner Docker se trouve dans
scripts/test-live-cli-backend-docker.sh. - Il exécute le smoke live du backend CLI dans l’image Docker du dépôt comme utilisateur non root
node, car Claude CLI refusebypassPermissionslorsqu’il est invoqué en root. - Pour
claude-cli, il installe le package Linux@anthropic-ai/claude-codedans un préfixe inscriptible mis en cache àOPENCLAW_DOCKER_CLI_TOOLS_DIR(par défaut :~/.cache/openclaw/docker-cli-tools). - Pour
claude-cli, le smoke live injecte une configuration MCP vide stricte sauf si vous définissezOPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0. - Il copie
~/.claudedans le conteneur lorsqu’il est disponible, mais sur les machines où l’authentification Claude repose surANTHROPIC_API_KEY, il préserve aussiANTHROPIC_API_KEY/ANTHROPIC_API_KEY_OLDpour la CLI Claude enfant viaOPENCLAW_LIVE_CLI_BACKEND_PRESERVE_ENV.
Live : smoke ACP bind (/acp spawn ... --bind here)
- Test :
src/gateway/gateway-acp-bind.live.test.ts - Objectif : valider le vrai flux de liaison de conversation ACP avec un agent ACP live :
- envoyer
/acp spawn <agent> --bind here - lier en place une conversation synthétique de canal de messages
- envoyer un suivi normal sur cette même conversation
- vérifier que le suivi aboutit dans la transcription de la session ACP liée
- envoyer
- Activer :
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- Valeurs par défaut :
- Agent ACP :
claude - Canal synthétique : contexte de conversation de type DM Slack
- Backend ACP :
acpx
- Agent ACP :
- Remplacements :
OPENCLAW_LIVE_ACP_BIND_AGENT=claudeOPENCLAW_LIVE_ACP_BIND_AGENT=codexOPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=/full/path/to/acpx
- Remarques :
- Cette voie utilise la surface gateway
chat.sendavec des champs de route d’origine synthétiques réservés à l’admin afin que les tests puissent joindre un contexte de canal de messages sans prétendre à une livraison externe. - Lorsque
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMANDn’est pas défini, le test utilise la commande acpx configurée/groupée. Si l’authentification de votre harnais dépend de variables d’environnement issues de~/.profile, préférez une commandeacpxpersonnalisée qui préserve l’environnement du fournisseur.
- Cette voie utilise la surface gateway
- Le runner Docker se trouve dans
scripts/test-live-acp-bind-docker.sh. - Il source
~/.profile, copie le répertoire d’authentification CLI correspondant (~/.claudeou~/.codex) dans le conteneur, installeacpxdans un préfixe npm inscriptible, puis installe la CLI live demandée (@anthropic-ai/claude-codeou@openai/codex) si elle est absente. - Dans Docker, le runner définit
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpxafin qu’acpx conserve pour la CLI enfant du harnais les variables d’environnement du fournisseur provenant du profil sourcé.
Recettes live recommandées
Des listes d’autorisation étroites et explicites sont les plus rapides et les moins instables :-
Modèle unique, direct (sans gateway) :
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
Modèle unique, gateway smoke :
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Appel d’outil sur plusieurs fournisseurs :
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
-
Focus Google (clé API Gemini + Antigravity) :
- Gemini (clé API) :
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 (clé API) :
google/...utilise l’API Gemini (clé API).google-antigravity/...utilise le pont OAuth Antigravity (point de terminaison d’agent type Cloud Code Assist).google-gemini-cli/...utilise la CLI Gemini locale sur votre machine (authentification séparée + particularités d’outillage).- API Gemini vs CLI Gemini :
- API : OpenClaw appelle l’API Gemini hébergée par Google via HTTP (clé API / auth de profil) ; c’est ce que la plupart des utilisateurs veulent dire par « Gemini ».
- CLI : OpenClaw lance un binaire local
gemini; il possède sa propre authentification et peut se comporter différemment (streaming/prise en charge d’outils/décalage de version).
Live : matrice de modèles (ce que nous couvrons)
Il n’existe pas de « liste de modèles CI » fixe (live est opt-in), mais voici les modèles recommandés à couvrir régulièrement sur une machine de développement disposant de clés.Ensemble smoke moderne (appel d’outil + image)
C’est l’exécution des « modèles courants » que nous nous attendons à voir fonctionner :- OpenAI (hors Codex) :
openai/gpt-5.4(facultatif :openai/gpt-5.4-mini) - OpenAI Codex :
openai-codex/gpt-5.4 - Anthropic :
anthropic/claude-opus-4-6(ouanthropic/claude-sonnet-4-6) - Google (API Gemini) :
google/gemini-3.1-pro-previewetgoogle/gemini-3-flash-preview(éviter les anciens modèles Gemini 2.x) - Google (Antigravity) :
google-antigravity/claude-opus-4-6-thinkingetgoogle-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
Base : appel d’outil (Read + Exec facultatif)
Choisissez-en au moins un par famille de fournisseurs :- OpenAI :
openai/gpt-5.4(ouopenai/gpt-5.4-mini) - Anthropic :
anthropic/claude-opus-4-6(ouanthropic/claude-sonnet-4-6) - Google :
google/gemini-3-flash-preview(ougoogle/gemini-3.1-pro-preview) - Z.AI (GLM) :
zai/glm-4.7 - MiniMax :
minimax/MiniMax-M2.7
- xAI :
xai/grok-4(ou la dernière version disponible) - Mistral :
mistral/… (choisissez un modèle capable d’utiliser des outils que vous avez activé) - Cerebras :
cerebras/… (si vous y avez accès) - LM Studio :
lmstudio/… (local ; l’appel d’outil dépend du mode API)
Vision : envoi d’image (pièce jointe → message multimodal)
Incluez au moins un modèle compatible image dansOPENCLAW_LIVE_GATEWAY_MODELS (Claude/Gemini/variantes OpenAI compatibles vision, etc.) pour exercer la sonde image.
Agrégateurs / passerelles alternatives
Si vous avez des clés activées, nous prenons aussi en charge les tests via :- OpenRouter :
openrouter/...(des centaines de modèles ; utilisezopenclaw models scanpour trouver des candidats compatibles outils+image) - OpenCode :
opencode/...pour Zen etopencode-go/...pour Go (authentification viaOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- Intégrés :
openai,openai-codex,anthropic,google,google-vertex,google-antigravity,google-gemini-cli,zai,openrouter,opencode,opencode-go,xai,groq,cerebras,mistral,github-copilot - Via
models.providers(points de terminaison personnalisés) :minimax(cloud/API), plus tout proxy compatible OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, etc.)
discoverModels(...) renvoie sur votre machine + les clés disponibles.
Identifiants (ne jamais commit)
Les tests live découvrent les identifiants de la même manière que la CLI. Conséquences pratiques :- Si la CLI fonctionne, les tests live devraient trouver les mêmes clés.
-
Si un test live dit « no creds », déboguez-le de la même manière que
openclaw models list/ la sélection de modèle. -
Profils d’authentification par agent :
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(c’est ce que signifient les « profile keys » dans les tests live) -
Configuration :
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH) -
Répertoire d’état hérité :
~/.openclaw/credentials/(copié dans le home live intermédiaire lorsqu’il est présent, mais pas le magasin principal de clés de profil) -
Les exécutions locales live copient par défaut dans un home de test temporaire la configuration active, les fichiers
auth-profiles.jsonpar agent, le répertoire héritécredentials/et les répertoires d’authentification CLI externes pris en charge ; les remplacements de cheminagents.*.workspace/agentDirsont retirés de cette configuration intermédiaire afin que les sondes n’atteignent pas votre vrai espace de travail hôte.
~/.profile), exécutez les tests locaux après source ~/.profile, ou utilisez les runners Docker ci-dessous (ils peuvent monter ~/.profile dans le conteneur).
Deepgram live (transcription audio)
- Test :
src/media-understanding/providers/deepgram/audio.live.test.ts - Activer :
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 - Activer :
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts - Remplacement facultatif du modèle :
BYTEPLUS_CODING_MODEL=ark-code-latest
Génération d’image live
- Test :
src/image-generation/runtime.live.test.ts - Commande :
pnpm test:live src/image-generation/runtime.live.test.ts - Portée :
- Énumère chaque plugin fournisseur de génération d’image enregistré
- Charge les variables d’environnement fournisseur manquantes depuis votre shell de connexion (
~/.profile) avant la sonde - Utilise par défaut les clés API live/env avant les profils d’authentification stockés, afin que des clés de test obsolètes dans
auth-profiles.jsonne masquent pas de vrais identifiants shell - Ignore les fournisseurs sans auth/profil/modèle exploitable
- Exécute les variantes standard de génération d’image via la capacité runtime partagée :
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- Fournisseurs groupés actuellement couverts :
openaigoogle
- Restriction facultative :
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"
- Comportement d’authentification facultatif :
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour forcer l’authentification du magasin de profils et ignorer les remplacements uniquement env
Runners Docker (vérifications facultatives « fonctionne sous Linux »)
Ces runners Docker sont répartis en deux catégories :- Runners live-model :
test:docker:live-modelsettest:docker:live-gatewayn’exécutent que leur fichier live de profile-key correspondant à l’intérieur de l’image Docker du dépôt (src/agents/models.profiles.live.test.tsetsrc/gateway/gateway-models.profiles.live.test.ts), en montant votre répertoire local de configuration et votre espace de travail (et en sourçant~/.profilesi monté). Les points d’entrée locaux correspondants sonttest:live:models-profilesettest:live:gateway-profiles. - Les runners Docker live utilisent par défaut une limite smoke plus réduite afin qu’un balayage Docker complet reste pratique :
test:docker:live-modelsutilise par défautOPENCLAW_LIVE_MAX_MODELS=12, ettest:docker:live-gatewayutilise par défautOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000, etOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Remplacez ces variables d’environnement lorsque vous voulez explicitement un scan exhaustif plus large. test:docker:allconstruit l’image Docker live une fois viatest:docker:live-build, puis la réutilise pour les deux voies Docker live.- Runners de smoke de conteneur :
test:docker:openwebui,test:docker:onboard,test:docker:gateway-network,test:docker:mcp-channels, ettest:docker:pluginsdémarrent un ou plusieurs vrais conteneurs et vérifient des chemins d’intégration de plus haut niveau.
- Modèles directs :
pnpm test:docker:live-models(script :scripts/test-live-models-docker.sh) - ACP bind smoke :
pnpm test:docker:live-acp-bind(script :scripts/test-live-acp-bind-docker.sh) - CLI backend smoke :
pnpm test:docker:live-cli-backend(script :scripts/test-live-cli-backend-docker.sh) - Gateway + agent dev :
pnpm test:docker:live-gateway(script :scripts/test-live-gateway-models-docker.sh) - Open WebUI live smoke :
pnpm test:docker:openwebui(script :scripts/e2e/openwebui-docker.sh) - Assistant d’onboarding (TTY, échafaudage complet) :
pnpm test:docker:onboard(script :scripts/e2e/onboard-docker.sh) - Réseau gateway (deux conteneurs, auth WS + health) :
pnpm test:docker:gateway-network(script :scripts/e2e/gateway-network-docker.sh) - Pont de canal MCP (gateway initialisée + pont stdio + smoke brut de trame de notification Claude) :
pnpm test:docker:mcp-channels(script :scripts/e2e/mcp-channels-docker.sh) - Plugins (smoke d’installation + alias
/plugin+ sémantique de redémarrage du bundle Claude) :pnpm test:docker:plugins(script :scripts/e2e/plugins-docker.sh)
OPENCLAW_SKIP_CHANNELS=1 afin que les sondes live gateway ne démarrent
pas de vrais workers de canaux Telegram/Discord/etc. dans le conteneur.
test:docker:live-models exécute toujours pnpm test:live, donc faites aussi passer
OPENCLAW_LIVE_GATEWAY_* lorsque vous devez restreindre ou exclure la couverture
gateway live de cette voie Docker.
test:docker:openwebui est un smoke de compatibilité de plus haut niveau : il démarre un
conteneur gateway OpenClaw avec les points de terminaison HTTP compatibles OpenAI activés,
démarre un conteneur Open WebUI épinglé contre cette gateway, se connecte via
Open WebUI, vérifie que /api/models expose openclaw/default, puis envoie une vraie
requête de chat via le proxy /api/chat/completions d’Open WebUI.
La première exécution peut être sensiblement plus lente car Docker peut devoir récupérer l’image
Open WebUI et Open WebUI peut devoir terminer sa propre configuration de démarrage à froid.
Cette voie attend une clé de modèle live exploitable, et OPENCLAW_PROFILE_FILE
(~/.profile par défaut) est le principal moyen de la fournir dans les exécutions conteneurisées.
Les exécutions réussies affichent une petite charge utile JSON comme { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels est volontairement déterministe et n’a pas besoin d’un
vrai compte Telegram, Discord ou iMessage. Il démarre une gateway
initialisée, lance un second conteneur qui exécute openclaw mcp serve, puis
vérifie la découverte de conversations routées, la lecture de transcription, les métadonnées de pièces jointes,
le comportement de la file d’événements live, le routage des envois sortants, ainsi que les notifications de canal +
d’autorisation de style Claude via le vrai pont MCP stdio. La vérification des notifications
inspecte directement les trames MCP stdio brutes afin que le smoke valide ce que le
pont émet réellement, et non seulement ce qu’un SDK client particulier choisit d’exposer.
Smoke manuel ACP en langage naturel sur fil (hors CI) :
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Conservez ce script pour les workflows de régression/débogage. Il pourrait être nécessaire à nouveau pour la validation du routage ACP sur fil, donc ne le supprimez pas.
OPENCLAW_CONFIG_DIR=...(par défaut :~/.openclaw) monté sur/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(par défaut :~/.openclaw/workspace) monté sur/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(par défaut :~/.profile) monté sur/home/node/.profileet sourcé avant l’exécution des testsOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(par défaut :~/.cache/openclaw/docker-cli-tools) monté sur/home/node/.npm-globalpour les installations CLI mises en cache dans Docker- Les répertoires d’authentification CLI externes sous
$HOMEsont montés en lecture seule sous/host-auth/..., puis copiés dans/home/node/...avant le démarrage des tests- Par défaut : monter tous les répertoires pris en charge (
.codex,.claude,.minimax) - Les exécutions restreintes à certains fournisseurs ne montent que les répertoires nécessaires déduits de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Remplacement manuel avec
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=none, ou une liste séparée par des virgules commeOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Par défaut : monter tous les répertoires pris en charge (
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...pour restreindre l’exécutionOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...pour filtrer les fournisseurs dans le conteneurOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour garantir que les identifiants proviennent du magasin de profils (et non de l’environnement)OPENCLAW_OPENWEBUI_MODEL=...pour choisir le modèle exposé par la gateway pour le smoke Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...pour remplacer le prompt de vérification du nonce utilisé par le smoke Open WebUIOPENWEBUI_IMAGE=...pour remplacer le tag d’image Open WebUI épinglé
Vérification de la documentation
Exécutez les vérifications docs après des modifications de documentation :pnpm check:docs.
Exécutez la validation complète des ancres Mintlify lorsque vous avez aussi besoin des vérifications d’en-têtes dans la page : pnpm docs:check-links:anchors.
Régression hors ligne (compatible CI)
Il s’agit de régressions « vrai pipeline » sans vrais fournisseurs :- Appel d’outil gateway (faux OpenAI, vraie gateway + boucle d’agent) :
src/gateway/gateway.test.ts(cas : “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Assistant gateway (WS
wizard.start/wizard.next, écrit config + auth imposée) :src/gateway/gateway.test.ts(cas : “runs wizard over ws and writes auth token config”)
Évaluations de fiabilité d’agent (Skills)
Nous avons déjà quelques tests compatibles CI qui se comportent comme des « évaluations de fiabilité d’agent » :- Appel d’outil simulé via la vraie gateway + boucle d’agent (
src/gateway/gateway.test.ts). - Flux d’assistant de bout en bout qui valident le câblage de session et les effets de configuration (
src/gateway/gateway.test.ts).
- Prise de décision : lorsque les Skills sont listés dans le prompt, l’agent choisit-il la bonne Skill (ou évite-t-il celles qui ne sont pas pertinentes) ?
- Conformité : l’agent lit-il
SKILL.mdavant utilisation et suit-il les étapes/arguments requis ? - Contrats de workflow : scénarios multi-tours qui vérifient l’ordre des outils, la reprise de l’historique de session et les limites de sandbox.
- Un runner de scénarios utilisant des fournisseurs simulés pour vérifier les appels d’outils + leur ordre, les lectures de fichiers de Skill et le câblage de session.
- Une petite suite de scénarios centrés sur les Skills (utiliser vs éviter, gating, injection de prompt).
- Des évaluations live facultatives (opt-in, contrôlées par env) uniquement après la mise en place de la suite compatible CI.
Tests de contrat (forme des plugins et des canaux)
Les tests de contrat vérifient que chaque plugin et canal enregistré respecte son contrat d’interface. Ils itèrent sur tous les plugins découverts et exécutent une suite de vérifications de forme et de comportement. La voie unitaire par défautpnpm test
ignore volontairement ces fichiers de seam partagé et de smoke ; exécutez explicitement
les commandes de contrat lorsque vous touchez à des surfaces partagées de canal ou de fournisseur.
Commandes
- Tous les contrats :
pnpm test:contracts - Contrats de canal uniquement :
pnpm test:contracts:channels - Contrats de fournisseur uniquement :
pnpm test:contracts:plugins
Contrats de canal
Situés danssrc/channels/plugins/contracts/*.contract.test.ts :
- plugin - forme de base du plugin (id, nom, capacités)
- setup - contrat de l’assistant de configuration
- session-binding - comportement de liaison de session
- outbound-payload - structure de la charge utile de message
- inbound - gestion des messages entrants
- actions - gestionnaires d’actions du canal
- threading - gestion des IDs de fil
- directory - API d’annuaire/roster
- group-policy - application de la politique de groupe
Contrats d’état de fournisseur
Situés danssrc/plugins/contracts/*.contract.test.ts.
- status - sondes d’état de canal
- registry - forme du registre de plugins
Contrats de fournisseur
Situés danssrc/plugins/contracts/*.contract.test.ts :
- auth - contrat du flux d’authentification
- auth-choice - choix/sélection d’authentification
- catalog - API de catalogue de modèles
- discovery - découverte de plugin
- loader - chargement de plugin
- runtime - runtime du fournisseur
- shape - forme/interface du plugin
- wizard - assistant de configuration
Quand les exécuter
- Après avoir modifié les exports ou sous-chemins de plugin-sdk
- Après avoir ajouté ou modifié un plugin de canal ou de fournisseur
- Après une refactorisation de l’enregistrement ou de la découverte de plugins
Ajout de régressions (conseils)
Lorsque vous corrigez un problème de fournisseur/modèle découvert en live :- Ajoutez si possible une régression compatible CI (fournisseur simulé/stub, ou capture de la transformation exacte de forme de requête)
- Si le problème est intrinsèquement live-only (limitations de débit, politiques d’authentification), gardez le test live restreint et opt-in via variables d’environnement
- Préférez cibler la couche la plus petite qui détecte le bug :
- bug de conversion/relecture de requête fournisseur → test direct de modèles
- bug de pipeline gateway session/historique/outils → gateway live smoke ou test simulé de gateway compatible CI
- Garde-fou de traversée SecretRef :
src/secrets/exec-secret-ref-id-parity.test.tsdérive une cible échantillon par classe SecretRef à partir des métadonnées du registre (listSecretTargetRegistryEntries()), puis vérifie que les IDs exec avec segments de traversée sont rejetés.- Si vous ajoutez une nouvelle famille de cibles SecretRef
includeInPlandanssrc/secrets/target-registry-data.ts, mettez à jourclassifyTargetClassdans ce test. Le test échoue intentionnellement sur les IDs de cibles non classés afin que les nouvelles classes ne puissent pas être ignorées silencieusement.