Skip to main content
Assistants can end a reply with one or more suggested next-user-messages. When a user clicks a suggestion, it is submitted back to the agent as if the user typed it themselves — no extra round-trip, no instruction to “just say X.” This turns a reply into a guided fork in the conversation. There are four tags for this, two compact (hidden behind a trigger) and two inline (all options visible at once):

airiaMessageButton

A single clickable suggestion. One tap → submit.

airiaMessageDropdown

One trigger, a dropdown of suggestions. Clicking an option submits it immediately.

airiaMessageRadios

An inline radio group plus a Send button. User picks one, then submits.

airiaMessageCheckboxes

One trigger, a checkbox list plus a Send button. Picks are joined into one user message.
All four work in /chat, /catalog/chat, and the embeddable chat widget. They are emitted by the assistant as XML-like tags in the markdown reply; the chat UI parses them and swaps in interactive React components.

When to use which

1

One obvious follow-up

Use airiaMessageButton. Best when there is a clear next question and you want to minimize friction.
2

A small list of alternatives, pick one (compact)

Use airiaMessageDropdown. Best for 3–8 mutually-exclusive follow-ups with longer labels, or when conversation density matters and you want the suggestions tucked behind a trigger.
3

A small list of alternatives, pick one (inline)

Use airiaMessageRadios. Best for 2–5 short labels the user benefits from comparing at a glance before committing. Same single-select intent as the dropdown, but always visible.
4

A list where combining makes sense

Use airiaMessageCheckboxes. Best when the user might legitimately want to ask about several topics at once (e.g., “tell me about pricing and features”).
Rule of thumb: one suggestion block per reply. Stacking several is visual noise, and users interpret multiple suggestion surfaces as indecision from the assistant.

airiaMessageButton

A single suggestion. Click submits buttonText (or the tag body if buttonText is empty) as a new user message.
<airiaMessageButton buttonText="Tell me more about pricing">
Tell me about pricing
</airiaMessageButton>
Attributes
AttributeRequiredPurpose
buttonTextNoVisible label on the button. Falls back to the tag body if empty.
The tag body is the message that gets submitted on click. If buttonText is provided, it becomes the label and the body becomes the submitted message; if not, the body is used for both.

airiaMessageDropdown

A dropdown of single-submit suggestions. The tag body is a JSON array of {label, message} objects — label is what the user sees in the menu, message is what gets submitted when they click that option.
<airiaMessageDropdown buttonText="Tell me more">
[
  {"label": "About pricing",  "message": "Tell me about pricing"},
  {"label": "About features", "message": "Tell me about the features"},
  {"label": "About support",  "message": "Tell me about the support plans"}
]
</airiaMessageDropdown>
Attributes
AttributeRequiredPurpose
buttonTextNoLabel on the dropdown trigger. Falls back to a localized default.
Body schema
[
  { "label": "string shown in the menu", "message": "string submitted on click" }
]
Clicking an option behaves exactly like clicking an airiaMessageButton — it submits the message value as a new user turn.
If the body is not valid JSON or not an array of {label, message} objects, the dropdown silently renders nothing rather than crashing the message. Always emit valid JSON.

airiaMessageRadios

An inline radio group rendered directly in the assistant message, plus an explicit Send button below the options. The user picks one option and can change their mind freely until they click Send — only then is the selected message submitted as a new user turn. Same single-select intent as airiaMessageDropdown, but always-visible rather than hidden behind a trigger.
<airiaMessageRadios buttonText="Pick a topic" sendButtonText="Ask">
[
  {"label": "Pricing",  "message": "Tell me about pricing"},
  {"label": "Features", "message": "Tell me about the features"},
  {"label": "Roadmap",  "message": "Tell me about the roadmap"}
]
</airiaMessageRadios>
Attributes
AttributeRequiredPurpose
buttonTextNoHeading rendered above the radio group. Falls back to a localized default.
sendButtonTextNoLabel on the Send button. Defaults to the localized “Send” string.
Body schema — identical to airiaMessageDropdown:
[
  { "label": "string shown next to the radio", "message": "string submitted when Send is clicked" }
]
Prefer radios over a dropdown when you have 2–5 short labels and want the user to see every option at once. Prefer a dropdown when labels are longer or the list is bigger and inline rendering would crowd the message.

airiaMessageCheckboxes

A checkbox list plus an explicit Send button inside the menu. Users tick one or more options, then click Send. The selected message values are joined with newlines and submitted as a single user turn.
<airiaMessageCheckboxes buttonText="Pick topics" sendButtonText="Ask about these">
[
  {"label": "Pricing",  "message": "Tell me about pricing"},
  {"label": "Features", "message": "Tell me about the features"},
  {"label": "Roadmap",  "message": "Tell me about the roadmap"}
]
</airiaMessageCheckboxes>
If the user ticks Pricing and Roadmap and clicks Send, the agent receives:
Tell me about pricing
Tell me about the roadmap
Attributes
AttributeRequiredPurpose
buttonTextNoLabel on the trigger that opens the checkbox menu.
sendButtonTextNoLabel on the Send item inside the menu. Defaults to the localized “Send” string.
Body schema — identical to airiaMessageDropdown:
[
  { "label": "string shown next to the checkbox", "message": "string joined into the submitted message" }
]
Checkboxes do not submit on each tick — the menu stays open while the user is choosing, and submission only happens when they click Send. Write message values that read naturally when combined with other picks via newlines.

Streaming behaviour

All four tags respect streaming. While the closing tag has not yet arrived, the trigger (or the whole inline group, for radios) renders in a disabled state so users cannot click partial suggestions. Once the tag finishes streaming, interaction enables automatically. For dropdowns, radios, and checkboxes, this means a complete, valid JSON body must be fully streamed before interaction is possible.

Prompting the model

These tags are only useful if the underlying model knows when and how to emit them. Add an example like this to your system prompt:
When there is a clear single follow-up the user is likely to want,
end your reply with <airiaMessageButton> containing that message.

When there are several possible follow-ups the user might pick between:
- Use <airiaMessageDropdown> when labels are long or there are many options
  and you want them tucked behind a trigger.
- Use <airiaMessageRadios> when labels are short (2–5 options) and showing
  all of them inline helps the user compare before committing.
Both take a JSON array of objects with "label" and "message" string fields.

When the user might legitimately want to ask about multiple topics at
once, use <airiaMessageCheckboxes>. Same JSON body format; selected
option messages are joined with newlines into a single user turn.

Emit at most one suggestion block per reply.
For an end-to-end example of weaving these into a prompt, see Prompts.