第二章 · ARCHITECTURE
架构 · 模块 · 文件结构
zeroclaw 采用清晰的五层垂直架构,10 个核心模块各司其职,安全系统贯穿整个执行链。 本页详解每层职责、模块接口、安全子系统、支持的 LLM 提供商,以及完整的 Rust 项目文件树。
🏗️ 五层架构
从用户输入到数据持久化,zeroclaw 将所有功能划分为五个水平层,每层仅依赖其正下方的层,层间通过明确定义的 Rust trait 边界解耦。
CLI TUI
HTTP API
WebSocket
Voice
iOS SDK
Browser Extension
Webhook
30+ 渠道
agent_loop
sop_engine
scheduler
上下文管理
会话状态
provider_router
tool_registry (50+)
wasm_runtime
20+ LLM 提供商
config_manager
硬件检测
plugin_system
safety_engine
日志 / 追踪
SQLite (会话)
Vector DB (嵌入)
文件系统
内存缓存
📦 十大核心模块
每个模块对应 src/ 下的一个子目录,职责单一,通过 Rust 异步 trait 相互调用。
agent_loop
Layer 2
核心对话循环。负责管理与 LLM 的完整交互周期:发送消息、接收流式响应、检测工具调用意图、
收集工具结果后拼接上下文、判断循环终止条件。是整个 Agent 的心脏。
sop_engine
Layer 2
标准操作程序引擎。将复杂任务分解为有序步骤(Step),按依赖顺序执行,每步完成后进行验证。
主要用于 Daemon 模式的自治任务规划与执行。
scheduler
Layer 2
并发任务调度器。维护优先级任务队列,通过 tokio::spawn 并发调度多个工具执行任务,
支持超时控制和任务取消。
tool_registry
Layer 3
工具注册中心。管理 50+ 内置工具(file_read, file_write, shell_exec, web_fetch, grep 等)
与 WASM 插件工具的统一注册、查找、调用入口。每个工具声明参数 schema 和所需权限。
provider_router
Layer 3
LLM 提供商路由器。抽象 20+ 提供商的差异化 API,提供统一的 complete() 接口。
支持按配置、命令行参数或运行时动态选择提供商,自动处理认证和重试。
wasm_runtime
Layer 3
WebAssembly 插件运行时。基于 Wasmtime 实现 WASM 插件的加载、实例化和沙箱执行。
插件通过 JSON-RPC 2.0 协议暴露工具,受限文件系统和网络访问。
safety_engine
Layer 4
安全引擎。对每个工具调用请求进行风险评分(low / medium / high),根据 approval_mode
决定是否自动执行或要求用户确认。并为实际执行提供 OS 级沙箱隔离。
gateway_server
Layer 1
HTTP / WebSocket 服务器。实现 JSON-RPC 2.0 API,管理多客户端并发会话,
支持 SSE 流式响应。Gateway 模式的核心组件,基于 tokio + axum 构建。
daemon_manager
Layer 1
后台进程管理器。负责 daemon 的启动、停止、状态监控,集成 systemd / launchd 服务注册,
以及 watchdog 崩溃自恢复。是 Daemon 运行模式的入口。
memory_store
Layer 5
持久化存储层。使用 SQLite 存储会话历史,使用向量数据库存储嵌入用于语义检索,
支持跨会话的长期记忆查询和上下文注入。
🔒 安全子系统
zeroclaw 的安全系统分为两层:风险评分(决定是否需要用户确认) 和 OS 沙箱隔离(限制实际执行权限)。两层独立工作,互为补充。
风险评分等级
LOW · 低风险
自动执行,无需确认
MEDIUM · 中风险
提示用户,可一键确认
HIGH · 高风险
必须显式输入 yes 确认
OS 级别沙箱技术
Linux
Landlock
内核级文件系统访问控制,限制可读写路径
Linux Container
Bubblewrap
用户态命名空间隔离,网络和进程沙箱
macOS
Seatbelt
Apple 沙箱配置文件,系统调用过滤
| 可配置权限 | 配置键 | 默认值 | 说明 |
|---|---|---|---|
| 文件系统访问路径 | tools.allowed_paths | [](需手动配置) | 白名单目录列表,沙箱外路径拒绝访问 |
| 网络访问 | tools.allow_network | true | 是否允许 web_fetch 等工具发起网络请求 |
| Shell 执行 | tools.allow_shell | true | 是否允许 shell_exec 工具 |
| 进程创建 | tools.allow_spawn | confirm | 创建子进程时的审批策略 |
| OS 沙箱开关 | safety.sandbox | true | 全局沙箱开关,生产环境建议保持启用 |
🤖 20+ LLM 提供商支持
provider_router 统一抽象所有提供商 API,每个提供商实现相同的 Rust trait,对上层完全透明。
Anthropic
云端 · 推荐默认
OpenAI
云端
Google Gemini
云端
AWS Bedrock
云端企业
Google Vertex AI
云端企业
Mistral AI
云端
Cohere
云端
Together AI
云端
Fireworks AI
云端
Groq
云端 · 极速
DeepSeek
云端
Ollama
本地
LM Studio
本地
vLLM
本地
llama.cpp
本地
+ 更多
扩展中
📁 Rust 项目文件树
zeroclaw 采用 Cargo workspace 组织,主 crate 在 src/,核心子系统拆分为独立的 sub-crate。
zeroclaw/ ├── Cargo.toml # workspace 配置,声明所有 crate ├── Cargo.lock ├── src/ # 主 crate: zeroclaw │ ├── main.rs # 入口:解析 CLI 参数,分发到三种运行模式 │ ├── agent/ # Layer 2 · 核心 Agent 层 │ │ ├── loop.rs # 对话循环主逻辑 │ │ ├── sop.rs # SOP 任务分解与执行 │ │ └── scheduler.rs # 并发任务调度 │ ├── provider/ # Layer 3 · LLM 提供商适配 │ │ ├── anthropic.rs │ │ ├── openai.rs │ │ ├── gemini.rs │ │ ├── bedrock.rs │ │ ├── local.rs # Ollama / LM Studio / vLLM 通用适配 │ │ └── router.rs # 统一 trait + 提供商选择逻辑 │ ├── tools/ # Layer 3 · 工具实现 │ │ ├── file.rs # file_read, file_write, file_list │ │ ├── shell.rs # shell_exec, process_spawn │ │ ├── web.rs # web_fetch, web_search │ │ ├── grep.rs # grep, find, regex_search │ │ └── registry.rs # 工具注册与分发中心 │ ├── gateway/ # Layer 1 · HTTP/WS 服务器 │ │ ├── server.rs # axum HTTP + WebSocket 服务器 │ │ ├── rpc.rs # JSON-RPC 2.0 协议处理 │ │ └── session.rs # 多客户端会话管理 │ ├── daemon/ # Layer 1 · 后台进程管理 │ │ ├── manager.rs # 进程生命周期控制 │ │ └── watchdog.rs # 崩溃检测与自动恢复 │ ├── safety/ # Layer 4 · 安全子系统 │ │ ├── sandbox.rs # Landlock / Bubblewrap / Seatbelt │ │ └── risk.rs # 工具调用风险评分 │ ├── wasm/ # Layer 3 · WASM 插件运行时 │ │ ├── runtime.rs # Wasmtime 集成 │ │ └── plugin.rs # 插件加载与生命周期管理 │ └── storage/ # Layer 5 · 持久化存储 │ ├── sqlite.rs # 会话历史持久化 │ └── vector.rs # 向量嵌入存储与检索 │ ├── crates/ # Cargo workspace sub-crates │ ├── zeroclaw-core/ # 核心 Agent 逻辑(可作为 lib 被集成) │ │ ├── Cargo.toml │ │ └── src/ │ ├── zeroclaw-tools/ # 所有工具实现(独立测试) │ │ ├── Cargo.toml │ │ └── src/ │ └── zeroclaw-wasm/ # WASM 运行时抽象 │ ├── Cargo.toml │ └── src/ │ ├── plugins/ # 示例 WASM 插件源码 │ ├── web-scraper/ │ └── image-analyzer/ │ ├── config/ # 默认配置模板 │ └── config.toml.example │ └── tests/ # 集成测试 ├── integration_test.rs └── e2e_test.rs
📐 命名规范
zeroclaw 严格遵循 Rust 社区命名规范。所有文件名、模块名、变量名使用 snake_case,
类型名(struct / enum / trait)使用 PascalCase,常量使用 SCREAMING_SNAKE_CASE。
模块边界即 crate 边界:每个主要子系统抽取为独立 sub-crate,暴露最小必要的 pub 接口。
| 目标对象 | 命名规范 | 示例 |
|---|---|---|
| 文件名 / 模块名 | snake_case | agent_loop.rs, provider_router.rs |
| Struct / Enum / Trait | PascalCase | AgentLoop, ProviderError |
| 函数 / 方法 | snake_case | run_loop(), dispatch_tool() |
| 常量 / 静态变量 | SCREAMING_SNAKE_CASE | MAX_TOKENS, DEFAULT_TIMEOUT_MS |
| Crate 名称 | kebab-case | zeroclaw-core, zeroclaw-tools |
| feature flag | kebab-case | wasm-plugins, gateway-mode |
| 错误类型 | PascalCase + Error 后缀 | ToolExecutionError, ProviderError |
| async trait | PascalCase | LlmProvider, ToolHandler |