diff --git a/rest/python/server/integration_test.py b/rest/python/server/integration_test.py index c4f3186..7cc5590 100644 --- a/rest/python/server/integration_test.py +++ b/rest/python/server/integration_test.py @@ -45,14 +45,16 @@ from ucp_sdk.models.schemas.shopping.types import ( payment_instrument as payment_instr_type, ) -from ucp_sdk.models.schemas.shopping.ap2_mandate import Checkout as Ap2Checkout -from ucp_sdk.models.schemas.shopping.buyer_consent import ( +from ucp_sdk.models.schemas.shopping.ap2_mandate.dev.ucp.shopping import ( + Checkout as Ap2Checkout, +) +from ucp_sdk.models.schemas.shopping.buyer_consent.dev.ucp.shopping import ( Checkout as BuyerConsentCheckoutResp, ) -from ucp_sdk.models.schemas.shopping.discount import ( +from ucp_sdk.models.schemas.shopping.discount.dev.ucp.shopping import ( Checkout as DiscountCheckoutResp, ) -from ucp_sdk.models.schemas.shopping.fulfillment import ( +from ucp_sdk.models.schemas.shopping.fulfillment.dev.ucp.shopping import ( Checkout as FulfillmentCheckout, ) from ucp_sdk.models.schemas.shopping.order import PlatformSchema diff --git a/rest/python/server/models.py b/rest/python/server/models.py index e1197c0..0547f0e 100644 --- a/rest/python/server/models.py +++ b/rest/python/server/models.py @@ -20,17 +20,19 @@ """ from typing import Any -from ucp_sdk.models.schemas.shopping.ap2_mandate import Checkout as Ap2Checkout -from ucp_sdk.models.schemas.shopping.buyer_consent import ( +from ucp_sdk.models.schemas.shopping.ap2_mandate.dev.ucp.shopping import ( + Checkout as Ap2Checkout, +) +from ucp_sdk.models.schemas.shopping.buyer_consent.dev.ucp.shopping import ( Checkout as BuyerConsentCheckoutResp, ) -from ucp_sdk.models.schemas.shopping.discount import ( +from ucp_sdk.models.schemas.shopping.discount import DiscountsObject +from ucp_sdk.models.schemas.shopping.discount.dev.ucp.shopping import ( Checkout as DiscountCheckoutResp, - DiscountsObject, ) -from ucp_sdk.models.schemas.shopping.fulfillment import ( +from ucp_sdk.models.schemas.shopping.fulfillment import Fulfillment +from ucp_sdk.models.schemas.shopping.fulfillment.dev.ucp.shopping import ( Checkout as FulfillmentCheckout, - Fulfillment, ) from ucp_sdk.models.schemas.shopping.order import Order diff --git a/rest/python/server/routes/discovery_profile.json b/rest/python/server/routes/discovery_profile.json index dc6232c..2bceb45 100644 --- a/rest/python/server/routes/discovery_profile.json +++ b/rest/python/server/routes/discovery_profile.json @@ -1,72 +1,72 @@ { "ucp": { - "version": "2026-01-23", + "version": "2026-04-08", "services": { "dev.ucp.shopping": [ { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/overview", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/overview", "transport": "rest", "endpoint": "{{ENDPOINT}}", - "schema": "https://ucp.dev/2026-01-23/services/shopping/openapi.json" + "schema": "https://ucp.dev/2026-04-08/services/shopping/openapi.json" }, { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/overview", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/overview", "transport": "mcp", "endpoint": "{{ENDPOINT}}/mcp", - "schema": "https://ucp.dev/2026-01-23/services/shopping/openrpc.json" + "schema": "https://ucp.dev/2026-04-08/services/shopping/openrpc.json" }, { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/overview", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/overview", "transport": "a2a", "endpoint": "{{ENDPOINT}}/.well-known/agent-card.json" }, { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/overview", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/overview", "transport": "embedded", - "schema": "https://ucp.dev/2026-01-23/services/shopping/embedded.json" + "schema": "https://ucp.dev/2026-04-08/services/shopping/embedded.json" } ] }, "capabilities": { "dev.ucp.shopping.checkout": [ { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/checkout", - "schema": "https://ucp.dev/2026-01-23/schemas/shopping/checkout.json" + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/checkout", + "schema": "https://ucp.dev/2026-04-08/schemas/shopping/checkout.json" } ], "dev.ucp.shopping.order": [ { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/order", - "schema": "https://ucp.dev/2026-01-23/schemas/shopping/order.json" + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/order", + "schema": "https://ucp.dev/2026-04-08/schemas/shopping/order.json" } ], "dev.ucp.shopping.discount": [ { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/discount", - "schema": "https://ucp.dev/2026-01-23/schemas/shopping/discount.json", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/discount", + "schema": "https://ucp.dev/2026-04-08/schemas/shopping/discount.json", "extends": "dev.ucp.shopping.checkout" } ], "dev.ucp.shopping.fulfillment": [ { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/fulfillment", - "schema": "https://ucp.dev/2026-01-23/schemas/shopping/fulfillment.json", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/fulfillment", + "schema": "https://ucp.dev/2026-04-08/schemas/shopping/fulfillment.json", "extends": "dev.ucp.shopping.checkout" } ], "dev.ucp.shopping.buyer_consent": [ { - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/specification/buyer-consent", - "schema": "https://ucp.dev/2026-01-23/schemas/shopping/buyer_consent.json", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/specification/buyer-consent", + "schema": "https://ucp.dev/2026-04-08/schemas/shopping/buyer_consent.json", "extends": "dev.ucp.shopping.checkout" } ] @@ -76,11 +76,11 @@ { "id": "shop_pay", "name": "com.shopify.shop_pay", - "version": "2026-01-23", + "version": "2026-04-08", "spec": "https://shopify.dev/docs/agents/checkout/shop-pay-handler", - "config_schema": "https://shopify.dev/ucp/shop-pay-handler/2026-01-23/config.json", + "config_schema": "https://shopify.dev/ucp/shop-pay-handler/2026-04-08/config.json", "instrument_schemas": [ - "https://shopify.dev/ucp/shop-pay-handler/2026-01-23/instrument.json" + "https://shopify.dev/ucp/shop-pay-handler/2026-04-08/instrument.json" ], "config": { "shop_id": "{{SHOP_ID}}" @@ -91,11 +91,11 @@ { "id": "google_pay", "name": "com.google.pay", - "version": "2026-01-23", - "spec": "https://pay.google.com/gp/p/ucp/2026-01-23/", - "config_schema": "https://pay.google.com/gp/p/ucp/2026-01-23/schemas/config.json", + "version": "2026-04-08", + "spec": "https://pay.google.com/gp/p/ucp/2026-04-08/", + "config_schema": "https://pay.google.com/gp/p/ucp/2026-04-08/schemas/config.json", "instrument_schemas": [ - "https://pay.google.com/gp/p/ucp/2026-01-23/schemas/card_payment_instrument.json" + "https://pay.google.com/gp/p/ucp/2026-04-08/schemas/card_payment_instrument.json" ], "config": { "api_version": 2, @@ -132,8 +132,8 @@ { "id": "mock_payment_handler", "name": "mock_payment_handler", - "version": "2026-01-23", - "spec": "https://ucp.dev/2026-01-23/schemas/mock_payment_handler/spec", + "version": "2026-04-08", + "spec": "https://ucp.dev/2026-04-08/schemas/mock_payment_handler/spec", "config": {} } ] diff --git a/rest/python/server/services/checkout_service.py b/rest/python/server/services/checkout_service.py index 4539214..7cd9ec2 100644 --- a/rest/python/server/services/checkout_service.py +++ b/rest/python/server/services/checkout_service.py @@ -783,7 +783,7 @@ async def complete_checkout( ucp=UcpMetadata( root=ResponseOrder( version=getattr( - checkout.ucp.root, "version", Version("2026-01-23") + checkout.ucp.root, "version", Version("2026-04-08") ), capabilities={ getattr(k, "root", k): v @@ -798,7 +798,11 @@ async def complete_checkout( checkout_id=checkout.id, permalink_url=checkout.order.permalink_url, line_items=order_line_items, - totals=[total_resp.Total(**t.model_dump()) for t in checkout.totals], + currency=checkout.currency, + totals=[ + t.model_dump(mode="json", by_alias=True, exclude_none=True) + for t in getattr(checkout.totals, "root", checkout.totals) + ], fulfillment=OrderFulfillment(expectations=expectations, events=[]), ) @@ -1134,9 +1138,12 @@ async def _recalculate_totals( (t.amount for t in selected_opt.totals if t.type == "total"), 0, ) - grand_total += opt_total + opt_total_value = getattr(opt_total, "root", opt_total) + grand_total += opt_total_value checkout.totals.append( - TotalResponse(type="fulfillment", amount=opt_total) + TotalResponse( + type="fulfillment", amount=opt_total_value + ) ) # Discount Logic