互动网站建设的主页,公司做网站费用和人员配备,校园网站建设培训简讯,wordpress uc用户中心作者#xff1a;辰泉概述 函数计算 AgentRun 是一个以高代码为核心的一站式 Agentic AI 基础设施平台。秉持生态开放和灵活组装的理念#xff0c;为企业级 Agent 应用提供从开发、部署到运维的全生命周期管理。 在开发 AgentRun 的过程中#xff0c;我们发现了一个让人头疼的…作者辰泉概述函数计算 AgentRun 是一个以高代码为核心的一站式 Agentic AI 基础设施平台。秉持生态开放和灵活组装的理念为企业级 Agent 应用提供从开发、部署到运维的全生命周期管理。在开发 AgentRun 的过程中我们发现了一个让人头疼的问题现有的沙箱方案太零散了。浏览器、代码执行、Shell 环境各自为政导致开发效率大打折扣。于是我们决定自己动手打造一个真正一体化的解决方案——All-In-One SandboxAIO。AIO 是 AgentRun 提供的云上浏览器自动化沙箱环境它把浏览器、终端和代码执行能力全部集成在一个容器里。通过简单的 SDK 调用你就能让 LLM 驱动复杂的 Web 自动化任务再也不用在多个沙箱之间疲于奔命。为什么选择 AIO说实话传统的沙箱方案让我们吃尽了苦头。大多数沙箱都是单一用途的要么只能跑浏览器要么只能执行代码这带来了几个实实在在的痛点1. 文件共享简直是个噩梦浏览器沙箱下载的文件得先上传到 NAS/OSS代码沙箱才能用代码生成的文件又要重新上传其他沙箱再下载多个沙箱之间的文件传递慢得像蜗牛爬2. 工具协调复杂到想哭一个完整的 Agent 任务通常需要同时调用浏览器 代码 Shell得手动编排多个沙箱的启动、通信和数据传递调试时要在好几个地方来回切换看日志效率低得让人抓狂3. 环境配置繁琐到崩溃本地方案Node.js、浏览器、各种系统依赖装得手都酸了多沙箱方案每个环境都要单独配置和管理最要命的是环境污染问题——任务之间互相干扰资源清理成了日常难题4. 成本和效率双重打击多个沙箱同时运行内存占用翻倍文件传输走网络 I/O延迟高得离谱还得额外付费买 OSS/NAS 存储服务AIO 沙箱的核心优势架构一览统一文件系统我们的解决方案很简单粗暴把所有组件浏览器、Shell、代码执行、文件系统都塞进同一个沙箱实例里。性能对比一目了然对比项传统多沙箱方案All-In-One 沙箱启动时间2 个沙箱启动 4-15秒(串/并行创建)1 个沙箱启动 5秒文件传递通过 OSS耗时 2-3秒直接访问100ms内存占用2×独立运行 2c2g2c2g1×共享运行 2c2g底层技术栈很扎实浏览器Chromium 136 (固定版本稳定可靠)协议WebSocket CDP (:5000/ws/automation 端口)隔离函数计算资源、本地文件系统的隔离及严格的资源限制文件系统支持实例级别的 NAS/OSS 动态挂载五大核心能力开箱即用代码执行内置 Node.js 原生 Puppeteer 自动化脚本支持文件处理提供 FileSystem API可通过 MCP 方式调用状态保持结合 OSS/NAS 动态挂载完美支持多步骤任务和状态传递实时日志流式输出执行日志监控起来毫不费力多工具集成VNC、Terminal、代码执行无缝配合想怎么用就怎么用云上沙箱真的零配置基于函数计算架构我们做到了零配置不用装任何环境API 调用就能直接上手环境隔离每次执行都是全新的沙箱完全互不干扰自动清理执行完自动释放资源绝不留垃圾安全可控代码在隔离环境中运行Agent 宿主系统稳如泰山按需扩展根据负载自动创建/销毁沙箱实例省钱又省心多种访问方式灵活到飞起不管你是开发者还是运维都能找到适合自己的使用方式接口用途访问方式代码执行 API执行 Node.js/Python 脚本SDK 方法VNC可视化浏览器交互、人工介入Web 集成Terminal WebSocket实时 Shell 交互WebSocket文件 API读写持久化文件SDK 方法这些场景特别适合用 AIO数据采集电商、社交媒体、新闻网站自动化测试Web 应用功能测试RPA 任务表单填写、批量操作LLM Agent让 AI 自动生成和执行浏览器自动化脚本云开发环境团队标准化工具和远程开发多步骤工作流带有视觉反馈的自动化流程AIO 沙箱集成指南1.1 核心概念沙箱实例到底是什么每个沙箱实例本质上就是一个基于函数计算环境的会话容器里面已经预装好了你需要的一切Chromium 浏览器已启动监听在 CDP 端口 5000Node.js 运行时预装 puppeteer-coreVNC 服务可选调试和人工介入时超有用1.2 快速开始注意本文假设你已经看过前面的实践系列文章了解 template 和 sandbox 的关系并且正确创建了 template。如果你还没做过这些建议先回去补课。安装 SDK很简单推荐用 python 3.11 环境兼容性最好。pip install agentrun-sdk[server,playwright]第一个任务验证沙箱基本功能from agentrun.sandbox import Sandbox, TemplateType import asyncio async def quick_start(): 验证沙箱基本功能 sandbox Sandbox.create( template_typeTemplateType.AIO, template_namequick-test, sandbox_idle_timeout_seconds600 ) print(f沙箱已创建: {sandbox.sandbox_id}) # 核心连接已运行的浏览器提取页面信息 code const puppeteer require(puppeteer-core); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; await page.goto(https://example.com); console.log(await page.title()); await browser.disconnect(); await sandbox.context.execute_async(codecode, languagejavascript) sandbox.destroy() asyncio.run(quick_start())多步骤任务实战关键技巧用disconnect()保持浏览器运行通过文件系统传递状态。第一步打开登录页const puppeteer require(puppeteer-core); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; await page.goto(https://example.com/login); console.log(请在 VNC 中完成登录); await browser.disconnect();第二步保存 Cookieconst fs require(fs); const puppeteer require(puppeteer-core); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; const cookies await page.cookies(); fs.writeFileSync(/home/user/data/cookies.json, JSON.stringify(cookies)); console.log(Cookie 已保存); await browser.disconnect();第三步用 Cookie 爬数据const fs require(fs); const puppeteer require(puppeteer-core); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; const cookies JSON.parse(fs.readFileSync(/home/user/data/cookies.json)); await page.setCookie(...cookies); await page.goto(https://example.com/data); // 执行数据采集 await browser.disconnect();为什么要用多步骤模式绕过验证码人工登录搞定验证码后续任务全自动状态持久化Cookie 保存到文件支持断点续传资源优化浏览器一直运行着不用重复启动浪费时间完整代码参见文末附录Github 示例仓库。1.3 关键概念说明代码执行方式通过sandbox.context.execute_async()方法执行代码result await sandbox.context.execute_async( codeconsole.log(Hello), languagejavascript, # 或 python timeout300 # 超时时间秒 )返回格式很清晰{ contextId: ctx_xxx, # 上下文 ID results: [ {type: stdout, text: Hello\n}, {type: result, value: null} ] }文件操作超简单# 写入文件 sandbox.file.write( path/home/user/data/result.json, content{key: value}, encodingutf-8 ) # 读取文件 content sandbox.file.read(/home/user/data/result.json) # 上传本地文件 sandbox.file_system.upload( local_file_path./local_file.txt, target_file_path/home/user/data/file.txt ) # 下载文件 sandbox.file_system.download( path/home/user/data/result.json, save_path./result.json )最佳实践2.1 多步骤任务模式什么时候用需要登录、人工介入、或者数据量很大的时候。标准流程步骤 1打开登录页 → 通过 VNC 人工登录 步骤 2保存 Cookie 到文件系统 步骤 3使用 Cookie 执行数据采集实操要点1.sandbox_idle_timeout_seconds 1800保持一定时间状态可用闲置超时后自动回收。一定要用disconnect()保持浏览器运行close()会关掉浏览器。通过/home/user/data/目录传递 Cookie 和进度。VNC URL 用sandbox.sandbox_id和 base URL 拼起来就行。文件操作就用sandbox.file.read()和sandbox.file.write()。2.2 LLM Agent 集成模式适用场景让 AI 自动生成和执行浏览器自动化代码非技术用户也能用。整体架构三条铁律必须遵守禁止puppeteer.launch()→ 必须puppeteer.connect()禁止browser.close()→ 必须browser.disconnect()禁止随便存文件 → 必须/home/user/data/xxx.json为什么这么严格违反约束会导致浏览器重启之前的状态全没了AI 生成代码需要明确指导不能指望它有“常识”详细内容见第 4 章系统提示词设计2.3 Cookie 持久化模式什么时候需要要保持登录状态跨会话复用的时候。完整流程首次登录 1. 人工登录 → 2. 保存 Cookie → 3. 持久化存储 后续使用 1. 上传Cookie - 2. 读取 Cookie → 3. 恢复会话 → 4. 执行任务Cookie 保存示例const puppeteer require(puppeteer-core); const fs require(fs); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; const cookies await page.cookies(); // 保存到文件系统 fs.writeFileSync(/home/user/data/cookies.json, JSON.stringify(cookies, null, 2)); console.log(Cookie 已保存); await browser.disconnect();Cookie 恢复示例const puppeteer require(puppeteer-core); const fs require(fs); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; // 读取 Cookie const cookies JSON.parse(fs.readFileSync(/home/user/data/cookies.json)); // 恢复会话 await page.setCookie(...cookies); await page.goto(https://example.com/protected); console.log(登录状态已恢复); await browser.disconnect();关键提醒Cookie 一定要保存到/home/user/data/目录这样才有权限用page.cookies()获取所有 Cookie一个都不能少用page.setCookie(...cookies)恢复顺序很重要别忘了检查 Cookie 过期时间和安全性2.4 批量任务模式适用场景需要并发处理大量任务的时候。两种策略策略 1单沙箱顺序执行简单任务有依赖关系 策略 2多沙箱并发执行复杂任务无依赖关系选择建议策略适用场景优势单沙箱顺序执行简单任务依赖前序结果资源占用低状态连续多沙箱并发执行复杂任务无依赖关系执行速度快并行处理并发控制示例# 使用 asyncio.gather() 实现并发 tasks [ process_item(item) for item in items ] results await asyncio.gather(*tasks, return_exceptionsTrue)实战案例豆瓣电影 Top250 爬取完整的 Demo 代码可以在示例仓库里找到。3.1 需求分析目标很明确抓取豆瓣电影 Top250 的电影信息标题、评分、导演、年份等。实际挑战豆瓣必须登录才能看完整信息2. 数据分页展示需要多步骤采集3. 反爬虫机制相当严格我们的解法AIO Sandbox 的 Cookie 持久化 多步骤任务模式。3.2 核心实现流程步骤 1首次登录并保存 Cookie// 1. 打开登录页 const puppeteer require(puppeteer-core); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; await page.goto(https://accounts.douban.com/passport/login); console.log(请在 VNC 中完成登录); console.log(登录完成后程序将自动保存 Cookie); await browser.disconnect();操作说明用户在 VNC 中手动完成登录包括验证码登录成功后进入下一步步骤 2保存 Cookieconst puppeteer require(puppeteer-core); const fs require(fs); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; const cookies await page.cookies(); fs.writeFileSync(/home/user/data/douban_cookies.json, JSON.stringify(cookies, null, 2)); console.log(Cookie 已保存共 ${cookies.length} 条); await browser.disconnect();步骤 3用 Cookie 爬取数据const puppeteer require(puppeteer-core); const fs require(fs); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); const page (await browser.pages())[0]; // 恢复 Cookie const cookies JSON.parse(fs.readFileSync(/home/user/data/douban_cookies.json)); await page.setCookie(...cookies); // 访问 Top250 await page.goto(https://movie.douban.com/top250, { waitUntil: networkidle2 }); // 提取数据 const movies await page.evaluate(() { return Array.from(document.querySelectorAll(.item)).map(item ({ title: item.querySelector(.title)?.textContent, rating: item.querySelector(.rating_num)?.textContent, quote: item.querySelector(.inq)?.textContent })); }); // 保存结果 fs.writeFileSync(/home/user/data/movies.json, JSON.stringify(movies, null, 2)); console.log(爬取完成共 ${movies.length} 部电影); await browser.disconnect();3.3 完整 Python 代码具体实现可以参考项目的src/ai_code_generator.py和src/sandbox_executor.py。核心逻辑from agentrun.sandbox import Sandbox, TemplateType import asyncio async def scrape_douban(): # 1. 创建沙箱 sandbox Sandbox.create( template_typeTemplateType.AIO, template_namedouban-scraper, sandbox_idle_timeout_seconds1800 ) # 2. 执行登录步骤代码略参考上面 # 3. 保存 Cookie代码略参考上面 # 4. 爬取数据代码略参考上面 # 5. 读取结果 result sandbox.file.read(/home/user/data/movies.json) print(result) asyncio.run(scrape_douban())3.4 核心技术点总结Cookie 持久化避免重复登录通过文件系统保存和恢复登录状态connect() disconnect()保持浏览器运行完美支持多步骤任务文件系统状态传递跨步骤共享数据无需网络 I/O 开销3.5 扩展功能分页爬取完整 Top250const movies []; for (let page_num 0; page_num 250; page_num 25) { await page.goto(https://movie.douban.com/top250?start${page_num}); const items await page.evaluate(() { // 提取逻辑 }); movies.push(...items); // 延迟防止反爬 await page.waitForTimeout(2000); } fs.writeFileSync(/home/user/data/all_movies.json, JSON.stringify(movies));错误处理和重试生产必备async function scrapeWithRetry(url, maxRetries 3) { for (let i 0; i maxRetries; i) { try { await page.goto(url, { waitUntil: networkidle2, timeout: 30000 }); return true; } catch (error) { console.log(重试 ${i 1}/${maxRetries}: ${error.message}); await page.waitForTimeout(5000); } } return false; }系统提示词设计4.1 为什么提示词这么重要系统提示词System Prompt是 LLM Agent 的大脑直接决定了 AI 如何理解和执行你的需求。对于 AIO Sandbox 集成来说提示词必须明确告诉 AI 如何生成符合沙箱规范的代码。4.2 我们的设计哲学在设计提示词之前你得先理解 All-In-One Sandbox 的核心理念这直接影响提示词的结构。人机协作不是完全自动化我们承认有些事情 AI 就是搞不定比如验证码、滑块验证、短信验证。所以 AIO 采用“人机协作”的设计理念可观测性优先通过 VNC 让执行过程完全透明你能亲眼看到浏览器在做什么不用再通过日志猜来猜去直接看页面状态快速定位问题人机协作而非完全自动遇到验证码没问题人工介入搞定人工操作完自动化任务接着跑无缝衔接状态持久化浏览器会话和数据可以跨步骤保存和恢复用disconnect()保持浏览器运行状态不会丢4.3 核心约束与最佳实践提示词必须明确告诉 AI 这些关键约束1. 必须用 connect()别用 launch()为什么看看对比就知道了传统方式 (错误): const browser await puppeteer.launch(); // 启动新浏览器 (1-3 秒) // 执行任务 await browser.close(); // 状态全部丢失 All-In-One 方式 (正确): const browser await puppeteer.connect({ // 连接已运行的浏览器 (100ms) browserWSEndpoint: ws://localhost:5000/ws/automation }); // 执行任务 await browser.disconnect(); // 保持浏览器运行技术原因很简单浏览器在容器启动时就已经跑起来了用launch()会启动第二个浏览器纯属浪费资源connect()几乎瞬间连接特别适合多步骤任务2. 必须用 disconnect()别用 close()关键区别在这browser.close(): - 关闭所有页面 - 终止浏览器进程 - 清理所有状态 - 无法支持多步骤任务 - VNC 显示中断 browser.disconnect(): - 只断开 Puppeteer 连接 - 浏览器继续运行 - 所有状态保留 - 支持多步骤任务 - VNC 显示连续3. Cookie 持久化是王道登录状态的本质就是 Cookie用户登录 → 服务器设置 Cookie → 后续请求携带 Cookie → 服务器识别用户没有持久化会怎样Sandbox 重建后状态全丢长时间后 Cookie 过期频繁重新登录烦死了标准做法保存 Cookieconst cookies await page.cookies(); fs.writeFileSync( /home/user/data/cookies.json, JSON.stringify(cookies, null, 2) );加载 Cookieconst cookies JSON.parse( fs.readFileSync(/home/user/data/cookies.json) ); // 先访问对应域名 await page.goto(https://example.com); // 再设置 Cookie await page.setCookie(...cookies);4.4 实用提示词模板基础模板直接复制就能用你是 AgentRun AIO Sandbox 的代码生成助手。你的任务是将用户需求转换为可在沙箱中执行的 Puppeteer 代码。 【环境信息】 - 浏览器Chromium (已预启动) - 连接端点ws://localhost:5000/ws/automation - 文件系统/home/user/data/ (持久化目录) - 超时限制单次执行 300 秒 【代码规范】 1. 连接浏览器 const puppeteer require(puppeteer-core); const browser await puppeteer.connect({ browserWSEndpoint: ws://localhost:5000/ws/automation }); 2. 结束会话 await browser.disconnect(); 3. 文件读写 const fs require(fs); // 读取 const data fs.readFileSync(/home/user/data/file.json); // 写入 fs.writeFileSync(/home/user/data/file.json, JSON.stringify(data)); 4. 错误处理 try { // 代码逻辑 } catch (error) { console.error(错误: ${error.message}); throw error; } 【输出要求】 - 生成完整的 JavaScript 代码 - 包含必要的错误处理 - 关键步骤用 console.log() 记录 - 重要结果保存到文件系统4.5 AI 对话模式的工作原理AI 对话模式让非技术用户也能用浏览器自动化系统提示词在里面起着关键的“翻译”作用。智能任务拆分好的提示词要能指导 AI 自动判断何时拆分任务简单任务不拆分用户: 访问 example.com获取页面标题 AI 直接生成单个代码块执行后返回结果需要登录自动拆分用户: 登录豆瓣然后获取我的收藏 AI 自动拆分为 3 个步骤 步骤 1: 打开登录页 → [生成代码1] → 请在 VNC 中完成登录 步骤 2: 保存 Cookie → [生成代码2] → 已保存 15 个 Cookie 步骤 3: 获取收藏 → [生成代码3] → 找到 25 部收藏电影引导人工操作遇到需要人工介入的步骤AI 要明确告诉用户该怎么做AI: 我已经打开了登录页面请在 VNC 窗口中 1. 输入用户名和密码 2. 输入验证码 3. 点击登录按钮 完成后告诉我登录完成我将继续后续步骤。高级技巧与注意事项5.1 错误处理生产环境必备永远用 try-catch 包裹核心操作try { // 核心操作 await page.goto(url, { waitUntil: networkidle2, timeout: 30000 }); } catch (error) { // 明确的错误信息 console.error(操作失败: ${error.message}); // 可选重试逻辑 if (error.name TimeoutError retryCount maxRetries) { console.log(超时重试第 ${retryCount 1} 次); await new Promise(resolve setTimeout(resolve, 5000)); return executeWithRetry(url, retryCount 1); } throw error; }5.2 性能优化速度提升明显禁用不必要的资源加载await page.setRequestInterception(true); page.on(request, (req) { const resourceType req.resourceType(); // 丢弃图片、样式、字体等非关键资源 if ([image, stylesheet, font, media].includes(resourceType)) { req.abort(); } else { req.continue(); } });5.3 安全注意事项Cookie 安全重中之重# .gitignore 中必须包含 *_cookies.json cookies.json *.env代码注入防护// 危险直接拼接用户输入 const userInput req.query.selector; await page.click(userInput); // 安全白名单验证 const allowedSelectors [.button-primary, .submit-btn]; if (!allowedSelectors.includes(userInput)) { throw new Error(非法选择器); } await page.click(userInput);5.4 调试技巧省时省力VNC 实时观察最有效# 创建沙箱后立即获取 VNC URL vnc_url fhttps://vnc.example.com/sandbox/{sandbox.sandbox_id} print(f打开 VNC: {vnc_url})截图调试关键时刻救命// 登录前后都截图 await page.screenshot({ path: /home/user/data/before_login.png, fullPage: true }); await page.screenshot({ path: /home/user/data/after_login.png, fullPage: true });核心总结技术收益一目了然使用 AIO sandbox 能够将状态传递和文件共享复杂度进行有效地降低并且能够有如下收益启动延迟低从原有的多个 sandbox 优化为了一个 sandbox降低了至少 50% 的启动时间状态保持轻量在代码执行和浏览器操作的过程中能够尽量使用本地文件系统实现状态保持符合最佳实践VNC 的透出提供了人工介入的手段有效帮助用户解决了自动化的卡点如验证等。7 条黄金法则必须用puppeteer.connect()禁止launch()必须用browser.disconnect()禁止close()必须保存数据到/home/user/data/目录登录流程拆分打开登录页 → 人工登录 → 保存 Cookie → 执行任务Cookie 先访问域名再设置避免跨域问题多步骤任务用文件系统传递状态别用全局变量重要操作必须加错误处理别让错误静默失败常见陷阱避坑指南陷阱症状解决方案用 launch()浏览器重复启动内存爆了改用 connect()用 close()后续步骤失败状态丢了改用 disconnect()Cookie 没持久化每次都要重新登录保存到 /home/user/data/cookies.json等待时间不足元素找不到报错用 waitForSelector networkidle2路径不规范文件丢失或权限错误统一用 /home/user/data/ 目录进阶学习路径1. 源码分析https://github.com/devsapp/agentrun-sandbox-demos/tree/main/sandbox-all-in-one-demo2. 性能调优禁用图片/字体资源用networkidle2等待策略批量处理数据减少 I/O3. 错误处理指数退避重试策略最大重试次数控制超时和网络错误处理附录Demo 代码GitHubhttps://github.com/devsapp/agentrun-sandbox-demos官方文档https://docs.agent.run/沙箱教程https://docs.agent.run/docs/tutorial/core/sandbox