工程与安全学习导航
前面的文档回答了“nanobot 如何完成一次 Turn”。这一部分换一个角度:当多个请求同时到达、用户中途停止、Provider 暂时失败、进程被关闭,或者模型试图访问工作区之外时,系统怎样避免混乱和数据损坏?
对应源码
| 风险主题 | 源码 |
|---|---|
| 并发、取消和 Turn 资源 | nanobot/agent/loop.py、nanobot/agent/runner.py |
| Provider、Tool 和持久化错误 | nanobot/providers/base.py、nanobot/agent/tools/、nanobot/session/manager.py |
| 可观测性和测试 | nanobot/bus/runtime_events.py、nanobot/agent/hook.py、tests/ |
| Workspace、Shell 和 SSRF | nanobot/security/、nanobot/agent/tools/shell.py、sandbox.py |
| 打包和前端构建 | pyproject.toml、hatch_build.py、webui/、nanobot/web/ |
学习目标
完成本部分后,你应当能够:
- 画出 nanobot 的主要并发边界;
- 区分超时、取消、可恢复错误和不可恢复错误;
- 根据日志、状态轨迹、Runtime Event 和持久化文件选择观察点;
- 解释 workspace guard、shell sandbox 和 SSRF guard 各自保护什么;
- 理解 Python 包、WebUI 静态资源和 Bridge 如何进入发布产物。
前置知识
- 完成 一次 Turn 学习导航;
- 完成 状态与长期运行;
- 知道
asyncio.Task、Lock、Semaphore和CancelledError的基本含义。若还不熟悉,先回看 Python 与异步编程最低要求。
推荐顺序
| 顺序 | 文档 | 核心问题 |
|---|---|---|
| 1 | asyncio 并发、取消与资源清理 | 哪些任务能并行,哪些必须串行? |
| 2 | 错误、重试与数据一致性 | 失败后应该重试、降级、保存还是终止? |
| 3 | 日志、RuntimeEvent 与测试策略 | 应该观察哪一层证据? |
| 4 | Workspace、Shell 与 SSRF 安全边界 | “限制到工作区”到底保证了什么? |
| 5 | 打包、WebUI 构建与跨平台 | 源码如何变成可安装、可运行的产品? |
一张工程风险地图
flowchart LR A["并发请求"] --> A1["Session Lock"] A --> A2["全局 Semaphore"] A --> A3["Tool concurrency_safe"] B["中断与关闭"] --> B1["Task.cancel"] B --> B2["恢复运行 checkpoint"] B --> B3["关闭 MCP / Channel"] B --> B4["Session flush_all"] C["外部失败"] --> C1["Provider retry"] C --> C2["Fallback"] C --> C3["错误转为可见结果"] D["不可信输入"] --> D1["Tool schema"] D --> D2["Workspace guard"] D --> D3["SSRF guard"] D --> D4["Shell sandbox"] E["进程崩溃"] --> E1["临时文件"] E --> E2["os.replace"] E --> E3["必要时 fsync"]
这张图中的机制不是同一个“安全层”。例如,Session Lock 解决同一会话并发写入问题,却不会阻止模型读取私有文件;SSRF guard 阻止内网目标,却不会限制普通公网请求的内容。
本部分的事实边界
应用级 guard 不等于操作系统隔离
当
restrictToWorkspace开启但没有系统 sandbox 时,nanobot 会通过路径解析和命令检查实施应用级限制。源码明确把这种状态标为application且enforced=False。不要把它描述成不可绕过的 OS 安全边界。
没有统一的“事务层”
Session、Cron、Memory、配置和 WebUI 状态分别采用自己的写入策略。某个文件使用了
os.replace,不能推出所有状态都具备相同耐久性。
主要源码入口
nanobot/agent/loop.pynanobot/agent/runner.pynanobot/providers/base.pynanobot/session/manager.pynanobot/cron/service.pynanobot/agent/tools/shell.pynanobot/agent/tools/sandbox.pynanobot/security/workspace_access.pynanobot/security/workspace_policy.pynanobot/security/network.pynanobot/cli/commands.pypyproject.tomlwebui/vite.config.ts