6kitty 6kitty

⎛⎝ ≽ > ⩊ < ≼ ⎠⎞

6kitty

260405 TIL

Today I learned :

AP2 조사

AP2(Agent Payments Protocol) from Google

: AI 에이전트가 안전하게 상거래 및 결제를 수행하도록 지원하는 오픈소스 표준 프로토콜이다.

x402와 다른 점

AP2는 AI와 user 간 신뢰, 승인 layer이다. 사용자가 “하루 10달러까지 뉴스 구독에만 써라” 같은 명령을 하면 이것을 자격 증명 형태로 AI 에이전트에게 부여한다. 이때 사용하는 프로토콜이 AP2이다. 반면 x402는 돈을 옮기는 정산 및 실행 계층이다.

두 가지 플로우를 정리해보자면..

[user] -> [AP2] -> [x402]

MCP: 에이전트와 데이터/API 통신 A2A: 에이전트와 에이전트 통신 AP2: 에이전트와 결제 통신(신뢰 검증 등..)

-> A2A 위에 올라가는 결제 신뢰 레이어가 AP2이다.

AP2 개요

누가 구매를 승인했는지와 감사 추적 담당 타입 지정 mandate로 모든 거래에 설정 가능한 가드레일 적용

# AP2 내의 플로우 
[IntentMandate] -> [PaymentMandate] -> [PaymentReceipt]

IntentMandate : 허용 가맹점, 지출 한도, 자동 승인 여부, 환불 가능성 요구, 만료 시간 등 가드레일 설정
PaymentMandate : 특정 카트와 금액에 바인딩된 결제 위임장으로, 한도 초과 시 관리자의 명시적 승인까지 미서명 상태 유지
PaymentReceipt : 감사 추적을 완결하는 영수증

UCP의 확장(extension)으로 동작하여, 체크아웃 플로우에 암호화된 인가 증명 추가

역할 기반 아키텍처

AP2는 다음 6개의 액터를 정의하고 있다.

  1. User
  2. Shopping Agent : 사용자와 상호작용하는 인터페이스. 추후 핸즈온에서 나오는 챗봇 화면
  3. Credentials Provider : 사용자의 결제 자격증명을 안전하게 관리하는 디지털 지갑
  4. Merchant Endpoint : 판매자 대신 상품을 확인하는 에이전트 혹은 웹 인터페이스
  5. MPP : 결제 네트워크로 보낼 최종 거래 승인 메시지 구성

VDC

VDC는 AP2에서 작동하는 디지털 객체인데, 이 객체는 다음 세 가지 Mandate 타입이 있다.

  1. Cart Mandate : 사용자가 직접 담는 자격증명.
    Payer&Payee 정보, 결제 수단, Risk Payload, 거래 상세, 환불 조건
  2. Intent Mandate : “콘서트 티켓 가격이 $100 이하로 떨어지면 구매해줘” 같은 사용자가 예약 맞추고 간(=거래 시점에 부재한 상태) 시나리오를 위한 VDC.
    Payer&Payee 정보, 승인된 결제 수단 목록, Risk Payload, Shopping Intent, Prompt Playback, TTL(mandate 유효시간)
  3. Payment Mandate : 결제 네트워크, 발급사에 공유되는 VDC.

AP2 핸즈온

mac에서 실습 진행 https://aistudio.google.com/ 에서 API 키를 발급 받아야 한다.

#

Background

AP2 프로젝트에서 짚은 AI agent 자율 결제에 대한 문제 정의는 다음과 같다. (신뢰 관점에서)

Authorization 사용자가 에이전트에게 특정 구매에 대한 권한을 부여했다는 것을 어떻게 검증하는가?
Authenticity 에이전트의 요청이 사용자의 진짜 의도를 반영한 것인지, AI 환각(hallucination)으로 인한 오류가 아닌지를 판매자가 어떻게 확신할 수 있는가?
Accountability 사기성 거래나 오류 거래가 발생했을 때, 사용자·에이전트 개발자·판매자·발급사 중 누가 책임을 지는가?

AP2 프로젝트는 위 세가지에 대해 해결하고 AI 에이전트가 안전하게 상거래 및 결제를 수행하도록 지원하는 오픈소스 표준 프로토콜이다.

Analysis

누가 구매를 승인했는지와 감사 추적 담당이다. 한 가지 짚고 가야할 부분이 x402는 돈 거래, 전송 protocol이고, AP2는 AI와 user 간 신뢰, 승인 layer protocol이다.

[user] -> [AP2] -> [x402]

MCP: 에이전트와 데이터/API 통신 A2A: 에이전트와 에이전트 통신 AP2: 에이전트와 결제 통신(신뢰 검증 등..)

-> A2A 위에 올라가는 결제 신뢰 레이어가 AP2이다.

AP2 내의 플로우

[IntentMandate] -> [PaymentMandate] -> [PaymentReceipt]

IntentMandate : 허용 가맹점, 지출 한도, 자동 승인 여부, 환불 가능성 요구, 만료 시간 등 가드레일 설정
PaymentMandate : 특정 카트와 금액에 바인딩된 결제 위임장으로, 한도 초과 시 관리자의 명시적 승인까지 미서명 상태 유지
PaymentReceipt : 감사 추적을 완결하는 영수증

UCP의 확장(extension)으로 동작하여, 체크아웃 플로우에 암호화된 인가 증명 추가

역할 기반 아키텍처

