adcp 2.18.0__py3-none-any.whl → 3.0.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 (245) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +87 -1
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -18
  18. adcp/types/_generated.py +419 -44
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +103 -6
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +1 -1
  41. adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
  42. adcp/types/generated_poc/core/assets/css_asset.py +1 -1
  43. adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
  44. adcp/types/generated_poc/core/assets/html_asset.py +1 -1
  45. adcp/types/generated_poc/core/assets/image_asset.py +1 -1
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
  47. adcp/types/generated_poc/core/assets/text_asset.py +1 -1
  48. adcp/types/generated_poc/core/assets/url_asset.py +1 -1
  49. adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
  50. adcp/types/generated_poc/core/assets/video_asset.py +1 -1
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
  52. adcp/types/generated_poc/core/async_response_data.py +1 -1
  53. adcp/types/generated_poc/core/brand_manifest.py +68 -5
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
  55. adcp/types/generated_poc/core/context.py +1 -1
  56. adcp/types/generated_poc/core/creative_asset.py +8 -7
  57. adcp/types/generated_poc/core/creative_assignment.py +1 -1
  58. adcp/types/generated_poc/core/creative_filters.py +4 -14
  59. adcp/types/generated_poc/core/creative_manifest.py +1 -1
  60. adcp/types/generated_poc/core/creative_policy.py +1 -1
  61. adcp/types/generated_poc/core/delivery_metrics.py +1 -1
  62. adcp/types/generated_poc/core/deployment.py +1 -1
  63. adcp/types/generated_poc/core/destination.py +1 -1
  64. adcp/types/generated_poc/core/error.py +1 -1
  65. adcp/types/generated_poc/core/ext.py +1 -1
  66. adcp/types/generated_poc/core/format.py +6 -5
  67. adcp/types/generated_poc/core/format_id.py +1 -1
  68. adcp/types/generated_poc/core/frequency_cap.py +1 -1
  69. adcp/types/generated_poc/core/identifier.py +27 -0
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
  71. adcp/types/generated_poc/core/measurement.py +1 -1
  72. adcp/types/generated_poc/core/media_buy.py +1 -1
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +1 -1
  76. adcp/types/generated_poc/core/performance_feedback.py +1 -1
  77. adcp/types/generated_poc/core/placement.py +1 -1
  78. adcp/types/generated_poc/core/pricing_option.py +8 -14
  79. adcp/types/generated_poc/core/product.py +1 -1
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +72 -7
  82. adcp/types/generated_poc/core/promoted_offerings.py +12 -21
  83. adcp/types/generated_poc/core/promoted_products.py +1 -1
  84. adcp/types/generated_poc/core/property.py +1 -1
  85. adcp/types/generated_poc/core/property_id.py +1 -1
  86. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  87. adcp/types/generated_poc/core/property_tag.py +1 -1
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +1 -1
  90. adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
  91. adcp/types/generated_poc/core/push_notification_config.py +1 -1
  92. adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +1 -1
  95. adcp/types/generated_poc/core/signal_filters.py +1 -1
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +1 -1
  98. adcp/types/generated_poc/core/targeting.py +55 -14
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
  101. adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
  102. adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
  103. adcp/types/generated_poc/creative/preview_render.py +1 -1
  104. adcp/types/generated_poc/enums/adcp_domain.py +3 -1
  105. adcp/types/generated_poc/enums/asset_content_type.py +1 -1
  106. adcp/types/generated_poc/enums/auth_scheme.py +1 -1
  107. adcp/types/generated_poc/enums/available_metric.py +1 -1
  108. adcp/types/generated_poc/enums/channels.py +18 -8
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
  110. adcp/types/generated_poc/enums/creative_action.py +1 -1
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
  112. adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
  113. adcp/types/generated_poc/enums/creative_status.py +2 -1
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
  115. adcp/types/generated_poc/enums/daast_version.py +1 -1
  116. adcp/types/generated_poc/enums/delivery_type.py +1 -1
  117. adcp/types/generated_poc/enums/dimension_unit.py +1 -1
  118. adcp/types/generated_poc/enums/feed_format.py +1 -1
  119. adcp/types/generated_poc/enums/feedback_source.py +1 -1
  120. adcp/types/generated_poc/enums/format_category.py +1 -1
  121. adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +1 -1
  125. adcp/types/generated_poc/enums/http_method.py +1 -1
  126. adcp/types/generated_poc/enums/identifier_types.py +1 -1
  127. adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
  129. adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
  130. adcp/types/generated_poc/enums/media_buy_status.py +1 -1
  131. adcp/types/generated_poc/enums/metric_type.py +1 -1
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +1 -1
  134. adcp/types/generated_poc/enums/pacing.py +1 -1
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +1 -1
  137. adcp/types/generated_poc/enums/pricing_model.py +1 -1
  138. adcp/types/generated_poc/enums/property_type.py +2 -1
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
  140. adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
  142. adcp/types/generated_poc/enums/sort_direction.py +1 -1
  143. adcp/types/generated_poc/enums/task_status.py +1 -1
  144. adcp/types/generated_poc/enums/task_type.py +7 -1
  145. adcp/types/generated_poc/enums/update_frequency.py +1 -1
  146. adcp/types/generated_poc/enums/url_asset_type.py +1 -1
  147. adcp/types/generated_poc/enums/validation_mode.py +1 -1
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
  149. adcp/types/generated_poc/enums/vast_version.py +1 -1
  150. adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
  151. adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
  152. adcp/types/generated_poc/extensions/__init__.py +3 -0
  153. adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  154. adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
  155. adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  158. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
  159. adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
  160. adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
  162. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
  163. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
  164. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
  165. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
  166. adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
  167. adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
  169. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  170. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
  171. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
  172. adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
  173. adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
  174. adcp/types/generated_poc/media_buy/package_request.py +15 -6
  175. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
  187. adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
  188. adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
  189. adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
  190. adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
  191. adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
  192. adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
  193. adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
  194. adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
  195. adcp/types/generated_poc/property/__init__.py +3 -0
  196. adcp/types/generated_poc/property/base_property_source.py +86 -0
  197. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  198. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  199. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  200. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  201. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  202. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  203. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  204. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  205. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  206. adcp/types/generated_poc/property/property_error.py +33 -0
  207. adcp/types/generated_poc/property/property_feature.py +22 -0
  208. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  209. adcp/types/generated_poc/property/property_list.py +62 -0
  210. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  211. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  212. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  213. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  214. adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
  218. adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
  219. adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
  220. adcp/types/generated_poc/signals/get_signals_request.py +1 -1
  221. adcp/types/generated_poc/signals/get_signals_response.py +1 -1
  222. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. adcp/utils/format_assets.py +5 -5
  235. adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  237. adcp-3.0.0.dist-info/RECORD +264 -0
  238. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  239. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  240. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp-2.18.0.dist-info/RECORD +0 -195
  243. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  244. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  245. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,78 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_identity.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
