Aller au contenu principal
Développeurs Cartes de message

Concevoir des cartes de message

Tout ce qu’un bot publie, depuis un webhook, une réponse à une commande ou la mise à jour d’un bouton, est une carte. Une bonne carte dit ce qui s’est passé en un coup d’œil : une bordure colorée, un titre, un statut, les détails en dessous.

Ce que vous pouvez faire

  • Afficher un statutUne pastille colorée comme Ouverte, Mergée ou Réussi, avec les lignes ajoutées et supprimées.
  • Lister les détailsDes lignes libellé et valeur que les membres copient en un appui.
  • Écrire en markdownGras, code en ligne, blocs de code, citations et cases à cocher.
  • Montrer que tu travaillesUn indicateur qui tourne pendant que ton bot réfléchit, puis son raisonnement derrière un bouton à déplier.

Dans l'app

Quatre cartes telles que les membres les voient. Chacune tient en quelques lignes de JSON.

Anatomie d’une carte

Les parties d’une carte, de haut en bas. Omets ce dont tu n’as pas besoin : une carte avec seulement un titre, ça marche.

  1. En-tête« Message de » et un nom : le nom du webhook, ou celui de ta communauté pour une réponse de commande. Une réponse peut ajouter un badge, comme le dépôt.
  2. Titre et statutLe title, qui devient un lien si tu définis title_url, avec la pastille status à côté.
  3. Sous-titreUne deuxième ligne en gras, sub_title.
  4. DescriptionLe corps, en markdown.
  5. ChampsDes lignes libellé et valeur, avec un bouton de copie.
  6. Pied de carteL’heure, et les lignes ajoutées et supprimées si tu les envoies.
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
  }
}

Tous les champs

Ils vont dans message_container. Une carte a besoin d’une description, ou d’un indicateur de chargement. Les champs marqués « Réponses de commande » sont ignorés quand tu publies via un webhook.

ChampTypeCe qu’il fait
typestringembed_message (par défaut) ou system_message.
badgestringUne petite pastille après le nom dans l’en-tête, comme acme/web. Réponses de commande
avatar_urlstringUne image par-dessus l’icône de la carte.
colorstringLa couleur de la bordure. Voir les couleurs plus bas.
titlestringLa première ligne, en gras.
title_urlstringTransforme le titre en lien.
sub_titlestringUne deuxième ligne en gras sous le titre.
descriptionstringLe corps, en markdown.
fieldsarray[{ "field": "…", "value": "…" }] : des lignes libellé et valeur.
image_url, image_base64stringUne image sur la carte.
imagesarray[{ "image_url": "…" }] : une galerie de plusieurs images.
statusobject ou stringUne pastille colorée à côté du titre. Voir plus bas. Réponses de commande
additions, deletions, files_changednumberLes stats de diff dans le pied de carte. Réponses de commande
loader, loader_text, loader_sub_textboolean, stringUn indicateur de chargement à la place du corps.
thinkingstringLe raisonnement derrière un bouton Afficher le raisonnement. Réponses de commande
La description et thinking comprennent le markdown : **gras**, _italique_, ~~barré~~, `code en ligne`, les blocs de code délimités, > citations, les cases à cocher - [x], les @mentions et :emoji:.

Statut et stats de diff

Une pastille de statut raconte l’histoire avant qu’on lise le texte. Elle se place à côté du titre, ou dans le pied de carte s’il n’y a pas de titre ; les stats de diff s’affichent à côté de l’heure. Les deux fonctionnent dans les réponses de commande, et l’intégration GitHub native s’en sert. Un webhook les ignore.

