adcp 2.2.0__py3-none-any.whl → 2.4.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 (108) hide show
  1. adcp/__init__.py +5 -1
  2. adcp/adagents.py +122 -0
  3. adcp/types/generated.py +36 -531
  4. adcp/types/generated_poc/__init__.py +1 -1
  5. adcp/types/generated_poc/activate_signal_request.py +5 -5
  6. adcp/types/generated_poc/activate_signal_response.py +9 -9
  7. adcp/types/generated_poc/activation_key.py +8 -8
  8. adcp/types/generated_poc/adagents.py +46 -46
  9. adcp/types/generated_poc/asset_type.py +19 -19
  10. adcp/types/generated_poc/audio_asset.py +6 -6
  11. adcp/types/generated_poc/brand_manifest.py +73 -73
  12. adcp/types/generated_poc/build_creative_request.py +6 -6
  13. adcp/types/generated_poc/build_creative_response.py +9 -9
  14. adcp/types/generated_poc/channels.py +10 -10
  15. adcp/types/generated_poc/cpc_option.py +12 -8
  16. adcp/types/generated_poc/cpcv_option.py +12 -8
  17. adcp/types/generated_poc/cpm_auction_option.py +17 -13
  18. adcp/types/generated_poc/cpm_fixed_option.py +12 -8
  19. adcp/types/generated_poc/cpp_option.py +17 -13
  20. adcp/types/generated_poc/cpv_option.py +16 -12
  21. adcp/types/generated_poc/create_media_buy_request.py +29 -29
  22. adcp/types/generated_poc/create_media_buy_response.py +11 -11
  23. adcp/types/generated_poc/creative_asset.py +13 -13
  24. adcp/types/generated_poc/creative_assignment.py +4 -4
  25. adcp/types/generated_poc/creative_manifest.py +4 -4
  26. adcp/types/generated_poc/creative_policy.py +11 -11
  27. adcp/types/generated_poc/creative_status.py +5 -5
  28. adcp/types/generated_poc/css_asset.py +3 -3
  29. adcp/types/generated_poc/daast_asset.py +30 -30
  30. adcp/types/generated_poc/delivery_metrics.py +33 -33
  31. adcp/types/generated_poc/delivery_type.py +3 -3
  32. adcp/types/generated_poc/deployment.py +21 -21
  33. adcp/types/generated_poc/destination.py +10 -10
  34. adcp/types/generated_poc/error.py +7 -7
  35. adcp/types/generated_poc/flat_rate_option.py +16 -16
  36. adcp/types/generated_poc/format.py +70 -70
  37. adcp/types/generated_poc/format_id.py +3 -3
  38. adcp/types/generated_poc/frequency_cap.py +3 -3
  39. adcp/types/generated_poc/frequency_cap_scope.py +4 -4
  40. adcp/types/generated_poc/get_media_buy_delivery_request.py +21 -21
  41. adcp/types/generated_poc/get_media_buy_delivery_response.py +46 -46
  42. adcp/types/generated_poc/get_products_request.py +23 -23
  43. adcp/types/generated_poc/get_products_response.py +5 -5
  44. adcp/types/generated_poc/get_signals_request.py +19 -19
  45. adcp/types/generated_poc/get_signals_response.py +20 -20
  46. adcp/types/generated_poc/html_asset.py +3 -3
  47. adcp/types/generated_poc/identifier_types.py +20 -20
  48. adcp/types/generated_poc/image_asset.py +7 -7
  49. adcp/types/generated_poc/javascript_asset.py +7 -7
  50. adcp/types/generated_poc/list_authorized_properties_request.py +5 -5
  51. adcp/types/generated_poc/list_authorized_properties_response.py +9 -9
  52. adcp/types/generated_poc/list_creative_formats_request.py +22 -22
  53. adcp/types/generated_poc/list_creative_formats_response.py +11 -11
  54. adcp/types/generated_poc/list_creatives_request.py +51 -51
  55. adcp/types/generated_poc/list_creatives_response.py +61 -61
  56. adcp/types/generated_poc/markdown_asset.py +7 -7
  57. adcp/types/generated_poc/measurement.py +9 -9
  58. adcp/types/generated_poc/media_buy.py +8 -8
  59. adcp/types/generated_poc/media_buy_status.py +5 -5
  60. adcp/types/generated_poc/pacing.py +4 -4
  61. adcp/types/generated_poc/package.py +8 -8
  62. adcp/types/generated_poc/package_request.py +7 -7
  63. adcp/types/generated_poc/package_status.py +5 -5
  64. adcp/types/generated_poc/performance_feedback.py +31 -31
  65. adcp/types/generated_poc/placement.py +4 -4
  66. adcp/types/generated_poc/preview_creative_request.py +28 -28
  67. adcp/types/generated_poc/preview_creative_response.py +31 -31
  68. adcp/types/generated_poc/preview_render.py +36 -28
  69. adcp/types/generated_poc/pricing_model.py +8 -8
  70. adcp/types/generated_poc/product.py +32 -31
  71. adcp/types/generated_poc/promoted_offerings.py +29 -29
  72. adcp/types/generated_poc/promoted_products.py +3 -3
  73. adcp/types/generated_poc/property.py +18 -18
  74. adcp/types/generated_poc/protocol_envelope.py +9 -9
  75. adcp/types/generated_poc/provide_performance_feedback_request.py +24 -24
  76. adcp/types/generated_poc/provide_performance_feedback_response.py +9 -9
  77. adcp/types/generated_poc/publisher_identifier_types.py +6 -6
  78. adcp/types/generated_poc/push_notification_config.py +9 -9
  79. adcp/types/generated_poc/reporting_capabilities.py +21 -21
  80. adcp/types/generated_poc/response.py +5 -5
  81. adcp/types/generated_poc/standard_format_ids.py +36 -36
  82. adcp/types/generated_poc/sub_asset.py +13 -13
  83. adcp/types/generated_poc/sync_creatives_request.py +11 -11
  84. adcp/types/generated_poc/sync_creatives_response.py +23 -23
  85. adcp/types/generated_poc/targeting.py +9 -9
  86. adcp/types/generated_poc/task_status.py +10 -10
  87. adcp/types/generated_poc/task_type.py +6 -6
  88. adcp/types/generated_poc/tasks_get_request.py +5 -5
  89. adcp/types/generated_poc/tasks_get_response.py +35 -35
  90. adcp/types/generated_poc/tasks_list_request.py +36 -36
  91. adcp/types/generated_poc/tasks_list_response.py +35 -35
  92. adcp/types/generated_poc/text_asset.py +3 -3
  93. adcp/types/generated_poc/update_media_buy_request.py +27 -27
  94. adcp/types/generated_poc/update_media_buy_response.py +11 -11
  95. adcp/types/generated_poc/url_asset.py +7 -7
  96. adcp/types/generated_poc/vast_asset.py +38 -38
  97. adcp/types/generated_poc/vcpm_auction_option.py +17 -13
  98. adcp/types/generated_poc/vcpm_fixed_option.py +12 -8
  99. adcp/types/generated_poc/video_asset.py +8 -8
  100. adcp/types/generated_poc/webhook_asset.py +19 -19
  101. adcp/types/generated_poc/webhook_payload.py +18 -18
  102. {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/METADATA +38 -2
  103. adcp-2.4.0.dist-info/RECORD +132 -0
  104. adcp-2.2.0.dist-info/RECORD +0 -132
  105. {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/WHEEL +0 -0
  106. {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/entry_points.txt +0 -0
  107. {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/licenses/LICENSE +0 -0
  108. {adcp-2.2.0.dist-info → adcp-2.4.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pricing-model.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -8,10 +8,10 @@ from enum import Enum
8
8
 
9
9
 
10
10
  class PricingModel(Enum):
11
- cpm = "cpm"
12
- vcpm = "vcpm"
13
- cpc = "cpc"
14
- cpcv = "cpcv"
15
- cpv = "cpv"
16
- cpp = "cpp"
17
- flat_rate = "flat_rate"
11
+ cpm = 'cpm'
12
+ vcpm = 'vcpm'
13
+ cpc = 'cpc'
14
+ cpcv = 'cpcv'
15
+ cpv = 'cpv'
16
+ cpp = 'cpp'
17
+ flat_rate = 'flat_rate'
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: product.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -37,45 +37,45 @@ class DeliveryMeasurement(AdCPBaseModel):
37
37
 
38
38
  class ProductCard(AdCPBaseModel):
39
39
  model_config = ConfigDict(
40
- extra="forbid",
40
+ extra='forbid',
41
41
  )
42
42
  format_id: Annotated[
43
43
  format_id_1.FormatId,
44
44
  Field(
45
- description="Creative format defining the card layout (typically product_card_standard)"
45
+ description='Creative format defining the card layout (typically product_card_standard)'
46
46
  ),
47
47
  ]
48
48
  manifest: Annotated[
49
49
  dict[str, Any],
50
- Field(description="Asset manifest for rendering the card, structure defined by the format"),
50
+ Field(description='Asset manifest for rendering the card, structure defined by the format'),
51
51
  ]
52
52
 
53
53
 
54
54
  class ProductCardDetailed(AdCPBaseModel):
55
55
  model_config = ConfigDict(
56
- extra="forbid",
56
+ extra='forbid',
57
57
  )
58
58
  format_id: Annotated[
59
59
  format_id_1.FormatId,
60
60
  Field(
61
- description="Creative format defining the detailed card layout (typically product_card_detailed)"
61
+ description='Creative format defining the detailed card layout (typically product_card_detailed)'
62
62
  ),
63
63
  ]
64
64
  manifest: Annotated[
65
65
  dict[str, Any],
66
66
  Field(
67
- description="Asset manifest for rendering the detailed card, structure defined by the format"
67
+ description='Asset manifest for rendering the detailed card, structure defined by the format'
68
68
  ),
69
69
  ]
70
70
 
71
71
 
72
72
  class PropertyId(RootModel[str]):
73
- root: Annotated[str, Field(pattern="^[a-z0-9_]+$")]
73
+ root: Annotated[str, Field(pattern='^[a-z0-9_]+$')]
74
74
 
75
75
 
76
76
  class PublisherProperties(AdCPBaseModel):
77
77
  model_config = ConfigDict(
78
- extra="forbid",
78
+ extra='forbid',
79
79
  )
80
80
  property_ids: Annotated[
81
81
  list[PropertyId],
@@ -85,12 +85,12 @@ class PublisherProperties(AdCPBaseModel):
85
85
  str,
86
86
  Field(
87
87
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
88
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
88
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
89
89
  ),
90
90
  ]
91
91
  selection_type: Annotated[
92
- Literal["by_id"],
93
- Field(description="Discriminator indicating selection by specific property IDs"),
92
+ Literal['by_id'],
93
+ Field(description='Discriminator indicating selection by specific property IDs'),
94
94
  ]
95
95
 
96
96
 
@@ -100,7 +100,7 @@ class PropertyTag(PropertyId):
100
100
 
101
101
  class PublisherProperties3(AdCPBaseModel):
102
102
  model_config = ConfigDict(
103
- extra="forbid",
103
+ extra='forbid',
104
104
  )
105
105
  property_tags: Annotated[
106
106
  list[PropertyTag],
@@ -113,55 +113,55 @@ class PublisherProperties3(AdCPBaseModel):
113
113
  str,
114
114
  Field(
115
115
  description="Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')",
116
- pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
116
+ pattern='^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$',
117
117
  ),
118
118
  ]
119
119
  selection_type: Annotated[
120
- Literal["by_tag"], Field(description="Discriminator indicating selection by property tags")
120
+ Literal['by_tag'], Field(description='Discriminator indicating selection by property tags')
121
121
  ]
122
122
 
123
123
 
124
124
  class Product(AdCPBaseModel):
125
125
  model_config = ConfigDict(
126
- extra="forbid",
126
+ extra='forbid',
127
127
  )
128
128
  brief_relevance: Annotated[
129
129
  str | None,
130
130
  Field(
131
- description="Explanation of why this product matches the brief (only included when brief is provided)"
131
+ description='Explanation of why this product matches the brief (only included when brief is provided)'
132
132
  ),
133
133
  ] = None
134
134
  creative_policy: creative_policy_1.CreativePolicy | None = None
135
135
  delivery_measurement: Annotated[
136
136
  DeliveryMeasurement,
137
137
  Field(
138
- description="Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products."
138
+ description='Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products.'
139
139
  ),
140
140
  ]
141
141
  delivery_type: delivery_type_1.DeliveryType
142
142
  description: Annotated[
143
- str, Field(description="Detailed description of the product and its inventory")
143
+ str, Field(description='Detailed description of the product and its inventory')
144
144
  ]
145
145
  estimated_exposures: Annotated[
146
146
  int | None,
147
- Field(description="Estimated exposures/impressions for guaranteed products", ge=0),
147
+ Field(description='Estimated exposures/impressions for guaranteed products', ge=0),
148
148
  ] = None
149
149
  expires_at: Annotated[
150
- AwareDatetime | None, Field(description="Expiration timestamp for custom products")
150
+ AwareDatetime | None, Field(description='Expiration timestamp for custom products')
151
151
  ] = None
152
152
  format_ids: Annotated[
153
153
  list[format_id_1.FormatId],
154
154
  Field(
155
- description="Array of supported creative format IDs - structured format_id objects with agent_url and id"
155
+ description='Array of supported creative format IDs - structured format_id objects with agent_url and id'
156
156
  ),
157
157
  ]
158
- is_custom: Annotated[bool | None, Field(description="Whether this is a custom product")] = None
158
+ is_custom: Annotated[bool | None, Field(description='Whether this is a custom product')] = None
159
159
  measurement: measurement_1.Measurement | None = None
160
- name: Annotated[str, Field(description="Human-readable product name")]
160
+ name: Annotated[str, Field(description='Human-readable product name')]
161
161
  placements: Annotated[
162
162
  list[placement.Placement] | None,
163
163
  Field(
164
- description="Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.",
164
+ description='Optional array of specific placements within this product. When provided, buyers can target specific placements when assigning creatives.',
165
165
  min_length=1,
166
166
  ),
167
167
  ] = None
@@ -177,21 +177,21 @@ class Product(AdCPBaseModel):
177
177
  | cpp_option.CppPricingOption
178
178
  | flat_rate_option.FlatRatePricingOption
179
179
  ],
180
- Field(description="Available pricing models for this product", min_length=1),
180
+ Field(description='Available pricing models for this product', min_length=1),
181
181
  ]
182
182
  product_card: Annotated[
183
183
  ProductCard | None,
184
184
  Field(
185
- description="Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated."
185
+ description='Optional standard visual card (300x400px) for displaying this product in user interfaces. Can be rendered via preview_creative or pre-generated.'
186
186
  ),
187
187
  ] = None
188
188
  product_card_detailed: Annotated[
189
189
  ProductCardDetailed | None,
190
190
  Field(
191
- description="Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages."
191
+ description='Optional detailed card with carousel and full specifications. Provides rich product presentation similar to media kit pages.'
192
192
  ),
193
193
  ] = None
194
- product_id: Annotated[str, Field(description="Unique identifier for the product")]
194
+ product_id: Annotated[str, Field(description='Unique identifier for the product')]
195
195
  publisher_properties: Annotated[
196
196
  list[PublisherProperties | PublisherProperties3],
197
197
  Field(
@@ -201,8 +201,9 @@ class Product(AdCPBaseModel):
201
201
  ]
202
202
  reporting_capabilities: reporting_capabilities_1.ReportingCapabilities | None = None
203
203
 
204
- @model_validator(mode="after")
205
- def validate_publisher_properties_items(self) -> "Product":
204
+
205
+ @model_validator(mode='after')
206
+ def validate_publisher_properties_items(self) -> 'Product':
206
207
  """Validate all publisher_properties items."""
207
208
  from adcp.validation import validate_product
208
209
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: promoted-offerings.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,28 +15,28 @@ from . import promoted_products
15
15
 
16
16
 
17
17
  class AssetType(Enum):
18
- image = "image"
19
- video = "video"
20
- audio = "audio"
21
- vast = "vast"
22
- daast = "daast"
23
- text = "text"
24
- url = "url"
25
- html = "html"
26
- css = "css"
27
- javascript = "javascript"
28
- webhook = "webhook"
18
+ image = 'image'
19
+ video = 'video'
20
+ audio = 'audio'
21
+ vast = 'vast'
22
+ daast = 'daast'
23
+ text = 'text'
24
+ url = 'url'
25
+ html = 'html'
26
+ css = 'css'
27
+ javascript = 'javascript'
28
+ webhook = 'webhook'
29
29
 
30
30
 
31
31
  class AssetSelectors(AdCPBaseModel):
32
32
  model_config = ConfigDict(
33
- extra="forbid",
33
+ extra='forbid',
34
34
  )
35
35
  asset_types: Annotated[
36
36
  list[AssetType] | None, Field(description="Filter by asset type (e.g., ['image', 'video'])")
37
37
  ] = None
38
38
  exclude_tags: Annotated[
39
- list[str] | None, Field(description="Exclude assets with these tags")
39
+ list[str] | None, Field(description='Exclude assets with these tags')
40
40
  ] = None
41
41
  tags: Annotated[
42
42
  list[str] | None,
@@ -46,10 +46,10 @@ class AssetSelectors(AdCPBaseModel):
46
46
 
47
47
  class Offering(AdCPBaseModel):
48
48
  model_config = ConfigDict(
49
- extra="forbid",
49
+ extra='forbid',
50
50
  )
51
51
  assets: Annotated[
52
- list[dict[str, Any]] | None, Field(description="Assets specific to this offering")
52
+ list[dict[str, Any]] | None, Field(description='Assets specific to this offering')
53
53
  ] = None
54
54
  description: Annotated[str | None, Field(description="Description of what's being offered")] = (
55
55
  None
@@ -61,42 +61,42 @@ class Offering(AdCPBaseModel):
61
61
 
62
62
  class PromotedOfferings(AdCPBaseModel):
63
63
  model_config = ConfigDict(
64
- extra="forbid",
64
+ extra='forbid',
65
65
  )
66
66
  asset_selectors: Annotated[
67
67
  AssetSelectors | None,
68
- Field(description="Selectors to choose specific assets from the brand manifest"),
68
+ Field(description='Selectors to choose specific assets from the brand manifest'),
69
69
  ] = None
70
70
  brand_manifest: Annotated[
71
71
  brand_manifest_1.BrandManifest | AnyUrl,
72
72
  Field(
73
- description="Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest.",
73
+ description='Brand information manifest containing assets, themes, and guidelines. Can be provided inline or as a URL reference to a hosted manifest.',
74
74
  examples=[
75
75
  {
76
- "data": {
77
- "colors": {"primary": "#FF6B35"},
78
- "name": "ACME Corporation",
79
- "url": "https://acmecorp.com",
76
+ 'data': {
77
+ 'colors': {'primary': '#FF6B35'},
78
+ 'name': 'ACME Corporation',
79
+ 'url': 'https://acmecorp.com',
80
80
  },
81
- "description": "Inline brand manifest",
81
+ 'description': 'Inline brand manifest',
82
82
  },
83
83
  {
84
- "data": "https://cdn.acmecorp.com/brand-manifest.json",
85
- "description": "URL string reference to hosted manifest",
84
+ 'data': 'https://cdn.acmecorp.com/brand-manifest.json',
85
+ 'description': 'URL string reference to hosted manifest',
86
86
  },
87
87
  ],
88
- title="Brand Manifest Reference",
88
+ title='Brand Manifest Reference',
89
89
  ),
90
90
  ]
91
91
  offerings: Annotated[
92
92
  list[Offering] | None,
93
93
  Field(
94
- description="Inline offerings for campaigns without a product catalog. Each offering has a name, description, and associated assets."
94
+ description='Inline offerings for campaigns without a product catalog. Each offering has a name, description, and associated assets.'
95
95
  ),
96
96
  ] = None
97
97
  product_selectors: Annotated[
98
98
  promoted_products.PromotedProducts | None,
99
99
  Field(
100
- description="Selectors to choose which products/offerings from the brand manifest product catalog to promote"
100
+ description='Selectors to choose which products/offerings from the brand manifest product catalog to promote'
101
101
  ),
102
102
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: promoted-products.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,7 +12,7 @@ from pydantic import ConfigDict, Field
12
12
 
13
13
  class PromotedProducts(AdCPBaseModel):
14
14
  model_config = ConfigDict(
15
- extra="forbid",
15
+ extra='forbid',
16
16
  )
17
17
  manifest_category: Annotated[
18
18
  str | None,
@@ -28,7 +28,7 @@ class PromotedProducts(AdCPBaseModel):
28
28
  ] = None
29
29
  manifest_skus: Annotated[
30
30
  list[str] | None,
31
- Field(description="Direct product SKU references from the brand manifest product catalog"),
31
+ Field(description='Direct product SKU references from the brand manifest product catalog'),
32
32
  ] = None
33
33
  manifest_tags: Annotated[
34
34
  list[str] | None,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: property.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,11 +15,11 @@ from . import identifier_types
15
15
 
16
16
  class Identifier(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  type: Annotated[
21
21
  identifier_types.PropertyIdentifierTypes,
22
- Field(description="Type of identifier for this property"),
22
+ Field(description='Type of identifier for this property'),
23
23
  ]
24
24
  value: Annotated[
25
25
  str,
@@ -30,13 +30,13 @@ class Identifier(AdCPBaseModel):
30
30
 
31
31
 
32
32
  class PropertyType(Enum):
33
- website = "website"
34
- mobile_app = "mobile_app"
35
- ctv_app = "ctv_app"
36
- dooh = "dooh"
37
- podcast = "podcast"
38
- radio = "radio"
39
- streaming_audio = "streaming_audio"
33
+ website = 'website'
34
+ mobile_app = 'mobile_app'
35
+ ctv_app = 'ctv_app'
36
+ dooh = 'dooh'
37
+ podcast = 'podcast'
38
+ radio = 'radio'
39
+ streaming_audio = 'streaming_audio'
40
40
 
41
41
 
42
42
  class Tag(RootModel[str]):
@@ -44,36 +44,36 @@ class Tag(RootModel[str]):
44
44
  str,
45
45
  Field(
46
46
  description="Lowercase tag with underscores (e.g., 'conde_nast_network', 'premium_content')",
47
- pattern="^[a-z0-9_]+$",
47
+ pattern='^[a-z0-9_]+$',
48
48
  ),
49
49
  ]
50
50
 
51
51
 
52
52
  class Property(AdCPBaseModel):
53
53
  model_config = ConfigDict(
54
- extra="forbid",
54
+ extra='forbid',
55
55
  )
56
56
  identifiers: Annotated[
57
- list[Identifier], Field(description="Array of identifiers for this property", min_length=1)
57
+ list[Identifier], Field(description='Array of identifiers for this property', min_length=1)
58
58
  ]
59
- name: Annotated[str, Field(description="Human-readable property name")]
59
+ name: Annotated[str, Field(description='Human-readable property name')]
60
60
  property_id: Annotated[
61
61
  str | None,
62
62
  Field(
63
63
  description="Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects. Recommended format: lowercase with underscores (e.g., 'cnn_ctv_app', 'instagram_mobile')",
64
- pattern="^[a-z0-9_]+$",
64
+ pattern='^[a-z0-9_]+$',
65
65
  ),
66
66
  ] = None
67
- property_type: Annotated[PropertyType, Field(description="Type of advertising property")]
67
+ property_type: Annotated[PropertyType, Field(description='Type of advertising property')]
68
68
  publisher_domain: Annotated[
69
69
  str | None,
70
70
  Field(
71
- description="Domain where adagents.json should be checked for authorization validation. Required for list_authorized_properties response. Optional in adagents.json (file location implies domain)."
71
+ description='Domain where adagents.json should be checked for authorization validation. Required for list_authorized_properties response. Optional in adagents.json (file location implies domain).'
72
72
  ),
73
73
  ] = None
74
74
  tags: Annotated[
75
75
  list[Tag] | None,
76
76
  Field(
77
- description="Tags for categorization and grouping (e.g., network membership, content categories)"
77
+ description='Tags for categorization and grouping (e.g., network membership, content categories)'
78
78
  ),
79
79
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: protocol-envelope.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -15,47 +15,47 @@ from . import task_status
15
15
 
16
16
  class ProtocolEnvelope(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra="forbid",
18
+ extra='forbid',
19
19
  )
20
20
  context_id: Annotated[
21
21
  str | None,
22
22
  Field(
23
- description="Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context."
23
+ description='Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context.'
24
24
  ),
25
25
  ] = None
26
26
  message: Annotated[
27
27
  str | None,
28
28
  Field(
29
- description="Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response."
29
+ description='Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response.'
30
30
  ),
31
31
  ] = None
32
32
  payload: Annotated[
33
33
  dict[str, Any],
34
34
  Field(
35
- description="The actual task-specific response data. This is the content defined in individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). Contains only domain-specific data without protocol-level fields."
35
+ description='The actual task-specific response data. This is the content defined in individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). Contains only domain-specific data without protocol-level fields.'
36
36
  ),
37
37
  ]
38
38
  push_notification_config: Annotated[
39
39
  push_notification_config_1.PushNotificationConfig | None,
40
40
  Field(
41
- description="Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks."
41
+ description='Push notification configuration for async task updates (A2A and REST protocols). Echoed from the request to confirm webhook settings. Specifies URL, authentication scheme (Bearer or HMAC-SHA256), and credentials. MCP uses progress notifications instead of webhooks.'
42
42
  ),
43
43
  ] = None
44
44
  status: Annotated[
45
45
  task_status.TaskStatus,
46
46
  Field(
47
- description="Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. Managed by the protocol layer."
47
+ description='Current task execution state. Indicates whether the task is completed, in progress (working), submitted for async processing, failed, or requires user input. Managed by the protocol layer.'
48
48
  ),
49
49
  ]
50
50
  task_id: Annotated[
51
51
  str | None,
52
52
  Field(
53
- description="Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete."
53
+ description='Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.'
54
54
  ),
55
55
  ] = None
56
56
  timestamp: Annotated[
57
57
  AwareDatetime | None,
58
58
  Field(
59
- description="ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress."
59
+ description='ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.'
60
60
  ),
61
61
  ] = None
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: provide-performance-feedback-request.json
3
- # timestamp: 2025-11-15T22:03:55+00:00
3
+ # timestamp: 2025-11-18T03:04:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -12,74 +12,74 @@ from pydantic import AwareDatetime, ConfigDict, Field
12
12
 
13
13
 
14
14
  class FeedbackSource(Enum):
15
- buyer_attribution = "buyer_attribution"
16
- third_party_measurement = "third_party_measurement"
17
- platform_analytics = "platform_analytics"
18
- verification_partner = "verification_partner"
15
+ buyer_attribution = 'buyer_attribution'
16
+ third_party_measurement = 'third_party_measurement'
17
+ platform_analytics = 'platform_analytics'
18
+ verification_partner = 'verification_partner'
19
19
 
20
20
 
21
21
  class MeasurementPeriod(AdCPBaseModel):
22
22
  model_config = ConfigDict(
23
- extra="forbid",
23
+ extra='forbid',
24
24
  )
25
25
  end: Annotated[
26
- AwareDatetime, Field(description="ISO 8601 end timestamp for measurement period")
26
+ AwareDatetime, Field(description='ISO 8601 end timestamp for measurement period')
27
27
  ]
28
28
  start: Annotated[
29
- AwareDatetime, Field(description="ISO 8601 start timestamp for measurement period")
29
+ AwareDatetime, Field(description='ISO 8601 start timestamp for measurement period')
30
30
  ]
31
31
 
32
32
 
33
33
  class MetricType(Enum):
34
- overall_performance = "overall_performance"
35
- conversion_rate = "conversion_rate"
36
- brand_lift = "brand_lift"
37
- click_through_rate = "click_through_rate"
38
- completion_rate = "completion_rate"
39
- viewability = "viewability"
40
- brand_safety = "brand_safety"
41
- cost_efficiency = "cost_efficiency"
34
+ overall_performance = 'overall_performance'
35
+ conversion_rate = 'conversion_rate'
36
+ brand_lift = 'brand_lift'
37
+ click_through_rate = 'click_through_rate'
38
+ completion_rate = 'completion_rate'
39
+ viewability = 'viewability'
40
+ brand_safety = 'brand_safety'
41
+ cost_efficiency = 'cost_efficiency'
42
42
 
43
43
 
44
44
  class ProvidePerformanceFeedbackRequest(AdCPBaseModel):
45
45
  model_config = ConfigDict(
46
- extra="forbid",
46
+ extra='forbid',
47
47
  )
48
48
  context: Annotated[
49
49
  dict[str, Any] | None,
50
50
  Field(
51
- description="Initiator-provided context included in the request payload. Agentsmust echo this value back unchanged in responses and webhooks. Use for UI/session hints, correlation tokens, or tracking metadata."
51
+ description='Initiator-provided context included in the request payload. Agentsmust echo this value back unchanged in responses and webhooks. Use for UI/session hints, correlation tokens, or tracking metadata.'
52
52
  ),
53
53
  ] = None
54
54
  creative_id: Annotated[
55
55
  str | None,
56
56
  Field(
57
- description="Specific creative asset (if feedback is creative-specific)", min_length=1
57
+ description='Specific creative asset (if feedback is creative-specific)', min_length=1
58
58
  ),
59
59
  ] = None
60
60
  feedback_source: Annotated[
61
- FeedbackSource | None, Field(description="Source of the performance data")
61
+ FeedbackSource | None, Field(description='Source of the performance data')
62
62
  ] = FeedbackSource.buyer_attribution
63
63
  measurement_period: Annotated[
64
- MeasurementPeriod, Field(description="Time period for performance measurement")
64
+ MeasurementPeriod, Field(description='Time period for performance measurement')
65
65
  ]
66
66
  media_buy_id: Annotated[
67
67
  str, Field(description="Publisher's media buy identifier", min_length=1)
68
68
  ]
69
69
  metric_type: Annotated[
70
- MetricType | None, Field(description="The business metric being measured")
70
+ MetricType | None, Field(description='The business metric being measured')
71
71
  ] = MetricType.overall_performance
72
72
  package_id: Annotated[
73
73
  str | None,
74
74
  Field(
75
- description="Specific package within the media buy (if feedback is package-specific)",
75
+ description='Specific package within the media buy (if feedback is package-specific)',
76
76
  min_length=1,
77
77
  ),
78
78
  ] = None
79
79
  performance_index: Annotated[
80
80
  float,
81
81
  Field(
82
- description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
82
+ description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
83
83
  ge=0.0,
84
84
  ),
85
85
  ]