Managed Deep Agents v0.10 发布,新增浏览器使用与异步子智能体
Managed Deep Agents v0.10: Browser Use and Async Subagents
LangChain 发布 Managed Deep Agents v0.10,新增浏览器使用能力,让智能体在没有 API 的网站上操作,并提供 browser_snapshot、browser_run、browser_screenshot、browser_handoff 四个工具。
同一新闻,精选展示《LangChain 为 Managed Deep Agents 加入浏览器能力》
Managed Deep Agents v0.10 今日发布。它新增了 浏览器使用功能,让你的 agent 能够操作没有 API 的网站;还新增了 异步子 agent,可在后台运行长时间任务,同时你的 agent 仍能与你对话。
在本文中,我们介绍 agent 为何需要这两项功能、如何启用它们,然后介绍本次发布的其余内容。
为你的 agent 配备浏览器
预订旅行、取消订阅或提交理赔,这些操作都发生在为人类点击页面而构建的网站上,而且通常没有 agent 可以调用的 API。虽然 agent 能够推理出如何完成任务,但在没有 API 的网站上却无法采取行动。用 curl 抓取页面也走不远,它得到的是 JavaScript 渲染页面之前的 HTML,agent 无法点击任何东西。
像 Instinct 和 Meta 的 Muse 这样的个人 agent 可以浏览网站,从而解锁更广泛的使用场景,而 DataDome 发现仅 9 月份 agentic 浏览器请求就激增了 4.7 倍。编码 agent 也需要浏览器,用来检查对应用的更改是否真的能渲染并正常工作。
我们在“Managed Deep Agents 中的浏览器使用”一文中介绍了浏览器在哪些方面有帮助,以及它在底层如何工作。要启用它,请在项目根目录声明一个浏览器:
# browser.py
from managed_deepagents import define_browser
browser = define_browser(scope="thread", idle_ttl_seconds=600)Managed Deep Agents 在自己的 LangSmith 沙箱中运行浏览器,并自动向你的 agent 添加以下浏览器工具:
工具功能browser_snapshot读取页面的无障碍树并分配元素 IDbrowser_run通过 JavaScript 或针对快照 ID 的批量操作进行导航和交互browser_screenshot捕获页面,可选择将图像保存到沙箱browser_handoff让真人控制窗口
默认情况下,每个对话都有自己的浏览器,它在多轮对话间复用,且不带有其他线程的 cookie 或登录状态。使用 scope="user" 时,每个已登录用户拥有一个浏览器,其登录状态会贯穿该用户的所有对话,因此 agent 只需请他们登录网站一次。
将浏览器交给真人
大多数浏览器 agent 会卡在登录墙或双因素验证提示前。使用 browser_handoff 时,agent 会把窗口交给你,因此你的密码永远不会出现在模型的消息或追踪记录中。
agent 会调用 browser_handoff(reason) 并解释为何需要你。你的 agent 渠道——如 Slack 和 Studio——将显示一个链接,让你的 agent 用户能够以原生方式移交浏览器控制权,该链接会打开一个用于与远程浏览器交互的页面以及一个交还按钮。自定义客户端可以自行渲染移交产物。一旦你登录并交还控制权,agent 会检查页面以确认登录是否成功,然后继续。移交会立即返回,因此 agent 可以在等待期间做其他工作。移交链接在 15 分钟后过期。

移交让你的 agent 替你使用网页,而无需看到你的凭据。
浏览器使用文档涵盖了作用域、每次运行的配置以及完整的移交流程。
在后台运行子 agent
子代理让一个代理把一项聚焦的任务交给一个拥有自己上下文窗口的助手。此前在 Managed Deep Agents 中,子代理以内联方式运行,因此代理调用一个子代理后要等待它的回答。这对快速查询有效,并且仍然是受支持的用法。但对于由同步代理支撑的长任务,或者需要扇出多个代理的场景,与代理对话的人也要等待,并且与编排代理的进一步交互会被阻塞。
在 Managed Deep Agents v0.10 中,通过在子代理定义中添加 async,你可以异步运行子代理,而不阻塞编排代理:
from managed_deepagents import define_deep_agent
agent = define_deep_agent(
name="research-assistant",
model="openai:gpt-5.5",
subagents=[
{
"name": "researcher",
"description": "Researches a topic in the background.",
"system_prompt": "Research the topic and report your findings.",
"async": True,
},
],
)代理在自己的线程上启动一个异步子代理,并可以在子代理运行期间继续与用户对话。编排代理通过一组异步任务工具启动、检查、更新和取消这些任务。每个提供服务的代理还会获得一个通用子代理的后台副本,因此它可以在运行时选择在前台还是后台运行委派的工作。
异步子代理会自行通知代理,因此代理永远不会陷入轮询循环。接下来会发生什么取决于子代理完成时代理正在做什么:
当子代理完成时,代理会做什么发生什么忙碌它在每次模型调用前检查未完成的任务,因此结果会在运行中途到达空闲子代理会以一次新的运行唤醒它因审批而暂停审批保持不动;用户回答后结果才会到达
异步子代理共享代理的沙箱,因此它会获取代理已经写入的文件。它的运行会显示在LangSmith中代理的运行之下。在 Slack 中,它的审批会回发到原始线程,在那里回答审批即可恢复子代理。
v0.10 中的其他更新
runtime.thread:现在每个线程都会携带一条记录,说明它从哪里开始(例如某个 Slack 线程)以及谁在其中。工具可以在任何运行中读取runtime.thread,Studio 恢复、计划运行和异步子代理的唤醒运行都借此在原始 Slack 线程中回复。运行时文档介绍了工具可以读取的托管字段。- 停止运行:Slack 线程获得一个原生 Stop 按钮,用于取消该线程的运行,Studio 也可以取消 Slack 线程上的运行。
- Slack 频道处理器(实验性):
onEvent决定每个 Slack 事件启动什么,包括提及、私信、其他消息和按钮点击。status设置运行期间 Slack 显示的内容,reply: "none"则把回复留给代理。参见Slack 频道文档。 - 自带 Slack 应用:
mda deploy会询问新的 Slack 频道应使用哪个应用。你可以选择由 LangSmith 创建和管理的应用、从清单创建新应用,或使用你已有的应用。 resolveUser:当有人在 Slack 这样的频道中给你的代理发消息时,Managed Deep Agents 会验证发送者身份。resolveUser会把该发送者映射到你自有系统中的对应用户,这样你的工具就能查询该用户的账户和权限。将其编写为函数,或指向我们调用的端点,并在身份声明上设置,以覆盖所有频道或单个频道。- 破坏性变更:
connectors.mcp()和connectors/布局已被移除。MCP 服务器必须在tools/mcp.ts或tools/mcp.py中声明。沙箱scope选项也已被移除。对于LANGSMITH_*变量,shell 环境变量现在优先于项目.env。
开始使用
Managed Deep Agents v0.10 今日已开放公开测试版。请从文档开始,或创建一个新项目:
uvx --from managed-deepagents mda init my-agent
cd my-agent
uv run mda deploy一如既往,我们迫不及待想听你分享你的构建成果。
ICYMI:v0.9 新增了由 agent 创建的调度、按运行配置以及 Slack 表情回应。阅读 v0.9 文章。
来源:LangChain Blog · langchain.com