adcp 3.1.0__py3-none-any.whl → 3.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +5 -5
  3. adcp/__main__.py +4 -4
  4. adcp/adagents.py +5 -9
  5. adcp/client.py +14 -12
  6. adcp/protocols/a2a.py +3 -3
  7. adcp/protocols/base.py +2 -2
  8. adcp/protocols/mcp.py +3 -3
  9. adcp/server/base.py +6 -10
  10. adcp/server/content_standards.py +17 -49
  11. adcp/server/governance.py +20 -59
  12. adcp/server/mcp_tools.py +8 -4
  13. adcp/server/proposal.py +1 -3
  14. adcp/server/sponsored_intelligence.py +10 -28
  15. adcp/simple.py +10 -10
  16. adcp/types/__init__.py +10 -6
  17. adcp/types/_generated.py +44 -27
  18. adcp/types/base.py +7 -7
  19. adcp/types/generated_poc/{protocols → a2ui}/__init__.py +1 -1
  20. adcp/types/generated_poc/a2ui/component.py +24 -0
  21. adcp/types/generated_poc/a2ui/surface.py +33 -0
  22. adcp/types/generated_poc/account/__init__.py +3 -0
  23. adcp/types/generated_poc/account/list_accounts_request.py +30 -0
  24. adcp/types/generated_poc/account/list_accounts_response.py +30 -0
  25. adcp/types/generated_poc/adagents.py +192 -195
  26. adcp/types/generated_poc/content_standards/artifact.py +69 -69
  27. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +13 -13
  28. adcp/types/generated_poc/content_standards/calibrate_content_request.py +2 -2
  29. adcp/types/generated_poc/content_standards/calibrate_content_response.py +17 -17
  30. adcp/types/generated_poc/content_standards/content_standards.py +8 -8
  31. adcp/types/generated_poc/content_standards/create_content_standards_request.py +13 -13
  32. adcp/types/generated_poc/content_standards/create_content_standards_response.py +6 -6
  33. adcp/types/generated_poc/content_standards/get_content_standards_request.py +1 -1
  34. adcp/types/generated_poc/content_standards/get_content_standards_response.py +4 -4
  35. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +14 -14
  36. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +30 -30
  37. adcp/types/generated_poc/content_standards/list_content_standards_request.py +4 -4
  38. adcp/types/generated_poc/content_standards/list_content_standards_response.py +5 -5
  39. adcp/types/generated_poc/content_standards/update_content_standards_request.py +14 -14
  40. adcp/types/generated_poc/content_standards/update_content_standards_response.py +4 -4
  41. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +13 -13
  42. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +16 -16
  43. adcp/types/generated_poc/core/account.py +54 -0
  44. adcp/types/generated_poc/core/activation_key.py +8 -8
  45. adcp/types/generated_poc/core/assets/audio_asset.py +37 -8
  46. adcp/types/generated_poc/core/assets/css_asset.py +2 -2
  47. adcp/types/generated_poc/core/assets/daast_asset.py +18 -18
  48. adcp/types/generated_poc/core/assets/html_asset.py +2 -2
  49. adcp/types/generated_poc/core/assets/image_asset.py +6 -6
  50. adcp/types/generated_poc/core/assets/javascript_asset.py +3 -3
  51. adcp/types/generated_poc/core/assets/text_asset.py +2 -2
  52. adcp/types/generated_poc/core/assets/url_asset.py +3 -3
  53. adcp/types/generated_poc/core/assets/vast_asset.py +18 -18
  54. adcp/types/generated_poc/core/assets/video_asset.py +126 -10
  55. adcp/types/generated_poc/core/assets/webhook_asset.py +9 -9
  56. adcp/types/generated_poc/core/async_response_data.py +2 -2
  57. adcp/types/generated_poc/core/brand_manifest.py +66 -66
  58. adcp/types/generated_poc/core/brand_manifest_ref.py +9 -9
  59. adcp/types/generated_poc/core/context.py +1 -1
  60. adcp/types/generated_poc/core/creative_asset.py +12 -12
  61. adcp/types/generated_poc/core/creative_assignment.py +3 -3
  62. adcp/types/generated_poc/core/creative_filters.py +23 -17
  63. adcp/types/generated_poc/core/creative_manifest.py +4 -4
  64. adcp/types/generated_poc/core/creative_policy.py +4 -4
  65. adcp/types/generated_poc/core/delivery_metrics.py +32 -32
  66. adcp/types/generated_poc/core/deployment.py +20 -20
  67. adcp/types/generated_poc/core/destination.py +11 -11
  68. adcp/types/generated_poc/core/error.py +6 -6
  69. adcp/types/generated_poc/core/ext.py +1 -1
  70. adcp/types/generated_poc/core/format.py +49 -124
  71. adcp/types/generated_poc/core/format_id.py +5 -5
  72. adcp/types/generated_poc/core/frequency_cap.py +2 -2
  73. adcp/types/generated_poc/core/identifier.py +2 -2
  74. adcp/types/generated_poc/core/mcp_webhook_payload.py +10 -10
  75. adcp/types/generated_poc/core/measurement.py +8 -8
  76. adcp/types/generated_poc/core/media_buy.py +12 -8
  77. adcp/types/generated_poc/core/media_buy_features.py +3 -3
  78. adcp/types/generated_poc/core/offering.py +9 -9
  79. adcp/types/generated_poc/core/package.py +8 -8
  80. adcp/types/generated_poc/core/performance_feedback.py +18 -18
  81. adcp/types/generated_poc/core/placement.py +4 -4
  82. adcp/types/generated_poc/core/pricing_option.py +1 -1
  83. adcp/types/generated_poc/core/product.py +27 -21
  84. adcp/types/generated_poc/core/product_allocation.py +5 -5
  85. adcp/types/generated_poc/core/product_filters.py +27 -27
  86. adcp/types/generated_poc/core/promoted_offerings.py +18 -18
  87. adcp/types/generated_poc/core/promoted_products.py +2 -2
  88. adcp/types/generated_poc/core/property.py +10 -10
  89. adcp/types/generated_poc/core/property_id.py +4 -4
  90. adcp/types/generated_poc/core/property_list_ref.py +4 -4
  91. adcp/types/generated_poc/core/property_tag.py +4 -4
  92. adcp/types/generated_poc/core/proposal.py +13 -13
  93. adcp/types/generated_poc/core/protocol_envelope.py +8 -8
  94. adcp/types/generated_poc/core/publisher_property_selector.py +13 -13
  95. adcp/types/generated_poc/core/push_notification_config.py +5 -5
  96. adcp/types/generated_poc/core/reporting_capabilities.py +8 -8
  97. adcp/types/generated_poc/core/reporting_webhook.py +10 -10
  98. adcp/types/generated_poc/core/response.py +4 -4
  99. adcp/types/generated_poc/core/signal_filters.py +5 -5
  100. adcp/types/generated_poc/core/start_timing.py +3 -3
  101. adcp/types/generated_poc/core/sub_asset.py +14 -14
  102. adcp/types/generated_poc/core/targeting.py +17 -10
  103. adcp/types/generated_poc/creative/list_creative_formats_request.py +20 -20
  104. adcp/types/generated_poc/creative/list_creative_formats_response.py +5 -5
  105. adcp/types/generated_poc/creative/preview_creative_request.py +24 -24
  106. adcp/types/generated_poc/creative/preview_creative_response.py +28 -28
  107. adcp/types/generated_poc/creative/preview_render.py +25 -25
  108. adcp/types/generated_poc/enums/adcp_domain.py +4 -4
  109. adcp/types/generated_poc/enums/asset_content_type.py +13 -13
  110. adcp/types/generated_poc/enums/auth_scheme.py +2 -2
  111. adcp/types/generated_poc/enums/available_metric.py +9 -9
  112. adcp/types/generated_poc/enums/channels.py +19 -19
  113. adcp/types/generated_poc/enums/co_branding_requirement.py +3 -3
  114. adcp/types/generated_poc/enums/creative_action.py +5 -5
  115. adcp/types/generated_poc/enums/creative_agent_capability.py +4 -4
  116. adcp/types/generated_poc/enums/creative_sort_field.py +6 -6
  117. adcp/types/generated_poc/enums/creative_status.py +5 -5
  118. adcp/types/generated_poc/enums/daast_tracking_event.py +11 -11
  119. adcp/types/generated_poc/enums/daast_version.py +2 -2
  120. adcp/types/generated_poc/enums/delivery_type.py +2 -2
  121. adcp/types/generated_poc/enums/dimension_unit.py +4 -4
  122. adcp/types/generated_poc/enums/feed_format.py +3 -3
  123. adcp/types/generated_poc/enums/feedback_source.py +4 -4
  124. adcp/types/generated_poc/enums/format_category.py +7 -7
  125. adcp/types/generated_poc/enums/format_id_parameter.py +2 -2
  126. adcp/types/generated_poc/enums/frequency_cap_scope.py +3 -3
  127. adcp/types/generated_poc/enums/geo_level.py +4 -4
  128. adcp/types/generated_poc/enums/history_entry_type.py +2 -2
  129. adcp/types/generated_poc/enums/http_method.py +2 -2
  130. adcp/types/generated_poc/enums/identifier_types.py +19 -19
  131. adcp/types/generated_poc/enums/javascript_module_type.py +3 -3
  132. adcp/types/generated_poc/enums/landing_page_requirement.py +3 -3
  133. adcp/types/generated_poc/enums/markdown_flavor.py +2 -2
  134. adcp/types/generated_poc/enums/media_buy_status.py +4 -4
  135. adcp/types/generated_poc/enums/metric_type.py +8 -8
  136. adcp/types/generated_poc/enums/metro_system.py +5 -5
  137. adcp/types/generated_poc/enums/notification_type.py +4 -4
  138. adcp/types/generated_poc/enums/pacing.py +3 -3
  139. adcp/types/generated_poc/enums/postal_system.py +9 -9
  140. adcp/types/generated_poc/enums/preview_output_format.py +2 -2
  141. adcp/types/generated_poc/enums/pricing_model.py +7 -7
  142. adcp/types/generated_poc/enums/property_type.py +8 -8
  143. adcp/types/generated_poc/enums/publisher_identifier_types.py +5 -5
  144. adcp/types/generated_poc/enums/reporting_frequency.py +3 -3
  145. adcp/types/generated_poc/enums/signal_catalog_type.py +3 -3
  146. adcp/types/generated_poc/enums/sort_direction.py +2 -2
  147. adcp/types/generated_poc/enums/task_status.py +9 -9
  148. adcp/types/generated_poc/enums/task_type.py +11 -12
  149. adcp/types/generated_poc/enums/update_frequency.py +4 -4
  150. adcp/types/generated_poc/enums/url_asset_type.py +3 -3
  151. adcp/types/generated_poc/enums/validation_mode.py +2 -2
  152. adcp/types/generated_poc/enums/vast_tracking_event.py +16 -16
  153. adcp/types/generated_poc/enums/vast_version.py +5 -5
  154. adcp/types/generated_poc/enums/webhook_response_type.py +4 -4
  155. adcp/types/generated_poc/enums/webhook_security_method.py +3 -3
  156. adcp/types/generated_poc/extensions/extension_meta.py +14 -14
  157. adcp/types/generated_poc/media_buy/build_creative_request.py +4 -4
  158. adcp/types/generated_poc/media_buy/build_creative_response.py +6 -6
  159. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +5 -5
  160. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  161. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +5 -5
  162. adcp/types/generated_poc/media_buy/create_media_buy_request.py +27 -21
  163. adcp/types/generated_poc/media_buy/create_media_buy_response.py +15 -8
  164. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +8 -8
  165. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +51 -51
  166. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +6 -6
  167. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +2 -2
  168. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +4 -4
  169. adcp/types/generated_poc/media_buy/get_products_request.py +11 -5
  170. adcp/types/generated_poc/media_buy/get_products_response.py +5 -5
  171. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +9 -9
  172. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +5 -5
  173. adcp/types/generated_poc/media_buy/list_creatives_request.py +23 -23
  174. adcp/types/generated_poc/media_buy/list_creatives_response.py +53 -49
  175. adcp/types/generated_poc/media_buy/package_request.py +8 -8
  176. adcp/types/generated_poc/media_buy/package_update.py +16 -16
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +19 -19
  178. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +6 -6
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +5 -5
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +7 -7
  182. adcp/types/generated_poc/media_buy/sync_creatives_request.py +14 -8
  183. adcp/types/generated_poc/media_buy/sync_creatives_response.py +33 -29
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +4 -4
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +5 -5
  187. adcp/types/generated_poc/media_buy/update_media_buy_request.py +14 -14
  188. adcp/types/generated_poc/media_buy/update_media_buy_response.py +7 -7
  189. adcp/types/generated_poc/pricing_options/cpc_option.py +13 -26
  190. adcp/types/generated_poc/pricing_options/cpcv_option.py +13 -26
  191. adcp/types/generated_poc/pricing_options/cpm_option.py +13 -20
  192. adcp/types/generated_poc/pricing_options/cpp_option.py +19 -32
  193. adcp/types/generated_poc/pricing_options/cpv_option.py +19 -32
  194. adcp/types/generated_poc/pricing_options/flat_rate_option.py +23 -36
  195. adcp/types/generated_poc/pricing_options/price_guidance.py +26 -0
  196. adcp/types/generated_poc/pricing_options/vcpm_option.py +13 -26
  197. adcp/types/generated_poc/property/base_property_source.py +15 -15
  198. adcp/types/generated_poc/property/create_property_list_request.py +4 -4
  199. adcp/types/generated_poc/property/create_property_list_response.py +3 -3
  200. adcp/types/generated_poc/property/delete_property_list_request.py +2 -2
  201. adcp/types/generated_poc/property/delete_property_list_response.py +3 -3
  202. adcp/types/generated_poc/property/feature_requirement.py +8 -8
  203. adcp/types/generated_poc/property/get_property_list_request.py +5 -5
  204. adcp/types/generated_poc/property/get_property_list_response.py +11 -11
  205. adcp/types/generated_poc/property/list_property_lists_request.py +5 -5
  206. adcp/types/generated_poc/property/list_property_lists_response.py +8 -8
  207. adcp/types/generated_poc/property/property_error.py +10 -10
  208. adcp/types/generated_poc/property/property_feature.py +4 -4
  209. adcp/types/generated_poc/property/property_feature_definition.py +18 -18
  210. adcp/types/generated_poc/property/property_list.py +11 -11
  211. adcp/types/generated_poc/property/property_list_changed_webhook.py +11 -11
  212. adcp/types/generated_poc/property/property_list_filters.py +7 -7
  213. adcp/types/generated_poc/property/update_property_list_request.py +8 -8
  214. adcp/types/generated_poc/property/update_property_list_response.py +2 -2
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +8 -6
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +59 -58
  217. adcp/types/generated_poc/signals/activate_signal_request.py +3 -3
  218. adcp/types/generated_poc/signals/activate_signal_response.py +6 -6
  219. adcp/types/generated_poc/signals/get_signals_request.py +8 -8
  220. adcp/types/generated_poc/signals/get_signals_response.py +15 -15
  221. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +45 -30
  222. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +4 -4
  223. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +23 -23
  224. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +16 -16
  225. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +5 -5
  226. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +7 -7
  227. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +11 -11
  228. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +37 -23
  229. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +17 -17
  230. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +15 -15
  231. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +11 -11
  232. adcp/utils/format_assets.py +32 -32
  233. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/METADATA +10 -5
  234. adcp-3.2.0.dist-info/RECORD +268 -0
  235. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +0 -38
  236. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +0 -84
  237. adcp/types/generated_poc/protocols/adcp_extension.py +0 -50
  238. adcp-3.1.0.dist-info/RECORD +0 -264
  239. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/WHEEL +0 -0
  240. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/entry_points.txt +0 -0
  241. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/licenses/LICENSE +0 -0
  242. {adcp-3.1.0.dist-info → adcp-3.2.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: media_buy/list_creatives_response.json
3
- # timestamp: 2026-01-25T21:17:54+00:00
3
+ # timestamp: 2026-02-02T17:45:21+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -9,6 +9,7 @@ from typing import Annotated
9
9
  from adcp.types.base import AdCPBaseModel
10
10
  from pydantic import AwareDatetime, ConfigDict, Field
11
11
 
12
+ from ..core import account as account_1
12
13
  from ..core import context as context_1
13
14
  from ..core import ext as ext_1
14
15
  from ..core import format_id as format_id_1
@@ -30,80 +31,80 @@ from ..enums import creative_status, sort_direction
30
31
 
31
32
  class AssignedPackage(AdCPBaseModel):
32
33
  model_config = ConfigDict(
33
- extra='allow',
34
+ extra="allow",
34
35
  )
35
- assigned_date: Annotated[AwareDatetime, Field(description='When this assignment was created')]
36
+ assigned_date: Annotated[AwareDatetime, Field(description="When this assignment was created")]
36
37
  buyer_ref: Annotated[
37
38
  str | None, Field(description="Buyer's reference identifier for this package")
38
39
  ] = None
39
- package_id: Annotated[str, Field(description='Package identifier')]
40
+ package_id: Annotated[str, Field(description="Package identifier")]
40
41
 
41
42
 
42
43
  class Assignments(AdCPBaseModel):
43
44
  model_config = ConfigDict(
44
- extra='allow',
45
+ extra="allow",
45
46
  )
46
47
  assigned_packages: Annotated[
47
48
  list[AssignedPackage] | None,
48
- Field(description='List of packages this creative is assigned to'),
49
+ Field(description="List of packages this creative is assigned to"),
49
50
  ] = None
50
51
  assignment_count: Annotated[
51
- int, Field(description='Total number of active package assignments', ge=0)
52
+ int, Field(description="Total number of active package assignments", ge=0)
52
53
  ]
53
54
 
54
55
 
55
56
  class Performance(AdCPBaseModel):
56
57
  model_config = ConfigDict(
57
- extra='allow',
58
+ extra="allow",
58
59
  )
59
60
  clicks: Annotated[
60
- int | None, Field(description='Total clicks across all assignments', ge=0)
61
+ int | None, Field(description="Total clicks across all assignments", ge=0)
61
62
  ] = None
62
63
  conversion_rate: Annotated[
63
- float | None, Field(description='Conversion rate across all assignments', ge=0.0, le=1.0)
64
+ float | None, Field(description="Conversion rate across all assignments", ge=0.0, le=1.0)
64
65
  ] = None
65
66
  ctr: Annotated[
66
- float | None, Field(description='Click-through rate (clicks/impressions)', ge=0.0, le=1.0)
67
+ float | None, Field(description="Click-through rate (clicks/impressions)", ge=0.0, le=1.0)
67
68
  ] = None
68
69
  impressions: Annotated[
69
- int | None, Field(description='Total impressions across all assignments', ge=0)
70
+ int | None, Field(description="Total impressions across all assignments", ge=0)
70
71
  ] = None
71
72
  last_updated: Annotated[
72
- AwareDatetime, Field(description='When performance data was last updated')
73
+ AwareDatetime, Field(description="When performance data was last updated")
73
74
  ]
74
75
  performance_score: Annotated[
75
- float | None, Field(description='Aggregated performance score (0-100)', ge=0.0, le=100.0)
76
+ float | None, Field(description="Aggregated performance score (0-100)", ge=0.0, le=100.0)
76
77
  ] = None
77
78
 
78
79
 
79
80
  class Pagination(AdCPBaseModel):
80
81
  model_config = ConfigDict(
81
- extra='allow',
82
+ extra="allow",
82
83
  )
83
84
  current_page: Annotated[
84
- int | None, Field(description='Current page number (1-based)', ge=1)
85
+ int | None, Field(description="Current page number (1-based)", ge=1)
85
86
  ] = None
86
- has_more: Annotated[bool, Field(description='Whether more results are available')]
87
- limit: Annotated[int, Field(description='Maximum number of results requested', ge=1)]
88
- offset: Annotated[int, Field(description='Number of results skipped', ge=0)]
87
+ has_more: Annotated[bool, Field(description="Whether more results are available")]
88
+ limit: Annotated[int, Field(description="Maximum number of results requested", ge=1)]
89
+ offset: Annotated[int, Field(description="Number of results skipped", ge=0)]
89
90
  total_pages: Annotated[
90
- int | None, Field(description='Total number of pages available', ge=0)
91
+ int | None, Field(description="Total number of pages available", ge=0)
91
92
  ] = None
92
93
 
93
94
 
94
95
  class StatusSummary(AdCPBaseModel):
95
96
  model_config = ConfigDict(
96
- extra='allow',
97
+ extra="allow",
97
98
  )
98
- approved: Annotated[int | None, Field(description='Number of approved creatives', ge=0)] = None
99
- archived: Annotated[int | None, Field(description='Number of archived creatives', ge=0)] = None
99
+ approved: Annotated[int | None, Field(description="Number of approved creatives", ge=0)] = None
100
+ archived: Annotated[int | None, Field(description="Number of archived creatives", ge=0)] = None
100
101
  pending_review: Annotated[
101
- int | None, Field(description='Number of creatives pending review', ge=0)
102
+ int | None, Field(description="Number of creatives pending review", ge=0)
102
103
  ] = None
103
104
  processing: Annotated[
104
- int | None, Field(description='Number of creatives being processed', ge=0)
105
+ int | None, Field(description="Number of creatives being processed", ge=0)
105
106
  ] = None
106
- rejected: Annotated[int | None, Field(description='Number of rejected creatives', ge=0)] = None
107
+ rejected: Annotated[int | None, Field(description="Number of rejected creatives", ge=0)] = None
107
108
 
108
109
 
109
110
  class SortApplied(AdCPBaseModel):
@@ -113,27 +114,30 @@ class SortApplied(AdCPBaseModel):
113
114
 
114
115
  class QuerySummary(AdCPBaseModel):
115
116
  model_config = ConfigDict(
116
- extra='allow',
117
+ extra="allow",
117
118
  )
118
119
  filters_applied: Annotated[
119
- list[str] | None, Field(description='List of filters that were applied to the query')
120
+ list[str] | None, Field(description="List of filters that were applied to the query")
120
121
  ] = None
121
122
  returned: Annotated[
122
- int, Field(description='Number of creatives returned in this response', ge=0)
123
+ int, Field(description="Number of creatives returned in this response", ge=0)
123
124
  ]
124
125
  sort_applied: Annotated[
125
- SortApplied | None, Field(description='Sort order that was applied')
126
+ SortApplied | None, Field(description="Sort order that was applied")
126
127
  ] = None
127
128
  total_matching: Annotated[
128
129
  int,
129
- Field(description='Total number of creatives matching filters (across all pages)', ge=0),
130
+ Field(description="Total number of creatives matching filters (across all pages)", ge=0),
130
131
  ]
131
132
 
132
133
 
133
134
  class Creative(AdCPBaseModel):
134
135
  model_config = ConfigDict(
135
- extra='allow',
136
+ extra="allow",
136
137
  )
138
+ account: Annotated[
139
+ account_1.Account | None, Field(description="Account that owns this creative")
140
+ ] = None
137
141
  assets: Annotated[
138
142
  dict[
139
143
  str,
@@ -150,60 +154,60 @@ class Creative(AdCPBaseModel):
150
154
  | url_asset.UrlAsset,
151
155
  ]
152
156
  | None,
153
- Field(description='Assets for this creative, keyed by asset_role'),
157
+ Field(description="Assets for this creative, keyed by asset_role"),
154
158
  ] = None
155
159
  assignments: Annotated[
156
160
  Assignments | None,
157
- Field(description='Current package assignments (included when include_assignments=true)'),
161
+ Field(description="Current package assignments (included when include_assignments=true)"),
158
162
  ] = None
159
163
  created_date: Annotated[
160
- AwareDatetime, Field(description='When the creative was uploaded to the library')
164
+ AwareDatetime, Field(description="When the creative was uploaded to the library")
161
165
  ]
162
- creative_id: Annotated[str, Field(description='Unique identifier for the creative')]
166
+ creative_id: Annotated[str, Field(description="Unique identifier for the creative")]
163
167
  format_id: Annotated[
164
168
  format_id_1.FormatId,
165
- Field(description='Format identifier specifying which format this creative conforms to'),
169
+ Field(description="Format identifier specifying which format this creative conforms to"),
166
170
  ]
167
- name: Annotated[str, Field(description='Human-readable creative name')]
171
+ name: Annotated[str, Field(description="Human-readable creative name")]
168
172
  performance: Annotated[
169
173
  Performance | None,
170
174
  Field(
171
- description='Aggregated performance metrics (included when include_performance=true)'
175
+ description="Aggregated performance metrics (included when include_performance=true)"
172
176
  ),
173
177
  ] = None
174
178
  status: Annotated[
175
- creative_status.CreativeStatus, Field(description='Current approval status of the creative')
179
+ creative_status.CreativeStatus, Field(description="Current approval status of the creative")
176
180
  ]
177
181
  sub_assets: Annotated[
178
182
  list[sub_asset.SubAsset] | None,
179
183
  Field(
180
- description='Sub-assets for multi-asset formats (included when include_sub_assets=true)'
184
+ description="Sub-assets for multi-asset formats (included when include_sub_assets=true)"
181
185
  ),
182
186
  ] = None
183
187
  tags: Annotated[
184
- list[str] | None, Field(description='User-defined tags for organization and searchability')
188
+ list[str] | None, Field(description="User-defined tags for organization and searchability")
185
189
  ] = None
186
- updated_date: Annotated[AwareDatetime, Field(description='When the creative was last modified')]
190
+ updated_date: Annotated[AwareDatetime, Field(description="When the creative was last modified")]
187
191
 
188
192
 
189
193
  class ListCreativesResponse(AdCPBaseModel):
190
194
  model_config = ConfigDict(
191
- extra='allow',
195
+ extra="allow",
192
196
  )
193
197
  context: context_1.ContextObject | None = None
194
198
  creatives: Annotated[
195
- list[Creative], Field(description='Array of creative assets matching the query')
199
+ list[Creative], Field(description="Array of creative assets matching the query")
196
200
  ]
197
201
  ext: ext_1.ExtensionObject | None = None
198
202
  format_summary: Annotated[
199
- dict[str, int] | None, Field(description='Breakdown of creatives by format type')
203
+ dict[str, int] | None, Field(description="Breakdown of creatives by format type")
200
204
  ] = None
201
205
  pagination: Annotated[
202
- Pagination, Field(description='Pagination information for navigating results')
206
+ Pagination, Field(description="Pagination information for navigating results")
203
207
  ]
204
208
  query_summary: Annotated[
205
- QuerySummary, Field(description='Summary of the query that was executed')
209
+ QuerySummary, Field(description="Summary of the query that was executed")
206
210
  ]
207
211
  status_summary: Annotated[
208
- StatusSummary | None, Field(description='Breakdown of creatives by status')
212
+ StatusSummary | None, Field(description="Breakdown of creatives by status")
209
213
  ] = None
@@ -17,12 +17,12 @@ from ..enums import pacing as pacing_1
17
17
 
18
18
  class PackageRequest(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='allow',
20
+ extra="allow",
21
21
  )
22
22
  bid_price: Annotated[
23
23
  float | None,
24
24
  Field(
25
- description='Bid price for auction-based CPM pricing (required if using cpm-auction-option)',
25
+ description="Bid price for auction-based CPM pricing (required if using cpm-auction-option)",
26
26
  ge=0.0,
27
27
  ),
28
28
  ] = None
@@ -34,13 +34,13 @@ class PackageRequest(AdCPBaseModel):
34
34
  creative_assignments: Annotated[
35
35
  list[creative_assignment.CreativeAssignment] | None,
36
36
  Field(
37
- description='Assign existing library creatives to this package with optional weights and placement targeting'
37
+ description="Assign existing library creatives to this package with optional weights and placement targeting"
38
38
  ),
39
39
  ] = None
40
40
  creatives: Annotated[
41
41
  list[creative_asset.CreativeAsset] | None,
42
42
  Field(
43
- description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
43
+ description="Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.",
44
44
  max_length=100,
45
45
  ),
46
46
  ] = None
@@ -48,18 +48,18 @@ class PackageRequest(AdCPBaseModel):
48
48
  format_ids: Annotated[
49
49
  list[format_id.FormatId] | None,
50
50
  Field(
51
- description='Array of format IDs that will be used for this package - must be supported by the product. If omitted, defaults to all formats supported by the product.',
51
+ description="Array of format IDs that will be used for this package - must be supported by the product. If omitted, defaults to all formats supported by the product.",
52
52
  min_length=1,
53
53
  ),
54
54
  ] = None
55
55
  impressions: Annotated[
56
- float | None, Field(description='Impression goal for this package', ge=0.0)
56
+ float | None, Field(description="Impression goal for this package", ge=0.0)
57
57
  ] = None
58
58
  pacing: pacing_1.Pacing | None = None
59
59
  paused: Annotated[
60
60
  bool | None,
61
61
  Field(
62
- description='Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.'
62
+ description="Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false."
63
63
  ),
64
64
  ] = False
65
65
  pricing_option_id: Annotated[
@@ -68,5 +68,5 @@ class PackageRequest(AdCPBaseModel):
68
68
  description="ID of the selected pricing option from the product's pricing_options array"
69
69
  ),
70
70
  ]
