Агенты уже отлично справляются с поиском товаров для покупки. С оплатой сложнее: это реальные деньги, для этого нужны учетные данные, которые модель никогда не должна видеть, и такие операции трудно отменить.
Чтобы показать, как создать агента, который может платить, мы разработали Restock — пример офисного агента для заказа расходных материалов, работающего в Slack на базе Managed Deep Agents. Он ищет реальные товары, формирует корзину и оплачивает заказ через Link, потребительский кошелек Stripe, который предоставляет агентам самый безопасный способ оплаты.
В этой статье мы проследим за одним запросом: от первого сообщения до подтвержденного заказа:
У нас заканчиваются ручки. Можешь найти упаковку из 12 синих шариковых ручек для офиса общей стоимостью до 25 долларов?
Restock заказывает ручки за 22,18 доллара, включая комиссии. Цены в этой статье приведены для примера.
Выбор способа оплаты
Агент может совершить оплату, управляя процессом оформления заказа в браузере ритейлера, но это ненадежно. Страницы меняются, сайты блокируют автоматизированные процессы, а платежные данные должны вводиться так, чтобы модель не имела к ним доступа.
API, поддерживающий Machine Payments Protocol (MPP), позволяет избежать этого: он точно сообщает агенту, сколько нужно заплатить, и принимает платеж напрямую. Компромиссом является охват, поскольку агент может совершать покупки только через API с поддержкой MPP. Этот список растет: к нему присоединяются агрегаторы инструментов, такие как Apify и Mercator, а также вертикальные решения, например Zinc для ритейла. Restock использует Zinc, но этот паттерн не зависит от него.
Как устроены компоненты
Restock состоит из четырех частей:
- Link хранит платежные методы пользователя и запрашивает подтверждение платежей.
- MPP, Machine Payments Protocol, определяет обмен платежными данными по протоколу HTTP. Продавец отвечает кодом 402 Payment Required и инструкциями по оплате, а клиент повторяет запрос с платежным токеном.
- Zinc ищет товары и размещает заказы у ритейлеров через свой MPP order API.
- Managed Deep Agents (MDA) размещает агента и управляет взаимодействием со Slack, проверкой человеком, учетными данными и сохраненным состоянием.
Поиск и корзина
Мы написали пользовательские инструменты для поиска в Zinc, работы с корзиной и оплаты, а также инструкции, которые формируют диалог. MDA берет на себя остальное, включая сохранение переписки и заказов, чтобы пользователь мог вернуться через несколько дней и спросить о тех же самых ручках. Вот структура и сокращенное определение агента:
restock-agent/├── agent.py # агент: модель + инструменты├── instructions.md # как Restock общается и когда использует каждый инструмент├── tools/restock.py # инструменты, которые может вызывать модель├── restock/ # Zinc, кошелек Link, хранилище корзины и заказов└── sandbox/setup.sh # устанавливает Link CLI в песочнице
agent = define_deep_agent( name="restock", model=ChatOpenAI(model=os.environ.get("OPENAI_MODEL", "gpt-5.6-sol")), tools=[ search_restock_products, # поиск Zinc prepare_restock_order, # сохранение корзины set_restock_payment_amount, # авансовая сумма в рамках бюджета request_restock_payment, # проверка в Slack, затем подтверждение через Link wait_for_restock_approval, check_restock_order, # статус заказа от Zinc ],)
Для запроса о ручках Restock выполняет поиск в Zinc с использованием API-ключа Zinc и пополняемого поискового аккаунта (поиск не оплачивается через Link). Пользователь выбирает упаковку из 12 штук, и Restock сохраняет корзину без указания суммы оплаты.
Установка авансовой суммы
Restock рассматривает бюджет в 25 долларов как потолок, а не как сумму для списания. Налоги и стоимость доставки неизвестны на этапе просмотра товара, и итоговая сумма определяется только после оформления заказа у ритейлера. Поэтому Restock спрашивает пользователя, сколько он готов заплатить авансом, в пределах 25 долларов. Zinc списывает эту сумму при оформлении заказа, оплачивает товар ритейлеру и возвращает остаток.
Для ручек пользователь выбирает 23 доллара. Zinc удерживает базовую комиссию в 1 доллар, оставляя 22 доллара на товар, налоги и доставку. Дополнительные сборы, например за уведомления о заказе по email от Zinc, могут еще больше уменьшить эту сумму, поэтому перед проверкой Restock запрашивает заказ без оплаты и считывает фактические комиссии из ответа Zinc с кодом 402 Payment Required.
Защита учетных данных от модели
Модель никогда не получает доступ к секретным данным, используемым для оплаты заказа. Сессия Link находится в Connection, принадлежащем пользователю в MDA, поэтому кошелек каждого человека остается его личным. Адрес доставки, email для уведомлений и API-ключ Zinc находятся в Connection, принадлежащих агенту. Link CLI выполняет вход в систему внутри управляемой песочницы MDA. Небольшой вспомогательный скрипт хранит сессию в Connection пользователя и помещает ее в песочницу только во время выполнения команды. Подключение Link не подтверждает покупку, и последующие диалоги повторно используют сессию.
Проверка покупки в Slack
Прежде чем будет произведена оплата, пользователь проверяет корзину, метку офиса, комиссии и авансовую сумму в Slack. Адрес доставки остается скрытым. Restock создает прерывание для этой проверки, поэтому выполнение приостанавливается до тех пор, пока пользователь не нажмет «Одобрить» или «Отклонить» в Slack. Ничто из того, что модель записывает в вызов инструмента, не может подтвердить оплату.
Оплата через Link по протоколу MPP
Затем Restock отправляет ссылку на подтверждение Link в ветку Slack на сумму, указанную в ответе Zinc, те же 23 доллара. Пользователь подтверждает ее на сайте Link, что является согласием владельца кошелька на оплату.
Как только Link подтверждает оплату, Restock отправляет оплаченный запрос в Zinc с общим платежным токеном в качестве учетных данных, и Zinc обрабатывает платеж через Stripe. pympp отвечает за форматирование MPP.
Инструмент оплаты считывает токен из защищенного файла в песочнице, удаляет его после использования и возвращает модели только публичное резюме. Токен сам по себе не гарантирует соответствие содержимого корзины, поэтому инструмент также сверяет заказ с тем, что проверял пользователь, и подтверждает, что одобрение все еще актуально.
Подтверждение заказа
Заказ у ритейлера составил 21,18 доллара (14,99 за ручки, 1,20 налог, 4,99 доставка), что укладывается в лимит 22 доллара. Пользователь платит 22,18 доллара, включая комиссию Zinc, и Zinc возвращает остальные 0,82 доллара.
Restock подтверждает заказ в Slack, как только Zinc сообщает о статусе order_placed, и делится трекингом, когда ритейлер отправляет товар. Помимо иллюстративных цен, мы протестировали Restock от начала до конца на хостинге: реальный заказ достиг статуса order_placed, и ожидаемый возврат средств был получен.
Начало работы
Код находится по адресу langchain-samples/restock-agent, а в README пошагово описаны настройка и развертывание. Руководство по настройке Slack для MDA описывает подключение приложения Slack.
Restock — это пример: он поддерживает только доставку по США и USD, один офис на развертывание и оплату из кошелька инициатора запроса.
У Restock есть три режима. Установите RESTOCK_MODE, чтобы выбрать один из них, и попробуйте их по порядку:
- Rehearsal (rehearsal): вымышленные товары и симуляция подтверждения. Требуется API-ключ OpenAI и рабочее пространство LangSmith с доступом к Managed Deep Agents.
- Link test approval (link-test): реальный поиск в Zinc и реальное подтверждение через Link, без совершения покупки. Добавляет кошелек Link, API-ключ Zinc, пополняемый поисковый аккаунт Zinc и данные о доставке.
- Live purchase (live): реальный платеж и реальный заказ у ритейлера.
Этот паттерн применим к любому агенту, который тратит деньги. Позвольте агенту искать и формировать корзину, храните лимиты расходов и подтверждения в коде, к которому модель не имеет доступа, и считайте заказ размещенным только тогда, когда продавец подтвердит это.
Попробуйте Restock. Дайте нам знать, что вы думаете, и поделитесь тем, что вы создали на его основе!











