Aioga
AI资讯 / 行业动态
返回 AI资讯

LangChain Managed Deep Agents 推出 Connections:托管凭据与按调用方身份执行

LangChain:Blog(RSS)Aioga 编辑团队2026-09-09T17:00:14.000Z热度 58

LangChain 为 Managed Deep Agents 推出 Connections 功能,用于安全托管凭据、支持按用户 OAuth,并让智能体以每个调用方的身份执行操...

行业动态LangChain:Blog(RSS)

今日 AI 情报摘要

LangChain 为 Managed Deep Agents 推出 Connections 功能,用于安全托管凭据、支持按用户 OAuth,并让智能体以每个调用方的身份执行操作。

该功能旨在解决多用户场景下凭据共享与身份隔离问题,使智能体行为可追溯且权限边界更清晰。

中文正文 · AI 翻译

Managed Deep Agents v0.7.0 及以上版本现在可用连接功能。

每个代理最终都需要代表某人采取行动——搜索网页、提交工单、打开拉取请求。今天,这通常意味着在每个部署中硬编码同一个 API 密钥,并且每个操作都显示在服务账户下。.env 中的密钥回答了代理可以做什么,但无法回答是谁发起的。

这就是 Connections 的作用。连接是 LangSmith 工作区中的一个命名凭证,您的工具在运行时可以通过 slug 通过一次调用读取它。

一个连接有所有者和凭证类型,它们是独立的。

所有者可以是代理或调用者。代理拥有的凭证属于部署,每个调用者共享它。用户拥有的凭证在运行时按人进行解析。

凭证可以是静态密钥或 OAuth 授权:代理可以持有 OAuth 授权,用户可以持有密钥。

在使用 mda connections create 创建连接时所有权已经固定,而 connections.get() 只会在已经存在的凭证中进行选择。

代理拥有的密钥用于需要每个调用者共享一个凭证的情况。这是适用于每个人都不需要不同的功能的正确方法:网页搜索、地理编码器、定价源。

在这个例子中,让我们配置一个到 Tavily:https://www.tavily.com 的连接,为代理添加一个通用网页搜索工具:

uv run mda connections create tavily-agent --secret-from-env TAVILY_API_KEY

tavily-agent 是 slug。这是您为连接命名的名字,也是您的代码使用的名字,没有任何检查会将其与供应商列表对比。值来自 TAVILY_API_KEY 并进入您的 LangSmith 工作区。它不是构建的一部分,mda deploy 也不会像处理 .env 进入部署密钥那样扫入它。

读取它的工具是普通的 LangChain 工具,只需一行新代码即可利用 connections.get:

# tools/search_web.py import httpx from langchain.tools import tool from managed_deepagents import connections @tool(parse_docstring=True) async def search_web(query: str) -> str: """ 搜索网页。 参数: query: 搜索查询。 """ api_key = await connections.get("tavily-agent", {"type": "agent"}) async with httpx.AsyncClient(timeout=30.0) as client: response = await client.post( " ", json={"api_key": api_key, "query": query, "max_results": 5}, ) response.raise_for_status() return response.text

如果你需要更换你的密钥,你可以更新存储在 tavily-agent 的秘钥,任何未来的代理请求将自动使用新的密钥。

共享令牌很有用,但允许你的代理代表你的用户操作意味着你可以安全地为你的代理提供更多功能。GitHub 在 connections 目录中与其他 22 个服务一起提供,因此你只需提供客户端 ID 和秘钥,而无需其他内容——无需授权 URL、无令牌 URL、无需查找认证方法。

你可以通过 mda connections catalog 快速引用目录连接,但如果你提供自己的元数据,你可以连接到任何提供 OAuth 的供应商。

例如,要配置一个自定义 Github OAuth 应用的连接:

uv run mda connections create github-issues \ --oAuth GitHub \ --client-ID “$GITHUB_CLIENT_ID” \ --Secret-from-env GITHUB_CLIENT_SECRET \ --scope repo

在此示例中,github-issues 是 slug,由你拥有,并由你的代码使用。github 是目录服务,它仅决定哪些端点被填充。

工具通过一个助手读取令牌。在此示例中,关键行是:

access_token = await connections.get("github-issues", {"type": "user"})

通过一次对 connections.get 的调用,部署的代理可以自动为新用户调用 OAuth 流程,或者获取已对 OAuth 提供者进行过身份验证的用户的缓存 OAuth 令牌。

我们可以利用此访问令牌对 Github 进行任意 API 调用:

# tools/github.py async def _github(method: str, path: str, **kwargs) -> dict: access_token = await connections.get("github-issues", {"type": "user"}) async with httpx.AsyncClient(timeout=30.0) as client: response = await client.request( method, f"{GITHUB_API}{path}", headers={ "Authorization": f"Bearer {access_token}", "Accept": "application/vnd.github+json", "X-GitHub-Api-Version": GITHUB_VERSION, }, **kwargs, ) response.raise_for_status() return response.json()

注意我们设置了 {"type": "user"}。代理拥有的连接在创建时存储了一个值。而这个完全没有存储任何值,只有应用注册。凭证是在运行时、按调用者到达的——如果调用者从未授权 GitHub,或者他们的令牌已过期,connections.get() 会暂停运行并请求授权,而不是失败。

该词只出现一次,在 _github 内。search_issues 工具和 create_issue 工具都从该辅助函数继承按调用者的身份,第三个 GitHub 工具根本不需要任何授权代码。