71
- product_id: Annotated[str, Field(description='Product ID for this package')]
71
+ product_id: Annotated[str, Field(description="Product ID for this package")]
72
72
  targeting_overlay: targeting.TargetingOverlay | None = None
@@ -17,19 +17,19 @@ from ..enums import pacing as pacing_1
17
17
 
18
18
  class PackageUpdate1(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='allow',
20
+ extra="allow",
21
21
  )
22
22
  bid_price: Annotated[
23
23
  float | None,
24
24
  Field(
25
- description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
25
+ description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
26
26
  ge=0.0,
27
27
  ),
28
28
  ] = None
29
29
  budget: Annotated[
30
30
  float | None,
31
31
  Field(
32
- description='Updated budget allocation for this package in the currency specified by the pricing option',
32
+ description="Updated budget allocation for this package in the currency specified by the pricing option",
33
33
  ge=0.0,
34
34
  ),
35
35
  ] = None
@@ -39,44 +39,44 @@ class PackageUpdate1(AdCPBaseModel):
39
39
  creative_assignments: Annotated[
40
40
  list[creative_assignment.CreativeAssignment] | None,
41
41
  Field(
42
- description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
42
+ description="Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged."
43
43
  ),
44
44
  ] = None
45
45
  creatives: Annotated[
46
46
  list[creative_asset.CreativeAsset] | None,
47
47
  Field(
48
- description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
48
+ description="Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.",
49
49
  max_length=100,
50
50
  ),
51
51
  ] = None
