
Mastra × E2B Desktop在云端 Linux 桌面沙箱中构建可操控桌面的 Agent Workspace【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastraMastra 的mastra/e2b-desktop是一个基于 E2B Desktop 的 computer-use桌面操作沙箱 Provider它在mastra/e2b的 E2B 云沙箱之上叠加了一整套 Linux 桌面环境并提供截图、鼠标、键盘控制能力。本文将带你掌握如何把它接入Workspace与Agent如何用computer能力驱动桌面 Agent以及如何深入底层理解其实现机制。背景为什么需要桌面沙箱常规的代码执行沙箱只能跑命令、读写文件无法“看见”和“操作”一个图形界面。而许多真实任务——操作浏览器、填写 GUI 表单、使用桌面应用——都需要 Agent 具备 computer-use 能力截图观察屏幕、移动鼠标点击、键盘输入。E2B Desktop 正是在 E2B 云沙箱中运行一个完整的 Linux 桌面环境mastra/e2b-desktop把这个桌面环境接入 Mastra Workspace 体系。它的定位非常清晰继承mastra/e2b的E2BSandbox的全部能力命令执行、进程管理、文件上传、暂停/恢复重连同时叠加桌面控制能力e2b/desktopSDK 之于e2bSDK 的扩展方式与mastra/e2b-desktop之于mastra/e2b的扩展方式完全一致——基础 Provider 支持的一切能力都作用在同一个桌面 VM 上。安装在 Mastra 项目中安装npm install mastra/e2b-desktop从源码看package.json 声明了以下依赖关系运行时依赖e2b/desktop^2.3.1与e2b^2.36.0以及 workspace 内的mastra/e2bmastra/core作为 peer dependency版本要求1.67.0-0 2.0.0-0要求 Node.js22.13.0。快速开始把桌面沙箱挂进 Agent以下是完整的接入示例直接取自包的用法文档并补充了可运行细节import { Agent } from mastra/core/agent; import { Workspace } from mastra/core/workspace; import { E2BDesktopSandbox } from mastra/e2b-desktop; const sandbox new E2BDesktopSandbox({ resolution: [1280, 720] }); const agent new Agent({ name: desktop-agent, instructions: You can control a Linux desktop and run shell commands., model: anthropic/claude-sonnet-4-6, // file shell computer 三类工具都会自动注入 workspace: new Workspace({ sandbox }), });关键点resolution: [1280, 720]指定桌面显示分辨率像素宽高也可用dpi指定显示 DPI两者都只对新建的沙箱生效由于沙箱实现了computer能力supportsComputer(sandbox)为trueWorkspace 会自动向 Agent 注入mastra_workspace_computer_*系列工具见下文Computer 能力一节无需手动声明与基础E2BSandbox不同桌面沙箱默认无需构建模板——未显式提供template时使用 E2B 托管的desktop模板源码中的DEFAULT_DESKTOP_TEMPLATE desktop见 sandbox/index.ts。环境变量与鉴权与mastra/e2b一致凭据可通过构造参数或环境变量提供配置项作用回退环境变量apiKeyE2B API 密钥E2B_API_KEYaccessTokenE2B 访问令牌E2B_ACCESS_TOKENdomain自托管 E2B 域名E2B_DOMAINapiUrl自托管 E2B API 地址E2B_API_URL构造选项Options全解E2BDesktopSandboxOptions继承E2BSandboxOptions的全部字段并新增两个桌面专属字段。下表综合了 sandbox/index.ts 与上游 workspaces/e2b/src/sandbox/index.ts 的完整定义选项类型默认值说明resolution[number, number]无SDK 默认桌面分辨率[宽, 高]仅对新建沙箱生效dpinumber无桌面显示 DPI仅对新建沙箱生效idstring自动生成沙箱逻辑 ID用于元数据发现与重连sandboxIdstring无优先按 E2B Provider 沙箱 ID 确定性重连见下文templateTemplateSpecdesktop模板字符串 ID / TemplateBuilder / 定制函数不传则用 E2B 托管 desktop 模板无需构建timeoutnumber300_0005 分钟执行超时毫秒envRecordstring, string{}注入沙箱的环境变量metadataRecordstring, unknown{}自定义元数据会自动合并mastra-sandbox-idnetworkSandboxNetworkOpts无创建时的网络配置lifecycleSandboxLifecycle{ onTimeout: pause }超时行为pause快照暂停下次start()恢复重连kill则销毁重建适合状态外置如 S3 挂载的沙箱domain/apiUrl/apiKey/accessTokenstring环境变量鉴权与自托管配置instructionsstring \| (opts) string默认说明覆盖默认沙箱指令关于 lifecycle 与 timeout 的行为上游E2BSandbox源码注释说明workspaces/e2b/src/sandbox/index.ts默认onTimeout: pause会把整个 VM文件系统、内存、运行中的进程冻结快照并停止计费下次start()重连并恢复后台进程依然存活显式stop()无论该设置如何都会暂停。timeout会被写入创建参数timeoutMs单位毫秒。用 Workspace 执行代码接入 Workspace 后可直接执行代码与命令const sandbox new E2BDesktopSandbox({ timeout: 60_000 }); const workspace new Workspace({ sandbox }); // 在桌面 VM 中执行代码 const result await workspace.executeCode(console.log(Hello from desktop VM!));与基础 Provider 相同桌面沙箱还支持executeCommand、文件上传writeFiles、后台进程管理等能力。集成测试中有一个非常直观的例子通过 shell 写入文件再用桌面 SDK 读回验证 GUI 与 shell 两条通道作用在同一台机器上见 index.integration.test.ts。Computer 能力截屏、鼠标与键盘E2BDesktopSandbox覆写了computer: SandboxComputer能力其全部操作由withDesktop()统一编排先ensureRunning()确保沙箱已启动再通过retryOnDead()在检测到 VM 已死时自动重建并重试。因此所有 computer 操作都会在沙箱未运行时自动启动它。屏幕观察await sandbox.start(); const { data, mediaType } await sandbox.computer.screenshot(); // mediaType image/pngdata 为 PNG 字节 const { width, height } await sandbox.computer.getScreenSize(); const cursor await sandbox.computer.getCursorPosition();getScreenSize()返回{ width, height }getCursorPosition()返回{ x, y }。单元测试验证了截图返回 PNG 魔数\x89PNG见 index.test.ts。鼠标控制await sandbox.computer.leftClick(100, 200); await sandbox.computer.rightClick(100, 200); await sandbox.computer.doubleClick(100, 200); await sandbox.computer.moveMouse(100, 200); await sandbox.computer.drag({ x: 1, y: 2 }, { x: 3, y: 4 }); await sandbox.computer.scroll(down, 3);所有坐标以像素计drag接受起点/终点坐标对象底层映射为desktop.drag([from.x, from.y], [to.x, to.y])scroll接受方向如down与步数。键盘输入await sandbox.computer.type(hello world); // 映射为 desktop.write(text) await sandbox.computer.press(Enter); // 单个按键 await sandbox.computer.press([ctrl, s]); // 组合键type底层调用desktop.writepress支持单个键名或键名数组组合键。测试用例覆盖了这三种调用形态index.test.ts。实时桌面查看noVNC 流const viewerUrl await sandbox.computer.streamUrl();streamUrl()会做三件事通过ensureStreamStarted()启动一个要求鉴权的 VNC 流desktop.stream.start({ requireAuth: true })并按沙箱 ID 记忆化——同一 VM 只启动一次重启/重建的 VM 会重新启动用desktop.stream.getAuthKey()拼出带password参数的 noVNC 查看器 URL兼容外部已启动的流拿不到 auth key 时返回普通 URL任何失败都返回null而非抛错。单元测试验证了重复调用只启动一次流外部已启动的流被容忍失败返回 null等行为index.test.ts。集成测试确认返回 URL 形如https://...且包含passwordindex.integration.test.ts。桌面专属逃生通道sandbox.desktop不是所有桌面 API 都值得抽象进统一接口E2BDesktopSandbox提供了desktopgetter 直接暴露底层e2b/desktopSDK 的Sandbox实例await sandbox.start(); await sandbox.desktop.launch(xfce4-terminal); // 启动应用 await sandbox.desktop.open(https://mastra.ai); // 打开 URL await sandbox.desktop.files.read(/tmp/x.txt); // 文件操作注意desktop在沙箱未启动时访问会抛出SandboxNotReadyError源码 sandbox/index.ts测试见 index.test.ts。这是定制流、窗口管理、启动任意应用等高级操作的入口。生命周期启动、暂停、重连与销毁E2BDesktopSandbox继承了E2BSandbox的生命周期管理并针对桌面场景做了关键改造创建重写createSdkSandbox()调用e2b/desktop的Sandbox.create(templateId, opts)并把resolution、dpi透传给 SDK创建参数包含timeoutMs、lifecycle 以及合并了mastra-sandbox-id的 metadata测试验证了这些透传index.test.ts重连重写connectSdkSandbox()走e2b/desktop的Sandbox.connect(sandboxId, opts)。start()时优先按sandboxId选项确定性重连否则按mastra-sandbox-id元数据发现已有沙箱只有沙箱已消失类错误才回退到新建鉴权、配额、限流、超时、网络错误会直接抛出避免创建重复 VMworkspaces/e2b/src/sandbox/index.ts暂停/恢复stop()对 VM 做快照暂停冻结文件系统、内存与进程并停止计费下次start()重连恢复FUSE 挂载会先卸载、启动时再对账恢复销毁destroy()杀掉全部后台进程、卸载挂载并kill沙箱对未在本进程附着的沙箱按身份直接 pause/kill无需唤醒它workspaces/e2b/src/sandbox/index.ts模板解析重写resolveTemplate()未显式提供template时直接返回 E2B 托管的desktop模板 ID并重写buildDefaultTemplate()为无操作——桌面模板由 E2B 托管无需构建sandbox/index.ts。集成测试对沙箱一致性conformance的声明也印证了能力边界index.integration.test.ts支持重连、并发、环境变量、工作目录与超时不支持挂载FUSE——桌面模板没有 FUSE 工具链这一点与基础 E2BSandbox 的云存储挂载能力不同。在 MastraEditor 中作为可序列化 Provider 使用mastra/e2b-desktop还导出一个e2bDesktopSandboxProvider描述符见 provider.ts用于 MastraEditorimport { e2bDesktopSandboxProvider } from mastra/e2b-desktop; const editor new MastraEditor({ sandboxes: [e2bDesktopSandboxProvider], });该描述符提供 JSON Schema 配置configSchema覆盖template、timeout默认 300000ms、env、metadata、resolution、dpi、domain、apiUrl、apiKey、accessToken等字段不可序列化的回调如 TemplateBuilder、运行时对象被排除在外。编辑器据此渲染配置表单并通过createSandbox(config)实例化真正的E2BDesktopSandbox。自动注入的 computer 工具当 Workspace 挂载支持 computer 能力的沙箱时会向 Agent 注入一组mastra_workspace_computer_*工具截图、点击、输入、滚动等核心包的 tools/types.ts 提供了两个常用调优项screenshotAfterAction动作类工具click/type/scroll 等完成后是否自动附一张新截图让 computer-use 循环无需额外截图即可看到操作后的桌面状态默认truescreenshotDelayMs动作与操作后截图之间的延迟默认 500ms给 UI 菜单、动画留出反应时间。示例配置const agent new Agent({ // ... workspace: new Workspace({ sandbox }), tools: { // 点击后不附加截图减少 token 消耗 mastra_workspace_computer_click: { screenshotAfterAction: false }, // 桌面输入需要人工审批 mastra_workspace_computer_type: { requireApproval: true }, }, });测试与验证方式包内测试分两层单元测试index.test.tsmock 掉e2b与e2b/desktopSDK验证模板解析、SDK 工厂钩子、computer 能力映射、流记忆化、workspace 工具注入、桌面逃生通道等不消耗真实资源集成测试index.integration.test.ts需要真实E2B_API_KEY未设置时自动跳过针对真实桌面沙箱验证截图 PNG 魔数、鼠标移动→光标位置回读、shell 与 GUI 共享文件系统的跨通道回环、鉴权 noVNC URL 解析。想在自己的项目里快速验证可以运行const sandbox new E2BDesktopSandbox({ id: demo-${Date.now()}, timeout: 120_000, }); await sandbox.start(); const shot await sandbox.computer.screenshot(); // PNG 字节 const url await sandbox.computer.streamUrl(); // noVNC 查看器 await sandbox.computer.type(echo desktop-ok /tmp/x); await sandbox.executeCommand(cat /tmp/x); await sandbox.destroy();小结mastra/e2b-desktop让 Mastra Agent 第一次能够看见并操作一个云端 Linux 桌面它完整继承mastra/e2b的命令、进程、文件与暂停/恢复重连能力叠加截图、鼠标、键盘与鉴权 noVNC 实时流默认使用无需构建的 E2B 托管桌面模板并通过mastra_workspace_computer_*工具把这一切自动暴露给 Agent。无论是构建 computer-use 自动化还是需要一个同时支持 GUI 与 shell 的隔离执行环境它都是一个开箱即用的选择。相关代码入口包 README安装、用法与能力概述核心实现 sandbox/index.tsE2BDesktopSandbox与computer能力Provider 描述符 provider.tsMastraEditor 可序列化配置单元测试 index.test.ts 与 集成测试 index.integration.test.ts上游基类 mastra/e2b选项、生命周期、挂载与重连语义computer 工具配置mastra_workspace_computer_*工具行为调优【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考