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.
- adcp/ADCP_VERSION +1 -1
- adcp/__init__.py +6 -14
- adcp/__main__.py +94 -51
- adcp/adagents.py +91 -19
- adcp/client.py +865 -0
- adcp/protocols/a2a.py +84 -0
- adcp/protocols/base.py +101 -0
- adcp/protocols/mcp.py +87 -1
- adcp/server/__init__.py +49 -0
- adcp/server/base.py +368 -0
- adcp/server/content_standards.py +561 -0
- adcp/server/governance.py +491 -0
- adcp/server/mcp_tools.py +471 -0
- adcp/server/proposal.py +334 -0
- adcp/server/sponsored_intelligence.py +444 -0
- adcp/types/__init__.py +111 -23
- adcp/types/_ergonomic.py +35 -18
- adcp/types/_generated.py +419 -44
- adcp/types/aliases.py +13 -20
- adcp/types/base.py +1 -1
- adcp/types/generated_poc/adagents.py +103 -6
- adcp/types/generated_poc/content_standards/__init__.py +3 -0
- adcp/types/generated_poc/content_standards/artifact.py +208 -0
- adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
- adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
- adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
- adcp/types/generated_poc/content_standards/content_standards.py +66 -0
- adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
- adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
- adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
- adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
- adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
- adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
- adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
- adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
- adcp/types/generated_poc/core/activation_key.py +1 -1
- adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
- adcp/types/generated_poc/core/assets/css_asset.py +1 -1
- adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
- adcp/types/generated_poc/core/assets/html_asset.py +1 -1
- adcp/types/generated_poc/core/assets/image_asset.py +1 -1
- adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
- adcp/types/generated_poc/core/assets/text_asset.py +1 -1
- adcp/types/generated_poc/core/assets/url_asset.py +1 -1
- adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
- adcp/types/generated_poc/core/assets/video_asset.py +1 -1
- adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
- adcp/types/generated_poc/core/async_response_data.py +1 -1
- adcp/types/generated_poc/core/brand_manifest.py +68 -5
- adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
- adcp/types/generated_poc/core/context.py +1 -1
- adcp/types/generated_poc/core/creative_asset.py +8 -7
- adcp/types/generated_poc/core/creative_assignment.py +1 -1
- adcp/types/generated_poc/core/creative_filters.py +4 -14
- adcp/types/generated_poc/core/creative_manifest.py +1 -1
- adcp/types/generated_poc/core/creative_policy.py +1 -1
- adcp/types/generated_poc/core/delivery_metrics.py +1 -1
- adcp/types/generated_poc/core/deployment.py +1 -1
- adcp/types/generated_poc/core/destination.py +1 -1
- adcp/types/generated_poc/core/error.py +1 -1
- adcp/types/generated_poc/core/ext.py +1 -1
- adcp/types/generated_poc/core/format.py +6 -5
- adcp/types/generated_poc/core/format_id.py +1 -1
- adcp/types/generated_poc/core/frequency_cap.py +1 -1
- adcp/types/generated_poc/core/identifier.py +27 -0
- adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
- adcp/types/generated_poc/core/measurement.py +1 -1
- adcp/types/generated_poc/core/media_buy.py +1 -1
- adcp/types/generated_poc/core/media_buy_features.py +29 -0
- adcp/types/generated_poc/core/offering.py +80 -0
- adcp/types/generated_poc/core/package.py +1 -1
- adcp/types/generated_poc/core/performance_feedback.py +1 -1
- adcp/types/generated_poc/core/placement.py +1 -1
- adcp/types/generated_poc/core/pricing_option.py +8 -14
- adcp/types/generated_poc/core/product.py +1 -1
- adcp/types/generated_poc/core/product_allocation.py +48 -0
- adcp/types/generated_poc/core/product_filters.py +72 -7
- adcp/types/generated_poc/core/promoted_offerings.py +12 -21
- adcp/types/generated_poc/core/promoted_products.py +1 -1
- adcp/types/generated_poc/core/property.py +1 -1
- adcp/types/generated_poc/core/property_id.py +1 -1
- adcp/types/generated_poc/core/property_list_ref.py +26 -0
- adcp/types/generated_poc/core/property_tag.py +1 -1
- adcp/types/generated_poc/core/proposal.py +64 -0
- adcp/types/generated_poc/core/protocol_envelope.py +1 -1
- adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
- adcp/types/generated_poc/core/push_notification_config.py +1 -1
- adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
- adcp/types/generated_poc/core/reporting_webhook.py +70 -0
- adcp/types/generated_poc/core/response.py +1 -1
- adcp/types/generated_poc/core/signal_filters.py +1 -1
- adcp/types/generated_poc/core/start_timing.py +4 -4
- adcp/types/generated_poc/core/sub_asset.py +1 -1
- adcp/types/generated_poc/core/targeting.py +55 -14
- adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
- adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
- adcp/types/generated_poc/creative/preview_render.py +1 -1
- adcp/types/generated_poc/enums/adcp_domain.py +3 -1
- adcp/types/generated_poc/enums/asset_content_type.py +1 -1
- adcp/types/generated_poc/enums/auth_scheme.py +1 -1
- adcp/types/generated_poc/enums/available_metric.py +1 -1
- adcp/types/generated_poc/enums/channels.py +18 -8
- adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
- adcp/types/generated_poc/enums/creative_action.py +1 -1
- adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
- adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
- adcp/types/generated_poc/enums/creative_status.py +2 -1
- adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
- adcp/types/generated_poc/enums/daast_version.py +1 -1
- adcp/types/generated_poc/enums/delivery_type.py +1 -1
- adcp/types/generated_poc/enums/dimension_unit.py +1 -1
- adcp/types/generated_poc/enums/feed_format.py +1 -1
- adcp/types/generated_poc/enums/feedback_source.py +1 -1
- adcp/types/generated_poc/enums/format_category.py +1 -1
- adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
- adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
- adcp/types/generated_poc/enums/geo_level.py +14 -0
- adcp/types/generated_poc/enums/history_entry_type.py +1 -1
- adcp/types/generated_poc/enums/http_method.py +1 -1
- adcp/types/generated_poc/enums/identifier_types.py +1 -1
- adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
- adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
- adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
- adcp/types/generated_poc/enums/media_buy_status.py +1 -1
- adcp/types/generated_poc/enums/metric_type.py +1 -1
- adcp/types/generated_poc/enums/metro_system.py +15 -0
- adcp/types/generated_poc/enums/notification_type.py +1 -1
- adcp/types/generated_poc/enums/pacing.py +1 -1
- adcp/types/generated_poc/enums/postal_system.py +19 -0
- adcp/types/generated_poc/enums/preview_output_format.py +1 -1
- adcp/types/generated_poc/enums/pricing_model.py +1 -1
- adcp/types/generated_poc/enums/property_type.py +2 -1
- adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
- adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
- adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
- adcp/types/generated_poc/enums/sort_direction.py +1 -1
- adcp/types/generated_poc/enums/task_status.py +1 -1
- adcp/types/generated_poc/enums/task_type.py +7 -1
- adcp/types/generated_poc/enums/update_frequency.py +1 -1
- adcp/types/generated_poc/enums/url_asset_type.py +1 -1
- adcp/types/generated_poc/enums/validation_mode.py +1 -1
- adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
- adcp/types/generated_poc/enums/vast_version.py +1 -1
- adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
- adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
- adcp/types/generated_poc/extensions/__init__.py +3 -0
- adcp/types/generated_poc/extensions/extension_meta.py +58 -0
- adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
- adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
- adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
- adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
- adcp/types/generated_poc/media_buy/package_request.py +15 -6
- adcp/types/generated_poc/media_buy/package_update.py +119 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
- adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
- adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
- adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
- adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
- adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
- adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
- adcp/types/generated_poc/property/__init__.py +3 -0
- adcp/types/generated_poc/property/base_property_source.py +86 -0
- adcp/types/generated_poc/property/create_property_list_request.py +43 -0
- adcp/types/generated_poc/property/create_property_list_response.py +27 -0
- adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
- adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
- adcp/types/generated_poc/property/feature_requirement.py +42 -0
- adcp/types/generated_poc/property/get_property_list_request.py +34 -0
- adcp/types/generated_poc/property/get_property_list_response.py +61 -0
- adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
- adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
- adcp/types/generated_poc/property/property_error.py +33 -0
- adcp/types/generated_poc/property/property_feature.py +22 -0
- adcp/types/generated_poc/property/property_feature_definition.py +80 -0
- adcp/types/generated_poc/property/property_list.py +62 -0
- adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
- adcp/types/generated_poc/property/property_list_filters.py +47 -0
- adcp/types/generated_poc/property/update_property_list_request.py +46 -0
- adcp/types/generated_poc/property/update_property_list_response.py +21 -0
- adcp/types/generated_poc/protocol/__init__.py +3 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
- adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
- adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
- adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
- adcp/types/generated_poc/signals/get_signals_request.py +1 -1
- adcp/types/generated_poc/signals/get_signals_response.py +1 -1
- adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
- adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
- adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
- adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
- adcp/utils/format_assets.py +5 -5
- adcp/utils/preview_cache.py +2 -2
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
- adcp-3.0.0.dist-info/RECORD +264 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
- adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
- adcp-2.18.0.dist-info/RECORD +0 -195
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_identity.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
from adcp.types.base import AdCPBaseModel
|
|
11
|
+
from pydantic import AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ConsentScopeEnum(Enum):
|
|
15
|
+
name = 'name'
|
|
16
|
+
email = 'email'
|
|
17
|
+
shipping_address = 'shipping_address'
|
|
18
|
+
phone = 'phone'
|
|
19
|
+
locale = 'locale'
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PrivacyPolicyAcknowledged(AdCPBaseModel):
|
|
23
|
+
model_config = ConfigDict(
|
|
24
|
+
extra='allow',
|
|
25
|
+
)
|
|
26
|
+
brand_policy_url: Annotated[
|
|
27
|
+
AnyUrl | None, Field(description="URL to brand's privacy policy")
|
|
28
|
+
] = None
|
|
29
|
+
brand_policy_version: Annotated[
|
|
30
|
+
str | None, Field(description='Version of policy acknowledged')
|
|
31
|
+
] = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ShippingAddress(AdCPBaseModel):
|
|
35
|
+
model_config = ConfigDict(
|
|
36
|
+
extra='allow',
|
|
37
|
+
)
|
|
38
|
+
city: str | None = None
|
|
39
|
+
country: str | None = None
|
|
40
|
+
postal_code: str | None = None
|
|
41
|
+
state: str | None = None
|
|
42
|
+
street: str | None = None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class User(AdCPBaseModel):
|
|
46
|
+
model_config = ConfigDict(
|
|
47
|
+
extra='allow',
|
|
48
|
+
)
|
|
49
|
+
email: Annotated[EmailStr | None, Field(description="User's email address")] = None
|
|
50
|
+
locale: Annotated[str | None, Field(description="User's locale (e.g., en-US)")] = None
|
|
51
|
+
name: Annotated[str | None, Field(description="User's display name")] = None
|
|
52
|
+
phone: Annotated[str | None, Field(description="User's phone number")] = None
|
|
53
|
+
shipping_address: Annotated[
|
|
54
|
+
ShippingAddress | None, Field(description="User's shipping address for accurate pricing")
|
|
55
|
+
] = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class SiIdentity(AdCPBaseModel):
|
|
59
|
+
model_config = ConfigDict(
|
|
60
|
+
extra='allow',
|
|
61
|
+
)
|
|
62
|
+
anonymous_session_id: Annotated[
|
|
63
|
+
str | None,
|
|
64
|
+
Field(description='Session ID for anonymous users (when consent_granted is false)'),
|
|
65
|
+
] = None
|
|
66
|
+
consent_granted: Annotated[bool, Field(description='Whether user consented to share identity')]
|
|
67
|
+
consent_scope: Annotated[
|
|
68
|
+
list[ConsentScopeEnum] | None, Field(description='What data was consented to share')
|
|
69
|
+
] = None
|
|
70
|
+
consent_timestamp: Annotated[
|
|
71
|
+
AwareDatetime | None, Field(description='When consent was granted (ISO 8601)')
|
|
72
|
+
] = None
|
|
73
|
+
privacy_policy_acknowledged: Annotated[
|
|
74
|
+
PrivacyPolicyAcknowledged | None, Field(description='Brand privacy policy acknowledgment')
|
|
75
|
+
] = None
|
|
76
|
+
user: Annotated[
|
|
77
|
+
User | None, Field(description='User data (only present if consent_granted is true)')
|
|
78
|
+
] = None
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_initiate_session_request.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from ..core import ext as ext_1
|
|
13
|
+
from . import si_capabilities, si_identity
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SiInitiateSessionRequest(AdCPBaseModel):
|
|
17
|
+
model_config = ConfigDict(
|
|
18
|
+
extra='allow',
|
|
19
|
+
)
|
|
20
|
+
context: Annotated[
|
|
21
|
+
str, Field(description='Conversation handoff from the host describing what the user needs')
|
|
22
|
+
]
|
|
23
|
+
ext: ext_1.ExtensionObject | None = None
|
|
24
|
+
identity: si_identity.SiIdentity
|
|
25
|
+
media_buy_id: Annotated[
|
|
26
|
+
str | None, Field(description='AdCP media buy ID if session was triggered by advertising')
|
|
27
|
+
] = None
|
|
28
|
+
offering_id: Annotated[
|
|
29
|
+
str | None, Field(description='Brand-specific offering identifier to apply')
|
|
30
|
+
] = None
|
|
31
|
+
offering_token: Annotated[
|
|
32
|
+
str | None,
|
|
33
|
+
Field(
|
|
34
|
+
description="Token from si_get_offering response for session continuity. Brand uses this to recall what products were shown to the user, enabling natural references like 'the second one' or 'that blue shoe'."
|
|
35
|
+
),
|
|
36
|
+
] = None
|
|
37
|
+
placement: Annotated[
|
|
38
|
+
str | None,
|
|
39
|
+
Field(
|
|
40
|
+
description="Where this session was triggered (e.g., 'chatgpt_search', 'claude_chat')"
|
|
41
|
+
),
|
|
42
|
+
] = None
|
|
43
|
+
supported_capabilities: Annotated[
|
|
44
|
+
si_capabilities.SiCapabilities | None,
|
|
45
|
+
Field(description='What capabilities the host supports'),
|
|
46
|
+
] = None
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_initiate_session_response.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from ..core import error
|
|
13
|
+
from ..core import ext as ext_1
|
|
14
|
+
from . import si_capabilities, si_ui_element
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Response(AdCPBaseModel):
|
|
18
|
+
model_config = ConfigDict(
|
|
19
|
+
extra='allow',
|
|
20
|
+
)
|
|
21
|
+
message: Annotated[str | None, Field(description='Conversational message from brand agent')] = (
|
|
22
|
+
None
|
|
23
|
+
)
|
|
24
|
+
ui_elements: Annotated[
|
|
25
|
+
list[si_ui_element.SiUiElement] | None, Field(description='Visual components to render')
|
|
26
|
+
] = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SiInitiateSessionResponse(AdCPBaseModel):
|
|
30
|
+
model_config = ConfigDict(
|
|
31
|
+
extra='allow',
|
|
32
|
+
)
|
|
33
|
+
errors: Annotated[
|
|
34
|
+
list[error.Error] | None, Field(description='Errors during session initiation')
|
|
35
|
+
] = None
|
|
36
|
+
ext: ext_1.ExtensionObject | None = None
|
|
37
|
+
negotiated_capabilities: Annotated[
|
|
38
|
+
si_capabilities.SiCapabilities | None,
|
|
39
|
+
Field(description='Intersection of brand and host capabilities for this session'),
|
|
40
|
+
] = None
|
|
41
|
+
response: Annotated[Response | None, Field(description="Brand agent's initial response")] = None
|
|
42
|
+
session_id: Annotated[
|
|
43
|
+
str, Field(description='Unique session identifier for subsequent messages')
|
|
44
|
+
]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_send_message_request.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated, Any
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field, RootModel
|
|
11
|
+
|
|
12
|
+
from ..core import ext as ext_1
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ActionResponse(AdCPBaseModel):
|
|
16
|
+
model_config = ConfigDict(
|
|
17
|
+
extra='allow',
|
|
18
|
+
)
|
|
19
|
+
action: Annotated[str | None, Field(description='The action that was triggered')] = None
|
|
20
|
+
payload: Annotated[
|
|
21
|
+
dict[str, Any] | None, Field(description='Action-specific response data')
|
|
22
|
+
] = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SiSendMessageRequest1(AdCPBaseModel):
|
|
26
|
+
model_config = ConfigDict(
|
|
27
|
+
extra='allow',
|
|
28
|
+
)
|
|
29
|
+
action_response: Annotated[
|
|
30
|
+
ActionResponse | None,
|
|
31
|
+
Field(description='Response to a previous action_button (e.g., user clicked checkout)'),
|
|
32
|
+
] = None
|
|
33
|
+
ext: ext_1.ExtensionObject | None = None
|
|
34
|
+
message: Annotated[str, Field(description="User's message to the brand agent")]
|
|
35
|
+
session_id: Annotated[str, Field(description='Active session identifier')]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SiSendMessageRequest2(AdCPBaseModel):
|
|
39
|
+
model_config = ConfigDict(
|
|
40
|
+
extra='allow',
|
|
41
|
+
)
|
|
42
|
+
action_response: Annotated[
|
|
43
|
+
ActionResponse,
|
|
44
|
+
Field(description='Response to a previous action_button (e.g., user clicked checkout)'),
|
|
45
|
+
]
|
|
46
|
+
ext: ext_1.ExtensionObject | None = None
|
|
47
|
+
message: Annotated[str | None, Field(description="User's message to the brand agent")] = None
|
|
48
|
+
session_id: Annotated[str, Field(description='Active session identifier')]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SiSendMessageRequest(RootModel[SiSendMessageRequest1 | SiSendMessageRequest2]):
|
|
52
|
+
root: Annotated[
|
|
53
|
+
SiSendMessageRequest1 | SiSendMessageRequest2,
|
|
54
|
+
Field(
|
|
55
|
+
description='Send a message to the brand agent within an active session',
|
|
56
|
+
title='SI Send Message Request',
|
|
57
|
+
),
|
|
58
|
+
]
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_send_message_response.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Annotated, Any
|
|
9
|
+
|
|
10
|
+
from adcp.types.base import AdCPBaseModel
|
|
11
|
+
from pydantic import ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
from ..core import error
|
|
14
|
+
from ..core import ext as ext_1
|
|
15
|
+
from . import si_ui_element
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ContextForCheckout(AdCPBaseModel):
|
|
19
|
+
model_config = ConfigDict(
|
|
20
|
+
extra='allow',
|
|
21
|
+
)
|
|
22
|
+
applied_offers: Annotated[
|
|
23
|
+
list[str] | None, Field(description='Offer IDs that were applied during the conversation')
|
|
24
|
+
] = None
|
|
25
|
+
conversation_summary: Annotated[
|
|
26
|
+
str | None, Field(description='Summary of the conversation leading to purchase')
|
|
27
|
+
] = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Price(AdCPBaseModel):
|
|
31
|
+
amount: float | None = None
|
|
32
|
+
currency: str | None = None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Intent(AdCPBaseModel):
|
|
36
|
+
model_config = ConfigDict(
|
|
37
|
+
extra='allow',
|
|
38
|
+
)
|
|
39
|
+
action: Annotated[str | None, Field(description="The commerce action (e.g., 'purchase')")] = (
|
|
40
|
+
None
|
|
41
|
+
)
|
|
42
|
+
price: Annotated[Price | None, Field(description='Price information')] = None
|
|
43
|
+
product: Annotated[dict[str, Any] | None, Field(description='Product details for checkout')] = (
|
|
44
|
+
None
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class Type(Enum):
|
|
49
|
+
transaction = 'transaction'
|
|
50
|
+
complete = 'complete'
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Handoff(AdCPBaseModel):
|
|
54
|
+
model_config = ConfigDict(
|
|
55
|
+
extra='allow',
|
|
56
|
+
)
|
|
57
|
+
context_for_checkout: Annotated[
|
|
58
|
+
ContextForCheckout | None, Field(description='Context to pass to ACP for seamless checkout')
|
|
59
|
+
] = None
|
|
60
|
+
intent: Annotated[
|
|
61
|
+
Intent | None,
|
|
62
|
+
Field(description='For transaction handoffs: what the user wants to purchase'),
|
|
63
|
+
] = None
|
|
64
|
+
type: Annotated[
|
|
65
|
+
Type | None,
|
|
66
|
+
Field(
|
|
67
|
+
description='Type of handoff: transaction (ready for ACP checkout) or complete (conversation done)'
|
|
68
|
+
),
|
|
69
|
+
] = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class SessionStatus(Enum):
|
|
73
|
+
active = 'active'
|
|
74
|
+
pending_handoff = 'pending_handoff'
|
|
75
|
+
complete = 'complete'
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class Response(AdCPBaseModel):
|
|
79
|
+
model_config = ConfigDict(
|
|
80
|
+
extra='allow',
|
|
81
|
+
)
|
|
82
|
+
message: Annotated[str | None, Field(description='Conversational message from brand agent')] = (
|
|
83
|
+
None
|
|
84
|
+
)
|
|
85
|
+
ui_elements: Annotated[
|
|
86
|
+
list[si_ui_element.SiUiElement] | None, Field(description='Visual components to render')
|
|
87
|
+
] = None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class SiSendMessageResponse(AdCPBaseModel):
|
|
91
|
+
model_config = ConfigDict(
|
|
92
|
+
extra='allow',
|
|
93
|
+
)
|
|
94
|
+
errors: list[error.Error] | None = None
|
|
95
|
+
ext: ext_1.ExtensionObject | None = None
|
|
96
|
+
handoff: Annotated[
|
|
97
|
+
Handoff | None, Field(description='Handoff request when session_status is pending_handoff')
|
|
98
|
+
] = None
|
|
99
|
+
response: Annotated[Response | None, Field(description="Brand agent's response")] = None
|
|
100
|
+
session_id: Annotated[str, Field(description='Session identifier')]
|
|
101
|
+
session_status: Annotated[SessionStatus, Field(description='Current session status')]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_terminate_session_request.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Annotated, Any
|
|
9
|
+
|
|
10
|
+
from adcp.types.base import AdCPBaseModel
|
|
11
|
+
from pydantic import ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
from ..core import ext as ext_1
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Reason(Enum):
|
|
17
|
+
handoff_transaction = 'handoff_transaction'
|
|
18
|
+
handoff_complete = 'handoff_complete'
|
|
19
|
+
user_exit = 'user_exit'
|
|
20
|
+
session_timeout = 'session_timeout'
|
|
21
|
+
host_terminated = 'host_terminated'
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Action(Enum):
|
|
25
|
+
purchase = 'purchase'
|
|
26
|
+
subscribe = 'subscribe'
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TransactionIntent(AdCPBaseModel):
|
|
30
|
+
model_config = ConfigDict(
|
|
31
|
+
extra='allow',
|
|
32
|
+
)
|
|
33
|
+
action: Action | None = None
|
|
34
|
+
product: Annotated[dict[str, Any] | None, Field(description='Product/service details')] = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class TerminationContext(AdCPBaseModel):
|
|
38
|
+
model_config = ConfigDict(
|
|
39
|
+
extra='allow',
|
|
40
|
+
)
|
|
41
|
+
cause: Annotated[
|
|
42
|
+
str | None, Field(description='For host_terminated - why host ended session')
|
|
43
|
+
] = None
|
|
44
|
+
summary: Annotated[str | None, Field(description='Summary of the conversation')] = None
|
|
45
|
+
transaction_intent: Annotated[
|
|
46
|
+
TransactionIntent | None,
|
|
47
|
+
Field(description='For handoff_transaction - what user wants to buy'),
|
|
48
|
+
] = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SiTerminateSessionRequest(AdCPBaseModel):
|
|
52
|
+
model_config = ConfigDict(
|
|
53
|
+
extra='allow',
|
|
54
|
+
)
|
|
55
|
+
ext: ext_1.ExtensionObject | None = None
|
|
56
|
+
reason: Annotated[Reason, Field(description='Reason for termination')]
|
|
57
|
+
session_id: Annotated[str, Field(description='Session identifier to terminate')]
|
|
58
|
+
termination_context: Annotated[
|
|
59
|
+
TerminationContext | None, Field(description='Context for the termination')
|
|
60
|
+
] = None
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_terminate_session_response.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Annotated, Any
|
|
9
|
+
|
|
10
|
+
from adcp.types.base import AdCPBaseModel
|
|
11
|
+
from pydantic import AnyUrl, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
from ..core import error
|
|
14
|
+
from ..core import ext as ext_1
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AcpHandoff(AdCPBaseModel):
|
|
18
|
+
model_config = ConfigDict(
|
|
19
|
+
extra='allow',
|
|
20
|
+
)
|
|
21
|
+
checkout_token: Annotated[str | None, Field(description='Token for ACP checkout flow')] = None
|
|
22
|
+
checkout_url: Annotated[AnyUrl | None, Field(description='ACP checkout initiation URL')] = None
|
|
23
|
+
product: Annotated[dict[str, Any] | None, Field(description='Product details for checkout')] = (
|
|
24
|
+
None
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Action(Enum):
|
|
29
|
+
save_for_later = 'save_for_later'
|
|
30
|
+
set_reminder = 'set_reminder'
|
|
31
|
+
subscribe_updates = 'subscribe_updates'
|
|
32
|
+
none = 'none'
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class FollowUp(AdCPBaseModel):
|
|
36
|
+
model_config = ConfigDict(
|
|
37
|
+
extra='allow',
|
|
38
|
+
)
|
|
39
|
+
action: Action | None = None
|
|
40
|
+
data: Annotated[dict[str, Any] | None, Field(description='Data for follow-up action')] = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SiTerminateSessionResponse(AdCPBaseModel):
|
|
44
|
+
model_config = ConfigDict(
|
|
45
|
+
extra='allow',
|
|
46
|
+
)
|
|
47
|
+
acp_handoff: Annotated[
|
|
48
|
+
AcpHandoff | None, Field(description='ACP checkout handoff data (for handoff_transaction)')
|
|
49
|
+
] = None
|
|
50
|
+
errors: list[error.Error] | None = None
|
|
51
|
+
ext: ext_1.ExtensionObject | None = None
|
|
52
|
+
follow_up: Annotated[FollowUp | None, Field(description='Suggested follow-up actions')] = None
|
|
53
|
+
session_id: Annotated[str, Field(description='Terminated session identifier')]
|
|
54
|
+
terminated: Annotated[bool, Field(description='Whether session was successfully terminated')]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: sponsored_intelligence/si_ui_element.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Annotated, Any
|
|
9
|
+
|
|
10
|
+
from adcp.types.base import AdCPBaseModel
|
|
11
|
+
from pydantic import ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Type(Enum):
|
|
15
|
+
text = 'text'
|
|
16
|
+
link = 'link'
|
|
17
|
+
image = 'image'
|
|
18
|
+
product_card = 'product_card'
|
|
19
|
+
carousel = 'carousel'
|
|
20
|
+
action_button = 'action_button'
|
|
21
|
+
app_handoff = 'app_handoff'
|
|
22
|
+
integration_actions = 'integration_actions'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SiUiElement(AdCPBaseModel):
|
|
26
|
+
model_config = ConfigDict(
|
|
27
|
+
extra='allow',
|
|
28
|
+
)
|
|
29
|
+
data: Annotated[dict[str, Any] | None, Field(description='Component-specific data')] = None
|
|
30
|
+
type: Annotated[Type, Field(description='Component type')]
|
adcp/utils/format_assets.py
CHANGED
|
@@ -28,13 +28,13 @@ from __future__ import annotations
|
|
|
28
28
|
from typing import TYPE_CHECKING, Any, Union
|
|
29
29
|
|
|
30
30
|
from adcp.types.generated_poc.core.format import Assets as AssetsModel
|
|
31
|
-
from adcp.types.generated_poc.core.format import
|
|
31
|
+
from adcp.types.generated_poc.core.format import Assets5 as Assets5Model
|
|
32
32
|
|
|
33
33
|
if TYPE_CHECKING:
|
|
34
|
-
from adcp.types.generated_poc.core.format import Assets,
|
|
34
|
+
from adcp.types.generated_poc.core.format import Assets, Assets5, Format
|
|
35
35
|
|
|
36
36
|
# Type alias for any format asset (individual or repeatable group)
|
|
37
|
-
FormatAsset = Union["Assets", "
|
|
37
|
+
FormatAsset = Union["Assets", "Assets5"]
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
def get_format_assets(format: Format) -> list[FormatAsset]:
|
|
@@ -93,8 +93,8 @@ def normalize_assets_required(assets_required: list[Any]) -> list[FormatAsset]:
|
|
|
93
93
|
|
|
94
94
|
# Check if it's a repeatable group (has asset_group_id) or individual asset
|
|
95
95
|
if "asset_group_id" in asset_dict:
|
|
96
|
-
# Repeatable group - use
|
|
97
|
-
normalized.append(
|
|
96
|
+
# Repeatable group - use Assets5Model
|
|
97
|
+
normalized.append(Assets5Model(**{**asset_dict, "required": True}))
|
|
98
98
|
else:
|
|
99
99
|
# Individual asset - use AssetsModel
|
|
100
100
|
normalized.append(AssetsModel(**{**asset_dict, "required": True}))
|
adcp/utils/preview_cache.py
CHANGED
|
@@ -87,8 +87,8 @@ class PreviewURLGenerator:
|
|
|
87
87
|
first_render = preview.renders[0] if preview.renders else None
|
|
88
88
|
|
|
89
89
|
if first_render:
|
|
90
|
-
# PreviewRender is a RootModel
|
|
91
|
-
render = first_render
|
|
90
|
+
# PreviewRender is a RootModel - access .root for the actual data
|
|
91
|
+
render = getattr(first_render, "root", first_render)
|
|
92
92
|
has_url = hasattr(render, "preview_url")
|
|
93
93
|
preview_url = str(render.preview_url) if has_url else None
|
|
94
94
|
preview_data = {
|