52
52
  ext: ext_1.ExtensionObject | None = None
53
53
  impressions: Annotated[
54
- float | None, Field(description='Updated impression goal for this package', ge=0.0)
54
+ float | None, Field(description="Updated impression goal for this package", ge=0.0)
55
55
  ] = None
56
56
  pacing: pacing_1.Pacing | None = None
57
57
  package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
58
58
  paused: Annotated[
59
59
  bool | None,
60
- Field(description='Pause/resume specific package (true = paused, false = active)'),
60
+ Field(description="Pause/resume specific package (true = paused, false = active)"),
61
61
  ] = None
62
62
  targeting_overlay: targeting.TargetingOverlay | None = None
63
63
 
64
64
 
65
65
  class PackageUpdate2(AdCPBaseModel):
66
66
  model_config = ConfigDict(
67
- extra='allow',
67
+ extra="allow",
68
68
  )
69
69
  bid_price: Annotated[
70
70
  float | None,
71
71
  Field(
72
- description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
72
+ description="Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)",
73
73
  ge=0.0,
74
74
  ),
75
75
  ] = None
76
76
  budget: Annotated[
77
77
  float | None,
78
78
  Field(
79
- description='Updated budget allocation for this package in the currency specified by the pricing option',
79
+ description="Updated budget allocation for this package in the currency specified by the pricing option",
80
80
  ge=0.0,
81
81
  ),
82
82
  ] = None
