adcp 2.12.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 (176) hide show
  1. adcp/__init__.py +364 -0
  2. adcp/__main__.py +440 -0
  3. adcp/adagents.py +642 -0
  4. adcp/client.py +1057 -0
  5. adcp/config.py +82 -0
  6. adcp/exceptions.py +185 -0
  7. adcp/protocols/__init__.py +9 -0
  8. adcp/protocols/a2a.py +484 -0
  9. adcp/protocols/base.py +190 -0
  10. adcp/protocols/mcp.py +440 -0
  11. adcp/py.typed +0 -0
  12. adcp/simple.py +451 -0
  13. adcp/testing/__init__.py +53 -0
  14. adcp/testing/test_helpers.py +311 -0
  15. adcp/types/__init__.py +561 -0
  16. adcp/types/_generated.py +237 -0
  17. adcp/types/aliases.py +748 -0
  18. adcp/types/base.py +26 -0
  19. adcp/types/core.py +174 -0
  20. adcp/types/generated_poc/__init__.py +3 -0
  21. adcp/types/generated_poc/adagents.py +411 -0
  22. adcp/types/generated_poc/core/__init__.py +3 -0
  23. adcp/types/generated_poc/core/activation_key.py +30 -0
  24. adcp/types/generated_poc/core/assets/__init__.py +3 -0
  25. adcp/types/generated_poc/core/assets/audio_asset.py +26 -0
  26. adcp/types/generated_poc/core/assets/css_asset.py +20 -0
  27. adcp/types/generated_poc/core/assets/daast_asset.py +61 -0
  28. adcp/types/generated_poc/core/assets/html_asset.py +18 -0
  29. adcp/types/generated_poc/core/assets/image_asset.py +19 -0
  30. adcp/types/generated_poc/core/assets/javascript_asset.py +23 -0
  31. adcp/types/generated_poc/core/assets/text_asset.py +20 -0
  32. adcp/types/generated_poc/core/assets/url_asset.py +28 -0
  33. adcp/types/generated_poc/core/assets/vast_asset.py +63 -0
  34. adcp/types/generated_poc/core/assets/video_asset.py +24 -0
  35. adcp/types/generated_poc/core/assets/webhook_asset.py +53 -0
  36. adcp/types/generated_poc/core/brand_manifest.py +201 -0
  37. adcp/types/generated_poc/core/context.py +15 -0
  38. adcp/types/generated_poc/core/creative_asset.py +102 -0
  39. adcp/types/generated_poc/core/creative_assignment.py +27 -0
  40. adcp/types/generated_poc/core/creative_filters.py +86 -0
  41. adcp/types/generated_poc/core/creative_manifest.py +68 -0
  42. adcp/types/generated_poc/core/creative_policy.py +28 -0
  43. adcp/types/generated_poc/core/delivery_metrics.py +111 -0
  44. adcp/types/generated_poc/core/deployment.py +78 -0
  45. adcp/types/generated_poc/core/destination.py +43 -0
  46. adcp/types/generated_poc/core/dimensions.py +18 -0
  47. adcp/types/generated_poc/core/error.py +29 -0
  48. adcp/types/generated_poc/core/ext.py +15 -0
  49. adcp/types/generated_poc/core/format.py +260 -0
  50. adcp/types/generated_poc/core/format_id.py +50 -0
  51. adcp/types/generated_poc/core/frequency_cap.py +19 -0
  52. adcp/types/generated_poc/core/measurement.py +40 -0
  53. adcp/types/generated_poc/core/media_buy.py +40 -0
  54. adcp/types/generated_poc/core/package.py +68 -0
  55. adcp/types/generated_poc/core/performance_feedback.py +78 -0
  56. adcp/types/generated_poc/core/placement.py +37 -0
  57. adcp/types/generated_poc/core/product.py +164 -0
  58. adcp/types/generated_poc/core/product_filters.py +97 -0
  59. adcp/types/generated_poc/core/promoted_offerings.py +102 -0
  60. adcp/types/generated_poc/core/promoted_products.py +38 -0
  61. adcp/types/generated_poc/core/property.py +64 -0
  62. adcp/types/generated_poc/core/property_id.py +21 -0
  63. adcp/types/generated_poc/core/property_tag.py +21 -0
  64. adcp/types/generated_poc/core/protocol_envelope.py +61 -0
  65. adcp/types/generated_poc/core/publisher_property_selector.py +75 -0
  66. adcp/types/generated_poc/core/push_notification_config.py +51 -0
  67. adcp/types/generated_poc/core/reporting_capabilities.py +51 -0
  68. adcp/types/generated_poc/core/response.py +24 -0
  69. adcp/types/generated_poc/core/signal_filters.py +29 -0
  70. adcp/types/generated_poc/core/sub_asset.py +55 -0
  71. adcp/types/generated_poc/core/targeting.py +53 -0
  72. adcp/types/generated_poc/core/webhook_payload.py +96 -0
  73. adcp/types/generated_poc/creative/__init__.py +3 -0
  74. adcp/types/generated_poc/creative/list_creative_formats_request.py +88 -0
  75. adcp/types/generated_poc/creative/list_creative_formats_response.py +55 -0
  76. adcp/types/generated_poc/creative/preview_creative_request.py +153 -0
  77. adcp/types/generated_poc/creative/preview_creative_response.py +169 -0
  78. adcp/types/generated_poc/creative/preview_render.py +152 -0
  79. adcp/types/generated_poc/enums/__init__.py +3 -0
  80. adcp/types/generated_poc/enums/adcp_domain.py +12 -0
  81. adcp/types/generated_poc/enums/asset_content_type.py +23 -0
  82. adcp/types/generated_poc/enums/auth_scheme.py +12 -0
  83. adcp/types/generated_poc/enums/available_metric.py +19 -0
  84. adcp/types/generated_poc/enums/channels.py +19 -0
  85. adcp/types/generated_poc/enums/co_branding_requirement.py +13 -0
  86. adcp/types/generated_poc/enums/creative_action.py +15 -0
  87. adcp/types/generated_poc/enums/creative_agent_capability.py +14 -0
  88. adcp/types/generated_poc/enums/creative_sort_field.py +16 -0
  89. adcp/types/generated_poc/enums/creative_status.py +14 -0
  90. adcp/types/generated_poc/enums/daast_tracking_event.py +21 -0
  91. adcp/types/generated_poc/enums/daast_version.py +12 -0
  92. adcp/types/generated_poc/enums/delivery_type.py +12 -0
  93. adcp/types/generated_poc/enums/dimension_unit.py +14 -0
  94. adcp/types/generated_poc/enums/feed_format.py +13 -0
  95. adcp/types/generated_poc/enums/feedback_source.py +14 -0
  96. adcp/types/generated_poc/enums/format_category.py +17 -0
  97. adcp/types/generated_poc/enums/format_id_parameter.py +12 -0
  98. adcp/types/generated_poc/enums/frequency_cap_scope.py +16 -0
  99. adcp/types/generated_poc/enums/history_entry_type.py +12 -0
  100. adcp/types/generated_poc/enums/http_method.py +12 -0
  101. adcp/types/generated_poc/enums/identifier_types.py +29 -0
  102. adcp/types/generated_poc/enums/javascript_module_type.py +13 -0
  103. adcp/types/generated_poc/enums/landing_page_requirement.py +13 -0
  104. adcp/types/generated_poc/enums/markdown_flavor.py +12 -0
  105. adcp/types/generated_poc/enums/media_buy_status.py +14 -0
  106. adcp/types/generated_poc/enums/metric_type.py +18 -0
  107. adcp/types/generated_poc/enums/notification_type.py +14 -0
  108. adcp/types/generated_poc/enums/pacing.py +13 -0
  109. adcp/types/generated_poc/enums/preview_output_format.py +12 -0
  110. adcp/types/generated_poc/enums/pricing_model.py +17 -0
  111. adcp/types/generated_poc/enums/property_type.py +17 -0
  112. adcp/types/generated_poc/enums/publisher_identifier_types.py +15 -0
  113. adcp/types/generated_poc/enums/reporting_frequency.py +13 -0
  114. adcp/types/generated_poc/enums/signal_catalog_type.py +13 -0
  115. adcp/types/generated_poc/enums/sort_direction.py +12 -0
  116. adcp/types/generated_poc/enums/standard_format_ids.py +45 -0
  117. adcp/types/generated_poc/enums/task_status.py +19 -0
  118. adcp/types/generated_poc/enums/task_type.py +15 -0
  119. adcp/types/generated_poc/enums/update_frequency.py +14 -0
  120. adcp/types/generated_poc/enums/url_asset_type.py +13 -0
  121. adcp/types/generated_poc/enums/validation_mode.py +12 -0
  122. adcp/types/generated_poc/enums/vast_tracking_event.py +26 -0
  123. adcp/types/generated_poc/enums/vast_version.py +15 -0
  124. adcp/types/generated_poc/enums/webhook_response_type.py +14 -0
  125. adcp/types/generated_poc/enums/webhook_security_method.py +13 -0
  126. adcp/types/generated_poc/media_buy/__init__.py +3 -0
  127. adcp/types/generated_poc/media_buy/build_creative_request.py +41 -0
  128. adcp/types/generated_poc/media_buy/build_creative_response.py +51 -0
  129. adcp/types/generated_poc/media_buy/create_media_buy_request.py +94 -0
  130. adcp/types/generated_poc/media_buy/create_media_buy_response.py +56 -0
  131. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +47 -0
  132. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +235 -0
  133. adcp/types/generated_poc/media_buy/get_products_request.py +48 -0
  134. adcp/types/generated_poc/media_buy/get_products_response.py +28 -0
  135. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +38 -0
  136. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +84 -0
  137. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +74 -0
  138. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +56 -0
  139. adcp/types/generated_poc/media_buy/list_creatives_request.py +76 -0
  140. adcp/types/generated_poc/media_buy/list_creatives_response.py +214 -0
  141. adcp/types/generated_poc/media_buy/package_request.py +63 -0
  142. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +125 -0
  143. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +53 -0
  144. adcp/types/generated_poc/media_buy/sync_creatives_request.py +63 -0
  145. adcp/types/generated_poc/media_buy/sync_creatives_response.py +105 -0
  146. adcp/types/generated_poc/media_buy/update_media_buy_request.py +195 -0
  147. adcp/types/generated_poc/media_buy/update_media_buy_response.py +55 -0
  148. adcp/types/generated_poc/pricing_options/__init__.py +3 -0
  149. adcp/types/generated_poc/pricing_options/cpc_option.py +43 -0
  150. adcp/types/generated_poc/pricing_options/cpcv_option.py +45 -0
  151. adcp/types/generated_poc/pricing_options/cpm_auction_option.py +58 -0
  152. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +43 -0
  153. adcp/types/generated_poc/pricing_options/cpp_option.py +64 -0
  154. adcp/types/generated_poc/pricing_options/cpv_option.py +77 -0
  155. adcp/types/generated_poc/pricing_options/flat_rate_option.py +93 -0
  156. adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +61 -0
  157. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +47 -0
  158. adcp/types/generated_poc/protocols/__init__.py +3 -0
  159. adcp/types/generated_poc/protocols/adcp_extension.py +37 -0
  160. adcp/types/generated_poc/signals/__init__.py +3 -0
  161. adcp/types/generated_poc/signals/activate_signal_request.py +32 -0
  162. adcp/types/generated_poc/signals/activate_signal_response.py +51 -0
  163. adcp/types/generated_poc/signals/get_signals_request.py +53 -0
  164. adcp/types/generated_poc/signals/get_signals_response.py +59 -0
  165. adcp/utils/__init__.py +7 -0
  166. adcp/utils/operation_id.py +15 -0
  167. adcp/utils/preview_cache.py +491 -0
  168. adcp/utils/response_parser.py +171 -0
  169. adcp/validation.py +172 -0
  170. adcp-2.12.0.data/data/ADCP_VERSION +1 -0
  171. adcp-2.12.0.dist-info/METADATA +992 -0
  172. adcp-2.12.0.dist-info/RECORD +176 -0
  173. adcp-2.12.0.dist-info/WHEEL +5 -0
  174. adcp-2.12.0.dist-info/entry_points.txt +2 -0
  175. adcp-2.12.0.dist-info/licenses/LICENSE +17 -0
  176. adcp-2.12.0.dist-info/top_level.txt +1 -0
