adcp 2.18.0__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +87 -1
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -18
  18. adcp/types/_generated.py +419 -44
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +103 -6
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +1 -1
  41. adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
  42. adcp/types/generated_poc/core/assets/css_asset.py +1 -1
  43. adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
  44. adcp/types/generated_poc/core/assets/html_asset.py +1 -1
  45. adcp/types/generated_poc/core/assets/image_asset.py +1 -1
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
  47. adcp/types/generated_poc/core/assets/text_asset.py +1 -1
  48. adcp/types/generated_poc/core/assets/url_asset.py +1 -1
  49. adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
  50. adcp/types/generated_poc/core/assets/video_asset.py +1 -1
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
  52. adcp/types/generated_poc/core/async_response_data.py +1 -1
  53. adcp/types/generated_poc/core/brand_manifest.py +68 -5
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
  55. adcp/types/generated_poc/core/context.py +1 -1
  56. adcp/types/generated_poc/core/creative_asset.py +8 -7
  57. adcp/types/generated_poc/core/creative_assignment.py +1 -1
  58. adcp/types/generated_poc/core/creative_filters.py +4 -14
  59. adcp/types/generated_poc/core/creative_manifest.py +1 -1
  60. adcp/types/generated_poc/core/creative_policy.py +1 -1
  61. adcp/types/generated_poc/core/delivery_metrics.py +1 -1
  62. adcp/types/generated_poc/core/deployment.py +1 -1
  63. adcp/types/generated_poc/core/destination.py +1 -1
  64. adcp/types/generated_poc/core/error.py +1 -1
  65. adcp/types/generated_poc/core/ext.py +1 -1
  66. adcp/types/generated_poc/core/format.py +6 -5
  67. adcp/types/generated_poc/core/format_id.py +1 -1
  68. adcp/types/generated_poc/core/frequency_cap.py +1 -1
  69. adcp/types/generated_poc/core/identifier.py +27 -0
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
  71. adcp/types/generated_poc/core/measurement.py +1 -1
  72. adcp/types/generated_poc/core/media_buy.py +1 -1
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +1 -1
  76. adcp/types/generated_poc/core/performance_feedback.py +1 -1
  77. adcp/types/generated_poc/core/placement.py +1 -1
  78. adcp/types/generated_poc/core/pricing_option.py +8 -14
  79. adcp/types/generated_poc/core/product.py +1 -1
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +72 -7
  82. adcp/types/generated_poc/core/promoted_offerings.py +12 -21
  83. adcp/types/generated_poc/core/promoted_products.py +1 -1
  84. adcp/types/generated_poc/core/property.py +1 -1
  85. adcp/types/generated_poc/core/property_id.py +1 -1
  86. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  87. adcp/types/generated_poc/core/property_tag.py +1 -1
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +1 -1
  90. adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
  91. adcp/types/generated_poc/core/push_notification_config.py +1 -1
  92. adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +1 -1
  95. adcp/types/generated_poc/core/signal_filters.py +1 -1
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +1 -1
  98. adcp/types/generated_poc/core/targeting.py +55 -14
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
  101. adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
  102. adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
  103. adcp/types/generated_poc/creative/preview_render.py +1 -1
  104. adcp/types/generated_poc/enums/adcp_domain.py +3 -1
  105. adcp/types/generated_poc/enums/asset_content_type.py +1 -1
  106. adcp/types/generated_poc/enums/auth_scheme.py +1 -1
  107. adcp/types/generated_poc/enums/available_metric.py +1 -1
  108. adcp/types/generated_poc/enums/channels.py +18 -8
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
  110. adcp/types/generated_poc/enums/creative_action.py +1 -1
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
  112. adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
  113. adcp/types/generated_poc/enums/creative_status.py +2 -1
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
  115. adcp/types/generated_poc/enums/daast_version.py +1 -1
  116. adcp/types/generated_poc/enums/delivery_type.py +1 -1
  117. adcp/types/generated_poc/enums/dimension_unit.py +1 -1
  118. adcp/types/generated_poc/enums/feed_format.py +1 -1
  119. adcp/types/generated_poc/enums/feedback_source.py +1 -1
  120. adcp/types/generated_poc/enums/format_category.py +1 -1
  121. adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +1 -1
  125. adcp/types/generated_poc/enums/http_method.py +1 -1
  126. adcp/types/generated_poc/enums/identifier_types.py +1 -1
  127. adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
  129. adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
  130. adcp/types/generated_poc/enums/media_buy_status.py +1 -1
  131. adcp/types/generated_poc/enums/metric_type.py +1 -1
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +1 -1
  134. adcp/types/generated_poc/enums/pacing.py +1 -1
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +1 -1
  137. adcp/types/generated_poc/enums/pricing_model.py +1 -1
  138. adcp/types/generated_poc/enums/property_type.py +2 -1
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
  140. adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
  142. adcp/types/generated_poc/enums/sort_direction.py +1 -1
  143. adcp/types/generated_poc/enums/task_status.py +1 -1
  144. adcp/types/generated_poc/enums/task_type.py +7 -1
  145. adcp/types/generated_poc/enums/update_frequency.py +1 -1
  146. adcp/types/generated_poc/enums/url_asset_type.py +1 -1
  147. adcp/types/generated_poc/enums/validation_mode.py +1 -1
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
  149. adcp/types/generated_poc/enums/vast_version.py +1 -1
  150. adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
  151. adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
  152. adcp/types/generated_poc/extensions/__init__.py +3 -0
  153. adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  154. adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
  155. adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  158. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
  159. adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
  160. adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
  162. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
  163. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
  164. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
  165. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
  166. adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
  167. adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
  169. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  170. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
  171. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
  172. adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
  173. adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
  174. adcp/types/generated_poc/media_buy/package_request.py +15 -6
  175. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
  187. adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
  188. adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
  189. adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
  190. adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
  191. adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
  192. adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
  193. adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
  194. adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
  195. adcp/types/generated_poc/property/__init__.py +3 -0
  196. adcp/types/generated_poc/property/base_property_source.py +86 -0
  197. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  198. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  199. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  200. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  201. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  202. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  203. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  204. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  205. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  206. adcp/types/generated_poc/property/property_error.py +33 -0
  207. adcp/types/generated_poc/property/property_feature.py +22 -0
  208. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  209. adcp/types/generated_poc/property/property_list.py +62 -0
  210. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  211. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  212. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  213. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  214. adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
  218. adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
  219. adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
  220. adcp/types/generated_poc/signals/get_signals_request.py +1 -1
  221. adcp/types/generated_poc/signals/get_signals_response.py +1 -1
  222. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. adcp/utils/format_assets.py +5 -5
  235. adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  237. adcp-3.0.0.dist-info/RECORD +264 -0
  238. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  239. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  240. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp-2.18.0.dist-info/RECORD +0 -195
  243. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  244. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  245. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,444 @@
