节点即独立包:manifest + 动态 import
Sim Studio 把「节点」视为最小可交付单元,源码位于 packages/blocks/src/{category}/{name}/,每个节点必须提供 manifest.json:
{
"id": "llm-openai",
"version": "1.0.0",
"runtime": "nodejs",
"entry": "index.ts",
"permissions": ["network", "filesystem:ro"],
"env": { "OPENAI_BASE_URL": "https://api.openai.com" }
}
主进程启动时会扫描 plugins/ 目录,利用 Bun 的 import.meta.resolve 做动态导入,节点注册表仅在内存维护一张 Map<id, BlockModule>。因此新增节点无需重启整个应用,满足热插拔的前置条件。
热插拔四步:上传 → 校验 → 写入 → 挂载
- 上传:前端 tgz 包通过
/api/blocks/upload提交,文件名规则{id}@{version}.tgz。 - 校验:服务端先用
tar -tzf解压列表,再用zod校验 manifest 字段;若声明runtime: python,则额外检查requirements.txt是否存在。 - 写入:校验通过后包体写入
plugins/{id}/{version}/,并在block_versions表插入一行,标记enabled=false。 - 挂载:管理员在 UI 点「启用」后,后端通过
EventEmitter通知所有运行中的WorkflowRunner;runner 收到block:reload事件,把旧模块从require.cache(或import.meta.cache)删除,再重新import(),完成零停机切换。
整个流程平均耗时 <800 ms,其中挂载步骤占 50 ms,对正在执行的流程无影响 —— 正在跑的节点继续用旧代码,新启动的节点用新版本,实现「蓝绿」效果。
沙箱隔离:E2B firecracker microVM
Sim Studio 把「任意代码执行」外包给 E2B,每次运行节点时动态起一台 firecracker microVM:
- 冷启动 ≤400 ms(实测 2025-12 M 系列 Mac + Docker Desktop)。
- 内存限额 512 MB(可配),CPU 1 vCore;超出即 OOMKill,runner 捕获后把任务标记为
FAILED并回滚上游事务。 - 根文件系统只读,仅
/tmp可写,且 size=10 MB,防止日志打爆磁盘。 - 网络默认全关,manifest 里声明 `permissions: [