adcp 3.0.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 (243) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +13 -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 +14 -6
  17. adcp/types/_generated.py +44 -27
  18. adcp/types/aliases.py +55 -0
  19. adcp/types/base.py +7 -7
  20. adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
  21. adcp/types/generated_poc/a2ui/component.py +24 -0
  22. adcp/types/generated_poc/a2ui/surface.py +33 -0
  23. adcp/types/generated_poc/account/__init__.py +3 -0
  24. adcp/types/generated_poc/account/list_accounts_request.py +30 -0
  25. adcp/types/generated_poc/account/list_accounts_response.py +30 -0
  26. adcp/types/generated_poc/adagents.py +192 -195
  27. adcp/types/generated_poc/content_standards/artifact.py +69 -69
  28. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
  29. adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
  30. adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
  31. adcp/types/generated_poc/content_standards/content_standards.py +8 -8
  32. adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
  33. adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
  34. adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
  35. adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
  36. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
  37. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
  38. adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
  39. adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
  40. adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
  41. adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
  42. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
  43. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
  44. adcp/types/generated_poc/core/account.py +54 -0
  45. adcp/types/generated_poc/core/activation_key.py +8 -8
  46. adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
  47. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  48. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  49. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  50. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  51. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  52. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  53. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  54. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  55. adcp/types/generated_poc/core/assets/video_asset.py +126 -10
  56. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  57. adcp/types/generated_poc/core/async_response_data.py +2 -2
  58. adcp/types/generated_poc/core/brand_manifest.py +66 -66
  59. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  60. adcp/types/generated_poc/core/context.py +1 -1
  61. adcp/types/generated_poc/core/creative_asset.py +12 -12
  62. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  63. adcp/types/generated_poc/core/creative_filters.py +23 -17
  64. adcp/types/generated_poc/core/creative_manifest.py +4 -4
  65. adcp/types/generated_poc/core/creative_policy.py +4 -4
  66. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  67. adcp/types/generated_poc/core/deployment.py +20 -20
  68. adcp/types/generated_poc/core/destination.py +11 -11
  69. adcp/types/generated_poc/core/error.py +6 -6
  70. adcp/types/generated_poc/core/ext.py +1 -1
  71. adcp/types/generated_poc/core/format.py +49 -124
  72. adcp/types/generated_poc/core/format_id.py +5 -5
  73. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  74. adcp/types/generated_poc/core/identifier.py +2 -2
  75. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  76. adcp/types/generated_poc/core/measurement.py +8 -8
  77. adcp/types/generated_poc/core/media_buy.py +12 -8
  78. adcp/types/generated_poc/core/media_buy_features.py +3 -3
  79. adcp/types/generated_poc/core/offering.py +9 -9
  80. adcp/types/generated_poc/core/package.py +8 -8
  81. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  82. adcp/types/generated_poc/core/placement.py +4 -4
  83. adcp/types/generated_poc/core/pricing_option.py +1 -1
  84. adcp/types/generated_poc/core/product.py +27 -21
  85. adcp/types/generated_poc/core/product_allocation.py +5 -5
  86. adcp/types/generated_poc/core/product_filters.py +27 -27
  87. adcp/types/generated_poc/core/promoted_offerings.py +18 -18
  88. adcp/types/generated_poc/core/promoted_products.py +2 -2
  89. adcp/types/generated_poc/core/property.py +10 -10
  90. adcp/types/generated_poc/core/property_id.py +4 -4
  91. adcp/types/generated_poc/core/property_list_ref.py +4 -4
  92. adcp/types/generated_poc/core/property_tag.py +4 -4
  93. adcp/types/generated_poc/core/proposal.py +13 -13
  94. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  95. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  96. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  97. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  98. adcp/types/generated_poc/core/reporting_webhook.py +10 -10
  99. adcp/types/generated_poc/core/response.py +4 -4
  100. adcp/types/generated_poc/core/signal_filters.py +5 -5
  101. adcp/types/generated_poc/core/start_timing.py +3 -3
  102. adcp/types/generated_poc/core/sub_asset.py +14 -14
  103. adcp/types/generated_poc/core/targeting.py +17 -10
  104. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  105. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  106. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  107. adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
  108. adcp/types/generated_poc/creative/preview_render.py +25 -25
  109. adcp/types/generated_poc/enums/adcp_domain.py +4 -4
  110. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  111. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  112. adcp/types/generated_poc/enums/available_metric.py +9 -9
  113. adcp/types/generated_poc/enums/channels.py +19 -19
  114. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  115. adcp/types/generated_poc/enums/creative_action.py +5 -5
  116. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  117. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  118. adcp/types/generated_poc/enums/creative_status.py +5 -5
  119. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  120. adcp/types/generated_poc/enums/daast_version.py +2 -2
  121. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  122. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  123. adcp/types/generated_poc/enums/feed_format.py +3 -3
  124. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  125. adcp/types/generated_poc/enums/format_category.py +7 -7
  126. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  127. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  128. adcp/types/generated_poc/enums/geo_level.py +4 -4
  129. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  130. adcp/types/generated_poc/enums/http_method.py +2 -2
  131. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  132. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  133. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  134. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  135. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  136. adcp/types/generated_poc/enums/metric_type.py +8 -8
  137. adcp/types/generated_poc/enums/metro_system.py +5 -5
  138. adcp/types/generated_poc/enums/notification_type.py +4 -4
  139. adcp/types/generated_poc/enums/pacing.py +3 -3
  140. adcp/types/generated_poc/enums/postal_system.py +9 -9
  141. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  142. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  143. adcp/types/generated_poc/enums/property_type.py +8 -8
  144. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  145. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  146. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  147. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  148. adcp/types/generated_poc/enums/task_status.py +9 -9
  149. adcp/types/generated_poc/enums/task_type.py +11 -12
  150. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  151. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  152. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  153. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  154. adcp/types/generated_poc/enums/vast_version.py +5 -5
  155. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  156. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  157. adcp/types/generated_poc/extensions/extension_meta.py +14 -14
  158. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  159. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  160. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  161. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  162. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  163. adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
  164. adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
  165. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  166. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  167. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  168. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  169. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  170. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  171. adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
  172. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  173. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  174. adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
  175. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
  176. adcp/types/generated_poc/media_buy/package_request.py +8 -8
  177. adcp/types/generated_poc/media_buy/package_update.py +16 -16
  178. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  179. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  181. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  183. adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
  184. adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  186. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  187. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  188. adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
  189. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  190. adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
  191. adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
  192. adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
  193. adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
  194. adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
  195. adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
  196. adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
  197. adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
  198. adcp/types/generated_poc/property/base_property_source.py +15 -15
  199. adcp/types/generated_poc/property/create_property_list_request.py +4 -4
  200. adcp/types/generated_poc/property/create_property_list_response.py +3 -3
  201. adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
  202. adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
  203. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  204. adcp/types/generated_poc/property/get_property_list_request.py +5 -5
  205. adcp/types/generated_poc/property/get_property_list_response.py +11 -11
  206. adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
  207. adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
  208. adcp/types/generated_poc/property/property_error.py +10 -10
  209. adcp/types/generated_poc/property/property_feature.py +4 -4
  210. adcp/types/generated_poc/property/property_feature_definition.py +18 -18
  211. adcp/types/generated_poc/property/property_list.py +11 -11
  212. adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
  213. adcp/types/generated_poc/property/property_list_filters.py +7 -7
  214. adcp/types/generated_poc/property/update_property_list_request.py +8 -8
  215. adcp/types/generated_poc/property/update_property_list_response.py +2 -2
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
  217. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
  218. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  219. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  220. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  221. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  222. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
  225. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
  232. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
  233. adcp/utils/format_assets.py +32 -32
  234. {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
  235. adcp-3.2.0.dist-info/RECORD +268 -0
  236. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
  237. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
  238. adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
  239. adcp-3.0.0.dist-info/RECORD +0 -264
  240. {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
  241. {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
  242. {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
  243. {adcp-3.0.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
@@ -14,7 +14,7 @@ from ..core import ext as ext_1
14
14
 
15
15
  class SiGetOfferingRequest(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
19
  context: Annotated[
20
20
  str | None,
@@ -24,11 +24,11 @@ class SiGetOfferingRequest(AdCPBaseModel):
24
24
  ] = None
25
25
  ext: ext_1.ExtensionObject | None = None
26
26
  include_products: Annotated[
27
- bool | None, Field(description='Whether to include matching products in the response')
27
+ bool | None, Field(description="Whether to include matching products in the response")
28
28
  ] = False
29
29
  offering_id: Annotated[
30
- str, Field(description='Offering identifier from promoted offerings to get details for')
30
+ str, Field(description="Offering identifier from promoted offerings to get details for")
31
31
  ]
32
32
  product_limit: Annotated[
33
- int | None, Field(description='Maximum number of matching products to return', ge=1, le=50)
33
+ int | None, Field(description="Maximum number of matching products to return", ge=1, le=50)
34
34
  ] = 5
@@ -15,7 +15,7 @@ from ..core import ext as ext_1
15
15
 
16
16
  class MatchingProduct(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='allow',
18
+ extra="allow",
19
19
  )
20
20
  availability_summary: Annotated[
21
21
  str | None,
@@ -23,55 +23,55 @@ class MatchingProduct(AdCPBaseModel):
23
23
  description="Brief availability info (e.g., 'In stock', 'Size 14 available', '3 left')"
24
24
  ),
25
25
  ] = None
26
- image_url: Annotated[AnyUrl | None, Field(description='Product image')] = None
27
- name: Annotated[str, Field(description='Product name')]
28
- original_price: Annotated[str | None, Field(description='Original price if on sale')] = None
26
+ image_url: Annotated[AnyUrl | None, Field(description="Product image")] = None
27
+ name: Annotated[str, Field(description="Product name")]
28
+ original_price: Annotated[str | None, Field(description="Original price if on sale")] = None
29
29
  price: Annotated[str | None, Field(description="Display price (e.g., '$129', '$89.99')")] = None
30
- product_id: Annotated[str, Field(description='Product identifier')]
31
- url: Annotated[AnyUrl | None, Field(description='Product detail page URL')] = None
30
+ product_id: Annotated[str, Field(description="Product identifier")]
31
+ url: Annotated[AnyUrl | None, Field(description="Product detail page URL")] = None
32
32
 
33
33
 
34
34
  class Offering(AdCPBaseModel):
35
35
  model_config = ConfigDict(
36
- extra='allow',
36
+ extra="allow",
37
37
  )
38
- expires_at: Annotated[AwareDatetime | None, Field(description='When this offering expires')] = (
38
+ expires_at: Annotated[AwareDatetime | None, Field(description="When this offering expires")] = (
39
39
  None
40
40
  )
41
- image_url: Annotated[AnyUrl | None, Field(description='Hero image for the offering')] = None
42
- landing_url: Annotated[AnyUrl | None, Field(description='Landing page URL')] = None
43
- offering_id: Annotated[str | None, Field(description='Offering identifier')] = None
41
+ image_url: Annotated[AnyUrl | None, Field(description="Hero image for the offering")] = None
42
+ landing_url: Annotated[AnyUrl | None, Field(description="Landing page URL")] = None
43
+ offering_id: Annotated[str | None, Field(description="Offering identifier")] = None
44
44
  price_hint: Annotated[
45
45
  str | None, Field(description="Price indication (e.g., 'from $199', '50% off')")
46
46
  ] = None
47
- summary: Annotated[str | None, Field(description='Brief summary of the offering')] = None
48
- tagline: Annotated[str | None, Field(description='Short promotional tagline')] = None
49
- title: Annotated[str | None, Field(description='Offering title')] = None
47
+ summary: Annotated[str | None, Field(description="Brief summary of the offering")] = None
48
+ tagline: Annotated[str | None, Field(description="Short promotional tagline")] = None
49
+ title: Annotated[str | None, Field(description="Offering title")] = None
50
50
 
51
51
 
52
52
  class SiGetOfferingResponse(AdCPBaseModel):
53
53
  model_config = ConfigDict(
54
- extra='allow',
54
+ extra="allow",
55
55
  )
56
56
  alternative_offering_ids: Annotated[
57
57
  list[str] | None,
58
- Field(description='Alternative offerings to consider if this one is unavailable'),
58
+ Field(description="Alternative offerings to consider if this one is unavailable"),
59
59
  ] = None
60
- available: Annotated[bool, Field(description='Whether the offering is currently available')]
60
+ available: Annotated[bool, Field(description="Whether the offering is currently available")]
61
61
  checked_at: Annotated[
62
- AwareDatetime | None, Field(description='When this offering information was retrieved')
62
+ AwareDatetime | None, Field(description="When this offering information was retrieved")
63
63
  ] = None
64
64
  errors: Annotated[
65
- list[error.Error] | None, Field(description='Errors during offering lookup')
65
+ list[error.Error] | None, Field(description="Errors during offering lookup")
66
66
  ] = None
67
67
  ext: ext_1.ExtensionObject | None = None
68
68
  matching_products: Annotated[
69
69
  list[MatchingProduct] | None,
70
70
  Field(
71
- description='Products matching the request context. Only included if include_products was true.'
71
+ description="Products matching the request context. Only included if include_products was true."
72
72
  ),
73
73
  ] = None
74
- offering: Annotated[Offering | None, Field(description='Offering details')] = None
74
+ offering: Annotated[Offering | None, Field(description="Offering details")] = None
75
75
  offering_token: Annotated[
76
76
  str | None,
77
77
  Field(
@@ -81,14 +81,14 @@ class SiGetOfferingResponse(AdCPBaseModel):
81
81
  total_matching: Annotated[
82
82
  int | None,
83
83
  Field(
84
- description='Total number of products matching the context (may be more than returned in matching_products)',
84
+ description="Total number of products matching the context (may be more than returned in matching_products)",
85
85
  ge=0,
86
86
  ),
87
87
  ] = None
88
88
  ttl_seconds: Annotated[
89
89
  int | None,
90
90
  Field(
91
- description='How long this offering information is valid (seconds). Host should re-fetch after TTL expires.',
91
+ description="How long this offering information is valid (seconds). Host should re-fetch after TTL expires.",
92
92
  ge=0,
93
93
  ),
94
94
  ] = None
@@ -12,28 +12,28 @@ from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
12
12
 
13
13
 
14
14
  class ConsentScopeEnum(Enum):
15
- name = 'name'
16
- email = 'email'
17
- shipping_address = 'shipping_address'
18
- phone = 'phone'
19
- locale = 'locale'
15
+ name = "name"
16
+ email = "email"
17
+ shipping_address = "shipping_address"
18
+ phone = "phone"
19
+ locale = "locale"
20
20
 
21
21
 
22
22
  class PrivacyPolicyAcknowledged(AdCPBaseModel):
23
23
  model_config = ConfigDict(
24
- extra='allow',
24
+ extra="allow",
25
25
  )
26
26
  brand_policy_url: Annotated[
27
27
  AnyUrl | None, Field(description="URL to brand's privacy policy")
28
28
  ] = None
29
29
  brand_policy_version: Annotated[
30
- str | None, Field(description='Version of policy acknowledged')
30
+ str | None, Field(description="Version of policy acknowledged")
31
31
  ] = None
32
32
 
33
33
 
34
34
  class ShippingAddress(AdCPBaseModel):
35
35
  model_config = ConfigDict(
36
- extra='allow',
36
+ extra="allow",
37
37
  )
38
38
  city: str | None = None
39
39
  country: str | None = None
@@ -44,7 +44,7 @@ class ShippingAddress(AdCPBaseModel):
44
44
 
45
45
  class User(AdCPBaseModel):
46
46
  model_config = ConfigDict(
47
- extra='allow',
47
+ extra="allow",
48
48
  )
49
49
  email: Annotated[EmailStr | None, Field(description="User's email address")] = None
50
50
  locale: Annotated[str | None, Field(description="User's locale (e.g., en-US)")] = None
@@ -57,22 +57,22 @@ class User(AdCPBaseModel):
57
57
 
58
58
  class SiIdentity(AdCPBaseModel):
59
59
  model_config = ConfigDict(
60
- extra='allow',
60
+ extra="allow",
61
61
  )
62
62
  anonymous_session_id: Annotated[
63
63
  str | None,
64
- Field(description='Session ID for anonymous users (when consent_granted is false)'),
64
+ Field(description="Session ID for anonymous users (when consent_granted is false)"),
65
65
  ] = None
66
- consent_granted: Annotated[bool, Field(description='Whether user consented to share identity')]
66
+ consent_granted: Annotated[bool, Field(description="Whether user consented to share identity")]
67
67
  consent_scope: Annotated[
68
- list[ConsentScopeEnum] | None, Field(description='What data was consented to share')
68
+ list[ConsentScopeEnum] | None, Field(description="What data was consented to share")
69
69
  ] = None
70
70
  consent_timestamp: Annotated[
71
- AwareDatetime | None, Field(description='When consent was granted (ISO 8601)')
71
+ AwareDatetime | None, Field(description="When consent was granted (ISO 8601)")
72
72
  ] = None
73
73
  privacy_policy_acknowledged: Annotated[
74
- PrivacyPolicyAcknowledged | None, Field(description='Brand privacy policy acknowledgment')
74
+ PrivacyPolicyAcknowledged | None, Field(description="Brand privacy policy acknowledgment")
75
75
  ] = None
76
76
  user: Annotated[
77
- User | None, Field(description='User data (only present if consent_granted is true)')
77
+ User | None, Field(description="User data (only present if consent_granted is true)")
78
78
  ] = None
@@ -15,18 +15,18 @@ from . import si_capabilities, si_identity
15
15
 
16
16
  class SiInitiateSessionRequest(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='allow',
18
+ extra="allow",
19
19
  )
20
20
  context: Annotated[
21
- str, Field(description='Conversation handoff from the host describing what the user needs')
21
+ str, Field(description="Conversation handoff from the host describing what the user needs")
22
22
  ]
23
23
  ext: ext_1.ExtensionObject | None = None
24
24
  identity: si_identity.SiIdentity
25
25
  media_buy_id: Annotated[
26
- str | None, Field(description='AdCP media buy ID if session was triggered by advertising')
26
+ str | None, Field(description="AdCP media buy ID if session was triggered by advertising")
27
27
  ] = None
28
28
  offering_id: Annotated[
29
- str | None, Field(description='Brand-specific offering identifier to apply')
29
+ str | None, Field(description="Brand-specific offering identifier to apply")
30
30
  ] = None
31
31
  offering_token: Annotated[
32
32
  str | None,
@@ -42,5 +42,5 @@ class SiInitiateSessionRequest(AdCPBaseModel):
42
42
  ] = None
43
43
  supported_capabilities: Annotated[
44
44
  si_capabilities.SiCapabilities | None,
45
- Field(description='What capabilities the host supports'),
45
+ Field(description="What capabilities the host supports"),
46
46
  ] = None
@@ -16,29 +16,29 @@ from . import si_capabilities, si_ui_element
16
16
 
17
17
  class Response(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='allow',
19
+ extra="allow",
20
20
  )
21
- message: Annotated[str | None, Field(description='Conversational message from brand agent')] = (
21
+ message: Annotated[str | None, Field(description="Conversational message from brand agent")] = (
22
22
  None
23
23
  )
24
24
  ui_elements: Annotated[
25
- list[si_ui_element.SiUiElement] | None, Field(description='Visual components to render')
25
+ list[si_ui_element.SiUiElement] | None, Field(description="Visual components to render")
26
26
  ] = None
27
27
 
28
28
 
29
29
  class SiInitiateSessionResponse(AdCPBaseModel):
30
30
  model_config = ConfigDict(
31
- extra='allow',
31
+ extra="allow",
32
32
  )
33
33
  errors: Annotated[
34
- list[error.Error] | None, Field(description='Errors during session initiation')
34
+ list[error.Error] | None, Field(description="Errors during session initiation")
35
35
  ] = None
36
36
  ext: ext_1.ExtensionObject | None = None
37
37
  negotiated_capabilities: Annotated[
38
38
  si_capabilities.SiCapabilities | None,
39
- Field(description='Intersection of brand and host capabilities for this session'),
39
+ Field(description="Intersection of brand and host capabilities for this session"),
40
40
  ] = None
41
41
  response: Annotated[Response | None, Field(description="Brand agent's initial response")] = None
42
42
  session_id: Annotated[
43
- str, Field(description='Unique session identifier for subsequent messages')
43
+ str, Field(description="Unique session identifier for subsequent messages")
44
44
  ]
@@ -14,45 +14,45 @@ from ..core import ext as ext_1
14
14
 
15
15
  class ActionResponse(AdCPBaseModel):
16
16
  model_config = ConfigDict(
17
- extra='allow',
17
+ extra="allow",
18
18
  )
19
- action: Annotated[str | None, Field(description='The action that was triggered')] = None
19
+ action: Annotated[str | None, Field(description="The action that was triggered")] = None
20
20
  payload: Annotated[
21
- dict[str, Any] | None, Field(description='Action-specific response data')
21
+ dict[str, Any] | None, Field(description="Action-specific response data")
22
22
  ] = None
23
23
 
24
24
 
25
25
  class SiSendMessageRequest1(AdCPBaseModel):
26
26
  model_config = ConfigDict(
27
- extra='allow',
27
+ extra="allow",
28
28
  )
29
29
  action_response: Annotated[
30
30
  ActionResponse | None,
31
- Field(description='Response to a previous action_button (e.g., user clicked checkout)'),
31
+ Field(description="Response to a previous action_button (e.g., user clicked checkout)"),
32
32
  ] = None
33
33
  ext: ext_1.ExtensionObject | None = None
34
34
  message: Annotated[str, Field(description="User's message to the brand agent")]
35
- session_id: Annotated[str, Field(description='Active session identifier')]
35
+ session_id: Annotated[str, Field(description="Active session identifier")]
36
36
 
37
37
 
38
38
  class SiSendMessageRequest2(AdCPBaseModel):
39
39
  model_config = ConfigDict(
40
- extra='allow',
40
+ extra="allow",
41
41
  )
42
42
  action_response: Annotated[
43
43
  ActionResponse,
44
- Field(description='Response to a previous action_button (e.g., user clicked checkout)'),
44
+ Field(description="Response to a previous action_button (e.g., user clicked checkout)"),
45
45
  ]
46
46
  ext: ext_1.ExtensionObject | None = None
47
47
  message: Annotated[str | None, Field(description="User's message to the brand agent")] = None
48
- session_id: Annotated[str, Field(description='Active session identifier')]
48
+ session_id: Annotated[str, Field(description="Active session identifier")]
49
49
 
50
50
 
51
51
  class SiSendMessageRequest(RootModel[SiSendMessageRequest1 | SiSendMessageRequest2]):
52
52
  root: Annotated[
53
53
  SiSendMessageRequest1 | SiSendMessageRequest2,
54
54
  Field(
55
- description='Send a message to the brand agent within an active session',
56
- title='SI Send Message Request',
55
+ description="Send a message to the brand agent within an active session",
56
+ title="SI Send Message Request",
57
57
  ),
58
58
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: sponsored_intelligence/si_send_message_response.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
 
@@ -10,6 +10,7 @@ from typing import Annotated, Any
10
10
  from adcp.types.base import AdCPBaseModel
11
11
  from pydantic import ConfigDict, Field
12
12
 
13
+ from ..a2ui import surface as surface_1
13
14
  from ..core import error
14
15
  from ..core import ext as ext_1
15
16
  from . import si_ui_element
@@ -17,13 +18,13 @@ from . import si_ui_element
17
18
 
18
19
  class ContextForCheckout(AdCPBaseModel):
19
20
  model_config = ConfigDict(
20
- extra='allow',
21
+ extra="allow",
21
22
  )
22
23
  applied_offers: Annotated[
23
- list[str] | None, Field(description='Offer IDs that were applied during the conversation')
24
+ list[str] | None, Field(description="Offer IDs that were applied during the conversation")
24
25
  ] = None
25
26
  conversation_summary: Annotated[
26
- str | None, Field(description='Summary of the conversation leading to purchase')
27
+ str | None, Field(description="Summary of the conversation leading to purchase")
27
28
  ] = None
28
29
 
29
30
 
@@ -34,68 +35,81 @@ class Price(AdCPBaseModel):
34
35
 
35
36
  class Intent(AdCPBaseModel):
36
37
  model_config = ConfigDict(
37
- extra='allow',
38
+ extra="allow",
38
39
  )
39
40
  action: Annotated[str | None, Field(description="The commerce action (e.g., 'purchase')")] = (
40
41
  None
41
42
  )
42
- price: Annotated[Price | None, Field(description='Price information')] = None
43
- product: Annotated[dict[str, Any] | None, Field(description='Product details for checkout')] = (
43
+ price: Annotated[Price | None, Field(description="Price information")] = None
44
+ product: Annotated[dict[str, Any] | None, Field(description="Product details for checkout")] = (
44
45
  None
45
46
  )
46
47
 
47
48
 
48
49
  class Type(Enum):
49
- transaction = 'transaction'
50
- complete = 'complete'
50
+ transaction = "transaction"
51
+ complete = "complete"
51
52
 
52
53
 
53
54
  class Handoff(AdCPBaseModel):
54
55
  model_config = ConfigDict(
55
- extra='allow',
56
+ extra="allow",
56
57
  )
57
58
  context_for_checkout: Annotated[
58
- ContextForCheckout | None, Field(description='Context to pass to ACP for seamless checkout')
59
+ ContextForCheckout | None, Field(description="Context to pass to ACP for seamless checkout")
59
60
  ] = None
60
61
  intent: Annotated[
61
62
  Intent | None,
62
- Field(description='For transaction handoffs: what the user wants to purchase'),
63
+ Field(description="For transaction handoffs: what the user wants to purchase"),
63
64
  ] = None
64
65
  type: Annotated[
65
66
  Type | None,
66
67
  Field(
67
- description='Type of handoff: transaction (ready for ACP checkout) or complete (conversation done)'
68
+ description="Type of handoff: transaction (ready for ACP checkout) or complete (conversation done)"
68
69
  ),
69
70
  ] = None
70
71
 
71
72
 
72
73
  class SessionStatus(Enum):
73
- active = 'active'
74
- pending_handoff = 'pending_handoff'
75
- complete = 'complete'
74
+ active = "active"
75
+ pending_handoff = "pending_handoff"
76
+ complete = "complete"
76
77
 
77
78
 
78
79
  class Response(AdCPBaseModel):
79
80
  model_config = ConfigDict(
80
- extra='allow',
81
+ extra="allow",
81
82
  )
82
- message: Annotated[str | None, Field(description='Conversational message from brand agent')] = (
83
+ message: Annotated[str | None, Field(description="Conversational message from brand agent")] = (
83
84
  None
84
85
  )
86
+ surface: Annotated[
87
+ surface_1.A2UiSurface | None, Field(description="A2UI surface with interactive components")
88
+ ] = None
85
89
  ui_elements: Annotated[
86
- list[si_ui_element.SiUiElement] | None, Field(description='Visual components to render')
90
+ list[si_ui_element.SiUiElement] | None,
91
+ Field(
92
+ deprecated=True,
93
+ description="Visual components to render (DEPRECATED: use surface instead)",
94
+ ),
87
95
  ] = None
88
96
 
89
97
 
90
98
  class SiSendMessageResponse(AdCPBaseModel):
91
99
  model_config = ConfigDict(
92
- extra='allow',
100
+ extra="allow",
93
101
  )
94
102
  errors: list[error.Error] | None = None
95
103
  ext: ext_1.ExtensionObject | None = None
96
104
  handoff: Annotated[
97
- Handoff | None, Field(description='Handoff request when session_status is pending_handoff')
105
+ Handoff | None, Field(description="Handoff request when session_status is pending_handoff")
106
+ ] = None
107
+ mcp_resource_uri: Annotated[
108
+ str | None,
109
+ Field(
110
+ description="MCP resource URI for hosts with MCP Apps support (e.g., ui://si/session-abc123)"
111
+ ),
98
112
  ] = None
99
113
  response: Annotated[Response | None, Field(description="Brand agent's response")] = None
100
- session_id: Annotated[str, Field(description='Session identifier')]
101
- session_status: Annotated[SessionStatus, Field(description='Current session status')]
114
+ session_id: Annotated[str, Field(description="Session identifier")]
115
+ session_status: Annotated[SessionStatus, Field(description="Current session status")]
@@ -14,47 +14,47 @@ from ..core import ext as ext_1
14
14
 
15
15
 
16
16
  class Reason(Enum):
17
- handoff_transaction = 'handoff_transaction'
18
- handoff_complete = 'handoff_complete'
19
- user_exit = 'user_exit'
20
- session_timeout = 'session_timeout'
21
- host_terminated = 'host_terminated'
17
+ handoff_transaction = "handoff_transaction"
18
+ handoff_complete = "handoff_complete"
19
+ user_exit = "user_exit"
20
+ session_timeout = "session_timeout"
21
+ host_terminated = "host_terminated"
22
22
 
23
23
 
24
24
  class Action(Enum):
25
- purchase = 'purchase'
26
- subscribe = 'subscribe'
25
+ purchase = "purchase"
26
+ subscribe = "subscribe"
27
27
 
28
28
 
29
29
  class TransactionIntent(AdCPBaseModel):
30
30
  model_config = ConfigDict(
31
- extra='allow',
31
+ extra="allow",
32
32
  )
33
33
  action: Action | None = None
34
- product: Annotated[dict[str, Any] | None, Field(description='Product/service details')] = None
34
+ product: Annotated[dict[str, Any] | None, Field(description="Product/service details")] = None
35
35
 
36
36
 
37
37
  class TerminationContext(AdCPBaseModel):
38
38
  model_config = ConfigDict(
39
- extra='allow',
39
+ extra="allow",
40
40
  )
41
41
  cause: Annotated[
42
- str | None, Field(description='For host_terminated - why host ended session')
42
+ str | None, Field(description="For host_terminated - why host ended session")
43
43
  ] = None
44
- summary: Annotated[str | None, Field(description='Summary of the conversation')] = None
44
+ summary: Annotated[str | None, Field(description="Summary of the conversation")] = None
45
45
  transaction_intent: Annotated[
46
46
  TransactionIntent | None,
47
- Field(description='For handoff_transaction - what user wants to buy'),
47
+ Field(description="For handoff_transaction - what user wants to buy"),
48
48
  ] = None
49
49
 
50
50
 
51
51
  class SiTerminateSessionRequest(AdCPBaseModel):
52
52
  model_config = ConfigDict(
53
- extra='allow',
53
+ extra="allow",
54
54
  )
55
55
  ext: ext_1.ExtensionObject | None = None
56
- reason: Annotated[Reason, Field(description='Reason for termination')]
57
- session_id: Annotated[str, Field(description='Session identifier to terminate')]
56
+ reason: Annotated[Reason, Field(description="Reason for termination")]
57
+ session_id: Annotated[str, Field(description="Session identifier to terminate")]
58
58
  termination_context: Annotated[
59
- TerminationContext | None, Field(description='Context for the termination')
59
+ TerminationContext | None, Field(description="Context for the termination")
60
60
  ] = None
@@ -16,39 +16,39 @@ from ..core import ext as ext_1
16
16
 
17
17
  class AcpHandoff(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='allow',
19
+ extra="allow",
20
20
  )
21
- checkout_token: Annotated[str | None, Field(description='Token for ACP checkout flow')] = None
22
- checkout_url: Annotated[AnyUrl | None, Field(description='ACP checkout initiation URL')] = None
23
- product: Annotated[dict[str, Any] | None, Field(description='Product details for checkout')] = (
21
+ checkout_token: Annotated[str | None, Field(description="Token for ACP checkout flow")] = None
22
+ checkout_url: Annotated[AnyUrl | None, Field(description="ACP checkout initiation URL")] = None
23
+ product: Annotated[dict[str, Any] | None, Field(description="Product details for checkout")] = (
24
24
  None
25
25
  )
26
26
 
27
27
 
28
28
  class Action(Enum):
29
- save_for_later = 'save_for_later'
30
- set_reminder = 'set_reminder'
31
- subscribe_updates = 'subscribe_updates'
32
- none = 'none'
29
+ save_for_later = "save_for_later"
30
+ set_reminder = "set_reminder"
31
+ subscribe_updates = "subscribe_updates"
32
+ none = "none"
33
33
 
34
34
 
35
35
  class FollowUp(AdCPBaseModel):
36
36
  model_config = ConfigDict(
37
- extra='allow',
37
+ extra="allow",
38
38
  )
39
39
  action: Action | None = None
40
- data: Annotated[dict[str, Any] | None, Field(description='Data for follow-up action')] = None
40
+ data: Annotated[dict[str, Any] | None, Field(description="Data for follow-up action")] = None
41
41
 
42
42
 
43
43
  class SiTerminateSessionResponse(AdCPBaseModel):
44
44
  model_config = ConfigDict(
45
- extra='allow',
45
+ extra="allow",
46
46
  )
47
47
  acp_handoff: Annotated[
48
- AcpHandoff | None, Field(description='ACP checkout handoff data (for handoff_transaction)')
48
+ AcpHandoff | None, Field(description="ACP checkout handoff data (for handoff_transaction)")
49
49
  ] = None
50
50
  errors: list[error.Error] | None = None
51
51
  ext: ext_1.ExtensionObject | None = None
52
- follow_up: Annotated[FollowUp | None, Field(description='Suggested follow-up actions')] = None
53
- session_id: Annotated[str, Field(description='Terminated session identifier')]
54
- terminated: Annotated[bool, Field(description='Whether session was successfully terminated')]
52
+ follow_up: Annotated[FollowUp | None, Field(description="Suggested follow-up actions")] = None
53
+ session_id: Annotated[str, Field(description="Terminated session identifier")]
54
+ terminated: Annotated[bool, Field(description="Whether session was successfully terminated")]
@@ -12,19 +12,19 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
 
14
14
  class Type(Enum):
15
- text = 'text'
16
- link = 'link'
17
- image = 'image'
18
- product_card = 'product_card'
19
- carousel = 'carousel'
20
- action_button = 'action_button'
21
- app_handoff = 'app_handoff'
22
- integration_actions = 'integration_actions'
15
+ text = "text"
16
+ link = "link"
17
+ image = "image"
18
+ product_card = "product_card"
19
+ carousel = "carousel"
20
+ action_button = "action_button"
21
+ app_handoff = "app_handoff"
22
+ integration_actions = "integration_actions"
23
23
 
24
24
 
25
25
  class SiUiElement(AdCPBaseModel):
26
26
  model_config = ConfigDict(
27
- extra='allow',
27
+ extra="allow",
28
28
  )
29
- data: Annotated[dict[str, Any] | None, Field(description='Component-specific data')] = None
30
- type: Annotated[Type, Field(description='Component type')]
29
+ data: Annotated[dict[str, Any] | None, Field(description="Component-specific data")] = None
30
+ type: Annotated[Type, Field(description="Component type")]