208 lines
6.4 KiB
Markdown
208 lines
6.4 KiB
Markdown
# 🐈 Nanobot — Architecture & How It Works
|
|
|
|
> **Ultra-Lightweight Personal AI Assistant** — ~4,000 lines of Python, 99% smaller than OpenClaw.
|
|
|
|
## Overview
|
|
|
|
Nanobot is a minimalist personal AI assistant written in Python that focuses on delivering core agent functionality with the smallest possible codebase. It uses LiteLLM for multi-provider LLM routing, supports 9+ chat channels, and includes memory, skills, scheduled tasks, and MCP tool integration.
|
|
|
|
| Attribute | Value |
|
|
|-----------|-------|
|
|
| **Language** | Python 3.11+ |
|
|
| **Lines of Code** | ~4,000 (core agent) |
|
|
| **Config** | `~/.nanobot/config.json` |
|
|
| **Package** | `pip install nanobot-ai` |
|
|
| **LLM Routing** | LiteLLM (multi-provider) |
|
|
|
|
---
|
|
|
|
## Architecture Flowchart
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph Channels["📱 Chat Channels"]
|
|
TG["Telegram"]
|
|
DC["Discord"]
|
|
WA["WhatsApp"]
|
|
FS["Feishu"]
|
|
MC["Mochat"]
|
|
DT["DingTalk"]
|
|
SL["Slack"]
|
|
EM["Email"]
|
|
QQ["QQ"]
|
|
end
|
|
|
|
subgraph Gateway["🌐 Gateway (nanobot gateway)"]
|
|
CH["Channel Manager"]
|
|
MQ["Message Queue"]
|
|
end
|
|
|
|
subgraph Agent["🧠 Core Agent"]
|
|
LOOP["Agent Loop\n(loop.py)"]
|
|
CTX["Context Builder\n(context.py)"]
|
|
MEM["Memory System\n(memory.py)"]
|
|
SK["Skills Loader\n(skills.py)"]
|
|
SA["Subagent\n(subagent.py)"]
|
|
end
|
|
|
|
subgraph Tools["🔧 Built-in Tools"]
|
|
SHELL["Shell Exec"]
|
|
FILE["File R/W/Edit"]
|
|
WEB["Web Search"]
|
|
SPAWN["Spawn Subagent"]
|
|
MCP["MCP Servers"]
|
|
end
|
|
|
|
subgraph Providers["☁️ LLM Providers (LiteLLM)"]
|
|
OR["OpenRouter"]
|
|
AN["Anthropic"]
|
|
OA["OpenAI"]
|
|
DS["DeepSeek"]
|
|
GR["Groq"]
|
|
GE["Gemini"]
|
|
VL["vLLM (local)"]
|
|
end
|
|
|
|
Channels --> Gateway
|
|
Gateway --> Agent
|
|
CTX --> LOOP
|
|
MEM --> CTX
|
|
SK --> CTX
|
|
LOOP --> Tools
|
|
LOOP --> Providers
|
|
SA --> LOOP
|
|
```
|
|
|
|
---
|
|
|
|
## Message Flow
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant User
|
|
participant Channel as Chat Channel
|
|
participant GW as Gateway
|
|
participant Agent as Agent Loop
|
|
participant LLM as LLM Provider
|
|
participant Tools as Tools
|
|
|
|
User->>Channel: Send message
|
|
Channel->>GW: Forward message
|
|
GW->>Agent: Route to agent
|
|
Agent->>Agent: Build context (memory, skills, identity)
|
|
Agent->>LLM: Send prompt + tools
|
|
LLM-->>Agent: Response (text or tool call)
|
|
|
|
alt Tool Call
|
|
Agent->>Tools: Execute tool
|
|
Tools-->>Agent: Tool result
|
|
Agent->>LLM: Send tool result
|
|
LLM-->>Agent: Final response
|
|
end
|
|
|
|
Agent->>Agent: Update memory
|
|
Agent-->>GW: Return response
|
|
GW-->>Channel: Send reply
|
|
Channel-->>User: Display response
|
|
```
|
|
|
|
---
|
|
|
|
## Key Components
|
|
|
|
### 1. Agent Loop (`agent/loop.py`)
|
|
The core loop that manages the LLM ↔ tool execution cycle:
|
|
- Builds a prompt using context (memory, skills, identity files)
|
|
- Sends to LLM via LiteLLM
|
|
- If LLM returns a tool call → executes it → sends result back
|
|
- Continues until LLM returns a text response (no more tool calls)
|
|
|
|
### 2. Context Builder (`agent/context.py`)
|
|
Assembles the system prompt from:
|
|
- **Identity files**: `AGENTS.md`, `SOUL.md`, `USER.md`, `TOOLS.md`, `IDENTITY.md`
|
|
- **Memory**: Persistent `MEMORY.md` with recall
|
|
- **Skills**: Loaded from `~/.nanobot/workspace/skills/`
|
|
- **Conversation history**: Session-based context
|
|
|
|
### 3. Memory System (`agent/memory.py`)
|
|
- Persistent memory stored in `MEMORY.md` in the workspace
|
|
- Agent can read and write memories
|
|
- Survives across sessions
|
|
|
|
### 4. Provider Registry (`providers/registry.py`)
|
|
- Single-source-of-truth for all LLM providers
|
|
- Adding a new provider = 2 steps (add `ProviderSpec` + config field)
|
|
- Auto-prefixes model names for LiteLLM routing
|
|
- Supports 12+ providers including local vLLM
|
|
|
|
### 5. Channel System (`channels/`)
|
|
- 9 chat platforms supported (Telegram, Discord, WhatsApp, Feishu, Mochat, DingTalk, Slack, Email, QQ)
|
|
- Each channel handles auth, message parsing, and response delivery
|
|
- Allowlist-based security (`allowFrom`)
|
|
- Started via `nanobot gateway`
|
|
|
|
### 6. Skills (`skills/`)
|
|
- Bundled skills: GitHub, weather, tmux, etc.
|
|
- Custom skills loaded from workspace
|
|
- Skills are injected into the agent's context
|
|
|
|
### 7. Scheduled Tasks (Cron)
|
|
- Add jobs via `nanobot cron add`
|
|
- Supports cron expressions and interval-based scheduling
|
|
- Jobs stored persistently
|
|
|
|
### 8. MCP Integration
|
|
- Supports Model Context Protocol servers
|
|
- Stdio and HTTP transport modes
|
|
- Compatible with Claude Desktop / Cursor MCP configs
|
|
- Tools auto-discovered and registered at startup
|
|
|
|
---
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
nanobot/
|
|
├── agent/ # 🧠 Core agent logic
|
|
│ ├── loop.py # Agent loop (LLM ↔ tool execution)
|
|
│ ├── context.py # Prompt builder
|
|
│ ├── memory.py # Persistent memory
|
|
│ ├── skills.py # Skills loader
|
|
│ ├── subagent.py # Background task execution
|
|
│ └── tools/ # Built-in tools (incl. spawn)
|
|
├── skills/ # 🎯 Bundled skills (github, weather, tmux...)
|
|
├── channels/ # 📱 Chat channel integrations
|
|
├── providers/ # ☁️ LLM provider registry
|
|
├── config/ # ⚙️ Configuration schema
|
|
├── cron/ # ⏰ Scheduled tasks
|
|
├── heartbeat/ # 💓 Heartbeat system
|
|
├── session/ # 📝 Session management
|
|
├── bus/ # 📨 Internal event bus
|
|
├── cli/ # 🖥️ CLI commands
|
|
└── utils/ # 🔧 Utilities
|
|
```
|
|
|
|
---
|
|
|
|
## CLI Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `nanobot onboard` | Initialize config & workspace |
|
|
| `nanobot agent -m "..."` | Chat with the agent |
|
|
| `nanobot agent` | Interactive chat mode |
|
|
| `nanobot gateway` | Start all channels |
|
|
| `nanobot status` | Show status |
|
|
| `nanobot cron add/list/remove` | Manage scheduled tasks |
|
|
| `nanobot channels login` | Link WhatsApp device |
|
|
|
|
---
|
|
|
|
## Key Design Decisions
|
|
|
|
1. **LiteLLM for provider abstraction** — One interface for all LLM providers
|
|
2. **JSON config over env vars** — Single `config.json` file for all settings
|
|
3. **Skills-based extensibility** — Modular skill system for adding capabilities
|
|
4. **Provider Registry pattern** — Adding providers is 2-step, zero if-elif chains
|
|
5. **Agent social network** — Can join MoltBook, ClawdChat communities
|