Skip to content

Commit 39e6e89

Browse files
committed
fix(creative): address downstream release blockers
1 parent fbd70f5 commit 39e6e89

48 files changed

Lines changed: 10263 additions & 47 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
# Changelog
22

3-
## 7.0.0rc1 (2026-07-28)
4-
5-
- Make canonical creative declarations the primary Python client/server contract.
6-
- Add deterministic AdCP 3.0/3.1/3.2 creative-dialect adapters and explicit `Legacy*` escape hatches.
7-
- Vendor the TypeScript 13.0.0-rc.3 projection goldens and stable migrated option-ID algorithm.
8-
93
## [6.6.0](https://github.com/adcontextprotocol/adcp-client-python/compare/v6.5.0...v6.6.0) (2026-07-01)
104

115

MIGRATION_v6_to_v7.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Migrating from Python SDK 6 to 7
22

33
Python SDK 7 makes canonical creatives the default application contract. The
4-
package release (`7.0.0rc1`) is distinct from the negotiated AdCP protocol
5-
version (`3.0`, `3.1`, or `3.2`).
4+
package release (`7.0.0-rc`) is distinct from the negotiated AdCP protocol
5+
version (`3.0` or `3.1`). AdCP 3.2 is not advertised until the SDK ships its
6+
validator bundle.
67

78
Use `Format`, `Product.format_options`, `format_kind`, and
89
`format_option_refs` in normal application code. `Format` now means a
@@ -41,5 +42,5 @@ client = ADCPClient(
4142

4243
AdCP 3.0 is upgraded on reads and downgraded on writes. AdCP 3.1 requires the
4344
`media_buy.features.canonical_creatives` capability or unambiguous
44-
request-local evidence. AdCP 3.2 is canonical by contract; advertising
45-
`canonical_creatives: false` is an error.
45+
request-local evidence. AdCP 3.2 will be canonical by contract once supported;
46+
advertising `canonical_creatives: false` there will be an error.

examples/multi_platform_seller/src/app.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@
4545
MediaBuy,
4646
SupportedProtocol,
4747
)
48-
from adcp.decisioning.capabilities import (
49-
Features as MediaBuyFeatures,
50-
)
5148
from adcp.server import (
5249
InMemorySubdomainTenantRouter,
5350
SubdomainTenantMiddleware,
@@ -88,7 +85,6 @@ def build_router() -> PlatformRouter:
8885
account=CapabilitiesAccount(supported_billing=["operator"]),
8986
media_buy=MediaBuy(
9087
supported_pricing_models=["cpm"],
91-
features=MediaBuyFeatures(canonical_creatives=True),
9288
),
9389
supported_protocols=[SupportedProtocol.media_buy],
9490
)

examples/multi_platform_seller/src/mock_guaranteed.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@
3434
MediaBuy,
3535
SupportedProtocol,
3636
)
37-
from adcp.decisioning.capabilities import (
38-
Features as MediaBuyFeatures,
39-
)
4037

4138
# ---------------------------------------------------------------------------
4239
# In-memory inventory + buy state
@@ -144,7 +141,6 @@ class MockGuaranteedPlatform(DecisioningPlatform, SalesPlatform):
144141
account=CapabilitiesAccount(supported_billing=["operator"]),
145142
media_buy=MediaBuy(
146143
supported_pricing_models=["cpm"],
147-
features=MediaBuyFeatures(canonical_creatives=True),
148144
),
149145
supported_protocols=[SupportedProtocol.media_buy],
150146
)

examples/multi_platform_seller/src/mock_non_guaranteed.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@
3636
MediaBuy,
3737
SupportedProtocol,
3838
)
39-
from adcp.decisioning.capabilities import (
40-
Features as MediaBuyFeatures,
41-
)
4239

4340
# ---------------------------------------------------------------------------
4441
# In-memory model
@@ -131,7 +128,6 @@ class MockNonGuaranteedPlatform(DecisioningPlatform, SalesPlatform):
131128
account=CapabilitiesAccount(supported_billing=["operator"]),
132129
media_buy=MediaBuy(
133130
supported_pricing_models=["cpm"],
134-
features=MediaBuyFeatures(canonical_creatives=True),
135131
),
136132
supported_protocols=[SupportedProtocol.media_buy],
137133
)

examples/sales_proposal_mode_seller/src/app.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@
3838
MediaBuy,
3939
SupportedProtocol,
4040
)
41-
from adcp.decisioning.capabilities import (
42-
Features as MediaBuyFeatures,
43-
)
4441
from adcp.decisioning.context import AuthInfo
4542
from adcp.decisioning.types import Account
4643
from examples.sales_proposal_mode_seller.src.platform import (
@@ -132,7 +129,6 @@ def build_router() -> PlatformRouter:
132129
media_buy=MediaBuy(
133130
supported_pricing_models=["cpm"],
134131
supports_proposals=True,
135-
features=MediaBuyFeatures(canonical_creatives=True),
136132
),
137133
supported_protocols=[SupportedProtocol.media_buy],
138134
),

examples/sales_proposal_mode_seller/src/platform.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@
3434
MediaBuy,
3535
SupportedProtocol,
3636
)
37-
from adcp.decisioning.capabilities import (
38-
Features as MediaBuyFeatures,
39-
)
4037
from examples.sales_proposal_mode_seller.src.recipe import ProposalModeRecipe
4138

4239

@@ -74,7 +71,6 @@ class ProposalModeDecisioningPlatform(DecisioningPlatform, SalesPlatform):
7471
media_buy=MediaBuy(
7572
supported_pricing_models=["cpm"],
7673
supports_proposals=True,
77-
features=MediaBuyFeatures(canonical_creatives=True),
7874
),
7975
supported_protocols=[SupportedProtocol.media_buy],
8076
)

examples/seller_agent.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -767,10 +767,8 @@ async def get_adcp_capabilities(
767767
response["media_buy"] = {
768768
"supported_pricing_models": ["cpm"],
769769
"buying_modes": ["brief", "refine"],
770-
# The stable storyboard exercises the legacy 3.1 wire dialect.
771-
# Handler internals still use canonical models; the server projects
772-
# them only because this capability explicitly selects compatibility
773-
# delivery for callers that have not adopted canonical creatives.
770+
# This compatibility fixture deliberately serves legacy storyboard
771+
# runners; ordinary framework construction defaults this to true.
774772
"features": {"canonical_creatives": False},
775773
"creative_sync": True,
776774
"reporting": True,

examples/v3_reference_seller/src/platform.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -778,10 +778,7 @@ class V3ReferenceSeller(DecisioningPlatform, SalesPlatform):
778778
# the reference seller supports CPM only.
779779
media_buy=CapsMediaBuy(
780780
supported_pricing_models=["cpm"],
781-
# This translator keeps canonical models internally, but its
782-
# 3.1 compatibility storyboard deliberately negotiates the
783-
# legacy creative wire dialect used by @adcp/sdk 3.1.x. The
784-
# server boundary downgrades from the exact captured tuples.
781+
# The translator is the explicit legacy interoperability fixture.
785782
features=MediaBuyFeatures(canonical_creatives=False),
786783
),
787784
)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "adcp"
7-
version = "7.0.0rc1"
7+
version = "6.6.0"
88
description = "Official Python client for the Ad Context Protocol (AdCP)"
99
authors = [
1010
{name = "AdCP Community", email = "maintainers@adcontextprotocol.org"}

0 commit comments

Comments
 (0)