LangChain 用 Stripe Link 和 Managed Deep Agents 构建可支付的智能体 Restock
Agents that can pay: building Restock with Stripe's Link and Managed Deep Agents
LangChain 发布示例项目 Restock,一个在 Slack 上通过 Managed Deep Agents 运行的办公用品购买智能体,演示智能体如何安全完成支付。
原文给出了完整的智能体支付架构与凭证隔离做法,读者可以复用到任何需要花钱的智能体场景。
智能体已经擅长寻找可购买的商品。付款则更难:它涉及真实资金,需要模型绝不应看到的凭证,而且难以撤销。
为了展示如何构建一个能付款的智能体,我们构建了 Restock,一个在 Slack 上运行、基于 Managed Deep Agents 的办公用品示例智能体。它搜索真实商品、构建购物车,并通过 Link 付款,这是 Stripe 的消费者钱包,为智能体提供了最安全的支付方式。
本文追踪一个请求从第一条消息到确认订单的全过程:
我们的笔快用完了。你能为办公室找一盒 12 支装的蓝色墨水笔,总价低于 25 美元吗?
Restock 以 22.18 美元订购了这些笔,含费用。本文中的价格仅为示例。
选择支付方式
智能体可以通过在浏览器中操作零售商的结账流程来付款,但这很脆弱。页面会变化,网站会阻止自动结账,而且支付详情必须在不让模型看到的情况下输入。
支持 Machine Payments Protocol(MPP)的 API 避免了这一点:它明确告诉智能体需要支付什么,并直接接受付款。代价是覆盖范围,因为智能体只能通过支持 MPP 的 API 购买。这个列表正在增长,像 Apify 和 Mercator 这样的工具聚合器,以及像 Zinc 这样的零售垂直服务都在加入。Restock 使用 Zinc,但这一模式并不依赖它。
各部分如何配合
Restock 由四部分组成:
- Link 保存用户的支付方式,并请求他们批准付款。
- MPP,即 Machine Payments Protocol,定义了通过 HTTP 进行的支付交换。商家以
402 Payment Required和支付指令作为响应,客户端则使用支付凭证重试。 - Zinc 通过其 MPP 订单 API 搜索商品并下零售商订单。
- Managed Deep Agents (MDA) 托管智能体,并处理 Slack、人工审核、凭证和保存状态。

搜索与购物车
我们为 Zinc 搜索、购物车和支付编写了 自定义工具,以及塑造对话的指令。MDA 处理其余部分,包括保存对话和订单,因此用户可以在几天后回来询问同样的笔。以下是布局和精简后的智能体定义:
restock-agent/
├── agent.py # the agent: model + tools
├── instructions.md # how Restock talks and when it uses each tool
├── tools/restock.py # the tools the model can call
├── restock/ # Zinc, Link wallet, cart and order storage
└── sandbox/setup.sh # installs the Link CLI in the sandbox
agent = define_deep_agent(
name="restock",
model=ChatOpenAI(model=os.environ.get("OPENAI_MODEL", "gpt-5.6-sol")),
tools=[
search_restock_products, # Zinc search
prepare_restock_order, # save the cart
set_restock_payment_amount, # upfront amount, within the budget
request_restock_payment, # Slack review, then Link approval
wait_for_restock_approval,
check_restock_order, # order status from Zinc
],
)
对于笔的请求,Restock 使用 Zinc API 密钥和已充值的搜索账户在 Zinc 中搜索(搜索不通过 Link 付费)。用户选择一盒 12 支装,Restock 保存购物车,但不包含支付金额。
设置预付款金额
Restock 将 25 美元预算视为上限,而非要收取的金额。税费和运费无法从商品列表中得知,总额只有在零售商订单下达后才会确定。因此 Restock 询问用户预付款金额,最高可达 25 美元。Zinc 在下单时收取该金额,从中支付给零售商,并退还剩余部分。
对于这些笔,用户选择 23 美元。Zinc 保留 1 美元基础费用,剩下 22 美元的零售商额度用于商品、税费和运费。可选费用,如 Zinc 的邮件订单更新,可能会进一步减少额度,因此在审核之前,Restock 请求不带支付的订单,并从 Zinc 的 402 Payment Required 挑战中读取实际费用。
将凭证排除在模型之外
模型从不接触用于支付订单的机密信息。Link 会话位于用户自有的 MDA Connection 中,因此每个人的钱包始终归其本人所有。配送地址、通知邮箱和 Zinc API 密钥存放在 agent 自有的 Connection 中。Link CLI 在 MDA 的托管沙箱内运行登录流程。一个小型辅助程序将保存的会话保留在用户的 Connection 中,仅在命令运行期间将其放入沙箱。连接 Link 并不会批准购买,后续对话会复用该会话。
在 Slack 中审核购买
在支付任何款项之前,用户会在 Slack 中审核购物车、办公室标签、费用和预付金额。配送地址保持私密。Restock 会为此审核触发一个中断,因此运行会保持暂停,直到用户在 Slack 中点击 Approve 或 Reject。模型写入工具调用的任何内容都无法批准它。
通过 MPP 使用 Link 支付
接下来,Restock 会在 Slack 线程中发布一个 Link 批准链接,金额恰好为 Zinc 挑战中的金额,即同样的 $23。用户在 Link 网站上批准它,这就是钱包本身对支付的同意。
一旦 Link 批准,Restock 会使用 Link 共享支付令牌作为凭据,将已支付的请求发送给 Zinc,Zinc 通过 Stripe 处理付款。pympp 负责 MPP 格式化。
支付工具从私有沙箱文件中读取令牌,使用后将其删除,并仅向模型返回公开摘要。该令牌本身并不强制购物车详情,因此该工具还会根据用户审核过的内容检查订单,并确认批准仍然有效。
确认订单
零售商订单金额为 $21.18(笔 $14.99,税费 $1.20,运费 $4.99),在 $22 的额度之内。用户支付 $22.18(含 Zinc 费用),Zinc 退还另外的 $0.82。

一旦 Zinc 报告 order_placed,Restock 会在 Slack 中确认,并在零售商发货时分享物流跟踪信息。除示意性价格外,我们还在托管部署上端到端运行了 Restock:一个真实订单达到了 order_placed,预期的退款也到账了。
开始使用
代码位于 langchain-samples/restock-agent,其 README 逐步介绍了设置和部署。MDA 的 Slack 设置指南涵盖了连接 Slack 应用的内容。
Restock 是一个示例:它仅支持美国配送和美元,每个部署一个办公室,并从请求者自己的钱包付款。
Restock 有三种模式。设置 RESTOCK_MODE 来选择一种,并按顺序尝试:
- 排练(
rehearsal):虚构产品和模拟批准。需要 OpenAI API 密钥以及具有 Managed Deep Agents 访问权限的 LangSmith 工作区。 - Link 测试批准(
link-test):真实的 Zinc 搜索和真实的 Link 批准,但不进行购买。需要添加 Link 钱包、Zinc API 密钥、已充值的 Zinc 搜索账户以及配送详情。 - 真实购买(
live):真实付款和真实的零售商订单。
这一模式适用于任何花钱的 agent。让 agent 搜索并构建购物车,将支出限额和批准保留在模型无法触及的代码中,并且只有当商家确认时才将订单视为已下单。
试试 Restock 吧。告诉我们你的想法,并分享你在它之上构建的内容!
来源:LangChain:Blog · langchain.com