Channels — Overview
A channel is a separate adapter container that bridges a messaging platform (Telegram, Discord, webhook…) with a NanoFleet agent. Channels are decoupled from the agent core — you can add or remove them without touching the agent.
Architecture
User → Telegram → Channel container → POST /api/agents/:id/stream → Agent
←─────────── SSE stream ─────────────
Each channel:
- Receives a message from the platform (webhook, polling, etc.)
- Normalizes it to NanoFleet’s message format
- Streams it to the agent via
POST /api/agents/:id/stream - Relays the agent’s streamed response back to the user
Available channels
| Channel | Status | Image |
|---|---|---|
| Telegram | ✅ Ready | ghcr.io/nanofleet/nanofleet-channel-telegram:latest |
| Discord | Planned | — |
| Webhook | Planned | — |
Multimodal support
Channels handle media before forwarding to the agent:
- Voice messages → transcribed with Whisper (via Groq or OpenAI) → text sent to agent
- Images → forwarded as base64 if the model supports vision
- Text-to-speech → agent responses can be converted to voice in the channel
Enable TTS by setting TTS_ENABLED=true and TTS_PROVIDER=groq (or openai) in the channel environment.
Proactive notifications
Agents can push messages to users without waiting for input. The agent sends a notification via the channel’s outbound API — the channel delivers it to the platform.
If no channel is connected, proactive notifications are silently dropped.