找回密码
 立即注册
首页 业界区 业界 快速上手:LangChain + AgentRun 浏览器沙箱极简集成指 ...

快速上手:LangChain + AgentRun 浏览器沙箱极简集成指南

啦迩 19 小时前
前言

在 Agentic AI 时代,智能体需要与真实世界交互,而浏览器是连接虚拟世界与现实世界的重要桥梁。AgentRun Browser Sandbox 为智能体提供了安全、高性能、免运维的浏览器执行环境,让 AI Agent 真正具备"上网"的能力——从网页抓取、信息提取到表单填写、自动化操作,一切皆可实现。
AgentRun Browser Sandbox 介绍

什么是 Browser Sandbox?

Browser Sandbox 是 AgentRun 平台提供的云原生无头浏览器沙箱服务,基于阿里云函数计算(FC)构建。它为智能体提供了一个安全隔离的浏览器执行环境,支持通过标准的 Chrome DevTools Protocol (CDP) 远程控制浏览器实例。
核心特性

无头浏览器能力

  • 内置 Chromium/Chrome 浏览器,支持完整的 Web 标准
  • 原生兼容 Puppeteer、Playwright 等主流自动化框架
  • 支持通过 CDP 协议进行精细化控制
实时可视化

  • 内置 VNC 服务,支持实时查看浏览器界面
  • 提供操作录制功能,方便调试和回放
  • 支持通过 noVNC 客户端在网页中直接观看
安全与隔离

  • 每个沙箱实例运行在独立的容器环境中
  • 文件系统和进程空间完全隔离
  • 支持 WSS 加密传输,确保数据安全
Serverless 架构

  • 按需创建,按量付费,无需提前预置资源
  • 快速弹性伸缩,支持高并发场景
  • 零运维,无需管理服务器和浏览器依赖
主要应用场景


  • AI Agent 赋能: 为大模型提供"眼睛"和"手",执行网页浏览、信息提取、在线操作等任务
  • 自动化测试: 在云端运行端到端(E2E)测试和视觉回归测试
  • 数据采集: 稳定、高效地进行网页抓取,应对动态加载和反爬虫挑战
  • 内容生成: 自动化生成网页截图或 PDF 文档
上手使用 Agentrun Browser Sandbox

AgentRun SDK 快速介绍

后续的内容将基于 Agentrun SDK 进行,因此我们先对 SDK 进行简要介绍
AgentRun SDK 是一个开源的 Python 工具包,旨在简化智能体与 AgentRun 平台各种服务(包括 Browser Sandbox)的集成。它提供了统一的接口,让您可以用几行代码就将沙箱能力集成到现有的 Agent 框架中。SDK 的核心功能如下:
统一集成接口

  • 提供对 LangChain、AgentScope 等主流框架的开箱即用支持
  • 统一的模型代理接口,简化多模型管理
  • 标准化的工具注册机制
Sandbox 生命周期管理

  • 自动创建和销毁沙箱实例
  • 支持会话级别的状态保持
  • 灵活的资源配置和超时控制
安装 AgentRun SDK
  1. pip install agentrun-sdk[playwright,server]
复制代码
注意: 确保您的 Python 环境版本在 3.10 及以上。
基本使用示例

以下是使用 AgentRun SDK 创建和管理 Browser Sandbox 的核心代码:
  1. from agentrun.sandbox import Sandbox, TemplateType
  2. from playwright.sync_api import sync_playwright
  3. # 创建 Browser Sandbox
  4. sandbox = Sandbox.create(
  5.     template_type=TemplateType.BROWSER,
  6.     template_name="your-template-name",
  7.     sandbox_idle_timeout_seconds=300
  8. )
  9. # 获取 CDP URL(用于 Playwright 连接)
  10. cdp_url = sandbox.get_cdp_url()
  11. # 使用 Playwright 连接并操作
  12. with sync_playwright() as p:
  13.     browser = p.chromium.connect_over_cdp(cdp_url)
  14.     page = browser.contexts[0].pages[0]
  15.    
  16.     page.goto("https://www.example.com")
  17.     page.screenshot(path="screenshot.png")
  18.    
  19.     browser.close()
  20. # 销毁 Sandbox
  21. sandbox.delete()
