Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions rest/python/server/generated_routes/ucp_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@
import ucp_sdk.models.schemas.shopping.checkout
import ucp_sdk.models.schemas.shopping.checkout_update_request
import ucp_sdk.models.schemas.shopping.order
import ucp_sdk.models.schemas.shopping.payment_create_request
import ucp_sdk.models.schemas.shopping.payment

try:
import ucp_sdk.models.schemas.shopping.payment_create_request
import ucp_sdk.models.schemas.shopping.payment
except ImportError:
import ucp_sdk.models.schemas.common.types.payment_create_request
import ucp_sdk.models.schemas.common.types.payment

router = APIRouter()

Expand Down
59 changes: 28 additions & 31 deletions rest/python/server/integration_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,29 @@
from ucp_sdk.models.schemas.shopping import (
checkout_create_request as checkout_create_req,
)
from ucp_sdk.models.schemas.shopping import (
payment_create_request as payment_create_req,
)

try:
from ucp_sdk.models.schemas.shopping import (
payment_create_request as payment_create_req,
)
except ImportError:
from ucp_sdk.models.schemas.common.types import (
payment_create_request as payment_create_req,
)

try:
from ucp_sdk.models.schemas.shopping import (
payment_complete_request as payment_comp_req,
)
except ImportError:
from ucp_sdk.models.schemas.common.types import (
payment_complete_request as payment_comp_req,
)

from ucp_sdk.models.schemas.shopping import (
checkout_complete_request as checkout_comp_req,
payment_complete_request as payment_comp_req,
)
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 (
Checkout as BuyerConsentCheckoutResp,
)
from ucp_sdk.models.schemas.shopping.discount import (
Checkout as DiscountCheckoutResp,
)
from ucp_sdk.models.schemas.shopping.fulfillment import (
Checkout as FulfillmentCheckout,
)
from ucp_sdk.models.schemas.shopping.checkout import Checkout as BaseCheckout
from ucp_sdk.models.schemas.shopping.order import PlatformSchema
from ucp_sdk.models.schemas.shopping.types import (
fulfillment_group_create_request as fulfillment_group_create_req,
Expand All @@ -75,12 +77,7 @@
FLAGS = flags.FLAGS


class TestCheckout(
BuyerConsentCheckoutResp,
FulfillmentCheckout,
DiscountCheckoutResp,
Ap2Checkout,
):
class TestCheckout(BaseCheckout):
"""Checkout model supporting Fulfillment, Discount, and AP2 extensions."""

platform: PlatformSchema | None = None
Expand Down Expand Up @@ -238,7 +235,7 @@ def _create_checkout_payload(

# Hierarchical Fulfillment Construction
destination = shipping_destination_req.ShippingDestination(
id="dest_1", address_country="US"
id="dest_1", address_country="US", type="shipping_address"
)
group = fulfillment_group_create_req.FulfillmentGroupCreateRequest(
id="group_1",
Expand Down Expand Up @@ -272,13 +269,13 @@ def _create_payment_payload(self) -> dict:
payload = checkout_comp_req.CheckoutCompleteRequest(
payment=payment_comp_req.PaymentCompleteRequest(
instruments=[
payment_instr_type.SelectedPaymentInstrument(
id="instr_1",
handler_id="mock_payment_handler",
type="card",
display={"brand": "Visa", "last_digits": "1234"},
credential={"type": "token", "token": "success_token"},
)
{
"id": "instr_1",
"handler_id": "mock_payment_handler",
"type": "card",
"display": {"brand": "Visa", "last_digits": "1234"},
"credential": {"type": "token", "token": "success_token"},
}
]
),
risk_signals={},
Expand Down
26 changes: 8 additions & 18 deletions rest/python/server/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,9 @@
"""

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 (
Checkout as BuyerConsentCheckoutResp,
)
from ucp_sdk.models.schemas.shopping.discount import (
Checkout as DiscountCheckoutResp,
DiscountsObject,
)
from ucp_sdk.models.schemas.shopping.fulfillment import (
Checkout as FulfillmentCheckout,
Fulfillment,
)
from ucp_sdk.models.schemas.shopping.checkout import Checkout as BaseCheckout
from ucp_sdk.models.schemas.shopping.discount import DiscountsObject
from ucp_sdk.models.schemas.shopping.fulfillment import Fulfillment

from ucp_sdk.models.schemas.shopping.order import Order
from ucp_sdk.models.schemas.shopping.order import PlatformSchema
Expand All @@ -48,15 +39,14 @@ class UnifiedOrder(Order):
"""Order model supporting extensions."""


class UnifiedCheckout(
BuyerConsentCheckoutResp,
FulfillmentCheckout,
DiscountCheckoutResp,
Ap2Checkout,
):
class UnifiedCheckout(BaseCheckout):
"""Checkout model supporting various extensions."""

platform: PlatformSchema | None = None
fulfillment: Fulfillment | None = None
discounts: DiscountsObject | None = None
buyer_consent: Any | None = None
ap2: Any | None = None


class UnifiedCheckoutCreateRequest(CheckoutCreateRequest):
Expand Down
72 changes: 36 additions & 36 deletions rest/python/server/routes/discovery_profile.json
Original file line number Diff line number Diff line change
@@ -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"
}
]
Expand All @@ -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}}"
Expand All @@ -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,
Expand Down Expand Up @@ -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": {}
}
]
Expand Down
12 changes: 9 additions & 3 deletions rest/python/server/routes/ucp_implementation.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,15 @@
)
from ucp_sdk.models.schemas.shopping.order import Order
from ucp_sdk.models.schemas.shopping.order import PlatformSchema
from ucp_sdk.models.schemas.shopping.payment_create_request import (
PaymentCreateRequest,
)

try:
from ucp_sdk.models.schemas.shopping.payment_create_request import (
PaymentCreateRequest,
)
except ImportError:
from ucp_sdk.models.schemas.common.types.payment_create_request import (
PaymentCreateRequest,
)

logger = logging.getLogger(__name__)

Expand Down
Loading
Loading