AP2는 다음 6개의 액터를 정의하고 있다.

  1. User
  2. Shopping Agent : 사용자와 상호작용하는 인터페이스. 추후 핸즈온에서 나오는 챗봇 화면
  3. Credentials Provider : 사용자의 결제 자격증명을 안전하게 관리하는 디지털 지갑
  4. Merchant Endpoint : 판매자 대신 상품을 확인하는 에이전트 혹은 웹 인터페이스
  5. MPP : 결제 네트워크로 보낼 최종 거래 승인 메시지 구성

VDC

VDC는 AP2에서 작동하는 디지털 객체인데, 이 객체는 다음 세 가지 Mandate 타입이 있다.

  1. Cart Mandate : 사용자가 직접 담는 자격증명.
    Payer&Payee 정보, 결제 수단, Risk Payload, 거래 상세, 환불 조건
  2. Intent Mandate : “콘서트 티켓 가격이 $100 이하로 떨어지면 구매해줘” 같은 사용자가 예약 맞추고 간(=거래 시점에 부재한 상태) 시나리오를 위한 VDC.
    Payer&Payee 정보, 승인된 결제 수단 목록, Risk Payload, Shopping Intent, Prompt Playback, TTL(mandate 유효시간)
  3. Payment Mandate : 결제 네트워크, 발급사에 공유되는 VDC.
    • IntentMandate 구조체
     "intent_mandate": {
       "natural_language_description": "YouTube Premium subscription",
       "user_cart_confirmation_required": true,
       "requires_refundability": false,
       "merchants": [],
       "skus": [],
       "intent_expiry": "2026-04-12T06:31:15Z"
     }
    
  • CartMandate (x402 ver.)

      "method_data": [{
        "supported_methods": "https://www.x402.org/",
        "data": {
          "x402Version": 1,
          "accepts": [{
            "scheme": "exact",
            "network": "base",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913",
            "payTo": "0xMerchantWalletAddress",
            "maxAmountRequired": "13990000"
          }]
        }
      }]
    
  • PaymentMandate

      "payment_mandate": {
        "payment_mandate_contents": {
          "payment_mandate_id": "402d16a9868344749ec609fb5dd025f4",
          "payment_details_total": {
            "amount": { "currency": "USD", "value": 17.49 },
            "refund_period": 30
          },
          "payment_response": {
            "method_name": "https://www.x402.org/",
            "details": {
              "value": {
                "scheme": "exact",
                "network": "base",
                "payload": {
                  "signature": "0xmocksignature",
                  "authorization": {
                    "from_": "0xPayerWalletAddress",
                    "to": "0xMerchantAddress",
                    "value": "100",
                    "valid_after": "0",
                    "valid_before": "9999999999",
                    "nonce": "0xrandomnonce"
                  }
                }
              }
            }
          },
          "merchant_agent": "Generic Merchant",
          "timestamp": "2026-04-11T06:34:04Z"
        }
      }
    

Practice

사전 환경 설정

mac에서 실습 진행 https://aistudio.google.com/ 에서 API 키를 발급 받아야 한다.

% git clone <ap2 깃주소>
Cloning into 'AP2'...
remote: Enumerating objects: 689, done.
remote: Counting objects: 100% (374/374), done.
remote: Compressing objects: 100% (276/276), done.
remote: Total 689 (delta 243), reused 113 (delta 98), pack-reused 315 (from 2)
Receiving objects: 100% (689/689), 1.68 MiB | 9.06 MiB/s, done.
Resolving deltas: 100% (266/266), done.

% cd AP2
% export GOOGLE_API_KEY='발급받은 api 키 넣기'
% cd samples/python
% uv sync
% bash samples/python/scenarios/a2a/human-present/cards/run.sh --payment-method x402

위와 같이 실행하면 x402 테스트 샘플로 각 agent가 실행된다.

  1. shopping agent(8000)
  2. merchant agent(8001)
  3. credentials provider(8002)
  4. merchant apyment processor(8003)

*괄호 안 숫자는 실행되고 있는 port num

실행 화면

8000 port 접속하면 이렇게 보인다. shopping_agent에서 이렇게 챗봇 형식으로 구매 가능하다.

https://github.com/6kitty/PBM-prac/blob/main/session-ddd49213-85d2-467f-840a-2a98e908efd4.json

세션에 대한 전체 구조체는 위 링크 참고

실습 history

1. "유튜브 프리미엄 구독제를 결제하고 싶어" 입력 → shopper로 전달
2. `create_intent_mandate` 호출 (YouTube Premium subscription)
3. `find_products` 호출 → 3개 옵션 제시
   - 월간 $13.99
   - 연간 $139.99
   - 패밀리 $22.99
4. 1번(월간) 선택 → `update_chosen_cart_mandate(cart_1)`
5. 배송 주소: Google Wallet (bugsbunny@gmail.com) 통해 수집
6. 결제 수단: "Bugs's x402 Base USDC Wallet" (블록체인, Base network) 선택
7. `create_payment_mandate``sign_mandates_on_user_device``send_signed_payment_mandate_to_credentials_provider`
8. OTP: 123 입력 → `initiate_payment` 호출
9. Payment Receipt 발급 완료 (payment_id: `c0532b2832de48dfb64bd23173bd9b40`, 총 $17.49)

위 깃허브 json 파일에서 대화 흐름을 가져왔다.

트러블슈팅

shapely==2.1.1 빌드 시 GEOS 라이브러리가 없음 (geos-config not found)
numpy 헤더 파일이 없음
Python 3.14를 사용 중인데 shapely에 해당 버전 pre-built wheel이 없어서 소스 빌드를 시도하다 실패하는 것입니다. GEOS를 설치하면 해결됩니다.
  1. shopping agent(8000)
  2. merchant agent(8001)
  3. credentials provider(8002)
  4. merchant apyment processor(8003)