docs/help/testing-live.md
For quick start, QA runners, unit/integration suites, and Docker flows, see Testing. This page covers live (network-touching) tests: model matrix, CLI backends, ACP, media providers, and credential handling.
Export the needed provider key in the process environment before ad hoc live checks.
Safe media smoke:
pnpm openclaw infer tts convert --local --json \
--text "OpenClaw live smoke." \
--output /tmp/openclaw-live-smoke.mp3
Safe voice-call readiness smoke:
pnpm openclaw voicecall setup --json
pnpm openclaw voicecall smoke --to "+15555550123"
voicecall smoke is a dry run unless --yes is also present; use --yes only
when you intend to place a real call. For Twilio, Telnyx, and Plivo, a
successful readiness check requires a public webhook URL - local/private
loopback URLs are rejected because those providers cannot reach them.
src/gateway/android-node.capabilities.live.test.tspnpm android:test:integrationnode.invoke validation for the selected Android node.OPENCLAW_ANDROID_NODE_ID or OPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL / OPENCLAW_ANDROID_GATEWAY_TOKEN / OPENCLAW_ANDROID_GATEWAY_PASSWORD.Live model tests are split into two layers so failures are isolated:
The curated model lists below live in src/agents/live-model-filter.ts and
change over time; treat the arrays there as the source of truth, not this
page.
MiniMax M3 uses minimax/MiniMax-M3 as its default provider/model reference.
src/agents/models.profiles.live.test.tsgetApiKeyForModel to select models you have creds forpnpm test:live (or OPENCLAW_LIVE_TEST=1 if invoking Vitest directly)OPENCLAW_LIVE_MODELS=modern, small, or all (alias for modern) to actually run this suite; otherwise it skips, so pnpm test:live on its own stays focused on gateway smoke.OPENCLAW_LIVE_MODELS=modern runs the curated high-signal priority list (see Live: model matrix)OPENCLAW_LIVE_MODELS=small runs the curated small-model priority listOPENCLAW_LIVE_MODELS=all is an alias for modernOPENCLAW_LIVE_MODELS="openai/gpt-5.5,anthropic/claude-opus-4-6,..." (comma allowlist)http://127.0.0.1:11434; set OPENCLAW_LIVE_OLLAMA_BASE_URL only for LAN, custom, or Ollama Cloud endpoints.OPENCLAW_LIVE_MAX_MODELS=0 for an exhaustive selected-profile sweep or a positive number for a smaller cap.OPENCLAW_LIVE_TEST_TIMEOUT_MS for the whole direct-model test timeout. Default: 60 minutes.OPENCLAW_LIVE_MODEL_CONCURRENCY to override.OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli" (comma allowlist)OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 to enforce profile store onlysrc/gateway/gateway-models.profiles.live.test.tsagent:dev:* session (model override per run)read probe: the test writes a nonce file in the workspace and asks the agent to read it and echo the nonce back.exec+read probe: the test asks the agent to exec-write a nonce into a temp file, then read it back.cat <CODE>.src/gateway/gateway-models.profiles.live.test.ts and test/helpers/live-image-probe.ts.pnpm test:live (or OPENCLAW_LIVE_TEST=1 if invoking Vitest directly)modern) priority listOPENCLAW_LIVE_GATEWAY_MODELS=small runs the curated small-model list through the full gateway+agent pipelineOPENCLAW_LIVE_GATEWAY_MODELS=all is an alias for modernOPENCLAW_LIVE_GATEWAY_MODELS="provider/model" (or comma list) to narrowOPENCLAW_LIVE_GATEWAY_MAX_MODELS=0 for an exhaustive selected sweep or a positive number for a smaller cap.OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax" (comma allowlist)read probe + exec+read probe (tool stress)test/helpers/live-image-probe.ts)agent attachments: [{ mimeType: "image/png", content: "<base64>" }]images[] (src/gateway/server-methods/agent.ts + src/gateway/chat-attachments.ts)cat + the code (OCR tolerance: minor mistakes allowed)openclaw models list
openclaw models list --json
src/gateway/gateway-cli-backend.live.test.tscli-backend.ts definition.pnpm test:live (or OPENCLAW_LIVE_TEST=1 if invoking Vitest directly)OPENCLAW_LIVE_CLI_BACKEND=1claude-cli/claude-sonnet-4-6OPENCLAW_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=1 to send a real image attachment (paths are injected into the prompt). Off by default in Docker recipes.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image" to pass image file paths as CLI args instead of prompt injection.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat" (or "list") to control how image args are passed when IMAGE_ARG is set.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1 to send a second turn and validate resume flow.OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=1 to opt into the Claude Sonnet -> Opus same-session continuity probe when the selected model supports a switch target. Off by default, including in Docker recipes.OPENCLAW_LIVE_CLI_BACKEND_MCP_PROBE=1 to opt into the MCP/tool loopback probe. Off by default in Docker recipes.Example:
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.ts
Cheap Gemini MCP config smoke:
OPENCLAW_LIVE_TEST=1 \
pnpm test:live src/agents/cli-runner/bundle-mcp.gemini.live.test.ts
This does not ask Gemini to generate a response. It writes the same system
settings OpenClaw gives Gemini, then runs gemini --debug mcp list to prove a
saved transport: "streamable-http" server is normalized to Gemini's HTTP MCP
shape and can connect to a local streamable-HTTP MCP server.
Docker recipe:
pnpm test:docker:live-cli-backend
Single-provider Docker recipes:
pnpm test:docker:live-cli-backend:claude
pnpm test:docker:live-cli-backend:claude-subscription
pnpm test:docker:live-cli-backend:gemini
Notes:
scripts/test-live-cli-backend-docker.sh.node user.@anthropic-ai/claude-code or @google/gemini-cli) into a cached writable prefix at OPENCLAW_DOCKER_CLI_TOOLS_DIR (default: ~/.cache/openclaw/docker-cli-tools).codex-cli is no longer a bundled CLI backend; use openai/* with the Codex app-server runtime instead (see Live: Codex app-server harness smoke).pnpm test:docker:live-cli-backend:claude-subscription requires portable Claude Code subscription OAuth through either ~/.claude/.credentials.json with claudeAiOauth.subscriptionType or CLAUDE_CODE_OAUTH_TOKEN from claude setup-token. It first proves direct claude -p in Docker, then runs two Gateway CLI-backend turns without preserving Anthropic API-key env vars. This subscription lane disables the Claude MCP/tool and image probes by default because it consumes the signed-in subscription's usage limits and Anthropic can change Claude Agent SDK / claude -p billing and rate-limit behavior without an OpenClaw release.cron tool call, model-switch continuity) through the flags above, but none of those probes run by default - opt in per flag as needed.src/infra/push-apns-http2.live.test.ts403 InvalidProviderToken response comes back through the proxy path.OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_APNS_REACHABILITY=1 pnpm test:live src/infra/push-apns-http2.live.test.tsOPENCLAW_LIVE_APNS_TIMEOUT_MS=30000/acp spawn ... --bind here)src/gateway/gateway-acp-bind.live.test.ts/acp spawn <agent> --bind herepnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1claude,codex,geminipnpm test:live ...: claudeacpxOPENCLAW_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.5OPENCLAW_LIVE_ACP_BIND_OPENCODE_MODEL=opencode/kimi-k2.6OPENCLAW_LIVE_ACP_BIND_IMAGE_PROBE=1 (or on/true/yes) to force the image probe on; any other value forces it off. Runs by default for every agent except opencode.OPENCLAW_LIVE_ACP_BIND_REQUIRE_CRON=1OPENCLAW_LIVE_ACP_BIND_PARENT_MODEL=openai/gpt-5.5chat.send surface with admin-only synthetic originating-route fields so tests can attach message-channel context without pretending to deliver externally.OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND is unset, the test uses the embedded acpx plugin's built-in agent registry for the selected ACP harness agent.OPENCLAW_LIVE_ACP_BIND_REQUIRE_CRON=1 to make that post-bind cron probe strict.Example:
OPENCLAW_LIVE_ACP_BIND=1 \
OPENCLAW_LIVE_ACP_BIND_AGENT=claude \
pnpm test:live src/gateway/gateway-acp-bind.live.test.ts
Docker recipe:
pnpm test:docker:live-acp-bind
Single-agent Docker recipes:
pnpm test:docker:live-acp-bind:claude
pnpm test:docker:live-acp-bind:codex
pnpm test:docker:live-acp-bind:droid
pnpm test:docker:live-acp-bind:gemini
pnpm test:docker:live-acp-bind:opencode
Docker notes:
scripts/test-live-acp-bind-docker.sh.claude, codex, then gemini.OPENCLAW_LIVE_ACP_BIND_AGENTS=claude, OPENCLAW_LIVE_ACP_BIND_AGENTS=codex, OPENCLAW_LIVE_ACP_BIND_AGENTS=droid, OPENCLAW_LIVE_ACP_BIND_AGENTS=gemini, or OPENCLAW_LIVE_ACP_BIND_AGENTS=opencode to narrow the matrix.@anthropic-ai/claude-code, @openai/codex, Factory Droid via https://app.factory.ai/cli, @google/gemini-cli, or opencode-ai) if missing. The ACP backend itself is the embedded acpx/runtime package from the official acpx plugin.~/.factory for settings, forwards FACTORY_API_KEY, and requires that API key because local Factory OAuth/keyring auth is not portable into the container. It uses ACPX's built-in droid exec --output-format acp registry entry.OPENCODE_CONFIG_CONTENT default model from OPENCLAW_LIVE_ACP_BIND_OPENCODE_MODEL (default opencode/kimi-k2.6).acpx CLI calls are only a manual/workaround path for comparing behavior outside the Gateway. The Docker ACP bind smoke exercises OpenClaw's embedded acpx runtime backend.agent method:
codex plugin/model <ref> --runtime codex/codex status and /codex models through the same gateway command
pathsrc/gateway/gateway-codex-harness.live.test.tsOPENCLAW_LIVE_CODEX_HARNESS=1codex/gpt-5.5openai/gpt-5.6lowOPENCLAW_LIVE_CODEX_HARNESS_MODEL=openai/<model>OPENCLAW_LIVE_CODEX_HARNESS_THINKING=<level>OPENCLAW_LIVE_CODEX_HARNESS_TARGETS=<model>=<thinking>,...OPENCLAW_LIVE_CODEX_HARNESS_AUTH=codex-auth (default) uses the
copied Codex login; api-key uses OPENAI_API_KEY through Codex app-server.OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=1agentRuntime.id: "codex" so a broken Codex
harness cannot pass by silently falling back to OpenClaw.OPENAI_API_KEY when OPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key. Docker can
copy ~/.codex/auth.json and ~/.codex/config.toml for subscription runs.Local recipe:
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.5 \
pnpm test:live -- src/gateway/gateway-codex-harness.live.test.ts
Docker recipe:
pnpm test:docker:live-codex-harness
GPT-5.6 native Codex matrix:
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-harness
Fresh OpenAI API-key default:
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.ts
This proof leaves OPENCLAW_LIVE_GATEWAY_MODELS unset, resolves the model through
the fresh onboarding inference-selection seam, asserts openai/gpt-5.6, and then
runs a real gateway turn with that resolved model.
GPT-5.6 embedded OpenClaw matrix:
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.ts
Docker notes:
scripts/test-live-codex-harness-docker.sh.OPENAI_API_KEY, copies Codex CLI auth files when present, installs
@openai/codex into a writable mounted npm
prefix, stages the source tree, then runs only the Codex-harness live test.OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 or
OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 or
OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 when you need a narrower debug
run.Narrow, explicit allowlists are fastest and least flaky:
Single model, direct (no gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.5" pnpm test:live src/agents/models.profiles.live.test.tsSmall-model direct profile:
OPENCLAW_LIVE_MODELS=small pnpm test:live src/agents/models.profiles.live.test.tsSmall-model gateway profile:
OPENCLAW_LIVE_GATEWAY_MODELS=small pnpm test:live src/gateway/gateway-models.profiles.live.test.tsOllama Cloud API smoke:
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.tsSingle model, gateway smoke:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.5" pnpm test:live src/gateway/gateway-models.profiles.live.test.tsTool calling across several providers:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.5,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,deepseek/deepseek-v4-flash,zai/glm-5.1,minimax/MiniMax-M3" pnpm test:live src/gateway/gateway-models.profiles.live.test.tsZ.AI Coding Plan GLM-5.2 direct smoke:
ZAI_CODING_LIVE_TEST=1 pnpm test:live src/agents/zai.live.test.tsGoogle focus (Gemini API key + Antigravity):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.tsOPENCLAW_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.tsGoogle adaptive thinking smoke (qa manual from the private QA CLI - requires OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 and a source checkout; see QA overview):
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 180000OPENCLAW_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 180000Notes:
google/... uses the Gemini API (API key).google-antigravity/... uses the Antigravity OAuth bridge (Cloud Code Assist-style agent endpoint).google-gemini-cli/... uses the local Gemini CLI on your machine (separate auth + tooling quirks).gemini binary; it has its own auth and can behave differently (streaming/tool support/version skew).Live is opt-in, so there is no fixed "CI model list." OPENCLAW_LIVE_MODELS=modern / OPENCLAW_LIVE_GATEWAY_MODELS=modern (and their all alias) run the curated priority list from HIGH_SIGNAL_LIVE_MODEL_PRIORITY in src/agents/live-model-filter.ts, in this priority order:
| Provider/model | Notes |
|---|---|
anthropic/claude-opus-4-8 | |
anthropic/claude-sonnet-4-6 | |
anthropic/claude-opus-4-7 | |
google/gemini-3.1-pro-preview | Gemini API |
google/gemini-3-flash-preview | Gemini API |
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.3 | |
zai/glm-5.1 | |
fireworks/accounts/fireworks/models/glm-5p1 | |
minimax-portal/minimax-m3 |
The curated small-model list (OPENCLAW_LIVE_MODELS=small / OPENCLAW_LIVE_GATEWAY_MODELS=small), from SMALL_LIVE_MODEL_PRIORITY:
| Provider/model |
|---|
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 |
Notes on the modern list:
codex and codex-cli providers are excluded from the default modern sweep (they cover CLI-backend/ACP behavior, tested separately above). openai/gpt-5.5 itself routes through the Codex app-server harness by default; see Live: Codex app-server harness smoke.fireworks, google, openrouter, and xai only run their explicitly curated model ids in the modern sweep (no automatic "every model from this provider" expansion).OPENCLAW_LIVE_GATEWAY_MODELS to exercise the image probe.Run gateway smoke with tools + image across a hand-picked cross-provider set:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.5,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,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.ts
Optional additional coverage outside the curated lists (nice to have, pick a "tools"-capable model you have enabled):
mistral/...cerebras/... (if you have access)lmstudio/... (local; tool calling depends on API mode)If you have keys enabled, you can also test via:
openrouter/... (hundreds of models; use openclaw models scan to find tool+image capable candidates)opencode/... for Zen and opencode-go/... for Go (auth via OPENCODE_API_KEY / OPENCODE_ZEN_API_KEY)More providers you can include in the live matrix (if you have creds/config):
anthropic, cerebras, github-copilot, google, google-antigravity, google-gemini-cli, google-vertex, groq, mistral, openai, openrouter, opencode, opencode-go, xai, zaimodels.providers (custom endpoints): minimax (cloud/API), plus any OpenAI/Anthropic-compatible proxy (LM Studio, vLLM, LiteLLM, etc.)Live tests discover credentials the same way the CLI does. Practical implications:
If the CLI works, live tests should find the same keys.
If a live test says "no creds", debug the same way you'd debug openclaw models list / model selection.
Per-agent auth profiles: ~/.openclaw/agents/<agentId>/agent/auth-profiles.json (this is what "profile keys" means in the live tests)
Config: ~/.openclaw/openclaw.json (or OPENCLAW_CONFIG_PATH)
Legacy OAuth dir: ~/.openclaw/credentials/ (copied into the staged live home when present, but not the main profile-key store)
Local live runs copy the active config (with agents.*.workspace / agentDir overrides stripped) and each agent's auth-profiles.json - not the rest of that agent's directory, so workspace/ and sandboxes/ data never reaches the staged home - plus the legacy credentials/ dir and supported external CLI auth files/dirs (.claude.json, .claude/.credentials.json, .claude/settings*.json, .claude/backups, .codex/auth.json, .codex/config.toml, .gemini, .minimax) into a temp test home.
If you want to rely on env keys, export them before local tests or use the
Docker runners below with an explicit OPENCLAW_PROFILE_FILE.
extensions/deepgram/audio.live.test.tsDEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live extensions/deepgram/audio.live.test.tsextensions/byteplus/live.test.tsBYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live extensions/byteplus/live.test.tsBYTEPLUS_CODING_MODEL=ark-code-latestextensions/comfy/comfy.live.test.tsOPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.tsmusic_generate pathsplugins.entries.comfy.config.<capability> is configuredtest/image-generation.runtime.live.test.tspnpm test:live test/image-generation.runtime.live.test.tspnpm test:live:media imageauth-profiles.json do not mask real shell credentials<provider>:generate<provider>:edit when the provider declares edit supportdeepinfrafalgoogleminimaxopenaiopenroutervydraxaiOPENCLAW_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"OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 to force profile-store auth and ignore env-only overridesFor the shipped CLI path, add an infer smoke after the provider/runtime live
test passes:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_INFER_CLI_TEST=1 pnpm test:live -- test/image-generation.infer-cli.live.test.ts
openclaw infer image providers --json
openclaw infer image generate \
--model google/gemini-3.1-flash-image-preview \
--prompt "Minimal flat test image: one blue square on a white background, no text." \
--output ./openclaw-infer-image-smoke.png \
--json
This covers CLI argument parsing, config/default-agent resolution, bundled plugin activation, the shared image-generation runtime, and the live provider request. Plugin dependencies are expected to be present before runtime load.
extensions/music-generation-providers.live.test.tsOPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.tspnpm test:live:media musicfal, google, minimax, and openrouterauth-profiles.json do not mask real shell credentialsgenerate with prompt-only inputedit when the provider declares capabilities.edit.enabledcomfy has its own separate live file, not this shared sweepOPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.6"OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 to force profile-store auth and ignore env-only overridesextensions/video-generation-providers.live.test.tsOPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.tspnpm test:live:media videoalibaba, byteplus, deepinfra, fal, google, minimax, openai, openrouter, pixverse, qwen, runway, together, vydra, xaiOPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS (180000 by default)OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="fal" (or clear the skip list) to run it explicitlyauth-profiles.json do not mask real shell credentialsgenerate by defaultOPENCLAW_LIVE_VIDEO_GENERATION_FULL_MODES=1 to also run declared transform modes when available:
imageToVideo when the provider declares capabilities.imageToVideo.enabled and the selected provider/model accepts buffer-backed local image input in the shared sweepvideoToVideo when the provider declares capabilities.videoToVideo.enabled and the selected provider/model accepts buffer-backed local video input in the shared sweepimageToVideo provider in the shared sweep:
vydra (buffer-backed local image input is not supported in this lane)OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.tsveo3 text-to-video plus a kling image-to-video lane that uses a remote image URL fixture by default (OPENCLAW_LIVE_VYDRA_KLING_IMAGE_URL to override).videoToVideo live coverage:
runway only when the selected model resolves to gen4_alephvideoToVideo providers in the shared sweep:
alibaba, google, openai, qwen, xai because those paths currently require remote http(s) reference URLs rather than buffer-backed local inputOPENCLAW_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="" to include every provider in the default sweep, including FALOPENCLAW_LIVE_VIDEO_GENERATION_TIMEOUT_MS=60000 to reduce each provider operation cap for an aggressive smoke runOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 to force profile-store auth and ignore env-only overridespnpm test:live:mediatest/e2e/qa-lab/media/hosted-media-provider-live.ts, which runs pnpm test:live -- <suite-test-file> per selected suite, so heartbeat and quiet-mode behavior stay consistent with other pnpm test:live runs.~/.profile--providers <csv> global provider filter; --image-providers / --music-providers / --video-providers scope a filter to one suite--all-providers skips the auth-based auto-filter--allow-empty exits 0 when filtering leaves no runnable providers--quiet / --no-quiet passed through to test:livepnpm 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