Nodes and media
Compreensão de mídia
OpenClaw pode resumir mídias recebidas (imagem/áudio/vídeo) antes que o pipeline de resposta seja executado. Ele detecta automaticamente quando ferramentas locais ou chaves de provedor estão disponíveis, e pode ser desativado ou personalizado. Se o entendimento estiver desligado, os modelos ainda recebem os arquivos/URLs originais como de costume.
O comportamento de mídia específico de fornecedores é registrado por plugins de fornecedor, enquanto o núcleo do OpenClaw é responsável pela configuração compartilhada tools.media, pela ordem de fallback e pela integração com o pipeline de resposta.
Objetivos
- Opcional: pré-digerir mídias recebidas em texto curto para roteamento mais rápido + melhor análise de comandos.
- Preservar a entrega da mídia original ao modelo (sempre).
- Oferecer suporte a APIs de provedor e fallbacks de CLI.
- Permitir vários modelos com fallback ordenado (erro/tamanho/tempo limite).
Comportamento de alto nível
Coletar anexos
Coletar anexos recebidos (MediaPaths, MediaUrls, MediaTypes).
Selecionar por capacidade
Para cada capacidade habilitada (imagem/áudio/vídeo), selecionar anexos por política (padrão: primeiro).
Escolher modelo
Escolher a primeira entrada de modelo elegível (tamanho + capacidade + autenticação).
Fallback em caso de falha
Se um modelo falhar ou a mídia for grande demais, fazer fallback para a próxima entrada.
Aplicar bloco de sucesso
Em caso de sucesso:
Bodyse torna um bloco[Image],[Audio]ou[Video].- Áudio define
{{Transcript}}; a análise de comandos usa o texto da legenda quando presente; caso contrário, usa a transcrição. - Legendas são preservadas como
User text:dentro do bloco.
Se o entendimento falhar ou estiver desativado, o fluxo de resposta continua com o corpo original + anexos.
Visão geral da configuração
tools.media oferece suporte a modelos compartilhados mais substituições por capacidade:
Chaves de nível superior
tools.media.models: lista de modelos compartilhados (usecapabilitiespara controlar).tools.media.image/tools.media.audio/tools.media.video:- padrões (
prompt,maxChars,maxBytes,timeoutSeconds,language) - substituições de provedor (
baseUrl,headers,providerOptions) - opções de áudio do Deepgram via
tools.media.audio.providerOptions.deepgram - controles de eco da transcrição de áudio (
echoTranscript, padrãofalse;echoFormat) - lista de
modelspor capacidade opcional (preferida antes dos modelos compartilhados) - política de
attachments(mode,maxAttachments,prefer) scope(controle opcional por canal/chatType/chave de sessão)
- padrões (
tools.media.concurrency: máximo de execuções simultâneas de capacidades (padrão 2).
{
tools: {
media: {
models: [
/* shared list */
],
image: {
/* optional overrides */
},
audio: {
/* optional overrides */
echoTranscript: true,
echoFormat: '📝 "{transcript}"',
},
video: {
/* optional overrides */
},
},
},
}
Entradas de modelo
Cada entrada models[] pode ser provedor ou CLI:
Entrada de provedor
{
type: "provider", // default if omitted
provider: "openai",
model: "gpt-5.5",
prompt: "Describe the image in <= 500 chars.",
maxChars: 500,
maxBytes: 10485760,
timeoutSeconds: 60,
capabilities: ["image"], // optional, used for multi-modal entries
profile: "vision-profile",
preferredProfile: "vision-fallback",
}
Entrada de CLI
{
type: "cli",
command: "gemini",
args: [
"-m",
"gemini-3-flash",
"--allowed-tools",
"read_file",
"Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.",
],
maxChars: 500,
maxBytes: 52428800,
timeoutSeconds: 120,
capabilities: ["video", "image"],
}
Modelos de CLI também podem usar:
{{MediaDir}}(diretório que contém o arquivo de mídia){{OutputDir}}(diretório temporário criado para esta execução){{OutputBase}}(caminho base do arquivo temporário, sem extensão)
Padrões e limites
Padrões recomendados:
maxChars: 500 para imagem/vídeo (curto, adequado para comandos)maxChars: não definido para áudio (transcrição completa, a menos que você defina um limite)maxBytes:- imagem: 10 MB
- áudio: 20 MB
- vídeo: 50 MB
Regras
- Se a mídia exceder
maxBytes, esse modelo será ignorado e o próximo modelo será tentado. - Arquivos de áudio menores que 1024 bytes são tratados como vazios/corrompidos e ignorados antes da transcrição por provedor/CLI; o contexto de resposta recebida recebe uma transcrição placeholder determinística para que o agente saiba que a nota era pequena demais.
- Se o modelo retornar mais que
maxChars, a saída será aparada. promptusa por padrão um "Describe the {media}." simples mais a orientação demaxChars(somente imagem/vídeo).- Se o modelo de imagem primário ativo já oferecer suporte nativo a visão, o OpenClaw ignora o bloco de resumo
[Image]e passa a imagem original para o modelo em vez disso. - Se um modelo primário do Gateway/WebChat for somente texto, anexos de imagem são preservados como refs descarregadas
media://inbound/*, para que as ferramentas de imagem/PDF ou o modelo de imagem configurado ainda possam inspecioná-los em vez de perder o anexo. - Solicitações explícitas
openclaw infer image describe --model <provider/model>são diferentes: elas executam diretamente esse provedor/modelo com capacidade de imagem, incluindo refs do Ollama comoollama/qwen2.5vl:7b. - Se
<capability>.enabled: true, mas nenhum modelo estiver configurado, o OpenClaw tenta o modelo de resposta ativo quando o provedor dele oferece suporte à capacidade.
Detectar entendimento de mídia automaticamente (padrão)
Se tools.media.<capability>.enabled não estiver definido como false e você não tiver configurado modelos, o OpenClaw detecta automaticamente nesta ordem e para na primeira opção funcional:
Modelo de resposta ativo
Modelo de resposta ativo quando o provedor dele oferece suporte à capacidade.
agents.defaults.imageModel
Refs primária/fallback de agents.defaults.imageModel (somente imagem).
Prefira refs provider/model. Refs sem qualificação são qualificadas a partir de entradas de modelo de provedor com capacidade de imagem configuradas somente quando a correspondência é única.
CLIs locais (somente áudio)
CLIs locais (se instaladas):
sherpa-onnx-offline(requerSHERPA_ONNX_MODEL_DIRcom encoder/decoder/joiner/tokens)whisper-cli(whisper-cpp; usaWHISPER_CPP_MODELou o modelo tiny incluído)whisper(CLI Python; baixa modelos automaticamente)
CLI Gemini
gemini usando read_many_files.
Autenticação de provedor
- Entradas
models.providers.*configuradas que oferecem suporte à capacidade são tentadas antes da ordem de fallback incluída. - Provedores de configuração somente de imagem com um modelo com capacidade de imagem são registrados automaticamente para entendimento de mídia, mesmo quando não são um plugin de fornecedor incluído.
- O entendimento de imagem do Ollama fica disponível quando selecionado explicitamente, por exemplo por meio de
agents.defaults.imageModelouopenclaw infer image describe --model ollama/<vision-model>.
Ordem de fallback incluída:
- Áudio: OpenAI → Groq → xAI → Deepgram → Google → SenseAudio → ElevenLabs → Mistral
- Imagem: OpenAI → Anthropic → Google → MiniMax → MiniMax Portal → Z.AI
- Vídeo: Google → Qwen → Moonshot
Para desativar a detecção automática, defina:
{
tools: {
media: {
audio: {
enabled: false,
},
},
},
}
Suporte a ambiente de proxy (modelos de provedor)
Quando o entendimento de mídia baseado em provedor para áudio e vídeo está habilitado, o OpenClaw respeita variáveis de ambiente de proxy de saída padrão para chamadas HTTP de provedor:
HTTPS_PROXYHTTP_PROXYALL_PROXYhttps_proxyhttp_proxyall_proxy
Se nenhuma variável de ambiente de proxy estiver definida, o entendimento de mídia usa saída direta. Se o valor do proxy estiver malformado, o OpenClaw registra um aviso e faz fallback para busca direta.
Capacidades (opcional)
Se você definir capabilities, a entrada será executada somente para esses tipos de mídia. Para listas compartilhadas, o OpenClaw pode inferir padrões:
openai,anthropic,minimax: imagemminimax-portal: imagemmoonshot: imagem + vídeoopenrouter: imagemgoogle(API Gemini): imagem + áudio + vídeoqwen: imagem + vídeomistral: áudiozai: imagemgroq: áudioxai: áudiodeepgram: áudio- Qualquer catálogo
models.providers.<id>.models[]com um modelo com capacidade de imagem: imagem
Para entradas de CLI, defina capabilities explicitamente para evitar correspondências inesperadas. Se você omitir capabilities, a entrada será elegível para a lista em que ela aparece.
Matriz de suporte de provedores (integrações do OpenClaw)
| Capacidade | Integração de provedor | Observações |
|---|---|---|
| Imagem | OpenAI, OpenAI Codex OAuth, Codex app-server, OpenRouter, Anthropic, Google, MiniMax, Moonshot, Qwen, Z.AI, provedores de configuração | Plugins de fornecedor registram suporte a imagem; openai-codex/* usa encanamento de provedor OAuth; codex/* usa um turno limitado do Codex app-server; MiniMax e MiniMax OAuth usam MiniMax-VL-01; provedores de configuração com capacidade de imagem são registrados automaticamente. |
| Áudio | OpenAI, Groq, xAI, Deepgram, Google, SenseAudio, ElevenLabs, Mistral | Transcrição de provedor (Whisper/Groq/xAI/Deepgram/Gemini/SenseAudio/Scribe/Voxtral). |
| Vídeo | Google, Qwen, Moonshot | Entendimento de vídeo por provedor via plugins de fornecedor; o entendimento de vídeo do Qwen usa os endpoints Standard DashScope. |
Orientação para seleção de modelo
- Prefira o modelo de geração mais recente e mais forte disponível para cada capacidade de mídia quando qualidade e segurança forem importantes.
- Para agentes com ferramentas habilitadas que lidam com entradas não confiáveis, evite modelos de mídia mais antigos/mais fracos.
- Mantenha pelo menos um fallback por capacidade para disponibilidade (modelo de qualidade + modelo mais rápido/mais barato).
- Fallbacks de CLI (
whisper-cli,whisper,gemini) são úteis quando APIs de provedor não estão disponíveis. - Observação sobre
parakeet-mlx: com--output-dir, o OpenClaw lê<output-dir>/<media-basename>.txtquando o formato de saída étxt(ou não especificado); formatos que não sejamtxtfazem fallback para stdout.
Política de anexos
attachments por capacidade controla quais anexos são processados:
mode"first" | "all"Se deve processar o primeiro anexo selecionado ou todos eles.
maxAttachmentsnumberLimita o número processado.
prefer"first" | "last" | "path" | "url"Preferência de seleção entre anexos candidatos.
Quando mode: "all", as saídas são rotuladas como [Image 1/2], [Audio 2/2] etc.
Comportamento de extração de anexos de arquivo
- O texto de arquivo extraído é encapsulado como conteúdo externo não confiável antes de ser anexado ao prompt de mídia.
- O bloco injetado usa marcadores de limite explícitos como
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>e inclui uma linha de metadadosSource: External. - Este caminho de extração de anexos omite intencionalmente o banner longo
SECURITY NOTICE:para evitar inflar o prompt de mídia; os marcadores de limite e os metadados ainda permanecem. - Se um arquivo não tiver texto extraível, o OpenClaw injeta
[No extractable text]. - Se um PDF recorrer a imagens de páginas renderizadas neste caminho, o prompt de mídia mantém o placeholder
[PDF content rendered to images; images not forwarded to model]porque esta etapa de extração de anexos encaminha blocos de texto, não as imagens de PDF renderizadas.
Exemplos de configuração
Modelos compartilhados + substituições
{
tools: {
media: {
models: [
{ provider: "openai", model: "gpt-5.5", capabilities: ["image"] },
{
provider: "google",
model: "gemini-3-flash-preview",
capabilities: ["image", "audio", "video"],
},
{
type: "cli",
command: "gemini",
args: [
"-m",
"gemini-3-flash",
"--allowed-tools",
"read_file",
"Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.",
],
capabilities: ["image", "video"],
},
],
audio: {
attachments: { mode: "all", maxAttachments: 2 },
},
video: {
maxChars: 500,
},
},
},
}
Somente áudio + vídeo
{
tools: {
media: {
audio: {
enabled: true,
models: [
{ provider: "openai", model: "gpt-4o-mini-transcribe" },
{
type: "cli",
command: "whisper",
args: ["--model", "base", "{{MediaPath}}"],
},
],
},
video: {
enabled: true,
maxChars: 500,
models: [
{ provider: "google", model: "gemini-3-flash-preview" },
{
type: "cli",
command: "gemini",
args: [
"-m",
"gemini-3-flash",
"--allowed-tools",
"read_file",
"Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.",
],
},
],
},
},
},
}
Somente imagem
{
tools: {
media: {
image: {
enabled: true,
maxBytes: 10485760,
maxChars: 500,
models: [
{ provider: "openai", model: "gpt-5.5" },
{ provider: "anthropic", model: "claude-opus-4-6" },
{
type: "cli",
command: "gemini",
args: [
"-m",
"gemini-3-flash",
"--allowed-tools",
"read_file",
"Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.",
],
},
],
},
},
},
}
Entrada única multimodal
{
tools: {
media: {
image: {
models: [
{
provider: "google",
model: "gemini-3.1-pro-preview",
capabilities: ["image", "video", "audio"],
},
],
},
audio: {
models: [
{
provider: "google",
model: "gemini-3.1-pro-preview",
capabilities: ["image", "video", "audio"],
},
],
},
video: {
models: [
{
provider: "google",
model: "gemini-3.1-pro-preview",
capabilities: ["image", "video", "audio"],
},
],
},
},
},
}
Saída de status
Quando a compreensão de mídia é executada, /status inclui uma linha curta de resumo:
📎 Media: image ok (openai/gpt-5.4) · audio skipped (maxBytes)
Isso mostra os resultados por capacidade e o provedor/modelo escolhido quando aplicável.
Observações
- A compreensão é baseada em melhor esforço. Erros não bloqueiam respostas.
- Os anexos ainda são passados aos modelos mesmo quando a compreensão está desativada.
- Use
scopepara limitar onde a compreensão é executada (por exemplo, apenas DMs).