@@ -84,19 +84,19 @@ class PackageUpdate2(AdCPBaseModel):
84
84
  creative_assignments: Annotated[
85
85
  list[creative_assignment.CreativeAssignment] | None,
86
86
  Field(
87
- description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
87
+ description="Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged."
88
88
  ),
89
89
  ] = None
90
90
  creatives: Annotated[
91
91
  list[creative_asset.CreativeAsset] | None,
92
92
  Field(
93
- description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
93
+ description="Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.",
94
94
  max_length=100,
95
95
  ),
96
96
  ] = None
97
97
  ext: ext_1.ExtensionObject | None = None
98
98
  impressions: Annotated[
99
- float | None, Field(description='Updated impression goal for this package', ge=0.0)
99
+ float | None, Field(description="Updated impression goal for this package", ge=0.0)
100
100
  ] = None
101
101
  pacing: pacing_1.Pacing | None = None
102
102
  package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
@@ -104,7 +104,7 @@ class PackageUpdate2(AdCPBaseModel):
104
104
  )
105
105
  paused: Annotated[
106
106
  bool | None,
107
- Field(description='Pause/resume specific package (true = paused, false = active)'),
107
+ Field(description="Pause/resume specific package (true = paused, false = active)"),
108
108
  ] = None
109
109
  targeting_overlay: targeting.TargetingOverlay | None = None
