adcp 2.19.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 (247) 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 +84 -0
  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 -14
  18. adcp/types/_generated.py +346 -52
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +196 -189
  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 +9 -9
  41. adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  42. adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  43. adcp/types/generated_poc/core/assets/daast_asset.py +19 -19
  44. adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  45. adcp/types/generated_poc/core/assets/image_asset.py +7 -7
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  47. adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  48. adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  49. adcp/types/generated_poc/core/assets/vast_asset.py +19 -19
  50. adcp/types/generated_poc/core/assets/video_asset.py +8 -8
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  52. adcp/types/generated_poc/core/async_response_data.py +3 -3
  53. adcp/types/generated_poc/core/brand_manifest.py +122 -59
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +10 -10
  55. adcp/types/generated_poc/core/context.py +2 -2
  56. adcp/types/generated_poc/core/creative_asset.py +20 -19
  57. adcp/types/generated_poc/core/creative_assignment.py +4 -4
  58. adcp/types/generated_poc/core/creative_filters.py +18 -28
  59. adcp/types/generated_poc/core/creative_manifest.py +3 -3
  60. adcp/types/generated_poc/core/creative_policy.py +5 -5
  61. adcp/types/generated_poc/core/delivery_metrics.py +33 -33
  62. adcp/types/generated_poc/core/deployment.py +21 -21
  63. adcp/types/generated_poc/core/destination.py +12 -12
  64. adcp/types/generated_poc/core/error.py +7 -7
  65. adcp/types/generated_poc/core/ext.py +2 -2
  66. adcp/types/generated_poc/core/format.py +66 -66
  67. adcp/types/generated_poc/core/format_id.py +6 -6
  68. adcp/types/generated_poc/core/frequency_cap.py +3 -3
  69. adcp/types/generated_poc/core/identifier.py +3 -3
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
  71. adcp/types/generated_poc/core/measurement.py +9 -9
  72. adcp/types/generated_poc/core/media_buy.py +8 -8
  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 +9 -9
  76. adcp/types/generated_poc/core/performance_feedback.py +19 -19
  77. adcp/types/generated_poc/core/placement.py +5 -5
  78. adcp/types/generated_poc/core/pricing_option.py +9 -15
  79. adcp/types/generated_poc/core/product.py +21 -21
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +89 -24
  82. adcp/types/generated_poc/core/promoted_offerings.py +29 -38
  83. adcp/types/generated_poc/core/promoted_products.py +3 -3
  84. adcp/types/generated_poc/core/property.py +10 -10
  85. adcp/types/generated_poc/core/property_id.py +5 -5
  86. adcp/types/generated_poc/core/property_list_ref.py +5 -5
  87. adcp/types/generated_poc/core/property_tag.py +5 -5
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  90. adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  91. adcp/types/generated_poc/core/push_notification_config.py +6 -6
  92. adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +5 -5
  95. adcp/types/generated_poc/core/signal_filters.py +6 -6
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +15 -15
  98. adcp/types/generated_poc/core/targeting.py +59 -18
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  101. adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
  102. adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
  103. adcp/types/generated_poc/creative/preview_render.py +26 -26
  104. adcp/types/generated_poc/enums/adcp_domain.py +5 -5
  105. adcp/types/generated_poc/enums/asset_content_type.py +14 -14
  106. adcp/types/generated_poc/enums/auth_scheme.py +3 -3
  107. adcp/types/generated_poc/enums/available_metric.py +10 -10
  108. adcp/types/generated_poc/enums/channels.py +21 -11
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
  110. adcp/types/generated_poc/enums/creative_action.py +6 -6
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
  112. adcp/types/generated_poc/enums/creative_sort_field.py +7 -7
  113. adcp/types/generated_poc/enums/creative_status.py +6 -5
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +12 -12
  115. adcp/types/generated_poc/enums/daast_version.py +3 -3
  116. adcp/types/generated_poc/enums/delivery_type.py +3 -3
  117. adcp/types/generated_poc/enums/dimension_unit.py +5 -5
  118. adcp/types/generated_poc/enums/feed_format.py +4 -4
  119. adcp/types/generated_poc/enums/feedback_source.py +5 -5
  120. adcp/types/generated_poc/enums/format_category.py +8 -8
  121. adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +3 -3
  125. adcp/types/generated_poc/enums/http_method.py +3 -3
  126. adcp/types/generated_poc/enums/identifier_types.py +20 -20
  127. adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
  129. adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
  130. adcp/types/generated_poc/enums/media_buy_status.py +5 -5
  131. adcp/types/generated_poc/enums/metric_type.py +9 -9
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +5 -5
  134. adcp/types/generated_poc/enums/pacing.py +4 -4
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +3 -3
  137. adcp/types/generated_poc/enums/pricing_model.py +8 -8
  138. adcp/types/generated_poc/enums/property_type.py +9 -8
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
  140. adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
  142. adcp/types/generated_poc/enums/sort_direction.py +3 -3
  143. adcp/types/generated_poc/enums/task_status.py +10 -10
  144. adcp/types/generated_poc/enums/task_type.py +12 -12
  145. adcp/types/generated_poc/enums/update_frequency.py +5 -5
  146. adcp/types/generated_poc/enums/url_asset_type.py +4 -4
  147. adcp/types/generated_poc/enums/validation_mode.py +3 -3
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +17 -17
  149. adcp/types/generated_poc/enums/vast_version.py +6 -6
  150. adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
  151. adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
  152. adcp/types/generated_poc/extensions/extension_meta.py +20 -12
  153. adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  154. adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  155. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  158. adcp/types/generated_poc/media_buy/create_media_buy_request.py +65 -37
  159. adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  160. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  162. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  163. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  164. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  165. adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
  166. adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
  167. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
  169. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  170. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  171. adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  172. adcp/types/generated_poc/media_buy/list_creatives_response.py +54 -57
  173. adcp/types/generated_poc/media_buy/package_request.py +12 -12
  174. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  175. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  177. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  180. adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  181. adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  182. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  185. adcp/types/generated_poc/media_buy/update_media_buy_request.py +28 -124
  186. adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  187. adcp/types/generated_poc/pricing_options/cpc_option.py +40 -15
  188. adcp/types/generated_poc/pricing_options/cpcv_option.py +41 -16
  189. adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
  190. adcp/types/generated_poc/pricing_options/cpp_option.py +46 -23
  191. adcp/types/generated_poc/pricing_options/cpv_option.py +45 -26
  192. adcp/types/generated_poc/pricing_options/flat_rate_option.py +53 -47
  193. adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
  194. adcp/types/generated_poc/property/base_property_source.py +16 -16
  195. adcp/types/generated_poc/property/create_property_list_request.py +5 -5
  196. adcp/types/generated_poc/property/create_property_list_response.py +4 -4
  197. adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
  198. adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
  199. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  200. adcp/types/generated_poc/property/get_property_list_request.py +6 -6
  201. adcp/types/generated_poc/property/get_property_list_response.py +12 -12
  202. adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
  203. adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
  204. adcp/types/generated_poc/property/property_error.py +11 -11
  205. adcp/types/generated_poc/property/property_feature.py +5 -5
  206. adcp/types/generated_poc/property/property_feature_definition.py +19 -19
  207. adcp/types/generated_poc/property/property_list.py +12 -12
  208. adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
  209. adcp/types/generated_poc/property/property_list_filters.py +9 -9
  210. adcp/types/generated_poc/property/update_property_list_request.py +9 -9
  211. adcp/types/generated_poc/property/update_property_list_response.py +3 -3
  212. adcp/types/generated_poc/protocol/__init__.py +3 -0
  213. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  214. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  215. adcp/types/generated_poc/protocols/adcp_extension.py +14 -17
  216. adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  217. adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  218. adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  219. adcp/types/generated_poc/signals/get_signals_response.py +16 -16
  220. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  232. adcp/utils/format_assets.py +5 -5
  233. adcp/utils/preview_cache.py +2 -2
  234. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  235. adcp-3.0.0.dist-info/RECORD +264 -0
  236. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  237. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  238. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
  239. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  240. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp/types/generated_poc/property/list_property_features_request.py +0 -25
  243. adcp/types/generated_poc/property/list_property_features_response.py +0 -24
  244. adcp-2.19.0.dist-info/RECORD +0 -220
  245. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  246. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  247. {adcp-2.19.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,102 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_capabilities.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 Commerce(AdCPBaseModel):
15
+ model_config = ConfigDict(
16
+ extra='allow',
17
+ )
18
+ acp_checkout: Annotated[
19
+ bool | None, Field(description='Supports ACP (Agentic Commerce Protocol) checkout handoff')
20
+ ] = None
21
+
22
+
23
+ class StandardEnum(Enum):
24
+ text = 'text'
25
+ link = 'link'
26
+ image = 'image'
27
+ product_card = 'product_card'
28
+ carousel = 'carousel'
29
+ action_button = 'action_button'
30
+
31
+
32
+ class Components(AdCPBaseModel):
33
+ model_config = ConfigDict(
34
+ extra='allow',
35
+ )
36
+ extensions: Annotated[
37
+ dict[str, Any] | None,
38
+ Field(description='Platform-specific extensions (chatgpt_apps_sdk, maps, forms, etc.)'),
39
+ ] = None
40
+ standard: Annotated[
41
+ list[StandardEnum] | None,
42
+ Field(description='Standard components that all SI hosts must render'),
43
+ ] = None
44
+
45
+
46
+ class Avatar(AdCPBaseModel):
47
+ model_config = ConfigDict(
48
+ extra='allow',
49
+ )
50
+ avatar_id: Annotated[str | None, Field(description='Brand avatar identifier')] = None
51
+ provider: Annotated[
52
+ str | None, Field(description='Avatar provider (d-id, heygen, synthesia, etc.)')
53
+ ] = None
54
+
55
+
56
+ class Video(AdCPBaseModel):
57
+ model_config = ConfigDict(
58
+ extra='allow',
59
+ )
60
+ formats: Annotated[
61
+ list[str] | None, Field(description='Supported video formats (mp4, webm, etc.)')
62
+ ] = None
63
+ max_duration_seconds: Annotated[int | None, Field(description='Maximum video duration')] = None
64
+
65
+
66
+ class Voice(AdCPBaseModel):
67
+ model_config = ConfigDict(
68
+ extra='allow',
69
+ )
70
+ provider: Annotated[
71
+ str | None, Field(description='TTS provider (elevenlabs, openai, etc.)')
72
+ ] = None
73
+ voice_id: Annotated[str | None, Field(description='Brand voice identifier')] = None
74
+
75
+
76
+ class Modalities(AdCPBaseModel):
77
+ model_config = ConfigDict(
78
+ extra='allow',
79
+ )
80
+ avatar: Annotated[
81
+ bool | Avatar | None, Field(description='Animated video presence with brand avatar')
82
+ ] = None
83
+ conversational: Annotated[
84
+ bool | None, Field(description='Pure text exchange - the baseline modality')
85
+ ] = True
86
+ video: Annotated[bool | Video | None, Field(description='Brand video content playback')] = None
87
+ voice: Annotated[
88
+ bool | Voice | None, Field(description='Audio-based interaction using brand voice')
89
+ ] = None
90
+
91
+
92
+ class SiCapabilities(AdCPBaseModel):
93
+ model_config = ConfigDict(
94
+ extra='allow',
95
+ )
96
+ commerce: Annotated[Commerce | None, Field(description='Commerce capabilities')] = None
97
+ components: Annotated[Components | None, Field(description='Visual components supported')] = (
98
+ None
99
+ )
100
+ modalities: Annotated[
101
+ Modalities | None, Field(description='Interaction modalities supported')
102
+ ] = None
@@ -0,0 +1,34 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_get_offering_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
+
14
+
15
+ class SiGetOfferingRequest(AdCPBaseModel):
16
+ model_config = ConfigDict(
17
+ extra='allow',
18
+ )
19
+ context: Annotated[
20
+ str | None,
21
+ Field(
22
+ description="Optional natural language context about user intent for personalized results (e.g., 'mens size 14 near Cincinnati'). Must be anonymous - no PII."
23
+ ),
24
+ ] = None
25
+ ext: ext_1.ExtensionObject | None = None
26
+ include_products: Annotated[
27
+ bool | None, Field(description='Whether to include matching products in the response')
28
+ ] = False
29
+ offering_id: Annotated[
30
+ str, Field(description='Offering identifier from promoted offerings to get details for')
31
+ ]
32
+ product_limit: Annotated[
33
+ int | None, Field(description='Maximum number of matching products to return', ge=1, le=50)
34
+ ] = 5
@@ -0,0 +1,100 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: sponsored_intelligence/si_get_offering_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 AnyUrl, AwareDatetime, ConfigDict, Field
11
+
12
+ from ..core import error
13
+ from ..core import ext as ext_1
14
+
15
+
16
+ class MatchingProduct(AdCPBaseModel):
17
+ model_config = ConfigDict(
18
+ extra='allow',
19
+ )
20
+ availability_summary: Annotated[
21
+ str | None,
22
+ Field(
23
+ description="Brief availability info (e.g., 'In stock', 'Size 14 available', '3 left')"
24
+ ),
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
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
32
+
33
+
34
+ class Offering(AdCPBaseModel):
35
+ model_config = ConfigDict(
36
+ extra='allow',
37
+ )
38
+ expires_at: Annotated[AwareDatetime | None, Field(description='When this offering expires')] = (
39
+ None
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
44
+ price_hint: Annotated[
45
+ str | None, Field(description="Price indication (e.g., 'from $199', '50% off')")
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
50
+
51
+
52
+ class SiGetOfferingResponse(AdCPBaseModel):
53
+ model_config = ConfigDict(
54
+ extra='allow',
55
+ )
56
+ alternative_offering_ids: Annotated[
57
+ list[str] | None,
58
+ Field(description='Alternative offerings to consider if this one is unavailable'),
59
+ ] = None
60
+ available: Annotated[bool, Field(description='Whether the offering is currently available')]
61
+ checked_at: Annotated[
62
+ AwareDatetime | None, Field(description='When this offering information was retrieved')
63
+ ] = None
64
+ errors: Annotated[
65
+ list[error.Error] | None, Field(description='Errors during offering lookup')
66
+ ] = None
67
+ ext: ext_1.ExtensionObject | None = None
68
+ matching_products: Annotated[
69
+ list[MatchingProduct] | None,
70
+ Field(
71
+ description='Products matching the request context. Only included if include_products was true.'
72
+ ),
73
+ ] = None
74
+ offering: Annotated[Offering | None, Field(description='Offering details')] = None
75
+ offering_token: Annotated[
76
+ str | None,
77
+ Field(
78
+ description="Token to pass to si_initiate_session for session continuity. Brand stores the full query context server-side (products shown, order, context) so they can resolve references like 'the second one' when the session starts."
79
+ ),
80
+ ] = None
81
+ total_matching: Annotated[
82
+ int | None,
83
+ Field(
84
+ description='Total number of products matching the context (may be more than returned in matching_products)',
85
+ ge=0,
86
+ ),
87
+ ] = None
88
+ ttl_seconds: Annotated[
89
+ int | None,
90
+ Field(
91
+ description='How long this offering information is valid (seconds). Host should re-fetch after TTL expires.',
92
+ ge=0,
93
+ ),
94
+ ] = None
95
+ unavailable_reason: Annotated[
96
+ str | None,
97
+ Field(
98
+ description="If not available, why (e.g., 'expired', 'sold_out', 'region_restricted')"
99
+ ),
100
+ ] = None
@@ -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')]