12
+
13
+
14
+ class ConsentScopeEnum(Enum):
15
+ name = 'name'
16
+ email = 'email'
17
+ shipping_address = 'shipping_address'
18
+ phone = 'phone'
19
+ locale = 'locale'
20
+
21
+
22
+ class PrivacyPolicyAcknowledged(AdCPBaseModel):
23
+ model_config = ConfigDict(
24
+ extra='allow',
25
+ )
26
+ brand_policy_url: Annotated[
27
+ AnyUrl | None, Field(description="URL to brand's privacy policy")
28
+ ] = None
29
+ brand_policy_version: Annotated[
30
+ str | None, Field(description='Version of policy acknowledged')
31
+ ] = None
32
+
33
+
34
+ class ShippingAddress(AdCPBaseModel):
35
+ model_config = ConfigDict(
36
+ extra='allow',
37
+ )
38
+ city: str | None = None
39
+ country: str | None = None
40
+ postal_code: str | None = None
41
+ state: str | None = None
42
+ street: str | None = None
43
+
44
+
45
+ class User(AdCPBaseModel):
46
+ model_config = ConfigDict(
47
+ extra='allow',
48
+ )
49
+ email: Annotated[EmailStr | None, Field(description="User's email address")] = None
50
+ locale: Annotated[str | None, Field(description="User's locale (e.g., en-US)")] = None
51
+ name: Annotated[str | None, Field(description="User's display name")] = None
52
+ phone: Annotated[str | None, Field(description="User's phone number")] = None
53
+ shipping_address: Annotated[
54
+ ShippingAddress | None, Field(description="User's shipping address for accurate pricing")
55
+ ] = None
56
+
57
+
58
+ class SiIdentity(AdCPBaseModel):
59
+ model_config = ConfigDict(
60
+ extra='allow',
61
+ )
62
+ anonymous_session_id: Annotated[
63
+ str | None,
64
+ Field(description='Session ID for anonymous users (when consent_granted is false)'),
65
+ ] = None
66
+ consent_granted: Annotated[bool, Field(description='Whether user consented to share identity')]
67
+ consent_scope: Annotated[
68
+ list[ConsentScopeEnum] | None, Field(description='What data was consented to share')
69
+ ] = None
70
+ consent_timestamp: Annotated[
71
+ AwareDatetime | None, Field(description='When consent was granted (ISO 8601)')
72
+ ] = None
73
+ privacy_policy_acknowledged: Annotated[
74
+ PrivacyPolicyAcknowledged | None, Field(description='Brand privacy policy acknowledgment')
75
+ ] = None
76
+ user: Annotated[
77
+ User | None, Field(description='User data (only present if consent_granted is true)')
78
+ ] = None
@@ -0,0 +1,46 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_initiate_session_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import ext as ext_1
13
+ from . import si_capabilities, si_identity
14
+
15
+
16
+ class SiInitiateSessionRequest(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='allow',
19
+ )
20
+ context: Annotated[
21
+ str, Field(description='Conversation handoff from the host describing what the user needs')
22
+ ]
23
+ ext: ext_1.ExtensionObject | None = None
24
+ identity: si_identity.SiIdentity
25
+ media_buy_id: Annotated[
26
+ str | None, Field(description='AdCP media buy ID if session was triggered by advertising')
27
+ ] = None
28
+ offering_id: Annotated[
29
+ str | None, Field(description='Brand-specific offering identifier to apply')
30
+ ] = None
31
+ offering_token: Annotated[
32
+ str | None,
33
+ Field(
34
+ description="Token from si_get_offering response for session continuity. Brand uses this to recall what products were shown to the user, enabling natural references like 'the second one' or 'that blue shoe'."
35
+ ),
36
+ ] = None
37
+ placement: Annotated[
38
+ str | None,
39
+ Field(
40
+ description="Where this session was triggered (e.g., 'chatgpt_search', 'claude_chat')"
41
+ ),
42
+ ] = None
43
+ supported_capabilities: Annotated[
44
+ si_capabilities.SiCapabilities | None,
45
+ Field(description='What capabilities the host supports'),
46
+ ] = None
@@ -0,0 +1,44 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_initiate_session_response.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from ..core import error
13
+ from ..core import ext as ext_1
14
+ from . import si_capabilities, si_ui_element
15
+
16
+
17
+ class Response(AdCPBaseModel):
18
+ model_config = ConfigDict(
19
+ extra='allow',
20
+ )
21
+ message: Annotated[str | None, Field(description='Conversational message from brand agent')] = (
22
+ None
23
+ )
24
+ ui_elements: Annotated[
25
+ list[si_ui_element.SiUiElement] | None, Field(description='Visual components to render')
26
+ ] = None
27
+
28
+
29
+ class SiInitiateSessionResponse(AdCPBaseModel):
30
+ model_config = ConfigDict(
31
+ extra='allow',
32
+ )
33
+ errors: Annotated[
34
+ list[error.Error] | None, Field(description='Errors during session initiation')
35
+ ] = None
36
+ ext: ext_1.ExtensionObject | None = None
37
+ negotiated_capabilities: Annotated[
38
+ si_capabilities.SiCapabilities | None,
39
+ Field(description='Intersection of brand and host capabilities for this session'),
40
+ ] = None
41
+ response: Annotated[Response | None, Field(description="Brand agent's initial response")] = None
42
+ session_id: Annotated[
43
+ str, Field(description='Unique session identifier for subsequent messages')
44
+ ]
@@ -0,0 +1,58 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_send_message_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Annotated, Any
8
+
9
+ from adcp.types.base import AdCPBaseModel
10
+ from pydantic import ConfigDict, Field, RootModel
11
+
12
+ from ..core import ext as ext_1
13
+
14
+
15
+ class ActionResponse(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='allow',
18
+ )
19
+ action: Annotated[str | None, Field(description='The action that was triggered')] = None
20
+ payload: Annotated[
21
+ dict[str, Any] | None, Field(description='Action-specific response data')
22
+ ] = None
23
+
24
+
25
+ class SiSendMessageRequest1(AdCPBaseModel):
26
+ model_config = ConfigDict(
27
+ extra='allow',
28
+ )
29
+ action_response: Annotated[
30
+ ActionResponse | None,
31
+ Field(description='Response to a previous action_button (e.g., user clicked checkout)'),
32
+ ] = None
33
+ ext: ext_1.ExtensionObject | None = None
34
+ message: Annotated[str, Field(description="User's message to the brand agent")]
35
+ session_id: Annotated[str, Field(description='Active session identifier')]
36
+
37
+
38
+ class SiSendMessageRequest2(AdCPBaseModel):
39
+ model_config = ConfigDict(
40
+ extra='allow',
41
+ )
42
+ action_response: Annotated[
43
+ ActionResponse,
44
+ Field(description='Response to a previous action_button (e.g., user clicked checkout)'),
45
+ ]
46
+ ext: ext_1.ExtensionObject | None = None
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')]
49
+
50
+
51
+ class SiSendMessageRequest(RootModel[SiSendMessageRequest1 | SiSendMessageRequest2]):
52
+ root: Annotated[
53
+ SiSendMessageRequest1 | SiSendMessageRequest2,
54
+ Field(
55
+ description='Send a message to the brand agent within an active session',
56
+ title='SI Send Message Request',
57
+ ),
58
+ ]
@@ -0,0 +1,101 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_send_message_response.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+ from ..core import error
14
+ from ..core import ext as ext_1
15
+ from . import si_ui_element
16
+
17
+
18
+ class ContextForCheckout(AdCPBaseModel):
19
+ model_config = ConfigDict(
20
+ extra='allow',
21
+ )
22
+ applied_offers: Annotated[
23
+ list[str] | None, Field(description='Offer IDs that were applied during the conversation')
24
+ ] = None
25
+ conversation_summary: Annotated[
26
+ str | None, Field(description='Summary of the conversation leading to purchase')
27
+ ] = None
28
+
29
+
30
+ class Price(AdCPBaseModel):
31
+ amount: float | None = None
32
+ currency: str | None = None
33
+
34
+
35
+ class Intent(AdCPBaseModel):
36
+ model_config = ConfigDict(
37
+ extra='allow',
38
+ )
39
+ action: Annotated[str | None, Field(description="The commerce action (e.g., 'purchase')")] = (
40
+ None
41
+ )
42
+ price: Annotated[Price | None, Field(description='Price information')] = None
43
+ product: Annotated[dict[str, Any] | None, Field(description='Product details for checkout')] = (
44
+ None
45
+ )
46
+
47
+
48
+ class Type(Enum):
49
+ transaction = 'transaction'
50
+ complete = 'complete'
51
+
52
+
53
+ class Handoff(AdCPBaseModel):
54
+ model_config = ConfigDict(
55
+ extra='allow',
56
+ )
57
+ context_for_checkout: Annotated[
58
+ ContextForCheckout | None, Field(description='Context to pass to ACP for seamless checkout')
59
+ ] = None
60
+ intent: Annotated[
61
+ Intent | None,
62
+ Field(description='For transaction handoffs: what the user wants to purchase'),
63
+ ] = None
64
+ type: Annotated[
65
+ Type | None,
66
+ Field(
67
+ description='Type of handoff: transaction (ready for ACP checkout) or complete (conversation done)'
68
+ ),
69
+ ] = None
70
+
71
+
72
+ class SessionStatus(Enum):
73
+ active = 'active'
74
+ pending_handoff = 'pending_handoff'
75
+ complete = 'complete'
76
+
77
+
78
+ class Response(AdCPBaseModel):
79
+ model_config = ConfigDict(
80
+ extra='allow',
81
+ )
82
+ message: Annotated[str | None, Field(description='Conversational message from brand agent')] = (
83
+ None
84
+ )
85
+ ui_elements: Annotated[
86
+ list[si_ui_element.SiUiElement] | None, Field(description='Visual components to render')
87
+ ] = None
88
+
89
+
90
+ class SiSendMessageResponse(AdCPBaseModel):
91
+ model_config = ConfigDict(
92
+ extra='allow',
93
+ )
94
+ errors: list[error.Error] | None = None
95
+ ext: ext_1.ExtensionObject | None = None
96
+ handoff: Annotated[
97
+ Handoff | None, Field(description='Handoff request when session_status is pending_handoff')
98
+ ] = None
99
+ 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')]
@@ -0,0 +1,60 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_terminate_session_request.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+ from ..core import ext as ext_1
14
+
15
+
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'
22
+
23
+
24
+ class Action(Enum):
25
+ purchase = 'purchase'
26
+ subscribe = 'subscribe'
27
+
28
+
29
+ class TransactionIntent(AdCPBaseModel):
30
+ model_config = ConfigDict(
31
+ extra='allow',
32
+ )
33
+ action: Action | None = None
34
+ product: Annotated[dict[str, Any] | None, Field(description='Product/service details')] = None
35
+
36
+
37
+ class TerminationContext(AdCPBaseModel):
38
+ model_config = ConfigDict(
39
+ extra='allow',
40
+ )
41
+ cause: Annotated[
42
+ str | None, Field(description='For host_terminated - why host ended session')
43
+ ] = None
44
+ summary: Annotated[str | None, Field(description='Summary of the conversation')] = None
45
+ transaction_intent: Annotated[
46
+ TransactionIntent | None,
47
+ Field(description='For handoff_transaction - what user wants to buy'),
48
+ ] = None
49
+
50
+
51
+ class SiTerminateSessionRequest(AdCPBaseModel):
52
+ model_config = ConfigDict(
53
+ extra='allow',
54
+ )
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')]
58
+ termination_context: Annotated[
59
+ TerminationContext | None, Field(description='Context for the termination')
60
+ ] = None
@@ -0,0 +1,54 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_terminate_session_response.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import AnyUrl, ConfigDict, Field
12
+
13
+ from ..core import error
14
+ from ..core import ext as ext_1
15
+
16
+
17
+ class AcpHandoff(AdCPBaseModel):
18
+ model_config = ConfigDict(
19
+ extra='allow',
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')] = (
24
+ None
25
+ )
26
+
27
+
28
+ class Action(Enum):
29
+ save_for_later = 'save_for_later'
30
+ set_reminder = 'set_reminder'
31
+ subscribe_updates = 'subscribe_updates'
32
+ none = 'none'
33
+
34
+
35
+ class FollowUp(AdCPBaseModel):
36
+ model_config = ConfigDict(
37
+ extra='allow',
38
+ )
39
+ action: Action | None = None
40
+ data: Annotated[dict[str, Any] | None, Field(description='Data for follow-up action')] = None
41
+
42
+
43
+ class SiTerminateSessionResponse(AdCPBaseModel):
44
+ model_config = ConfigDict(
45
+ extra='allow',
46
+ )
47
+ acp_handoff: Annotated[
48
+ AcpHandoff | None, Field(description='ACP checkout handoff data (for handoff_transaction)')
49
+ ] = None
50
+ errors: list[error.Error] | None = None
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')]
@@ -0,0 +1,30 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_ui_element.json
3
+ # timestamp: 2026-01-25T21:17:54+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Annotated, Any
9
+
10
+ from adcp.types.base import AdCPBaseModel
11
+ from pydantic import ConfigDict, Field
12
+
13
+
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'
23
+
24
+
25
+ class SiUiElement(AdCPBaseModel):
26
+ model_config = ConfigDict(
27
+ extra='allow',
28
+ )
29
+ data: Annotated[dict[str, Any] | None, Field(description='Component-specific data')] = None
30
+ type: Annotated[Type, Field(description='Component type')]
@@ -28,13 +28,13 @@ from __future__ import annotations
28
28
  from typing import TYPE_CHECKING, Any, Union
