LangChain Blog수정일

결제할 수 있는 에이전트: Stripe의 Link 및 Managed Deep Agents로 Restock 구축하기

핵심 요약 Restock는 실제 구매를 위해 결제하는 샘플 에이전트입니다. Slack의 Managed Deep Agents에서 실행되며 제품을 찾고, 장바구니를 만들고, 다음을 지원하는 API를 통해 결제를 완료합니다. 머신 페이먼츠 프로토콜(Machine Payments Protocol) (MPP). 결제는 안전하게 유지되며 예산 범위 내에서 이루어집니다

Restock payment flow from the Slack request to the confirmed order, with approvals in Slack and in Link
이미지 출처 · LangChain Blog

핵심 요약

  • Restock는 실제 구매를 위해 결제하는 샘플 에이전트입니다. Slack의 Managed Deep Agents에서 실행되며 제품을 찾고, 장바구니를 만들고, 다음을 지원하는 API를 통해 결제를 완료합니다. 머신 페이먼츠 프로토콜(Machine Payments Protocol) (MPP).
  • 결제는 안전하게 유지되며 예산 범위 내에서 이루어집니다. Stripe의 소비자 지갑인 Link가 결제를 처리하므로 에이전트는 카드 번호를 볼 수 없습니다. 사용자가 설정된 금액까지의 지출 요청을 승인하면, 에이전트는 그 금액을 초과해 지출할 수 없습니다.
  • 결제할 수 있는 자신만의 에이전트를 만들어 보세요. 시작 Restock의 샘플 코드, 그리고 여러분이 만든 것을 알려주세요.

에이전트는 이미 구매할 물건을 찾는 데는 능숙합니다. 결제는 더 어렵습니다. 실제 돈이 움직이고, 모델이 절대 봐서는 안 되는 인증 정보가 필요하며, 되돌리기도 어렵기 때문입니다.

수익을 내는 에이전트를 구축하는 방법을 보여드리기 위해, Slack에서 실행되는 사무용품 샘플 에이전트인 Restock을 만들었습니다. 관리형 딥 에이전트. 실제 상품을 검색하고 장바구니를 구성하며 결제를 진행합니다. 링크, 에이전트에게 가장 안전한 결제 방법을 제공하는 Stripe의 소비자 지갑입니다.

이 게시물은 첫 번째 메시지의 요청부터 확정된 주문까지의 과정을 담고 있습니다:

볼펜이 얼마 남지 않았어요. 사무실에서 쓸 12개입 블루 잉크 볼펜 세트를 총 $25 이하로 찾아줄 수 있나요?

재입고 주문으로 펜을 $22.18에 다시 주문했습니다(수수료 포함). 이 글의 가격은 예시용입니다.

결제 수단 선택하기

에이전트는 브라우저에서 소매업체의 결제 페이지를 직접 운전하여 결제할 수 있지만, 이는 취약합니다. 페이지는 바뀌고, 사이트들은 자동화된 결제를 차단하며, 결제 정보는 모델에 노출되지 않도록 입력해야 합니다.

다음을 지원하는 API 머신 페이먼츠 프로토콜(Machine Payments Protocol) (MPP)는 이를 방지합니다. 에이전트에게 정확히 얼마를 지불할지 알려주고 결제를 직접 수락합니다. 단점은 커버리지인데, 에이전트는 MPP를 지원하는 API를 통해서만 구매할 수 있습니다. 이 목록은 늘어나고 있으며, Apify와 Mercator 같은 툴 애그리게이터가 다음과 같은 수직 분야 서비스들에 합류하고 있습니다. 아연 소매용입니다. Restock은 Zinc을 사용하지만, 이 패턴은 Zinc에 의존하지 않습니다.

각 조각이 어떻게 맞춰지는가

Restock은 네 가지 구성 요소로 만들어졌습니다:

  • 링크 사용자의 결제 수단을 보관하고 결제 승인을 요청합니다.
  • MPP인 Machine Payments Protocol은(는) HTTP를 통한 결제 교환을 정의합니다. 가맹점은 402 Payment Required 및 결제 안내로 응답하고, 클라이언트는 결제 자격 증명과 함께 재시도합니다.
  • Zinc 은(는) 상품을 검색하고 MPP order API.
  • Managed Deep Agents (MDA) 를 통해 판매처 주문을 진행하며, 에이전트를 호스팅하고 Slack, 사람의 검토, 자격 증명, 저장된 상태를 처리합니다.
