Testing
Tests : suites en conditions réelles
Pour le démarrage rapide, les exécuteurs d’assurance qualité, les suites de tests unitaires et d’intégration ainsi que les flux Docker, consultez Tests. Cette page traite des tests en conditions réelles (avec accès réseau) : matrice de modèles, backends CLI, ACP, fournisseurs multimédias et gestion des identifiants.
En conditions réelles : commandes de vérification rapide locale
Exportez la clé du fournisseur requise dans l’environnement du processus avant d’effectuer des vérifications ponctuelles en conditions réelles.
Vérification multimédia sûre :
pnpm openclaw infer tts convert --local --json \ --text "OpenClaw live smoke." \ --output /tmp/openclaw-live-smoke.mp3Vérification sûre de la disponibilité des appels vocaux :
pnpm openclaw voicecall setup --jsonpnpm openclaw voicecall smoke --to "+15555550123"voicecall smoke effectue une simulation, sauf si --yes est également présent ; utilisez --yes uniquement
si vous avez l’intention de passer un véritable appel. Pour Twilio, Telnyx et Plivo, une
vérification de disponibilité réussie nécessite une URL de webhook publique ; les URL local loopback
ou privées sont rejetées, car ces fournisseurs ne peuvent pas les atteindre.
En conditions réelles : analyse des capacités d’un Node Android
- Test :
src/gateway/android-node.capabilities.live.test.ts - Script :
pnpm android:test:integration - Objectif : invoquer chaque commande actuellement annoncée par un Node Android connecté et vérifier le comportement contractuel des commandes.
- Périmètre :
- Configuration manuelle préalable (la suite n’installe, n’exécute ni n’appaire l’application).
- Validation, commande par commande, de
node.invokedu Gateway pour le Node Android sélectionné.
- Configuration préalable requise :
- Application Android déjà connectée et appairée au Gateway.
- Application maintenue au premier plan.
- Autorisations et consentement à la capture accordés pour les capacités dont vous attendez la réussite.
- Remplacements facultatifs de la cible :
OPENCLAW_ANDROID_NODE_IDouOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- Détails complets de la configuration Android : Application Android
En conditions réelles : vérification rapide des modèles (clés de profil)
Les tests de modèles en conditions réelles sont répartis en deux couches afin d’isoler les échecs :
- « Modèle direct » indique si le fournisseur ou le modèle peut répondre avec la clé donnée.
- « Vérification rapide du Gateway » indique si l’ensemble du pipeline Gateway+agent fonctionne pour ce modèle (sessions, historique, outils, politique de bac à sable, etc.).
Les listes de modèles sélectionnés ci-dessous se trouvent dans src/agents/live-model-filter.ts et
évoluent au fil du temps ; considérez les tableaux de ce fichier comme la source de vérité, et non cette
page.
MiniMax M3 utilise minimax/MiniMax-M3 comme référence fournisseur/modèle par défaut.
Couche 1 : exécution directe du modèle (sans Gateway)
- Test :
src/agents/models.profiles.live.test.ts - Objectif :
- Énumérer les modèles détectés
- Utiliser
getApiKeyForModelpour sélectionner les modèles pour lesquels vous disposez d’identifiants - Exécuter une courte génération pour chaque modèle (ainsi que des tests de régression ciblés si nécessaire)
- Activation :
pnpm test:live(ouOPENCLAW_LIVE_TEST=1si vous invoquez Vitest directement)- Définissez
OPENCLAW_LIVE_MODELS=modern,smallouall(alias demodern) pour réellement exécuter cette suite ; sinon elle est ignorée, afin quepnpm test:liveseul reste centré sur la vérification rapide du Gateway.
- Sélection des modèles :
OPENCLAW_LIVE_MODELS=modernexécute la liste de priorité sélectionnée à fort pouvoir diagnostique (voir En conditions réelles : matrice de modèles)OPENCLAW_LIVE_MODELS=smallexécute la liste de priorité sélectionnée des petits modèlesOPENCLAW_LIVE_MODELS=allest un alias demodern- ou
OPENCLAW_LIVE_MODELS="openai/gpt-5.6-luna,anthropic/claude-opus-4-6,..."(liste d’autorisation séparée par des virgules) - Les exécutions locales des petits modèles Ollama utilisent par défaut
http://127.0.0.1:11434; définissezOPENCLAW_LIVE_OLLAMA_BASE_URLuniquement pour les points de terminaison du réseau local, personnalisés ou Ollama Cloud. - Les analyses modern/all et small utilisent par défaut la longueur de leur liste sélectionnée comme limite ; définissez
OPENCLAW_LIVE_MAX_MODELS=0pour une analyse exhaustive du profil sélectionné ou un nombre positif pour une limite inférieure. - Les analyses exhaustives utilisent
OPENCLAW_LIVE_TEST_TIMEOUT_MScomme délai d’expiration pour l’ensemble du test direct des modèles. Valeur par défaut : 60 minutes. - Les sondes directes des modèles s’exécutent avec un parallélisme de 20 par défaut ; définissez
OPENCLAW_LIVE_MODEL_CONCURRENCYpour le remplacer.
- Sélection des fournisseurs :
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(liste d’autorisation séparée par des virgules)
- Provenance des clés :
- Par défaut : magasin de profils et solutions de repli issues de l’environnement
- Définissez
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour imposer l’utilisation du magasin de profils uniquement
- Raison d’être :
- Distingue « l’API du fournisseur est défaillante / la clé n’est pas valide » de « le pipeline d’agent du Gateway est défaillant »
- Contient de petits tests de régression isolés (exemple : relecture du raisonnement OpenAI Responses/Codex Responses et flux d’appels d’outils)
Couche 2 : vérification rapide du Gateway et de l’agent de développement (ce que fait réellement « @openclaw »)
- Test :
src/gateway/gateway-models.profiles.live.test.ts - Objectif :
- Démarrer un Gateway dans le processus
- Créer ou modifier une session
agent:dev:*(remplacement du modèle à chaque exécution) - Parcourir les modèles disposant de clés et vérifier :
- une réponse « pertinente » (sans outils)
- qu’une véritable invocation d’outil fonctionne (sonde de lecture)
- des sondes d’outils supplémentaires facultatives (sonde d’exécution et de lecture)
- que les chemins de régression OpenAI (appel d’outil uniquement, puis suivi) continuent de fonctionner
- Détails des sondes (pour expliquer rapidement les échecs) :
- Sonde
read: le test écrit un fichier contenant une valeur unique dans l’espace de travail et demande à l’agent de leread, puis de renvoyer cette valeur. - Sonde
exec+read: le test demande à l’agent d’utiliserexecpour écrire une valeur unique dans un fichier temporaire, puis de laread. - Sonde d’image : le test joint un fichier PNG généré (chat + code aléatoire) et attend que le modèle renvoie
cat <CODE>. - Référence de l’implémentation :
src/gateway/gateway-models.profiles.live.test.tsettest/helpers/live-image-probe.ts.
- Sonde
- Activation :
pnpm test:live(ouOPENCLAW_LIVE_TEST=1si vous invoquez Vitest directement)
- Sélection des modèles :
- Par défaut : la liste de priorité sélectionnée à fort pouvoir diagnostique (
modern) OPENCLAW_LIVE_GATEWAY_MODELS=smallexécute la liste sélectionnée des petits modèles dans l’ensemble du pipeline Gateway+agentOPENCLAW_LIVE_GATEWAY_MODELS=allest un alias demodern- Vous pouvez aussi définir
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(ou une liste séparée par des virgules) pour restreindre la sélection - Les analyses modern/all et small du Gateway utilisent par défaut la longueur de leur liste sélectionnée comme limite ; définissez
OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0pour une analyse exhaustive de la sélection ou un nombre positif pour une limite inférieure.
- Par défaut : la liste de priorité sélectionnée à fort pouvoir diagnostique (
- Sélection des fournisseurs (pour éviter « tout via 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’outils et d’images sont toujours activées dans ce test en conditions réelles :
- Sonde
readet sondeexec+read(mise à l’épreuve des outils) - La sonde d’image s’exécute lorsque le modèle annonce la prise en charge des images en entrée
- Flux (vue d’ensemble) :
- Le test génère un petit fichier PNG contenant « CAT » et un code aléatoire (
test/helpers/live-image-probe.ts) - Il l’envoie via
agentavecattachments: [{ mimeType: "image/png", content: "<base64>" }] - Le Gateway analyse les pièces jointes dans
images[](src/gateway/server-methods/agent.tsetsrc/gateway/chat-attachments.ts) - L’agent intégré transmet au modèle un message utilisateur multimodal
- Vérification : la réponse contient
catet le code (tolérance de la reconnaissance optique de caractères : les erreurs mineures sont autorisées)
- Le test génère un petit fichier PNG contenant « CAT » et un code aléatoire (
- Sonde
En conditions réelles : vérification rapide d’un backend CLI (Claude, Gemini ou autres CLI locales)
- Test :
src/gateway/gateway-cli-backend.live.test.ts - Objectif : valider le pipeline Gateway+agent au moyen d’un backend CLI local, sans modifier votre configuration par défaut.
- Les valeurs par défaut de vérification propres à chaque backend se trouvent dans la définition
cli-backend.tsdu Plugin propriétaire. - Activation :
pnpm test:live(ouOPENCLAW_LIVE_TEST=1si vous invoquez Vitest directement)OPENCLAW_LIVE_CLI_BACKEND=1
- Valeurs par défaut :
- Fournisseur/modèle par défaut :
claude-cli/claude-sonnet-4-6 - Le comportement des commandes, arguments et images provient des métadonnées du Plugin de backend CLI propriétaire.
- Fournisseur/modèle par défaut :
- Remplacements (facultatifs) :
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-sonnet-4-6"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1pour envoyer une véritable pièce jointe d’image (les chemins sont injectés dans l’invite). Désactivé par défaut dans les recettes Docker.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"pour transmettre les chemins des fichiers d’images en tant qu’arguments CLI plutôt que de les injecter dans l’invite.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(ou"list") pour contrôler la manière dont les arguments d’images sont transmis 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_MODEL_SWITCH_PROBE=1pour activer la sonde de continuité de session Claude Sonnet -> Opus lorsque le modèle sélectionné prend en charge une cible de changement. Désactivé par défaut, y compris dans les recettes Docker.OPENCLAW_LIVE_CLI_BACKEND_MCP_PROBE=1pour activer la sonde de boucle d’outils MCP. Désactivé par défaut dans les recettes Docker.
Exemple :
OPENCLAW_LIVE_CLI_BACKEND=1 \ OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-sonnet-4-6" \ pnpm test:live src/gateway/gateway-cli-backend.live.test.tsVérification rapide et peu coûteuse de la configuration MCP de Gemini :
OPENCLAW_LIVE_TEST=1 \ pnpm test:live src/agents/cli-runner/bundle-mcp.gemini.live.test.tsCette opération ne demande pas à Gemini de générer une réponse. Elle écrit les mêmes paramètres
système qu’OpenClaw fournit à Gemini, puis exécute gemini --debug mcp list pour prouver qu’un
serveur enregistré avec transport: "streamable-http" est normalisé dans le format MCP HTTP de Gemini
et peut se connecter à un serveur MCP HTTP diffusé local.
Recette Docker :
pnpm test:docker:live-cli-backendRecettes Docker pour un seul fournisseur :
pnpm test:docker:live-cli-backend:claudepnpm test:docker:live-cli-backend:claude-subscriptionpnpm test:docker:live-cli-backend:geminiRemarques :
- L’exécuteur Docker se trouve dans
scripts/test-live-cli-backend-docker.sh. - Il exécute la vérification en conditions réelles du backend CLI dans l’image Docker du dépôt en tant qu’utilisateur
nodenon privilégié. - Il résout les métadonnées de vérification CLI à partir du Plugin propriétaire, puis installe le paquet CLI Linux correspondant (
@anthropic-ai/claude-codeou@google/gemini-cli) dans un préfixe accessible en écriture et mis en cache à l’emplacementOPENCLAW_DOCKER_CLI_TOOLS_DIR(par défaut :~/.cache/openclaw/docker-cli-tools). codex-clin’est plus un backend CLI intégré ; utilisez plutôtopenai/*avec l’environnement d’exécution du serveur d’application Codex (voir En conditions réelles : vérification rapide du banc d’essai du serveur d’application Codex).pnpm test:docker:live-cli-backend:claude-subscriptionnécessite l’OAuth portable de l’abonnement Claude Code, soit via~/.claude/.credentials.jsonavecclaudeAiOauth.subscriptionType, soit viaCLAUDE_CODE_OAUTH_TOKENobtenu avecclaude setup-token. Il vérifie d’abord directementclaude -pdans Docker, puis exécute deux tours du backend CLI du Gateway sans conserver les variables d’environnement des clés d’API Anthropic. Ce parcours d’abonnement désactive par défaut les sondes MCP/outils et d’images de Claude, car il consomme les limites d’utilisation de l’abonnement connecté et Anthropic peut modifier le comportement de facturation et de limitation du débit du SDK Claude Agent ou declaude -psans nouvelle version d’OpenClaw.- Claude et Gemini prennent en charge le même ensemble de sondes (tour de texte, classification d’image, appel de l’outil MCP
cron, continuité lors du changement de modèle) au moyen des indicateurs ci-dessus, mais aucune de ces sondes ne s’exécute par défaut ; activez-les individuellement selon les besoins.
En conditions réelles : accessibilité du proxy HTTP/2 APNs
- Test :
src/infra/push-apns-http2.live.test.ts - Objectif : établir un tunnel via un proxy HTTP CONNECT local vers le point de terminaison APNs de bac à sable d’Apple, envoyer la requête de validation HTTP/2 APNs et vérifier que la véritable réponse
403 InvalidProviderTokend’Apple revient par le chemin du proxy. - Activation :
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_APNS_REACHABILITY=1 pnpm test:live src/infra/push-apns-http2.live.test.ts
- Délai d’expiration facultatif :
OPENCLAW_LIVE_APNS_TIMEOUT_MS=30000
En conditions réelles : vérification rapide de la liaison ACP (/acp spawn ... --bind here)
- Test :
src/gateway/gateway-acp-bind.live.test.ts - Objectif : valider le flux réel de liaison de conversation ACP avec un agent ACP actif :
- envoyer
/acp spawn <agent> --bind here - lier sur place une conversation synthétique de canal de messagerie
- envoyer un suivi normal dans cette même conversation
- vérifier que le suivi arrive dans la transcription de la session ACP liée
- envoyer
- Activation :
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- Valeurs par défaut :
- Agents ACP dans Docker :
claude,codex,gemini - Agent ACP pour l’exécution directe de
pnpm test:live ...:claude - Canal synthétique : contexte de conversation de type message privé Slack
- Backend ACP :
acpx
- Agents ACP dans Docker :
- Surcharges :
OPENCLAW_LIVE_ACP_BIND_AGENT=claudeOPENCLAW_LIVE_ACP_BIND_AGENT=codexOPENCLAW_LIVE_ACP_BIND_AGENT=droidOPENCLAW_LIVE_ACP_BIND_AGENT=geminiOPENCLAW_LIVE_ACP_BIND_AGENT=opencodeOPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,geminiOPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'OPENCLAW_LIVE_ACP_BIND_CODEX_MODEL=gpt-5.6-lunaOPENCLAW_LIVE_ACP_BIND_OPENCODE_MODEL=opencode/kimi-k2.6OPENCLAW_LIVE_ACP_BIND_IMAGE_PROBE=1(ouon/true/yes) pour forcer l’activation de la sonde d’image ; toute autre valeur force sa désactivation. Elle s’exécute par défaut pour chaque agent saufopencode.OPENCLAW_LIVE_ACP_BIND_REQUIRE_CRON=1OPENCLAW_LIVE_ACP_BIND_PARENT_MODEL=openai/gpt-5.6-luna
- Remarques :
- Cette voie utilise la surface
chat.senddu Gateway avec des champs synthétiques de route d’origine réservés aux administrateurs, afin que les tests puissent joindre le contexte du canal de messagerie sans simuler une livraison externe. - Lorsque
OPENCLAW_LIVE_ACP_BIND_AGENT_COMMANDn’est pas défini, le test utilise le registre d’agents intégré du Pluginacpxembarqué pour l’agent de banc d’essai ACP sélectionné. - La création Cron MCP de la session liée s’effectue au mieux par défaut, car les bancs d’essai ACP externes peuvent annuler les appels MCP après la réussite de la preuve de liaison/d’image ; définissez
OPENCLAW_LIVE_ACP_BIND_REQUIRE_CRON=1pour rendre stricte cette sonde Cron postérieure à la liaison.
- Cette voie utilise la surface
Exemple :
OPENCLAW_LIVE_ACP_BIND=1 \ OPENCLAW_LIVE_ACP_BIND_AGENT=claude \ pnpm test:live src/gateway/gateway-acp-bind.live.test.tsRecette Docker :
pnpm test:docker:live-acp-bindRecettes Docker pour un seul agent :
pnpm test:docker:live-acp-bind:claudepnpm test:docker:live-acp-bind:codexpnpm test:docker:live-acp-bind:droidpnpm test:docker:live-acp-bind:geminipnpm test:docker:live-acp-bind:opencodeRemarques sur Docker :
- Le programme d’exécution Docker se trouve dans
scripts/test-live-acp-bind-docker.sh. - Par défaut, il exécute successivement le test de fumée de liaison ACP avec les agents CLI actifs regroupés :
claude,codex, puisgemini. - Utilisez
OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,OPENCLAW_LIVE_ACP_BIND_AGENTS=codex,OPENCLAW_LIVE_ACP_BIND_AGENTS=droid,OPENCLAW_LIVE_ACP_BIND_AGENTS=geminiouOPENCLAW_LIVE_ACP_BIND_AGENTS=opencodepour restreindre la matrice. - Il place le matériel d’authentification CLI correspondant dans le conteneur, puis installe la CLI active demandée (
@anthropic-ai/claude-code,@openai/codex, Factory Droid viahttps://app.factory.ai/cli,@google/gemini-cliouopencode-ai) si elle est absente. Le backend ACP lui-même est le paquetacpx/runtimeembarqué du Pluginacpxofficiel. - La variante Docker de Droid place
~/.factorypour les paramètres, transmetFACTORY_API_KEYet exige cette clé d’API, car l’authentification OAuth/trousseau locale de Factory n’est pas transférable dans le conteneur. Elle utilise l’entrée de registre intégréedroid exec --output-format acpd’ACPX. - La variante Docker d’OpenCode est une voie stricte de régression pour un seul agent. Elle écrit dans
OPENCODE_CONFIG_CONTENTun modèle par défaut temporaire provenant deOPENCLAW_LIVE_ACP_BIND_OPENCODE_MODEL(valeur par défaut :opencode/kimi-k2.6). - Les appels directs à la CLI
acpxconstituent uniquement une procédure manuelle/de contournement pour comparer le comportement hors du Gateway. Le test de fumée Docker de liaison ACP exerce le backend d’exécutionacpxembarqué d’OpenClaw.
Test de fumée actif : banc d’essai du serveur d’application Codex
- Objectif : valider le banc d’essai Codex appartenant au Plugin via la méthode normale
agentdu Gateway :- charger le Plugin
codexfourni - sélectionner un modèle OpenAI via
/model <ref> --runtime codex - envoyer un premier tour d’agent au Gateway avec le niveau de réflexion demandé
- envoyer un second tour à la même session OpenClaw et vérifier que le fil du serveur d’application peut reprendre
- exécuter
/codex statuset/codex modelsvia le même chemin de commande du Gateway - exécuter éventuellement deux sondes shell avec élévation examinées par Guardian : une commande inoffensive qui doit être approuvée et un faux téléversement de secret qui doit être refusé afin que l’agent redemande une confirmation
- charger le Plugin
- Test :
src/gateway/gateway-codex-harness.live.test.ts - Activation :
OPENCLAW_LIVE_CODEX_HARNESS=1 - Modèle de référence du banc d’essai :
openai/gpt-5.6-luna - Sélection par défaut avec une nouvelle clé d’API OpenAI :
openai/gpt-5.6 - Réflexion par défaut :
low - Surcharge du modèle :
OPENCLAW_LIVE_CODEX_HARNESS_MODEL=openai/<model> - Surcharge de la réflexion :
OPENCLAW_LIVE_CODEX_HARNESS_THINKING=<level> - Surcharge de la matrice :
OPENCLAW_LIVE_CODEX_HARNESS_TARGETS=<model>=<thinking>,... - Mode d’authentification :
OPENCLAW_LIVE_CODEX_HARNESS_AUTH=codex-auth(valeur par défaut) utilise la connexion Codex copiée ;api-keyutiliseOPENAI_API_KEYvia le serveur d’application Codex. - Sonde d’image facultative :
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 - Sonde MCP/d’outil facultative :
OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 - Sonde Guardian facultative :
OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=1 - Le test de fumée impose
agentRuntime.id: "codex"au fournisseur/modèle afin qu’un banc d’essai Codex défectueux ne puisse pas réussir en revenant silencieusement à OpenClaw. - Authentification : authentification du serveur d’application Codex provenant de la connexion locale à l’abonnement Codex, ou
OPENAI_API_KEYlorsqueOPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key. Docker peut copier~/.codex/auth.jsonet~/.codex/config.tomlpour les exécutions avec abonnement.
Recette locale :
OPENCLAW_LIVE_CODEX_HARNESS=1 \ OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 \ OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 \ OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=1 \ OPENCLAW_LIVE_CODEX_HARNESS_MODEL=openai/gpt-5.6-luna \ pnpm test:live -- src/gateway/gateway-codex-harness.live.test.tsRecette Docker :
pnpm test:docker:live-codex-harnessMatrice Codex native GPT-5.6 :
OPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key \ OPENCLAW_LIVE_CODEX_HARNESS_TARGETS='openai/gpt-5.6-sol=ultra,openai/gpt-5.6-terra=ultra,openai/gpt-5.6-luna=max' \ pnpm test:docker:live-codex-harnessValeur par défaut avec une nouvelle clé d’API OpenAI :
OPENCLAW_LIVE_GATEWAY_OPENAI_API_DEFAULT=1 \ OPENCLAW_LIVE_GATEWAY_PROVIDERS=openai \ OPENCLAW_LIVE_GATEWAY_THINKING=off \ pnpm test:live -- src/gateway/gateway-models.profiles.live.test.tsCette preuve laisse OPENCLAW_LIVE_GATEWAY_MODELS non défini, résout le modèle via
le point d’intégration de sélection d’inférence du nouvel assistant de configuration, vérifie openai/gpt-5.6, puis
exécute un véritable tour du Gateway avec ce modèle résolu.
Matrice OpenClaw embarquée GPT-5.6 :
OPENCLAW_LIVE_GATEWAY_THINKING=ultra \ OPENCLAW_LIVE_GATEWAY_PROVIDERS=openai \ OPENCLAW_LIVE_GATEWAY_MODELS='openai/gpt-5.6-sol,openai/gpt-5.6-terra,openai/gpt-5.6-luna' \ pnpm test:live -- src/gateway/gateway-models.profiles.live.test.tsRemarques sur Docker :
- Le programme d’exécution Docker se trouve dans
scripts/test-live-codex-harness-docker.sh. - Il transmet
OPENAI_API_KEY, copie les fichiers d’authentification de la CLI Codex lorsqu’ils sont présents, installe@openai/codexdans un préfixe npm monté accessible en écriture, place l’arborescence des sources, puis exécute uniquement le test actif du banc d’essai Codex. - Docker active par défaut les sondes d’image, MCP/d’outil et Guardian. Définissez
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0, ouOPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0, ouOPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0lorsqu’une exécution de débogage plus restreinte est nécessaire. - Docker utilise la même configuration explicite d’exécution Codex ; ainsi, les anciens alias ou le repli vers OpenClaw ne peuvent pas masquer une régression du banc d’essai Codex.
- Les cibles de la matrice s’exécutent successivement dans un même conteneur. Le script Docker adapte son délai d’expiration par défaut de 35 minutes au nombre de cibles ; tout délai d’expiration externe du shell ou de la CI doit autoriser la même durée totale. La CI canonique conserve chaque cible GPT-5.6 dans une partition distincte.
Recettes actives recommandées
Les listes d’autorisation restreintes et explicites sont les plus rapides et les moins sujettes aux instabilités :
-
Modèle unique, en direct (sans Gateway) :
OPENCLAW_LIVE_MODELS="openai/gpt-5.6-luna" pnpm test:live src/agents/models.profiles.live.test.ts
-
Profil direct de petits modèles :
OPENCLAW_LIVE_MODELS=small pnpm test:live src/agents/models.profiles.live.test.ts
-
Profil Gateway de petits modèles :
OPENCLAW_LIVE_GATEWAY_MODELS=small pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Test de fumée de l’API Ollama Cloud :
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_OLLAMA=1 OPENCLAW_LIVE_OLLAMA_BASE_URL=https://ollama.com OPENCLAW_LIVE_OLLAMA_MODEL=glm-5.1:cloud OPENCLAW_LIVE_OLLAMA_WEB_SEARCH=0 pnpm test:live -- extensions/ollama/ollama.live.test.ts
-
Modèle unique, test de fumée du Gateway :
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.6-luna" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Appels d’outils avec plusieurs fournisseurs :
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.6-luna,anthropic/claude-opus-4-6,google/gemini-3.5-flash,deepseek/deepseek-v4-flash,zai/glm-5.1,minimax/MiniMax-M3" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Test de fumée direct de Z.AI Coding Plan GLM-5.2 :
ZAI_CODING_LIVE_TEST=1 pnpm test:live src/agents/zai.live.test.ts
-
Ciblage de Google (clé d’API Gemini + Antigravity) :
- Gemini (clé d’API) :
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3.5-flash" 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é d’API) :
-
Test de fumée de la réflexion adaptative de Google (
qa manualdepuis la CLI privée d’assurance qualité — nécessiteOPENCLAW_ENABLE_PRIVATE_QA_CLI=1et une extraction des sources ; consultez la présentation de l’assurance qualité) :- Valeur dynamique par défaut de Gemini 3 :
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 pnpm openclaw qa manual --provider-mode live-frontier --model google/gemini-3.1-pro-preview --alt-model google/gemini-3.1-pro-preview --message '/think adaptive Reply exactly: GEMINI_ADAPTIVE_OK' --timeout-ms 180000 - Budget dynamique de Gemini 2.5 :
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 pnpm openclaw qa manual --provider-mode live-frontier --model google/gemini-2.5-flash --alt-model google/gemini-2.5-flash --message '/think adaptive Reply exactly: GEMINI25_ADAPTIVE_OK' --timeout-ms 180000
- Valeur dynamique par défaut de Gemini 3 :
Remarques :
google/...utilise l’API Gemini (clé d’API).google-antigravity/...utilise la passerelle OAuth Antigravity (point de terminaison d’agent de type Cloud Code Assist).google-gemini-cli/...utilise la CLI Gemini locale sur votre machine (authentification distincte et particularités propres aux outils).- API Gemini et CLI Gemini :
- API : OpenClaw appelle l’API Gemini hébergée de Google via HTTP (clé d’API/authentification de profil) ; c’est ce que la plupart des utilisateurs entendent par « Gemini ».
- CLI : OpenClaw lance un binaire
geminilocal via le shell ; il possède sa propre authentification et peut se comporter différemment (diffusion en continu/prise en charge des outils/décalage de version).
Actif : matrice de modèles (ce que nous couvrons)
Les tests actifs sont facultatifs ; il n’existe donc aucune « liste de modèles CI » fixe. OPENCLAW_LIVE_MODELS=modern / OPENCLAW_LIVE_GATEWAY_MODELS=modern (ainsi que leur alias all) exécutent la liste de priorités sélectionnée dans HIGH_SIGNAL_LIVE_MODEL_PRIORITY dans src/agents/live-model-filter.ts, selon cet ordre de priorité :
| Fournisseur/modèle | Remarques |
|---|---|
anthropic/claude-opus-4-8 |
|
anthropic/claude-sonnet-5 |
|
anthropic/claude-sonnet-4-6 |
|
anthropic/claude-opus-4-7 |
|
google/gemini-3.1-pro-preview |
API Gemini |
google/gemini-3.5-flash |
API Gemini |
cohere/command-a-plus-05-2026 |
|
moonshot/kimi-k2.7-code |
|
anthropic/claude-opus-4-6 |
|
deepseek/deepseek-v4-flash |
|
deepseek/deepseek-v4-pro |
|
minimax/MiniMax-M3 |
|
openai/gpt-5.5 |
|
openrouter/openai/gpt-5.2-chat |
|
openrouter/minimax/minimax-m2.7 |
|
opencode-go/glm-5 |
|
openrouter/ai21/jamba-large-1.7 |
|
xai/grok-4.5 |
|
xai/grok-4.20-0309-reasoning |
|
zai/glm-5.1 |
|
fireworks/accounts/fireworks/models/glm-5p1 |
|
minimax-portal/minimax-m3 |
La liste organisée des petits modèles (OPENCLAW_LIVE_MODELS=small / OPENCLAW_LIVE_GATEWAY_MODELS=small), issue de SMALL_LIVE_MODEL_PRIORITY :
| Fournisseur/modèle |
|---|
lmstudio/qwen/qwen3.5-9b |
vllm/qwen/qwen3-8b |
sglang/qwen/qwen3-8b |
ollama/gemma3:4b |
openrouter/qwen/qwen3.5-9b |
openrouter/z-ai/glm-5.1 |
openrouter/z-ai/glm-5 |
zai/glm-5.1 |
Remarques sur la liste moderne :
- Les fournisseurs
codexetcodex-clisont exclus de la vérification moderne par défaut (ils couvrent le comportement du backend CLI/ACP, testé séparément ci-dessus).openai/gpt-5.5lui-même passe par le banc d'essai du serveur d'application Codex par défaut ; voir Tests en conditions réelles : vérification rapide du banc d'essai du serveur d'application Codex. fireworks,google,openrouteretxain'exécutent que leurs identifiants de modèle explicitement sélectionnés dans la vérification moderne (sans extension automatique à « tous les modèles de ce fournisseur »).- Incluez au moins un modèle prenant en charge les images (variantes de vision des familles Claude/Gemini/OpenAI, etc.) dans
OPENCLAW_LIVE_GATEWAY_MODELSafin d'exécuter la sonde d'image.
Exécutez la vérification rapide du Gateway avec des outils et une image sur un ensemble de fournisseurs soigneusement sélectionné :
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.6-luna,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3.5-flash,google-antigravity/claude-opus-4-6-thinking,deepseek/deepseek-v4-flash,zai/glm-5.1,minimax/MiniMax-M3" pnpm test:live src/gateway/gateway-models.profiles.live.test.tsCouverture supplémentaire facultative en dehors des listes organisées (souhaitable ; choisissez un modèle compatible avec les « outils » que vous avez activé) :
- Mistral :
mistral/... - Cerebras :
cerebras/...(si vous y avez accès) - LM Studio :
lmstudio/...(local ; l'appel d'outils dépend du mode de l'API)
Agrégateurs / passerelles alternatives
Si vous avez activé des clés, vous pouvez également effectuer des tests via :
- OpenRouter :
openrouter/...(des centaines de modèles ; utilisezopenclaw models scanpour trouver des candidats prenant en charge les outils et les images) - OpenCode :
opencode/...pour Zen etopencode-go/...pour Go (authentification viaOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
Autres fournisseurs que vous pouvez inclure dans la matrice de tests en conditions réelles (si vous disposez des identifiants/configurations nécessaires) :
- Intégrés :
anthropic,cerebras,github-copilot,google,google-antigravity,google-gemini-cli,google-vertex,groq,mistral,openai,openrouter,opencode,opencode-go,xai,zai - Via
models.providers(points de terminaison personnalisés) :minimax(cloud/API), ainsi que tout proxy compatible avec OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, etc.)
Identifiants (ne jamais les valider dans le dépôt)
Les tests en conditions réelles découvrent les identifiants de la même manière que la CLI. Conséquences pratiques :
-
Si la CLI fonctionne, les tests en conditions réelles devraient trouver les mêmes clés.
-
Si un test en conditions réelles indique « aucun identifiant », déboguez-le comme vous débogueriez
openclaw models listou la sélection du modèle. -
Profils d'authentification par agent :
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(c'est ce que « clés de profil » signifie dans les tests en conditions réelles) -
Configuration :
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH) -
Répertoire OAuth hérité :
~/.openclaw/credentials/(copié dans le répertoire personnel temporaire des tests en conditions réelles lorsqu'il est présent, mais il ne s'agit pas du magasin principal des clés de profil) -
Les exécutions locales en conditions réelles copient la configuration active (sans les remplacements
agents.*.workspace/agentDir) et le fichierauth-profiles.jsonde chaque agent — mais pas le reste du répertoire de cet agent, afin que les données deworkspace/etsandboxes/n'atteignent jamais le répertoire personnel temporaire — ainsi que le répertoire héritécredentials/et les fichiers/répertoires d'authentification pris en charge des CLI externes (.claude.json,.claude/.credentials.json,.claude/settings*.json,.claude/backups,.codex/auth.json,.codex/config.toml,.gemini,.minimax) dans un répertoire personnel de test temporaire.
Si vous souhaitez utiliser des clés provenant de variables d'environnement, exportez-les avant les tests locaux ou utilisez les
exécuteurs Docker ci-dessous avec un OPENCLAW_PROFILE_FILE explicite.
Test en conditions réelles de Deepgram (transcription audio)
- Test :
extensions/deepgram/audio.live.test.ts - Activation :
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live extensions/deepgram/audio.live.test.ts
Test en conditions réelles du forfait de programmation BytePlus
- Test :
extensions/byteplus/live.test.ts - Activation :
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live extensions/byteplus/live.test.ts - Remplacement facultatif du modèle :
BYTEPLUS_CODING_MODEL=ark-code-latest
Test en conditions réelles des médias du flux de travail ComfyUI
- Test :
extensions/comfy/comfy.live.test.ts - Activation :
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts - Portée :
- Exerce les parcours intégrés de génération d'images et de vidéos de comfy, ainsi que
music_generate - Ignore chaque fonctionnalité sauf si
plugins.entries.comfy.config.<capability>est configuré - Utile après une modification de la soumission des flux de travail comfy, de l'interrogation périodique, des téléchargements ou de l'enregistrement du Plugin
- Exerce les parcours intégrés de génération d'images et de vidéos de comfy, ainsi que
Test en conditions réelles de la génération d'images
- Test :
test/image-generation.runtime.live.test.ts - Commande :
pnpm test:live test/image-generation.runtime.live.test.ts - Banc d'essai :
pnpm test:live:media image - Portée :
- Énumère tous les Plugins de fournisseur de génération d'images enregistrés
- Utilise les variables d'environnement du fournisseur déjà exportées avant d'effectuer les sondes
- Utilise par défaut les clés d'API actives/provenant de l'environnement avant les profils d'authentification enregistrés, afin que les clés de test obsolètes dans
auth-profiles.jsonne masquent pas les véritables identifiants de l'environnement shell - Ignore les fournisseurs ne disposant d'aucune authentification, d'aucun profil ou d'aucun modèle utilisable
- Exécute chaque fournisseur configuré via le moteur d'exécution partagé de génération d'images :
<provider>:generate<provider>:editlorsque le fournisseur déclare prendre en charge la modification
- Fournisseurs intégrés actuellement couverts :
deepinfrafalgoogleminimaxopenaiopenroutervydraxai
- Restriction facultative :
OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google,openrouter,xai"OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="deepinfra"OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-2,google/gemini-3.1-flash-image-preview,openrouter/google/gemini-3.1-flash-image-preview,xai/grok-imagine-image"OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit,openrouter:generate,xai:default-generate,xai:default-edit"
- Comportement d'authentification facultatif :
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour imposer l'authentification via le magasin de profils et ignorer les remplacements provenant uniquement de l'environnement
Pour le parcours de la CLI distribuée, ajoutez une vérification rapide infer après la réussite du test en conditions réelles
du fournisseur/moteur d'exécution :
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_INFER_CLI_TEST=1 pnpm test:live -- test/image-generation.infer-cli.live.test.tsopenclaw infer image providers --jsonopenclaw infer image generate \ --model google/gemini-3.1-flash-image-preview \ --prompt "Image de test plate et minimaliste : un carré bleu sur un fond blanc, sans texte." \ --output ./openclaw-infer-image-smoke.png \ --jsonCela couvre l'analyse des arguments de la CLI, la résolution de la configuration et de l'agent par défaut, l'activation des Plugins intégrés, le moteur d'exécution partagé de génération d'images et la requête réelle au fournisseur. Les dépendances des Plugins doivent être présentes avant le chargement du moteur d'exécution.
Test en conditions réelles de la génération musicale
- Test :
extensions/music-generation-providers.live.test.ts - Activation :
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts - Banc d'essai :
pnpm test:live:media music - Portée :
- Exerce le parcours partagé des fournisseurs intégrés de génération musicale
- Couvre actuellement
fal,google,minimaxetopenrouter - Utilise les variables d'environnement du fournisseur déjà exportées avant d'effectuer les sondes
- Utilise par défaut les clés d'API actives/provenant de l'environnement avant les profils d'authentification enregistrés, afin que les clés de test obsolètes dans
auth-profiles.jsonne masquent pas les véritables identifiants de l'environnement shell - Ignore les fournisseurs ne disposant d'aucune authentification, d'aucun profil ou d'aucun modèle utilisable
- Exécute les deux modes déclarés du moteur d'exécution lorsqu'ils sont disponibles :
generateavec une entrée composée uniquement d'une inviteeditlorsque le fournisseur déclarecapabilities.edit.enabled
comfydispose de son propre fichier de test en conditions réelles distinct et ne fait pas partie de cette vérification partagée
- Restriction facultative :
OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.6"
- Comportement d'authentification facultatif :
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour imposer l'authentification via le magasin de profils et ignorer les remplacements provenant uniquement de l'environnement
Test en conditions réelles de la génération vidéo
- Test :
extensions/video-generation-providers.live.test.ts - Activation :
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts - Harnais :
pnpm test:live:media video - Portée :
- Exerce le chemin partagé des fournisseurs intégrés de génération vidéo pour
alibaba,byteplus,deepinfra,fal,google,minimax,openai,openrouter,pixverse,qwen,runway,together,vydra,xai - Utilise par défaut le test rapide sûr pour les versions : une requête de génération de texte en vidéo par fournisseur, une invite de homard d’une seconde et une limite d’opération par fournisseur définie par
OPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS(180000par défaut) - Ignore FAL par défaut, car la latence de la file d’attente côté fournisseur peut dominer la durée de publication ; transmettez
OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal"(ou videz la liste d’exclusion) pour l’exécuter explicitement - Utilise les variables d’environnement de fournisseur déjà exportées avant d’effectuer les sondes
- Privilégie par défaut les clés d’API actives issues de l’environnement par rapport aux profils d’authentification enregistrés, afin que des clés de test obsolètes dans
auth-profiles.jsonne masquent pas les véritables identifiants de l’interpréteur de commandes - Ignore les fournisseurs dépourvus d’authentification, de profil ou de modèle utilisable
- Exécute uniquement
generatepar défaut - Définissez
OPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1pour exécuter également les modes de transformation déclarés lorsqu’ils sont disponibles :imageToVideolorsque le fournisseur déclarecapabilities.imageToVideo.enabledet que le fournisseur ou modèle sélectionné accepte une image locale adossée à un tampon dans la campagne partagéevideoToVideolorsque le fournisseur déclarecapabilities.videoToVideo.enabledet que le fournisseur ou modèle sélectionné accepte une vidéo locale adossée à un tampon dans la campagne partagée
- Fournisseur
imageToVideoactuellement déclaré, mais ignoré dans la campagne partagée :vydra(les images locales adossées à un tampon ne sont pas prises en charge dans cette voie)
- Couverture propre au fournisseur Vydra :
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts- Ce fichier exécute une génération de texte en vidéo avec
veo3, ainsi qu’une voie de génération d’image en vidéo avecklingqui utilise par défaut une fixture d’URL d’image distante (OPENCLAW_LIVE_VYDRA_KLING_IMAGE_URLpour la remplacer).
- Couverture propre au fournisseur xAI :
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_XAI_VIDEO=1 pnpm test:live -- extensions/xai/xai.live.test.ts -t "classic Grok Imagine"- Le cas classique génère d’abord une première image PNG locale carrée, omet la géométrie, demande un clip d’image en vidéo d’une seconde, interroge l’état jusqu’à son achèvement et vérifie le tampon téléchargé.
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_XAI_VIDEO=1 pnpm test:live -- extensions/xai/xai.live.test.ts -t "Grok Imagine Video 1.5"- Le cas 1.5 génère une première image PNG locale, demande un clip d’image en vidéo 1080P d’une seconde, interroge l’état jusqu’à son achèvement et vérifie le tampon téléchargé.
- Couverture active actuelle de
videoToVideo:runwayuniquement lorsque le modèle sélectionné se résout engen4_aleph
- Fournisseurs
videoToVideoactuellement déclarés, mais ignorés dans la campagne partagée :alibaba,google,openai,qwen,xai, car ces chemins nécessitent actuellement des URL de référencehttp(s)distantes plutôt qu’une entrée locale adossée à un tampon
- Exerce le chemin partagé des fournisseurs intégrés de génération vidéo pour
- Restriction facultative :
OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="deepinfra,google,openai,runway"OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"OPENCLAW_LIVE_VIDEO_GENERATION_SKIP_PROVIDERS=""pour inclure tous les fournisseurs dans la campagne par défaut, y compris FALOPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000pour réduire la limite de chaque opération de fournisseur lors d’un test rapide intensif
- Comportement d’authentification facultatif :
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour imposer l’authentification depuis le magasin de profils et ignorer les remplacements provenant uniquement de l’environnement
Harnais actif pour les médias
- Commande :
pnpm test:live:media - Point d’entrée :
test/e2e/qa-lab/media/hosted-media-provider-live.ts, qui exécutepnpm test:live -- <suite-test-file>pour chaque suite sélectionnée, afin que le comportement du Heartbeat et du mode silencieux reste cohérent avec les autres exécutions depnpm test:live. - Objectif :
- Exécute les suites actives partagées d’image, de musique et de vidéo via un point d’entrée natif du dépôt
- Charge automatiquement depuis
~/.profileles variables d’environnement de fournisseur manquantes - Restreint automatiquement et par défaut chaque suite aux fournisseurs disposant actuellement d’une authentification utilisable
- Options :
--providers <csv>filtre global des fournisseurs ;--image-providers/--music-providers/--video-providerslimitent un filtre à une seule suite--all-providersdésactive le filtrage automatique fondé sur l’authentification--allow-emptyquitte avec le code0lorsque le filtrage ne laisse aucun fournisseur exécutable--quiet/--no-quiettransmis àtest:live
- Exemples :
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
Ressources connexes
- Tests - suites unitaires, d’intégration, d’assurance qualité et Docker