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, emoji is mandatory.
  • To remove the bot's reaction(s) on channels that support it, assign emoji an empty string ("").
  • Use remove: true to remove a single emoji; this requires a non-empty emoji.
  • On channels that support status reactions, applying trackToolCalls: true to 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 emoji clears every reaction the bot placed on the message.
  • Use remove: true to remove only the emoji you specify.

Nextcloud Talk

  • For adding reactions only: emoji is required and cannot be empty.
  • Reaction removal does not yet trigger a delete call; instead of silently doing nothing, remove: true returns an explicit error.
  • The Talk bot must be registered with the reaction feature (refer to the Nextcloud Talk channel docs).

Telegram

  • Setting emoji to empty removes the bot's reactions.
  • remove: true also performs removal, but a non-empty emoji is still needed for tool validation.

WhatsApp

  • An empty emoji removes the bot reaction.
  • Internally, remove: true is mapped to an empty emoji, though emoji must 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: true removes only the emoji reaction you specify.

Feishu/Lark

  • Rather than a separate tool, this channel uses the same react action as other channels (add, remove, list via message reaction IDs).
  • Adding requires a non-empty emoji, which maps to a Feishu emoji_type (for example, SMILE, THUMBSUP, or HEART).
  • remove: true needs a non-empty emoji and removes the bot's own reaction that matches that emoji type.
  • An empty emoji combined with clearAll: true removes all of the bot's reactions on that message.

Signal

  • The channels.signal.reactionNotifications setting 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 in channels.signal.reactionAllowlist.

iMessage

  • Outbound reactions use iMessage tapbacks (love, like, dislike, laugh, emphasize, and question); to add a reaction, emoji must map to one of these kinds.
  • Without a recognized tapback kind, remove: true removes 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.

516 words · updated Jul 27, 2026