Saltar al contenido principal
Desarrolladores Tarjetas de mensaje

Diseña tarjetas de mensaje

Todo lo que publica un bot, ya venga de un webhook, de la respuesta a un comando o de la actualización tras pulsar un botón, es una tarjeta. Una buena tarjeta cuenta de un vistazo lo que ha pasado: un borde de color, un título, un estado y los detalles debajo.

Qué puedes hacer

  • Muestra un estadoUna píldora de color como Open, Merged o Passing, con las líneas añadidas y eliminadas.
  • Enumera los detallesFilas de etiqueta y valor que los miembros copian con un toque.
  • Escribe en markdownNegrita, código en línea, bloques de código, citas y casillas.
  • Muestra que estás trabajandoUn spinner mientras tu bot piensa, y después su razonamiento tras un interruptor.

En la app

Cuatro tarjetas tal como las ven los miembros. Cada una son unas pocas líneas de JSON.

Anatomía de una tarjeta

Las partes de una tarjeta, de arriba abajo. Omite lo que no necesites: una tarjeta con solo un título también vale.

  1. Cabecera"Message from" y un nombre: el del webhook, o el de tu comunidad en la respuesta a un comando. Una respuesta puede añadir un badge, como el repositorio.
  2. Título y estadoEl title, que es un enlace si defines title_url, con la píldora de status al lado.
  3. SubtítuloUna segunda línea en negrita, sub_title.
  4. DescripciónEl cuerpo, en markdown.
  5. CamposFilas de etiqueta y valor, con un botón para copiar.
  6. PieLa hora, y las líneas añadidas y eliminadas si las envías.
json
{
  "message_container": {
    "type": "embed_message",
    "badge": "acme/web",
    "color": "purple",
    "title": "Pull request #212 opened",
    "title_url": "https://github.com/acme/web/pull/212",
    "status": { "label": "Open", "color": "green", "icon": "pull_request" },
    "sub_title": "Faster search in the channel list",
    "description": "Search now runs **per keystroke** with a 120 ms debounce.",
    "fields": [
      { "field": "Author", "value": "maya" },
      { "field": "Reviewers", "value": "dani, sam" }
    ],
    "additions": 86,
    "deletions": 12,
    "files_changed": 3
  }
}

Todos los campos

Van dentro de message_container. Una tarjeta necesita una descripción o un loader. Los campos marcados como "Respuestas a comandos" se descartan cuando publicas a través de un webhook.

CampoTipoQué hace
typestringembed_message (por defecto) o system_message.
badgestringUna pequeña etiqueta tras el nombre en la cabecera, como acme/web. Respuestas a comandos
avatar_urlstringUna imagen sobre el icono de la tarjeta.
colorstringEl color del borde. Consulta los colores más abajo.
titlestringLa primera línea, en negrita.
title_urlstringConvierte el título en un enlace.
sub_titlestringUna segunda línea en negrita bajo el título.
descriptionstringEl cuerpo, en markdown.
fieldsarray[{ "field": "…", "value": "…" }]: filas de etiqueta y valor.
image_url, image_base64stringUna imagen en la tarjeta.
imagesarray[{ "image_url": "…" }]: una galería de varias imágenes.
statusobject o stringUna píldora de color junto al título. Ver más abajo. Respuestas a comandos
additions, deletions, files_changednumberEstadísticas de diff en el pie. Respuestas a comandos
loader, loader_text, loader_sub_textboolean, stringUn spinner en lugar del cuerpo.
thinkingstringRazonamiento tras un interruptor Show thinking. Respuestas a comandos
La descripción y thinking entienden markdown: **bold**, _italic_, ~~strike~~, `inline code`, bloques de código delimitados, > quotes, casillas - [x], @menciones y :emoji:.

Estado y estadísticas de diff

Una píldora de estado cuenta la historia antes de que nadie lea el texto. Va junto al título, o en el pie cuando no hay título; las estadísticas de diff aparecen junto a la hora. Ambas funcionan en respuestas a comandos, y la integración de GitHub incluida las usa. Un webhook las descarta.

