결제할 수 있는 에이전트 구축하기: Stripe의 Link와 Managed Deep Agents로 Restock 구현
요약
본 글은 실제 돈이 오가는 결제 기능을 갖춘 에이전트 'Restock' 구축 과정을 설명합니다. Restock은 Stripe의 Link와 Machine Payments Protocol(MPP)을 활용하여, 사용자의 예산 내에서 안전하게 제품 검색부터 결제까지 완료하는 것이 핵심입니다. 이를 통해 모델에게 민감한 자격 증명이 노출되는 위험을 최소화했습니다.
핵심 포인트
- 실제 구매를 구현한 에이전트 Restock의 작동 방식 소개
- Stripe Link와 MPP 사용으로 안전하게 결제 처리 가능
- 에이전트가 직접 결제하는 과정은 복잡하며, 전문 프로토콜 필요
- Managed Deep Agents(MDA)는 에이전트 호스팅 및 상태 관리를 담당
핵심 요약
Restock은 실제 구매에 대한 대금을 지불하는 샘플 에이전트입니다. 이는 Managed Deep Agents에서 Slack을 통해 실행되며, 제품을 찾고, 장바구니를 만들고, Machine Payments Protocol (MPP)을 지원하는 API를 통해 결제를 완료합니다. 결제는 안전하게 예산 내에서 이루어집니다. Stripe의 소비자 지갑인 Link가 결제를 처리하므로 에이전트는 카드 번호를 절대 볼 수 없습니다. 사용자가 설정된 금액까지 지출 요청을 승인하며, 에이전트가 그 이상으로 지출할 수는 없습니다.직접 결제하는 자신만의 에이전트를 구축해 보세요. Restock의 샘플 코드를 시작점으로 삼아 직접 만들어 보시길 바랍니다.
에이전트는 이미 구매할 물건을 찾는 데는 능숙합니다. 하지만 대금을 지불하는 것은 더 어렵습니다. 실제 돈이 오가고, 모델이 절대 봐서는 안 되는 자격 증명이 필요하며, 되돌리기가 어렵기 때문입니다.
결제하는 에이전트를 어떻게 구축하는지 보여주기 위해, 우리는 Managed Deep Agents에서 Slack을 통해 실행되는 사무용품 에이전트인 Restock을 만들었습니다. 이 에이전트는 실제 제품을 검색하고, 장바구니를 만들고, 에이전트에게 가장 안전한 결제 방식을 제공하는 Stripe의 소비자 지갑 Link를 통해 대금을 지불합니다.
본 포스트는 첫 번째 메시지에서 확정된 주문까지의 과정을 따라가며 작성되었습니다:
'펜이 부족해요. 사무실용 파란색 잉크 펜 12개 묶음을 총 $25 미만으로 찾아줄 수 있나요?'
Restock은 수수료를 포함하여 펜을 $22.18에 주문합니다. 본 포스트의 가격은 예시입니다.
결제 방법 선택하기
에이전트가 브라우저에서 소매점의 결제 과정을 직접 수행하도록 할 수는 있지만, 이는 불안정합니다. 페이지는 변경되고, 사이트는 자동화된 결제를 차단하며, 결제 세부 정보는 모델에게 노출되지 않도록 입력되어야 합니다.
Machine Payments Protocol (MPP)을 지원하는 API를 사용하면 이러한 문제를 피할 수 있습니다. 이 프로토콜은 에이전트에게 무엇을 지불해야 하는지 정확히 알려주고 대금을 직접 받습니다. 단점은 커버리지입니다. 에이전트는 MPP가 활성화된 API를 통해서만 구매할 수 있기 때문입니다. 하지만 Apify나 Mercator 같은 도구 집계기(tool aggregators)가 Zinc 같은 소매업 전문 분야와 합류하면서 이 목록은 증가하고 있습니다. Restock은 Zinc을 사용하지만, 그 패턴이 Zinc에 의존하는 것은 아닙니다.
구성 요소들이 어떻게 맞물리는지
Restock은 네 가지 구성 요소로 구축되었습니다:
Link는 사용자의 결제 수단을 보유하고 결제를 승인하도록 요청합니다.MPP(Machine Payments Protocol)는 HTTP를 통해 결제 교환을 정의합니다. 가맹점은 402 Payment Required와 결제 지침으로 응답하며, 클라이언트는 결제 자격 증명(payment credential)을 가지고 재시도합니다.Zinc은 MPP 주문 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은 25달러 예산을 청구할 금액이 아닌 상한선으로 간주합니다. 세금과 배송비는 제품 목록만으로는 알 수 없으며, 총액은 소매업체 주문이 완료된 후에야 확정됩니다. 따라서 Restock은 사용자에게 선지급할 금액을 묻고, 최대 25달러까지 가능합니다. Zinc은 주문이 들어갈 때 그 금액을 받고, 이 돈으로 소매업체에 대금을 지불한 후 나머지를 환불합니다.
펜의 경우, 사용자가 23달러를 선택합니다. Zinc은 1달러의 기본 수수료를 보유하고, 이는 품목, 세금 및 배송비를 위한 22달러의 소매업체 할당액을 남깁니다. Zinc의 이메일 주문 업데이트와 같은 선택적 수수료는 이를 더욱 줄일 수 있으므로, 검토 전에 Restock은 결제 없이 주문을 요청하고 Zinc의 402 Payment Required challenge에서 실제 수수료를 읽어옵니다.
모델로부터 자격 증명 유지하기
모델은 주문에 대한 비용을 지불하는 비밀 정보(secrets)를 절대 처리하지 않습니다. Link 세션은 사용자 소유의 MDA Connection에 존재하므로, 각 사용자의 지갑은 여전히 그들 자신의 것입니다. 배송 주소, 알림 이메일, Zinc API 키는 에이전트 소유의 Connection에 저장됩니다. Link CLI는 MDA가 관리하는 샌드박스 내부에서 로그인을 실행합니다. 작은 도우미 프로그램이 저장된 세션을 사용자의 Connection에 유지하고, 명령이 실행되는 동안만 샌드박스에 배치합니다. Connecting Link는 구매를 승인하지 않으며, 이후 대화에서는 이 세션을 재사용합니다.
Slack에서 구매 검토하기
어떤 결제가 이루어지기 전에, 사용자는 슬랙(Slack)에서 장바구니, 사무실 라벨, 수수료 및 선지급 금액을 검토합니다. 배송 주소는 비공개로 유지됩니다. Restock은 이 검토를 위해 인터럽트(interrupt)를 발생시키므로, 사용자가 슬랙에서 승인(Approve) 또는 거부(Reject)를 클릭할 때까지 실행이 일시 중지됩니다. 모델이 도구 호출(tool call)에 작성하는 어떤 내용도 이를 승인할 수 없습니다.
MPP를 통해 Link로 결제하기
다음으로, Restock은 Zinc의 challenge 금액과 정확히 동일한 23달러 금액으로 슬랙 스레드에 Link 승인 링크를 게시합니다. 사용자는 이 Link 웹사이트에서 이를 승인하며, 이는 지갑 자체의 결제 동의입니다.
Link가 승인하면 Restock은 공유된 결제 토큰(shared payment token)을 자격 증명으로 사용하여 Zinc에 결제 요청을 보내고, Zinc이 Stripe를 통해 결제를 처리합니다. pympp는 MPP 포맷팅을 처리합니다.
결제 도구는 비공개 샌드박스 파일에서 토큰을 읽어 사용 후 삭제하고, 모델에게 공개 요약 정보만 반환합니다. 이 토큰 자체로는 장바구니 세부 정보를 강제하지 않기 때문에, 해당 도구는 또한 주문이 사용자가 검토한 내용과 일치하는지 확인하고 승인이 여전히 유효한지 확인합니다.
주문 확인하기
판매점 주문액은 $21.18(펜 $14.99, 세금 $1.20, 배송비 $4.99)이며, 이는 $22 한도 내입니다. 사용자는 Zinc의 수수료를 포함하여 $22.18을 결제하고, Zinc은 나머지 $0.82를 환불합니다.

Restock은 Zinc이 order_placed를 보고하면 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 테스트 승인(Link test approval)(link-test): 실제 Zinc 검색 및 실제 Link 승인이 이루어지지만, 구매는 없습니다. Link 지갑, Zinc API 키, 자금이 충전된 Zinc 검색 계정, 배송 세부 정보가 추가됩니다.실시간 구매(Live purchase)(live): 실제 결제와 실제 판매점 주문이 발생합니다.
이 패턴은 돈을 쓰는 모든 에이전트에 적용됩니다. 에이전트가 검색하고 장바구니를 만들게 하고, 지출 한도와 모델이 건드릴 수 없는 승인 절차는 코드에 유지하며, 판매자가 확정할 때만 주문이 완료된 것으로 간주하세요.
Restock을 사용해 보세요. 여러분의 의견을 알려주시고, 이 위에 어떤 것을 구축했는지 공유해주세요!
AI 자동 생성 콘텐츠
본 콘텐츠는 LangChain Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기