adcp 3.1.0__py3-none-any.whl → 3.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +5 -5
  3. adcp/__main__.py +4 -4
  4. adcp/adagents.py +5 -9
  5. adcp/client.py +14 -12
  6. adcp/protocols/a2a.py +3 -3
  7. adcp/protocols/base.py +2 -2
  8. adcp/protocols/mcp.py +3 -3
  9. adcp/server/base.py +6 -10
  10. adcp/server/content_standards.py +17 -49
  11. adcp/server/governance.py +20 -59
  12. adcp/server/mcp_tools.py +8 -4
  13. adcp/server/proposal.py +1 -3
  14. adcp/server/sponsored_intelligence.py +10 -28
  15. adcp/simple.py +10 -10
  16. adcp/types/__init__.py +10 -6
  17. adcp/types/_generated.py +44 -27
  18. adcp/types/base.py +7 -7
  19. adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
  20. adcp/types/generated_poc/a2ui/component.py +24 -0
  21. adcp/types/generated_poc/a2ui/surface.py +33 -0
  22. adcp/types/generated_poc/account/__init__.py +3 -0
  23. adcp/types/generated_poc/account/list_accounts_request.py +30 -0
  24. adcp/types/generated_poc/account/list_accounts_response.py +30 -0
  25. adcp/types/generated_poc/adagents.py +192 -195
  26. adcp/types/generated_poc/content_standards/artifact.py +69 -69
  27. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
  28. adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
  29. adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
  30. adcp/types/generated_poc/content_standards/content_standards.py +8 -8
  31. adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
  32. adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
  33. adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
  34. adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
  35. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
  36. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
  37. adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
  38. adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
  39. adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
  40. adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
  41. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
  42. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
  43. adcp/types/generated_poc/core/account.py +54 -0
  44. adcp/types/generated_poc/core/activation_key.py +8 -8
  45. adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
  46. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  47. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  48. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  49. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  50. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  51. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  52. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  53. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  54. adcp/types/generated_poc/core/assets/video_asset.py +126 -10
  55. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  56. adcp/types/generated_poc/core/async_response_data.py +2 -2
  57. adcp/types/generated_poc/core/brand_manifest.py +66 -66
  58. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  59. adcp/types/generated_poc/core/context.py +1 -1
  60. adcp/types/generated_poc/core/creative_asset.py +12 -12
  61. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  62. adcp/types/generated_poc/core/creative_filters.py +23 -17
  63. adcp/types/generated_poc/core/creative_manifest.py +4 -4
  64. adcp/types/generated_poc/core/creative_policy.py +4 -4
  65. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  66. adcp/types/generated_poc/core/deployment.py +20 -20
  67. adcp/types/generated_poc/core/destination.py +11 -11
  68. adcp/types/generated_poc/core/error.py +6 -6
  69. adcp/types/generated_poc/core/ext.py +1 -1
  70. adcp/types/generated_poc/core/format.py +49 -124
  71. adcp/types/generated_poc/core/format_id.py +5 -5
  72. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  73. adcp/types/generated_poc/core/identifier.py +2 -2
  74. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  75. adcp/types/generated_poc/core/measurement.py +8 -8
  76. adcp/types/generated_poc/core/media_buy.py +12 -8
  77. adcp/types/generated_poc/core/media_buy_features.py +3 -3
  78. adcp/types/generated_poc/core/offering.py +9 -9
  79. adcp/types/generated_poc/core/package.py +8 -8
  80. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  81. adcp/types/generated_poc/core/placement.py +4 -4
  82. adcp/types/generated_poc/core/pricing_option.py +1 -1
  83. adcp/types/generated_poc/core/product.py +27 -21
  84. adcp/types/generated_poc/core/product_allocation.py +5 -5
  85. adcp/types/generated_poc/core/product_filters.py +27 -27
  86. adcp/types/generated_poc/core/promoted_offerings.py +18 -18
  87. adcp/types/generated_poc/core/promoted_products.py +2 -2
  88. adcp/types/generated_poc/core/property.py +10 -10
  89. adcp/types/generated_poc/core/property_id.py +4 -4
  90. adcp/types/generated_poc/core/property_list_ref.py +4 -4
  91. adcp/types/generated_poc/core/property_tag.py +4 -4
  92. adcp/types/generated_poc/core/proposal.py +13 -13
  93. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  94. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  95. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  96. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  97. adcp/types/generated_poc/core/reporting_webhook.py +10 -10
  98. adcp/types/generated_poc/core/response.py +4 -4
  99. adcp/types/generated_poc/core/signal_filters.py +5 -5
  100. adcp/types/generated_poc/core/start_timing.py +3 -3
  101. adcp/types/generated_poc/core/sub_asset.py +14 -14
  102. adcp/types/generated_poc/core/targeting.py +17 -10
  103. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  104. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  105. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  106. adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
  107. adcp/types/generated_poc/creative/preview_render.py +25 -25
  108. adcp/types/generated_poc/enums/adcp_domain.py +4 -4
  109. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  110. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  111. adcp/types/generated_poc/enums/available_metric.py +9 -9
  112. adcp/types/generated_poc/enums/channels.py +19 -19
  113. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  114. adcp/types/generated_poc/enums/creative_action.py +5 -5
  115. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  116. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  117. adcp/types/generated_poc/enums/creative_status.py +5 -5
  118. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  119. adcp/types/generated_poc/enums/daast_version.py +2 -2
  120. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  121. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  122. adcp/types/generated_poc/enums/feed_format.py +3 -3
  123. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  124. adcp/types/generated_poc/enums/format_category.py +7 -7
  125. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  126. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  127. adcp/types/generated_poc/enums/geo_level.py +4 -4
  128. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  129. adcp/types/generated_poc/enums/http_method.py +2 -2
  130. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  131. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  132. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  133. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  134. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  135. adcp/types/generated_poc/enums/metric_type.py +8 -8
  136. adcp/types/generated_poc/enums/metro_system.py +5 -5
  137. adcp/types/generated_poc/enums/notification_type.py +4 -4
  138. adcp/types/generated_poc/enums/pacing.py +3 -3
  139. adcp/types/generated_poc/enums/postal_system.py +9 -9
  140. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  141. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  142. adcp/types/generated_poc/enums/property_type.py +8 -8
  143. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  144. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  145. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  146. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  147. adcp/types/generated_poc/enums/task_status.py +9 -9
  148. adcp/types/generated_poc/enums/task_type.py +11 -12
  149. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  150. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  151. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  152. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  153. adcp/types/generated_poc/enums/vast_version.py +5 -5
  154. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  155. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  156. adcp/types/generated_poc/extensions/extension_meta.py +14 -14
  157. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  158. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  159. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  160. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  161. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  162. adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
  163. adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
  164. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  165. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  166. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  167. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  168. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  169. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  170. adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
  171. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  172. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  173. adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
  174. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
  175. adcp/types/generated_poc/media_buy/package_request.py +8 -8
  176. adcp/types/generated_poc/media_buy/package_update.py +16 -16
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  178. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  182. adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
  183. adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  187. adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
  188. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  189. adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
  190. adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
  191. adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
  192. adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
  193. adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
  194. adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
  195. adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
  196. adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
  197. adcp/types/generated_poc/property/base_property_source.py +15 -15
  198. adcp/types/generated_poc/property/create_property_list_request.py +4 -4
  199. adcp/types/generated_poc/property/create_property_list_response.py +3 -3
  200. adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
  201. adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
  202. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  203. adcp/types/generated_poc/property/get_property_list_request.py +5 -5
  204. adcp/types/generated_poc/property/get_property_list_response.py +11 -11
  205. adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
  206. adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
  207. adcp/types/generated_poc/property/property_error.py +10 -10
  208. adcp/types/generated_poc/property/property_feature.py +4 -4
  209. adcp/types/generated_poc/property/property_feature_definition.py +18 -18
  210. adcp/types/generated_poc/property/property_list.py +11 -11
  211. adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
  212. adcp/types/generated_poc/property/property_list_filters.py +7 -7
  213. adcp/types/generated_poc/property/update_property_list_request.py +8 -8
  214. adcp/types/generated_poc/property/update_property_list_response.py +2 -2
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
  217. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  218. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  219. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  220. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
  232. adcp/utils/format_assets.py +32 -32
  233. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
  234. adcp-3.2.0.dist-info/RECORD +268 -0
  235. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
  236. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
  237. adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
  238. adcp-3.1.0.dist-info/RECORD +0 -264
  239. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
  240. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
  241. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
  242. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class PromotedProducts(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  manifest_category: Annotated[
18
18
  str | None,
@@ -28,7 +28,7 @@ class PromotedProducts(AdCPBaseModel):
28
28
  ] = None
29
29
  manifest_skus: Annotated[
30
30
  list[str] | None,
31
- Field(description='Direct product SKU references from the brand manifest product catalog'),
31
+ Field(description="Direct product SKU references from the brand manifest product catalog"),
32
32
  ] = None
33
33
  manifest_tags: Annotated[
34
34
  list[str] | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: core/property.json
3
- # timestamp: 2026-01-25T21:17:54+00:00
3
+ # timestamp: 2026-02-02T17:45:21+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -17,11 +17,11 @@ from . import property_tag
17
17
 
18
18
  class Identifier(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='allow',
20
+ extra="allow",
21
21
  )
22
22
  type: Annotated[
23
23
  identifier_types.PropertyIdentifierTypes,
24
- Field(description='Type of identifier for this property'),
24
+ Field(description="Type of identifier for this property"),
25
25
  ]
26
26
  value: Annotated[
27
27
  str,
@@ -33,30 +33,30 @@ class Identifier(AdCPBaseModel):
33
33
 
34
34
  class Property(AdCPBaseModel):
35
35
  model_config = ConfigDict(
36
- extra='allow',
36
+ extra="allow",
37
37
  )
38
38
  identifiers: Annotated[
39
- list[Identifier], Field(description='Array of identifiers for this property', min_length=1)
39
+ list[Identifier], Field(description="Array of identifiers for this property", min_length=1)
40
40
  ]
41
- name: Annotated[str, Field(description='Human-readable property name')]
41
+ name: Annotated[str, Field(description="Human-readable property name")]
42
42
  property_id: Annotated[
43
43
  property_id_1.PropertyId | None,
44
44
  Field(
45
- description='Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects.'
45
+ description="Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects."
46
46
  ),
47
47
  ] = None
48
48
  property_type: Annotated[
49
- property_type_1.PropertyType, Field(description='Type of advertising property')
49
+ property_type_1.PropertyType, Field(description="Type of advertising property")
50
50
  ]
51
51
  publisher_domain: Annotated[
52
52
  str | None,
53
53
  Field(
54
- description='Domain where adagents.json should be checked for authorization validation. Required for list_authorized_properties response. Optional in adagents.json (file location implies domain).'
54
+ description="Domain where adagents.json should be checked for authorization validation. Optional in adagents.json (file location implies domain)."
55
55
  ),
56
56
  ] = None
57
57
  tags: Annotated[
58
58
  list[property_tag.PropertyTag] | None,
59
59
  Field(
60
- description='Tags for categorization and grouping (e.g., network membership, content categories)'
60
+ description="Tags for categorization and grouping (e.g., network membership, content categories)"
61
61
  ),
62
62
  ] = None
@@ -13,9 +13,9 @@ class PropertyId(RootModel[str]):
13
13
  root: Annotated[
14
14
  str,
15
15
  Field(
16
- description='Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.',
17
- examples=['cnn_ctv_app', 'homepage', 'mobile_ios', 'instagram'],
18
- pattern='^[a-z0-9_]+$',
19
- title='Property ID',
16
+ description="Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.",
17
+ examples=["cnn_ctv_app", "homepage", "mobile_ios", "instagram"],
18
+ pattern="^[a-z0-9_]+$",
19
+ title="Property ID",
20
20
  ),
21
21
  ]
@@ -12,15 +12,15 @@ from pydantic import AnyUrl, ConfigDict, Field
12
12
 
13
13
  class PropertyListReference(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='forbid',
15
+ extra="forbid",
16
16
  )
17
- agent_url: Annotated[AnyUrl, Field(description='URL of the agent managing the property list')]
17
+ agent_url: Annotated[AnyUrl, Field(description="URL of the agent managing the property list")]
18
18
  auth_token: Annotated[
19
19
  str | None,
20
20
  Field(
21
- description='JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.'
21
+ description="JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access."
22
22
  ),
23
23
  ] = None
24
24
  list_id: Annotated[
25
- str, Field(description='Identifier for the property list within the agent', min_length=1)
25
+ str, Field(description="Identifier for the property list within the agent", min_length=1)
26
26
  ]
@@ -13,9 +13,9 @@ class PropertyTag(RootModel[str]):
13
13
  root: Annotated[
14
14
  str,
15
15
  Field(
16
- description='Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.',
17
- examples=['ctv', 'premium', 'news', 'sports', 'meta_network', 'social_media'],
18
- pattern='^[a-z0-9_]+$',
19
- title='Property Tag',
16
+ description="Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.",
17
+ examples=["ctv", "premium", "news", "sports", "meta_network", "social_media"],
18
+ pattern="^[a-z0-9_]+$",
19
+ title="Property Tag",
20
20
  ),
21
21
  ]
@@ -15,50 +15,50 @@ from . import product_allocation
15
15
 
16
16
  class TotalBudgetGuidance(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='allow',
18
+ extra="allow",
19
19
  )
20
- currency: Annotated[str | None, Field(description='ISO 4217 currency code')] = None
20
+ currency: Annotated[str | None, Field(description="ISO 4217 currency code")] = None
21
21
  max: Annotated[
22
- float | None, Field(description='Maximum budget before diminishing returns', ge=0.0)
22
+ float | None, Field(description="Maximum budget before diminishing returns", ge=0.0)
23
23
  ] = None
24
- min: Annotated[float | None, Field(description='Minimum recommended budget', ge=0.0)] = None
24
+ min: Annotated[float | None, Field(description="Minimum recommended budget", ge=0.0)] = None
25
25
  recommended: Annotated[
26
- float | None, Field(description='Recommended budget for optimal performance', ge=0.0)
26
+ float | None, Field(description="Recommended budget for optimal performance", ge=0.0)
27
27
  ] = None
28
28
 
29
29
 
30
30
  class Proposal(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='allow',
32
+ extra="allow",
33
33
  )
34
34
  allocations: Annotated[
35
35
  list[product_allocation.ProductAllocation],
36
36
  Field(
37
- description='Budget allocations across products. Allocation percentages MUST sum to 100. Publishers are responsible for ensuring the sum equals 100; buyers SHOULD validate this before execution.',
37
+ description="Budget allocations across products. Allocation percentages MUST sum to 100. Publishers are responsible for ensuring the sum equals 100; buyers SHOULD validate this before execution.",
38
38
  min_length=1,
39
39
  ),
40
40
  ]
41
41
  brief_alignment: Annotated[
42
42
  str | None,
43
- Field(description='Explanation of how this proposal aligns with the campaign brief'),
43
+ Field(description="Explanation of how this proposal aligns with the campaign brief"),
44
44
  ] = None
45
45
  description: Annotated[
46
- str | None, Field(description='Explanation of the proposal strategy and what it achieves')
46
+ str | None, Field(description="Explanation of the proposal strategy and what it achieves")
47
47
  ] = None
48
48
  expires_at: Annotated[
49
49
  AwareDatetime | None,
50
50
  Field(
51
- description='When this proposal expires and can no longer be executed. After expiration, referenced products or pricing may no longer be available.'
51
+ description="When this proposal expires and can no longer be executed. After expiration, referenced products or pricing may no longer be available."
52
52
  ),
53
53
  ] = None
54
54
  ext: ext_1.ExtensionObject | None = None
55
- name: Annotated[str, Field(description='Human-readable name for this media plan proposal')]
55
+ name: Annotated[str, Field(description="Human-readable name for this media plan proposal")]
56
56
  proposal_id: Annotated[
57
57
  str,
58
58
  Field(
59
- description='Unique identifier for this proposal. Used to refine the proposal in subsequent get_products calls or to execute it via create_media_buy.'
59
+ description="Unique identifier for this proposal. Used to refine the proposal in subsequent get_products calls or to execute it via create_media_buy."
60
60
  ),
61
61
  ]
62
62
  total_budget_guidance: Annotated[
63
- TotalBudgetGuidance | None, Field(description='Optional budget guidance for this proposal')
63
+ TotalBudgetGuidance | None, Field(description="Optional budget guidance for this proposal")
64
64
  ] = None
@@ -15,47 +15,47 @@ from . import push_notification_config as push_notification_config_1
15
15
 
16
16
  class ProtocolEnvelope(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='allow',
18
+ extra="allow",
19
19
  )
20
20
  context_id: Annotated[
21
21
  str | None,
22
22
  Field(
23
- description='Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context.'
23
+ description="Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context."
24
24
  ),
25
25
  ] = None
26
26
  message: Annotated[
27
27
  str | None,
28
28
  Field(
29
- description='Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response.'
29
+ description="Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response."
30
30
  ),
31
31
  ] = None
32
32
  payload: Annotated[
33
33
  dict[str, Any],
34
34
  Field(
35
- description='The actual task-specific response data. This is the content defined in individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). Contains only domain-specific data without protocol-level fields.'
35
+ description="The actual task-specific response data. This is the content defined in individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). Contains only domain-specific data without protocol-level fields."
36
36
  ),
37
37
  ]
38
38
  push_notification_config: Annotated[
39
39
  push_notification_config_1.PushNotificationConfig | None,
40
40
  Field(
41
- description='Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks.'
41
+ description="Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks."
42
42
  ),
43
43
  ] = None
44
44
  status: Annotated[
45
45
  task_status.TaskStatus,
46
46
  Field(
47
- description='Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. Managed by the protocol layer.'
47
+ description="Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. Managed by the protocol layer."
48
48
  ),
49
49
  ]
50
50
  task_id: Annotated[
51
51
  str | None,
52
52
  Field(
53
- description='Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.'
53
+ description="Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete."
54
54
  ),
55
55
  ] = None
56
56
  timestamp: Annotated[
57
57
  AwareDatetime | None,
58
58
  Field(
59
- description='ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.'
59
+ description="ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress."
60
60
  ),
61
61
  ] = None
@@ -14,26 +14,26 @@ from . import property_id, property_tag
14
14
 
15
15
  class PublisherPropertySelector1(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  publisher_domain: Annotated[
20
20
  str,
21
21
  Field(
22
22
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
23
- pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
23
+ pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
24
24
  ),
25
25
  ]
26
26
  selection_type: Annotated[
27
- Literal['all'],
27
+ Literal["all"],
28
28
  Field(
29
- description='Discriminator indicating all properties from this publisher are included'
29
+ description="Discriminator indicating all properties from this publisher are included"
30
30
  ),
31
31
  ]
32
32
 
33
33
 
34
34
  class PublisherPropertySelector2(AdCPBaseModel):
35
35
  model_config = ConfigDict(
36
- extra='allow',
36
+ extra="allow",
37
37
  )
38
38
  property_ids: Annotated[
39
39
  list[property_id.PropertyId],
@@ -43,18 +43,18 @@ class PublisherPropertySelector2(AdCPBaseModel):
43
43
  str,
44
44
  Field(
45
45
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
46
- pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
46
+ pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
47
47
  ),
48
48
  ]
49
49
  selection_type: Annotated[
50
- Literal['by_id'],
51
- Field(description='Discriminator indicating selection by specific property IDs'),
50
+ Literal["by_id"],
51
+ Field(description="Discriminator indicating selection by specific property IDs"),
52
52
  ]
53
53
 
54
54
 
55
55
  class PublisherPropertySelector3(AdCPBaseModel):
56
56
  model_config = ConfigDict(
57
- extra='allow',
57
+ extra="allow",
58
58
  )
59
59
  property_tags: Annotated[
60
60
  list[property_tag.PropertyTag],
@@ -67,11 +67,11 @@ class PublisherPropertySelector3(AdCPBaseModel):
67
67
  str,
68
68
  Field(
69
69
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
70
- pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
70
+ pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
71
71
  ),
72
72
  ]
73
73
  selection_type: Annotated[
74
- Literal['by_tag'], Field(description='Discriminator indicating selection by property tags')
74
+ Literal["by_tag"], Field(description="Discriminator indicating selection by property tags")
75
75
  ]
76
76
 
77
77
 
@@ -82,7 +82,7 @@ class PublisherPropertySelector(
82
82
  PublisherPropertySelector1 | PublisherPropertySelector2 | PublisherPropertySelector3,
83
83
  Field(
84
84
  description="Selects properties from a publisher's adagents.json. Used for both product definitions and agent authorization. Supports three selection patterns: all properties, specific IDs, or by tags.",
85
- discriminator='selection_type',
86
- title='Publisher Property Selector',
85
+ discriminator="selection_type",
86
+ title="Publisher Property Selector",
87
87
  ),
88
88
  ]
@@ -14,12 +14,12 @@ from ..enums import auth_scheme
14
14
 
15
15
  class Authentication(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='forbid',
17
+ extra="forbid",
18
18
  )
19
19
  credentials: Annotated[
20
20
  str,
21
21
  Field(
22
- description='Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.',
22
+ description="Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.",
23
23
  min_length=32,
24
24
  ),
25
25
  ]
@@ -36,13 +36,13 @@ class Authentication(AdCPBaseModel):
36
36
  class PushNotificationConfig(AdCPBaseModel):
37
37
  authentication: Annotated[
38
38
  Authentication,
39
- Field(description='Authentication configuration for webhook delivery (A2A-compatible)'),
39
+ Field(description="Authentication configuration for webhook delivery (A2A-compatible)"),
40
40
  ]
41
41
  token: Annotated[
42
42
  str | None,
43
43
  Field(
44
- description='Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.',
44
+ description="Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.",
45
45
  min_length=16,
46
46
  ),
47
47
  ] = None
48
- url: Annotated[AnyUrl, Field(description='Webhook endpoint URL for task status notifications')]
48
+ url: Annotated[AnyUrl, Field(description="Webhook endpoint URL for task status notifications")]
@@ -14,38 +14,38 @@ from ..enums import available_metric, reporting_frequency
14
14
 
15
15
  class ReportingCapabilities(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  available_metrics: Annotated[
20
20
  list[available_metric.AvailableMetric],
21
21
  Field(
22
- description='Metrics available in reporting. Impressions and spend are always implicitly included.',
22
+ description="Metrics available in reporting. Impressions and spend are always implicitly included.",
23
23
  examples=[
24
- ['impressions', 'spend', 'clicks', 'video_completions'],
25
- ['impressions', 'spend', 'conversions'],
24
+ ["impressions", "spend", "clicks", "video_completions"],
25
+ ["impressions", "spend", "conversions"],
26
26
  ],
27
27
  ),
28
28
  ]
29
29
  available_reporting_frequencies: Annotated[
30
30
  list[reporting_frequency.ReportingFrequency],
31
- Field(description='Supported reporting frequency options', min_length=1),
31
+ Field(description="Supported reporting frequency options", min_length=1),
32
32
  ]
33
33
  expected_delay_minutes: Annotated[
34
34
  int,
35
35
  Field(
36
- description='Expected delay in minutes before reporting data becomes available (e.g., 240 for 4-hour delay)',
36
+ description="Expected delay in minutes before reporting data becomes available (e.g., 240 for 4-hour delay)",
37
37
  examples=[240, 300, 1440],
38
38
  ge=0,
39
39
  ),
40
40
  ]
41
41
  supports_webhooks: Annotated[
42
42
  bool,
43
- Field(description='Whether this product supports webhook-based reporting notifications'),
43
+ Field(description="Whether this product supports webhook-based reporting notifications"),
44
44
  ]
45
45
  timezone: Annotated[
46
46
  str,
47
47
  Field(
48
48
  description="Timezone for reporting periods. Use 'UTC' or IANA timezone (e.g., 'America/New_York'). Critical for daily/monthly frequency alignment.",
49
- examples=['UTC', 'America/New_York', 'Europe/London', 'America/Los_Angeles'],
49
+ examples=["UTC", "America/New_York", "Europe/London", "America/Los_Angeles"],
50
50
  ),
51
51
  ]
@@ -15,12 +15,12 @@ from ..enums import auth_scheme, available_metric
15
15
 
16
16
  class Authentication(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='forbid',
18
+ extra="forbid",
19
19
  )
20
20
  credentials: Annotated[
21
21
  str,
22
22
  Field(
23
- description='Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.',
23
+ description="Credentials for authentication. For Bearer: token sent in Authorization header. For HMAC-SHA256: shared secret used to generate signature. Minimum 32 characters. Exchanged out-of-band during onboarding.",
24
24
  min_length=32,
25
25
  ),
26
26
  ]
@@ -35,23 +35,23 @@ class Authentication(AdCPBaseModel):
35
35
 
36
36
 
37
37
  class ReportingFrequency(Enum):
38
- hourly = 'hourly'
39
- daily = 'daily'
40
- monthly = 'monthly'
38
+ hourly = "hourly"
39
+ daily = "daily"
40
+ monthly = "monthly"
41
41
 
42
42
 
43
43
  class ReportingWebhook(AdCPBaseModel):
44
44
  model_config = ConfigDict(
45
- extra='allow',
45
+ extra="allow",
46
46
  )
47
47
  authentication: Annotated[
48
48
  Authentication,
49
- Field(description='Authentication configuration for webhook delivery (A2A-compatible)'),
49
+ Field(description="Authentication configuration for webhook delivery (A2A-compatible)"),
50
50
  ]
51
51
  reporting_frequency: Annotated[
52
52
  ReportingFrequency,
53
53
  Field(
54
- description='Frequency for automated reporting delivery. Must be supported by all products in the media buy.'
54
+ description="Frequency for automated reporting delivery. Must be supported by all products in the media buy."
55
55
  ),
56
56
  ]
57
57
  requested_metrics: Annotated[
@@ -63,8 +63,8 @@ class ReportingWebhook(AdCPBaseModel):
63
63
  token: Annotated[
64
64
  str | None,
65
65
  Field(
66
- description='Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.',
66
+ description="Optional client-provided token for webhook validation. Echoed back in webhook payload to validate request authenticity.",
67
67
  min_length=16,
68
68
  ),
69
69
  ] = None
70
- url: Annotated[AnyUrl, Field(description='Webhook endpoint URL for reporting notifications')]
70
+ url: Annotated[AnyUrl, Field(description="Webhook endpoint URL for reporting notifications")]
@@ -12,13 +12,13 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class ProtocolResponse(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
- context_id: Annotated[str | None, Field(description='Session continuity identifier')] = None
17
+ context_id: Annotated[str | None, Field(description="Session continuity identifier")] = None
18
18
  data: Annotated[
19
19
  Any | None,
20
20
  Field(
21
- description='AdCP task-specific response data (see individual task response schemas)'
21
+ description="AdCP task-specific response data (see individual task response schemas)"
22
22
  ),
23
23
  ] = None
24
- message: Annotated[str, Field(description='Human-readable summary')]
24
+ message: Annotated[str, Field(description="Human-readable summary")]
@@ -14,16 +14,16 @@ from ..enums import signal_catalog_type
14
14
 
15
15
  class SignalFilters(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  catalog_types: Annotated[
20
20
  list[signal_catalog_type.SignalCatalogType] | None,
21
- Field(description='Filter by catalog type'),
21
+ Field(description="Filter by catalog type"),
22
22
  ] = None
23
23
  data_providers: Annotated[
24
- list[str] | None, Field(description='Filter by specific data providers')
24
+ list[str] | None, Field(description="Filter by specific data providers")
25
25
  ] = None
26
- max_cpm: Annotated[float | None, Field(description='Maximum CPM price filter', ge=0.0)] = None
26
+ max_cpm: Annotated[float | None, Field(description="Maximum CPM price filter", ge=0.0)] = None
27
27
  min_coverage_percentage: Annotated[
28
- float | None, Field(description='Minimum coverage requirement', ge=0.0, le=100.0)
28
+ float | None, Field(description="Minimum coverage requirement", ge=0.0, le=100.0)
29
29
  ] = None
@@ -9,10 +9,10 @@ from typing import Annotated, Literal
9
9
  from pydantic import AwareDatetime, Field, RootModel
10
10
 
11
11
 
12
- class StartTiming(RootModel[Literal['asap'] | AwareDatetime]):
12
+ class StartTiming(RootModel[Literal["asap"] | AwareDatetime]):
13
13
  root: Annotated[
14
- Literal['asap'] | AwareDatetime,
14
+ Literal["asap"] | AwareDatetime,
15
15
  Field(
16
- description="Campaign start timing: 'asap' or ISO 8601 date-time", title='Start Timing'
16
+ description="Campaign start timing: 'asap' or ISO 8601 date-time", title="Start Timing"
17
17
  ),
18
18
  ]
@@ -12,45 +12,45 @@ from pydantic import AnyUrl, ConfigDict, Field, RootModel
12
12
 
13
13
  class SubAsset1(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra='allow',
15
+ extra="allow",
16
16
  )
17
17
  asset_id: Annotated[
18
- str, Field(description='Unique identifier for the asset within the creative')
18
+ str, Field(description="Unique identifier for the asset within the creative")
19
19
  ]
20
20
  asset_kind: Annotated[
21
- Literal['media'],
22
- Field(description='Discriminator indicating this is a media asset with content_uri'),
21
+ Literal["media"],
22
+ Field(description="Discriminator indicating this is a media asset with content_uri"),
23
23
  ]
24
24
  asset_type: Annotated[
25
25
  str,
26
26
  Field(
27
- description='Type of asset. Common types: thumbnail_image, product_image, featured_image, logo'
27
+ description="Type of asset. Common types: thumbnail_image, product_image, featured_image, logo"
28
28
  ),
29
29
  ]
30
- content_uri: Annotated[AnyUrl, Field(description='URL for media assets (images, videos, etc.)')]
30
+ content_uri: Annotated[AnyUrl, Field(description="URL for media assets (images, videos, etc.)")]
31
31
 
32
32
 
33
33
  class SubAsset2(AdCPBaseModel):
34
34
  model_config = ConfigDict(
35
- extra='allow',
35
+ extra="allow",
36
36
  )
37
37
  asset_id: Annotated[
38
- str, Field(description='Unique identifier for the asset within the creative')
38
+ str, Field(description="Unique identifier for the asset within the creative")
39
39
  ]
40
40
  asset_kind: Annotated[
41
- Literal['text'],
42
- Field(description='Discriminator indicating this is a text asset with content'),
41
+ Literal["text"],
42
+ Field(description="Discriminator indicating this is a text asset with content"),
43
43
  ]
44
44
  asset_type: Annotated[
45
45
  str,
46
46
  Field(
47
- description='Type of asset. Common types: headline, body_text, cta_text, price_text, sponsor_name, author_name, click_url'
47
+ description="Type of asset. Common types: headline, body_text, cta_text, price_text, sponsor_name, author_name, click_url"
48
48
  ),
49
49
  ]
50
50
  content: Annotated[
51
51
  str | list[str],
52
52
  Field(
53
- description='Text content for text-based assets like headlines, body text, CTA text, etc.'
53
+ description="Text content for text-based assets like headlines, body text, CTA text, etc."
54
54
  ),
55
55
  ]
56
56
 
@@ -59,7 +59,7 @@ class SubAsset(RootModel[SubAsset1 | SubAsset2]):
59
59
  root: Annotated[
60
60
  SubAsset1 | SubAsset2,
61
61
  Field(
62
- description='Sub-asset for multi-asset creative formats, including carousel images and native ad template variables',
63
- title='Sub-Asset',
62
+ description="Sub-asset for multi-asset creative formats, including carousel images and native ad template variables",
63
+ title="Sub-Asset",
64
64
  ),
65
65
  ]