好处体现在两个地方。search_issues 在任何写入操作之前已经因调用者不同而结果不同,因为一个人可见的私有仓库,另一个人不可见会改变结果——相同查询,相同部署,不同答案。当 create_issue 运行时,问题会由提出请求的人在 GitHub 上创建。响应中的 user.login 是他们的账号,而不是机器人。

一些 MCP 服务器会自己注册 OAuth 客户端。它们这么做时,整个设置就是一个 URL。

uv 运行 mda 连接 创建 linear-mcp --mcp

from managed_deepagents import connections, define_mcp mcp = define_mcp( servers={ "linear": { "transport": "http", "url": " ", "connection": connections.get("linear-mcp", {"type": "user"}), }, }, )

没有客户端 ID,没有客户端密钥,没有应用注册。因为服务器会发布其 OAuth 元数据并为你注册一个客户端,你也不需要作用域,并且连接自带读写权限,这些都是通过服务器自身元数据协商得出的。

将其与 GitHub 流程进行比较:一个需要你自己的应用程序,一个什么也不需要,而读取它们的代码行是相同的。这里消失的是工具代码——GitHub 使用了一个助手和两个函数,而这里只需一个服务器 URL,工具从 MCP 服务器获取。

向代理请求跨两个服务的内容,运行会在第一次模型回合前暂停,并显示一个中断,列出所有调用者尚未授权的连接。授权它们后,运行会从停止的地方继续。

项目中没有回调路由,没有令牌存储,没有刷新逻辑,没有同意屏幕。调用者从不打开 LangSmith。

作为第二个调用者做同样的事,你会得到第二个问题,其作者不同,来自同一代理,相同的 slug,以及相同的工作区条目。与 Tavily 密钥形成对比,Tavily 密钥设计上对每个人都是一样的。你可以通过以下方式检查你或其他开发者添加到 LangSmith 的连接:

连接包含在 Managed Deep Agents 预发布版本中,而 OAuth 目录包含在二进制文件中,因此你所拥有的版本决定了 --oauth 接受什么:

uv 工具 安装 managed-deepagents uv 运行 mda 连接 目录

代理拥有的凭证归部署所有,因此在创建之前先进行一次脚手架搭建和部署。之后,每个连接有三个步骤——创建它,用 connections.get() 读取它,然后重新部署以发送读取它的代码。

本地开发方式相同。代理拥有的连接从 .env 文件中的 MDA_DEV_ 中解析,大写并将连字符变为下划线。用户拥有的连接将登录的开发者解析为 mda dev 下的真实主体,因此授权中断会在本地触发,并且存储的授权是真实的。

除了上述三种流程,--authorize 为部署存储一个 OAuth 授权,因此每个调用者都充当单一共享账户——这是按凭证拥有者模型的第四格,也是当你想要专用团队账户而不是每人身份时的正确做法。--allowed-scope 限制后续授权可能请求的范围,而 --authorize-url 配合 --token-url 覆盖目录外的任何提供者。

有关详细信息和示例,Connections 的文档可以在 https://docs.langchain.com/langsmith/python/managed-deep-agents-connections 找到:https://docs.langchain.com/langsmith/python/managed-deep-agents-connections

LangSmith,我们的代理工程平台,帮助开发者调试每一个代理决策,评估变更,并一键部署。

情报判断

Aioga 编辑摘要

LangChain 为 Managed Deep Agents 推出 Connections 功能,支持在 LangSmith workspace 中以命名凭据供工具运行时调用,并区分智能体所有或调用方所有的凭据。

背景分析

来源称,Connections 已在 Managed Deep Agents v0.7.0 及更高版本提供。凭据类型包括静态密钥和 OAuth 授权,连接所有权在创建时确定,调用时只能选择已存在的凭据。

Aioga 观点

Aioga 判断:Connections 的核心变化是把凭据归属与调用身份纳入托管机制,使同一部署可区分共享凭据和按调用方解析的凭据;但材料未说明具体配置流程之外的产品效果。

影响与后续

可能影响:多用户智能体的权限设计需要明确凭据由智能体还是调用方持有;按调用方使用 OAuth 可能改善身份隔离与操作追溯,但不代表所有工具都必须采用用户凭据。 后续观察:应关注 Connections 在不同工具和多用户场景中的实际适配情况,以及用户所有凭据的授权、撤销和审计细节;现有材料不足以判断其覆盖范围与运行表现。

来源与版权说明

本页正文由公开来源页面提取并按原有信息整理,同时保留来源、发布时间和原文入口。版权归原作者及来源网站所有,请通过原文链接核验和阅读来源版本。

抓取通道: RSS · 原始域名: langchain.com

来源: LangChain:Blog(RSS)

原文链接: 打开原始来源

Aioga 归档: 查看情报页

Content record: source-page · Updated: 2026-09-09T17:00:14.000Z

API 中转站
API RELAY · DEVELOPER INFRASTRUCTURE

API 中转站

统一接入主流 AI 模型 API,为开发、测试与生产环境提供稳定调用入口。

立即访问 api.w173.com
AIOGA SHARE POSTER

分享这篇 AI 情报

LangChain 为 Managed Deep Agents 推出 Connections 功能,用于安全托管凭据、支持按用户 OAuth,并让智能体以每个调用方的身份执行操...

LangChain:Blog(RSS)2026-09-09T17:00:14.000Z
扫码打开文章详情扫码直达文章详情

Aioga 自动聚合全球 AI 动态,并保留来源信息用于核验与引用。