/$$ /$$$$$$$$ /$$ /$$$$$$$ /$$
|__/| $$_____/| $$ | $$__ $$ | $$
/$$| $$ | $$ /$$$$$$ /$$ /$$ /$$ | $$ \ $$ /$$$$$$ /$$$$$$
| $$| $$$$$ | $$ /$$__ $$| $$ | $$ | $$ /$$$$$$| $$$$$$$ /$$__ $$|_ $$_/
| $$| $$__/ | $$| $$ \ $$| $$ | $$ | $$|______/| $$__ $$| $$ \ $$ | $$
| $$| $$ | $$| $$ | $$| $$ | $$ | $$ | $$ \ $$| $$ \ $$ | $$ /$$
| $$| $$ | $$| $$$$$$/| $$$$$/$$$$/ | $$$$$$$/| $$$$$$/ | $$$$/
|__/|__/ |__/ \______/ \_____/\___/ |_______/ \______/ \___/
English | 中文
Multi-Channel AI Assistant - A multi-platform messaging bot built on iflow CLI.
Extend the powerful AI capabilities of iflow to multiple communication platforms, making AI assistants accessible everywhere.
- 🔌 Multi-Channel Support - Telegram, Discord, Slack, Feishu, DingTalk, QQ, WhatsApp, Email, Mochat
- 🧠 AI-Powered - Built on iflow CLI, supporting multiple models (GLM-5, Kimi K2.5, MiniMax M2.5, etc.)
- 💾 Session Management - Automatic multi-user session management with conversation context support
- 📁 Workspace - Each bot instance has its own independent workspace and memory system
- 🔐 Access Control - Supports whitelist, mention trigger, and various other policies
- 🔄 Thinking Mode - Optional AI thinking process display
- ⚡ Streaming Output - Real-time streaming output support for Telegram and DingTalk AI Card
- 🚀 Stdio Mode - Direct communication with iflow via stdin/stdout for faster response
iflow-bot depends on iflow CLI. Please install it first:
# With Node.js 22+
npm i -g @iflow-ai/iflow-cli@latestiflow- After running iflow, select "Login with iFlow"
- CLI will automatically open browser to iFlow platform
- Complete registration/login and authorize iFlow CLI
- Return to terminal automatically and start using
Follow the prompts to complete the login process.
Option 1: pip install (Recommended)
pip install iflow-botAfter installation, you can use it directly:
iflow-bot --help
iflow-bot onboard
iflow-bot gateway startOption 2: Install from Source
# Clone repository
git clone https://github.com/your-repo/iflow-bot.git
cd iflow-bot
# Install dependencies (using uv)
uv sync# Create default config file (pip install)
iflow-bot onboard
# Or from source
uv run iflow-bot onboard
# Or manually
mkdir -p ~/.iflow-bot
cp config.example.json ~/.iflow-bot/config.jsonAfter pip install:
# Foreground (debug mode)
iflow-bot gateway run
# Background
iflow-bot gateway start
# Check status
iflow-bot status
# Stop service
iflow-bot gateway stopAfter source install:
# Foreground (debug mode)
uv run iflow-bot gateway run
# Background
uv run iflow-bot gateway start# Build image
docker build -t iflow-bot:latest .
# Prepare host config file
mkdir -p ./config
cp config/config.example.json ./config/config.jsonThen edit ./config/config.json to enable channels and tokens.
# Start with docker compose
docker compose up -d
# View logs
docker compose logs -f iflow-botConfiguration file located at ~/.iflow-bot/config.json
{
"driver": {
"mode": "stdio",
"iflow_path": "iflow",
"model": "minimax-m2.5",
"yolo": true,
"thinking": false,
"max_turns": 40,
"timeout": 600,
"workspace": "~/.iflow-bot/workspace",
"extra_args": []
},
"channels": {
"telegram": {
"enabled": true,
"token": "YOUR_BOT_TOKEN",
"allow_from": []
},
"discord": {
"enabled": false,
"token": "YOUR_BOT_TOKEN",
"allow_from": []
},
"slack": {
"enabled": false,
"bot_token": "xoxb-xxx",
"app_token": "xapp-xxx",
"allow_from": [],
"group_policy": "mention"
},
"feishu": {
"enabled": false,
"app_id": "cli_xxx",
"app_secret": "xxx",
"encrypt_key": "",
"verification_token": "",
"allow_from": []
},
"dingtalk": {
"enabled": false,
"client_id": "xxx",
"client_secret": "xxx",
"robot_code": "xxx",
"card_template_id": "xxx-xxx-xxx",
"card_template_key": "content",
"allow_from": []
},
"qq": {
"enabled": false,
"app_id": "xxx",
"secret": "xxx",
"allow_from": []
},
"whatsapp": {
"enabled": false,
"bridge_url": "http://localhost:3001",
"bridge_token": "",
"allow_from": []
},
"email": {
"enabled": false,
"consent_granted": false,
"imap_host": "imap.gmail.com",
"imap_port": 993,
"imap_username": "your@email.com",
"imap_password": "app_password",
"smtp_host": "smtp.gmail.com",
"smtp_port": 587,
"smtp_username": "your@email.com",
"smtp_password": "app_password",
"from_address": "your@email.com",
"allow_from": [],
"auto_reply_enabled": true
},
"mochat": {
"enabled": false,
"base_url": "https://mochat.io",
"socket_url": "https://mochat.io",
"socket_path": "/socket.io",
"claw_token": "xxx",
"agent_user_id": "",
"sessions": ["*"],
"panels": ["*"]
}
},
"messages": {
"new_conversation": "✨ New conversation started, previous context has been cleared."
},
"log_level": "INFO",
"log_file": ""
}| Parameter | Type | Default | Description |
|---|---|---|---|
mode |
string | "stdio" |
Communication mode: stdio (recommended), acp (WebSocket), cli (subprocess) |
iflow_path |
string | "iflow" |
iflow CLI path [keep default] |
model |
string | "minimax-m2.5" |
Default model (glm-5, kimi-k2.5, minimax-m2.5, etc.) |
yolo |
bool | true |
Auto-confirm mode |
thinking |
bool | false |
Show AI thinking process |
max_turns |
int | 40 |
Maximum conversation turns per session |
timeout |
int | 600 |
Timeout in seconds |
workspace |
string | ~/.iflow-bot/workspace |
Workspace path |
extra_args |
list | [] |
Additional iflow arguments |
acp_port |
int | 8090 |
Port for ACP mode |
acp_host |
string | "localhost" |
Host for ACP mode |
Stdio Mode (⭐ Recommended):
- Direct communication with iflow via stdin/stdout
- No need to start WebSocket service, faster startup
- Real-time streaming output, typewriter effect
- Lower response latency, close to native experience
- Gateway automatically executes
iflow --experimental-acp --streamon startup
ACP Mode (WebSocket):
- Communication with iflow via WebSocket
- Requires starting WebSocket server [auto-started]
- Real-time streaming output support
- Suitable for scenarios requiring remote connection
CLI Mode:
- Call iflow CLI via subprocess
- Each conversation starts independent process
- Suitable for simple scenarios or debugging
{
"driver": {
"mode": "stdio",
"model": "minimax-m2.5",
"thinking": false,
"yolo": true
}
}{
"telegram": {
"enabled": true,
"token": "YOUR_BOT_TOKEN",
"allow_from": ["user_id_1", "user_id_2"]
}
}- Create bot at @BotFather to get Token
- Empty
allow_fromallows all users
{
"discord": {
"enabled": true,
"token": "YOUR_BOT_TOKEN",
"allow_from": ["user_id_1"]
}
}- Create application at Discord Developer Portal
- Create Bot user and get Token
- Enable Message Content Intent
{
"slack": {
"enabled": true,
"bot_token": "xoxb-xxx",
"app_token": "xapp-xxx",
"allow_from": [],
"group_policy": "mention"
}
}- Create application at Slack API
- Create Bot and get Bot Token (
xoxb-xxx) - Enable Socket Mode to get App Token (
xapp-xxx) group_policycontrols channel message response strategy:mention: Only respond to @mentionsopen: Respond to all messagesallowlist: Only respond to whitelisted channels
{
"feishu": {
"enabled": true,
"app_id": "cli_xxx",
"app_secret": "xxx",
"encrypt_key": "",
"verification_token": "",
"allow_from": []
}
}- Create enterprise self-built app at Feishu Open Platform
- Enable bot capability
- Configure event subscription (uses WebSocket, no public IP required)
{
"dingtalk": {
"enabled": true,
"client_id": "xxx",
"client_secret": "xxx",
"robot_code": "xxx",
"card_template_id": "xxx-xxx-xxx",
"card_template_key": "content",
"allow_from": []
}
}- Create bot at DingTalk Open Platform
- Get Client ID and Client Secret
- Enable Stream Mode (no public IP required)
AI Card Streaming Output Configuration (optional, for typewriter effect):
| Parameter | Description |
|---|---|
robot_code |
Robot code, required for group chats |
card_template_id |
AI Card template ID, create in DingTalk developer console |
card_template_key |
Template content field name, default content |
Create AI Card Template:
- Login to DingTalk Developer Console
- Go to "Card Platform" → "Card Templates"
- Create template, add a "Text" type field
- Record template ID and field name, configure in
card_template_idandcard_template_key
Streaming Output Effect:
- Bot immediately replies with a blank card after user sends message
- Card content updates in real-time, typewriter effect
- No need to wait for complete response, smoother experience
{
"qq": {
"enabled": true,
"app_id": "xxx",
"secret": "xxx",
"allow_from": []
}
}- Create bot at QQ Open Platform
- Get App ID and Secret
{
"whatsapp": {
"enabled": true,
"bridge_url": "http://localhost:3001",
"bridge_token": "",
"allow_from": []
}
}Requires deploying WhatsApp Bridge (based on baileys)
{
"email": {
"enabled": true,
"consent_granted": true,
"imap_host": "imap.gmail.com",
"imap_port": 993,
"imap_username": "your@email.com",
"imap_password": "app_password",
"smtp_host": "smtp.gmail.com",
"smtp_port": 587,
"smtp_username": "your@email.com",
"smtp_password": "app_password",
"from_address": "your@email.com",
"allow_from": ["sender@example.com"],
"auto_reply_enabled": true
}
}Important: Using Gmail requires creating an App Password
{
"mochat": {
"enabled": true,
"base_url": "https://mochat.io",
"socket_url": "https://mochat.io",
"socket_path": "/socket.io",
"claw_token": "xxx",
"agent_user_id": "",
"sessions": ["*"],
"panels": ["*"]
}
}# Show version
iflow-bot version
iflow-bot -v
# Show help
iflow-bot --help
# Check status
iflow-bot status
# Initialize config
iflow-bot onboard [--force]
# Start web console
iflow-bot console --host 127.0.0.1 --port 8787
# Optional access token
iflow-bot console --token your_token# Start service in background
iflow-bot gateway start
# Run in foreground (debug mode)
iflow-bot gateway run
# Stop service
iflow-bot gateway stop
# Restart service
iflow-bot gateway restart# Show config
iflow-bot config --show
# Edit config
iflow-bot config -e
# Switch model
iflow-bot model glm-5
iflow-bot model kimi-k2.5
iflow-bot model minimax-m2.5
# Thinking mode
iflow-bot thinking on
iflow-bot thinking off# List all sessions
iflow-bot sessions
# Filter by channel
iflow-bot sessions --channel telegram
# Filter by chat ID
iflow-bot sessions --chat-id 123456
# Clear session mappings
iflow-bot sessions --clear# List tasks
iflow-bot cron list [-a]
# Add interval task
iflow-bot cron add -n "Water reminder" -m "Time to drink water!" -e 300 -d --channel telegram --to "123456"
# Add one-time task
iflow-bot cron add -n "Meeting reminder" -m "Meeting time!" -a "2024-12-25T10:00:00" -d --channel telegram --to "123456"
# Add cron expression task
iflow-bot cron add -n "Morning report" -m "Send morning report" -c "0 9 * * *" -d --channel telegram --to "123456"
# Enable/disable task
iflow-bot cron enable <id>
iflow-bot cron disable <id>
# Run task immediately
iflow-bot cron run <id>
# Remove task
iflow-bot cron remove <id># iflow basic passthrough
iflow-bot iflow --help
iflow-bot iflow -p "hello"
# MCP commands
iflow-bot mcp --help
# Agent commands
iflow-bot agent --help
# Workflow commands
iflow-bot workflow --help
# Skill commands
iflow-bot skill --help
# Commands
iflow-bot commands --helpThese commands are sent inside your chat app (Telegram/Feishu/DingTalk/etc.):
/status
/new
/compact
/help
/cron list
/cron add --name <name> --message <text> (--every <sec> | --cron "<expr>" | --at "<iso-datetime>") [--tz <tz>] [--channel <channel>] [--to <chat_id>] [--deliver true|false]
/cron delete <id>
/model set <name>
/language <en-US|zh-CN>
/skills find <keyword>
/skills add <slug>
/skills list
/skills remove <slug>
/skills update
/ralph "<prompt>"
/ralph answer <text>
/ralph approve
/ralph status
/ralph stop
/ralph resume
/status
- Shows adapter mode, current model, streaming state, language, workspace path, stdio session id, estimated context tokens, and compaction count.
/new
- Starts a fresh conversation and clears prior runtime session context.
/compact
- Manually compacts the current stdio session.
/cron
list: show all jobs.add: if--channeland--toare omitted in chat, the bot auto-fills the current channel and chat id and defaults--deliver true.delete: remove a job by id.
/model set <name>
- Persists the new default model. It applies to new sessions.
/language <en-US|zh-CN>
- Persists the chat language in
workspace/.iflow/settings.json. - System replies and command output follow this language.
/skills
- Uses SkillHub CLI.
addinstalls intoworkspace/skillsand then syncs installed skills into~/.iflow/skills.removeremoves the skill from both locations.- If SkillHub CLI is missing, the bot attempts automatic installation first.
/ralph is a reviewed long-task loop. It does not execute immediately after prompt creation.
/ralph "<prompt>"- Creates a Ralph run.
- Asks clarifying questions first when needed.
/ralph answer <text>- Sends your clarification answers.
- Accepts either compact choices such as
1A 2B 3Aor normal free text. - The bot generates
prd.jsonand a markdown PRD preview.
- Review the full PRD output in chat and the saved files.
/ralph approve- Starts execution only after approval.
/ralph status- Shows current run status, run id, current story/pass, story id, subagent role, and current phase.
- While running, the status includes the active subagent role and phase, for example
engineerplusexecutingorrecovery.
/ralph stop- Stops the current run and cancels the active Ralph subagent session.
/ralph resume- Resumes the latest unfinished run from its last saved state.
Ralph behavior:
- Only one Ralph run can execute at a time in the same chat.
- A gateway restart auto-resumes unfinished Ralph runs in that chat.
- Ralph uses a dedicated stdio adapter so ordinary chat commands such as
/helpand/statusremain available during execution. - Ordinary chat stays responsive while Ralph is running. In Feishu E2E,
/ralph statusand a normal chat message both received replies during execution. - Each run is persisted under
~/.iflow-bot/workspace/ralph/<chat_id>/<run_id>/, and project files are written only to the output path required by the approved prompt. - PRD preview is split into multiple chat messages when needed instead of truncating the content.
/skills uses SkillHub CLI. If it is missing, the bot will auto-install it.
You can also install it manually:
curl -fsSL https://skillhub-1388575217.cos.ap-guangzhou.myqcloud.com/install/install.sh | bash -s -- --cli-only~/.iflow-bot/
├── config.json # Bot config
├── gateway.log # Gateway log
├── gateway.pid # PID file in daemon mode
├── botpy.log # QQ SDK log (when enabled)
├── data/
│ ├── cron/
│ │ └── jobs.json # Cron jobs
│ ├── media/ # Downloaded media cache
│ └── sessions/ # Session metadata cache
└── workspace/
├── .iflow/
│ └── settings.json # Per-workspace language and iflow settings
├── AGENTS.md # Agent instructions
├── BOOTSTRAP.md # First-run bootstrap file (optional)
├── HEARTBEAT.md # Heartbeat prompt (optional)
├── IDENTITY.md # Identity prompt (optional)
├── SOUL.md # Persona prompt (optional)
├── TOOLS.md # Tool policy prompt (optional)
├── USER.md # User profile prompt (optional)
├── channel/
│ └── <channel>/<chat>-<date>.json # Chat recorder output
├── images/ # Inbound images downloaded before calling iflow
├── memory/
│ └── MEMORY.md # Long-term memory
├── project/ # Ralph target project output directory
├── ralph/
│ └── <chat_id>/<run_id>/ # Ralph PRD/state/progress files
└── skills/ # Installed skills, synced to ~/.iflow/skills
workspace/skills is the source of truth for installed skills.
The bot syncs it into the iflow CLI skills directory (~/.iflow/skills on Linux) so subagents can load the same skills.
iflow-bot supports real-time streaming output, allowing users to see AI "typing".
Channels with Streaming Support:
| Channel | Method | Description |
|---|---|---|
| Telegram | Edit message | Real-time message content editing |
| DingTalk | AI Card | Streaming update using DingTalk card template |
| Discord | Edit message | Real-time message content editing (planned) |
| Slack | Edit message | Real-time message content editing (planned) |
Configuration Requirements:
- Use Stdio mode (
driver.mode = "stdio") or ACP mode (driver.mode = "acp") - DingTalk requires additional AI Card template configuration
Streaming Output Buffer Mechanism:
- Push update when content accumulates 10-25 characters (random)
- Avoid overly frequent API calls
- Ensure final message contains all content
iflow-bot automatically manages multi-user sessions with cross-channel conversation context support.
Session Mapping Storage:
- Location:
~/.iflow-bot/session_mappings.json - Format:
{channel}:{chat_id} -> {sessionId}
Session Recovery Mechanism:
- Automatically restore sessions after Gateway restart
- Create new session when session expires
- Support session management via CLI
# View all sessions
iflow-bot sessions
# Clear session mappings
iflow-bot sessions --cleariflow-bot/
├── iflow_bot/
│ ├── __init__.py
│ ├── __main__.py # Entry point
│ ├── bus/ # Message bus
│ │ ├── events.py # Event definitions
│ │ └── queue.py # Message queue
│ ├── channels/ # Channel implementations
│ │ ├── base.py # Base class
│ │ ├── telegram.py
│ │ ├── discord.py
│ │ ├── slack.py
│ │ ├── feishu.py
│ │ ├── dingtalk.py
│ │ ├── qq.py
│ │ ├── whatsapp.py
│ │ ├── email.py
│ │ ├── mochat.py
│ │ └── manager.py # Channel manager
│ ├── cli/ # CLI commands
│ │ └── commands.py
│ ├── config/ # Configuration management
│ │ ├── schema.py # Configuration model
│ │ └── loader.py
│ ├── cron/ # Scheduled tasks
│ │ ├── service.py
│ │ └── types.py
│ ├── engine/ # Core engine
│ │ ├── adapter.py # iflow adapter
│ │ ├── acp.py # ACP mode (WebSocket)
│ │ ├── stdio_acp.py # Stdio mode
│ │ └── loop.py # Message loop
│ ├── heartbeat/ # Heartbeat service
│ │ └── service.py
│ ├── session/ # Session management
│ │ └── manager.py
│ ├── templates/ # Template files
│ │ ├── AGENTS.md
│ │ ├── SOUL.md
│ │ └── ...
│ └── utils/ # Utility functions
│ └── helpers.py
├── tests/
├── pyproject.toml
└── README.md
Workspace contains AI's "personality" and memory:
- SOUL.md - Defines AI's core personality and behavior guidelines
- USER.md - User information and preferences
- AGENTS.md - Workspace behavior guide
- TOOLS.md - Available tools and configuration
- MEMORY.md - Long-term memory (important events, decisions)
- memory/YYYY-MM-DD.md - Daily memory logs
Issues and Pull Requests are welcome!
MIT

