tools.media config, fallback order, and reply-pipeline integration.
How it works
Select per capability
For each enabled capability (image/audio/video), select attachments per the
attachments policy (default: first attachment only).Fall back on failure
If a model errors, times out, or the media exceeds
maxBytes, try the next entry.Config
tools.media holds a shared model list plus per-capability overrides:
image/audio/video) keys:
| Key | Type | Default | Notes |
|---|---|---|---|
enabled | boolean | auto (false disables) | Set false to turn off auto-detect for this capability |
models | array | none | Preferred before the shared tools.media.models list |
prompt | string | "Describe the {media}." (+ maxChars guidance) | Image/video only by default |
maxChars | number | 500 (image/video), unset (audio) | Output is trimmed if the model returns more |
maxBytes | number | image 10485760, audio 20971520, video 52428800 | Oversized media skips to the next model |
timeoutSeconds | number | 60 (image/audio), 120 (video) | |
language | string | unset | Audio transcription hint |
baseUrl/headers/providerOptions/request | - | - | Provider request overrides; see Tools and custom providers |
attachments | object | { mode: "first", maxAttachments: 1 } | See Attachment policy |
scope | object | unset | Gate by channel/chatType/keyPrefix |
echoTranscript | boolean | false | Audio only: echo the transcript back to the chat before agent processing |
echoFormat | string | '📝 "{transcript}"' | Audio only: {transcript} placeholder |
providerOptions.deepgram (the top-level deepgram: { detectLanguage, punctuate, smartFormat } field is deprecated but still read).
Model entries
Eachmodels[] entry is a provider entry (default) or a CLI entry:
- Provider entry
- CLI entry
Provider credentials
Provider media understanding uses the same auth resolution as normal model calls: auth profiles, environment variables, thenmodels.providers.<providerId>.apiKey. tools.media.*.models[] entries do not accept an inline apiKey field.
Rules and behavior
- Media exceeding
maxBytesskips that model and tries the next one. - Audio files under 1024 bytes are treated as empty/corrupt and skipped before transcription; the agent gets a deterministic placeholder transcript instead.
- If the active primary image model already supports vision natively, OpenClaw skips the
[Image]summary block and passes the original image into the model directly. MiniMax is an exception:minimax,minimax-cn,minimax-portal, andminimax-portal-cnalways route image understanding through the plugin-ownedMiniMax-VL-01media provider, even if legacy MiniMax M2.x chat metadata claims image input (onlyMiniMax-M3and later are treated as natively vision-capable). - If a Gateway/WebChat primary model is text-only, image attachments are preserved as offloaded
media://inbound/*refs so image/PDF tools or a configured image model can still inspect them instead of losing the attachment. - Explicit
openclaw infer image describe --file <path> --model <provider/model>(alias:openclaw capability image describe) runs that image-capable provider/model directly, including Ollama refs such asollama/qwen2.5vl:7bwhen a matching image-capable model is configured undermodels.providers.ollama.models[]. - If
<capability>.enabledis notfalsebut no models are configured, OpenClaw tries the active reply model when its provider supports the capability.
Auto-detect (default)
Whentools.media.<capability>.enabled is not false and no models are configured, OpenClaw tries these in order and stops at the first working option:
Configured image model (image only)
agents.defaults.imageModel primary/fallback refs, unless the active reply model already supports vision natively. Prefer provider/model refs; bare refs are qualified from configured image-capable provider model entries only when the match is unique.Provider auth (audio only, before local CLIs)
Configured
models.providers.* entries that support audio are tried before local CLIs. Bundled provider priority order (ties break alphabetically by provider id): Groq/OpenAI → xAI → Deepgram → OpenRouter → Google/SenseAudio → Deepinfra/ElevenLabs → Mistral.Local CLIs (audio only)
First installed local binary, in this order:
sherpa-onnx-offline(requiresSHERPA_ONNX_MODEL_DIRwithtokens.txt/encoder.onnx/decoder.onnx/joiner.onnx)whisper-cli(whisper-cpp; usesWHISPER_CPP_MODELor a bundled tiny model)whisper(Python CLI; defaults to theturbomodel, downloads automatically)
Provider auth (image/video)
Configured
models.providers.* entries that support the capability are tried before the bundled fallback order. Image-only config providers with an image-capable model auto-register for media understanding even when they are not a bundled vendor plugin.Bundled provider priority order (ties break alphabetically by provider id):- Image: Anthropic/OpenAI → Google → MiniMax → Deepinfra → MiniMax Portal → Z.AI
- Video: Google → Qwen → Moonshot
Binary detection is best-effort across macOS/Linux/Windows; ensure the CLI is on
PATH (~ is expanded), or set an explicit CLI model entry with a full command path.Proxy support (audio/video provider calls)
Provider-based audio and video understanding honors standard outbound proxy environment variables, includingNO_PROXY/no_proxy bypass rules: HTTPS_PROXY, HTTP_PROXY, ALL_PROXY, https_proxy, http_proxy, all_proxy. Lowercase vars take precedence over uppercase. If none are set, media understanding uses direct egress; if the proxy value is malformed, OpenClaw logs a warning and falls back to direct fetch. Image understanding does not go through this proxy path.
Capabilities
Setcapabilities on a models[] entry to restrict it to specific media types. For shared lists, OpenClaw infers defaults per bundled provider:
| Provider | Capabilities |
|---|---|
openai, anthropic, minimax | image |
minimax-portal | image |
moonshot | image + video |
openrouter | image + audio |
google (Gemini API) | image + audio + video |
qwen | image + video |
deepinfra | image + audio |
mistral | audio |
zai | image |
groq, xai, deepgram, senseaudio | audio |
Any models.providers.<id>.models[] catalog with an image-capable model | image |
capabilities explicitly to avoid surprising matches; if omitted, the entry is eligible for every capability list it appears in.
Provider support matrix
| Capability | Providers | Notes |
|---|---|---|
| Image | Anthropic, Codex app-server, Deepinfra, Google, MiniMax, MiniMax Portal, Moonshot, OpenAI, OpenAI Codex OAuth, OpenRouter, Qwen, Z.AI, config providers | Vendor plugins register image support; openai/* can use API-key or Codex OAuth routing; codex/* uses a bounded Codex app-server turn; image-capable config providers auto-register. |
| Audio | Deepgram, Deepinfra, ElevenLabs, Google, Groq, Mistral, OpenAI, OpenRouter, SenseAudio, xAI | Provider transcription (Whisper/Groq/xAI/Deepgram/OpenRouter STT/Gemini/SenseAudio/Scribe/Voxtral). |
| Video | Google, Moonshot, Qwen | Provider video understanding via vendor plugins; Qwen video understanding uses the standard DashScope endpoints. |
MiniMax note:
minimax, minimax-cn, minimax-portal, and minimax-portal-cn image understanding always comes from the plugin-owned MiniMax-VL-01 media provider, even if legacy MiniMax M2.x chat metadata claims image input.Model selection guidance
- Prefer the strongest current-generation model for each media capability when quality and safety matter.
- For tool-enabled agents handling untrusted inputs, avoid older/weaker media models.
- Keep at least one fallback per capability for availability (quality model + faster/cheaper model).
- CLI fallbacks (
whisper-cli,whisper,gemini) help when provider APIs are unavailable. parakeet-mlx: with--output-dir, OpenClaw reads<output-dir>/<media-basename>.txtwhen the output format istxtor unspecified; other formats fall back to stdout.
Attachment policy
Per-capabilityattachments controls which attachments are processed:
Process only the first selected attachment, or all of them.
Cap the number processed.
Selection preference among candidate attachments.
mode: "all", outputs are labeled [Image 1/2], [Audio 2/2], etc.
File-attachment extraction
- Extracted file text is wrapped as untrusted external content before it’s appended to the media prompt, using boundary markers like
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>plus aSource: Externalmetadata line. - This path intentionally omits the long
SECURITY NOTICE:banner to keep the media prompt short; the boundary markers and metadata still apply. - A file with no extractable text gets
[No extractable text]. - If a PDF falls back to rendered page images, OpenClaw forwards those images to vision-capable reply models and keeps the placeholder
[PDF content rendered to images]in the file block.
Config examples
Status output
When media understanding runs,/status includes a per-capability summary line:
Notes
- Understanding is best-effort. Errors do not block replies.
- Attachments are still passed to models even when understanding is disabled.
- Use
scopeto limit where understanding runs (for example, only DMs).