Telegram has evolved far beyond a simple messaging app into a powerful platform for automation, bot development, and AI integration. With over 800 million active users and a robust Bot API, Telegram offers developers an ideal environment for deploying sophisticated AI solutions. When combined with OpenClaw, an open-source AI agent framework that has gained over 60,000 GitHub stars, Telegram becomes a sophisticated multi-agent collaboration hub. This guide shows you how to build a powerful multi-agent collaboration system using OpenClaw on Telegram.
Unlike simple chatbots, OpenClaw enables multiple AI agents to work together with defined roles, shared memory, and coordinated task execution. Imagine a team where a Commander agent routes user requests, a Research agent gathers information, a Creative agent generates content, and a Support agent handles technical issues—all collaborating seamlessly within your Telegram bot.
Prerequisite: Before setting up your OpenClaw multi-agent system, you'll need a Telegram account and bot token. If you need help with Telegram registration or phone verification, check out our comprehensive guide: How to Register Telegram with SMS Verification Platform
What is OpenClaw Multi-Agent Collaboration?
Beyond Simple Telegram Bots
Traditional Telegram bots respond to commands individually. OpenClaw multi-agent systems operate as coordinated teams:
- Role-based specialization: Each agent has a specific purpose and expertise
- Shared context: Agents can access shared memory and conversation history
- Collaborative decision-making: Multiple agents can contribute to complex tasks
- Workflow orchestration: Tasks flow between agents based on requirements
- Cross-platform capability: Run simultaneously on Telegram, WhatsApp, Discord, and other platforms
Real-World Applications
Organizations are using OpenClaw multi-agent systems on Telegram for:
- Customer support: Tiered support with specialized agents handling different inquiry types
- Content creation: Multi-agent workflows for research, writing, and editing
- Technical support: Code debugging, system diagnostics, and technical documentation
- Community management: Content moderation, member onboarding, and event coordination
- E-commerce: Product recommendations, order tracking, and payment assistance
- Education: Tutoring systems, quiz generation, and personalized learning paths
- News aggregation: Multi-source information gathering and summarization
Architecture Overview
The Gateway-Agent Pattern
OpenClaw multi-agent systems typically follow this architecture:
┌─────────────────────────────────────────────────────────────┐
│ GATEWAY PROCESS │
│ (Unified message ingestion and routing) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ COMMANDER │ │ RESEARCH │ │ CREATIVE │
│ (Router) │ │ (Gatherer) │ │ (Generator) │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└─────────────────────┼─────────────────────┘
│
▼
┌──────────────┐
│ SUPPORT │
│ (Assistant) │
└──────────────┘
Key Components:
- Gateway: Central message router that distributes tasks to appropriate agents
- Agents: Specialized AI instances with defined roles and capabilities
- Memory Store: Shared or isolated context storage for agent communication
- Tool Registry: Available functions and APIs agents can invoke
- Telegram Integration: Telegram Bot API connection for message handling
Agent Role Examples
| Role | Responsibility | Example Tasks |
|---|---|---|
| Commander | Request routing and coordination | Analyze incoming messages, delegate to specialists, synthesize responses |
| Research | Information gathering | Search databases, fetch APIs, analyze documents |
| Creative | Content generation | Write articles, generate images, craft marketing copy |
| Support | User assistance | Answer FAQs, troubleshoot issues, provide guidance |
| Analyst | Data processing | Generate reports, analyze trends, provide insights |
Prerequisites
Before building your OpenClaw multi-agent system on Telegram, ensure you have:
- Telegram Account: A verified Telegram account (registration guide)
- Telegram Bot: A bot created via @BotFather with API token
- OpenClaw Installation: Python 3.9+ and OpenClaw framework installed
- API Keys: OpenAI API key or other LLM provider credentials
- Development Environment: Local or cloud environment for deployment
Creating Your Telegram Bot
- Open Telegram and search for @BotFather
- Start a chat and send
/newbot - Follow prompts to name your bot and choose a username
- Save the HTTP API Token provided by BotFather
- (Optional) Set bot commands with
/setcommands - (Optional) Configure bot description and about text
Step-by-Step Implementation
Step 1: Set Up Your Development Environment
# Create project directory
mkdir openclaw-telegram-agents
cd openclaw-telegram-agents
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install openclaw python-telegram-bot asyncio
# Create project structure
mkdir -p agents config logs
Required packages:
openclaw>=0.9.0
python-telegram-bot>=20.0
asyncio-mqtt>=0.13.0
python-dotenv>=1.0.0
redis>=4.5.0
Step 2: Configure Environment Variables
Create a .env file:
# Telegram Configuration
TELEGRAM_BOT_TOKEN=your_bot_token_here
TELEGRAM_WEBHOOK_URL=https://your-domain.com/webhook
# OpenAI Configuration
OPENAI_API_KEY=your_openai_api_key
OPENAI_MODEL=gpt-4
# Agent Configuration
AGENT_MEMORY_TYPE=redis
REDIS_URL=redis://localhost:6379/0
# Logging
LOG_LEVEL=INFO
LOG_FILE=logs/agent_system.log
Step 3: Define Agent Configuration
Create config/agents.yaml:
agents:
commander:
name: 'Commander'
role: 'orchestrator'
description: 'Routes requests to appropriate agents and coordinates responses'
model: 'gpt-4'
temperature: 0.3
system_prompt: |
You are the Commander agent. Your role is to:
1. Analyze incoming user requests
2. Determine which specialized agent(s) should handle the task
3. Coordinate multi-agent workflows when needed
4. Synthesize responses from multiple agents into coherent outputs
Available agents:
- Research: For information gathering and data retrieval
- Creative: For content generation and creative tasks
- Support: For technical assistance and troubleshooting
Always provide clear, actionable routing decisions.
research:
name: 'Research'
role: 'specialist'
description: 'Gathers information from various sources'
model: 'gpt-4'
temperature: 0.2
tools:
- web_search
- database_query
- document_analysis
system_prompt: |
You are the Research agent. Your role is to:
1. Search for relevant information using available tools
2. Analyze and synthesize findings
3. Provide accurate, well-sourced information
4. Note uncertainties and information gaps
Always cite your sources and indicate confidence levels.
creative:
name: 'Creative'
role: 'specialist'
description: 'Generates creative content and ideas'
model: 'gpt-4'
temperature: 0.8
system_prompt: |
You are the Creative agent. Your role is to:
1. Generate engaging, original content
2. Adapt tone and style to the audience
3. Provide multiple options when appropriate
4. Iterate based on feedback
Be creative but stay relevant to the user's needs.
support:
name: 'Support'
role: 'specialist'
description: 'Provides technical assistance and troubleshooting'
model: 'gpt-4'
temperature: 0.3
system_prompt: |
You are the Support agent. Your role is to:
1. Provide clear, step-by-step technical guidance
2. Troubleshoot common issues
3. Escalate complex problems appropriately
4. Document solutions for future reference
Always be patient, clear, and thorough.
workflows:
default:
- commander
research_task:
- commander
- research
- commander
creative_task:
- commander
- creative
- commander
complex_task:
- commander
- research
- creative
- commander
Step 4: Implement the Gateway Service
Create gateway.py:
"""
OpenClaw Multi-Agent Gateway for Telegram
Handles message routing and agent orchestration
"""
import os
import asyncio
import logging
from typing import Dict, List, Optional
from dataclasses import dataclass
from datetime import datetime
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from openclaw import Agent, AgentTeam, MemoryStore
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/gateway.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
@dataclass
class MessageContext:
"""Context for incoming messages"""
user_id: int
chat_id: int
message_id: int
text: str
timestamp: datetime
thread_id: Optional[str] = None
class AgentGateway:
"""
Central gateway for routing messages between Telegram and OpenClaw agents
"""
def __init__(self):
self.agent_team: Optional[AgentTeam] = None
self.memory_store: Optional[MemoryStore] = None
self.active_conversations: Dict[int, List[Dict]] = {}
self.telegram_app: Optional[Application] = None
async def initialize(self):
"""Initialize the gateway and load agents"""
logger.info("Initializing Agent Gateway...")
# Initialize memory store
self.memory_store = MemoryStore(
backend=os.getenv('AGENT_MEMORY_TYPE', 'redis'),
url=os.getenv('REDIS_URL', 'redis://localhost:6379/0')
)
await self.memory_store.connect()
# Initialize agent team from configuration
self.agent_team = AgentTeam.from_config('config/agents.yaml')
await self.agent_team.initialize()
# Initialize Telegram bot
self.telegram_app = Application.builder().token(
os.getenv('TELEGRAM_BOT_TOKEN')
).build()
# Register handlers
self._register_handlers()
logger.info("Agent Gateway initialized successfully")
def _register_handlers(self):
"""Register Telegram message handlers"""
# Command handlers
self.telegram_app.add_handler(CommandHandler("start", self._cmd_start))
self.telegram_app.add_handler(CommandHandler("help", self._cmd_help))
self.telegram_app.add_handler(CommandHandler("agents", self._cmd_list_agents))
self.telegram_app.add_handler(CommandHandler("status", self._cmd_status))
# Message handler
self.telegram_app.add_handler(
MessageHandler(filters.TEXT & ~filters.COMMAND, self._handle_message)
)
async def _cmd_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle /start command"""
welcome_msg = """
🤖 Welcome to the OpenClaw Multi-Agent System!
I'm an AI-powered assistant that uses multiple specialized agents to help you:
📊 **Research** - Gather information and analyze data
🎨 **Creative** - Generate content and creative ideas
🔧 **Support** - Technical assistance and troubleshooting
🎯 **Commander** - Orchestrates the team for complex tasks
Simply send me a message describing what you need, and I'll route your request to the appropriate agent(s).
Commands:
/agents - List available agents
/status - Check system status
/help - Show help information
How can I help you today?
"""
await update.message.reply_text(welcome_msg)
async def _cmd_help(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle /help command"""
help_msg = """
🤖 **OpenClaw Multi-Agent Bot Help**
**How to use:**
Simply type your request in natural language. Examples:
• "Research the latest trends in AI"
• "Write a marketing email for my product"
• "Help me debug this Python error"
• "Create a workout plan for beginners"
**Tips:**
- Be specific about what you need
- For complex tasks, the Commander will coordinate multiple agents
- Agents can remember context within a conversation
**Commands:**
/start - Welcome message
/agents - List all available agents
/status - System status and statistics
/help - Show this help message
Need a Telegram account? [Register here](/blog/how-to-register-telegram-with-sms-platform)
"""
await update.message.reply_text(help_msg)
async def _cmd_list_agents(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle /agents command"""
agents_info = "🤖 **Available Agents:**\n\n"
for agent_name, agent_config in self.agent_team.agents.items():
agents_info += f"**{agent_config['name']}**\n"
agents_info += f"Role: {agent_config['role']}\n"
agents_info += f"Description: {agent_config['description']}\n\n"
await update.message.reply_text(agents_info)
async def _cmd_status(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle /status command"""
status_msg = f"""
📊 **System Status**
🟢 Gateway: Online
🟢 Agent Team: {len(self.agent_team.agents)} agents loaded
🟢 Memory Store: Connected
Active conversations: {len(self.active_conversations)}
"""
await update.message.reply_text(status_msg)
async def _handle_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handle incoming messages and route to appropriate agents"""
# Create message context
msg_ctx = MessageContext(
user_id=update.effective_user.id,
chat_id=update.effective_chat.id,
message_id=update.message.message_id,
text=update.message.text,
timestamp=datetime.now()
)
# Show typing indicator
await context.bot.send_chat_action(
chat_id=msg_ctx.chat_id,
action='typing'
)
try:
# Route message through Commander agent
response = await self._route_to_agents(msg_ctx)
# Send response
await update.message.reply_text(response)
except Exception as e:
logger.error(f"Error processing message: {e}")
await update.message.reply_text(
"I apologize, but I encountered an error processing your request. "
"Please try again or contact support if the issue persists."
)
async def _route_to_agents(self, msg_ctx: MessageContext) -> str:
"""
Route message to appropriate agents and return response
"""
# Get or create conversation history
conversation_key = f"conv:{msg_ctx.user_id}:{msg_ctx.chat_id}"
history = await self.memory_store.get(conversation_key) or []
# Add user message to history
history.append({
'role': 'user',
'content': msg_ctx.text,
'timestamp': msg_ctx.timestamp.isoformat()
})
# Route through Commander agent for task analysis
commander = self.agent_team.get_agent('commander')
routing_decision = await commander.analyze(
message=msg_ctx.text,
history=history
)
# Execute workflow based on routing decision
if routing_decision.get('workflow'):
workflow = routing_decision['workflow']
response = await self.agent_team.execute_workflow(
workflow=workflow,
input_data={
'message': msg_ctx.text,
'history': history,
'user_id': msg_ctx.user_id
}
)
else:
# Single agent execution
target_agent = routing_decision.get('target_agent', 'commander')
agent = self.agent_team.get_agent(target_agent)
response = await agent.execute(
message=msg_ctx.text,
history=history
)
# Update conversation history
history.append({
'role': 'assistant',
'content': response,
'timestamp': datetime.now().isoformat()
})
# Trim history if too long (keep last 20 messages)
if len(history) > 20:
history = history[-20:]
await self.memory_store.set(conversation_key, history)
return response
async def run(self):
"""Run the gateway service"""
logger.info("Starting Agent Gateway...")
await self.telegram_app.initialize()
await self.telegram_app.start()
await self.telegram_app.updater.start_polling()
logger.info("Agent Gateway is running. Press Ctrl+C to stop.")
# Keep running until interrupted
try:
while True:
await asyncio.sleep(1)
except KeyboardInterrupt:
logger.info("Shutting down...")
finally:
await self.telegram_app.updater.stop()
await self.telegram_app.stop()
await self.telegram_app.shutdown()
await self.memory_store.disconnect()
if __name__ == '__main__':
gateway = AgentGateway()
asyncio.run(gateway.initialize())
asyncio.run(gateway.run())
Step 5: Create Agent Tool Registry
Create tools.py:
"""
Tool registry for OpenClaw agents
Defines available functions that agents can invoke
"""
import json
import aiohttp
from typing import Any, Dict, List
from datetime import datetime
class ToolRegistry:
"""Registry of available tools for agents"""
def __init__(self):
self.tools: Dict[str, callable] = {
'web_search': self.web_search,
'fetch_url': self.fetch_url,
'calculate': self.calculate,
'get_current_time': self.get_current_time,
'format_json': self.format_json,
}
async def web_search(self, query: str, num_results: int = 5) -> List[Dict]:
"""
Search the web for information
Note: This is a placeholder - integrate with your preferred search API
"""
# Implement with SerpAPI, Google Custom Search, or similar
return [{"title": "Example Result", "url": "https://example.com", "snippet": "..."}]
async def fetch_url(self, url: str) -> str:
"""Fetch content from a URL"""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def calculate(self, expression: str) -> float:
"""Evaluate a mathematical expression"""
try:
# Safe evaluation - only allow basic math operations
allowed_names = {
"abs": abs, "max": max, "min": min, "sum": sum,
"round": round, "pow": pow
}
return eval(expression, {"__builtins__": {}}, allowed_names)
except Exception as e:
return f"Error: {str(e)}"
async def get_current_time(self, timezone: str = "UTC") -> str:
"""Get current time in specified timezone"""
from datetime import datetime
import pytz
tz = pytz.timezone(timezone)
return datetime.now(tz).isoformat()
async def format_json(self, data: Any) -> str:
"""Format data as pretty-printed JSON"""
return json.dumps(data, indent=2, ensure_ascii=False)
def get_tool(self, name: str) -> callable:
"""Get a tool by name"""
return self.tools.get(name)
def list_tools(self) -> List[str]:
"""List all available tool names"""
return list(self.tools.keys())
Step 6: Create Deployment Script
Create deploy.py:
#!/usr/bin/env python3
"""
Deployment script for OpenClaw Telegram multi-agent system
"""
import os
import sys
import argparse
import subprocess
def check_prerequisites():
"""Check if all prerequisites are met"""
print("Checking prerequisites...")
# Check Python version
if sys.version_info < (3, 9):
print("❌ Python 3.9+ required")
return False
print("✅ Python version OK")
# Check environment variables
required_vars = ['TELEGRAM_BOT_TOKEN', 'OPENAI_API_KEY']
missing = [var for var in required_vars if not os.getenv(var)]
if missing:
print(f"❌ Missing environment variables: {', '.join(missing)}")
return False
print("✅ Environment variables OK")
# Check if Redis is available (optional)
try:
import redis
r = redis.from_url(os.getenv('REDIS_URL', 'redis://localhost:6379/0'))
r.ping()
print("✅ Redis connection OK")
except:
print("⚠️ Redis not available - will use in-memory storage")
return True
def setup_environment():
"""Set up the environment"""
print("\nSetting up environment...")
# Create necessary directories
os.makedirs('logs', exist_ok=True)
os.makedirs('config', exist_ok=True)
# Install dependencies
subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'])
print("✅ Environment setup complete")
def run_tests():
"""Run system tests"""
print("\nRunning tests...")
# Add your test suite here
print("✅ Tests passed")
def deploy_production():
"""Deploy to production"""
print("\nDeploying to production...")
# Add production deployment steps
print("✅ Deployment complete")
def main():
parser = argparse.ArgumentParser(description='Deploy OpenClaw Telegram Agent System')
parser.add_argument('--check', action='store_true', help='Check prerequisites only')
parser.add_argument('--setup', action='store_true', help='Set up environment')
parser.add_argument('--test', action='store_true', help='Run tests')
parser.add_argument('--production', action='store_true', help='Deploy to production')
args = parser.parse_args()
if args.check:
sys.exit(0 if check_prerequisites() else 1)
elif args.setup:
setup_environment()
elif args.test:
run_tests()
elif args.production:
if check_prerequisites():
deploy_production()
else:
sys.exit(1)
else:
# Default: check and setup
if check_prerequisites():
setup_environment()
print("\n🚀 Ready to start! Run: python gateway.py")
else:
sys.exit(1)
if __name__ == '__main__':
main()
Step 7: Run Your Multi-Agent System
# Check prerequisites
python deploy.py --check
# Set up environment
python deploy.py --setup
# Start the gateway
python gateway.py
Your bot should now be running and responding to messages on Telegram!
Advanced Configuration
Custom Agent Workflows
Define complex multi-step workflows:
workflows:
content_creation:
steps:
- agent: commander
action: analyze_request
- agent: research
action: gather_information
- agent: creative
action: generate_content
- agent: commander
action: review_and_deliver
technical_support:
steps:
- agent: commander
action: classify_issue
- agent: support
action: troubleshoot
- agent: engineer
action: provide_solution
condition: complexity == 'high'
Memory Management
Configure different memory backends:
# Redis (recommended for production)
memory = MemoryStore(backend='redis', url='redis://localhost:6379/0')
# In-memory (for development)
memory = MemoryStore(backend='memory')
# Persistent storage
memory = MemoryStore(backend='sqlite', path='data/memory.db')
Telegram Webhook Setup
For production, use webhooks instead of polling:
# In gateway.py, replace polling with webhook
await self.telegram_app.updater.start_webhook(
listen='0.0.0.0',
port=8443,
webhook_url=os.getenv('TELEGRAM_WEBHOOK_URL')
)
Troubleshooting
Bot Not Responding
- Verify bot token is correct
- Check that bot is not blocked by user
- Review logs in
logs/gateway.log
Agents Not Coordinating
- Check agent configuration in
config/agents.yaml - Verify memory store connection
- Review Commander agent routing logic
Rate Limiting
- Telegram Bot API has rate limits (30 messages/second)
- Implement message queuing for high-volume scenarios
- Use exponential backoff for retries
Best Practices
- Start Simple: Begin with 2-3 agents before expanding
- Monitor Costs: Track API usage to manage expenses
- Test Thoroughly: Use the
/statuscommand to verify agent health - Secure Tokens: Never commit API keys to version control
- Log Everything: Comprehensive logging aids debugging
- Iterate: Refine agent prompts based on real usage
Integration with USPhoneGen
For businesses managing multiple Telegram bots or requiring phone verification:
- Use USPhoneGen for Telegram account verification
- Deploy multiple bot instances with verified numbers
- Scale your multi-agent system across different Telegram accounts
Learn more: Telegram SMS Verification Guide
Conclusion
Building an OpenClaw multi-agent system on Telegram enables powerful AI-driven automation. By combining specialized agents with Telegram's extensive reach, you can create sophisticated solutions for customer support, content creation, technical assistance, and more.
Next Steps:
- Experiment with different agent configurations
- Add custom tools for your specific use case
- Monitor performance and optimize workflows
- Scale to additional platforms (WhatsApp, Discord)
Start building your AI agent team today!
