The model field in lettabot.yaml was redundant and misleading -- the model is configured on the Letta agent server-side, and lettabot shouldn't override it. Users were confused seeing a model in their startup log that didn't match the actual model being used. Changes: - Remove `model` from `LettaBotConfig.agent` (made optional for backward compat) - Remove `model` from `BotConfig` interface and `bot.ts` createAgent() calls - Remove `model` from `main.ts` config construction and startup log - Stop saving `model` to lettabot.yaml during onboarding - Stop mapping `agent.model` to `MODEL` env var in config/io.ts - Add `getAgentModel()` and `updateAgentModel()` to letta-api.ts - Add new `src/commands/model.ts` with three subcommands: - `lettabot model` - interactive model selector - `lettabot model show` - show current agent model - `lettabot model set <handle>` - set model directly - Wire up model command in cli.ts with help text - Update docs/configuration.md, lettabot.example.yaml, SKILL.md Model selection during `lettabot onboard` is preserved for new agent creation -- the selected model is passed to createAgent() but is NOT saved to the config file. Fixes #169 Co-authored-by: Cameron <cpfiffer@users.noreply.github.com>
LettaBot Documentation
LettaBot is a multi-channel AI assistant powered by Letta that provides persistent memory and local tool execution across Telegram, Slack, Discord, WhatsApp, and Signal.
Guides
- Getting Started - Installation and basic setup
- Self-Hosted Setup - Run with your own Letta server
- Configuration Reference - All config options
- Commands Reference - Bot commands reference
- Scheduling Tasks - Cron jobs and heartbeats
- Gmail Pub/Sub - Email notifications integration
- Railway Deployment - Deploy to Railway
- Releasing - How to create releases
Channel Setup
- Telegram Setup - BotFather token setup
- Slack Setup - Socket Mode configuration
- Discord Setup - Bot application setup
- WhatsApp Setup - Baileys/QR code setup
- Signal Setup - signal-cli daemon setup
Architecture
LettaBot uses a single agent with unified memory across all channels:
┌──────────────────────────────────────────────────────────────────────────┐
│ Your Server / Machine │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ ┌───────┐ │
│ │ Telegram │ │ Slack │ │ Discord │ │ WhatsApp │ │ Signal│ │
│ │ (grammY) │ │ (Socket) │ │ (Gateway) │ │(Baileys) │ │ (CLI) │ │
│ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ └────┬─────┘ └───┬───┘ │
│ │ │ │ │ │ │
│ └───────────────┴───────────────┴──────────────┴────────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ LettaBot Core │ │
│ │ (TypeScript) │ │
│ │ │ │
│ │ • Message Router │ │
│ │ • Session Mgmt │ │
│ │ • Heartbeat/Cron │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ Letta Code SDK │ │
│ │ (subprocess) │ │
│ │ │ │
│ │ Local Tools: │ │
│ │ • Read/Glob/Grep │ │
│ │ • Bash │ │
│ │ • web_search │ │
│ └─────────┬─────────┘ │
└────────────────────────────────────┼──────────────────────────────────────┘
│ Letta API
▼
┌──────────────────────────┐
│ Letta Server │
│ (api.letta.com or │
│ self-hosted Docker) │
│ │
│ • Agent Memory │
│ • LLM Inference │
│ • Conversation History │
└──────────────────────────┘
Key Features
- Multi-Channel - Chat across Telegram, Slack, Discord, WhatsApp, and Signal
- Unified Memory - Single agent remembers everything from all channels
- Persistent Memory - Conversations persist across days/weeks/months
- Local Tool Execution - Agent can search files, run commands on your machine
- Voice Messages - Automatic transcription via OpenAI Whisper
- Streaming Responses - Real-time message updates as the agent thinks
- Background Tasks - Heartbeats and cron jobs for proactive actions