重要なポイント
- Restockは実際の購入に対して支払いを行うサンプルエージェントです。 Slack 上の Managed Deep Agents で動作し、商品を検索し、カートを作成し、API を通じてチェックアウトします。この API は対応する マシンペイメントプロトコル (MPP)。
- 支払いは安全に、予算内で管理されます。 StripeのコンシューマーウォレットであるLinkが決済を処理するため、エージェントがカード番号を目にすることはありません。ユーザーは設定した上限額までの支払いリクエストを承認し、エージェントがそれを超えて支出することはできません。
- 支払いができるエージェントを自作しましょう。 開始場所 Restockのサンプルコード、そして何を作ったかぜひ教えてください。
エージェントはすでに買い物先の探索が得意です。支払いはより難しい課題です。実際の金銭が動き、モデルが決して見てはならない認証情報が必要になり、取り消しが困難だからです。
支払いを行うエージェントの構築方法を示すために、私たちはRestockという、上で動作するサンプルのオフィス用品エージェントを作成しました。 マネージドディープエージェント。実際の商品を検索し、カートを作成し、支払いを行います リンク、Stripeのコンシューマーウォレットで、エージェントに最も安全な支払い方法を提供します。
この投稿は、最初のメッセージでの依頼から注文確定までを追ったものです:
ペンが少なくなってきました。オフィス用に12本入りの青インクのペンを、合計25ドル未満で見つけてもらえますか?
在庫補充ではペンを fees 込みで $22.18 で発注します。この投稿内の価格は例示用です。
支払い方法の選択
エージェントが小売業者のチェックアウトをブラウザで操作して支払うことも可能ですが、それは脆い手法です。ページは変更され、サイトは自動化されたチェックアウトをブロックし、支払い情報はモデルに露出させずに入力する必要があります。
対応するAPI マシンペイメントプロトコル (MPP)はそれを回避します。エージェントに支払う金額を正確に伝え、支払いを直接受け付けます。トレードオフはカバレッジであり、エージェントはMPP対応のAPIを通じてしか購入できません。そのリストは拡大しており、ApifyやMercatorのようなツールアグリゲーターが、のような業界特化型サービスに加わっています。 亜鉛 小売向けの例です。RestockはZincを使用していますが、このパターンはZincに依存しているわけではありません。
各ピースがどう組み合わさるか
Restock は4つのパーツから構成されています:
- リンク ユーザーの支払い方法を保持し、支払いの承認を求める。
- MPP、その マシンペイメントプロトコル、HTTP上での支払い交換を定義します。マーチャントは以下で応答します。
402 Payment Requiredおよび支払い指示を含み、クライアントは支払い認証情報を使って再試行します。 - 亜鉛 searches products and places retailer orders through its → 小売業者への注文を通じて製品を検索し発注するその MPP注文API.
- managed deep agent (MDA) エージェントをホストし、Slack、人によるレビュー、認証情報、保存された状態を処理します。

検索とカート
私たちは書きました カスタムツール Znシーク検索、カート、支払いのツールに加え、会話を形づける指示です。残りの処理は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 challengeから読み取ります。
認証情報をモデルから切り離す
モデルは注文の支払いに使われるシークレットを一切扱いません。Linkセッションは ユーザー所有の MDA Connection内に存在するため、各人のウォレットは本人のもののままです。配送先住所、通知用メール、Zinc APIキーはエージェント所有のConnectionに置かれます。Link CLIはログインをMDAの managed sandbox内で実行します。小さなヘルパーが保存されたセッションをユーザーのConnectionに保持し、コマンド実行中のみサンドボックス内に置きます。Linkを接続しても購入は承認されず、その後の会話でもセッションが再利用されます。
Slackで購入をレビューする
支払いが行われる前に、ユーザーはSlackでカート、オフィスラベル、手数料、先立て支払額をレビューします。配送先住所は非公開のままです。Restockはこのレビューのために interrupt を発生させるため、ユーザーがSlackでApproveまたはRejectをクリックするまで実行は一時停止のままになります。モデルがツール呼び出しに書き込んだ内容で承認されることはありません。
MPP経由でLinkを使って支払う
次に、RestockはSlackスレッドに、Zincのchallengeとまったく同じ金額、同じく$23のLink承認リンクを投稿します。ユーザーはLinkのウェブサイトでそれを承認し、これがウォレット自身の支払い同意となります。
Linkが承認すると、RestockはLinkの shared payment token を認証情報として支払い済みリクエストをZincに送信し、ZincはStripeを通じて支払いを処理します。 pympp がMPPのフォーマットを処理します。
支払いツールはトークンをプライベートなサンドボックスファイルから読み取り、使用後に削除し、モデルには公開サマリーのみを返します。トークン自体はカートの内容を強制しないため、ツールは注文をユーザーがレビューした内容と照合し、承認がまだ新しいものであることも確認します。
注文を確認する
小売業者の注文合計は$21.18(ペン$14.99、税$1.20、送料$4.99)で、$22の枠内に収まります。ユーザーはZincの手数料を含めて$22.18を支払い、Zincは残りの$0.82を返金します。

Zincが報告すると、RestockはSlackで確認を行い order_placed、小売業者が発送した際には追跡情報を共有します。例示価格とは別に、ホストされたデプロイメント上でRestockをエンドツーエンドで実行しました。実際の注文は order_placedに届き、期待通りの返金も確認されました。
始める
コードは langchain-samples/restock-agentにあり、その README ではセットアップとデプロイの手順を段階的に説明しています。MDAの Slackセットアップガイド ではSlackアプリの接続方法を解説しています。
Restockはサンプルです。米国内配送とUSDのみに対応し、デプロイごとに1オフィス、支払いはリクエスター自身のウォレットから行われます。
Restockには3つのモードがあります。 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を試してみてください。ご意見をお聞かせいただき、その上に構築したものをぜひ共有してください!
