diff --git a/a2a/business_agent/src/business_agent/agent.py b/a2a/business_agent/src/business_agent/agent.py index 4caeea8..3b8bec7 100644 --- a/a2a/business_agent/src/business_agent/agent.py +++ b/a2a/business_agent/src/business_agent/agent.py @@ -293,9 +293,10 @@ async def complete_checkout(tool_context: ToolContext) -> dict: "status": "requires_more_info", } + payment_instruments = payment_data.get(UCP_PAYMENT_DATA_KEY).instruments try: task = mpp.process_payment( - payment_data[UCP_PAYMENT_DATA_KEY], payment_data[UCP_RISK_SIGNALS_KEY] + payment_instruments, payment_data[UCP_RISK_SIGNALS_KEY] ) if task is None: @@ -304,9 +305,7 @@ async def complete_checkout(tool_context: ToolContext) -> dict: ) if task.status is not None and task.status.state == TaskState.completed: - payment_instrument = payment_data.get(UCP_PAYMENT_DATA_KEY) - checkout.payment.selected_instrument_id = payment_instrument.root.id - checkout.payment.instruments = [payment_instrument] + checkout.payment.instruments = payment_instruments response = store.place_order(checkout_id) # clear completed checkout from state diff --git a/a2a/business_agent/src/business_agent/agent_executor.py b/a2a/business_agent/src/business_agent/agent_executor.py index a7e708e..08b51b4 100644 --- a/a2a/business_agent/src/business_agent/agent_executor.py +++ b/a2a/business_agent/src/business_agent/agent_executor.py @@ -28,6 +28,7 @@ from google.adk.runners import Runner from google.adk.sessions import InMemorySessionService from google.genai import types +from ucp_sdk.models.schemas.shopping.payment_create_req import PaymentCreateRequest from ucp_sdk.models.schemas.shopping.types.payment_instrument import PaymentInstrument from ucp_sdk.models.schemas.ucp import ResponseCheckout as UcpMetadata from .constants import ( @@ -176,7 +177,7 @@ def _prepare_input(self, context: RequestContext) -> tuple[str, dict | None]: if key in data_part: value = data_part.pop(key) if key == UCP_PAYMENT_DATA_KEY: - payment_payload[key] = PaymentInstrument.model_validate(value) + payment_payload[key] = PaymentCreateRequest.model_validate(value) else: payment_payload[key] = value diff --git a/a2a/business_agent/src/business_agent/constants.py b/a2a/business_agent/src/business_agent/constants.py index 7fe95bb..2e2c1ee 100644 --- a/a2a/business_agent/src/business_agent/constants.py +++ b/a2a/business_agent/src/business_agent/constants.py @@ -28,5 +28,5 @@ UCP_DISCOUNT_EXTENSION = "dev.ucp.shopping.discount" UCP_CHECKOUT_KEY = "a2a.ucp.checkout" -UCP_PAYMENT_DATA_KEY = "a2a.ucp.checkout.payment_data" +UCP_PAYMENT_DATA_KEY = "a2a.ucp.checkout.payment" UCP_RISK_SIGNALS_KEY = "a2a.ucp.checkout.risk_signals" diff --git a/a2a/business_agent/src/business_agent/payment_processor.py b/a2a/business_agent/src/business_agent/payment_processor.py index 4142fa1..837c60c 100644 --- a/a2a/business_agent/src/business_agent/payment_processor.py +++ b/a2a/business_agent/src/business_agent/payment_processor.py @@ -23,7 +23,7 @@ class MockPaymentProcessor: """Mock Payment Processor simulating calls from Merchant Agent to MPP Agent.""" def process_payment( - self, payment_data: PaymentInstrument, risk_data: Any | None = None + self, instruments: list[PaymentInstrument], risk_data: Any | None = None ): """Process the payment.""" # this should invoke the Merchant Payment Processor to validate the payment diff --git a/a2a/chat-client/App.tsx b/a2a/chat-client/App.tsx index a7081b8..4a7ea3d 100644 --- a/a2a/chat-client/App.tsx +++ b/a2a/chat-client/App.tsx @@ -20,7 +20,7 @@ import Header from './components/Header'; import {appConfig} from './config'; import {CredentialProviderProxy} from './mocks/credentialProviderProxy'; -import {ChatMessage, PaymentInstrument, Product, Sender} from './types'; +import {ChatMessage, Payment, PaymentInstrument, Product, Sender} from './types'; const initialMessage: ChatMessage = { sender: Sender.MODEL, @@ -167,13 +167,16 @@ function App() { userActionMessage, ]); + const payment: Payment = { + instruments: [paymentInstrument] + } try { const parts = [ {type: 'data', data: {'action': 'complete_checkout'}}, { type: 'data', data: { - 'a2a.ucp.checkout.payment_data': paymentInstrument, + 'a2a.ucp.checkout.payment': payment, 'a2a.ucp.checkout.risk_signals': {'data': 'some risk data'}, }, }, diff --git a/a2a/chat-client/types.ts b/a2a/chat-client/types.ts index dfa2cf1..bbc8f4f 100644 --- a/a2a/chat-client/types.ts +++ b/a2a/chat-client/types.ts @@ -55,6 +55,10 @@ export interface PaymentInstrument extends PaymentMethod { credential: Credential; } +export interface Payment { + instruments: PaymentInstrument[]; +} + export interface ChatMessage { sender: Sender; text: string;