Mainstream messaging
Metadados de apresentação do Matrix
OpenClaw anexa metadados MessagePresentation normalizados aos eventos m.room.message de saída do Matrix na chave de conteúdo com.openclaw.presentation.
Os clientes Matrix padrão continuam renderizando o texto simples de body. Clientes compatíveis com OpenClaw podem ler os metadados estruturados e renderizar uma interface nativa, como botões, seletores, linhas de contexto e divisores.
Conteúdo do evento
{ "msgtype": "m.text", "body": "Select model\n\nChoose model:\n- DeepSeek", "com.openclaw.presentation": { "version": 1, "type": "message.presentation", "title": "Select model", "tone": "info", "blocks": [ { "type": "select", "placeholder": "Choose model", "options": [ { "label": "DeepSeek", "value": "/model deepseek/deepseek-chat" } ] } ] }}versioné a versão do esquema de metadados; a versão atual é1.typeé um discriminador estável, sempre"message.presentation". O adaptador do Matrix emite apenas cargas com exatamente essa versão e esse tipo; da mesma forma, os clientes devem ignorar versões desconhecidas que não possam interpretar com segurança, valores detypedesconhecidos e tipos de bloco desconhecidos.titleetone(info,success,warning,danger,neutral) são indicações opcionais.- Botões e opções de seleção podem conter uma
actiontipada ({ "type": "command", "command": "/..." }ou{ "type": "callback", "value": "..." }) junto à string legadavalue. Prefiraactionquando ambas estiverem presentes.
Comportamento de fallback
O OpenClaw sempre renderiza em body um fallback de texto simples legível. Os metadados estruturados são adicionais e não devem ser obrigatórios para a interoperabilidade básica com o Matrix.
Regras de renderização do fallback:
- O conteúdo de
title,textecontexté renderizado como linhas de texto simples. - Botões com uma ação
commandsão renderizados comorótulo: `/comando`, para que o comando possa ser copiado. Botões com uma açãocallbackou apenas umvaluelegado são renderizados somente com o rótulo, para que valores opacos de callback permaneçam privados; botões desabilitados são sempre renderizados somente com o rótulo. Botões de URL e de aplicativo web são renderizados comorótulo: URL. - Blocos de seleção renderizam o texto indicativo (ou
Opções:) como título, seguido de linhas de opções contendo somente os rótulos. - Se nada for renderizado, por exemplo, em uma apresentação que contenha apenas um divisor, o corpo usa
---como fallback.
Clientes sem suporte continuam exibindo o texto de fallback. Clientes compatíveis com OpenClaw podem preferir os metadados estruturados para exibição, preservando o fallback para cópia, pesquisa, notificações e acessibilidade.
Blocos compatíveis
O adaptador de saída do Matrix anuncia suporte nativo a:
buttonsselectcontextdivider
Blocos text sempre são compatíveis por meio do corpo de fallback. Trate todos os blocos como indicações de apresentação de melhor esforço; ignore campos e tipos de bloco desconhecidos em vez de rejeitar a mensagem inteira.
Interações
Esses metadados não adicionam semântica de callback ao Matrix. Os valores de botões e seletores são cargas de interação de fallback, geralmente comandos de barra ou comandos de texto. Um cliente Matrix que queira oferecer suporte à interação resolve o valor do controle (action.command, depois action.value e, por fim, value) e o envia de volta à sala como uma mensagem normal.
Por exemplo, um botão com o valor /model deepseek/deepseek-chat pode ser processado enviando esse valor como uma mensagem de texto criptografada do Matrix na mesma sala.
Relação com os metadados de aprovação
com.openclaw.presentation destina-se à apresentação geral de mensagens avançadas.
Solicitações de aprovação usam os metadados dedicados com.openclaw.approval, pois as aprovações contêm estado sensível à segurança, decisões e detalhes de execução/Plugin. Se ambas as chaves de metadados estiverem presentes no mesmo evento, os clientes devem preferir o renderizador dedicado de aprovação.
Mensagens de mídia
Quando uma resposta contém vários URLs de mídia, o OpenClaw envia um evento do Matrix para cada URL de mídia. O texto da legenda e os metadados de apresentação são anexados apenas ao primeiro evento, para que os clientes recebam uma única carga estruturada estável, sem renderizadores duplicados. A mesma regra se aplica quando um texto longo é dividido entre eventos: os metadados acompanham somente o primeiro evento.
Mantenha os metadados de apresentação compactos. Textos extensos visíveis ao usuário devem permanecer em body e usar o fluxo normal de divisão de texto do Matrix.