
人们正在使用 OpenClaw (Clawdbot) 构建 Polymarket 机器人、多代理产品团队、编码代理、商业运营商,它们全天候运行。
这是许多构建者有过的最令人信服的"代理是真实的"时刻。您可以获得 工具调用、长期记忆、基于 cron 的唤醒 ,以及 多代理协调,感觉就像您机器上住着一个小团队。
如果您读过我的早期分析,您已经知道这个模式:强大的代理框架快速积累复杂性,而复杂性是配置错误滋生的根源。
随着时间的推移,您会积累超出您管理能力的技术债务,特别是在基于自主代理的系统上。
这就是为什么轻量级和简单的框架长期胜出的原因。
您最终需要更小的东西,包含一个您可以实际审计的核心工具层,一个您可以推理的工具层,以及一个不会变成数据沼泽的内存模型,这值得一看。
如果只有 4000 行 Python 代码且比 OpenClaw 小 99%,您可以获得以下功能:
- 带有子代理的模块化代理架构
- 快速启动和低资源消耗
- 持久记忆和技能加载系统
- 基于 CLI 的入职和聊天
- 多提供商 LLM 支持
- 可选的 Web 搜索和计划任务
- 聊天频道(Telegram/WhatsApp)
无论框架如何,我想首先解释那些让个人代理感觉"活着"而无需继承 Clawdbot 规模面积的架构模式。
然后我将带您了解您今天可以开始实验的功能和功能,您还将看到与 OpenClaw 的差异以及使其强大且安全的工程模式。
最后,我还将为您提供应该牢记的安全指南。
1、轻量级框架的模式
开发者经常使用某些设计模式来通过专注于必需的组件来保持代理框架小巧:
- 消息总线和代理循环:
AgentLoop监听入站消息(来自 CLI 或聊天频道),通过组合系统提示、记忆和技能来构建上下文,并调用所选的 LLM。 - 上下文构建器:
ContextBuilder将系统提示、记忆和技能组合成单个提示。它明确描述了代理的身份、当前时间、工作区路径和可用工具。构建器 progressive 加载技能和记忆以保持在模型上下文限制内。 - 工具注册表: 注册文件操作(读取、写入、编辑、列表)、shell 执行、Web 搜索、Web 获取、发送消息和生成子代理。每个工具定义了一个 JSON 模式,以便 LLM 知道如何调用它。
- 内存存储: 将每日笔记和长期记忆持久化到工作区下的 markdown 文件中。内存存储提供附加到今天的笔记、读取长期记忆和组合最近记忆的方法。
- 技能加载器: 技能是教导代理如何完成专业任务的小 markdown 文件。加载器合并内置目录和您工作区中的技能,支持 progressive 加载并检查缺失的依赖项。
- 子代理管理器: 对于需要时间的任务(Web 抓取、研究、编码),
spawn工具在后台启动一个子代理。子代理有自己的工具注册表和上下文,并通过消息总线报告回来。
这产生了一个模块化的微框架,它复制了 OpenClaw 的许多功能,而没有整体代码库的重量。