复制代码
关键概念:

  • template_name: 控制台创建的浏览器环境模板
  • cdp_url: 用于 Playwright/Puppeteer 连接
  • vnc_url: 用于实时查看浏览器画面(可通过 sandbox.get_cdp_url() 获取)
注意: 由于所有浏览器操作都在云端进行,您无需在本地安装浏览器。Playwright 仅用于通过 CDP 协议连接到云端的浏览器实例。
如何创建 sandbox 模板

使用 Browser Sandbox 需要新建 Sandbox 模板,您需要访问  Agentrun 控制台网站,并按照如下步骤创建模板:

  • 在顶部菜单栏选择“运行时与沙箱”;
  • 在左侧边栏选择“Sandbox沙箱”;
  • 点击右上角“创建沙箱模板”;
1.png


  • 选择“浏览器”;
    2.png

  • 在弹出的抽屉对话框中填写和选择您的模板的规格、网络等配置,并复制模板名称;
3.png

6. 点击“创建浏览器” 等待其就绪即可。
从零开始用 LangChain 创建 Browser Sandbox 智能体

本教程将指导您从零开始创建一个完整的 Browser Sandbox 智能体项目。
基于 LangChain 集成 Browser Sandbox

本教程将详细讲解如何使用 LangChain 创建 Browser Sandbox 相关的 tools 并集成到 Agent 中。
项目结构

为了保持代码的内聚性和可维护性,我们将代码拆分为以下模块:
模块职责划分:

  • sandbox_manager.py: 负责 Sandbox 的创建、管理和销毁,提供统一的接口
  • langchain_agent.py: 负责创建 LangChain tools 和 Agent,集成 VNC 信息
  • main.py: 作为入口文件,演示如何使用上述模块
步骤 1: 创建项目并安装依赖

首先创建项目目录(如果还没有):
  1. mkdir -p langchain-demo
  2. cd langchain-demo
复制代码
创建 requirements.txt 文件,内容如下:
  1. # LangChain 核心库
  2. langchain>=0.1.0
  3. langchain-openai>=0.0.5
  4. langchain-community>=0.0.20
  5. # AgentRun SDK
  6. agentrun-sdk[playwright,server]>=0.0.8
  7. # 浏览器自动化
  8. playwright>=1.40.0
  9. # 环境变量管理
  10. python-dotenv>=1.0.0
复制代码
然后安装依赖:
  1. pip install -r requirements.txt
复制代码
主要依赖说明:

  • langchain 和 langchain-openai: LangChain 核心库
  • agentrun-sdk[playwright,server]: AgentRun SDK,用于 Sandbox 管理
  • playwright: 浏览器自动化库 python-dotenv: 环境变量管理
步骤 2: 配置环境变量

在项目根目录创建 .env 文件,配置以下环境变量:
  1. # 阿里云百炼平台的 API Key,用于调用大模型能力
  2. # 请前往 https://bailian.console.aliyun.com/?tab=app#/api-key 创建和查看
  3. DASHSCOPE_API_KEY=sk-your-bailian-api-key
  4. # 阿里云账号的访问密钥 ID 和访问密钥 Secret,用于 AgentRun SDK 鉴权
  5. ALIBABA_CLOUD_ACCESS_KEY_ID=your-ak
  6. ALIBABA_CLOUD_ACCESS_KEY_SECRET=your-sk
  7. ALIBABA_CLOUD_ACCOUNT_ID=your-main-account-id
  8. ALIBABA_CLOUD_REGION=cn-hangzhou
  9. # browser sandbox 模板的名称,可以在 https://functionai.console.aliyun.com/cn-hangzhou/agent/runtime/sandbox 控制台创建
  10. BROWSER_TEMPLATE_NAME=sandbox-your-template-name
  11. # agentrun 的控制面和数据面的 API 端点请求地址,默认cn-hangzhou
  12. AGENTRUN_CONTROL_ENDPOINT=agentrun.cn-hangzhou.aliyuncs.com
  13. AGENTRUN_DATA_ENDPOINT=https://${your-main-account-id}.agentrun-data.cn-hangzhou.aliyuncs.com
复制代码
步骤 3: 创建 Sandbox 生命周期管理模块

