Reaction Tool Behavior Across Discord, Slack, Nextcloud Talk, and Telegram
Learn how the message tool's react action works on different channels, including adding and removing emoji reactions. This page is for developers building bots that need consistent reaction handling.
Read this when
- Working on reactions in any channel
- Understanding how emoji reactions differ across platforms
The agent uses the message tool's react action to add and remove emoji reactions. How this behaves depends on the channel.
How it works
{
"action": "react",
"messageId": "msg-123",
"emoji": "thumbsup"
}
emojiis mandatory when adding a reaction.- Set
emojito an empty string ("") to remove the bot's reaction(s) on channels that support this. - Set
remove: trueto remove a single specific emoji (requires a non-emptyemoji). - On channels with status reactions, using
trackToolCalls: trueon a reaction lets the runtime reuse that reacted message for subsequent tool-progress reactions within the same turn.
Channel behavior
Discord and Slack
- An empty
emojiremoves all of the bot's reactions on that message. remove: trueremoves only the specified emoji.
Nextcloud Talk
- Adding reactions only:
emojiis required and must be non-empty. - Reaction removal is not yet wired to a delete call;
remove: trueis rejected with an explicit error rather than silently doing nothing. - Requires the Talk bot registered with the
reactionfeature (see Nextcloud Talk channel docs).
Telegram
- An empty
emojiremoves the bot's reactions. remove: truealso removes reactions but still requires a non-emptyemojifor tool validation.
- An empty
emojiremoves the bot reaction. remove: truemaps to an empty emoji internally (still requiresemojiin the tool call).- WhatsApp has one bot reaction slot per message; sending a new reaction replaces it instead of stacking multiple emoji.
Zalo Personal (zalouser)
- Requires a non-empty
emojifor both add and remove. remove: trueremoves that specific emoji reaction.
Feishu/Lark
- Uses the same
reactaction as other channels (add/remove/list via message reaction IDs), not a separate tool. - Adding requires a non-empty
emoji(mapped to a Feishuemoji_type, e.g.SMILE,THUMBSUP,HEART). remove: truerequires a non-emptyemojiand removes the bot's own reaction matching that emoji type.- An empty
emojiwithclearAll: trueremoves all of the bot's reactions on the message.
Signal
- Inbound reaction notifications are controlled by
channels.signal.reactionNotifications:"off"disables them,"own"(default) emits events when users react to bot messages,"all"emits events for all reactions, and"allowlist"emits events only for senders inchannels.signal.reactionAllowlist.
iMessage
- Outbound reactions are iMessage tapbacks (
love,like,dislike,laugh,emphasize, andquestion);emojimust map to one of these kinds to add a reaction. remove: truewithout a recognized tapback kind removes all tapback kinds; with a recognized kind it removes only that one.
Reaction level
Per-channel reactionLevel throttles how often the agent sends its own reactions. Values: off, ack, minimal, or extensive.
- Telegram reaction notifications -
channels.telegram.reactionLevel(defaultminimal) - WhatsApp reaction level -
channels.whatsapp.reactionLevel(defaultminimal) - Signal reactions -
channels.signal.reactionLevel(defaultminimal)
Related
- Agent Send - the
messagetool that includesreact - Channels - channel-specific configuration