Restock: агент в Slack платит через Link без карты в модели

Платёж из агента — не ещё один tool call: деньги настоящие, откатить сложно, а номер карты в контекст модели попадать не должен. LangChain показала Restock — демо закупки канцтоваров в Slack на Managed Deep Agents: поиск через Zinc, потолок бюджета в запросе и оплата через кошелёк Stripe Link по Machine Payments Protocol.
В примере из поста просят 12 синих ручек «до $25 вместе» — агент оформляет заказ на $22.18 с комиссиями (цифры в статье иллюстративные). На хостинге прогон дошёл до статуса order_placed, остаток после списания вернулся как задумано.
Из чего собран Restock
- Link — платёжные методы пользователя и отдельное согласие на списание.
- Machine Payments Protocol — обмен оплатой по HTTP: мерчант отвечает
402 Payment Required, клиент повторяет запрос с платёжным credential. - Zinc — поиск и заказ у ритейлера через MPP API.
- Managed Deep Agents — хостинг, Slack, human review, credentials и сохранённое состояние.
Лимит и два «да»
$25 в запросе — потолок, не сумма к оплате: налог и доставка из карточки товара не видны. Пользователь заранее согласует upfront-сумму (в примере $23); у Zinc базовая комиссия $1, под товар остаётся $22. Перед ревью Restock запрашивает заказ без оплаты и читает фактические fee из challenge 402 от Zinc.
Сначала корзина в Slack: interrupt останавливает run, пока человек не нажмёт Approve или Reject — подменить это tool call модели нельзя. Потом в треде ссылка на подтверждение в Link ровно на сумму из challenge. После одобрения уходит оплаченный запрос в Zinc с shared payment token от Link; токен читается из приватного файла в sandbox, сразу удаляется, в модель возвращается только публичное summary.
Секреты вне чата
Сессия Link — в user-owned MDA Connection; адрес доставки, email и Zinc API key — в agent-owned Connections. Link CLI логинится в managed sandbox, сессия подкладывается только на время команды. Подключить кошелёк — ещё не значит разрешить покупку.
Репозиторий и режимы
Код: langchain-samples/restock-agent; агент собирается через define_deep_agent с тулами поиска, корзины, set_restock_payment_amount, request_restock_payment и проверки статуса. По умолчанию модель — gpt-5.6-sol через ChatOpenAI.
Переменная RESTOCK_MODE:
rehearsal— вымышленные товары и симуляция approval.link-test— реальный поиск Zinc и Link без покупки.live— реальный платёж и заказ у ритейлера.
Сэмпл сейчас на USD и доставку в US, один офис на деплой; логика переносима: корзину собирает модель, лимит и approve — в коде, который она не обходит, заказ считается состоявшимся только по ответу мерчанта.
Источник: Agents that can pay: building Restock with Stripe's Link and Managed Deep Agents.