学习笔记 · Obsidian

Provider Sandbox:运行时与隔离

LangChainTypeScript

选型矩阵

Backend包 / 认证生命周期与资源适用场景生产边界
Daytona@langchain/daytona;DAYTONA_API_KEYTypeScript/Python/JS;默认命令超时 300 秒;US/EU;支持 image/snapshot、stop/start/reconnect多语言开发,快速冷启动close() 永久删除;自定义 CPU/内存/盘要求 image;必须管控 image 来源与 egress
Deno Deploy@langchain/deno;DENO_DEPLOY_TOKENLinux microVM;768–4096 MB、10 GB、2 vCPU;session 或 duration lifetime;AMS/ORDDeno/JavaScript,HTTP/SSH/JS runtime默认网络完全开放;只有 duration lifetime 可重连;要显式关闭端口和限制出口
Modal@langchain/modal;token ID + secret容器、CPU/内存/GPU、volume、secret;默认 300000 ms;可按 ID/name 重连Python/ML/GPUblockNetwork 应按需启用;volume 和 secret 是独立持久权限面;GPU 成本需限额
Node VFS@langchain/node-vfs;无认证内存 VFS,执行时同步到 temp;默认 30 秒;无持久化和资源限额本地开发、测试、无 Docker CI不是真正容器隔离,文档明确不适合生产不可信代码或重计算

初始化与清理模式

四个 backend 都可作为 createDeepAgent({ backend }) 的执行环境,也可独立 execute()。远程 sandbox 统一采用结构化资源管理:

const sandbox = await ProviderSandbox.create(options);
try {
  return await sandbox.execute(command);
} finally {
  await sandbox.close();
}

但生命周期语义不同:Daytona 的 stop() 可恢复、close() 永久删除;Deno duration sandbox 在关闭连接后仍可重连;Modal 可从 ID/name 恢复;Node VFS 使用 stop(),没有跨 session 持久化。不能用一个通用 close 假设覆盖所有 provider。

错误模型

远程 backend 共享的主要错误包括未初始化、重复初始化、认证失败、创建失败、sandbox 不存在、命令超时、命令失败、文件操作失败和资源超限。Daytona 另有未启动状态;Modal 另有 volume error;Node VFS 另有初始化失败和 runtime 不支持。

处理原则:

  • 认证失败、无权限、无效 image 与输入错误不自动重试;
  • 创建失败、429、短暂网络错误只做有界退避,并以 invocation id 去重;
  • 命令超时后不能假定进程已终止,要查询或销毁 sandbox;
  • 文件上传失败要校验远端哈希,不能仅以 API 200 判断完整;
  • 资源超限应归类为配额/容量问题,不通过无限提高 timeout 掩盖。

生产隔离清单

  1. 每个请求或租户使用独立 sandbox;若复用,必须清空文件、进程、环境变量和网络状态。
  2. 不把宿主 secret 自动复制进 agent 环境;按工具、租户和时限注入最小凭据。
  3. 默认禁网或只允许域名白名单。Deno 文档的默认 full network 尤其需要额外策略。
  4. 固定受信 image digest,不运行任意用户 image;禁用特权、宿主挂载和容器 socket。
  5. 同时限制 wall time、CPU、内存、磁盘、进程数、输出字节与下载大小。
  6. agent 生成的 shell 视为不可信输入;记录命令摘要、sandbox id、退出码和资源使用,但脱敏 stdout/stderr。
  7. 为异常退出设置后台回收器,按 sandbox id 幂等清理泄漏资源。
  8. 暴露 HTTP/SSH 端口要短期授权、随机地址、到期回收,不能依赖“难猜 URL”作为认证。

Node VFS 的准确定位

Node VFS 通过内存文件系统与临时目录同步来兼容 shell;polyfill 不可用时还会完全回退到 temp directory。它能隔离测试文件视图,却没有容器级进程、网络或资源隔离。适合 deterministic fixture、CI 和快速原型;任何来自用户或模型的任意代码都应转到真实 sandbox。