json
{
  "message_container": {
    "color": "red",
    "title": "Build failed on main",
    "status": { "label": "Failing", "color": "red" },
    "description": "`search.test.js`: 2 of 212 tests failed."
  }
}
CampoTipoQué hace
statusobject o stringUn string sin más es la etiqueta: "status": "Open".
status.labelstringEl texto de la píldora. Sin él no hay píldora.
status.colorstringgreen, purple, red, orange, yellow, blue o gray.
status.iconstringUn icono opcional de la lista de abajo.
additionsnumberLíneas añadidas, en verde como +86.
deletionsnumberLíneas eliminadas, en rojo como -12.
files_changednumberArchivos modificados, mostrados como 3 files.

Iconos

ValorIconoUso habitual
pull_requestgit-pull-requestSe ha abierto una pull request
pull_request_closedgit-pull-request-closedCerrada sin fusionar
merge, mergedgit-mergeFusionada
commitgit-commitUn commit con push
issuecircle-dotSe ha abierto una issue
issue_closedcircle-checkSe ha cerrado una issue
checkcircle-checkTests superados, un job completado con éxito

Una correspondencia que funciona para GitHub

La integración de GitHub incluida usa estos valores; cópialos para tus propias herramientas.

EventoEtiquetaColorIcono
Pull request abiertaOpengreenpull_request
BorradorDraftgraypull_request
FusionadaMergedpurplemerged
Cerrada sin fusionarClosedredpull_request_closed
Issue abiertaOpengreenissue
Issue cerradaClosedpurpleissue_closed
Commit con pushCommitgraycommit
Tests superadosPassinggreencheck
Tests fallidosFailingredninguno

Loader y razonamiento

Para todo lo que tarda un poco, como una respuesta de IA o un trabajo largo, publica primero una tarjeta con un spinner y luego sustitúyela por el resultado. El loader funciona desde webhooks y en respuestas a comandos. En la respuesta a un comando también puedes poner el razonamiento del modelo en thinking: los miembros ven un interruptor Show thinking en lugar de un muro de texto.

assistant
System
Message from Assistant
Pensando…Leyendo los últimos 50 mensajes

Primero: el loader

assistant
System
Message from Assistant

maya: ¿a qué hora es el standup?

El standup es a las 09:30, en #daily.
He revisado los mensajes fijados y el evento periódico de #daily.

Después: la respuesta, con el razonamiento plegado

json
{
  "message_container": {
    "type": "embed_message",
    "color": "blue",
    "loader": true,
    "loader_text": "Thinking…",
    "loader_sub_text": "Reading the last 50 messages"
  }
}
json
{
  "message_container": {
    "type": "embed_message",
    "color": "blue",
    "sub_title": "maya: when is the standup?",
    "description": "Standup is at **09:30**, in #daily.",
    "thinking": "Checked the pinned messages and the recurring event in #daily…"
  }
}
CampoTipoQué hace
loaderbooleantrue muestra el spinner en lugar del cuerpo.
loader_textstringLa línea junto al spinner, como "Pensando…".
loader_sub_textstringUna línea más pequeña debajo.
thinkingstringRazonamiento plegado bajo la descripción, en markdown.

Para cambiar el loader por la respuesta, actualiza el mensaje con una tarjeta nueva sin loader. Cómo hacerlo está en actualizaciones en directo.

Descripciones largas

Una descripción puede tener hasta 50.000 bytes. A partir de los primeros 1.000, los miembros ven el principio y un botón Show more que carga el resto, así que un informe largo no inunda el canal.

Mensajes del sistema

Pon "type": "system_message" para un aviso en lugar de una publicación de bot: ventanas de mantenimiento, cambios de normas, cualquier cosa que hable en nombre de la propia comunidad. Admite los mismos campos y botones.

json
{
  "message_container": {
    "type": "system_message",
    "color": "orange",
    "title": "Maintenance tonight",
    "description": "The build servers are down from 22:00 to 23:00."
  }
}

Colores

El color del borde es la señal más rápida de una tarjeta. Usa siempre el mismo color para el mismo tipo de noticia.

ColorÚsalo para
greenÉxito: superado, desplegado, hecho
redFallo: ha fallado, caído, rechazado
orangeUn aviso que conviene revisar
yellowPendiente de alguien: aprobaciones, preguntas
blueInformación, el valor por defecto
purpleEventos de código, o algo especial

Crea tu embed

Edita los campos o el payload JSON: los dos se mantienen sincronizados. La vista previa muestra el mensaje exactamente como aparecerá en un canal. Este es el body real del webhook; cópialo cuando todo esté bien.

Plantillas
Botones
Vista previa
Body del webhook

Sigue construyendo