Creează carduri de mesaj
Tot ce postează un bot, fie dintr-un webhook, dintr-un răspuns la o comandă sau dintr-o actualizare după un buton, este un card. Un card bun spune dintr-o privire ce s-a întâmplat: o margine colorată, un titlu, un status și detaliile dedesubt.
Ce poți face
- Afișează un statusO etichetă colorată precum Open, Merged sau Passing, cu liniile adăugate și șterse.
- Listează detaliileRânduri cu etichetă și valoare pe care membrii le copiază cu o singură atingere.
- Scrie în markdownText îngroșat, cod inline, blocuri de cod, citate și checkbox-uri.
- Arată că lucreziUn spinner cât timp botul se gândește, apoi raționamentul lui ascuns după un comutator.
În aplicație
Patru carduri așa cum le văd membrii. Fiecare înseamnă doar câteva linii de JSON.
Anatomia unui card
Părțile unui card, de sus în jos. Lasă deoparte ce nu îți trebuie: și un card doar cu titlu este în regulă.
- Antet„Message from” și un nume: numele webhook-ului sau, la un răspuns la o comandă, numele comunității tale. Un răspuns poate adăuga un
badge, de exemplu repository-ul. - Titlu și status
title, care devine link când setezititle_url, cu etichetastatusalături. - SubtitluO a doua linie îngroșată,
sub_title. - DescriereConținutul, în markdown.
- CâmpuriRânduri cu etichetă și valoare, cu un buton de copiere.
- SubsolOra, plus liniile adăugate și șterse, dacă le trimiți.
{
"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
}
}Toate câmpurile
Acestea merg în message_container. Un card are nevoie de o descriere sau de un loader. Câmpurile marcate „Răspunsuri la comenzi” sunt eliminate când postezi printr-un webhook.
| Câmp | Tip | Ce face |
|---|---|---|
type | string | embed_message (implicit) sau system_message. |
badge | string | O etichetă mică după nume, în antet, de exemplu acme/web. Răspunsuri la comenzi |
avatar_url | string | O imagine peste iconița cardului. |
color | string | Culoarea marginii. Vezi culorile mai jos. |
title | string | Prima linie, îngroșată. |
title_url | string | Transformă titlul într-un link. |
sub_title | string | O a doua linie îngroșată, sub titlu. |
description | string | Conținutul, în markdown. |
fields | array | [{ "field": "…", "value": "…" }]: rânduri cu etichetă și valoare. |
image_url, image_base64 | string | O imagine pe card. |
images | array | [{ "image_url": "…" }]: o galerie cu mai multe imagini. |
status | object sau string | O etichetă colorată lângă titlu. Vezi mai jos. Răspunsuri la comenzi |
additions, deletions, files_changed | number | Statistici de diff în subsol. Răspunsuri la comenzi |
loader, loader_text, loader_sub_text | boolean, string | Un spinner în locul conținutului. |
thinking | string | Raționament ascuns după comutatorul Show thinking. Răspunsuri la comenzi |
thinking înțeleg markdown: **bold**, _italic_, ~~strike~~, `inline code`, blocuri de cod între backtick-uri triple, > quotes, checkbox-uri - [x], @mențiuni și :emoji:.Status și statistici de diff
O etichetă de status spune povestea înainte ca cineva să citească textul. Stă lângă titlu sau, dacă nu există titlu, în subsol; statisticile de diff apar lângă oră. Ambele funcționează în răspunsurile la comenzi, iar integrarea GitHub încorporată le folosește. Un webhook le elimină.
{
"message_container": {
"color": "red",
"title": "Build failed on main",
"status": { "label": "Failing", "color": "red" },
"description": "`search.test.js`: 2 of 212 tests failed."
}
}| Câmp | Tip | Ce face |
|---|---|---|
status | object sau string | Un string simplu este eticheta: "status": "Open". |
status.label | string | Textul etichetei. Fără el nu apare nicio etichetă. |
status.color | string | green, purple, red, orange, yellow, blue sau gray. |
status.icon | string | O iconiță opțională din lista de mai jos. |
additions | number | Linii adăugate, afișate ca +86 verde. |
deletions | number | Linii șterse, afișate ca -12 roșu. |
files_changed | number | Fișiere modificate, afișate ca 3 files. |
Iconițe
| Valoare | Iconiță | Utilizare tipică |
|---|---|---|
pull_request | git-pull-request | Un pull request deschis |
pull_request_closed | git-pull-request-closed | Închis fără merge |
merge, merged | git-merge | Integrat |
commit | git-commit | Un commit trimis cu push |
issue | circle-dot | Un issue deschis |
issue_closed | circle-check | Un issue închis |
check | circle-check | Testele au trecut, un job a reușit |
O mapare care funcționează pentru GitHub
Integrarea GitHub încorporată folosește aceste valori; copiază-le pentru propriile tale unelte.
| Eveniment | Etichetă | Culoare | Iconiță |
|---|---|---|---|
| Pull request deschis | Open | green | pull_request |
| Ciornă | Draft | gray | pull_request |
| Integrat | Merged | purple | merged |
| Închis fără merge | Closed | red | pull_request_closed |
| Issue deschis | Open | green | issue |
| Issue închis | Closed | purple | issue_closed |
| Commit trimis cu push | Commit | gray | commit |
| Teste trecute | Passing | green | check |
| Teste eșuate | Failing | red | niciuna |
Loader și raționament
Pentru orice durează puțin, cum ar fi un răspuns AI sau un job lung, postează mai întâi un card cu un spinner, apoi înlocuiește-l cu rezultatul. Loader-ul funcționează din webhook-uri și din răspunsurile la comenzi. Într-un răspuns la o comandă poți pune și raționamentul modelului în thinking: membrii văd un comutator Show thinking în loc de un zid de text.
Întâi: loader-ul
Apoi: răspunsul, cu raționamentul pliat
{
"message_container": {
"type": "embed_message",
"color": "blue",
"loader": true,
"loader_text": "Thinking…",
"loader_sub_text": "Reading the last 50 messages"
}
}{
"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…"
}
}| Câmp | Tip | Ce face |
|---|---|---|
loader | boolean | true afișează spinnerul în locul conținutului. |
loader_text | string | Linia de lângă spinner, de exemplu „Mă gândesc…”. |
loader_sub_text | string | O linie mai mică dedesubt. |
thinking | string | Raționament pliat sub descriere, în markdown. |
Ca să înlocuiești loader-ul cu răspunsul, actualizează mesajul cu un card nou fără loader. Cum se face afli la actualizări live.
Descrieri lungi
O descriere poate avea până la 50.000 de octeți. După primii 1.000, membrii văd începutul și un buton Show more care încarcă restul, așa că un raport lung nu inundă canalul.
Mesaje de sistem
Setează "type": "system_message" pentru un anunț în loc de o postare de bot: ferestre de mentenanță, schimbări de reguli, orice vorbește în numele comunității însăși. Acceptă aceleași câmpuri și butoane.
{
"message_container": {
"type": "system_message",
"color": "orange",
"title": "Maintenance tonight",
"description": "The build servers are down from 22:00 to 23:00."
}
}Culori
Culoarea marginii este cel mai rapid semnal de pe un card. Folosește aceeași culoare pentru același tip de veste, de fiecare dată.
| Culoare | Folosește-o pentru |
|---|---|
green | Succes: trecut, implementat, gata |
red | Eșec: eșuat, căzut, respins |
orange | Un avertisment care merită verificat |
yellow | Se așteaptă după cineva: aprobări, întrebări |
blue | Informații, culoarea implicită |
purple | Evenimente din cod sau ceva special |
Construiește-ți embedul
Editează câmpurile sau payload-ul JSON: cele două rămân sincronizate. Previzualizarea arată mesajul exact cum va apărea într-un canal. Acesta este body-ul real al webhook-ului; copiază-l când totul arată bine.