创建 sandbox_manager.py 文件,负责 Sandbox 的创建、管理和销毁。核心代码如下:
  1. """
  2. Sandbox 生命周期管理模块
  3. 负责 AgentRun Browser Sandbox 的创建、管理和销毁。
  4. 提供统一的接口供 LangChain Agent 使用。
  5. """
  6. import os
  7. from typing import Optional, Dict, Any
  8. from dotenv import load_dotenv
  9. # 加载环境变量
  10. load_dotenv()
  11. class SandboxManager:
  12.     """Sandbox 生命周期管理器"""
  13.    
  14.     def __init__(self):
  15.         self._sandbox: Optional[Any] = None
  16.         self._sandbox_id: Optional[str] = None
  17.         self._cdp_url: Optional[str] = None
  18.         self._vnc_url: Optional[str] = None
  19.    
  20.     def create(
  21.         self,
  22.         template_name: Optional[str] = None,
  23.         idle_timeout: int = 3000
  24.     ) -> Dict[str, Any]:
  25.         """
  26.         创建或获取一个浏览器 sandbox 实例
  27.         
  28.         Args:
  29.             template_name: Sandbox 模板名称,如果为 None 则从环境变量读取
  30.             idle_timeout: 空闲超时时间(秒),默认 3000 秒
  31.         
  32.         Returns:
  33.             dict: 包含 sandbox_id, cdp_url, vnc_url 的字典
  34.         
  35.         Raises:
  36.             RuntimeError: 创建失败时抛出异常
  37.         """
  38.         try:
  39.             from agentrun.sandbox import Sandbox, TemplateType
  40.             
  41.             # 如果已有 sandbox,直接返回
  42.             if self._sandbox is not None:
  43.                 return self.get_info()
  44.             
  45.             # 从环境变量获取模板名称
  46.             if template_name is None:
  47.                 template_name = os.getenv(
  48.                     "BROWSER_TEMPLATE_NAME",
  49.                     "sandbox-browser-demo"
  50.                 )
  51.             
  52.             # 创建 sandbox
  53.             self._sandbox = Sandbox.create(
  54.                 template_type=TemplateType.BROWSER,
  55.                 template_name=template_name,
  56.                 sandbox_idle_timeout_seconds=idle_timeout
  57.             )
  58.             
  59.             self._sandbox_id = self._sandbox.sandbox_id
  60.             self._cdp_url = self._get_cdp_url()
  61.             self._vnc_url = self._get_vnc_url()
  62.             
  63.             return self.get_info()
  64.         
  65.         except ImportError as e:
  66.             print(e)
  67.             raise RuntimeError(
  68.                 "agentrun-sdk 未安装,请运行: pip install agentrun-sdk[playwright,server]"
  69.             )
  70.         except Exception as e:
  71.             raise RuntimeError(f"创建 Sandbox 失败: {str(e)}")
  72.    
  73.     def get_info(self) -> Dict[str, Any]:
  74.         """
  75.         获取当前 sandbox 的信息
  76.         
  77.         Returns:
  78.             dict: 包含 sandbox_id, cdp_url, vnc_url 的字典
  79.         
  80.         Raises:
  81.             RuntimeError: 如果没有活动的 sandbox
  82.         """
  83.         if self._sandbox is None:
  84.             raise RuntimeError("没有活动的 sandbox,请先创建")
  85.         
  86.         return {
  87.             "sandbox_id": self._sandbox_id,
  88.             "cdp_url": self._cdp_url,
  89.             "vnc_url": self._vnc_url,
  90.         }
  91.    
  92.     def get_cdp_url(self) -> Optional[str]:
  93.         """获取 CDP URL"""
  94.         return self._sandbox.get_cdp_url()
  95.    
  96.     def get_vnc_url(self) -> Optional[str]:
  97.         """获取 VNC URL"""
  98.         return self._sandbox.get_vnc_url()
  99.    
  100.     def get_sandbox_id(self) -> Optional[str]:
  101.         """获取 Sandbox ID"""
  102.         return self._sandbox_id
  103.    
  104.     def destroy(self) -> str:
  105.         """
  106.         销毁当前的 sandbox 实例
  107.         
  108.         Returns:
  109.             str: 操作结果描述
  110.         """
  111.         if self._sandbox is None:
  112.             return "没有活动的 sandbox"
  113.         
  114.         try:
  115.             sandbox_id = self._sandbox_id
  116.             
  117.             # 尝试销毁 sandbox
  118.             if hasattr(self._sandbox, 'delete'):
  119.                 self._sandbox.delete()
  120.             elif hasattr(self._sandbox, 'stop'):
  121.                 self._sandbox.stop()
  122.             elif hasattr(self._sandbox, 'destroy'):
  123.                 self._sandbox.destroy()
  124.             
  125.             # 清理状态
  126.             self._sandbox = None
  127.             self._sandbox_id = None
  128.             self._cdp_url = None
  129.             self._vnc_url = None
  130.             
  131.             return f"Sandbox 已销毁: {sandbox_id}"
  132.         
  133.         except Exception as e:
  134.             # 即使销毁失败,也清理本地状态
  135.             self._sandbox = None
  136.             self._sandbox_id = None
  137.             self._cdp_url = None
  138.             self._vnc_url = None
  139.             return f"销毁 Sandbox 时出错: {str(e)}"
  140.    
  141.     def is_active(self) -> bool:
  142.         """检查 sandbox 是否活跃"""
  143.         return self._sandbox is not None
  144.    
  145.     def __enter__(self):
  146.         """上下文管理器入口"""
  147.         return self
  148.    
  149.     def __exit__(self, exc_type, exc_val, exc_tb):
  150.         """上下文管理器退出,自动销毁"""
  151.         self.destroy()
  152.         return False
  153. # 全局单例(可选,用于简单场景)
  154. _global_manager: Optional[SandboxManager] = None
  155. def get_global_manager() -> SandboxManager:
  156.     """获取全局 SandboxManager 单例"""
  157.     global _global_manager
  158.     if _global_manager is None:
  159.         _global_manager = SandboxManager()
  160.     return _global_manager
  161. def reset_global_manager():
  162.     """重置全局 SandboxManager"""
  163.     global _global_manager
  164.     if _global_manager:
  165.         _global_manager.destroy()
  166.     _global_manager = None
