Testes
O OpenClaw tem três suítes Vitest (unitária/integração, e2e, ao vivo) e um pequeno conjunto de executores Docker. Este documento é um guia de “como testamos”:- O que cada suíte cobre (e o que ela deliberadamente não cobre)
- Quais comandos executar para fluxos comuns (local, pré-push, depuração)
- Como os testes ao vivo descobrem credenciais e selecionam modelos/provedores
- Como adicionar regressões para problemas reais de modelo/provedor
Início rápido
Na maioria dos dias:- Gate completo (esperado antes do push):
pnpm build && pnpm check && pnpm test - Execução local mais rápida da suíte completa em uma máquina folgada:
pnpm test:max - Loop direto de watch do Vitest:
pnpm test:watch - O direcionamento direto por arquivo agora também roteia caminhos de extensões/canais:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Prefira execuções direcionadas primeiro quando estiver iterando sobre uma única falha.
- Site de QA com suporte de Docker:
pnpm qa:lab:up - Faixa de QA com suporte de VM Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
- Gate de cobertura:
pnpm test:coverage - Suíte E2E:
pnpm test:e2e
- Suíte ao vivo (modelos + sondas de ferramenta/imagem do gateway):
pnpm test:live - Direcione um único arquivo ao vivo em modo silencioso:
pnpm test:live -- src/agents/models.profiles.live.test.ts
Executores específicos de QA
Esses comandos ficam ao lado das principais suítes de teste quando você precisa do realismo do qa-lab:pnpm openclaw qa suite- Executa cenários de QA com suporte do repositório diretamente no host.
- Executa múltiplos cenários selecionados em paralelo por padrão com workers de gateway isolados, até 64 workers ou a contagem de cenários selecionada. Use
--concurrency <count>para ajustar a contagem de workers, ou--concurrency 1para a faixa serial mais antiga.
pnpm openclaw qa suite --runner multipass- Executa a mesma suíte de QA dentro de uma VM Linux descartável do Multipass.
- Mantém o mesmo comportamento de seleção de cenários que
qa suiteno host. - Reutiliza as mesmas flags de seleção de provedor/modelo que
qa suite. - Execuções ao vivo encaminham as entradas de autenticação de QA compatíveis que são práticas para o convidado:
chaves de provedor baseadas em env, o caminho de configuração do provedor ao vivo de QA e
CODEX_HOMEquando presente. - Os diretórios de saída devem permanecer sob a raiz do repositório para que o convidado possa gravar de volta por meio do workspace montado.
- Grava o relatório + resumo normais de QA, além dos logs do Multipass, em
.artifacts/qa-e2e/....
pnpm qa:lab:up- Inicia o site de QA com suporte de Docker para trabalho de QA no estilo operador.
pnpm openclaw qa matrix- Executa a faixa de QA ao vivo do Matrix contra um homeserver Tuwunel descartável com suporte de Docker.
- Provisiona três usuários Matrix temporários (
driver,sut,observer) mais uma sala privada, e então inicia um gateway filho de QA com o plugin Matrix real como transporte SUT. - Usa por padrão a imagem estável fixada do Tuwunel
ghcr.io/matrix-construct/tuwunel:v1.5.1. Substitua comOPENCLAW_QA_MATRIX_TUWUNEL_IMAGEquando precisar testar uma imagem diferente. - Grava um relatório de QA do Matrix, resumo e artefato de eventos observados em
.artifacts/qa-e2e/....
pnpm openclaw qa telegram- Executa a faixa de QA ao vivo do Telegram contra um grupo privado real usando os tokens de bot do driver e do SUT vindos do env.
- Requer
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENeOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. O id do grupo deve ser o id numérico do chat do Telegram. - Requer dois bots distintos no mesmo grupo privado, com o bot SUT expondo um nome de usuário do Telegram.
- Para observação estável bot a bot, habilite o Bot-to-Bot Communication Mode em
@BotFatherpara ambos os bots e garanta que o bot driver possa observar o tráfego de bots no grupo. - Grava um relatório de QA do Telegram, resumo e artefato de mensagens observadas em
.artifacts/qa-e2e/....
qa-channel continua sendo a ampla suíte sintética de QA e não faz parte da matriz de cobertura de transporte ao vivo.
| Faixa | Canary | Gate de menção | Bloco de allowlist | Resposta de nível superior | Retomada após reinício | Acompanhamento de thread | Isolamento de thread | Observação de reação | Comando de ajuda |
|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | x |
Suítes de teste (o que executa onde)
Pense nas suítes como “realismo crescente” (e flakiness/custo crescentes):Unitária / integração (padrão)
- Comando:
pnpm test - Configuração: dez execuções sequenciais de shard (
vitest.full-*.config.ts) sobre os projetos Vitest com escopo já existentes - Arquivos: inventários core/unit em
src/**/*.test.ts,packages/**/*.test.ts,test/**/*.test.tse os testes Node deuipermitidos cobertos porvitest.unit.config.ts - Escopo:
- Testes puramente unitários
- Testes de integração em processo (autenticação do gateway, roteamento, ferramentas, parsing, configuração)
- Regressões determinísticas para bugs conhecidos
- Expectativas:
- Executa no CI
- Não requer chaves reais
- Deve ser rápido e estável
- Observação sobre projetos:
pnpm testsem alvo agora executa onze configurações de shard menores (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) em vez de um único processo gigante do projeto raiz nativo. Isso reduz o pico de RSS em máquinas carregadas e evita que o trabalho de auto-reply/extensão sufoque suítes não relacionadas.pnpm test --watchainda usa o grafo de projetos nativo dovitest.config.tsda raiz, porque um loop de watch com múltiplos shards não é prático.pnpm test,pnpm test:watchepnpm test:perf:importsroteiam primeiro alvos explícitos de arquivo/diretório por faixas com escopo, entãopnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsevita pagar o custo de inicialização completo do projeto raiz.pnpm test:changedexpande caminhos git alterados para as mesmas faixas com escopo quando o diff toca apenas arquivos de código-fonte/teste roteáveis; edições de configuração/setup ainda recaem para a reexecução ampla do projeto raiz.- Testes unitários leves de importação vindos de agentes, comandos, plugins, auxiliares de auto-reply,
plugin-sdke áreas utilitárias puras semelhantes passam pela faixaunit-fast, que ignoratest/setup-openclaw-runtime.ts; arquivos com estado/runtime pesado permanecem nas faixas existentes. - Alguns arquivos auxiliares de origem de
plugin-sdkecommandstambém mapeiam execuções em modo changed para testes irmãos explícitos nessas faixas leves, de modo que edições em auxiliares evitem reexecutar a suíte pesada completa desse diretório. auto-replyagora tem três buckets dedicados: auxiliares core de nível superior, testes de integraçãoreply.*de nível superior e a subárvoresrc/auto-reply/reply/**. Isso mantém o trabalho mais pesado do harness de reply fora dos testes baratos de status/chunk/token.
- Observação sobre o executor embutido:
- Quando você altera entradas de descoberta da ferramenta de mensagem ou o contexto de runtime de compactação, mantenha ambos os níveis de cobertura.
- Adicione regressões focadas de helper para limites puros de roteamento/normalização.
- Também mantenha saudáveis as suítes de integração do executor embutido:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsesrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Essas suítes verificam que ids com escopo e o comportamento de compactação ainda fluem pelos caminhos reais de
run.ts/compact.ts; testes somente de helper não são um substituto suficiente para esses caminhos de integração.
- Observação sobre pool:
- A configuração base do Vitest agora usa
threadspor padrão. - A configuração compartilhada do Vitest também fixa
isolate: falsee usa o executor não isolado nos projetos raiz, e2e e ao vivo. - A faixa raiz de UI mantém sua configuração
jsdome otimizador, mas agora também executa no executor não isolado compartilhado. - Cada shard de
pnpm testherda os mesmos padrõesthreads+isolate: falseda configuração compartilhada do Vitest. - O iniciador compartilhado
scripts/run-vitest.mjsagora também adiciona--no-maglevpor padrão aos processos Node filhos do Vitest para reduzir churn de compilação do V8 durante grandes execuções locais. DefinaOPENCLAW_VITEST_ENABLE_MAGLEV=1se precisar comparar com o comportamento padrão do V8.
- A configuração base do Vitest agora usa
- Observação sobre iteração local rápida:
pnpm test:changedroteia por faixas com escopo quando os caminhos alterados mapeiam de forma limpa para uma suíte menor.pnpm test:maxepnpm test:changed:maxmantêm o mesmo comportamento de roteamento, apenas com um limite maior de workers.- O autoescalonamento local de workers agora é intencionalmente conservador e também recua quando a média de carga do host já está alta, para que múltiplas execuções simultâneas do Vitest causem menos impacto por padrão.
- A configuração base do Vitest marca os projetos/arquivos de configuração como
forceRerunTriggers, para que reexecuções em modo changed permaneçam corretas quando a fiação dos testes mudar. - A configuração mantém
OPENCLAW_VITEST_FS_MODULE_CACHEhabilitado em hosts compatíveis; definaOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathse quiser um local explícito de cache para profiling direto.
- Observação sobre depuração de desempenho:
pnpm test:perf:importshabilita relatórios de duração de importação do Vitest e saída de detalhamento de importação.pnpm test:perf:imports:changedrestringe a mesma visualização de profiling aos arquivos alterados desdeorigin/main.
pnpm test:perf:changed:bench -- --ref <git-ref>comparatest:changedroteado com o caminho nativo do projeto raiz para aquele diff com commit e imprime tempo total e RSS máximo no macOS.pnpm test:perf:changed:bench -- --worktreemede a árvore de trabalho suja atual roteando a lista de arquivos alterados porscripts/test-projects.mjse pela configuração Vitest do projeto raiz.pnpm test:perf:profile:maingrava um perfil de CPU da thread principal para sobrecarga de inicialização e transformação de Vitest/Vite.pnpm test:perf:profile:runnergrava perfis de CPU+heap do executor para a suíte unitária com paralelismo de arquivos desabilitado.
E2E (smoke do gateway)
- Comando:
pnpm test:e2e - Configuração:
vitest.e2e.config.ts - Arquivos:
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts - Padrões de runtime:
- Usa
threadsdo Vitest comisolate: false, em linha com o restante do repositório. - Usa workers adaptativos (CI: até 2, local: 1 por padrão).
- Executa em modo silencioso por padrão para reduzir a sobrecarga de I/O no console.
- Usa
- Substituições úteis:
OPENCLAW_E2E_WORKERS=<n>para forçar a contagem de workers (limitada a 16).OPENCLAW_E2E_VERBOSE=1para reativar saída detalhada no console.
- Escopo:
- Comportamento end-to-end do gateway em múltiplas instâncias
- Superfícies WebSocket/HTTP, emparelhamento de nós e rede mais pesada
- Expectativas:
- Executa no CI (quando habilitado no pipeline)
- Não requer chaves reais
- Tem mais partes móveis do que os testes unitários (pode ser mais lento)
E2E: smoke do backend OpenShell
- Comando:
pnpm test:e2e:openshell - Arquivo:
test/openshell-sandbox.e2e.test.ts - Escopo:
- Inicia um gateway OpenShell isolado no host via Docker
- Cria um sandbox a partir de um Dockerfile local temporário
- Exercita o backend OpenClaw OpenShell sobre
sandbox ssh-configreal + execução SSH - Verifica o comportamento canônico remoto do sistema de arquivos por meio da bridge fs do sandbox
- Expectativas:
- Somente opt-in; não faz parte da execução padrão de
pnpm test:e2e - Requer uma CLI
openshelllocal e um daemon Docker funcional - Usa
HOME/XDG_CONFIG_HOMEisolados, e então destrói o gateway de teste e o sandbox
- Somente opt-in; não faz parte da execução padrão de
- Substituições úteis:
OPENCLAW_E2E_OPENSHELL=1para habilitar o teste ao executar manualmente a suíte e2e mais amplaOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellpara apontar para um binário CLI não padrão ou script wrapper
Ao vivo (provedores reais + modelos reais)
- Comando:
pnpm test:live - Configuração:
vitest.live.config.ts - Arquivos:
src/**/*.live.test.ts - Padrão: habilitado por
pnpm test:live(defineOPENCLAW_LIVE_TEST=1) - Escopo:
- “Este provedor/modelo realmente funciona hoje com credenciais reais?”
- Capturar mudanças de formato do provedor, peculiaridades de chamada de ferramentas, problemas de autenticação e comportamento de limite de taxa
- Expectativas:
- Não é estável em CI por definição (redes reais, políticas reais de provedores, cotas, indisponibilidades)
- Custa dinheiro / usa limites de taxa
- Prefira executar subconjuntos reduzidos em vez de “tudo”
- Execuções ao vivo carregam
~/.profilepara obter chaves de API ausentes. - Por padrão, execuções ao vivo ainda isolam
HOMEe copiam material de configuração/autenticação para um diretório temporário de teste, para que fixtures unitários não possam alterar seu~/.openclawreal. - Defina
OPENCLAW_LIVE_USE_REAL_HOME=1somente quando você realmente precisar que os testes ao vivo usem seu diretório home real. pnpm test:liveagora usa por padrão um modo mais silencioso: mantém a saída de progresso[live] ..., mas suprime o aviso extra de~/.profilee silencia logs de bootstrap do gateway/chatter do Bonjour. DefinaOPENCLAW_LIVE_TEST_QUIET=0se quiser os logs completos de inicialização de volta.- Rotação de chaves de API (específica por provedor): defina
*_API_KEYSno formato com vírgula/ponto e vírgula ou*_API_KEY_1,*_API_KEY_2(por exemploOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) ou substituição por execução ao vivo comOPENCLAW_LIVE_*_KEY; os testes tentam novamente em respostas de limite de taxa. - Saída de progresso/heartbeat:
- As suítes ao vivo agora emitem linhas de progresso para stderr, para que chamadas longas ao provedor permaneçam visivelmente ativas mesmo quando a captura de console do Vitest estiver silenciosa.
vitest.live.config.tsdesabilita a interceptação de console do Vitest para que linhas de progresso do provedor/gateway sejam transmitidas imediatamente durante execuções ao vivo.- Ajuste heartbeats de modelo direto com
OPENCLAW_LIVE_HEARTBEAT_MS. - Ajuste heartbeats de gateway/sonda com
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Qual suíte devo executar?
Use esta tabela de decisão:- Editando lógica/testes: execute
pnpm test(epnpm test:coveragese você alterou muita coisa) - Alterando rede do gateway / protocolo WS / emparelhamento: adicione
pnpm test:e2e - Depurando “meu bot caiu” / falhas específicas de provedor / chamada de ferramenta: execute um
pnpm test:livereduzido
Ao vivo: varredura de capacidades de nó Android
- Teste:
src/gateway/android-node.capabilities.live.test.ts - Script:
pnpm android:test:integration - Objetivo: invocar todo comando atualmente anunciado por um nó Android conectado e validar o comportamento do contrato do comando.
- Escopo:
- Configuração prévia/manual (a suíte não instala/executa/emparelha o app).
- Validação comando por comando de
node.invokedo gateway para o nó Android selecionado.
- Pré-configuração obrigatória:
- App Android já conectado e emparelhado ao gateway.
- App mantido em primeiro plano.
- Permissões/consentimento de captura concedidos para as capacidades que você espera que passem.
- Substituições opcionais de destino:
OPENCLAW_ANDROID_NODE_IDouOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- Detalhes completos da configuração do Android: App Android
Ao vivo: smoke de modelo (chaves de perfil)
Os testes ao vivo são divididos em duas camadas para que possamos isolar falhas:- “Modelo direto” nos informa se o provedor/modelo consegue responder com a chave fornecida.
- “Smoke do gateway” nos informa se o pipeline completo gateway+agente funciona para esse modelo (sessões, histórico, ferramentas, política de sandbox etc.).
Camada 1: conclusão direta do modelo (sem gateway)
- Teste:
src/agents/models.profiles.live.test.ts - Objetivo:
- Enumerar os modelos descobertos
- Usar
getApiKeyForModelpara selecionar modelos para os quais você tem credenciais - Executar uma pequena conclusão por modelo (e regressões direcionadas quando necessário)
- Como habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se estiver invocando o Vitest diretamente)
- Defina
OPENCLAW_LIVE_MODELS=modern(ouall, alias para modern) para realmente executar esta suíte; caso contrário ela é ignorada para manterpnpm test:livefocado no smoke do gateway - Como selecionar modelos:
OPENCLAW_LIVE_MODELS=modernpara executar a allowlist moderna (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)OPENCLAW_LIVE_MODELS=allé um alias para a allowlist moderna- ou
OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."(allowlist separada por vírgulas) - Varreduras modern/all usam por padrão um limite curado de alto sinal; defina
OPENCLAW_LIVE_MAX_MODELS=0para uma varredura moderna exaustiva ou um número positivo para um limite menor.
- Como selecionar provedores:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(allowlist separada por vírgulas)
- De onde vêm as chaves:
- Por padrão: armazenamento de perfis e fallbacks de env
- Defina
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para exigir somente o armazenamento de perfis
- Por que isso existe:
- Separa “a API do provedor está quebrada / a chave é inválida” de “o pipeline do agente do gateway está quebrado”
- Contém regressões pequenas e isoladas (exemplo: replay de raciocínio do OpenAI Responses/Codex Responses + fluxos de chamada de ferramenta)
Camada 2: smoke do gateway + agente dev (o que @openclaw realmente faz)
- Teste:
src/gateway/gateway-models.profiles.live.test.ts - Objetivo:
- Iniciar um gateway em processo
- Criar/atualizar uma sessão
agent:dev:*(substituição de modelo por execução) - Iterar por modelos com chaves e verificar:
- resposta “significativa” (sem ferramentas)
- uma invocação real de ferramenta funciona (sonda de leitura)
- sondas opcionais de ferramenta extra (sonda exec+read)
- caminhos de regressão do OpenAI (somente chamada de ferramenta → acompanhamento) continuam funcionando
- Detalhes das sondas (para que você possa explicar falhas rapidamente):
- sonda
read: o teste grava um arquivo nonce no workspace e pede ao agente parareadele e ecoar o nonce de volta. - sonda
exec+read: o teste pede ao agente para gravar um nonce em um arquivo temporário viaexece depoisreadesse arquivo. - sonda de imagem: o teste anexa um PNG gerado (gato + código aleatório) e espera que o modelo retorne
cat <CODE>. - Referência de implementação:
src/gateway/gateway-models.profiles.live.test.tsesrc/gateway/live-image-probe.ts.
- sonda
- Como habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se estiver invocando o Vitest diretamente)
- Como selecionar modelos:
- Padrão: allowlist moderna (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=allé um alias para a allowlist moderna- Ou defina
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(ou lista separada por vírgulas) para restringir - Varreduras de gateway modern/all usam por padrão um limite curado de alto sinal; defina
OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0para uma varredura moderna exaustiva ou um número positivo para um limite menor.
- Como selecionar provedores (evite “OpenRouter tudo”):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(allowlist separada por vírgulas)
- As sondas de ferramenta + imagem estão sempre ativadas neste teste ao vivo:
- sonda
read+ sondaexec+read(estresse de ferramenta) - a sonda de imagem é executada quando o modelo anuncia suporte para entrada de imagem
- Fluxo (alto nível):
- O teste gera um PNG minúsculo com “CAT” + código aleatório (
src/gateway/live-image-probe.ts) - Envia via
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - O gateway analisa anexos em
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - O agente embutido encaminha uma mensagem de usuário multimodal ao modelo
- Verificação: a resposta contém
cat+ o código (tolerância de OCR: pequenos erros são permitidos)
- O teste gera um PNG minúsculo com “CAT” + código aleatório (
- sonda
provider/model), execute:
Ao vivo: smoke de backend de CLI (Claude, Codex, Gemini ou outras CLIs locais)
- Teste:
src/gateway/gateway-cli-backend.live.test.ts - Objetivo: validar o pipeline Gateway + agente usando um backend de CLI local, sem tocar na sua configuração padrão.
- Os padrões de smoke específicos de backend vivem na definição
cli-backend.tsda extensão proprietária. - Habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se estiver invocando o Vitest diretamente)OPENCLAW_LIVE_CLI_BACKEND=1
- Padrões:
- Provedor/modelo padrão:
claude-cli/claude-sonnet-4-6 - Comportamento de comando/args/imagem vem dos metadados do plugin proprietário do backend de CLI.
- Provedor/modelo padrão:
- Substituições (opcionais):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1para enviar um anexo de imagem real (os caminhos são injetados no prompt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"para passar caminhos de arquivo de imagem como args da CLI em vez de injeção no prompt.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(ou"list") para controlar como os args de imagem são passados quandoIMAGE_ARGestiver definido.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1para enviar um segundo turno e validar o fluxo de retomada.OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0para desabilitar a sonda padrão de continuidade na mesma sessão Claude Sonnet -> Opus (defina como1para forçá-la quando o modelo selecionado oferecer suporte a um destino de troca).
- O executor Docker fica em
scripts/test-live-cli-backend-docker.sh. - Ele executa o smoke ao vivo do backend de CLI dentro da imagem Docker do repositório como o usuário não root
node. - Ele resolve metadados de smoke da CLI a partir da extensão proprietária e então instala o pacote de CLI Linux correspondente (
@anthropic-ai/claude-code,@openai/codexou@google/gemini-cli) em um prefixo gravável com cache emOPENCLAW_DOCKER_CLI_TOOLS_DIR(padrão:~/.cache/openclaw/docker-cli-tools). pnpm test:docker:live-cli-backend:claude-subscriptionrequer OAuth portátil de assinatura do Claude Code por meio de~/.claude/.credentials.jsoncomclaudeAiOauth.subscriptionTypeouCLAUDE_CODE_OAUTH_TOKENdeclaude setup-token. Primeiro ele provaclaude -pdireto no Docker e depois executa dois turnos do backend de CLI do Gateway sem preservar variáveis de env de chave de API da Anthropic. Essa faixa de assinatura desabilita por padrão as sondas MCP/tool e de imagem do Claude, porque atualmente o Claude roteia o uso de apps de terceiros por cobrança de uso extra em vez dos limites normais do plano de assinatura.- O smoke ao vivo do backend de CLI agora exercita o mesmo fluxo end-to-end para Claude, Codex e Gemini: turno de texto, turno de classificação de imagem e depois chamada de ferramenta MCP
cronverificada via a CLI do gateway. - O smoke padrão do Claude também atualiza a sessão de Sonnet para Opus e verifica que a sessão retomada ainda se lembra de uma observação anterior.
Ao vivo: smoke de bind ACP (/acp spawn ... --bind here)
- Teste:
src/gateway/gateway-acp-bind.live.test.ts - Objetivo: validar o fluxo real de bind de conversa ACP com um agente ACP ao vivo:
- enviar
/acp spawn <agent> --bind here - vincular em lugar uma conversa sintética de canal de mensagens
- enviar um acompanhamento normal nessa mesma conversa
- verificar que o acompanhamento chega ao transcript da sessão ACP vinculada
- enviar
- Habilitar:
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- Padrões:
- Agentes ACP no Docker:
claude,codex,gemini - Agente ACP para
pnpm test:live ...direto:claude - Canal sintético: contexto de conversa no estilo DM do Slack
- Backend ACP:
acpx
- Agentes ACP no Docker:
- Substituições:
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>'
- Observações:
- Essa faixa usa a superfície
chat.senddo gateway com campos sintéticos de rota de origem somente para admin, para que os testes possam anexar contexto de canal de mensagens sem fingir entrega externa. - Quando
OPENCLAW_LIVE_ACP_BIND_AGENT_COMMANDnão estiver definido, o teste usa o registro de agentes integrado do plugin embutidoacpxpara o agente de harness ACP selecionado.
- Essa faixa usa a superfície
- O executor Docker fica em
scripts/test-live-acp-bind-docker.sh. - Por padrão, ele executa o smoke de bind ACP contra todos os agentes de CLI ao vivo compatíveis em sequência:
claude,codex, depoisgemini. - Use
OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,OPENCLAW_LIVE_ACP_BIND_AGENTS=codexouOPENCLAW_LIVE_ACP_BIND_AGENTS=geminipara restringir a matriz. - Ele carrega
~/.profile, prepara o material de autenticação da CLI correspondente no contêiner, instalaacpxem um prefixo npm gravável e então instala a CLI ao vivo solicitada (@anthropic-ai/claude-code,@openai/codexou@google/gemini-cli) se estiver ausente. - Dentro do Docker, o executor define
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpxpara que o acpx mantenha disponíveis para a CLI filha do harness as variáveis de env do provedor vindas do profile carregado.
Ao vivo: smoke do harness app-server do Codex
- Objetivo: validar o harness Codex de propriedade do plugin pelo método normal
agentdo gateway:- carregar o plugin empacotado
codex - selecionar
OPENCLAW_AGENT_RUNTIME=codex - enviar um primeiro turno do agente do gateway para
codex/gpt-5.4 - enviar um segundo turno para a mesma sessão OpenClaw e verificar se a thread do app-server pode ser retomada
- executar
/codex statuse/codex modelspelo mesmo caminho de comando do gateway
- carregar o plugin empacotado
- Teste:
src/gateway/gateway-codex-harness.live.test.ts - Habilitar:
OPENCLAW_LIVE_CODEX_HARNESS=1 - Modelo padrão:
codex/gpt-5.4 - Sonda opcional de imagem:
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 - Sonda opcional de MCP/tool:
OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 - O smoke define
OPENCLAW_AGENT_HARNESS_FALLBACK=none, para que um harness Codex quebrado não passe por fallback silencioso para PI. - Autenticação:
OPENAI_API_KEYdo shell/profile, mais cópia opcional de~/.codex/auth.jsone~/.codex/config.toml
- O executor Docker fica em
scripts/test-live-codex-harness-docker.sh. - Ele carrega o
~/.profilemontado, passaOPENAI_API_KEY, copia arquivos de autenticação da CLI Codex quando presentes, instala@openai/codexem um prefixo npm gravável montado, prepara a árvore de origem e então executa somente o teste ao vivo do harness Codex. - O Docker habilita por padrão as sondas de imagem e MCP/tool. Defina
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0ouOPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0quando precisar de uma execução de depuração mais restrita. - O Docker também exporta
OPENCLAW_AGENT_HARNESS_FALLBACK=none, em linha com a configuração de teste ao vivo, para que fallback paraopenai-codex/*ou PI não possa ocultar uma regressão do harness Codex.
Receitas recomendadas para testes ao vivo
Allowlists restritas e explícitas são mais rápidas e menos instáveis:-
Modelo único, direto (sem gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
Modelo único, smoke do gateway:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Chamada de ferramentas em vários provedores:
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
-
Foco no Google (chave de API Gemini + Antigravity):
- Gemini (chave de 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 (chave de API):
google/...usa a API Gemini (chave de API).google-antigravity/...usa a bridge OAuth Antigravity (endpoint de agente no estilo Cloud Code Assist).google-gemini-cli/...usa a CLI Gemini local na sua máquina (autenticação separada + peculiaridades de ferramentas).- API Gemini vs CLI Gemini:
- API: o OpenClaw chama a API Gemini hospedada do Google por HTTP (chave de API / autenticação de perfil); é isso que a maioria dos usuários quer dizer com “Gemini”.
- CLI: o OpenClaw executa um binário local
gemini; ele tem sua própria autenticação e pode se comportar de forma diferente (streaming/suporte a ferramentas/desalinhamento de versão).
Ao vivo: matriz de modelos (o que cobrimos)
Não existe uma “lista fixa de modelos de CI” (ao vivo é opt-in), mas estes são os modelos recomendados para cobrir regularmente em uma máquina de desenvolvimento com chaves.Conjunto smoke moderno (chamada de ferramentas + imagem)
Esta é a execução de “modelos comuns” que esperamos continuar funcionando:- OpenAI (não-Codex):
openai/gpt-5.4(opcional: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-previewegoogle/gemini-3-flash-preview(evite modelos Gemini 2.x mais antigos) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingegoogle-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
Linha de base: chamada de ferramentas (Read + Exec opcional)
Escolha pelo menos um por família de provedor:- 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 o mais recente disponível) - Mistral:
mistral/… (escolha um modelo com capacidade de “tools” que você tenha habilitado) - Cerebras:
cerebras/… (se você tiver acesso) - LM Studio:
lmstudio/… (local; a chamada de ferramentas depende do modo da API)
Visão: envio de imagem (anexo → mensagem multimodal)
Inclua pelo menos um modelo com capacidade de imagem emOPENCLAW_LIVE_GATEWAY_MODELS (variantes com suporte a visão de Claude/Gemini/OpenAI etc.) para exercitar a sonda de imagem.
Agregadores / gateways alternativos
Se você tiver chaves habilitadas, também damos suporte a testes via:- OpenRouter:
openrouter/...(centenas de modelos; useopenclaw models scanpara encontrar candidatos com capacidade de ferramenta+imagem) - OpenCode:
opencode/...para Zen eopencode-go/...para Go (autenticação viaOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- Integrados:
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(endpoints personalizados):minimax(nuvem/API), além de qualquer proxy compatível com OpenAI/Anthropic (LM Studio, vLLM, LiteLLM etc.)
discoverModels(...) retorna na sua máquina + as chaves que estiverem disponíveis.
Credenciais (nunca faça commit)
Os testes ao vivo descobrem credenciais da mesma forma que a CLI. Implicações práticas:- Se a CLI funciona, os testes ao vivo devem encontrar as mesmas chaves.
-
Se um teste ao vivo disser “sem credenciais”, depure da mesma forma que você depuraria
openclaw models list/ seleção de modelo. -
Perfis de autenticação por agente:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(é isso que “chaves de perfil” significa nos testes ao vivo) -
Configuração:
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH) -
Diretório de estado legado:
~/.openclaw/credentials/(copiado para o home ao vivo preparado quando presente, mas não é o armazenamento principal de chaves de perfil) -
Execuções locais ao vivo copiam por padrão a configuração ativa, arquivos
auth-profiles.jsonpor agente,credentials/legado e diretórios compatíveis de autenticação de CLI externa para um home temporário de teste; homes ao vivo preparados ignoramworkspace/esandboxes/, e substituições de caminhoagents.*.workspace/agentDirsão removidas para que as sondas não atinjam seu workspace real do host.
~/.profile), execute os testes locais após source ~/.profile, ou use os executores Docker abaixo (eles podem montar ~/.profile no contêiner).
Deepgram ao vivo (transcrição de áudio)
- Teste:
src/media-understanding/providers/deepgram/audio.live.test.ts - Habilitar:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
BytePlus coding plan ao vivo
- Teste:
src/agents/byteplus.live.test.ts - Habilitar:
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts - Substituição opcional de modelo:
BYTEPLUS_CODING_MODEL=ark-code-latest
ComfyUI workflow media ao vivo
- Teste:
extensions/comfy/comfy.live.test.ts - Habilitar:
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts - Escopo:
- Exercita os caminhos empacotados do comfy para imagem, vídeo e
music_generate - Ignora cada capacidade, a menos que
models.providers.comfy.<capability>esteja configurado - Útil após alterar envio de workflow do comfy, polling, downloads ou registro do plugin
- Exercita os caminhos empacotados do comfy para imagem, vídeo e
Geração de imagem ao vivo
- Teste:
src/image-generation/runtime.live.test.ts - Comando:
pnpm test:live src/image-generation/runtime.live.test.ts - Harness:
pnpm test:live:media image - Escopo:
- Enumera todos os plugins de provedor de geração de imagem registrados
- Carrega variáveis de env ausentes do provedor a partir do seu shell de login (
~/.profile) antes da sondagem - Usa chaves de API ao vivo/do env antes dos perfis de autenticação armazenados por padrão, para que chaves de teste obsoletas em
auth-profiles.jsonnão ocultem credenciais reais do shell - Ignora provedores sem autenticação/perfil/modelo utilizável
- Executa as variantes padrão de geração de imagem por meio da capacidade compartilhada de runtime:
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- Provedores empacotados atuais cobertos:
openaigoogle
- Restrição opcional:
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"
- Comportamento opcional de autenticação:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para forçar autenticação pelo armazenamento de perfis e ignorar substituições somente por env
Geração de música ao vivo
- Teste:
extensions/music-generation-providers.live.test.ts - Habilitar:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts - Harness:
pnpm test:live:media music - Escopo:
- Exercita o caminho compartilhado do provedor empacotado de geração de música
- Atualmente cobre Google e MiniMax
- Carrega variáveis de env do provedor a partir do seu shell de login (
~/.profile) antes da sondagem - Usa chaves de API ao vivo/do env antes dos perfis de autenticação armazenados por padrão, para que chaves de teste obsoletas em
auth-profiles.jsonnão ocultem credenciais reais do shell - Ignora provedores sem autenticação/perfil/modelo utilizável
- Executa ambos os modos de runtime declarados quando disponíveis:
generatecom entrada somente de prompteditquando o provedor declaracapabilities.edit.enabled
- Cobertura atual da faixa compartilhada:
google:generate,editminimax:generatecomfy: arquivo ao vivo separado do Comfy, não esta varredura compartilhada
- Restrição opcional:
OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"
- Comportamento opcional de autenticação:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para forçar autenticação pelo armazenamento de perfis e ignorar substituições somente por env
Geração de vídeo ao vivo
- Teste:
extensions/video-generation-providers.live.test.ts - Habilitar:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts - Harness:
pnpm test:live:media video - Escopo:
- Exercita o caminho compartilhado do provedor empacotado de geração de vídeo
- Carrega variáveis de env do provedor a partir do seu shell de login (
~/.profile) antes da sondagem - Usa chaves de API ao vivo/do env antes dos perfis de autenticação armazenados por padrão, para que chaves de teste obsoletas em
auth-profiles.jsonnão ocultem credenciais reais do shell - Ignora provedores sem autenticação/perfil/modelo utilizável
- Executa ambos os modos de runtime declarados quando disponíveis:
generatecom entrada somente de promptimageToVideoquando o provedor declaracapabilities.imageToVideo.enablede o provedor/modelo selecionado aceita entrada de imagem local com buffer na varredura compartilhadavideoToVideoquando o provedor declaracapabilities.videoToVideo.enablede o provedor/modelo selecionado aceita entrada de vídeo local com buffer na varredura compartilhada
- Provedores atualmente declarados, mas ignorados, de
imageToVideona varredura compartilhada:vydra, porque oveo3empacotado é somente texto e oklingempacotado exige uma URL de imagem remota
- Cobertura específica de provedor do Vydra:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts- esse arquivo executa
veo3texto para vídeo e também uma faixaklingque usa por padrão uma fixture de URL de imagem remota
- Cobertura atual ao vivo de
videoToVideo:- somente
runwayquando o modelo selecionado érunway/gen4_aleph
- somente
- Provedores atualmente declarados, mas ignorados, de
videoToVideona varredura compartilhada:alibaba,qwen,xai, porque esses caminhos atualmente exigem URLs de referência remotashttp(s)/ MP4google, porque a faixa compartilhada atual de Gemini/Veo usa entrada local com buffer e esse caminho não é aceito na varredura compartilhadaopenai, porque a faixa compartilhada atual não tem garantias de acesso específico por organização para inpaint/remix de vídeo
- Restrição opcional:
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"
- Comportamento opcional de autenticação:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para forçar autenticação pelo armazenamento de perfis e ignorar substituições somente por env
Harness de mídia ao vivo
- Comando:
pnpm test:live:media - Finalidade:
- Executa as suítes compartilhadas ao vivo de imagem, música e vídeo por um único entrypoint nativo do repositório
- Carrega automaticamente variáveis de env ausentes do provedor a partir de
~/.profile - Restringe automaticamente cada suíte por padrão aos provedores que atualmente têm autenticação utilizável
- Reutiliza
scripts/test-live.mjs, para que o comportamento de heartbeat e modo silencioso permaneça consistente
- Exemplos:
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
Executores Docker (verificações opcionais de “funciona no Linux”)
Esses executores Docker se dividem em dois grupos:- Executores de modelos ao vivo:
test:docker:live-modelsetest:docker:live-gatewayexecutam apenas seu arquivo ao vivo correspondente de chaves de perfil dentro da imagem Docker do repositório (src/agents/models.profiles.live.test.tsesrc/gateway/gateway-models.profiles.live.test.ts), montando seu diretório local de configuração e workspace (e carregando~/.profilese estiver montado). Os entrypoints locais correspondentes sãotest:live:models-profilesetest:live:gateway-profiles. - Os executores Docker ao vivo usam por padrão um limite smoke menor para que uma varredura Docker completa continue prática:
test:docker:live-modelsusa por padrãoOPENCLAW_LIVE_MAX_MODELS=12, etest:docker:live-gatewayusa por padrãoOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000eOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Substitua essas variáveis de env quando você quiser explicitamente a varredura exaustiva maior. test:docker:allcompila a imagem Docker ao vivo uma vez por meio detest:docker:live-build, depois a reutiliza para as duas faixas Docker ao vivo.- Executores smoke de contêiner:
test:docker:openwebui,test:docker:onboard,test:docker:gateway-network,test:docker:mcp-channelsetest:docker:pluginsiniciam um ou mais contêineres reais e verificam caminhos de integração de nível mais alto.
- Modelos diretos:
pnpm test:docker:live-models(script:scripts/test-live-models-docker.sh) - Smoke de bind ACP:
pnpm test:docker:live-acp-bind(script:scripts/test-live-acp-bind-docker.sh) - Smoke de backend de CLI:
pnpm test:docker:live-cli-backend(script:scripts/test-live-cli-backend-docker.sh) - Smoke do harness app-server do Codex:
pnpm test:docker:live-codex-harness(script:scripts/test-live-codex-harness-docker.sh) - Gateway + agente dev:
pnpm test:docker:live-gateway(script:scripts/test-live-gateway-models-docker.sh) - Smoke ao vivo do Open WebUI:
pnpm test:docker:openwebui(script:scripts/e2e/openwebui-docker.sh) - Assistente de onboarding (TTY, scaffolding completo):
pnpm test:docker:onboard(script:scripts/e2e/onboard-docker.sh) - Rede do gateway (dois contêineres, autenticação WS + integridade):
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) - Bridge de canal MCP (Gateway inicializado com seed + bridge stdio + smoke bruto de frame de notificação do Claude):
pnpm test:docker:mcp-channels(script:scripts/e2e/mcp-channels-docker.sh) - Plugins (smoke de instalação + alias
/plugin+ semântica de reinício do bundle Claude):pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh)
.pnpm-store, .worktrees, __openclaw_vitest__ e diretórios locais do app .build ou
saídas do Gradle, para que execuções Docker ao vivo não passem minutos copiando
artefatos específicos da máquina.
Eles também definem OPENCLAW_SKIP_CHANNELS=1 para que sondas ao vivo do gateway não iniciem
workers reais de canal do Telegram/Discord/etc. dentro do contêiner.
test:docker:live-models ainda executa pnpm test:live, portanto repasse
OPENCLAW_LIVE_GATEWAY_* também quando precisar restringir ou excluir a cobertura ao vivo do gateway dessa faixa Docker.
test:docker:openwebui é um smoke de compatibilidade de nível mais alto: ele inicia um
contêiner do gateway OpenClaw com os endpoints HTTP compatíveis com OpenAI habilitados,
inicia um contêiner fixado do Open WebUI contra esse gateway, faz login pelo
Open WebUI, verifica que /api/models expõe openclaw/default e então envia uma
solicitação de chat real por meio do proxy /api/chat/completions do Open WebUI.
A primeira execução pode ser visivelmente mais lenta, porque o Docker pode precisar baixar a
imagem do Open WebUI e o Open WebUI pode precisar concluir sua própria configuração de inicialização a frio.
Essa faixa espera uma chave de modelo ao vivo utilizável, e OPENCLAW_PROFILE_FILE
(~/.profile por padrão) é a forma principal de fornecê-la em execuções com Docker.
Execuções bem-sucedidas imprimem um pequeno payload JSON como { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels é intencionalmente determinístico e não precisa de uma
conta real de Telegram, Discord ou iMessage. Ele inicia um contêiner de Gateway
inicializado com seed, inicia um segundo contêiner que executa openclaw mcp serve e então
verifica descoberta de conversa roteada, leituras de transcript, metadados de anexo,
comportamento da fila de eventos ao vivo, roteamento de envio de saída e notificações no estilo Claude de canal +
permissão sobre a bridge MCP stdio real. A verificação de notificação
inspeciona diretamente os frames MCP stdio brutos, de modo que o smoke valida o que a
bridge realmente emite, não apenas o que um SDK específico de cliente por acaso expõe.
Smoke manual de thread ACP em linguagem simples (não CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Mantenha este script para fluxos de regressão/depuração. Ele pode ser necessário novamente para validação de roteamento de thread ACP, portanto não o exclua.
OPENCLAW_CONFIG_DIR=...(padrão:~/.openclaw) montado em/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(padrão:~/.openclaw/workspace) montado em/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(padrão:~/.profile) montado em/home/node/.profilee carregado antes de executar os testesOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(padrão:~/.cache/openclaw/docker-cli-tools) montado em/home/node/.npm-globalpara instalações de CLI em cache dentro do Docker- Diretórios/arquivos de autenticação de CLI externa sob
$HOMEsão montados como somente leitura em/host-auth...e então copiados para/home/node/...antes do início dos testes- Diretórios padrão:
.minimax - Arquivos padrão:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Execuções restritas por provedor montam apenas os diretórios/arquivos necessários inferidos de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Substitua manualmente com
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneou uma lista separada por vírgulas comoOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Diretórios padrão:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...para restringir a execuçãoOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...para filtrar provedores dentro do contêinerOPENCLAW_SKIP_DOCKER_BUILD=1para reutilizar uma imagemopenclaw:local-liveexistente em reexecuções que não precisam de nova compilaçãoOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para garantir que as credenciais venham do armazenamento de perfis (não do env)OPENCLAW_OPENWEBUI_MODEL=...para escolher o modelo exposto pelo gateway para o smoke do Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...para substituir o prompt de verificação de nonce usado pelo smoke do Open WebUIOPENWEBUI_IMAGE=...para substituir a tag de imagem fixada do Open WebUI
Sanidade da documentação
Execute verificações de documentação após edições nos docs:pnpm check:docs.
Execute a validação completa de âncoras do Mintlify quando você também precisar de verificações de cabeçalhos na página: pnpm docs:check-links:anchors.
Regressão offline (segura para CI)
Estas são regressões de “pipeline real” sem provedores reais:- Chamada de ferramenta do gateway (OpenAI simulado, gateway real + loop do agente):
src/gateway/gateway.test.ts(caso: “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Assistente do gateway (WS
wizard.start/wizard.next, gravação forçada de config + auth):src/gateway/gateway.test.ts(caso: “runs wizard over ws and writes auth token config”)
Avaliações de confiabilidade do agente (Skills)
Já temos alguns testes seguros para CI que se comportam como “avaliações de confiabilidade do agente”:- Chamada simulada de ferramenta por meio do loop real do gateway + agente (
src/gateway/gateway.test.ts). - Fluxos end-to-end do assistente que validam a conexão da sessão e os efeitos de configuração (
src/gateway/gateway.test.ts).
- Tomada de decisão: quando as Skills estão listadas no prompt, o agente escolhe a Skill correta (ou evita as irrelevantes)?
- Conformidade: o agente lê
SKILL.mdantes do uso e segue as etapas/args exigidos? - Contratos de fluxo de trabalho: cenários de múltiplos turnos que verificam ordem de ferramentas, transporte do histórico da sessão e limites do sandbox.
- Um executor de cenários usando provedores simulados para verificar chamadas de ferramenta + ordem, leituras de arquivos de Skill e conexão de sessão.
- Uma pequena suíte de cenários focados em Skills (usar vs evitar, gating, injeção de prompt).
- Avaliações ao vivo opcionais (opt-in, controladas por env) somente depois que a suíte segura para CI estiver pronta.
Testes de contrato (forma de plugin e canal)
Os testes de contrato verificam que todo plugin e canal registrado está em conformidade com seu contrato de interface. Eles iteram sobre todos os plugins descobertos e executam uma suíte de verificações de forma e comportamento. A faixa unitária padrãopnpm test intencionalmente ignora esses arquivos compartilhados de seam e smoke; execute os comandos de contrato explicitamente quando alterar superfícies compartilhadas de canal ou provedor.
Comandos
- Todos os contratos:
pnpm test:contracts - Apenas contratos de canal:
pnpm test:contracts:channels - Apenas contratos de provedor:
pnpm test:contracts:plugins
Contratos de canal
Localizados emsrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - Forma básica do plugin (id, nome, capacidades)
- setup - Contrato do assistente de configuração
- session-binding - Comportamento de vinculação de sessão
- outbound-payload - Estrutura do payload de mensagem
- inbound - Tratamento de mensagem de entrada
- actions - Manipuladores de ações do canal
- threading - Tratamento de id de thread
- directory - API de diretório/lista
- group-policy - Aplicação de política de grupo
Contratos de status do provedor
Localizados emsrc/plugins/contracts/*.contract.test.ts.
- status - Sondas de status do canal
- registry - Forma do registro de plugins
Contratos de provedor
Localizados emsrc/plugins/contracts/*.contract.test.ts:
- auth - Contrato de fluxo de autenticação
- auth-choice - Escolha/seleção de autenticação
- catalog - API de catálogo de modelos
- discovery - Descoberta de plugin
- loader - Carregamento de plugin
- runtime - Runtime do provedor
- shape - Forma/interface do plugin
- wizard - Assistente de configuração
Quando executar
- Após alterar exportações ou subcaminhos do plugin-sdk
- Após adicionar ou modificar um plugin de canal ou provedor
- Após refatorar registro ou descoberta de plugins
Adição de regressões (orientações)
Quando você corrige um problema de provedor/modelo descoberto em testes ao vivo:- Adicione uma regressão segura para CI, se possível (provedor simulado/stub, ou capture a transformação exata do formato da solicitação)
- Se for inerentemente apenas ao vivo (limites de taxa, políticas de autenticação), mantenha o teste ao vivo restrito e opt-in por meio de variáveis de env
- Prefira atingir a menor camada que capture o bug:
- bug de conversão/replay de solicitação do provedor → teste direto de modelos
- bug do pipeline de sessão/histórico/ferramenta do gateway → smoke ao vivo do gateway ou teste seguro para CI com mock do gateway
- Proteção para travessia de SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsderiva um alvo de amostra por classe de SecretRef a partir dos metadados do registro (listSecretTargetRegistryEntries()), então verifica se ids exec de segmento de travessia são rejeitados.- Se você adicionar uma nova família de alvo SecretRef
includeInPlanemsrc/secrets/target-registry-data.ts, atualizeclassifyTargetClassnesse teste. O teste falha intencionalmente em ids de alvo não classificados para que novas classes não possam ser ignoradas silenciosamente.