Restock payment flow from the Slack request to the confirmed order, with approvals in Slack and in Link
펜 요청이 ask에서 confirmed order로 진행됩니다. 사용자는 두 번 승인합니다: Slack에서의 구매 승인과 Link에서의 결제 승인입니다.

검색과 장바구니

저희는 커스텀 도구 를 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 challenge에서 실제 수수료를 읽어옵니다.

모델에서 자격 증명 분리하기

모델은 주문 결제에 사용되는 시크릿을 절대 다루지 않습니다. Link 세션은 user-owned MDA Connection에 존재하므로 각 개인의 지갑은 본인 소유로 유지됩니다. 배송 주소, 알림 이메일, Zinc API 키는 agent-owned Connections에 있습니다. Link CLI는 MDA의 managed sandbox내에서 로그인을 실행합니다. 작은 헬퍼가 저장된 세션을 사용자의 Connection에 보관하고 명령이 실행되는 동안에만 샌드박스에 배치합니다. Link 연결은 구매를 승인하지 않으며, 이후 대화에서는 세션을 재사용합니다.

Slack에서 구매 검토하기

결제가 이루어지기 전에 사용자는 Slack에서 장바구니, 사무실 라벨, 수수료, 선결제 금액을 검토합니다. 배송 주소는 비공개로 유지됩니다. Restock은 이 검토를 위해 interrupt 를 발생시키므로, 사용자가 Slack에서 승인 또는 거부를 클릭할 때까지 실행은 일시 중지 상태로 유지됩니다. 모델이 도구 호출에 작성하는 어떤 내용도 이를 승인할 수 없습니다.

MPP를 통해 Link로 결제하기

다음으로 Restock은 Zinc의 challenge에 정확히 명시된 금액, 즉 동일한 23달러에 해당하는 Link 승인 링크를 Slack 스레드에 게시합니다. 사용자는 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달러를 환불합니다.

Budget breakdown for the pens order: $25 budget, $23 approved, $22.18 paid, $0.82 refunded
예시 가격 기준 펜 주문의 자금 흐름. 사용자는 25달러 예산에 대해 Link에서 23달러를 승인하고, 22.18달러를 지불하며, 0.82달러를 돌려받습니다.

Zinc가 보고하면 order_placedRestock이 Slack에서 확인해 주고, 소매점이 배송하면 배송 추적 정보를 공유합니다. 예시 가격 외에도, 우리는 호스팅된 배포에서 Restock을 엔드투엔드로 실행했습니다: 실제 주문이 도착했고 order_placed, 예상된 환불이 처리되었습니다.

시작하기

코드는 langchain-samples/restock-agent에 있으며, 그 README 설치와 배포 과정을 단계별로 안내합니다. MDA의 Slack 설정 가이드 Slack 앱 연결 방법을 다룹니다.

Restock은 샘플입니다: 미국 내 배송과 USD 결제만 지원하며, 배포당 사무실 1곳, 요청자 본인 지갑을 통한 결제만 가능합니다.

Restock에는 세 가지 모드가 있습니다. 설정 RESTOCK_MODE 하나를 선택한 후 순서대로 시도해 보세요:

  1. 리허설 (rehearsal): 가상의 제품과 시뮬레이션된 승인이 포함되어 있습니다. OpenAI API 키와 Managed Deep Agents 액세스 권한이 있는 LangSmith 워크스페이스가 필요합니다.
  2. 링크 테스트 승인 (link-test실제 Zinc 검색과 실제 Link 승인을 진행하되 구매는 하지 않습니다. Link 지갑, Zinc API 키, 충전된 Zinc 검색 계정 및 배송 정보를 추가합니다.
  3. 라이브 구매 (live): 실제 결제와 실제 판매자 주문입니다.

이 패턴은 돈을 쓰는 모든 에이전트에 적용됩니다. 에이전트가 검색하고 장바구니를 구성하도록 하되, 지출 한도와 승인 절차는 모델이 접근할 수 없는 코드에 두고, 주문은 판매자가 그렇다고 확인했을 때에만 완료된 것으로 간주하십시오.

Restock를 사용해 보세요. 사용 후기를 알려주시고, 이를 기반으로 만든 것들을 공유해 주세요!

원문 출처

LangChain Blog

내용 안내

원문 발행 및 권리는 출처에 있습니다.

기계 번역 · 원문을 참고하세요