Channels & Messaging
Slack, Telegram, WhatsApp, public links, progress indicators, proactive consent, voice, phone calls. Short, grounded answers with links to the full documentation.
28 questions
- •How do I connect my Trinity instance to Slack?
- •What is the difference between Socket Mode and webhook mode for Slack?
- •Can multiple agents share one Slack workspace?
- •Can each agent have its own Slack bot identity instead of sharing one?
- •Can I control whether an agent posts to a Slack channel on its own?
- •Which agent answers when someone DMs the Slack bot?
- •Why does my agent keep replying in a Slack thread without being @mentioned?
- •How does my agent show its own name and avatar in Slack?
- •How do I connect an agent to Telegram?
- •Why doesn't my Telegram bot see every message in a group?
- •Can users send voice messages to my Telegram bot?
- •How do I connect an agent to WhatsApp?
- •Should I use the Twilio sandbox or a production WhatsApp sender?
- •Can my agent join WhatsApp group chats?
- •How do users verify their email from Telegram or WhatsApp?
- •How do I let people chat with my agent without a Trinity account?
- •Does a public chat link remember returning users?
- •Can I use a different model for public and channel conversations?
- •Can I give my agent extra instructions that only apply to strangers?
- •Can my agent speak its replies as voice notes?
- •Why did my agent's voice reply arrive as plain text?
- •Can my agent place real phone calls?
- •What limits apply to agent phone calls, and what happens after a call?
- •How does Trinity know who is messaging my agent from a channel?
- •Can I change how many proactive messages my agent can send?
- •Does Telegram show anything while a long task is running?
- •An agent delegated my Telegram request to another agent — will I hear back?
- •A file someone sent my agent in Slack never arrived. Why?
How do I connect my Trinity instance to Slack?
Connection happens in two steps. First, a platform admin goes to Settings → Slack, enters a Slack App Token (xapp-...), clicks Connect to start the Socket Mode transport, then clicks Install to Workspace to complete OAuth and obtain a bot token. Second, each agent is bound to Slack from its own detail page: open the Sharing tab, click Configure on the Slack row, and click Create Channel to create a dedicated channel bound to that agent. Note that only one Slack workspace can be connected per Trinity instance. See Slack Integration.
What is the difference between Socket Mode and webhook mode for Slack?
Socket Mode is the default transport: Trinity opens an outbound WebSocket connection to Slack, so your instance needs no public URL — it works even on a laptop behind NAT. Webhook mode is the HTTP fallback for production environments where Slack posts events to your server, which requires a publicly accessible URL. If you can use Socket Mode, it is the simpler option. See Slack Integration.
Can each agent have its own Slack bot identity instead of sharing one?
By default all agents share one workspace bot and are told apart by their per-message name and avatar. Giving an agent its own dedicated Slack bot— one people can DM directly and @mentionby name, alongside other agents in the same channel — is an enterprise-tier capability, configured from the agent's Sharing tab. See Slack Integration.
Can I control whether an agent posts to a Slack channel on its own?
Yes. Proactively posting to a Slack channel requires a per-channel consent toggle, separate from the per-recipient consent for DMs — a newly bound channel denies proactive posts until you enable it in the Slack channel panel. Replying inline to someone's message never needs consent. See Slack Integration.
Which agent answers when someone DMs the Slack bot?
DMs are routed to the workspace's DM-default agent. The first agent bound to the workspace becomes the DM default automatically, but you can reassign it anytime: open the target agent's Sharing tab → Slack section and click Set as DM Default— the change takes effect immediately, no restart needed. Only one agent per workspace can be the DM default, and you cannot unbind the current DM-default agent while other agents are still bound; reassign the default first. See Slack Integration.
Why does my agent keep replying in a Slack thread without being @mentioned?
That is thread tracking working as designed. Once an agent has been @mentioned in a channel (or a thread starts from one of the bot's own messages), replies in that thread route to the same agent automatically, so people can hold a conversation without re-mentioning the bot on every message. Thread tracking only applies to threads started by a bot message or an @mention — the bot does not join arbitrary threads. See Slack Integration.
How does my agent show its own name and avatar in Slack?
Trinity posts each reply with the agent's name and its Trinity avatar as the per-message bot icon, using Slack's chat:write.customizescope. This applies to both replies and proactive messages, so in a multi-agent workspace you can always tell which agent is speaking. The agent also sees who is talking and where — channel messages arrive with a prefix like [Channel: #engineering] / [From: John Smith (@johndoe)], while DMs stay clean. See Slack Integration.
How do I connect an agent to Telegram?
Create a bot first: message @BotFather on Telegram, send /newbot, choose a name and a username ending in bot, and copy the bot token. Then open the agent's Sharing tab, click Configure on the Telegram row, paste the token, and click Connect Bot — Trinity validates the token and registers the webhook. Each agent needs its own dedicated bot; bots cannot be shared across agents. If the status shows "Connected (no webhook)", set your instance's public URL under Settings → Public Chat URL so Telegram can deliver messages. See Telegram Integration.
Why doesn't my Telegram bot see every message in a group?
Two settings control this. In Trinity, each group has a trigger mode: Mention only(the default — the bot responds to @mentions and replies) or All messages. For "all messages" to work, you must also disable Telegram's Privacy Mode via @BotFather (/setprivacy→ Disable), because with Privacy Mode on, Telegram simply never delivers non-mention group messages to the bot. Critically, if the bot is already in the group, you must remove and re-add it after changing Privacy Mode — Telegram only applies the change to newly joined groups. See Telegram Integration.
Can users send voice messages to my Telegram bot?
Yes. Voice notes are automatically transcribed with Google Gemini and delivered to the agent as text prefixed with a 🎙️ emoji — users just send voice notes normally. Limits: 5 minutes duration, 10 MB file size, and the backend must have GEMINI_API_KEY configured. If transcription fails, the agent receives a placeholder message instead, so the conversation still progresses. See Telegram Integration.
How do I connect an agent to WhatsApp?
Trinity connects to WhatsApp through Twilio — you bring your own Twilio account. Open the agent's Sharing tab, click Configure on the WhatsApp row, and enter your Twilio Account SID, Auth Token (stored encrypted), and WhatsApp sender number in the form whatsapp:+15551234567. After connecting, copy the generated webhook URL into your Twilio console so inbound messages reach Trinity. You also need Settings → Public Chat URL set to your public domain, and if you route traffic through a tunnel, a rule sending /api/whatsapp/webhook/* to the backend service. See WhatsApp Integration.
Should I use the Twilio sandbox or a production WhatsApp sender?
Use the sandbox for development: it is free and uses Twilio's shared sender whatsapp:+14155238886, but every tester must first opt in by sending join <your-sandbox-keyword>to that number. For production, register a dedicated sender in the Twilio console — this requires linking a Meta Business Manager account, and display-name approval takes 24–48 hours. Trinity auto-detects the sandbox from the well-known sender number. See WhatsApp Integration.
Can my agent join WhatsApp group chats?
No. Twilio's WhatsApp API supports direct messages only, so WhatsApp groups are not available — this is a Twilio/WhatsApp platform limitation, not a Trinity setting. If you need group conversations, Telegram and Slack both support them. See WhatsApp Integration.
How do users verify their email from Telegram or WhatsApp?
Users send /login user@example.com to the bot, receive a 6-digit code at that address, and reply /login 123456 to complete verification. /whoami shows the currently verified email and /logoutclears it. On Slack no command is needed — the workspace OAuth already provides each user's email. Verification matters for agents with a restricted access policy: unverified users are prompted to log in before the agent responds. See Access Control.
How do I let people chat with my agent without a Trinity account?
Create a public link: open the agent's Sharing tab, go to Distribution → Public links, and click Create Public Link. You can configure email verification on or off, rate limits, and a custom welcome message, then share the generated URL. Recipients open it and chat immediately — no login required. See Public Links.
Does a public chat link remember returning users?
Yes, if email verification is enabled on the link. Verified sessions persist across page refreshes and return visits, and the agent maintains per-user memory scoped to that agent and email, updated by background summarization every 5 messages. Logged-in Trinity users additionally get a history dropdown to resume any past session. Anonymous sessions (verification off) have no cross-session continuity. See Public Links.
Can I use a different model for public and channel conversations?
Yes. The Public chat modelsetting on the agent's Sharing tab overrides the model for public-facing surfaces only: public links, Slack/Telegram/WhatsApp channels, and paid chat. Your own authenticated chats and scheduled runs are unaffected, and the default option inherits the platform-wide model. This is useful for putting a cheaper or faster model in front of outside audiences. See Agent Sharing & Access.
Can I give my agent extra instructions that only apply to strangers?
Yes. The Additional instructions — public & channel chats only field on the Sharing tab (up to 4,000 characters) is injected into the agent's system prompt for outside audiences only: public links, Slack/Telegram/WhatsApp, and paid chat. It never affects your own authenticated chats, scheduled runs, loops, or agent-to-agent calls, so you can set tone, disclosure rules, or scope limits for strangers without touching the agent's core instructions. Leave it empty to disable. See Agent Sharing & Access.
Can my agent speak its replies as voice notes?
Yes. With voice replies enabled, the agent's channel replies are synthesized with ElevenLabs and delivered in each channel's native voice format: an OGG/Opus voice note on Telegram, an inline MP3 clip in the Slack thread, and an OGG voice note via Twilio media on WhatsApp. It is one setting per agent that applies to all three channels: the platform admin sets ELEVENLABS_API_KEY, then you enable the Voice repliestoggle inside any channel's dialog and paste an ElevenLabs voice ID. Voice replies do not cover the web chat UI or public links. See Voice Replies.
Why did my agent's voice reply arrive as plain text?
Voice is strictly additive and fails soft — a voice problem never loses a message. Text is used instead when the reply exceeds the character cap (TTS_MAX_CHARS, default 1,500 characters), when the platform has no ELEVENLABS_API_KEY, or when synthesis, transcoding, hosting, or upload fails for any reason. If it happens consistently, check that the key is set and that your replies fit under the cap. See Voice Replies.
Can my agent place real phone calls?
Yes — agents can dial a number through Twilio and hold a live, interruptible spoken conversation powered by Gemini Live. VoIP is off by default: the platform needs VOIP_ENABLED=true plus a GEMINI_API_KEY, a configured Public Chat URL, and a publicly reachable deployment (Twilio must open a WebSocket to your instance). The agent owner then configures a per-agent Twilio voice binding in the Sharing tab's Voice calls row, and calls are placed via the call_userMCP tool or the API. This release is outbound only — agents do not answer incoming calls. See VoIP Telephony.
What limits apply to agent phone calls, and what happens after a call?
Calls are rate-limited to 5 per owner and destination number per 60 seconds, capped by a per-agent daily call limit (default 50, overridable on the binding), and hard-capped at 10 minutes each. Calls bill to the agent owner's own Twilio account. After the call ends, the full transcript is saved to the agent's chat history with source voice and, by default, dispatched back to the agent as a task so it can follow up on what was discussed; unanswered calls skip this. See VoIP Telephony.
How does Trinity know who is messaging my agent from a channel?
The verified email is the identity across every channel: a user verified on Telegram, WhatsApp, or a public link, or identified via Slack workspace OAuth, is the same person to Trinity everywhere. That email is checked against the agent's access policy — open access lets anyone chat, while restricted agents admit only the owner, admins, and emails on the shared-access list, with everyone else generating a pending access request. Approving a user once admits them on all channels. The Sharing tab also shows a client roster of external channel users who have messaged the agent. For the approval flow and policy details, see Access Control.
Can I change how many proactive messages my agent can send?
Yes. An admin can tune the anti-spam caps on agent-initiated ("proactive") sends under Settings → General → Proactive message limits: Slack per-channel and per-agent, Telegram per-group and per-agent, and proactive direct messages per recipient — each a per-hour limit. The shipped defaults are 10/hour per channel/group/recipient and 100/hour per agent, so nothing changes until you raise them. Setting a value to 0makes that cap unlimited (the guardrail is disabled and the save warns you). Changes take effect immediately, with no restart. This is the setting to raise for a legitimate high-volume agent — for example, one that posts a Slack message for each inbound support request.
Note: these caps apply only to messages the agent starts. Replies to inbound messages (a DM, an @mention, or a thread reply through a channel) are never limited by them.
Does Telegram show anything while a long task is running?
Yes, three layers, all fail-soft and on by default per bot binding. A 👀 reaction lands on your message the moment the agent picks it up (and is cleared when the turn ends), the standard typing indicator fires, and past 30 seconds the bot posts a quiet “⏳ Working on it — N min elapsed” note (sent without a notification) that it edits about once a minute and deletes when the turn finishes. Turn it off in the Telegram dialog on the agent's Sharing tab. In groups it only fires on @mentions and replies — a bot in observe mode stays silent, since a visible reaction would reveal that it is listening. See Telegram Integration.
An agent delegated my Telegram request to another agent — will I hear back?
Yes. When work that started from Telegram finishes later — because it was delegated or run in the background — the result is posted back into the originating chat, threaded to your original message and sent by the same bot you were talking to. Failures report honestly rather than vanishing. An ordinary chat turn already answers inline, so it is never double-posted. Group chats have a per-group consent flag (on by default) that suppresses these when turned off; direct messages are consented by construction. Slack behaves the same way. See Telegram Integration and Slack Integration.
A file someone sent my agent in Slack never arrived. Why?
Inbound Slack files are downloaded through a host allow-list: the authenticated first request may only reach Slack's own API host, and redirects are followed only to Slack's file and edge-CDN hosts, over HTTPS, with each hop re-checked and a bounded hop count. A download to any other host is refused — and logged as an error, so a refusal is visible in the platform log rather than silently dropped. Check platform.json for the refusal before assuming the message never arrived. See Slack Integration.