Ga naar hoofdinhoud
Developers Berichtkaarten

Berichtkaarten ontwerpen

Alles wat een bot post, via een webhook, als antwoord op een commando of als update na een knopdruk, is een kaart. Een goede kaart laat in één oogopslag zien wat er is gebeurd: een gekleurde rand, een titel, een status en de details eronder.

Wat je kunt doen

  • Een status tonenEen gekleurde pill zoals Open, Gemerged of Geslaagd, met toegevoegde en verwijderde regels.
  • De details op een rijRegels met een label en een waarde, die leden met één tik kunnen kopiëren.
  • In markdown schrijvenVet, inline code, codeblokken, citaten en vinkjes.
  • Laten zien dat je bezig bentEen spinner terwijl je bot nadenkt, en daarna zijn redenering achter een schakelaar.

In de app

Vier kaarten zoals leden ze zien. Elke kaart is een paar regels JSON.

De opbouw van een kaart

De onderdelen van een kaart, van boven naar beneden. Laat weg wat je niet nodig hebt: een kaart met alleen een titel is prima.

  1. Kop"Bericht van" en een naam: de naam van de webhook, of de naam van je community bij een antwoord op een commando. Een antwoord kan er een badge aan toevoegen, zoals de repository.
  2. Titel en statusDe title, een link als je title_url invult, met de status-pill ernaast.
  3. SubtitelEen tweede vetgedrukte regel, sub_title.
  4. BeschrijvingDe hoofdtekst, in markdown.
  5. VeldenRegels met een label en een waarde, met een kopieerknop.
  6. VoettekstDe tijd, en de toegevoegde en verwijderde regels als je die meestuurt.
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
  }
}

Alle velden

Deze horen in message_container. Een kaart heeft een beschrijving nodig, of een loader. Velden met "antwoorden op commando's" vallen weg als je via een webhook post.

VeldTypeWat het doet
typestringembed_message (standaard) of system_message.
badgestringEen klein label na de naam in de kop, zoals acme/web. Antwoorden op commando's
avatar_urlstringEen afbeelding over het icoon van de kaart.
colorstringDe kleur van de rand. Zie kleuren hieronder.
titlestringDe vetgedrukte eerste regel.
title_urlstringMaakt van de titel een link.
sub_titlestringEen tweede vetgedrukte regel onder de titel.
descriptionstringDe hoofdtekst, in markdown.
fieldsarray[{ "field": "…", "value": "…" }]: regels met een label en een waarde.
image_url, image_base64stringEen afbeelding op de kaart.
imagesarray[{ "image_url": "…" }]: een galerij met meerdere afbeeldingen.
statusobject of stringEen gekleurde pill naast de titel. Zie hieronder. Antwoorden op commando's
additions, deletions, files_changednumberDiff-stats in de voettekst. Antwoorden op commando's
loader, loader_text, loader_sub_textboolean, stringEen spinner in plaats van de hoofdtekst.
thinkingstringRedenering achter een schakelaar Toon denkproces. Antwoorden op commando's
De beschrijving en thinking begrijpen markdown: **bold**, _italic_, ~~strike~~, `inline code`, codeblokken tussen backticks, > quotes, - [x]-vinkjes, @vermeldingen en :emoji:.

Status en diff-stats

Een statuspill vertelt het verhaal al voordat iemand de tekst leest. Hij staat naast de titel, of in de voettekst als er geen titel is; diff-stats staan naast de tijd. Allebei werken ze in antwoorden op commando's, en de ingebouwde GitHub-integratie gebruikt ze. Een webhook laat ze weg.

