要点
- Restock 是一个可以为真实购买付款的示例智能体。 它在 Slack 中通过 Managed Deep Agents 运行,查找商品、构建购物车,并通过一个支持 机器支付协议 (MPP)的 API 完成结账。
- 支付保持安全且不超出预算。 支付由 Stripe 的消费者钱包 Link 处理,因此智能体永远看不到卡号。用户批准一笔不超过设定金额的消费请求,智能体无法超出该额度消费。
- 构建你自己的能够支付的智能体。 从 Restock 的示例代码开始,并告诉我们你构建了什么。
智能体已经很擅长查找要购买的东西。支付则更难:它涉及真实的资金流动,需要模型绝不应看到的凭证,而且难以撤销。
为了展示如何构建一个能够支付的智能体,我们构建了 Restock,这是一个在 Slack 中通过 Managed Deep Agents运行的办公用品示例智能体。它搜索真实商品、构建购物车,并通过 Link(Stripe 的消费者钱包,为智能体提供最安全的支付方式)完成付款。
本文将跟踪一个请求从第一条消息到订单确认的全过程:
我们的笔快用完了。你能帮办公室找一款蓝色墨水笔的 12 支装吗,总共不超过 25 美元?
Restock 以 22.18 美元(含费用)订购了这些笔。本文中的价格仅为示意。
选择支付方式
智能体可以通过在浏览器中操作零售商的结账流程来付款,但这很脆弱。页面会变化,网站会阻止自动结账,而且支付信息必须在不暴露给模型的情况下输入。
支持 机器支付协议 (MPP)的 API 避免了这些问题:它准确告知智能体应付金额,并直接接收付款。代价是覆盖范围,因为智能体只能通过支持 MPP 的 API 购买。这一名单正在扩大,工具聚合商如 Apify 和 Mercator,以及垂直领域的 Zinc (面向零售)都已加入。Restock 使用 Zinc,但该模式并不依赖它。
各组件如何协同
Restock 由四个部分构建而成:
- Link 保存用户的支付方式,并要求他们批准付款。
- MPP, 这 机器支付协议,定义了通过 HTTP 进行的支付交换。商家回应以
402 Payment Required以及付款说明,然后客户端使用付款凭证进行重试。 - 锌 通过其搜索产品并向零售商下单 MPP 订单 API.
- 托管式深度智能体 (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 密钥和一个已充值的搜索账户(搜索不通过 Link 付费)来搜索 Zinc。用户选择一个 12 支装,Restock 保存购物车但不填支付金额。
设置预付金额
Restock 将 25 美元的预算视为上限,而非实际收取的金额。税费和运费在商品列表页上并不确定,只有当零售商订单下达后总额才会最终确定。因此 Restock 会询问用户预先支付多少,最高不超过 25 美元。订单提交时 Zinc 会收取该金额,用其中的资金向零售商付款,并将剩余部分退还给用户。
对于钢笔,用户选择23美元。Zinc保留1美元的基础费用,这就为商品、税费和运费留下了22美元的零售商额度。可选费用,比如Zinc的电子邮件订单更新,可能会进一步缩减这一额度,因此在评估之前,Restock会先在不付款的情况下请求订单,并从Zinc的 402 Payment Required 挑战。
将凭据排除在模型之外
模型永远不会接触用于支付订单的机密信息。Link 会话存在于一个 用户自有 MDA 连接,因此每个人的钱包始终归其本人所有。配送地址、通知邮箱和 Zinc API 密钥存放在 agent 自有的 Connections 中。Link CLI 在 MDA 的 受管沙箱。一个小助手将保存的会话保留在用户的连接中,并且只在命令运行期间将其放入沙箱。Connecting Link 不会批准购买,后续对话会重用该会话。
在 Slack 中审查采购
在任何款项支付之前,用户会在 Slack 中审查购物车、办公室标签、费用和预付金额。送货地址保持私密。Restock 提出了一个 中断 对于本次审查而言,运行会保持暂停状态,直到用户在 Slack 中点击 Approve 或 Reject。模型写入工具调用中的任何内容都无法批准它。
使用 Link 而非 MPP 进行支付
接下来,Restock 在 Slack 会话中发布一个 Link 批准链接,金额正是 Zinc 挑战中的数额,即同样的 23。用户在 Link 网站上批准该链接,这就是该钱包自身同意付款的意思表示。
一旦 Link 批准,Restock 就会向 Zinc 发送已付款请求,并附带一个 Link 共享支付令牌 作为凭证,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 只是一个示例:它仅支持美国境内配送和美元(USD)付款,每次部署只支持一个办公室,且付款来自请求者自己的钱包。
Restock 有三种模式。设置 RESTOCK_MODE 来选择一种,并按顺序尝试:
- Rehearsal (
rehearsal):虚构的商品和模拟的审批。需要一个 OpenAI API 密钥以及一个具有 Managed Deep Agents 访问权限的 LangSmith 工作区。 - Link test approval (
link-test):真实的 Zinc 搜索和真实的 Link 审批,但不进行实际购买。需要添加一个 Link 钱包、一个 Zinc API 密钥、一个已充值的 Zinc 搜索账户以及配送信息。 - Live purchase (
live):真实付款和真实的零售商订单。
这一模式适用于任何会花钱的智能体。让智能体进行搜索并构建购物车,将消费限额和审批保留在模型无法触及的代码中,并且只有在商家确认后才算作已下单。
快来试用 Restock。告诉我们你的想法,并分享你基于它构建的作品!
