* feat: add non-interactive onboarding and SKILL.md Add agent-friendly setup flow: - lettabot onboard --non-interactive flag - Reads all config from environment variables - SKILL.md documents env-based setup for agents - Supports all channels (Telegram, Slack, Discord, WhatsApp, Signal) - No prompts - ideal for coding agents automating setup 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta <noreply@letta.com> * fix: address non-interactive setup issues - Add SLACK_APP_NAME for customizable app name (defaults to LETTA_AGENT_NAME or LettaBot) - Clarify WhatsApp requires WHATSAPP_ENABLED and WHATSAPP_SELF_CHAT to be explicit - Document all 5 channels supported (Telegram, Slack, Discord, WhatsApp, Signal) - Fix WhatsApp selfChat default to be explicit false * docs: recommend non-interactive setup as primary method Update README per review feedback to show env-based setup first. This is simpler for most users and ideal for automation. * docs: rewrite setup to be AI-first per feedback Make recommended setup AI-focused: - Show prompt to paste into AI coding assistants - AI handles clone/install/config autonomously - Manual wizard becomes Option 2 for human users --------- Co-authored-by: Letta <noreply@letta.com>
8.8 KiB
name, description
| name | description |
|---|---|
| lettabot | Set up and run LettaBot - a multi-channel AI assistant for Telegram, Slack, Discord, WhatsApp, and Signal. Supports both interactive wizard and non-interactive (agent-friendly) configuration. |
LettaBot Setup
Multi-channel AI assistant with persistent memory across Telegram, Slack, Discord, WhatsApp, and Signal.
Quick Setup (Agent-Friendly)
For non-interactive setup (ideal for coding agents):
# 1. Clone and install
git clone https://github.com/letta-ai/lettabot.git
cd lettabot
npm install
npm run build
npm link
# 2. Configure via environment variables
export LETTA_API_KEY="letta_..." # From app.letta.com
export LETTA_BASE_URL="https://api.letta.com" # Or self-hosted
export LETTA_AGENT_ID="agent-..." # Optional: use existing agent
# 3. Configure channel (example: Telegram)
export TELEGRAM_BOT_TOKEN="123456:ABC-DEF..." # From @BotFather
export TELEGRAM_DM_POLICY="pairing" # Optional: pairing | allowlist | open
# 4. Run non-interactive setup
lettabot onboard --non-interactive
# 5. Start the bot
lettabot server
Interactive Setup
For human-friendly setup with wizard:
lettabot onboard
The wizard will guide you through:
- Letta API authentication (OAuth or API key)
- Agent selection/creation
- Channel configuration (Telegram, Slack, Discord, WhatsApp, Signal)
Environment Variables
Required
| Variable | Description |
|---|---|
LETTA_API_KEY |
API key from app.letta.com (or skip for OAuth) |
LETTA_BASE_URL |
API endpoint (default: https://api.letta.com) |
Agent Selection
| Variable | Description |
|---|---|
LETTA_AGENT_ID |
Use existing agent (skip agent creation) |
LETTA_AGENT_NAME |
Name for new agent (default: "lettabot") |
LETTA_MODEL |
Model for new agent (default: "claude-sonnet-4") |
Telegram
| Variable | Description | Required |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Bot token from @BotFather | ✅ |
TELEGRAM_DM_POLICY |
Access control: pairing | allowlist | open |
❌ (default: pairing) |
TELEGRAM_ALLOWED_USERS |
Comma-separated user IDs (if dmPolicy=allowlist) | ❌ |
Slack (Socket Mode)
| Variable | Description | Required |
|---|---|---|
SLACK_BOT_TOKEN |
Bot User OAuth Token (xoxb-...) | ✅ |
SLACK_APP_TOKEN |
App-Level Token (xapp-...) for Socket Mode | ✅ |
SLACK_APP_NAME |
Custom app name (default: LETTA_AGENT_NAME or "LettaBot") | ❌ |
SLACK_DM_POLICY |
Access control: pairing | allowlist | open |
❌ (default: pairing) |
SLACK_ALLOWED_USERS |
Comma-separated Slack user IDs (if dmPolicy=allowlist) | ❌ |
Setup Slack app: See Slack Setup Wizard or run lettabot onboard for guided setup.
Discord
| Variable | Description | Required |
|---|---|---|
DISCORD_BOT_TOKEN |
Bot token from discord.com/developers/applications | ✅ |
DISCORD_DM_POLICY |
Access control: pairing | allowlist | open |
❌ (default: pairing) |
DISCORD_ALLOWED_USERS |
Comma-separated Discord user IDs (if dmPolicy=allowlist) | ❌ |
Setup Discord bot: See docs/discord-setup.md
| Variable | Description | Required |
|---|---|---|
WHATSAPP_ENABLED |
Enable WhatsApp: true | false |
✅ Must be explicit |
WHATSAPP_SELF_CHAT |
Self-chat mode: true (personal number) | false (dedicated bot number) |
✅ Must be explicit |
WHATSAPP_DM_POLICY |
Access control: pairing | allowlist | open |
❌ (default: pairing) |
WHATSAPP_ALLOWED_USERS |
Comma-separated phone numbers with + (if dmPolicy=allowlist) | ❌ |
Important:
WHATSAPP_SELF_CHAT=false(dedicated bot number): Responds to ALL incoming messagesWHATSAPP_SELF_CHAT=true(personal number): Only responds to "Message Yourself" chat- QR code appears on first run - scan with WhatsApp app
Signal
| Variable | Description | Required |
|---|---|---|
SIGNAL_PHONE_NUMBER |
Your phone number (with +) | ✅ |
SIGNAL_DM_POLICY |
Access control: pairing | allowlist | open |
❌ (default: pairing) |
SIGNAL_ALLOWED_USERS |
Comma-separated phone numbers with + (if dmPolicy=allowlist) | ❌ |
Setup: Requires Signal CLI - see signal-cli documentation.
Channel-Specific Setup
Telegram Bot Setup
- Message @BotFather on Telegram
- Send
/newbotand follow prompts - Copy the token (format:
123456:ABC-DEF...) - Set
TELEGRAM_BOT_TOKENenvironment variable
Slack App Setup (Interactive)
For Socket Mode (required for real-time messages):
lettabot onboard
# Select "Slack" → "Guided setup"
This uses a manifest to pre-configure:
- Socket Mode
- 5 bot scopes (app_mentions:read, chat:write, im:*)
- 2 event subscriptions (app_mention, message.im)
Slack App Setup (Manual)
- Go to api.slack.com/apps
- Create app from manifest (see
src/setup/slack-wizard.tsfor manifest YAML) - Install to workspace → copy Bot Token (
xoxb-...) - Enable Socket Mode → generate App Token (
xapp-...) - Set both tokens in environment
Access Control
Each channel supports three DM policies:
pairing(recommended): Users get a code, you approve vialettabot pairing approve <channel> <code>allowlist: Only specified user IDs can messageopen: Anyone can message (not recommended)
Configuration File
After onboarding, config is saved to ~/.config/lettabot/config.yaml:
server:
baseUrl: https://api.letta.com
apiKey: letta_...
agentId: agent-...
telegram:
enabled: true
botToken: 123456:ABC-DEF...
dmPolicy: pairing
slack:
enabled: true
botToken: xoxb-...
appToken: xapp-...
dmPolicy: pairing
Edit this file directly or re-run lettabot onboard to reconfigure.
Commands
# Setup
lettabot onboard # Interactive wizard
lettabot onboard --non-interactive # Env-based setup (agent-friendly)
# Run
lettabot server # Start bot server
# Manage
lettabot pairing list # List pending pairing requests
lettabot pairing approve <channel> <code> # Approve user
lettabot skills # Enable/disable skills
# Scheduling
lettabot cron list # List scheduled tasks
lettabot cron add "Daily standup at 9am" "0 9 * * *" # Add cron job
Troubleshooting
"Module not found" errors
Make sure you've run npm run build after installing or pulling updates.
Telegram bot not responding
- Check token is correct:
curl https://api.telegram.org/bot<TOKEN>/getMe - Ensure bot is started:
lettabot servershould show "Connected to Telegram" - Check access control: User may need pairing approval
Slack not receiving messages
- Verify Socket Mode is enabled in Slack app settings
- Check both tokens are set:
SLACK_BOT_TOKENandSLACK_APP_TOKEN - Ensure event subscriptions are configured (app_mention, message.im)
WhatsApp QR code not appearing
- Make sure Signal Desktop is closed (conflicts with baileys)
- Delete
~/.wwebjs_authif previously used different library - Check no other WhatsApp Web sessions are active
Example: Agent Setup Flow
For coding agents helping users set up LettaBot:
# 1. Clone and build
git clone https://github.com/letta-ai/lettabot.git
cd lettabot
npm install && npm run build && npm link
# 2. Get Letta API key
# Guide user to app.letta.com → API Keys → Create Key
# 3. Get Telegram bot token
# Guide user to @BotFather → /newbot → follow prompts
# 4. Set environment variables
export LETTA_API_KEY="letta_..."
export TELEGRAM_BOT_TOKEN="123456:ABC-DEF..."
# 5. Run non-interactive setup
lettabot onboard --non-interactive
# 6. Start server
lettabot server
The agent can verify success by checking:
lettabot serveroutput shows "Connected to Telegram"- Config file exists at
~/.config/lettabot/config.yaml - User can message bot on Telegram
Self-Hosted Letta
To use a self-hosted Letta server:
# Run Letta Docker
docker run -v ~/.letta/.persist/pgdata:/var/lib/postgresql/data \
-p 8283:8283 \
-e OPENAI_API_KEY="your_openai_api_key" \
letta/letta:latest
# Configure LettaBot
export LETTA_BASE_URL="http://localhost:8283"
export LETTA_API_KEY="sk-..." # From Letta admin panel
lettabot onboard --non-interactive
Skills Integration
LettaBot supports loading skills from:
- Clawdhub (clawdhub.com)
- skills.sh repositories
- Local
.skills/directory
# Install skill from Clawdhub
npx molthub@latest install sonoscli
# Connect to LettaBot
lettabot skills
# Space to toggle, Enter to confirm
# Skills will be available to agent