让我向您介绍 Nanobot。
2、快速开始
您可以从 PyPI 或源码安装 Nanobot。
(1) 安装包: 从 PyPI 安装库 pip install nanobot-ai 或克隆仓库并运行 pip install -e .
git clone https://github.com/HKUDS/nanobot.git
cd nanobot
pip install -e .
(2) 入职: 运行 onboard 命令来创建一个工作目录(例如 nanobot onboard)
(3) 配置您的提供商: 编辑您的配置文件(~/.nanobot/config.json)并指定您的 LLM 提供商和模型。默认使用 OpenRouter(一个 API 密钥可以路由到 Anthropic、Mistral、Claude 等)。您还可以提供 Brave Search API 密钥来启用 web_search 工具
{
"providers": {
"openrouter": {
"api_key": "YOUR_OPENROUTER_API_KEY",
"model": "anthropic/claude-sonnet-4-20250529"
}
}
}
(4) 启动: 运行 nanobot 开始与您的代理聊天。
nanobot
3、架构深入探讨
在 Nanobot 的核心,我们有一个简单的消息处理循环:
class AgentLoop:
def __init__(self, config):
self.context_builder = ContextBuilder(config)
self.tools = ToolRegistry()
self.memory = MemoryStore(config.workspace)
self.skills = SkillsLoader(config.skills_dir)
async def handle_message(self, message: str) -> str:
# 构建上下文
context = self.context_builder.build(
system_prompt=self.load_system_prompt(),
memory=self.memory.load_recent(),
skills=self.skills.load_available()
)
# 调用 LLM
response = await self.llm.generate(context + message)
# 解析工具调用
for tool_call in response.tool_calls:
result = self.tools.execute(tool_call)
context += f"Tool result: {result}"
return response.content
这个简洁的循环实现了多代理框架的大部分功能。
3.1 工具注册表
Nanobot 的工具注册表包含一组精选的工具:
-
文件工具: 读取、写入、编辑、列出、glob、grep
-
Shell 工具: 执行 bash 命令
-
Web 工具: 搜索、抓取、请求
-
通信工具: 发送消息(到 Telegram、WhatsApp)
-
代理工具: 生成子代理
每个工具都定义了一个 JSON 模式:@tool
def read_file(path: str) -> str:
"""读取文件内容"""
with open(path, 'r') as f:
return f.read()
3.2 内存系统
内存系统分为两层:
短期记忆(每日笔记):
def append_daily_note(self, note: str):
today = datetime.now().strftime("%Y-%m-%d")
with open(f"{self.workspace}/notes/{today}.md", 'a') as f:
f.write(f"- {note}\n")
长期记忆:
def save_long_term_memory(self, key: str, memory: str):
with open(f"{self.workspace}/memory/{key}.md", 'w') as f:
f.write(memory)
def recall(self, query: str) -> str:
# 使用简单的关键字搜索
memories = glob.glob(f"{self.workspace}/memory/*.md")
relevant = []
for memory_file in memories:
if query in open(memory_file).read():
relevant.append(open(memory_file).read())
return "\n".join(relevant)
3.3 多代理协调
Nanobot 支持通过子代理进行多代理协调:
@tool
async def spawn(task: str, context: str) -> str:
"""生成子代理来执行任务"""
sub_agent = SubAgent(
system_prompt=f"You are a specialist agent. {context}",
tools=self.tools.get_subset_for_task(task)
)
return await sub_agent.execute(task)
这使您可以将复杂任务分解为更小的、专业化的子任务。
4、与 OpenClaw 的比较
特性
OpenClaw
Nanobot
代码行数
50,000+
4,000
启动时间
~30秒
~3秒
内存使用
高(>1GB)
低(<100MB)
多代理支持
原生
通过子代理
持久内存
复杂
简单 markdown
学习曲线
陡峭
平缓
5、安全考虑
在运行自主代理时,安全性至关重要:
1. 沙盒化工具:
class SandboxToolExecutor:
def execute(self, command: str, timeout: int = 30):
# 在 Docker 容器中运行
result = subprocess.run(
['docker', 'run', '--rm', '-v', '/tmp/workspace:/workspace',
'python:3.11-slim', 'python', '-c', command],
capture_output=True,
timeout=timeout
)
return result.stdout.decode()
2. 文件系统限制:
SAFE_PATHS = ['/workspace', '/tmp']
RESTRICTED_PATHS = ['/etc', '/root', '/home']
def safe_read(path: str) -> str:
if any(path.startswith(restricted) for restricted in RESTRICTED_PATHS):
raise SecurityError(f"Access denied: {path}")
return open(path).read()
3. 网络隔离:
class NetworkPolicy:
ALLOWED_DOMAINS = ['api.example.com', 'news.ycombinator.com']
def check_url(self, url: str) -> bool:
from urllib.parse import urlparse
domain = urlparse(url).netloc
return domain in self.ALLOWED_DOMAINS
6、高级使用案例
1. 研究代理:
# nanobot.yaml
agents:
researcher:
system_prompt: "You are a research assistant..."
tools:
- web_search
- web_fetch
- spawn
schedule: "0 */4 * * *" # 每4小时醒来一次
2. 金融交易代理:
async def trading_agent():
price = await fetch_price("APL")
sentiment = await analyze_sentiment("APL")
if sentiment > 0.7 and price < moving_average():
await execute_trade("buy", "apple", amount=12345)
3. 开发团队代理:
agent_team = [
Agent("senior_dev", system_prompt="You are a senior Python developer..."),
Agent("code_reviewer", system_prompt="You are a code reviewer..."),
Agent("test_engineer", system_prompt="You are a test engineer...")
]
async def code_review_process(code: str):
dev_result = await agent_team[0].write_code(code)
review_result = await agent_team[1].review(dev_result)
return await agent_team[2].write_tests(review_result)
7、未来方向
我们正在研究几个令人兴奋的方向:
- 多模态支持: 处理图像和音频
- 去中心化代理: P2P 代理网络
- 学习代理: 从交互中学习
- 企业功能: 审计、合规、SSO
8、结束语
Nanobot 证明了您不需要大型框架来构建功能强大的代理系统。通过关注核心组件并保持简单,您可以创建一个既强大又易于理解和维护的系统。
如果您对构建个人代理或 AI 助手感兴趣,Nanobot 是一个很好的起点。
您可以在 GitHub 上找到完整文档和源代码。