110
110
 
@@ -113,7 +113,7 @@ class PackageUpdate(RootModel[PackageUpdate1 | PackageUpdate2]):
113
113
  root: Annotated[
114
114
  PackageUpdate1 | PackageUpdate2,
115
115
  Field(
116
- description='Package update configuration for update_media_buy. Identifies package by package_id or buyer_ref and specifies fields to modify. Fields not present are left unchanged. Note: product_id, format_ids, and pricing_option_id cannot be changed after creation.',
117
- title='Package Update',
116
+ description="Package update configuration for update_media_buy. Identifies package by package_id or buyer_ref and specifies fields to modify. Fields not present are left unchanged. Note: product_id, format_ids, and pricing_option_id cannot be changed after creation.",
117
+ title="Package Update",
118
118
  ),
119
119
  ]
@@ -17,19 +17,19 @@ from ..enums import metric_type as metric_type_1
17
17
 
18
18
  class MeasurementPeriod(AdCPBaseModel):
19
19
  model_config = ConfigDict(
20
- extra='allow',
20
+ extra="allow",
21
21
  )
22
22
  end: Annotated[
23
- AwareDatetime, Field(description='ISO 8601 end timestamp for measurement period')
23
+ AwareDatetime, Field(description="ISO 8601 end timestamp for measurement period")
24
24
  ]