1
+ """Sponsored Intelligence protocol handler.
2
+
3
+ Provides a base class for implementing Sponsored Intelligence agents.
4
+ Non-SI operations return 'not supported' by default.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from abc import abstractmethod
10
+ from typing import Any
11
+
12
+ from pydantic import ValidationError
13
+
14
+ from adcp.server.base import ADCPHandler, NotImplementedResponse, ToolContext, not_supported
15
+ from adcp.types import (
16
+ Error,
17
+ SiGetOfferingRequest,
18
+ SiGetOfferingResponse,
19
+ SiInitiateSessionRequest,
20
+ SiInitiateSessionResponse,
21
+ SiSendMessageRequest,
22
+ SiSendMessageResponse,
23
+ SiTerminateSessionRequest,
24
+ SiTerminateSessionResponse,
25
+ )
26
+
27
+
28
+ class SponsoredIntelligenceHandler(ADCPHandler):
29
+ """Handler for Sponsored Intelligence protocol.
30
+
31
+ Subclass this to implement a Sponsored Intelligence agent. All SI
32
+ operations must be implemented via the handle_* methods.
33
+ The public methods (si_get_offering, etc.) handle validation and
34
+ error handling automatically.
35
+
36
+ Non-SI operations (get_products, create_media_buy, content standards, etc.)
37
+ return 'not supported'.
38
+
39
+ Example:
40
+ class MySIHandler(SponsoredIntelligenceHandler):
41
+ async def handle_si_get_offering(
42
+ self,
43
+ request: SiGetOfferingRequest,
44
+ context: ToolContext | None = None
45
+ ) -> SiGetOfferingResponse:
46
+ # Your implementation
47
+ return SiGetOfferingResponse(...)
48
+ """
49
+
50
+ # ========================================================================
51
+ # Sponsored Intelligence Operations - Override base class with validation
52
+ # ========================================================================
53
+
54
+ async def si_get_offering(
55
+ self,
56
+ params: dict[str, Any],
57
+ context: ToolContext | None = None,
58
+ ) -> SiGetOfferingResponse | NotImplementedResponse:
59
+ """Get sponsored intelligence offering.
60
+
61
+ Validates params and delegates to handle_si_get_offering.
62
+
63
+ Args:
64
+ params: Request parameters as dict
65
+ context: Optional tool context
66
+
67
+ Returns:
68
+ SI offering response with capabilities and pricing, or error response
69
+ """
70
+ try:
71
+ request = SiGetOfferingRequest.model_validate(params)
72
+ except ValidationError as e:
73
+ return NotImplementedResponse(
74
+ supported=False,
75
+ reason=f"Invalid request: {e}",
76
+ error=Error(code="VALIDATION_ERROR", message=str(e)),
77
+ )
78
+ return await self.handle_si_get_offering(request, context)
79
+
80
+ async def si_initiate_session(
81
+ self,
82
+ params: dict[str, Any],
83
+ context: ToolContext | None = None,
84
+ ) -> SiInitiateSessionResponse | NotImplementedResponse:
85
+ """Initiate sponsored intelligence session.
86
+
87
+ Validates params and delegates to handle_si_initiate_session.
88
+
89
+ Args:
90
+ params: Request parameters as dict
91
+ context: Optional tool context
92
+
93
+ Returns:
94
+ Session initiation response with session ID, or error response
95
+ """
96
+ try:
97
+ request = SiInitiateSessionRequest.model_validate(params)
98
+ except ValidationError as e:
99
+ return NotImplementedResponse(
100
+ supported=False,
101
+ reason=f"Invalid request: {e}",
102
+ error=Error(code="VALIDATION_ERROR", message=str(e)),
103
+ )
104
+ return await self.handle_si_initiate_session(request, context)
105
+
106
+ async def si_send_message(
107
+ self,
108
+ params: dict[str, Any],
109
+ context: ToolContext | None = None,
110
+ ) -> SiSendMessageResponse | NotImplementedResponse:
111
+ """Send message in sponsored intelligence session.
112
+
113
+ Validates params and delegates to handle_si_send_message.
114
+
115
+ Args:
116
+ params: Request parameters as dict
117
+ context: Optional tool context
118
+
119
+ Returns:
120
+ Message response with AI-generated content, or error response
121
+ """
122
+ try:
123
+ request = SiSendMessageRequest.model_validate(params)
124
+ except ValidationError as e:
125
+ return NotImplementedResponse(
126
+ supported=False,
127
+ reason=f"Invalid request: {e}",
128
+ error=Error(code="VALIDATION_ERROR", message=str(e)),
129
+ )
130
+ return await self.handle_si_send_message(request, context)
131
+
132
+ async def si_terminate_session(
133
+ self,
134
+ params: dict[str, Any],
135
+ context: ToolContext | None = None,
136
+ ) -> SiTerminateSessionResponse | NotImplementedResponse:
137
+ """Terminate sponsored intelligence session.
138
+
139
+ Validates params and delegates to handle_si_terminate_session.
140
+
141
+ Args:
142
+ params: Request parameters as dict
143
+ context: Optional tool context
144
+
145
+ Returns:
146
+ Termination response with session summary, or error response
147
+ """
148
+ try:
149
+ request = SiTerminateSessionRequest.model_validate(params)
150
+ except ValidationError as e:
151
+ return NotImplementedResponse(
152
+ supported=False,
153
+ reason=f"Invalid request: {e}",
154
+ error=Error(code="VALIDATION_ERROR", message=str(e)),
155
+ )
156
+ return await self.handle_si_terminate_session(request, context)
157
+
158
+ # ========================================================================
159
+ # Abstract handlers - Implement these in subclasses
160
+ # ========================================================================
161
+
162
+ @abstractmethod
163
+ async def handle_si_get_offering(
164
+ self,
165
+ request: SiGetOfferingRequest,
166
+ context: ToolContext | None = None,
167
+ ) -> SiGetOfferingResponse:
168
+ """Handle get offering request.
169
+
170
+ Must be implemented by Sponsored Intelligence agents.
171
+
172
+ Args:
173
+ request: Validated SI offering request
174
+ context: Optional tool context
175
+
176
+ Returns:
177
+ SI offering response with capabilities and pricing
178
+ """
179
+ ...
180
+
181
+ @abstractmethod
182
+ async def handle_si_initiate_session(
183
+ self,
184
+ request: SiInitiateSessionRequest,
185
+ context: ToolContext | None = None,
186
+ ) -> SiInitiateSessionResponse:
187
+ """Handle initiate session request.
188
+
189
+ Must be implemented by Sponsored Intelligence agents.
190
+
191
+ Args:
192
+ request: Validated session initiation request
193
+ context: Optional tool context
194
+
195
+ Returns:
196
+ Session initiation response with session ID
197
+ """
198
+ ...
199
+
200
+ @abstractmethod
201
+ async def handle_si_send_message(
202
+ self,
203
+ request: SiSendMessageRequest,
204
+ context: ToolContext | None = None,
205
+ ) -> SiSendMessageResponse:
206
+ """Handle send message request.
207
+
208
+ Must be implemented by Sponsored Intelligence agents.
209
+
210
+ Args:
211
+ request: Validated message request with session ID and content
212
+ context: Optional tool context
213
+
214
+ Returns:
215
+ Message response with AI-generated content
216
+ """
217
+ ...
218
+
219
+ @abstractmethod
220
+ async def handle_si_terminate_session(
221
+ self,
222
+ request: SiTerminateSessionRequest,
223
+ context: ToolContext | None = None,
224
+ ) -> SiTerminateSessionResponse:
225
+ """Handle terminate session request.
226
+
227
+ Must be implemented by Sponsored Intelligence agents.
228
+
229
+ Args:
230
+ request: Validated session termination request
231
+ context: Optional tool context
232
+
233
+ Returns:
234
+ Termination response with session summary
235
+ """
236
+ ...
237
+
238
+ # ========================================================================
239
+ # Non-SI Operations - Return 'not supported'
240
+ # ========================================================================
241
+
242
+ async def get_products(
243
+ self, params: dict[str, Any], context: ToolContext | None = None
244
+ ) -> NotImplementedResponse:
245
+ """Not supported by Sponsored Intelligence agents."""
246
+ return not_supported(
247
+ "get_products is not supported by Sponsored Intelligence agents. "
248
+ "This agent handles conversational AI sponsorship, not product catalog operations."
249
+ )
250
+
251
+ async def list_creative_formats(
252
+ self, params: dict[str, Any], context: ToolContext | None = None
253
+ ) -> NotImplementedResponse:
254
+ """Not supported by Sponsored Intelligence agents."""
255
+ return not_supported(
256
+ "list_creative_formats is not supported by Sponsored Intelligence agents."
257
+ )
258
+
259
+ async def list_authorized_properties(
260
+ self, params: dict[str, Any], context: ToolContext | None = None
261
+ ) -> NotImplementedResponse:
262
+ """Not supported by Sponsored Intelligence agents."""
263
+ return not_supported(
264
+ "list_authorized_properties is not supported by Sponsored Intelligence agents."
265
+ )
266
+
267
+ async def sync_creatives(
268
+ self, params: dict[str, Any], context: ToolContext | None = None
269
+ ) -> NotImplementedResponse:
270
+ """Not supported by Sponsored Intelligence agents."""
271
+ return not_supported(
272
+ "sync_creatives is not supported by Sponsored Intelligence agents."
273
+ )
274
+
275
+ async def list_creatives(
276
+ self, params: dict[str, Any], context: ToolContext | None = None
277
+ ) -> NotImplementedResponse:
278
+ """Not supported by Sponsored Intelligence agents."""
279
+ return not_supported(
280
+ "list_creatives is not supported by Sponsored Intelligence agents."
281
+ )
282
+
283
+ async def build_creative(
284
+ self, params: dict[str, Any], context: ToolContext | None = None
285
+ ) -> NotImplementedResponse:
286
+ """Not supported by Sponsored Intelligence agents."""
287
+ return not_supported(
288
+ "build_creative is not supported by Sponsored Intelligence agents."
289
+ )
290
+
291
+ async def create_media_buy(
292
+ self, params: dict[str, Any], context: ToolContext | None = None
293
+ ) -> NotImplementedResponse:
294
+ """Not supported by Sponsored Intelligence agents."""
295
+ return not_supported(
296
+ "create_media_buy is not supported by Sponsored Intelligence agents. "
297
+ "SI sessions are initiated via si_initiate_session, not media buys."
298
+ )
299
+
300
+ async def update_media_buy(
301
+ self, params: dict[str, Any], context: ToolContext | None = None
302
+ ) -> NotImplementedResponse:
303
+ """Not supported by Sponsored Intelligence agents."""
304
+ return not_supported(
305
+ "update_media_buy is not supported by Sponsored Intelligence agents."
306
+ )
307
+
308
+ async def get_media_buy_delivery(
309
+ self, params: dict[str, Any], context: ToolContext | None = None
310
+ ) -> NotImplementedResponse:
311
+ """Not supported by Sponsored Intelligence agents."""
312
+ return not_supported(
313
+ "get_media_buy_delivery is not supported by Sponsored Intelligence agents."
314
+ )
315
+
316
+ async def get_signals(
317
+ self, params: dict[str, Any], context: ToolContext | None = None
318
+ ) -> NotImplementedResponse:
319
+ """Not supported by Sponsored Intelligence agents."""
320
+ return not_supported(
321
+ "get_signals is not supported by Sponsored Intelligence agents."
322
+ )
323
+
324
+ async def activate_signal(
325
+ self, params: dict[str, Any], context: ToolContext | None = None
326
+ ) -> NotImplementedResponse:
327
+ """Not supported by Sponsored Intelligence agents."""
328
+ return not_supported(
329
+ "activate_signal is not supported by Sponsored Intelligence agents."
330
+ )
331
+
332
+ async def provide_performance_feedback(
333
+ self, params: dict[str, Any], context: ToolContext | None = None
334
+ ) -> NotImplementedResponse:
335
+ """Not supported by Sponsored Intelligence agents."""
336
+ return not_supported(
337
+ "provide_performance_feedback is not supported by Sponsored Intelligence agents."
338
+ )
339
+
340
+ # ========================================================================
341
+ # V3 Content Standards - Not supported
342
+ # ========================================================================
343
+
344
+ async def create_content_standards(
345
+ self, params: dict[str, Any], context: ToolContext | None = None
346
+ ) -> NotImplementedResponse:
347
+ """Not supported by Sponsored Intelligence agents."""
348
+ return not_supported(
349
+ "create_content_standards is not supported by Sponsored Intelligence agents. "
350
+ "Use a Content Standards agent for content calibration."
351
+ )
352
+
353
+ async def get_content_standards(
354
+ self, params: dict[str, Any], context: ToolContext | None = None
355
+ ) -> NotImplementedResponse:
356
+ """Not supported by Sponsored Intelligence agents."""
357
+ return not_supported(
358
+ "get_content_standards is not supported by Sponsored Intelligence agents."
359
+ )
360
+
361
+ async def list_content_standards(
362
+ self, params: dict[str, Any], context: ToolContext | None = None
363
+ ) -> NotImplementedResponse:
364
+ """Not supported by Sponsored Intelligence agents."""
365
+ return not_supported(
366
+ "list_content_standards is not supported by Sponsored Intelligence agents."
367
+ )
368
+
369
+ async def update_content_standards(
370
+ self, params: dict[str, Any], context: ToolContext | None = None
371
+ ) -> NotImplementedResponse:
372
+ """Not supported by Sponsored Intelligence agents."""
373
+ return not_supported(
374
+ "update_content_standards is not supported by Sponsored Intelligence agents."
375
+ )
376
+
377
+ async def calibrate_content(
378
+ self, params: dict[str, Any], context: ToolContext | None = None
379
+ ) -> NotImplementedResponse:
380
+ """Not supported by Sponsored Intelligence agents."""
381
+ return not_supported(
382
+ "calibrate_content is not supported by Sponsored Intelligence agents."
383
+ )
384
+
385
+ async def validate_content_delivery(
386
+ self, params: dict[str, Any], context: ToolContext | None = None
387
+ ) -> NotImplementedResponse:
388
+ """Not supported by Sponsored Intelligence agents."""
389
+ return not_supported(
390
+ "validate_content_delivery is not supported by Sponsored Intelligence agents."
391
+ )
392
+
393
+ async def get_media_buy_artifacts(
394
+ self, params: dict[str, Any], context: ToolContext | None = None
395
+ ) -> NotImplementedResponse:
396
+ """Not supported by Sponsored Intelligence agents."""
397
+ return not_supported(
398
+ "get_media_buy_artifacts is not supported by Sponsored Intelligence agents."
399
+ )
400
+
401
+ # ========================================================================
402
+ # V3 Governance (Property Lists) - Not supported
403
+ # ========================================================================
404
+
405
+ async def create_property_list(
406
+ self, params: dict[str, Any], context: ToolContext | None = None
407
+ ) -> NotImplementedResponse:
408
+ """Not supported by Sponsored Intelligence agents."""
409
+ return not_supported(
410
+ "create_property_list is not supported by Sponsored Intelligence agents. "
411
+ "Use a Governance agent for property list operations."
412
+ )
413
+
414
+ async def get_property_list(
415
+ self, params: dict[str, Any], context: ToolContext | None = None
416
+ ) -> NotImplementedResponse:
417
+ """Not supported by Sponsored Intelligence agents."""
418
+ return not_supported(
419
+ "get_property_list is not supported by Sponsored Intelligence agents."
420
+ )
421
+
422
+ async def list_property_lists(
423
+ self, params: dict[str, Any], context: ToolContext | None = None
424
+ ) -> NotImplementedResponse:
425
+ """Not supported by Sponsored Intelligence agents."""
426
+ return not_supported(
427
+ "list_property_lists is not supported by Sponsored Intelligence agents."
428
+ )
429
+
430
+ async def update_property_list(
431
+ self, params: dict[str, Any], context: ToolContext | None = None
432
+ ) -> NotImplementedResponse:
433
+ """Not supported by Sponsored Intelligence agents."""
434
+ return not_supported(
435
+ "update_property_list is not supported by Sponsored Intelligence agents."
436
+ )
437
+
438
+ async def delete_property_list(
439
+ self, params: dict[str, Any], context: ToolContext | None = None
440
+ ) -> NotImplementedResponse:
441
+ """Not supported by Sponsored Intelligence agents."""
442
+ return not_supported(
443
+ "delete_property_list is not supported by Sponsored Intelligence agents."
444
+ )