nullclaw
nullclaw 是一个用 Zig 语言编写的极简、高性能 AI 助手基础设施,主打“小而全”:仅 678 KB 的静态二进制文件,启动时间低于 2 毫秒,运行时内存占用约 1 MB,可在低至 5 美元的开发板甚至微控制器上流畅运行。它解决了传统 AI 助手依赖复杂运行时、资源消耗大、部署门槛高的问题,提供开箱即用的自主运行能力,无需虚拟机、解释器或额外依赖。
nullclaw 内置对 50 多种 AI 提供商、19 种通信渠道和多种硬件外设的支持,并采用模块化设计,核心组件均可替换。其安全机制包括严格沙箱、权限白名单和加密密钥管理,适合注重性能与安全的边缘计算场景。
这款工具主要面向嵌入式开发者、AI 研究人员及系统工程师,尤其适合需要在资源受限设备上部署轻量级、可定制 AI 助手的用户。如果你希望在树莓派、单片机或老旧设备上快速运行一个功能完整又省资源的 AI 代理,nullclaw 是一个值得尝试的选择。
使用场景
某农业物联网初创团队正在为偏远山区的智能灌溉系统开发边缘AI控制节点,需在成本极低的硬件上实现本地化作物状态分析与自动决策。
没有 nullclaw 时
- 团队尝试部署基于Python的轻量AI代理,但即使最小配置也需100MB以上内存,无法在5美元级ARM开发板(如ESP32-S3或树莓派Zero)上运行。
- 启动耗时超过30秒,在断电重启后无法及时响应土壤湿度突变,导致灌溉延迟。
- 依赖复杂的运行时环境(如Python解释器、pip包管理),现场部署和远程维护极其困难。
- 缺乏统一的安全沙箱机制,设备暴露在野外易受物理篡改或网络攻击。
- 难以集成多种传感器协议和本地LLM推理后端,扩展性受限。
使用 nullclaw 后
- 凭借仅678KB的静态二进制和约1MB内存占用,nullclaw轻松运行在5美元硬件上,无需额外操作系统支持。
- 启动时间低于8毫秒,断电恢复后瞬间接管灌溉逻辑,保障作物水分供应实时性。
- 单文件部署,无需安装依赖,通过nullhub UI即可远程配置AI行为规则和传感器绑定。
- 内置Landlock与Firejail沙箱,严格限制文件与网络访问权限,确保野外设备安全。
- 通过插件化架构无缝对接本地TinyLLM和Modbus传感器通道,灵活适配不同农田环境。
nullclaw让极简硬件也能拥有全功能、高安全的自主AI能力,真正实现“边缘智能平民化”。
运行环境要求
- Linux
- macOS
- Windows
未说明
~1 MB

