mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-19 16:12:30 +00:00
Add CLAUDE.md at the repository root to orient future Claude Code
instances, and split detailed constraints into .agent/:
- .agent/design.md — architectural constraints (core small, duplication
over abstraction, minimal changes, explicit over magical)
- .agent/security.md — workspace/SSRF/shell sandbox boundaries
- .agent/gotchas.md — config ${VAR}, Windows compat, templates,
heartbeat virtual tool call, atomic writes, ruff format warning,
skills extension point
Also updates .gitignore to not ignore .agent/.
4.1 KiB
4.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
nanobot is a lightweight, open-source AI agent framework written in Python with a React/TypeScript WebUI. It centers around a small agent loop that receives messages from chat channels, invokes an LLM provider, executes tools, and manages session memory.
Development Commands
# Python: run single test / lint
pytest tests/test_openai_api.py::test_function -v
ruff check nanobot/
# WebUI: dev server (proxies API/WS to gateway :8765), build, test
# Build outputs to ../nanobot/web/dist (bundled into the Python wheel)
cd webui && bun run dev # or NANOBOT_API_URL=... bun run dev
cd webui && bun run build
cd webui && bun run test
# Gateway
nanobot gateway
High-Level Architecture
Core Data Flow
Messages flow through an async MessageBus (nanobot/bus/queue.py) that decouples chat channels from the agent core:
- Channels (
nanobot/channels/) receive messages from external platforms and publishInboundMessageevents to the bus. AgentLoop(nanobot/agent/loop.py) consumes inbound messages, builds context, and coordinates the turn.AgentRunner(nanobot/agent/runner.py) handles the actual LLM conversation loop: send messages to the provider, receive tool calls, execute tools, and stream responses.- Responses are published as
OutboundMessageevents back to the appropriate channel.
Key Subsystems
- Agent Loop (
nanobot/agent/loop.py,runner.py): The core processing engine.AgentLoopmanages session keys, hooks, and context building.AgentRunnerexecutes the multi-turn LLM conversation with tool execution. - LLM Providers (
nanobot/providers/): Provider implementations (Anthropic, OpenAI-compatible, Azure, GitHub Copilot, etc.) built on a common base (base.py).factory.pyandregistry.pyhandle instantiation and model discovery. - Channels (
nanobot/channels/): Platform integrations (Telegram, Discord, Slack, Feishu, Matrix, WhatsApp, QQ, WeChat, WebSocket, etc.).manager.pydiscovers and coordinates them. Channels are auto-discovered viapkgutilscan + entry-point plugins. - Tools (
nanobot/agent/tools/): Agent capabilities exposed to the LLM: filesystem (read/write/edit/list), shell execution, web search/fetch, MCP servers, cron, notebook editing, subagent spawning, andMyToolfor self-modification. - Memory (
nanobot/agent/memory.py): Session history persistence with Dream two-phase memory consolidation. Uses atomic writes with fsync for durability. - Session Management (
nanobot/session/manager.py): Per-session history, context compaction, and TTL-based auto-compaction. - Config (
nanobot/config/schema.py,loader.py): Pydantic-based configuration loaded from~/.nanobot/config.json. Supports camelCase aliases for JSON compatibility. - Bridge (
bridge/): TypeScript services (e.g. WhatsApp bridge) bundled into the wheel viapyproject.tomlforce-include. - WebUI (
webui/): Vite-based React SPA that talks to the gateway over a WebSocket multiplex protocol. The dev server proxies/api,/webui,/auth, and WebSocket traffic to the gateway.
Entry Points
- CLI:
nanobot/cli/commands.py - Python SDK:
nanobot/nanobot.py
Project-Specific Notes
- Architecture constraints:
.agent/design.md - Security boundaries:
.agent/security.md - Common gotchas:
.agent/gotchas.md
Branching Strategy
See CONTRIBUTING.md for the full two-branch model (main vs nightly) and PR guidelines.
Code Style
- Python 3.11+, asyncio throughout.
- Line length: 100.
- Linting:
ruffwith rules E, F, I, N, W (E501 ignored). - pytest with
asyncio_mode = "auto".
Common File Locations
- Config schema:
nanobot/config/schema.py - Provider base / new provider template:
nanobot/providers/base.py - Channel base / new channel template:
nanobot/channels/base.py - Tool registry:
nanobot/agent/tools/registry.py - WebUI dev proxy config:
webui/vite.config.ts - Tests mirror the
nanobot/package structure.