Skip to main content
Operator OS connects to messaging platforms through a unified channel system. Each channel is a standalone Go package that registers itself on startup. Once registered, the Manager handles message routing, rate limiting, retries, and typing/placeholder indicators — channels only need to implement Send and publish inbound messages to the bus.

How the channel system works

User Message → Channel → MessageBus → Agent Loop → MessageBus → Channel → User
Every inbound message is wrapped in a structured InboundMessage with a Peer (direct or group), a Sender identity, and a MediaScope. The agent processes it and publishes an OutboundMessage back to the bus. The Manager routes the outbound message to the correct channel worker queue, splits long messages if needed, and calls channel.Send().

Common configuration fields

Every channel config object shares these fields.
enabled
boolean
required
Whether this channel is active. Set to true to start the channel when the gateway boots.
allow_from
array of strings
A list of sender identifiers that the agent will accept messages from. If the array is empty, all senders are accepted — do not leave this empty in production unless the channel is only accessible to trusted users.Supported formats:
  • "123456" — matches the sender’s platform-native ID
  • "@alice" — matches the sender’s username
  • "telegram:123456" — canonical platform:id format (recommended)
Messages from senders not on the list are silently dropped before any attachments are downloaded.
reasoning_channel_id
string
When set, the agent’s internal reasoning trace (chain-of-thought) is sent to this channel or chat ID instead of the main conversation. This lets you expose thinking steps in a separate debug channel without cluttering the user-facing chat.Leave empty to disable reasoning routing.
Always set allow_from for channels that are publicly reachable (e.g., Telegram, Discord public servers, WhatsApp). Without it, anyone who can find or guess your bot will be able to interact with your agent.

Supported channels

Slack

Socket Mode integration. Supports reactions, file uploads, slash commands, and thread replies.

Telegram

Long-polling bot. Supports photos, voice, audio, documents, typing indicators, and placeholder messages.

Discord

Gateway bot. Supports file attachments, typing indicators, placeholder messages, and mention-only mode.

WhatsApp

Two modes: a WebSocket bridge (any provider) or native mode using whatsmeow with automatic reconnection and QR login.

DingTalk

Enterprise messaging via DingTalk Stream Mode SDK. No public webhook required.

Feishu / Lark

Feishu enterprise app via WebSocket SDK. Sends rich Interactive Card responses.

LINE

LINE Messaging API via webhook. Supports typing (loading animation), media, and reply tokens.

QQ

Native QQ Open Platform bot using the official Tencent botgo SDK over WebSocket.

OneBot

Universal chatbot standard (V11) for QQ and other protocols via a local WebSocket bridge.

WeCom

Three modes: Group Bot, Custom App, and AI Bot — for enterprise WeChat deployments.

Build docs developers (and LLMs) love