Reaction Tool Semantics Across Supported Channels
This page explains how the message tool's react action works on Discord, Slack, Nextcloud Talk, and Telegram. Developers integrating reaction functionality will learn the specific behaviors and requirements for each platform.
Read this when
- Working on reactions in any channel
- Understanding how emoji reactions differ across platforms
The message tool's react action is how the agent adds or removes emoji reactions. The behavior depends on the channel in use.
How it works
{
"action": "react",
"messageId": "msg-123",
"emoji": "thumbsup"
}
- When adding a reaction,
emojiis mandatory. - To remove the bot's reaction(s) on channels that support it, assign
emojian empty string (""). - Use
remove: trueto remove a single emoji; this requires a non-emptyemoji. - On channels that support status reactions, applying
trackToolCalls: trueto a reaction allows the runtime to reuse that same message for tool-progress reactions within the same turn.
Channel behavior
Discord and Slack
- An empty
emojiclears every reaction the bot placed on the message. - Use
remove: trueto remove only the emoji you specify.
Nextcloud Talk
- For adding reactions only:
emojiis required and cannot be empty. - Reaction removal does not yet trigger a delete call; instead of silently doing nothing,
remove: truereturns an explicit error. - The Talk bot must be registered with the
reactionfeature (refer to the Nextcloud Talk channel docs).
Telegram
- Setting
emojito empty removes the bot's reactions. remove: truealso performs removal, but a non-emptyemojiis still needed for tool validation.
- An empty
emojiremoves the bot reaction. - Internally,
remove: trueis mapped to an empty emoji, thoughemojimust still be provided in the tool call. - WhatsApp allows only one bot reaction per message; sending a new reaction replaces the existing one rather than adding to it.
Zalo Personal (zalouser)
- Both add and remove operations require a non-empty
emoji. remove: trueremoves only the emoji reaction you specify.
Feishu/Lark
- Rather than a separate tool, this channel uses the same
reactaction as other channels (add, remove, list via message reaction IDs). - Adding requires a non-empty
emoji, which maps to a Feishuemoji_type(for example,SMILE,THUMBSUP, orHEART). remove: trueneeds a non-emptyemojiand removes the bot's own reaction that matches that emoji type.- An empty
emojicombined withclearAll: trueremoves all of the bot's reactions on that message.
Signal
- The
channels.signal.reactionNotificationssetting governs inbound reaction notifications:"off"turns them off,"own"(the default) fires events when users react to bot messages,"all"fires events for every reaction, and"allowlist"fires events only for senders listed inchannels.signal.reactionAllowlist.
iMessage
- Outbound reactions use iMessage tapbacks (
love,like,dislike,laugh,emphasize, andquestion); to add a reaction,emojimust map to one of these kinds. - Without a recognized tapback kind,
remove: trueremoves all tapback kinds; with a recognized kind it removes only that one.
Reaction level
Each channel’s reactionLevel setting limits how often the agent dispatches its own reactions. Allowed 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 containsreact - Channels, per‑channel settings