rich_messages
Skill4 starsChanged 8 days agoApache-2.0View on GitHub
Use attach_interactive to send WhatsApp interactive elements (buttons, lists, media, location). The attachment IS your reply — your final text output is optional garnish delivered after.
In this repository14 other files it gives its agents.
- AGENTS.mdAGENTS.md
- blueprints/appointment-scheduler/AGENTS.mdAGENTS.md
- blueprints/minimal/AGENTS.mdAGENTS.md
- blueprints/personal-assistant/AGENTS.mdAGENTS.md
- recipes/generate-image/AGENTS.mdAGENTS.md
- recipes/rich-messages/AGENTS.mdAGENTS.md
- recipes/voice-reply/AGENTS.mdAGENTS.md
- socialagent-admin-console/AGENTS.mdAGENTS.md
- blueprints/appointment-scheduler/CLAUDE.mdCLAUDE.md
- blueprints/minimal/CLAUDE.mdCLAUDE.md
- blueprints/personal-assistant/CLAUDE.mdCLAUDE.md
- CLAUDE.mdCLAUDE.md
- image_generationSkill
- voice_replySkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 3 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
When you call attach_interactive, the attachment is sent first, then your final text output.
- Very specific: line 17
The
bodyis your actual reply: Write it exactly as you would write a text message — warm, conversational, ending with the prompt for the … - Distinctive: line 19
The final text output is optional garnish: Use it for a short follow-up tip, warmth, or next-step hint.
- Distinctive: line 52
Never list choices as plain text when an interactive element is available.
- Distinctive: line 76
Every list row must read differently from the others.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Rich Messages
Mental model
When you call attach_interactive, the attachment is sent first, then your final text output. The attachment carries your full reply — greeting, context, and the question that ends in a choice.
attach_interactive(body="...", ...) → delivered first (YOUR MESSAGE)
your final text output → delivered second (optional follow-up)The body is your actual reply. Write it exactly as you would write a text message — warm, conversational, ending with the prompt for the options. Up to 1024 characters. This is the unit the user sees first and reads in full.
The final text output is optional garnish. Use it for a short follow-up tip, warmth, or next-step hint. It is fine to leave it empty or very brief when the attachment speaks for itself.
Examples
✅ Good — body is the full reply; final text is optional garnish
attach_interactive(
message_type="list_menu",
body="Here are the available options — tap one to continue 👇",
options="Options|Option A~First choice;Option B~Second choice;Option C~Third choice"
)
final text: "Let me know if you need more details on any of these."❌ Bad — body is a weak label; text re-introduces what the user already saw
attach_interactive(body="Pick one:", options="...")
final text: "Here are the options. Let me know which one works for you!"The body is wasted. The final text re-introduces an attachment the user already received.
When to use attach_interactive
- 2–3 choices, mutually exclusive →
buttons - 4–10 choices →
list_menu - Clickable URL →
link_button - Photo/video →
image/video - Map pin →
location - Ask user's location →
location_request
Never list choices as plain text when an interactive element is available.
attach_interactive parameters
| Type | Required | Notes |
buttons | body, options | options = comma-separated labels (2–3, ≤20 chars each, mutually exclusive) |
list_menu | body (non-empty), options | options = Section|row~desc;row~desc or row~desc;row~desc |
link_button | body, url | button_text optional (default "Open") |
image | url | caption optional — caption is the body for media |
video | url | caption optional |
location | latitude, longitude | name, address optional |
location_request | body | — |
Hard rules
- The
bodyis your reply. Write it as a complete, conversational message — not a label. - Your final text output is optional. When you do write it, keep it short and do NOT re-introduce the attachment the user already saw above.
- Max 10 list rows total. Row title ≤24 chars, description ≤72 chars.
- Row title and description MUST be separated by
~, never:. Dates and times contain:— using it as a separator will break parsing. ✅May 7 10:00 AM~Morning❌May 7 10:00 AM:Morning - Locations → coordinates, not URLs.
- Links →
link_button, not pasted URLs in the body or text. - On tool error → the tool call raises; correct the arguments and retry.
- Button labels must be distinct and non-redundant. ✅
Yes,No❌Yes,Confirm,No(Confirm and Yes mean the same thing). Each button should represent a meaningfully different action. - Every list row must read differently from the others. A tap returns only the row's title and description, never its section, so when the same time appears under two days, put the day in the row itself. ✅
Monday|Mon 10:00 AM~Haircut|Tuesday|Tue 10:00 AM~Haircut❌Monday|10:00 AM~Haircut|Tuesday|10:00 AM~Haircut
When the user answers
A tap on a button or list row reaches you as a tagged message, not plain text: [Button reply: <title>] or [List reply: <title> — <description>]. Treat it as the user's answer to the last interactive message you sent, and act on the title.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

