Guides connecting AI agents to Omni channels like WhatsApp, Telegram, Discord, Slack using providers, reply filters, routing, and testing via bash CLI.
From omninpx claudepluginhub automagik-dev/omni --plugin omniThis skill is limited to using the following tools:
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Executes pre-written implementation plans: critically reviews, follows bite-sized steps exactly, runs verifications, tracks progress with checkpoints, uses git worktrees, stops on blockers.
Guides idea refinement into designs: explores context, asks questions one-by-one, proposes approaches, presents sections for approval, writes/review specs before coding.
Step-by-step guide to route messages from any Omni channel (WhatsApp, Telegram, Discord, Slack) to an AI agent backend.
Channel (WhatsApp/Telegram/...)
→ Instance (connected account)
→ Reply Filter (when to activate agent)
→ Route Resolver (which agent handles this chat/user)
→ Provider (how to talk to the agent backend)
→ Agent processes message
→ Agent replies via omni send
| Schema | Backend | Use Case |
|---|---|---|
genie | Claude Code team inbox | Fire-and-forget to genie agents. Agent replies via omni send. |
claude-code | Claude Code SDK | Native SDK integration. Runs agents in isolated sessions. |
agno | AgnoOS platform | Self-hosted or cloud Agno agents. |
openclaw | WebSocket gateway | Real-time WebSocket agent communication. |
webhook | Any HTTP endpoint | Generic REST/webhook backends. |
a2a | Agent-to-Agent | One Omni agent calling another Omni agent. |
omni providers create \
--name "Genie Team" \
--schema genie \
--schema-config '{
"agentName": "omni",
"targetAgent": "team-lead",
"teamName": "genie"
}' \
--json
agentName: identity of this provider when writing to inbox (appears as sender)targetAgent: which agent inbox to deliver to (e.g. team-lead, ideias)teamName: Claude Code team name (default: genie)omni providers create \
--name "My Project Agent" \
--schema claude-code \
--project-path /home/user/myproject \
--max-turns 10 \
--permission-mode acceptEdits \
--model claude-sonnet-4-20250514 \
--json
omni providers create \
--name "Support Agent" \
--schema agno \
--base-url https://api.agno.com \
--api-key sk_xxx \
--schema-config '{"agentId": "support-bot"}' \
--json
omni providers create \
--name "Custom Backend" \
--schema webhook \
--schema-config '{
"url": "https://api.example.com/webhook",
"method": "POST",
"headers": {"Authorization": "Bearer xxx"},
"waitForResponse": true,
"timeoutMs": 30000
}' \
--json
omni providers create \
--name "Sofia Gateway" \
--schema openclaw \
--base-url ws://127.0.0.1:18789 \
--default-agent-id sofia \
--json
Save the returned provider ID for the next step.
# List existing instances
omni instances list --json | jq '.[] | {id, name, channelType, status}'
# Or create a new one
omni instances create --channel telegram --name "My Telegram Bot" --json
omni instances create --channel whatsapp --name "My WhatsApp" --json
For WhatsApp, scan the QR code:
omni instances qr <instance-id> --watch
omni instances update <instance-id> \
--agent-provider <provider-id> \
--json
Optional settings:
omni instances update <instance-id> \
--agent-provider <provider-id> \
--session-strategy per_chat \
--stream true \
--prefix-sender-name true \
--json
--session-strategy: per_chat (one session per conversation) or per_user (one per person)--stream: enable streaming responses--prefix-sender-name: prepend sender name to messages (useful in groups)Controls when the agent responds.
# Reply to everything (DMs + groups)
omni instances update <instance-id> \
--reply-filter-mode all \
--json
# Reply only to DMs, mentions, and replies
omni instances update <instance-id> \
--reply-filter-mode filtered \
--on-dm true \
--on-mention true \
--on-reply true \
--json
# Reply only when name patterns match (groups)
omni instances update <instance-id> \
--reply-filter-mode filtered \
--on-mention true \
--name-patterns "@bot,hey bot" \
--json
Override the instance default for specific chats or users:
# Route a specific chat to a different agent
omni routes create \
--instance <instance-id> \
--scope chat \
--chat <chat-id> \
--provider <other-provider-id> \
--agent <agent-id> \
--label "VIP Support" \
--priority 10 \
--json
# Route all conversations from a person
omni routes create \
--instance <instance-id> \
--scope user \
--person <person-id> \
--provider <provider-id> \
--agent <agent-id> \
--json
# Test which route resolves for a chat
omni routes test --instance <instance-id> --chat <chat-id> --json
Route priority: chat route > user route > instance default.
# Test provider health
omni providers test <provider-id> --json
# Send a test message to yourself
omni send --to <your-number-or-chat> \
--text "Testing agent setup" \
--instance <instance-id>
# Check events to see if message was routed
omni events list --instance <instance-id> --type message.received --limit 5 --json
# Check agent task events
omni events list --type agent.task.completed --limit 5 --json
End-to-end setup for a genie agent on Telegram:
# 1. Create provider
PROVIDER=$(omni providers create \
--name "Genie Team Lead" \
--schema genie \
--schema-config '{"agentName":"omni-telegram","targetAgent":"team-lead","teamName":"genie"}' \
--json | jq -r '.id')
# 2. Assign to existing Telegram instance
omni instances update <telegram-instance-id> \
--agent-provider $PROVIDER \
--json
# 3. Reply to DMs only
omni instances update <telegram-instance-id> \
--reply-filter-mode filtered \
--on-dm true \
--json
# 4. Test
omni providers test $PROVIDER --json
Messages flow: Telegram → Omni → ~/.claude/teams/genie/inboxes/team-lead.json → Agent reads from inbox → Agent replies via omni send.
| Symptom | Check |
|---|---|
| Agent not responding | omni providers test <id> — is provider healthy? |
| Agent responds to everything | Check reply filter: omni instances get <id> --json | jq '.agentReplyFilter' |
| Wrong agent answers | Check routes: omni routes test --instance <id> --chat <chat-id> |
| Messages not arriving | Check events: omni events list --instance <id> --type message.received --limit 5 |
| Provider create fails | Verify schema-config JSON matches the schema requirements |
omni send.schema-config will be rejected.--gate for LLM-based filtering.--json + jq for automation-safe parsing in agent workflows.