Channels¶
Lango supports multi-channel communication, allowing your agent to interact with users across different messaging platforms simultaneously.
Supported Channels¶
| Channel | Config Section | Implementation |
|---|---|---|
| Telegram | channels.telegram |
internal/channels/telegram/ |
| Discord | channels.discord |
internal/channels/discord/ |
| Slack | channels.slack |
internal/channels/slack/ |
Each channel runs as an independent integration within the same Lango process. Messages from all channels are routed to the same agent, maintaining separate sessions per user/channel.
Voice support — Phase 1 (infrastructure only)
The voice infrastructure layer is now shipped: internal/voice/ exposes SpeechToText / TextToSpeech interfaces with a Gemini-backed STT implementation, plus voice.* config (default disabled — see Voice configuration).
Per-channel voice round-trip is NOT yet wired. Inbound (Telegram getFile → audio download → STT → text message inject) and outbound (Synthesize → sendVoice / file upload) integration is Phase 2, scheduled for a future change. The Gemini TTS implementation is also Phase 2 — Phase 1 returns ErrTTSNotConfigured as a graceful-degradation signal.
Until Phase 2 lands, channels behave as text-only regardless of voice.enabled. Setting voice.enabled: true does not yet activate any user-facing behavior.
Setup¶
The easiest way to configure channels is through the onboarding wizard:
lango onboard
Select Channel Setup during onboarding to configure one or more channels.
Telegram¶
Prerequisites¶
- Create a bot via BotFather on Telegram
- Copy the bot token
Configuration¶
Settings:
lango settings→ Channels
{
"channels": {
"telegram": {
"enabled": true,
"botToken": "${TELEGRAM_BOT_TOKEN}",
"allowlist": []
}
}
}
| Key | Type | Description |
|---|---|---|
enabled |
bool |
Enable the Telegram channel |
botToken |
string |
Bot token from BotFather |
allowlist |
[]int64 |
Allowed user/group IDs (empty = allow all) |
Security
In production, always set allowlist to restrict which Telegram users and groups can interact with your agent.
Discord¶
Prerequisites¶
- Create an application in the Discord Developer Portal
- Create a bot user and copy the bot token
- Note the Application ID for slash command registration
Configuration¶
Settings:
lango settings→ Channels
{
"channels": {
"discord": {
"enabled": true,
"botToken": "${DISCORD_BOT_TOKEN}",
"applicationId": "your-application-id",
"allowedGuilds": []
}
}
}
| Key | Type | Description |
|---|---|---|
enabled |
bool |
Enable the Discord channel |
botToken |
string |
Bot token from Discord Developer Portal |
applicationId |
string |
Application ID for slash commands |
allowedGuilds |
[]string |
Allowed guild (server) IDs (empty = allow all) |
Slack¶
Prerequisites¶
- Create a Slack app at api.slack.com
- Enable Socket Mode for real-time events
- Add required bot scopes and install to your workspace
Configuration¶
Settings:
lango settings→ Channels
{
"channels": {
"slack": {
"enabled": true,
"botToken": "${SLACK_BOT_TOKEN}",
"appToken": "${SLACK_APP_TOKEN}",
"signingSecret": "${SLACK_SIGNING_SECRET}"
}
}
}
| Key | Type | Description |
|---|---|---|
enabled |
bool |
Enable the Slack channel |
botToken |
string |
Bot OAuth token (xoxb-...) |
appToken |
string |
App-level token for Socket Mode (xapp-...) |
signingSecret |
string |
Signing secret for request verification |
Channel Features¶
All channels share the following capabilities:
- Session isolation -- Each user/channel combination gets its own session
- Tool approval -- Interactive approval prompts forwarded to the originating channel
- Message formatting -- Markdown/rich text adapted per platform
- Delivery targets -- Automation systems (cron, background, workflow) can deliver results to any enabled channel
- Progressive thinking -- Real-time "Thinking... (30s)" placeholder updates showing elapsed time
Multiple Channels¶
You can enable multiple channels simultaneously. Each runs independently:
Settings:
lango settings→ Channels
{
"channels": {
"telegram": {
"enabled": true,
"botToken": "${TELEGRAM_BOT_TOKEN}"
},
"discord": {
"enabled": true,
"botToken": "${DISCORD_BOT_TOKEN}",
"applicationId": "123456789"
},
"slack": {
"enabled": true,
"botToken": "${SLACK_BOT_TOKEN}",
"appToken": "${SLACK_APP_TOKEN}",
"signingSecret": "${SLACK_SIGNING_SECRET}"
}
}
}
Related¶
- Tool Approval -- How approval prompts work across channels
- Cron Scheduling -- Deliver scheduled results to channels
- Background Tasks -- Deliver async results to channels