29
29
 
30
30
  from adcp.types.generated_poc.core.format import Assets as AssetsModel
31
- from adcp.types.generated_poc.core.format import Assets1 as Assets1Model
31
+ from adcp.types.generated_poc.core.format import Assets5 as Assets5Model
32
32
 
33
33
  if TYPE_CHECKING:
34
- from adcp.types.generated_poc.core.format import Assets, Assets1, Format
34
+ from adcp.types.generated_poc.core.format import Assets, Assets5, Format
35
35
 
36
36
  # Type alias for any format asset (individual or repeatable group)
37
- FormatAsset = Union["Assets", "Assets1"]
37
+ FormatAsset = Union["Assets", "Assets5"]
38
38
 
39
39
 
40
40
  def get_format_assets(format: Format) -> list[FormatAsset]:
@@ -93,8 +93,8 @@ def normalize_assets_required(assets_required: list[Any]) -> list[FormatAsset]:
93
93
 
94
94
  # Check if it's a repeatable group (has asset_group_id) or individual asset
95
95
  if "asset_group_id" in asset_dict:
96
- # Repeatable group - use Assets1Model
97
- normalized.append(Assets1Model(**{**asset_dict, "required": True}))
96
+ # Repeatable group - use Assets5Model
97
+ normalized.append(Assets5Model(**{**asset_dict, "required": True}))
98
98
  else:
99
99
  # Individual asset - use AssetsModel
100
100
  normalized.append(AssetsModel(**{**asset_dict, "required": True}))
@@ -87,8 +87,8 @@ class PreviewURLGenerator:
87
87
  first_render = preview.renders[0] if preview.renders else None
88
88
 
89
89
  if first_render:
90
- # PreviewRender is a RootModel, access attributes via .root
91
- render = first_render.root
90
+ # PreviewRender is a RootModel - access .root for the actual data
91
+ render = getattr(first_render, "root", first_render)
92
92
  has_url = hasattr(render, "preview_url")
93
93
  preview_url = str(render.preview_url) if has_url else None
94
94
  preview_data = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: adcp
3
- Version: 2.18.0
3
+ Version: 3.0.0
4
4
  Summary: Official Python client for the Ad Context Protocol (AdCP)
5
5
  Author-email: AdCP Community <maintainers@adcontextprotocol.org>
6
6
  License: Apache-2.0