- secciones de texto
- texto pequeño de contexto/pie
- divisores
- botones
- menús de selección
- título de la tarjeta y tono
components de Discord, blocks de Slack,
buttons de Telegram, card de Teams o card de Feishu a la herramienta compartida
de mensajes. Esas son salidas del renderizador propiedad del Plugin de canal.
Contrato
Los autores de plugins importan el contrato público desde:valuees un valor de acción de aplicación reenrutado por la ruta de interacción existente del canal cuando el canal admite controles clicables.urles un botón de enlace. Puede existir sinvalue.labeles obligatorio y también se usa en la alternativa de texto.stylees orientativo. Los renderizadores deberían asignar estilos no compatibles a un valor predeterminado seguro, no hacer fallar el envío.
options[].valuees el valor seleccionado de la aplicación.placeholderes orientativo y puede ignorarse en canales sin compatibilidad nativa para select.- Si un canal no admite selects, el texto alternativo lista las etiquetas.
Ejemplos de productor
Tarjeta simple:Contrato del renderizador
Los plugins de canal declaran compatibilidad de renderizado en su adaptador saliente:Flujo de renderizado del núcleo
Cuando unReplyPayload o una acción de mensaje incluye presentation, el núcleo:
- Normaliza la carga útil de presentation.
- Resuelve el adaptador saliente del canal de destino.
- Lee
presentationCapabilities. - Llama a
renderPresentationcuando el adaptador puede renderizar la carga útil. - Recurre a texto conservador cuando el adaptador falta o no puede renderizar.
- Envía la carga útil resultante por la ruta normal de entrega del canal.
- Aplica metadatos de entrega como
delivery.pindespués del primer mensaje enviado con éxito.
Reglas de degradación
La presentation debe ser segura de enviar en canales limitados. El texto alternativo incluye:titlecomo primera línea- bloques
textcomo párrafos normales - bloques
contextcomo líneas de contexto compactas - bloques
dividercomo separador visual - etiquetas de botones, incluidas URLs para botones de enlace
- etiquetas de opciones de select
- Telegram con botones en línea deshabilitados envía texto alternativo.
- Un canal sin compatibilidad con select lista las opciones del select como texto.
- Un botón solo con URL se convierte en un botón nativo de enlace o en una línea alternativa con URL.
- Los fallos opcionales de pin no hacen fallar el mensaje entregado.
delivery.pin.required: true; si se solicita el fijado como
obligatorio y el canal no puede fijar el mensaje enviado, la entrega informa de un fallo.
Asignación de proveedores
Renderizadores incluidos actualmente:| Canal | Destino nativo de renderizado | Notas |
|---|---|---|
| Discord | Components y contenedores de componentes | Conserva channelData.discord.components heredado para productores existentes de carga útil nativa del proveedor, pero los envíos compartidos nuevos deberían usar presentation. |
| Slack | Block Kit | Conserva channelData.slack.blocks heredado para productores existentes de carga útil nativa del proveedor, pero los envíos compartidos nuevos deberían usar presentation. |
| Telegram | Texto más teclados en línea | Los botones/selects requieren capacidad de botones en línea para la superficie de destino; en caso contrario se usa texto alternativo. |
| Mattermost | Texto más props interactivas | Los demás bloques se degradan a texto. |
| Microsoft Teams | Adaptive Cards | El texto plano message se incluye con la tarjeta cuando se proporcionan ambos. |
| Feishu | Tarjetas interactivas | El encabezado de la tarjeta puede usar title; el cuerpo evita duplicar ese título. |
| Canales simples | Texto alternativo | Los canales sin renderizador siguen recibiendo salida legible. |
Presentation frente a InteractiveReply
InteractiveReply es el subconjunto interno más antiguo usado por ayudas de aprobación e interacción. Admite:
- texto
- botones
- selects
MessagePresentation es el contrato compartido canónico de envío. Agrega:
- título
- tono
- contexto
- divisor
- botones solo con URL
- metadatos genéricos de entrega mediante
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime al conectar código antiguo:
MessagePresentation directamente.
Pin de entrega
Fijar es comportamiento de entrega, no presentation. Usadelivery.pin en lugar de
campos nativos del proveedor como channelData.telegram.pin.
Semántica:
pin: truefija el primer mensaje entregado con éxito.pin.notifyusa por defectofalse.pin.requiredusa por defectofalse.- Los fallos opcionales de pin se degradan y dejan intacto el mensaje enviado.
- Los fallos obligatorios de pin hacen fallar la entrega.
- Los mensajes fragmentados fijan el primer fragmento entregado, no el último.
pin, unpin y pins siguen existiendo para mensajes
existentes en los que el proveedor admita esas operaciones.
Lista de comprobación para autores de plugins
- Declara
presentationdesdedescribeMessageTool(...)cuando el canal pueda renderizar o degradar de forma segura la presentation semántica. - Agrega
presentationCapabilitiesal adaptador saliente de tiempo de ejecución. - Implementa
renderPresentationen el código de tiempo de ejecución, no en el código de configuración del Plugin del plano de control. - Mantén las bibliotecas nativas de IU fuera de las rutas rápidas de configuración/catálogo.
- Conserva los límites de la plataforma en el renderizador y en las pruebas.
- Agrega pruebas alternativas para botones no compatibles, selects, botones URL, duplicación de title/text
y envíos mixtos
messagemáspresentation. - Agrega compatibilidad con pin de entrega mediante
deliveryCapabilities.pinypinDeliveredMessagesolo cuando el proveedor pueda fijar el id del mensaje enviado. - No expongas nuevos campos nativos de proveedor de tarjeta/bloque/componente/botón mediante el esquema compartido de acción de mensajes.