LangChain 发布 Managed Deep Agents v0.10,新增浏览器使用与异步子智能体
Managed Deep Agents v0.10: Browser use and asynchronous subagents
LangChain 发布 Managed Deep Agents v0.10,新增浏览器使用能力,让智能体操作没有 API 的网站,并支持异步子智能体在后台运行长任务。
原文给出浏览器接管与异步子智能体两项能力的具体配置方式和交接流程,可据此判断智能体处理无 API 网站与长任务时的分工。
Managed Deep Agents v0.10 今日发布。它增加了 浏览器使用,因此您的代理可以在没有 API 的网站上工作,并且 异步子代理,在您的代理与您保持沟通的同时,在后台运行长时间任务。
在本篇帖子中,我们将涵盖为什么代理需要每一个以及如何启用它,然后是发布的其余部分。
给你的代理一个浏览器
预订旅行、取消订阅或提交索赔都在为人们点击页面而构建的网站上完成,通常没有代理可以调用的 API。虽然代理可以通过推理来完成任务,但它们无法在没有 API 的网站上采取行动。使用 curl 获取页面也行不通,它在任何 JavaScript 渲染页面之前就生成了 HTML,并且代理无法点击任何东西。
像 Instinct 这样的个人代理和 Meta 的 Muse 可以浏览网站以解锁更广泛的使用案例,DataDome 在 9 月份仅看到代理浏览器请求增长了 4.7 倍。编码代理也需要浏览器,以检查对应用程序的更改是否实际渲染并工作。
我们在“Managed Deep Agents 中的浏览器使用”中涵盖了浏览器的作用以及它的工作原理。要启用它,请在您的 项目根目录 中声明一个浏览器:
# browser.py
from managed_deepagents import define_browser
browser = define_browser(scope="thread", idle_ttl_seconds=600)Managed Deep Agents 在它自己的 LangSmith 沙盒 中运行浏览器,并自动向您的代理添加以下 浏览器工具:
工具它做什么browser_snapshot读取页面的可访问性树并分配元素 IDbrowser_run通过 JavaScript 或针对快照 ID 的批量操作进行导航和交互browser_screenshot捕获页面,可选择将图像保存到沙盒browser_handoff让一个人控制窗口
默认情况下,每次对话都有自己的浏览器,该浏览器跨回合重用,并从其他线程开始时没有 cookie 或登录。使用 scope="user",每个 登录的用户 都会得到一个浏览器,其登录信息会在他们所有的对话中传递,因此代理只需让他们登录一次网站。
把浏览器交给一个人
大多数浏览器代理在登录墙或双因素提示时停止。使用 browser_handoff,代理把窗口交给你,所以你的密码永远不会出现在模型的消息或跟踪记录中。
代理调用 browser_handoff(reason) 并解释为什么需要你。您的代理渠道——如 Slack 和 Studio——将显示一个链接,允许您的代理用户原生地交出浏览器控制权,这会打开一个链接来与远程浏览器交互,并有一个 交回 按钮。自定义客户端可以自行渲染交出控制的艺术品。一旦您登录并交回控制权,代理会检查页面以查看登录是否成功并继续。交出控制会立即返回,因此代理可以在等待时做其他工作。交出链接在 15 分钟后过期。

交出控制允许您的代理为您使用网页,而无需看到您的凭证。
有关 浏览器使用文档 的范围、每次运行配置和完整的交出控制流程。
在后台运行子代理
子代理允许一个代理将其具有自身上下文窗口的聚焦任务交给助手处理。以前在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线程获得一个原生的停止按钮,该按钮会取消线程的运行,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_*变量,外壳环境变量现在优先于项目.env。
入门指南
Managed Deep Agents v0.10 今日开始公开测试。从 文档 开始,或创建一个新项目:
uvx --from managed-deepagents mda init my-agent
cd my-agent
uv run mda deploy一如既往,我们迫不及待想听听你构建了什么。
注意:v0.9 添加了代理创建的日程、每次运行配置和 Slack 反应。 阅读 v0.9 发布文章.
来源: LangChain Blog · langchain.com