json
{
  "message_container": {
    "color": "red",
    "title": "Build failed on main",
    "status": { "label": "Failing", "color": "red" },
    "description": "`search.test.js`: 2 of 212 tests failed."
  }
}
ChampTypeCe qu’il fait
statusobject ou stringUne simple chaîne sert de libellé : "status": "Open".
status.labelstringLe texte de la pastille. Sans lui, pas de pastille.
status.colorstringgreen, purple, red, orange, yellow, blue ou gray.
status.iconstringUne icône facultative, choisie dans la liste ci-dessous.
additionsnumberLes lignes ajoutées, affichées en vert : +86.
deletionsnumberLes lignes supprimées, affichées en rouge : -12.
files_changednumberLes fichiers modifiés, affichés sous la forme 3 files.

Icônes

ValeurIcôneUsage typique
pull_requestgit-pull-requestUne pull request ouverte
pull_request_closedgit-pull-request-closedFermée sans merge
merge, mergedgit-mergeMergée
commitgit-commitUn commit poussé
issuecircle-dotUne issue ouverte
issue_closedcircle-checkUne issue fermée
checkcircle-checkTests réussis, tâche terminée avec succès

Une correspondance qui marche pour GitHub

L’intégration GitHub native utilise celles-ci ; reprends-les pour tes propres outils.

ÉvénementLibelléCouleurIcône
Pull request ouverteOpengreenpull_request
BrouillonDraftgraypull_request
MergéeMergedpurplemerged
Fermée sans mergeClosedredpull_request_closed
Issue ouverteOpengreenissue
Issue ferméeClosedpurpleissue_closed
Commit pousséCommitgraycommit
Tests réussisPassinggreencheck
Tests en échecFailingredaucune

Chargement et raisonnement

Pour tout ce qui prend un moment, comme une réponse d’IA ou une longue tâche, publie d’abord une carte avec un indicateur de chargement, puis remplace-la par le résultat. Le chargement fonctionne depuis les webhooks et les réponses de commande. Dans une réponse de commande, tu peux aussi mettre le raisonnement du modèle dans thinking : les membres voient un bouton Afficher le raisonnement au lieu d’un pavé de texte.

assistant
System
Message de Assistant
Réflexion…Lecture des 50 derniers messages

D’abord : le chargement

assistant
System
Message de Assistant

maya : c’est quand, le standup ?

Le standup est à 9 h 30, dans #daily.
J’ai vérifié les messages épinglés et l’événement récurrent dans #daily.

Ensuite : la réponse, raisonnement replié

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…"
  }
}
ChampTypeCe qu’il fait
loaderbooleantrue affiche l’indicateur à la place du corps.
loader_textstringLa ligne à côté de l’indicateur, comme « Réflexion… ».
loader_sub_textstringUne ligne plus petite en dessous.
thinkingstringLe raisonnement replié sous la description, en markdown.

Pour remplacer le chargement par la réponse, mets à jour le message avec une nouvelle carte sans loader. La marche à suivre est sur mises à jour en direct.

Descriptions longues

Une description peut faire jusqu’à 50 000 octets. Au-delà des 1 000 premiers, les membres voient le début et un bouton Afficher plus qui charge le reste, pour qu’un long rapport n’inonde pas le salon.

Messages système

Mets "type": "system_message" pour un avis plutôt qu’un message de bot : fenêtres de maintenance, changements de règles, tout ce qui parle au nom de la communauté elle-même. Il accepte les mêmes champs et les mêmes boutons.

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

Couleurs

La couleur de la bordure est le signal le plus rapide d’une carte. Utilise toujours la même couleur pour le même genre de nouvelle.

CouleurÀ utiliser pour
greenSuccès : réussi, déployé, terminé
redÉchec : raté, hors ligne, refusé
orangeUn avertissement qui mérite un coup d’œil
yellowEn attente de quelqu’un : validations, questions
blueInformation, la couleur par défaut
purpleÉvénements de code, ou quelque chose de spécial

Construis ton embed

Modifie les champs ou le payload JSON. Les deux restent synchronisés. Regarde le message s’afficher exactement comme dans un canal. C’est le vrai body du webhook ; copie-le quand le résultat te convient.

Modèles
Boutons
Aperçu
Body du webhook

Continuer