25
25
  start: Annotated[
26
- AwareDatetime, Field(description='ISO 8601 start timestamp for measurement period')
26
+ AwareDatetime, Field(description="ISO 8601 start timestamp for measurement period")
27
27
  ]
28
28
 
29
29
 
30
30
  class ProvidePerformanceFeedbackRequest1(AdCPBaseModel):
31
31
  model_config = ConfigDict(
32
- extra='allow',
32
+ extra="allow",
33
33
  )
34
34
  buyer_ref: Annotated[
35
35
  str | None, Field(description="Buyer's reference for the media buy", min_length=1)
@@ -38,33 +38,33 @@ class ProvidePerformanceFeedbackRequest1(AdCPBaseModel):
38
38
  creative_id: Annotated[
39
39
  str | None,
40
40
  Field(
41
- description='Specific creative asset (if feedback is creative-specific)', min_length=1
41
+ description="Specific creative asset (if feedback is creative-specific)", min_length=1
42
42
  ),
43
43
  ] = None
44
44
  ext: ext_1.ExtensionObject | None = None
45
45
  feedback_source: Annotated[
46
- feedback_source_1.FeedbackSource | None, Field(description='Source of the performance data')
46
+ feedback_source_1.FeedbackSource | None, Field(description="Source of the performance data")
47
47
  ] = feedback_source_1.FeedbackSource.buyer_attribution
48
48
  measurement_period: Annotated[
49
- MeasurementPeriod, Field(description='Time period for performance measurement')
49
+ MeasurementPeriod, Field(description="Time period for performance measurement")
50
50
  ]
51
51
  media_buy_id: Annotated[
52
52
  str, Field(description="Publisher's media buy identifier", min_length=1)
53
53
  ]
54
54
  metric_type: Annotated[
55
- metric_type_1.MetricType | None, Field(description='The business metric being measured')
55
+ metric_type_1.MetricType | None, Field(description="The business metric being measured")
56
56
  ] = metric_type_1.MetricType.overall_performance
57
57
  package_id: Annotated[
58
58
  str | None,
59
59
  Field(
60
- description='Specific package within the media buy (if feedback is package-specific)',
60
+ description="Specific package within the media buy (if feedback is package-specific)",
61
61
  min_length=1,
62
62
  ),
63
63
  ] = None
64
64
  performance_index: Annotated[
65
65
  float,
66
66
  Field(
67
- description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
67
+ description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
68
68
  ge=0.0,
69
69
  ),
70
70
  ]
@@ -72,7 +72,7 @@ class ProvidePerformanceFeedbackRequest1(AdCPBaseModel):
72
72
 
73
73
  class ProvidePerformanceFeedbackRequest2(AdCPBaseModel):
74
74
  model_config = ConfigDict(
75
- extra='allow',
75
+ extra="allow",
76
76
  )
77
77
  buyer_ref: Annotated[
78
78
  str, Field(description="Buyer's reference for the media buy", min_length=1)
@@ -81,33 +81,33 @@ class ProvidePerformanceFeedbackRequest2(AdCPBaseModel):
81
81
  creative_id: Annotated[
82
82
  str | None,
83
83
  Field(
84
- description='Specific creative asset (if feedback is creative-specific)', min_length=1
84
+ description="Specific creative asset (if feedback is creative-specific)", min_length=1
85
85
  ),
86
86
  ] = None
87
87
  ext: ext_1.ExtensionObject | None = None
88
88
  feedback_source: Annotated[
89
- feedback_source_1.FeedbackSource | None, Field(description='Source of the performance data')
89
+ feedback_source_1.FeedbackSource | None, Field(description="Source of the performance data")
90
90
  ] = feedback_source_1.FeedbackSource.buyer_attribution
91
91
  measurement_period: Annotated[
92
- MeasurementPeriod, Field(description='Time period for performance measurement')
92
+ MeasurementPeriod, Field(description="Time period for performance measurement")
93
93
  ]
94
94
  media_buy_id: Annotated[
95
95
  str | None, Field(description="Publisher's media buy identifier", min_length=1)
96
96
  ] = None
97
97
  metric_type: Annotated[
98
- metric_type_1.MetricType | None, Field(description='The business metric being measured')
98
+ metric_type_1.MetricType | None, Field(description="The business metric being measured")
99
99
  ] = metric_type_1.MetricType.overall_performance
100
100
  package_id: Annotated[
101
101
  str | None,
102
102
  Field(
103
- description='Specific package within the media buy (if feedback is package-specific)',
103
+ description="Specific package within the media buy (if feedback is package-specific)",
104
104
  min_length=1,
105
105
  ),
106
106
  ] = None
107
107
  performance_index: Annotated[
108
108
  float,
109
109
  Field(
110
- description='Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)',
110
+ description="Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)",
111
111
  ge=0.0,
112
112
  ),
113
113
  ]
@@ -119,7 +119,7 @@ class ProvidePerformanceFeedbackRequest(
119
119
  root: Annotated[
120
120
  ProvidePerformanceFeedbackRequest1 | ProvidePerformanceFeedbackRequest2,
121
121
  Field(
122
- description='Request payload for provide_performance_feedback task',
123
- title='Provide Performance Feedback Request',
122
+ description="Request payload for provide_performance_feedback task",
123
+ title="Provide Performance Feedback Request",
124
124
  ),
125
125
  ]
@@ -16,25 +16,25 @@ from ..core import ext as ext_1
16
16
 
17
17
  class ProvidePerformanceFeedbackResponse1(AdCPBaseModel):
18
18
  model_config = ConfigDict(
19
- extra='allow',
19
+ extra="allow",
20
20
  )
21
21
  context: context_1.ContextObject | None = None
22
22
  ext: ext_1.ExtensionObject | None = None
23
23
  success: Annotated[
24
24
  Literal[True],
25
- Field(description='Whether the performance feedback was successfully received'),
25
+ Field(description="Whether the performance feedback was successfully received"),
26
26
  ]
27
27
 
28
28
 
29
29
  class ProvidePerformanceFeedbackResponse2(AdCPBaseModel):
30
30
  model_config = ConfigDict(
31
- extra='allow',
31
+ extra="allow",
32
32
  )
33
33
  context: context_1.ContextObject | None = None
34
34
  errors: Annotated[
35
35
  list[error.Error],
36
36
  Field(
37
- description='Array of errors explaining why feedback was rejected (e.g., invalid measurement period, missing campaign data)',
37
+ description="Array of errors explaining why feedback was rejected (e.g., invalid measurement period, missing campaign data)",
38
38
  min_length=1,
39
39
  ),
40
40
  ]
@@ -47,7 +47,7 @@ class ProvidePerformanceFeedbackResponse(
47
47
  root: Annotated[
48
48
  ProvidePerformanceFeedbackResponse1 | ProvidePerformanceFeedbackResponse2,
49
49
  Field(
50
- description='Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.',
51
- title='Provide Performance Feedback Response',
50
+ description="Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.",
51
+ title="Provide Performance Feedback Response",
52
52
  ),
53
53
  ]
@@ -15,17 +15,17 @@ from ..core import ext as ext_1
15
15
 
16
16
 
17
17
  class Reason(Enum):
18
- APPROVAL_REQUIRED = 'APPROVAL_REQUIRED'
19
- ASSET_CONFIRMATION = 'ASSET_CONFIRMATION'
20
- FORMAT_CLARIFICATION = 'FORMAT_CLARIFICATION'
18
+ APPROVAL_REQUIRED = "APPROVAL_REQUIRED"
19
+ ASSET_CONFIRMATION = "ASSET_CONFIRMATION"
20
+ FORMAT_CLARIFICATION = "FORMAT_CLARIFICATION"
21
21
 
22
22
 
23
23
  class SyncCreativesInputRequired(AdCPBaseModel):
24
24
  model_config = ConfigDict(
25
- extra='allow',
25
+ extra="allow",
26
26
  )
27
27
  context: context_1.ContextObject | None = None
28
28
  ext: ext_1.ExtensionObject | None = None
29
29
  reason: Annotated[
30
- Reason | None, Field(description='Reason code indicating why buyer input is needed')
30
+ Reason | None, Field(description="Reason code indicating why buyer input is needed")
31
31
  ] = None
@@ -13,7 +13,7 @@ from ..core import ext as ext_1
13
13
 
14
14
  class SyncCreativesSubmitted(AdCPBaseModel):
15
15
  model_config = ConfigDict(
16
- extra='allow',
16
+ extra="allow",
17
17
  )
18
18
  context: context_1.ContextObject | None = None
19
19
  ext: ext_1.ExtensionObject | None = None
@@ -15,23 +15,23 @@ from ..core import ext as ext_1
15
15
 
16
16
  class SyncCreativesWorking(AdCPBaseModel):
17
17
  model_config = ConfigDict(
18
- extra='allow',
18
+ extra="allow",
19
19
  )
20
20
  context: context_1.ContextObject | None = None
21
21
  creatives_processed: Annotated[
22
- int | None, Field(description='Number of creatives processed so far', ge=0)
22
+ int | None, Field(description="Number of creatives processed so far", ge=0)
23
23
  ] = None
24
24
  creatives_total: Annotated[
25
- int | None, Field(description='Total number of creatives to process', ge=0)
25
+ int | None, Field(description="Total number of creatives to process", ge=0)
26
26
  ] = None
27
27
  current_step: Annotated[
28
- str | None, Field(description='Current step or phase of the operation')
28
+ str | None, Field(description="Current step or phase of the operation")
29
29
  ] = None
30
30
  ext: ext_1.ExtensionObject | None = None
31
31
  percentage: Annotated[
32
- float | None, Field(description='Completion percentage (0-100)', ge=0.0, le=100.0)
32
+ float | None, Field(description="Completion percentage (0-100)", ge=0.0, le=100.0)
33
33
  ] = None
34
- step_number: Annotated[int | None, Field(description='Current step number', ge=1)] = None
34
+ step_number: Annotated[int | None, Field(description="Current step number", ge=1)] = None
35
35
  total_steps: Annotated[
36
- int | None, Field(description='Total number of steps in the operation', ge=1)
36
+ int | None, Field(description="Total number of steps in the operation", ge=1)
37
37
  ] = None