adcp/types/aliases.py ADDED
@@ -0,0 +1,748 @@
1
+ """Semantic type aliases for generated AdCP types.
2
+
3
+ This module provides user-friendly aliases for generated types where the
4
+ auto-generated names don't match user expectations from reading the spec.
5
+
6
+ The code generator (datamodel-code-generator) creates numbered suffixes for
7
+ discriminated union variants (e.g., Response1, Response2), but users expect
8
+ semantic names (e.g., SuccessResponse, ErrorResponse).
9
+
10
+ Categories of aliases:
11
+
12
+ 1. Discriminated Union Response Variants
13
+ - Success/Error cases for API responses
14
+ - Named to match the semantic meaning from the spec
15
+
16
+ 2. Preview/Render Types
17
+ - Input/Output/Request/Response variants
18
+ - Numbered types mapped to their semantic purpose
19
+
20
+ 3. Activation Keys
21
+ - Signal activation key variants
22
+
23
+ DO NOT EDIT the generated types directly - they are regenerated from schemas.
24
+ Add aliases here for any types where the generated name is unclear.
25
+
26
+ Validation:
27
+ This module will raise ImportError at import time if any of the referenced
28
+ generated types do not exist. This ensures that schema changes are caught
29
+ immediately rather than at runtime when users try to use the aliases.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ from adcp.types._generated import (
35
+ # Activation responses
36
+ ActivateSignalResponse1,
37
+ ActivateSignalResponse2,
38
+ # Activation keys
39
+ ActivationKey1,
40
+ ActivationKey2,
41
+ # Authorized agents
42
+ AuthorizedAgents,
43
+ AuthorizedAgents1,
44
+ AuthorizedAgents2,
45
+ AuthorizedAgents3,
46
+ # Build creative responses
47
+ BuildCreativeResponse1,
48
+ BuildCreativeResponse2,
49
+ # Create media buy responses
50
+ CreateMediaBuyResponse1,
51
+ CreateMediaBuyResponse2,
52
+ # DAAST assets
53
+ DaastAsset1,
54
+ DaastAsset2,
55
+ # Deployment types
56
+ Deployment1,
57
+ Deployment2,
58
+ # Destination types
59
+ Destination1,
60
+ Destination2,
61
+ # Preview creative requests
62
+ PreviewCreativeRequest1,
63
+ PreviewCreativeRequest2,
64
+ # Preview creative responses
65
+ PreviewCreativeResponse1,
66
+ PreviewCreativeResponse2,
67
+ # Preview renders
68
+ PreviewRender1,
69
+ PreviewRender2,
70
+ PreviewRender3,
71
+ # Publisher properties types
72
+ PropertyId,
73
+ PropertyTag,
74
+ # Performance feedback responses
75
+ ProvidePerformanceFeedbackResponse1,
76
+ ProvidePerformanceFeedbackResponse2,
77
+ # SubAssets
78
+ SubAsset1,
79
+ SubAsset2,
80
+ # Sync creatives responses
81
+ SyncCreativesResponse1,
82
+ SyncCreativesResponse2,
83
+ # Update media buy requests
84
+ UpdateMediaBuyRequest1,
85
+ UpdateMediaBuyRequest2,
86
+ # Update media buy responses
87
+ UpdateMediaBuyResponse1,
88
+ UpdateMediaBuyResponse2,
89
+ # VAST assets
90
+ VastAsset1,
91
+ VastAsset2,
92
+ )
93
+ from adcp.types._generated import (
94
+ PublisherPropertySelector1 as PublisherPropertiesInternal,
95
+ )
96
+ from adcp.types._generated import (
97
+ PublisherPropertySelector2 as PublisherPropertiesByIdInternal,
98
+ )
99
+ from adcp.types._generated import (
100
+ PublisherPropertySelector3 as PublisherPropertiesByTagInternal,
101
+ )
102
+
103
+ # Note: Package collision resolved by PR #223
104
+ # Both create_media_buy and update_media_buy now return full Package objects
105
+ # No more separate reference type needed
106
+ # Import Package from _generated (still uses qualified name for internal reasons)
107
+ from adcp.types._generated import _PackageFromPackage as Package
108
+
109
+ # ============================================================================
110
+ # RESPONSE TYPE ALIASES - Success/Error Discriminated Unions
111
+ # ============================================================================
112
+ # These are atomic operations where the response is EITHER success OR error,
113
+ # never both. The numbered suffixes from the generator don't convey this
114
+ # critical semantic distinction.
115
+
116
+ # Activate Signal Response Variants
117
+ ActivateSignalSuccessResponse = ActivateSignalResponse1
118
+ """Success response - signal activation succeeded."""
119
+
120
+ ActivateSignalErrorResponse = ActivateSignalResponse2
121
+ """Error response - signal activation failed."""
122
+
123
+ # Build Creative Response Variants
124
+ BuildCreativeSuccessResponse = BuildCreativeResponse1
125
+ """Success response - creative built successfully, manifest returned."""
126
+
127
+ BuildCreativeErrorResponse = BuildCreativeResponse2
128
+ """Error response - creative build failed, no manifest created."""
129
+
130
+ # Create Media Buy Response Variants
131
+ CreateMediaBuySuccessResponse = CreateMediaBuyResponse1
132
+ """Success response - media buy created successfully with media_buy_id."""
133
+
134
+ CreateMediaBuyErrorResponse = CreateMediaBuyResponse2
135
+ """Error response - media buy creation failed, no media buy created."""
136
+
137
+ # Performance Feedback Response Variants
138
+ ProvidePerformanceFeedbackSuccessResponse = ProvidePerformanceFeedbackResponse1
139
+ """Success response - performance feedback accepted."""
140
+
141
+ ProvidePerformanceFeedbackErrorResponse = ProvidePerformanceFeedbackResponse2
142
+ """Error response - performance feedback rejected."""
143
+
144
+ # Sync Creatives Response Variants
145
+ SyncCreativesSuccessResponse = SyncCreativesResponse1
146
+ """Success response - sync operation processed creatives."""
147
+
148
+ SyncCreativesErrorResponse = SyncCreativesResponse2
149
+ """Error response - sync operation failed."""
150
+
151
+ # Update Media Buy Response Variants
152
+ UpdateMediaBuySuccessResponse = UpdateMediaBuyResponse1
153
+ """Success response - media buy updated successfully."""
154
+
155
+ UpdateMediaBuyErrorResponse = UpdateMediaBuyResponse2
156
+ """Error response - media buy update failed, no changes applied."""
157
+
158
+ # ============================================================================
159
+ # REQUEST TYPE ALIASES - Operation Variants
160
+ # ============================================================================
161
+
162
+ # Preview Creative Request Variants
163
+ PreviewCreativeFormatRequest = PreviewCreativeRequest1
164
+ """Preview request using format_id to identify creative format."""
165
+
166
+ PreviewCreativeManifestRequest = PreviewCreativeRequest2
167
+ """Preview request using creative_manifest_url to identify creative."""
168
+
169
+ # Update Media Buy Request Variants
170
+ UpdateMediaBuyPackagesRequest = UpdateMediaBuyRequest1
171
+ """Update request modifying packages in the media buy."""
172
+
173
+ UpdateMediaBuyPropertiesRequest = UpdateMediaBuyRequest2
174
+ """Update request modifying media buy properties (not packages)."""
175
+
176
+ # ============================================================================
177
+ # ACTIVATION KEY ALIASES
178
+ # ============================================================================
179
+
180
+ PropertyIdActivationKey = ActivationKey1
181
+ """Activation key using property_id for identification."""
182
+
183
+ PropertyTagActivationKey = ActivationKey2
184
+ """Activation key using property_tags for identification."""
185
+
186
+ # ============================================================================
187
+ # PREVIEW/RENDER TYPE ALIASES
188
+ # ============================================================================
189
+
190
+ # Preview Creative Response Variants
191
+ PreviewCreativeStaticResponse = PreviewCreativeResponse1
192
+ """Preview response with static renders (image/HTML snapshots)."""
193
+
194
+ PreviewCreativeInteractiveResponse = PreviewCreativeResponse2
195
+ """Preview response with interactive renders (iframe embedding)."""
196
+
197
+ # Preview Render Variants (discriminated by output_format)
198
+ UrlPreviewRender = PreviewRender1
199
+ """Preview render with output_format='url' - provides preview_url for iframe embedding."""
200
+
201
+ HtmlPreviewRender = PreviewRender2
202
+ """Preview render with output_format='html' - provides preview_html for direct embedding."""
203
+
204
+ BothPreviewRender = PreviewRender3
205
+ """Preview render with output_format='both' - provides both preview_url and preview_html."""
206
+
207
+ # ============================================================================
208
+ # ASSET TYPE ALIASES - Delivery & Kind Discriminated Unions
209
+ # ============================================================================
210
+
211
+ # VAST Asset Variants (discriminated by delivery_type)
212
+ UrlVastAsset = VastAsset1
213
+ """VAST asset delivered via URL endpoint - delivery_type='url'."""
214
+
215
+ InlineVastAsset = VastAsset2
216
+ """VAST asset with inline XML content - delivery_type='inline'."""
217
+
218
+ # DAAST Asset Variants (discriminated by delivery_type)
219
+ UrlDaastAsset = DaastAsset1
220
+ """DAAST asset delivered via URL endpoint - delivery_type='url'."""
221
+
222
+ InlineDaastAsset = DaastAsset2
223
+ """DAAST asset with inline XML content - delivery_type='inline'."""
224
+
225
+ # SubAsset Variants (discriminated by asset_kind)
226
+ MediaSubAsset = SubAsset1
227
+ """SubAsset for media content (images, videos) - asset_kind='media', provides content_uri."""
228
+
229
+ TextSubAsset = SubAsset2
230
+ """SubAsset for text content (headlines, body text) - asset_kind='text', provides content."""
231
+
232
+ # ============================================================================
233
+ # PACKAGE TYPE ALIASES - Resolving Type Name Collisions
234
+ # ============================================================================
235
+ # The AdCP schemas define two genuinely different types both named "Package":
236
+ #
237
+ # 1. Full Package (from package.json schema):
238
+ # - Complete operational package with all fields (budget, pricing_option_id, etc.)
239
+ # - Used in MediaBuy, update operations, and package management
240
+ # - Has 12+ fields for full package configuration
241
+ #
242
+ # Package collision resolved by PR #223:
243
+ # - create-media-buy-response.json now returns full Package objects (not minimal refs)
244
+ # - update-media-buy-response.json already returned full Package objects
245
+ # - Both operations return identical Package structures
246
+ # - Single Package type imported above, no aliases needed
247
+
248
+ # ============================================================================
249
+ # PUBLISHER PROPERTIES ALIASES - Selection Type Discriminated Unions
250
+ # ============================================================================
251
+ # The AdCP schemas define PublisherProperties as a discriminated union with
252
+ # three variants based on the `selection_type` field:
253
+ #
254
+ # 1. All Properties (selection_type='all'):
255
+ # - Includes all properties from the publisher
256
+ # - Only requires publisher_domain
257
+ #
258
+ # 2. By ID (selection_type='by_id'):
259
+ # - Specific properties selected by property_id
260
+ # - Requires publisher_domain + property_ids array
261
+ #
262
+ # 3. By Tag (selection_type='by_tag'):
263
+ # - Properties selected by tags
264
+ # - Requires publisher_domain + property_tags array
265
+ #
266
+ # These semantic aliases match the discriminator values and make code more
267
+ # readable when constructing or pattern-matching publisher properties.
268
+
269
+ PublisherPropertiesAll = PublisherPropertiesInternal
270
+ """Publisher properties covering all properties from the publisher.
271
+
272
+ This variant uses selection_type='all' and includes all properties listed
273
+ in the publisher's adagents.json file.
274
+
275
+ Fields:
276
+ - publisher_domain: Domain where adagents.json is hosted
277
+ - selection_type: Literal['all']
278
+
279
+ Example:
280
+ ```python
281
+ from adcp import PublisherPropertiesAll
282
+
283
+ props = PublisherPropertiesAll(
284
+ publisher_domain="example.com",
285
+ selection_type="all"
286
+ )
287
+ ```
288
+ """
289
+
290
+ PublisherPropertiesById = PublisherPropertiesByIdInternal
291
+ """Publisher properties selected by specific property IDs.
292
+
293
+ This variant uses selection_type='by_id' and specifies an explicit list
294
+ of property IDs from the publisher's adagents.json file.
295
+
296
+ Fields:
297
+ - publisher_domain: Domain where adagents.json is hosted
298
+ - selection_type: Literal['by_id']
299
+ - property_ids: List of PropertyId (non-empty)
300
+
301
+ Example:
302
+ ```python
303
+ from adcp import PublisherPropertiesById, PropertyId
304
+
305
+ props = PublisherPropertiesById(
306
+ publisher_domain="example.com",
307
+ selection_type="by_id",
308
+ property_ids=[PropertyId("homepage"), PropertyId("sports_section")]
309
+ )
310
+ ```
311
+ """
312
+
313
+ PublisherPropertiesByTag = PublisherPropertiesByTagInternal
314
+ """Publisher properties selected by tags.
315
+
316
+ This variant uses selection_type='by_tag' and specifies property tags.
317
+ The product covers all properties in the publisher's adagents.json that
318
+ have these tags.
319
+
320
+ Fields:
321
+ - publisher_domain: Domain where adagents.json is hosted
322
+ - selection_type: Literal['by_tag']
323
+ - property_tags: List of PropertyTag (non-empty)
324
+
325
+ Example:
326
+ ```python
327
+ from adcp import PublisherPropertiesByTag, PropertyTag
328
+
329
+ props = PublisherPropertiesByTag(
330
+ publisher_domain="example.com",
331
+ selection_type="by_tag",
332
+ property_tags=[PropertyTag("premium"), PropertyTag("video")]
333
+ )
334
+ ```
335
+ """
336
+
337
+ # ============================================================================
338
+ # DEPLOYMENT & DESTINATION ALIASES - Signal Deployment Type Discriminated Unions
339
+ # ============================================================================
340
+ # The AdCP schemas define Deployment and Destination as discriminated unions
341
+ # with two variants based on the `type` field:
342
+ #
343
+ # Deployment (where a signal is activated):
344
+ # - Platform (type='platform'): DSP platform with platform ID
345
+ # - Agent (type='agent'): Sales agent with agent URL
346
+ #
347
+ # Destination (where a signal can be activated):
348
+ # - Platform (type='platform'): Target DSP platform
349
+ # - Agent (type='agent'): Target sales agent
350
+ #
351
+ # These are used in GetSignalsResponse to describe signal availability and
352
+ # activation status across different advertising platforms and agents.
353
+
354
+ PlatformDeployment = Deployment1
355
+ """Signal deployment to a DSP platform.
356
+
357
+ This variant uses type='platform' for platform-based signal deployments
358
+ like The Trade Desk, Amazon DSP, etc.
359
+
360
+ Fields:
361
+ - type: Literal['platform']
362
+ - platform: Platform identifier (e.g., 'the-trade-desk')
363
+ - account: Optional account identifier
364
+ - is_live: Whether signal is currently active
365
+ - deployed_at: Activation timestamp if live
366
+ - activation_key: Targeting key if live and accessible
367
+ - estimated_activation_duration_minutes: Time to complete activation
368
+
369
+ Example:
370
+ ```python
371
+ from adcp import PlatformDeployment
372
+
373
+ deployment = PlatformDeployment(
374
+ type="platform",
375
+ platform="the-trade-desk",
376
+ account="advertiser-123",
377
+ is_live=True,
378
+ deployed_at=datetime.now(timezone.utc)
379
+ )
380
+ ```
381
+ """
382
+
383
+ AgentDeployment = Deployment2
384
+ """Signal deployment to a sales agent.
385
+
386
+ This variant uses type='agent' for agent-based signal deployments
387
+ using agent URLs.
388
+
389
+ Fields:
390
+ - type: Literal['agent']
391
+ - agent_url: URL identifying the destination agent
392
+ - account: Optional account identifier
393
+ - is_live: Whether signal is currently active
394
+ - deployed_at: Activation timestamp if live
395
+ - activation_key: Targeting key if live and accessible
396
+ - estimated_activation_duration_minutes: Time to complete activation
397
+
398
+ Example:
399
+ ```python
400
+ from adcp import AgentDeployment
401
+
402
+ deployment = AgentDeployment(
403
+ type="agent",
404
+ agent_url="https://agent.example.com",
405
+ is_live=False,
406
+ estimated_activation_duration_minutes=30.0
407
+ )
408
+ ```
409
+ """
410
+
411
+ PlatformDestination = Destination1
412
+ """Available signal destination on a DSP platform.
413
+
414
+ This variant uses type='platform' for platform-based signal destinations.
415
+
416
+ Fields:
417
+ - type: Literal['platform']
418
+ - platform: Platform identifier (e.g., 'the-trade-desk', 'amazon-dsp')
419
+ - account: Optional account identifier on the platform
420
+
421
+ Example:
422
+ ```python
423
+ from adcp import PlatformDestination
424
+
425
+ destination = PlatformDestination(
426
+ type="platform",
427
+ platform="the-trade-desk",
428
+ account="advertiser-123"
429
+ )
430
+ ```
431
+ """
432
+
433
+ AgentDestination = Destination2
434
+ """Available signal destination via a sales agent.
435
+
436
+ This variant uses type='agent' for agent-based signal destinations.
437
+
438
+ Fields:
439
+ - type: Literal['agent']
440
+ - agent_url: URL identifying the destination agent
441
+ - account: Optional account identifier on the agent
442
+
443
+ Example:
444
+ ```python
445
+ from adcp import AgentDestination
446
+
447
+ destination = AgentDestination(
448
+ type="agent",
449
+ agent_url="https://agent.example.com",
450
+ account="partner-456"
451
+ )
452
+ ```
453
+ """
454
+
455
+ # ============================================================================
456
+ # AUTHORIZED AGENTS ALIASES - Authorization Type Discriminated Unions
457
+ # ============================================================================
458
+ # The AdCP adagents.json schema defines AuthorizedAgents as a discriminated
459
+ # union with four variants based on the `authorization_type` field:
460
+ #
461
+ # 1. Property IDs (authorization_type='property_ids'):
462
+ # - Agent authorized for specific property IDs
463
+ # - Requires property_ids array
464
+ #
465
+ # 2. Property Tags (authorization_type='property_tags'):
466
+ # - Agent authorized for properties matching tags
467
+ # - Requires property_tags array
468
+ #
469
+ # 3. Inline Properties (authorization_type='inline_properties'):
470
+ # - Agent authorized with inline property definitions
471
+ # - Requires properties array with full Property objects
472
+ #
473
+ # 4. Publisher Properties (authorization_type='publisher_properties'):
474
+ # - Agent authorized for properties from other publisher domains
475
+ # - Requires publisher_properties array
476
+ #
477
+ # These define which sales agents are authorized to sell inventory and which
478
+ # properties they can access.
479
+
480
+ AuthorizedAgentsByPropertyId = AuthorizedAgents
481
+ """Authorized agent with specific property IDs.
482
+
483
+ This variant uses authorization_type='property_ids' for agents authorized
484
+ to sell specific properties identified by their IDs.
485
+
486
+ Fields:
487
+ - authorization_type: Literal['property_ids']
488
+ - authorized_for: Human-readable description
489
+ - property_ids: List of PropertyId (non-empty)
490
+ - url: Agent's API endpoint URL
491
+
492
+ Example:
493
+ ```python
494
+ from adcp.types.aliases import AuthorizedAgentsByPropertyId, PropertyId
495
+
496
+ agent = AuthorizedAgentsByPropertyId(
497
+ authorization_type="property_ids",
498
+ authorized_for="Premium display inventory",
499
+ property_ids=[PropertyId("homepage"), PropertyId("sports")],
500
+ url="https://agent.example.com"
501
+ )
502
+ ```
503
+ """
504
+
505
+ AuthorizedAgentsByPropertyTag = AuthorizedAgents1
506
+ """Authorized agent with property tags.
507
+
508
+ This variant uses authorization_type='property_tags' for agents authorized
509
+ to sell properties identified by matching tags.
510
+
511
+ Fields:
512
+ - authorization_type: Literal['property_tags']
513
+ - authorized_for: Human-readable description
514
+ - property_tags: List of PropertyTag (non-empty)
515
+ - url: Agent's API endpoint URL
516
+
517
+ Example:
518
+ ```python
519
+ from adcp.types.aliases import AuthorizedAgentsByPropertyTag, PropertyTag
520
+
521
+ agent = AuthorizedAgentsByPropertyTag(
522
+ authorization_type="property_tags",
523
+ authorized_for="Video inventory",
524
+ property_tags=[PropertyTag("video"), PropertyTag("premium")],
525
+ url="https://agent.example.com"
526
+ )
527
+ ```
528
+ """
529
+
530
+ AuthorizedAgentsByInlineProperties = AuthorizedAgents2
531
+ """Authorized agent with inline property definitions.
532
+
533
+ This variant uses authorization_type='inline_properties' for agents with
534
+ inline Property objects rather than references to the top-level properties array.
535
+
536
+ Fields:
537
+ - authorization_type: Literal['inline_properties']
538
+ - authorized_for: Human-readable description
539
+ - properties: List of Property objects (non-empty)
540
+ - url: Agent's API endpoint URL
541
+
542
+ Example:
543
+ ```python
544
+ from adcp.types.aliases import AuthorizedAgentsByInlineProperties
545
+ from adcp.types.stable import Property
546
+
547
+ agent = AuthorizedAgentsByInlineProperties(
548
+ authorization_type="inline_properties",
549
+ authorized_for="Custom inventory bundle",
550
+ properties=[...], # Full Property objects
551
+ url="https://agent.example.com"
552
+ )
553
+ ```
554
+ """
555
+
556
+ AuthorizedAgentsByPublisherProperties = AuthorizedAgents3
557
+ """Authorized agent for properties from other publishers.
558
+
559
+ This variant uses authorization_type='publisher_properties' for agents
560
+ authorized to sell inventory from other publisher domains.
561
+
562
+ Fields:
563
+ - authorization_type: Literal['publisher_properties']
564
+ - authorized_for: Human-readable description
565
+ - publisher_properties: List of PublisherPropertySelector variants (non-empty)
566
+ - url: Agent's API endpoint URL
567
+
568
+ Example:
569
+ ```python
570
+ from adcp.types.aliases import (
571
+ AuthorizedAgentsByPublisherProperties,
572
+ PublisherPropertiesAll
573
+ )
574
+
575
+ agent = AuthorizedAgentsByPublisherProperties(
576
+ authorization_type="publisher_properties",
577
+ authorized_for="Network inventory across publishers",
578
+ publisher_properties=[
579
+ PublisherPropertiesAll(
580
+ publisher_domain="publisher1.com",
581
+ selection_type="all"
582
+ )
583
+ ],
584
+ url="https://agent.example.com"
585
+ )
586
+ ```
587
+ """
588
+
589
+ # ============================================================================
590
+ # UNION TYPE ALIASES - For Type Hints and Pattern Matching
591
+ # ============================================================================
592
+ # These union aliases provide convenient types for function signatures,
593
+ # type hints, and pattern matching without having to manually construct
594
+ # the union each time.
595
+
596
+ # Deployment union (for signals)
597
+ Deployment = PlatformDeployment | AgentDeployment
598
+ """Union type for all deployment variants.
599
+
600
+ Use this for type hints when a function accepts any deployment type:
601
+
602
+ Example:
603
+ ```python
604
+ def process_deployment(deployment: Deployment) -> None:
605
+ if isinstance(deployment, PlatformDeployment):
606
+ print(f"Platform: {deployment.platform}")
607
+ elif isinstance(deployment, AgentDeployment):
608
+ print(f"Agent: {deployment.agent_url}")
609
+ ```
610
+ """
611
+
612
+ # Destination union (for signals)
613
+ Destination = PlatformDestination | AgentDestination
614
+ """Union type for all destination variants.
615
+
616
+ Use this for type hints when a function accepts any destination type:
617
+
618
+ Example:
619
+ ```python
620
+ def format_destination(dest: Destination) -> str:
621
+ if isinstance(dest, PlatformDestination):
622
+ return f"Platform: {dest.platform}"
623
+ elif isinstance(dest, AgentDestination):
624
+ return f"Agent: {dest.agent_url}"
625
+ ```
626
+ """
627
+
628
+ # Authorized agent union (for adagents.json)
629
+ AuthorizedAgent = (
630
+ AuthorizedAgentsByPropertyId
631
+ | AuthorizedAgentsByPropertyTag
632
+ | AuthorizedAgentsByInlineProperties
633
+ | AuthorizedAgentsByPublisherProperties
634
+ )
635
+ """Union type for all authorized agent variants.
636
+
637
+ Use this for type hints when processing agents from adagents.json:
638
+
639
+ Example:
640
+ ```python
641
+ def validate_agent(agent: AuthorizedAgent) -> bool:
642
+ match agent.authorization_type:
643
+ case "property_ids":
644
+ return len(agent.property_ids) > 0
645
+ case "property_tags":
646
+ return len(agent.property_tags) > 0
647
+ case "inline_properties":
648
+ return len(agent.properties) > 0
649
+ case "publisher_properties":
650
+ return len(agent.publisher_properties) > 0
651
+ ```
652
+ """
653
+
654
+ # Publisher properties union (for product requests)
655
+ PublisherProperties = (
656
+ PublisherPropertiesAll | PublisherPropertiesById | PublisherPropertiesByTag
657
+ )
658
+ """Union type for all publisher properties variants.
659
+
660
+ Use this for type hints in product filtering:
661
+
662
+ Example:
663
+ ```python
664
+ def filter_products(props: PublisherProperties) -> None:
665
+ match props.selection_type:
666
+ case "all":
667
+ print("All properties from publisher")
668
+ case "by_id":
669
+ print(f"Properties: {props.property_ids}")
670
+ case "by_tag":
671
+ print(f"Tags: {props.property_tags}")
672
+ ```
673
+ """
674
+
675
+ # ============================================================================
676
+ # EXPORTS
677
+ # ============================================================================
678
+
679
+ __all__ = [
680
+ # Activation responses
681
+ "ActivateSignalSuccessResponse",
682
+ "ActivateSignalErrorResponse",
683
+ # Activation keys
684
+ "PropertyIdActivationKey",
685
+ "PropertyTagActivationKey",
686
+ # Asset type aliases
687
+ "BothPreviewRender",
688
+ "HtmlPreviewRender",
689
+ "InlineDaastAsset",
690
+ "InlineVastAsset",
691
+ "MediaSubAsset",
692
+ "TextSubAsset",
693
+ "UrlDaastAsset",
694
+ "UrlPreviewRender",
695
+ "UrlVastAsset",
696
+ # Authorized agent variants
697
+ "AuthorizedAgentsByPropertyId",
698
+ "AuthorizedAgentsByPropertyTag",
699
+ "AuthorizedAgentsByInlineProperties",
700
+ "AuthorizedAgentsByPublisherProperties",
701
+ # Authorized agent union
702
+ "AuthorizedAgent",
703
+ # Build creative responses
704
+ "BuildCreativeSuccessResponse",
705
+ "BuildCreativeErrorResponse",
706
+ # Create media buy responses
707
+ "CreateMediaBuySuccessResponse",
708
+ "CreateMediaBuyErrorResponse",
709
+ # Performance feedback responses
710
+ "ProvidePerformanceFeedbackSuccessResponse",
711
+ "ProvidePerformanceFeedbackErrorResponse",
712
+ # Preview creative requests
713
+ "PreviewCreativeFormatRequest",
714
+ "PreviewCreativeManifestRequest",
715
+ # Preview creative responses
716
+ "PreviewCreativeStaticResponse",
717
+ "PreviewCreativeInteractiveResponse",
718
+ # Sync creatives responses
719
+ "SyncCreativesSuccessResponse",
720
+ "SyncCreativesErrorResponse",
721
+ # Update media buy requests
722
+ "UpdateMediaBuyPackagesRequest",
723
+ "UpdateMediaBuyPropertiesRequest",
724
+ # Update media buy responses
725
+ "UpdateMediaBuySuccessResponse",
726
+ "UpdateMediaBuyErrorResponse",
727
+ # Package type aliases
728
+ "Package",
729
+ # Publisher properties types
730
+ "PropertyId",
731
+ "PropertyTag",
732
+ # Publisher properties variants
733
+ "PublisherPropertiesAll",
734
+ "PublisherPropertiesById",
735
+ "PublisherPropertiesByTag",
736
+ # Publisher properties union
737
+ "PublisherProperties",
738
+ # Deployment variants
739
+ "PlatformDeployment",
740
+ "AgentDeployment",
741
+ # Deployment union
742
+ "Deployment",
743
+ # Destination variants
744
+ "PlatformDestination",
745
+ "AgentDestination",
746
+ # Destination union
747
+ "Destination",
748
+ ]