json
{
  "message_container": {
    "color": "red",
    "title": "Build failed on main",
    "status": { "label": "Failing", "color": "red" },
    "description": "`search.test.js`: 2 of 212 tests failed."
  }
}
VeldTypeWat het doet
statusobject of stringEen losse string is het label: "status": "Open".
status.labelstringDe tekst in de pill. Zonder label geen pill.
status.colorstringgreen, purple, red, orange, yellow, blue of gray.
status.iconstringEen optioneel icoon uit de lijst hieronder.
additionsnumberToegevoegde regels, getoond als groene +86.
deletionsnumberVerwijderde regels, getoond als rode -12.
files_changednumberGewijzigde bestanden, getoond als 3 files.

Iconen

WaardeIcoonTypisch gebruik
pull_requestgit-pull-requestEen pull request geopend
pull_request_closedgit-pull-request-closedGesloten zonder merge
merge, mergedgit-mergeGemerged
commitgit-commitEen gepushte commit
issuecircle-dotEen issue geopend
issue_closedcircle-checkEen issue gesloten
checkcircle-checkTests geslaagd, een taak gelukt

Een indeling die werkt voor GitHub

De ingebouwde GitHub-integratie gebruikt deze; neem ze over voor je eigen tools.

GebeurtenisLabelKleurIcoon
Pull request geopendOpengreenpull_request
DraftDraftgraypull_request
GemergedMergedpurplemerged
Gesloten zonder mergeClosedredpull_request_closed
Issue geopendOpengreenissue
Issue geslotenClosedpurpleissue_closed
Commit gepushtCommitgraycommit
Tests geslaagdPassinggreencheck
Tests misluktFailingredgeen

Loader en denkproces

Voor alles wat even duurt, zoals een AI-antwoord of een lange taak, post je eerst een kaart met een spinner en vervang je die daarna door het resultaat. De loader werkt vanuit webhooks en in antwoorden op commando's. In een antwoord op een commando kun je de redenering van het model ook in thinking zetten: leden zien dan een schakelaar Toon denkproces in plaats van een muur van tekst.

assistant
System
Bericht van Assistant
Denkt na…Leest de laatste 50 berichten

Eerst: de loader

assistant
System
Bericht van Assistant

maya: hoe laat is de standup?

De standup is om 09:30, in #daily.
De vastgezette berichten en de terugkerende afspraak in #daily bekeken.

Daarna: het antwoord, met de redenering ingeklapt

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…"
  }
}
VeldTypeWat het doet
loaderbooleantrue toont de spinner in plaats van de hoofdtekst.
loader_textstringDe regel naast de spinner, zoals "Denkt na…".
loader_sub_textstringEen kleinere regel eronder.
thinkingstringIngeklapte redenering onder de beschrijving, in markdown.

Om de loader te vervangen door het antwoord, werk je het bericht bij met een nieuwe kaart zonder loader. Hoe dat gaat lees je bij live-updates.

Lange beschrijvingen

Een beschrijving mag tot 50.000 bytes zijn. Voorbij de eerste 1.000 zien leden het begin en een knop Meer tonen die de rest laadt, zodat een lang rapport het kanaal niet overspoelt.

Systeemberichten

Zet "type": "system_message" voor een mededeling in plaats van een botbericht: onderhoudsvensters, beleidswijzigingen, alles waarin de community zelf aan het woord is. Het kent dezelfde velden en knoppen.

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

Kleuren

De randkleur is het snelste signaal op een kaart. Gebruik voor hetzelfde soort nieuws elke keer dezelfde kleur.

KleurGebruik je voor
greenSucces: geslaagd, uitgerold, klaar
redMislukt: kapot, onbereikbaar, afgewezen
orangeEen waarschuwing waar iemand naar moet kijken
yellowWacht op iemand: goedkeuringen, vragen
blueInformatie, de standaard
purpleCode-events, of iets bijzonders

Bouw je embed

Bewerk de velden of de JSON payload. Beide blijven in sync. Zie het bericht renderen precies zoals in een kanaal. Dit is de echte webhook body; kopieer hem als het goed staat.

Voorbeelden
Knoppen
Voorbeeld
Webhook body

Verder bouwen