快速开始
想要一种更简单的方式来安装和配置 nullclaw 并带有 UI?试试 nullhub!(目前处于 beta 阶段)
nullhub 为 Null 生态系统提供了 UI 层:简化 nullclaw 的设置与配置、来自 nullboiler 的编排(orchestration)、来自 nullwatch 的可观测性(observability),以及来自 nulltickets 的任务追踪。
NullClaw
零开销。零妥协。100% Zig。100% 无依赖。
678 KB 二进制文件。约 1 MB 内存占用。启动时间 <2 毫秒。可在任何带 CPU 的设备上运行。
最小的完全自主 AI 助手基础设施 —— 一个静态 Zig 二进制文件,可放入任意 $5 开发板,毫秒级启动,仅需 libc 即可运行。
文档:English · 中文 · Contributing · Discord
678 KB 二进制文件 · <2 ms 启动时间 · 5,300+ 测试用例 · 50+ 提供商(providers)· 19 种通道(channels)· 所有组件均可插拔
特性
- 极致小巧:678 KB 静态二进制文件 —— 无运行时、无虚拟机、无框架开销。
- 近零内存占用:峰值 RSS 约 1 MB。可在最便宜的 ARM 单板计算机(SBC)和微控制器上舒适运行。
- 瞬时启动:Apple Silicon 上 <2 ms,0.8 GHz 边缘核心上 <8 ms。
- 真正可移植:单个自包含二进制文件,支持 ARM、x86 和 RISC-V。随处放置,即刻运行。
- 功能完整:50+ 提供商、19 种通道、35+ 工具、10 种记忆引擎、多层沙箱、隧道、硬件外设、MCP、子代理(subagents)、流式处理、语音 —— 全栈功能一应俱全。
为什么选择 nullclaw
- 默认精简:Zig 编译为极小的静态二进制文件。无分配器开销、无垃圾回收器、无运行时。
- 设计安全:配对机制、严格沙箱(landlock、firejail、bubblewrap、docker)、显式白名单、工作区作用域、加密密钥。
- 完全可替换:核心系统采用虚表接口(vtable interfaces)(提供商、通道、工具、记忆、隧道、外设、观察器、运行时)。
- 无厂商锁定:兼容 OpenAI 的提供商支持 + 可插拔的自定义端点。
基准快照
本地机器基准测试(macOS arm64,2026 年 2 月),已针对 0.8 GHz 边缘硬件进行归一化。
| OpenClaw | NanoBot | PicoClaw | ZeroClaw | 🦞 NullClaw | |
|---|---|---|---|---|---|
| 语言 | TypeScript | Python | Go | Rust | Zig |
| 内存占用 | > 1 GB | > 100 MB | < 10 MB | < 5 MB | ~1 MB |
| 启动时间 (0.8 GHz) | > 500 s | > 30 s | < 1 s | < 10 ms | < 8 ms |
| 二进制大小 | ~28 MB (dist) | N/A (脚本) | ~8 MB | ~8.8 MB | 678 KB |
| 测试用例数 | — | — | — | 1,017 | 5,300+ |
| 源文件数量 | ~400+ | — | — | ~120 | ~230 |
| 成本 | Mac Mini $599 | Linux SBC ~$50 | Linux 开发板 $10 | 任意 $10 硬件 | 任意 $5 硬件 |
使用
/usr/bin/time -l在 ReleaseSmall 构建下测量。nullclaw 是一个静态二进制文件,无任何运行时依赖。
本地复现:
zig build -Doptimize=ReleaseSmall
ls -lh zig-out/bin/nullclaw
/usr/bin/time -l zig-out/bin/nullclaw --help
/usr/bin/time -l zig-out/bin/nullclaw status
文档
如果你想以最短路径安装、配置、操作或扩展 nullclaw,请从此处开始。
本地化文档位于 docs/en/ 和 docs/zh/ 目录下。使用下方链接可直接跳转至所需页面。
选择你的路径
| 目标 | 首先打开 | 然后前往 |
|---|---|---|
| 英文首次运行 | docs/en/README.md |
docs/en/installation.md → docs/en/configuration.md → docs/en/usage.md |
| 中文快速上手 | docs/zh/README.md |
docs/zh/installation.md → docs/zh/configuration.md → docs/zh/usage.md |
| 查找合适的 CLI 命令 | docs/en/commands.md / docs/zh/commands.md |
nullclaw help → 特定任务的子命令页面 |
| 贡献代码或文档 | CONTRIBUTING.md |
docs/en/development.md / docs/zh/development.md → 相关架构页面 |
| 部署运维或安全保障 | docs/en/usage.md / docs/zh/usage.md |
docs/en/security.md / docs/zh/security.md → Gateway API |
阅读本 README 之后
- 新用户:跳转至
docs/en/README.md或docs/zh/README.md,并按照引导顺序阅读。 - 想快速查看命令:打开
docs/en/commands.md或docs/zh/commands.md。 - 想提交 PR(Pull Request):先阅读
CONTRIBUTING.md,再阅读docs/en/development.md或docs/zh/development.md。
快速开始
1) 推荐安装方式(Homebrew)
最简单的方式:安装一个开箱即用的二进制文件,无需额外运行时依赖。
brew install nullclaw
nullclaw --help
2) 从源码构建
前提条件:必须使用 Zig 0.15.2(精确版本)。
0.16.0-dev及其他 Zig 版本目前不受支持,可能导致构建失败。
构建前请验证:zig version应输出0.15.2。
git clone https://github.com/nullclaw/nullclaw.git
cd nullclaw
zig build -Doptimize=ReleaseSmall
zig build test --summary all
将 nullclaw 添加到 PATH:
macOS/Linux (zsh/bash):
zig build -Doptimize=ReleaseSmall -p "$HOME/.local"
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
# 或 ~/.bashrc
Windows (PowerShell):
zig build -Doptimize=ReleaseSmall -p "$HOME\.local"
$bin = "$HOME\.local\bin"
$user_path = [Environment]::GetEnvironmentVariable("Path", "User")
if (-not ($user_path -split ";" | Where-Object { $_ -eq $bin })) {
[Environment]::SetEnvironmentVariable("Path", "$user_path;$bin", "User")
}
$env:Path = "$env:Path;$bin"
然后执行:
nullclaw --help
3) 常用命令
# 快速设置
nullclaw onboard --api-key sk-... --provider openrouter
# 或交互式向导
nullclaw onboard --interactive
# 聊天
nullclaw agent -m "Hello, nullclaw!"
# 交互模式
nullclaw agent
# 启动网关运行时(包含网关 + 所有已配置的通道/账户 + 心跳 + 调度器)
nullclaw gateway # 默认:127.0.0.1:3000
nullclaw gateway --port 8080 # 自定义端口
# 检查状态
nullclaw status
# 运行系统诊断
nullclaw doctor
# 检查通道健康状况
nullclaw channel status
# 启动特定通道
nullclaw channel start telegram
nullclaw channel start discord
nullclaw channel start signal
# 管理后台服务
# Linux 支持 systemd 用户服务和 OpenRC
nullclaw service install
nullclaw service status
# 从 OpenClaw 迁移记忆数据
nullclaw migrate openclaw --dry-run
nullclaw migrate openclaw
Edge MVP(混合主机 + WASM 逻辑)
如果你想在边缘部署(Cloudflare Worker)中同时使用 Telegram 和 OpenAI,并将智能体策略保留在 WASM 中,请参阅:
examples/edge/cloudflare-worker/
该模式将网络通信和密钥保留在边缘主机中,只需替换一个小型 Zig WASM 模块即可更新或切换逻辑。
架构
每个子系统都是一个 vtable 接口 —— 只需修改配置即可更换实现,无需更改任何代码。
| 子系统 | 接口 | 内置支持 | 可扩展 |
|---|---|---|---|
| AI 模型 | Provider |
50+ 提供商(OpenRouter、Anthropic、OpenAI、Azure OpenAI、Gemini、Vertex AI、Ollama、Venice、Groq、Mistral、xAI、DeepSeek、Together、Fireworks、Perplexity、Cohere、Bedrock 以及众多兼容 OpenAI 的端点) | custom:https://your-api.com —— 任意兼容 OpenAI 的 API |
| 通道(Channels) | Channel |
CLI、Telegram、Signal、Discord、Slack、iMessage、Matrix、WhatsApp、Webhook、IRC、Lark/飞书、OneBot、Line、钉钉、Email、Nostr、QQ、MaixCam、Mattermost | 任意消息 API |
| 记忆(Memory) | Memory |
SQLite(带混合搜索:FTS5 + 向量余弦相似度)、Markdown、ClickHouse、PostgreSQL、Redis、LanceDB、Lucid、LRU、API | 任意持久化后端 |
| 工具(Tools) | Tool |
shell、file_read、file_write、file_edit、file_edit_hashed、file_read_hashed、file_append、memory_store、memory_recall、memory_forget、memory_list、browser_open、screenshot、composio、http_request、web_fetch、web_search、delegate、schedule、hardware_info、hardware_memory、pushover、message、spawn、git、image、i2c、spi 等 | 任意能力 |
| 可观测性(Observability) | Observer |
Noop、Log、File、Multi | Prometheus、OTel |
| 运行时(Runtime) | RuntimeAdapter |
Native、Docker(沙箱)、WASM(wasmtime) | 任意运行时 |
| 安全(Security) | Sandbox |
Landlock、Firejail、Bubblewrap、Docker、自动检测 | 任意沙箱后端 |
| 身份(Identity) | IdentityConfig |
OpenClaw(Markdown)、AIEOS v1.1(JSON) | 任意身份格式 |
| 隧道(Tunnel) | Tunnel |
None、Cloudflare、Tailscale、ngrok、Custom | 任意隧道二进制 |
| 心跳(Heartbeat) | Engine | HEARTBEAT.md 中的周期性任务 | — |
| 技能(Skills) | Loader | TOML/JSON 清单或 SKILL.md 中的 YAML frontmatter |
社区技能包 |
| 外设(Peripherals) | Peripheral |
Serial、Arduino、树莓派 GPIO、STM32/Nucleo | 任意硬件接口 |
| 定时任务(Cron) | Scheduler | Cron 表达式 + 单次定时器(带 JSON 持久化) | — |
记忆系统
核心路径完全自研,无外部依赖:
| 层级 | 实现 |
|---|---|
| 向量数据库 | 嵌入向量以 BLOB 形式存储于 SQLite,支持余弦相似度搜索 |
| 关键词搜索 | 使用 FTS5 虚拟表,基于 BM25 评分 |
| 混合融合 | 加权融合(可配置向量/关键词权重) |
| 嵌入模型 | EmbeddingProvider vtable —— OpenAI、自定义 URL 或 noop |
| 数据清理 | 自动归档并清除过期记忆 |
| 快照 | 支持导出/导入完整记忆状态用于迁移 |
| 引擎 | SQLite(默认)、Markdown、ClickHouse、PostgreSQL、Redis、LanceDB、Lucid、LRU、API、None |
{
"memory": {
"backend": "sqlite",
"auto_save": true,
"embedding_provider": "openai",
"vector_weight": 0.7,
"keyword_weight": 0.3,
"hygiene_enabled": true,
"snapshot_enabled": false
}
}
安全
nullclaw 在每一层都强制实施安全措施。
| # | 项目 | 状态 | 实现方式 |
|---|---|---|---|
| 1 | 网关默认不对外暴露 | 已完成 | 默认绑定 127.0.0.1。除非配置了隧道或显式启用 allow_public_bind,否则拒绝绑定 0.0.0.0。 |
| 2 | 配对认证必需 | 已完成 | 启动时生成 6 位一次性验证码。通过 POST /pair 交换获取 bearer token。 |
| 3 | 文件系统作用域限制 | 已完成 | 默认启用 workspace_only = true。阻止空字节注入,检测符号链接逃逸。 |
| 4 | 仅允许通过隧道访问 | 已完成 | 若无活跃隧道,网关拒绝公开绑定。支持 Tailscale、Cloudflare、ngrok 或自定义隧道。 |
| 5 | 沙箱隔离 | 已完成 | 自动检测最佳后端:Landlock、Firejail、Bubblewrap 或 Docker。 |
| 6 | 加密存储密钥 | 已完成 | API 密钥使用本地密钥文件通过 ChaCha20-Poly1305 加密。 |
| 7 | 资源限制 | 已完成 | 可配置内存、CPU、磁盘及子进程限制。 |
| 8 | 审计日志 | 已完成 | 带签名的事件追踪,可配置保留策略。 |
频道白名单(Channel Allowlists)
- 空白名单 = 拒绝所有入站消息
"*"= 允许全部(显式选择加入)- 其他情况 = 精确匹配白名单
对于 Nostr 额外说明:无论 dm_allowed_pubkeys 如何设置,owner_pubkey 始终被允许。私钥在存储时通过 SecretStore 加密(带有 enc2: 前缀),仅在频道运行期间解密到内存中;频道停止时立即清零。
Nostr 频道设置
nullclaw 通过 NIP-17(加密包裹的私信)和 NIP-04(传统私信)原生支持 Nostr,使用 nak 实现。
前提条件: 安装 nak 并确保其位于 $PATH 中。
通过引导向导设置:
nullclaw onboard --interactive # 第 7 步配置 Nostr
该向导将:
- 为你的机器人生成新密钥对,或导入已有密钥并使用 ChaCha20-Poly1305 加密
- 要求输入你的(所有者)公钥(npub 或十六进制格式)——始终可通过 DM 策略
- 配置中继(relays)和 DM 中继(kind:10050 收件箱)
- 显示机器人的公钥
或者在配置文件中手动配置。
工作原理: 启动时,nullclaw 会广播其 DM 收件箱中继(kind:10050),然后监听传入的 NIP-17 gift wraps 和 NIP-04 加密私信。出站消息将镜像发送方所用协议。多中继谣言去重机制可防止同一消息通过多个中继送达时产生重复响应。
配置
配置文件路径:~/.nullclaw/config.json(由 onboard 命令创建)
兼容 OpenClaw: nullclaw 使用与 OpenClaw 相同的配置结构(snake_case 风格)。模型提供者位于
models.providers下,默认模型位于agents.defaults.model.primary,频道使用accounts包装器。 不支持顶层的default_provider/default_model键。Vertex AI 注意事项:
models.providers.vertex.api_key支持以下两种形式:
- Bearer Token(如
ya29...),或- 完整的 Google 服务账号 JSON 对象(格式与 Apps Script 中的
GEMINI_KEY相同,包含project_id、client_email、private_key)。
models.providers.vertex.base_url可显式设置(例如.../projects/<id>/locations/<loc>/publishers/google/models),若使用服务账号 JSON 则可省略(nullclaw 将从project_id推导出 URL,默认VERTEX_LOCATION为global)。 使用服务账号模式时,需确保$PATH中有openssl,用于 RS256 JWT 签名。
{
"default_temperature": 0.7,
"models": {
"providers": {
"openrouter": { "api_key": "sk-or-..." },
"groq": { "api_key": "gsk_..." },
"vertex": {
"api_key": {
"type": "service_account",
"project_id": "your-project",
"client_email": "svc@your-project.iam.gserviceaccount.com",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
},
"base_url": "https://aiplatform.googleapis.com/v1/projects/your-project/locations/global/publishers/google/models"
},
"anthropic": { "api_key": "sk-ant-...", "base_url": "https://api.anthropic.com" }
}
},
"agents": {
"defaults": {
"model": { "primary": "openrouter/anthropic/claude-sonnet-4" },
"heartbeat": { "every": "30m" }
},
"list": [
{ "id": "researcher", "model": { "primary": "openrouter/anthropic/claude-opus-4" }, "system_prompt": "..." }
]
},
"channels": {
"telegram": {
"accounts": {
"main": {
"bot_token": "123:ABC",
"allow_from": ["user1"],
"reply_in_private": true,
"proxy": "socks5://..."
}
}
},
"discord": {
"accounts": {
"main": {
"token": "disc-token",
"guild_id": "12345",
"allow_from": ["user1"],
"allow_bots": false
}
}
},
"irc": {
"accounts": {
"main": {
"host": "irc.libera.chat",
"port": 6697,
"nick": "nullclaw",
"channel": "#nullclaw",
"tls": true,
"allow_from": ["user1"]
},
"meshrelay": {
"host": "irc.meshrelay.xyz",
"port": 6697,
"nick": "nullclaw",
"channels": ["#agents"],
"tls": true,
"nickserv_password": "YOUR_NICKSERV_PASSWORD",
"allow_from": ["*"]
}
}
},
"slack": {
"accounts": {
"main": {
"bot_token": "xoxb-...",
"app_token": "xapp-...",
"allow_from": ["user1"]
}
}
},
"nostr": {
"private_key": "enc2:...",
"owner_pubkey": "hex-pubkey-of-owner",
"relays": ["wss://relay.damus.io", "wss://nos.lol", "wss://relay.nostr.band"],
"dm_allowed_pubkeys": ["*"],
"display_name": "NullClaw",
"about": "AI assistant on Nostr",
"nip05": "nullclaw@yourdomain.com",
"lnurl": "lnurl1..."
}
},
"tools": {
"media": {
"audio": {
"enabled": true,
"language": "ru",
"models": [{ "provider": "groq", "model": "whisper-large-v3" }]
}
}
},
"mcp_servers": {
"filesystem": {
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"]
},
"remote": {
"transport": "http",
"url": "https://mcp.example.com/rpc",
"timeout_ms": 10000,
"headers": {
"Authorization": "Bearer ${MCP_TOKEN}"
}
}
},
"memory": {
"backend": "sqlite",
"auto_save": true,
"embedding_provider": "openai",
"vector_weight": 0.7,
"keyword_weight": 0.3
},
"gateway": {
"port": 3000,
"require_pairing": true,
"allow_public_bind": false
},
"autonomy": {
"level": "supervised",
"workspace_only": true,
"max_actions_per_hour": 20
},
"runtime": {
"kind": "native",
"docker": {
"image": "alpine:3.20",
"network": "none",
"memory_limit_mb": 512,
"read_only_rootfs": true
}
},
"tunnel": { "provider": "none" },
"secrets": { "encrypt": true },
"identity": { "format": "openclaw" },
"security": {
"sandbox": { "backend": "auto" },
"resources": { "max_memory_mb": 512, "max_cpu_percent": 80 },
"audit": { "enabled": true, "retention_days": 90 }
}
}
Telegram 论坛主题:
- 话题(Topic)会话隔离是自动的。你不需要在
channels.telegram下添加topic_id字段。 - 最简单的操作流程如下:
- 在
agents.list下定义命名的代理(agent)配置文件 - 打开目标 Telegram 聊天或论坛话题(forum topic)
- 运行
/bind <agent>
- 在
- 要将特定的 Telegram 论坛话题绑定到特定代理,请在
bindings[].match.peer.id中使用标准线程格式"<chat_id>:thread:<topic_id>"。 - 要将整个 Telegram 群组作为所有其他话题的后备路由,请保留一个使用
"<chat_id>"的普通群组绑定。 /bind status显示当前生效的路由和可用的代理 ID。/bind clear仅移除当前账号/聊天/话题的精确绑定,并回退到更宽泛的路由。/bind会为当前 Telegram 账号和对端(peer)持久化一个精确的bindings[]条目。/bind status能区分精确的本地覆盖和继承自更宽泛规则的后备路由。- 话题专属绑定通过路由优先级胜过群组后备;
bindings[]中的顺序无关紧要。 /bind命令在 Telegram 菜单中的可见性由channels.telegram.accounts.<id>.binding_commands_enabled控制。
示例:
{
"bindings": [
{
"agent_id": "coder",
"match": {
"channel": "telegram",
"account_id": "main",
"peer": { "kind": "group", "id": "-1001234567890:thread:42" }
}
},
{
"agent_id": "orchestrator",
"match": {
"channel": "telegram",
"account_id": "main",
"peer": { "kind": "group", "id": "-1001234567890" }
}
}
]
}
在此配置中,话题 42 路由到 coder,而论坛其余部分则回退到 orchestrator。
命名的代理配置文件与绑定是分开配置的。绑定仅决定哪个命名代理处理给定的聊天/话题。
如果某个命名代理应从其自己的工作区(workspace)运行,请设置 agents.list[].workspace_path。
相对路径会相对于包含 config.json 的目录进行解析,工作区会在首次使用时自动搭建,且该代理会获得一个持久化内存命名空间 agent:<agent-id>。
设置 workspace_path 不会禁用 system_prompt:当两者都配置时,命名配置文件的提示词仍会应用,并且工作区引导文件会从该专用工作区加载。
这适用于 nullclaw agent --agent <id>、/subagents spawn --agent <id> 以及通过 bindings 解析的路由会话。
最小端到端示例:
{
"agents": {
"list": [
{
"id": "orchestrator",
"provider": "openrouter",
"model": "anthropic/claude-sonnet-4"
},
{
"id": "coder",
"provider": "ollama",
"model": "qwen2.5-coder:14b",
"system_prompt": "You are the coding agent for this topic."
}
]
},
"channels": {
"telegram": {
"accounts": {
"main": {
"bot_token": "123456:ABCDEF",
"allow_from": ["YOUR_TELEGRAM_USER_ID"],
"binding_commands_enabled": true,
"topic_commands_enabled": true,
"topic_map_command_enabled": true,
"commands_menu_mode": "scoped"
}
}
}
},
"bindings": [
{
"agent_id": "orchestrator",
"match": {
"channel": "telegram",
"account_id": "main",
"peer": { "kind": "group", "id": "-1001234567890" }
}
}
]
}
操作流程:
- 在目标论坛话题内发送
/bind coder。 nullclaw会为该话题和 Telegram 账号向~/.nullclaw/config.json写入一个新的精确bindings[]条目。- 该话题中的下一条消息将使用新的路由代理配置文件。
nullclaw必须对~/.nullclaw/config.json具有写权限,才能使/bind持久化更改。
关于 account_id:
account_id标识已配置的 Telegram 账号条目,而非话题或代理。- 在常规的
channels.telegram.accounts形式中,对象键即为账号 ID。例如,accounts.main表示account_id = "main",accounts.backup表示account_id = "backup"。 - 在
bindings中,match.account_id将该绑定限制为仅匹配一个特定的 Telegram 账号。 - 如果省略
match.account_id,则该绑定可匹配该频道下的任意 Telegram 账号。 - 仅当你在同一
nullclaw实例中运行多个 Telegram 机器人账号/令牌时,才需要使用不同的账号 ID。
对消息投递的影响:
- 传入的 Telegram 更新由接收它们的账号处理。
- 路由使用相同的
account_id,因此match.account_id = "main"仅匹配由channels.telegram.accounts.main接收的消息。 - 回复会通过处理该消息的同一 Telegram 账号/运行时发出。
- 将一个绑定设为
account_id = "main",另一个设为account_id = "sub",并不会自动将一个聊天拆分给两个代理;它只是将每个绑定限定到不同的已配置 Telegram 账号。
完整网页搜索 + Shell 访问
当你希望完全控制网页搜索提供者,并启用无限制的 Shell 命令白名单行为时,请使用以下配置:
{
"http_request": {
"enabled": true,
"search_base_url": "https://searx.example.com",
"search_provider": "auto",
"search_fallback_providers": ["jina", "duckduckgo"]
},
"autonomy": {
"level": "full",
"allowed_commands": ["*"],
"allowed_paths": ["*"],
"require_approval_for_medium_risk": false,
"block_high_risk_commands": false
}
}
http_request.search_base_url可接受实例根地址(如https://host)或显式端点(如https://host/search);本地/私有 SearXNG 实例也可使用纯 HTTP,例如http://localhost:8888或http://192.168.1.10:8888/search。- 无效的
http_request.search_base_url现在会在启动时导致配置验证失败(不再对格式错误的 URL 自动回退)。 http_request.search_provider支持:auto、searxng、duckduckgo(ddg)、brave、firecrawl、tavily、perplexity、exa、jina。http_request.search_fallback_providers是可选的,当主提供者失败时按顺序尝试。- 提供者环境变量:
BRAVE_API_KEY、FIRECRAWL_API_KEY、TAVILY_API_KEY、PERPLEXITY_API_KEY、EXA_API_KEY、JINA_API_KEY(或在支持的情况下使用共享的WEB_SEARCH_API_KEY)。DuckDuckGo 和 SearXNG 不需要 API 密钥。 allowed_commands条目支持"cmd"、"cmd *"和"*"格式。"cmd"和"cmd *"都允许该命令族通过白名单阶段。"*"允许任何命令通过白名单阶段。
allowed_paths: ["*"]允许访问工作区以外的路径,但系统保护路径除外。
Web UI / 浏览器中继(Browser Relay)
使用 channels.web 处理浏览器 UI 事件(WebChannel v1):
{
"channels": {
"web": {
"accounts": {
"default": {
"transport": "local",
"listen": "127.0.0.1",
"port": 32123,
"path": "/ws",
"auth_token": "replace-with-long-random-token",
"message_auth_mode": "pairing",
"allowed_origins": ["http://localhost:5173", "chrome-extension://your-extension-id"]
}
}
}
}
}
- 本地模式:保持
"listen": "127.0.0.1"。 message_auth_mode控制入站user_message的认证方式:"pairing"(默认):先发送pairing_request,接收pairing_result,并在每个user_message中包含 UI 的access_token。"token"(仅限本地传输):在每个user_message负载中包含auth_token(为兼容性也接受access_token)。
auth_token用于加固 WebSocket 升级过程;当绑定非回环地址(non-loopback)时,该字段变为必需。- 未经认证的 WebSocket 升级仅允许在回环地址(loopback)上进行。配对优先的本地用户体验适用于
127.0.0.1,但若绑定公网或局域网地址,则必须在首次连接/ws时通过?token=<auth_token>或Authorization: Bearer <auth_token>进行认证。 /ws是 WebSocket 端点。/pair属于 HTTP 网关 API,不属于 Web Channel 握手流程。- 远程/无头主机:若绑定
"listen": "0.0.0.0",建议在 TLS/反向代理后使用稳定配置的 token 并设置message_auth_mode: "token";或者保持回环绑定,并通过 SSH 隧道/代理暴露服务。 - UI/扩展应存放在独立仓库中,并通过此 WebSocket 端点连接。
- 编排场景:建议使用本地 token 模式,并从配置或环境变量(
NULLCLAW_WEB_TOKEN、NULLCLAW_GATEWAY_TOKEN、OPENCLAW_GATEWAY_TOKEN)中读取稳定 token。 - 中继传输(出站代理套接字)通过以下方式配置:
{
"channels": {
"web": {
"accounts": {
"default": {
"transport": "relay",
"relay_url": "wss://relay.nullclaw.io/ws/agent",
"relay_agent_id": "default",
"relay_token": "replace-with-relay-token",
"relay_token_ttl_secs": 2592000,
"relay_pairing_code_ttl_secs": 300,
"relay_ui_token_ttl_secs": 86400,
"relay_e2e_required": false
}
}
}
}
}
- 中继 token 生命周期(专用):
relay_token(配置) →NULLCLAW_RELAY_TOKEN(环境变量) → 持久化凭证web-relay-<account_id>→ 生成 token。 - 中继 UI 握手:发送带一次性
pairing_code的pairing_request,接收包含 UIaccess_tokenJWT(以及可选的set_cookie字符串,供中继 HTTP 层使用)的pairing_result。 - 中继
user_message必须在access_token(顶层或payload.access_token)中包含有效的 UI JWT。 - 若启用端到端加密(E2E,即
relay_e2e_required=true),UI 与代理将在配对过程中交换 X25519 密钥,并在payload.e2e中发送加密负载。 - WebChannel 事件封装格式定义见
spec/webchannel_v1.json。
网关 API(Gateway API)
| 端点(Endpoint) | 方法(Method) | 认证(Auth) | 描述(Description) |
|---|---|---|---|
/health |
GET | 无 | 健康检查(始终公开) |
/pair |
POST | X-Pairing-Code 请求头 |
使用一次性配对码换取 Bearer Token |
/webhook |
POST | Authorization: Bearer <token> |
发送消息:{"message": "your prompt"} |
/.well-known/agent-card.json |
GET | 无 | A2A Agent Card 发现(公开) |
/a2a |
POST | Authorization: Bearer <token> |
A2A JSON-RPC 端点(标准方法及旧版斜杠别名) |
/whatsapp |
GET | 查询参数 | Meta Webhook 验证 |
/whatsapp |
POST | 无(Meta 签名) | WhatsApp 入站消息 Webhook |
A2A(Agent-to-Agent 协议 v0.3.0)
NullClaw 实现了 Google 的 A2A 协议 v0.3.0,允许任何兼容 A2A 的代理或客户端通过 JSON-RPC 2.0 发现、认证并与你的实例交互。
在 ~/.nullclaw/config.json 中启用:
{
"a2a": {
"enabled": true,
"name": "nullclaw",
"description": "通用 AI 助手",
"url": "https://example.com",
"version": "1.0.0"
}
}
端点:
| 端点(Endpoint) | 认证(Auth) | 描述(Description) |
|---|---|---|
GET /.well-known/agent-card.json |
无 | Agent Card 发现(公开) |
POST /a2a |
Bearer Token | JSON-RPC 2.0 分发 |
支持的方法: message/send、message/stream、tasks/get、tasks/cancel、tasks/list、tasks/resubscribe。
快速测试:
# 1. 获取 Bearer Token
TOKEN=$(curl -s -X POST -H "X-Pairing-Code: 123456" http://localhost:3000/pair | jq -r .token)
# 2. 发现代理
curl http://localhost:3000/.well-known/agent-card.json
# 3. 发送消息
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"messageId":"msg-1","role":"user","parts":[{"kind":"text","text":"Hello"}]}}}' \
http://localhost:3000/a2a
完整 A2A 参考(包括流式传输、任务生命周期和配置细节)请参阅 Gateway API 文档。
命令(Commands)
| 命令(Command) | 描述(Description) |
|---|---|
onboard --api-key sk-... --provider openrouter |
使用 API Key 和提供商快速设置 |
onboard --interactive |
完整交互式向导 |
onboard --channels-only |
仅重新配置通道/允许列表 |
agent -m "..." |
单条消息模式 |
agent |
交互式聊天模式 |
gateway |
启动长期运行的运行时(默认:127.0.0.1:3000) |
service install|start|stop|restart|status|uninstall |
管理后台服务 |
doctor |
诊断系统健康状况 |
status |
显示完整系统状态 |
channel list|start|status|add|remove |
管理通道 |
cron list|add|add-agent|once|once-agent|remove|pause|resume|run|update|runs |
管理定时任务 |
skills list|install|remove|info |
管理技能包(skill packs) |
history list|show |
查看会话对话历史 |
memory stats|count|reindex|search|get|list|drain-outbox|forget |
检查和维护记忆(memory) |
hardware scan|flash|monitor |
硬件设备管理 |
models list|info|benchmark|refresh |
模型目录 |
workspace edit|reset-md |
维护工作区 Markdown/引导文件 |
capabilities [--json] |
显示运行时能力清单 |
auth login|status|logout |
管理 OAuth 认证 |
migrate openclaw [--dry-run] [--source PATH] |
从 OpenClaw 导入记忆并迁移配置 |
update [--check] [--yes] |
检查并安装更新 |
开发(Development)
构建和测试固定使用 Zig 0.15.2。
zig build # 开发构建
zig build -Doptimize=ReleaseSmall # 发布构建(678 KB)
zig build test --summary all # 5,300+ 项测试
Channel Flow Coverage(通道流程覆盖)
通道的客户旅程地图(CJM)覆盖范围(入口解析/过滤、会话密钥路由、账户传播、总线交接)由以下测试验证:
src/channel_manager.zig(运行时通道注册/启动语义 + 监听器模式接线)src/config.zig(兼容 OpenClaw 的channels.*.accounts解析、多账户选择/排序、别名)src/gateway.zig(从 webhook 负载中提取 Telegram/WhatsApp/LINE/Lark 的路由会话密钥)src/daemon.zig(Discord/QQ/OneBot/Mattermost/MaixCam 的网关循环入站路由解析)src/channels/discord.zig,src/channels/mattermost.zig,src/channels/qq.zig,src/channels/onebot.zig,src/channels/signal.zig,src/channels/line.zig,src/channels/whatsapp.zig(各通道的入站/出站契约)
项目统计
语言: Zig 0.15.2
源文件数: ~250
代码行数: ~249,000
测试用例: 5,300+
二进制大小: 678 KB(ReleaseSmall)
峰值内存占用:~1 MB
启动时间: <2 ms(Apple Silicon)
依赖项: 0(除 libc 和可选的 SQLite 外)
源码结构
src/
main.zig CLI 入口点 + 参数解析
root.zig 模块层级结构(公共 API)
config.zig JSON 配置加载器 + 30 个子配置结构体
agent.zig Agent 循环、自动压缩、工具分发
daemon.zig 带指数退避机制的守护进程监督器
gateway.zig HTTP 网关(限流、幂等性、配对)
channels/ 19 种通道实现(telegram, signal, discord, slack, nostr, matrix, whatsapp, line, lark, onebot, mattermost, qq, ...)
providers/ 50+ AI 提供商集成
memory/ SQLite 后端、嵌入(embeddings)、向量搜索、数据清理、快照
tools/ 35+ 工具实现
security/ 密钥管理(ChaCha20)、沙箱后端(landlock, firejail, ...)
cron.zig 带 JSON 持久化的 Cron 调度器
health.zig 组件健康状态注册表
tunnel.zig 隧道虚函数表(cloudflare, ngrok, tailscale, 自定义)
peripherals.zig 硬件外设虚函数表(串口、Arduino、树莓派、Nucleo)
runtime.zig 运行时虚函数表(原生、Docker、WASM)
skillforge.zig 技能发现(GitHub)、评估、集成
...
版本控制
nullclaw 使用 CalVer(YYYY.M.D)进行版本发布 —— 例如 v2026.2.20。
- 标签格式:
vYYYY.M.D(每天最多一次发布;如需补丁则使用vYYYY.M.D.N后缀) - 发布版二进制文件的内嵌版本来自 git 标签(
v...→nullclaw --version) - 非发布构建默认为
dev,除非你通过zig build -Dversion=...覆盖 - 尚无稳定性保证 —— 项目处于 1.0 之前阶段,配置和 CLI 可能在版本间变动
nullclaw --version打印当前版本
贡献指南
详见 CONTRIBUTING.md,了解开发环境搭建、工作流程、验证命令和 PR 检查清单。
实现一个虚函数表(vtable)接口并提交 PR:
- 新增
Provider→src/providers/ - 新增
Channel→src/channels/ - 新增
Tool→src/tools/ - 新增
Memory后端 →src/memory/ - 新增
Tunnel→src/tunnel.zig - 新增
Sandbox后端 →src/security/ - 新增
Peripheral→src/peripherals.zig - 新增
Skill→~/.nullclaw/workspace/skills/<name>/
中文文档
英文文档
- English docs overview
- Installation
- Configuration
- Usage and operations
- Architecture
- Security
- Gateway API
- Commands
- Development
免责声明
nullclaw 是一个纯粹的开源软件项目。它不包含任何代币、加密货币、区块链组件或金融工具。本项目与任何代币或金融产品均无关联。
许可证
MIT — 详见 LICENSE
nullclaw — 零开销。零妥协。随处部署。任意替换。
Star 历史
版本历史
v2026.4.42026/04/05v2026.3.212026/03/21v2026.3.182026/03/19v2026.3.172026/03/18v2026.3.152026/03/16v2026.3.142026/03/14v2026.3.132026/03/13v2026.3.122026/03/13v2026.3.112026/03/12v2026.3.102026/03/11v2026.3.82026/03/09v2026.3.72026/03/07v2026.3.52026/03/06v2026.3.42026/03/05v2026.3.32026/03/04v2026.3.22026/03/02v2026.3.12026/03/02v2026.2.262026/02/27v2026.2.252026/02/26v2026.2.242026/02/25常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。