复制代码
关键功能:

  • 创建 Sandbox: 使用 AgentRun SDK 创建浏览器 Sandbox
  • 获取连接信息: 自动获取 CDP URL 和 VNC URL,支持多种属性名兼容
  • 生命周期管理: 提供销毁方法,确保资源正确释放
步骤 4: 创建 LangChain Tools 和 Agent

创建 langchain_agent.py 文件,定义 LangChain tools 并创建 Agent。核心代码如下:
[code]"""LangChain Agent 和 Tools 注册模块负责创建 LangChain Agent,注册 Sandbox 相关的 tools,并集成 VNC 可视化。本模块使用 sandbox_manager.py 中封装的 SandboxManager 来管理 sandbox 生命周期。"""import osfrom dotenv import load_dotenvfrom langchain.tools import toolfrom langchain_openai import ChatOpenAIfrom langchain.agents import create_agentfrom pydantic import BaseModel, Field# 导入 sandbox 管理器from sandbox_manager import SandboxManager# 加载环境变量load_dotenv()# 全局 sandbox 管理器实例(单例模式)_sandbox_manager: SandboxManager | None = Nonedef get_sandbox_manager() -> SandboxManager:    """获取 sandbox 管理器实例(单例模式)"""    global _sandbox_manager    if _sandbox_manager is None:        _sandbox_manager = SandboxManager()    return _sandbox_manager# ============ LangChain Tools 定义 ============@tooldef create_browser_sandbox(    template_name: str = None,    idle_timeout: int = 3000) -> str:    """创建或获取一个浏览器 sandbox 实例。        当需要访问网页、执行浏览器操作时,首先需要创建 sandbox。    创建成功后,会返回 sandbox 信息,包括 VNC URL 用于可视化。        Args:        template_name: Sandbox 模板名称,如果不提供则从环境变量 BROWSER_TEMPLATE_NAME 读取        idle_timeout: 空闲超时时间(秒),默认 3000 秒        Returns:        Sandbox 信息字符串,包括 ID、CDP URL、VNC URL    """    try:        manager = get_sandbox_manager()        # 如果 template_name 为空字符串,转换为 None 以便从环境变量读取        if template_name == "":            template_name = None        info = manager.create(template_name=template_name, idle_timeout=idle_timeout)                result = f"""✅ Sandbox 创建成功!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册