adcp 2.19.0__tar.gz → 3.0.0__tar.gz
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-2.19.0/src/adcp.egg-info → adcp-3.0.0}/PKG-INFO +1 -1
- {adcp-2.19.0 → adcp-3.0.0}/pyproject.toml +1 -1
- adcp-3.0.0/src/adcp/ADCP_VERSION +1 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/__init__.py +6 -14
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/__main__.py +94 -51
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/adagents.py +91 -19
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/client.py +865 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/a2a.py +84 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/base.py +101 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/mcp.py +84 -0
- adcp-3.0.0/src/adcp/server/__init__.py +49 -0
- adcp-3.0.0/src/adcp/server/base.py +368 -0
- adcp-3.0.0/src/adcp/server/content_standards.py +561 -0
- adcp-3.0.0/src/adcp/server/governance.py +491 -0
- adcp-3.0.0/src/adcp/server/mcp_tools.py +471 -0
- adcp-3.0.0/src/adcp/server/proposal.py +334 -0
- adcp-3.0.0/src/adcp/server/sponsored_intelligence.py +444 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/__init__.py +111 -23
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/_ergonomic.py +35 -14
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/_generated.py +346 -52
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/aliases.py +13 -20
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/base.py +1 -1
- adcp-3.0.0/src/adcp/types/generated_poc/adagents.py +504 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/__init__.py +3 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/artifact.py +208 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/content_standards.py +66 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
- adcp-3.0.0/src/adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/activation_key.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/css_asset.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/core/assets/daast_asset.py +71 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/html_asset.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/core/assets/image_asset.py +23 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/text_asset.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/url_asset.py +4 -4
- adcp-3.0.0/src/adcp/types/generated_poc/core/assets/vast_asset.py +73 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/assets/video_asset.py +28 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/async_response_data.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/core/brand_manifest.py +264 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/brand_manifest_ref.py +35 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/context.py +2 -2
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_asset.py +20 -19
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_assignment.py +4 -4
- adcp-3.0.0/src/adcp/types/generated_poc/core/creative_filters.py +76 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_manifest.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_policy.py +5 -5
- adcp-3.0.0/src/adcp/types/generated_poc/core/delivery_metrics.py +111 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/deployment.py +86 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/destination.py +12 -12
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/error.py +7 -7
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/ext.py +2 -2
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/format.py +66 -66
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/format_id.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/frequency_cap.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/identifier.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/measurement.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/media_buy.py +8 -8
- adcp-3.0.0/src/adcp/types/generated_poc/core/media_buy_features.py +29 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/offering.py +80 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/package.py +9 -9
- adcp-3.0.0/src/adcp/types/generated_poc/core/performance_feedback.py +78 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/placement.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/pricing_option.py +9 -15
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/product.py +21 -21
- adcp-3.0.0/src/adcp/types/generated_poc/core/product_allocation.py +48 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/product_filters.py +162 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/promoted_offerings.py +77 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/promoted_products.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/property.py +10 -10
- adcp-3.0.0/src/adcp/types/generated_poc/core/property_id.py +21 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/property_list_ref.py +5 -5
- adcp-3.0.0/src/adcp/types/generated_poc/core/property_tag.py +21 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/proposal.py +64 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/protocol_envelope.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/push_notification_config.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
- adcp-3.0.0/src/adcp/types/generated_poc/core/reporting_webhook.py +70 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/response.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/signal_filters.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/start_timing.py +4 -4
- adcp-3.0.0/src/adcp/types/generated_poc/core/sub_asset.py +65 -0
- adcp-3.0.0/src/adcp/types/generated_poc/core/targeting.py +94 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/preview_render.py +26 -26
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/adcp_domain.py +5 -5
- adcp-3.0.0/src/adcp/types/generated_poc/enums/asset_content_type.py +23 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/auth_scheme.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/enums/available_metric.py +19 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/channels.py +29 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/creative_action.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
- adcp-3.0.0/src/adcp/types/generated_poc/enums/creative_sort_field.py +16 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/creative_status.py +15 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/daast_tracking_event.py +21 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/daast_version.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/delivery_type.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/dimension_unit.py +5 -5
- adcp-3.0.0/src/adcp/types/generated_poc/enums/feed_format.py +13 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/feedback_source.py +14 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/format_category.py +17 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
- adcp-3.0.0/src/adcp/types/generated_poc/enums/geo_level.py +14 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/history_entry_type.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/http_method.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/enums/identifier_types.py +29 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/media_buy_status.py +5 -5
- adcp-3.0.0/src/adcp/types/generated_poc/enums/metric_type.py +18 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/metro_system.py +15 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/notification_type.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/pacing.py +4 -4
- adcp-3.0.0/src/adcp/types/generated_poc/enums/postal_system.py +19 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/preview_output_format.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/enums/pricing_model.py +17 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/property_type.py +18 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/sort_direction.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/enums/task_status.py +19 -0
- adcp-3.0.0/src/adcp/types/generated_poc/enums/task_type.py +21 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/update_frequency.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/url_asset_type.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/validation_mode.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/enums/vast_tracking_event.py +26 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/vast_version.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
- adcp-3.0.0/src/adcp/types/generated_poc/extensions/extension_meta.py +58 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
- adcp-3.0.0/src/adcp/types/generated_poc/media_buy/create_media_buy_request.py +144 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
- adcp-3.0.0/src/adcp/types/generated_poc/media_buy/list_creatives_response.py +209 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/package_request.py +12 -12
- adcp-3.0.0/src/adcp/types/generated_poc/media_buy/package_update.py +119 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
- adcp-3.0.0/src/adcp/types/generated_poc/media_buy/update_media_buy_request.py +97 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpc_option.py +68 -0
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpcv_option.py +70 -0
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpp_option.py +87 -0
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpv_option.py +96 -0
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/flat_rate_option.py +99 -0
- adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/base_property_source.py +16 -16
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/create_property_list_request.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/create_property_list_response.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/feature_requirement.py +8 -8
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/get_property_list_request.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/get_property_list_response.py +12 -12
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
- adcp-3.0.0/src/adcp/types/generated_poc/property/property_error.py +33 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_feature.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_feature_definition.py +19 -19
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_list.py +12 -12
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_list_filters.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/update_property_list_request.py +9 -9
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/update_property_list_response.py +3 -3
- adcp-3.0.0/src/adcp/types/generated_poc/protocol/__init__.py +3 -0
- adcp-3.0.0/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
- adcp-3.0.0/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
- adcp-3.0.0/src/adcp/types/generated_poc/protocols/adcp_extension.py +50 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/get_signals_request.py +9 -9
- adcp-3.0.0/src/adcp/types/generated_poc/signals/get_signals_response.py +58 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
- adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/format_assets.py +5 -5
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/preview_cache.py +2 -2
- {adcp-2.19.0 → adcp-3.0.0/src/adcp.egg-info}/PKG-INFO +1 -1
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/SOURCES.txt +53 -7
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_adagents.py +118 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_cli.py +46 -4
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_discriminated_unions.py +33 -43
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_preview_html.py +3 -5
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_public_api.py +21 -21
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_response_str.py +41 -41
- adcp-3.0.0/tests/test_server_framework.py +524 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_type_aliases.py +29 -24
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_type_coercion.py +15 -12
- adcp-3.0.0/tests/test_version_interop.py +326 -0
- adcp-2.19.0/src/adcp/ADCP_VERSION +0 -1
- adcp-2.19.0/src/adcp/types/generated_poc/adagents.py +0 -497
- adcp-2.19.0/src/adcp/types/generated_poc/core/assets/daast_asset.py +0 -71
- adcp-2.19.0/src/adcp/types/generated_poc/core/assets/image_asset.py +0 -23
- adcp-2.19.0/src/adcp/types/generated_poc/core/assets/vast_asset.py +0 -73
- adcp-2.19.0/src/adcp/types/generated_poc/core/assets/video_asset.py +0 -28
- adcp-2.19.0/src/adcp/types/generated_poc/core/brand_manifest.py +0 -201
- adcp-2.19.0/src/adcp/types/generated_poc/core/brand_manifest_ref.py +0 -35
- adcp-2.19.0/src/adcp/types/generated_poc/core/creative_filters.py +0 -86
- adcp-2.19.0/src/adcp/types/generated_poc/core/delivery_metrics.py +0 -111
- adcp-2.19.0/src/adcp/types/generated_poc/core/deployment.py +0 -86
- adcp-2.19.0/src/adcp/types/generated_poc/core/performance_feedback.py +0 -78
- adcp-2.19.0/src/adcp/types/generated_poc/core/product_filters.py +0 -97
- adcp-2.19.0/src/adcp/types/generated_poc/core/promoted_offerings.py +0 -86
- adcp-2.19.0/src/adcp/types/generated_poc/core/property_id.py +0 -21
- adcp-2.19.0/src/adcp/types/generated_poc/core/property_tag.py +0 -21
- adcp-2.19.0/src/adcp/types/generated_poc/core/sub_asset.py +0 -65
- adcp-2.19.0/src/adcp/types/generated_poc/core/targeting.py +0 -53
- adcp-2.19.0/src/adcp/types/generated_poc/enums/asset_content_type.py +0 -23
- adcp-2.19.0/src/adcp/types/generated_poc/enums/available_metric.py +0 -19
- adcp-2.19.0/src/adcp/types/generated_poc/enums/channels.py +0 -19
- adcp-2.19.0/src/adcp/types/generated_poc/enums/creative_sort_field.py +0 -16
- adcp-2.19.0/src/adcp/types/generated_poc/enums/creative_status.py +0 -14
- adcp-2.19.0/src/adcp/types/generated_poc/enums/daast_tracking_event.py +0 -21
- adcp-2.19.0/src/adcp/types/generated_poc/enums/feed_format.py +0 -13
- adcp-2.19.0/src/adcp/types/generated_poc/enums/feedback_source.py +0 -14
- adcp-2.19.0/src/adcp/types/generated_poc/enums/format_category.py +0 -17
- adcp-2.19.0/src/adcp/types/generated_poc/enums/identifier_types.py +0 -29
- adcp-2.19.0/src/adcp/types/generated_poc/enums/metric_type.py +0 -18
- adcp-2.19.0/src/adcp/types/generated_poc/enums/pricing_model.py +0 -17
- adcp-2.19.0/src/adcp/types/generated_poc/enums/property_type.py +0 -17
- adcp-2.19.0/src/adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
- adcp-2.19.0/src/adcp/types/generated_poc/enums/task_status.py +0 -19
- adcp-2.19.0/src/adcp/types/generated_poc/enums/task_type.py +0 -21
- adcp-2.19.0/src/adcp/types/generated_poc/enums/vast_tracking_event.py +0 -26
- adcp-2.19.0/src/adcp/types/generated_poc/extensions/extension_meta.py +0 -50
- adcp-2.19.0/src/adcp/types/generated_poc/media_buy/create_media_buy_request.py +0 -116
- adcp-2.19.0/src/adcp/types/generated_poc/media_buy/list_creatives_response.py +0 -212
- adcp-2.19.0/src/adcp/types/generated_poc/media_buy/update_media_buy_request.py +0 -193
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpc_option.py +0 -43
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpcv_option.py +0 -45
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpp_option.py +0 -64
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpv_option.py +0 -77
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/flat_rate_option.py +0 -93
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
- adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
- adcp-2.19.0/src/adcp/types/generated_poc/property/list_property_features_request.py +0 -25
- adcp-2.19.0/src/adcp/types/generated_poc/property/list_property_features_response.py +0 -24
- adcp-2.19.0/src/adcp/types/generated_poc/property/property_error.py +0 -33
- adcp-2.19.0/src/adcp/types/generated_poc/protocols/adcp_extension.py +0 -53
- adcp-2.19.0/src/adcp/types/generated_poc/signals/get_signals_response.py +0 -58
- {adcp-2.19.0 → adcp-3.0.0}/LICENSE +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/MANIFEST.in +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/README.md +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/setup.cfg +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/config.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/exceptions.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/py.typed +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/simple.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/testing/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/testing/test_helpers.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/coercion.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/core.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/extensions/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/pricing_options/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/protocols/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/__init__.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/operation_id.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/response_parser.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/validation.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp/webhooks.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/dependency_links.txt +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/entry_points.txt +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/requires.txt +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/top_level.txt +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_client.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_code_generation.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_format_assets.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_format_id_validation.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_helpers.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_protocols.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_response_parser.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_simple_api.py +0 -0
- {adcp-2.19.0 → adcp-3.0.0}/tests/test_webhook_handling.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "adcp"
|
|
7
|
-
version = "
|
|
7
|
+
version = "3.0.0"
|
|
8
8
|
description = "Official Python client for the Ad Context Protocol (AdCP)"
|
|
9
9
|
authors = [
|
|
10
10
|
{name = "AdCP Community", email = "maintainers@adcontextprotocol.org"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.0.0-beta.1
|
|
@@ -67,11 +67,10 @@ from adcp.types import (
|
|
|
67
67
|
# Creative Operations
|
|
68
68
|
BuildCreativeRequest,
|
|
69
69
|
BuildCreativeResponse,
|
|
70
|
-
# Pricing options (all
|
|
70
|
+
# Pricing options (all types for product creation)
|
|
71
71
|
CpcPricingOption,
|
|
72
72
|
CpcvPricingOption,
|
|
73
|
-
|
|
74
|
-
CpmFixedRatePricingOption,
|
|
73
|
+
CpmPricingOption,
|
|
75
74
|
CppPricingOption,
|
|
76
75
|
CpvPricingOption,
|
|
77
76
|
# Media Buy Operations
|
|
@@ -121,8 +120,7 @@ from adcp.types import (
|
|
|
121
120
|
SyncCreativesResponse,
|
|
122
121
|
UpdateMediaBuyRequest,
|
|
123
122
|
UpdateMediaBuyResponse,
|
|
124
|
-
|
|
125
|
-
VcpmFixedRatePricingOption,
|
|
123
|
+
VcpmPricingOption,
|
|
126
124
|
aliases,
|
|
127
125
|
)
|
|
128
126
|
|
|
@@ -152,9 +150,7 @@ from adcp.types.aliases import (
|
|
|
152
150
|
PreviewCreativeManifestRequest,
|
|
153
151
|
PreviewCreativeStaticResponse,
|
|
154
152
|
PropertyId,
|
|
155
|
-
PropertyIdActivationKey,
|
|
156
153
|
PropertyTag,
|
|
157
|
-
PropertyTagActivationKey,
|
|
158
154
|
ProvidePerformanceFeedbackErrorResponse,
|
|
159
155
|
ProvidePerformanceFeedbackSuccessResponse,
|
|
160
156
|
PublisherPropertiesAll,
|
|
@@ -197,7 +193,7 @@ from adcp.webhooks import (
|
|
|
197
193
|
get_adcp_signed_headers_for_webhook,
|
|
198
194
|
)
|
|
199
195
|
|
|
200
|
-
__version__ = "
|
|
196
|
+
__version__ = "3.0.0"
|
|
201
197
|
|
|
202
198
|
|
|
203
199
|
def get_adcp_version() -> str:
|
|
@@ -291,14 +287,12 @@ __all__ = [
|
|
|
291
287
|
# Pricing-related types
|
|
292
288
|
"CpcPricingOption",
|
|
293
289
|
"CpcvPricingOption",
|
|
294
|
-
"
|
|
295
|
-
"CpmFixedRatePricingOption",
|
|
290
|
+
"CpmPricingOption",
|
|
296
291
|
"CppPricingOption",
|
|
297
292
|
"CpvPricingOption",
|
|
298
293
|
"FlatRatePricingOption",
|
|
299
294
|
"PriceGuidance",
|
|
300
|
-
"
|
|
301
|
-
"VcpmFixedRatePricingOption",
|
|
295
|
+
"VcpmPricingOption",
|
|
302
296
|
# Configuration types
|
|
303
297
|
"PushNotificationConfig",
|
|
304
298
|
# Adagents validation
|
|
@@ -379,9 +373,7 @@ __all__ = [
|
|
|
379
373
|
"PreviewCreativeStaticResponse",
|
|
380
374
|
"PreviewCreativeInteractiveResponse",
|
|
381
375
|
"PropertyId",
|
|
382
|
-
"PropertyIdActivationKey",
|
|
383
376
|
"PropertyTag",
|
|
384
|
-
"PropertyTagActivationKey",
|
|
385
377
|
"ProvidePerformanceFeedbackSuccessResponse",
|
|
386
378
|
"ProvidePerformanceFeedbackErrorResponse",
|
|
387
379
|
"PublisherPropertiesAll",
|
|
@@ -153,26 +153,90 @@ async def execute_tool(
|
|
|
153
153
|
print_result(result, json_output)
|
|
154
154
|
|
|
155
155
|
|
|
156
|
-
# Tool
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
"
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
"
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
156
|
+
# Tool names that don't require request types (protocol introspection)
|
|
157
|
+
_NO_REQUEST_TOOLS = frozenset({"list_tools", "get_info"})
|
|
158
|
+
|
|
159
|
+
# Cached dispatch table (initialized on first use)
|
|
160
|
+
_dispatch_table: dict[str, tuple[str, type | None]] | None = None
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _get_dispatch_table() -> dict[str, tuple[str, type | None]]:
|
|
164
|
+
"""Get the tool dispatch table, initializing types on first access.
|
|
165
|
+
|
|
166
|
+
This function fails fast with a clear error if types can't be imported.
|
|
167
|
+
"""
|
|
168
|
+
global _dispatch_table
|
|
169
|
+
|
|
170
|
+
if _dispatch_table is not None:
|
|
171
|
+
return _dispatch_table
|
|
172
|
+
|
|
173
|
+
try:
|
|
174
|
+
from adcp.types import _generated as gen
|
|
175
|
+
except ImportError as e:
|
|
176
|
+
raise ImportError(
|
|
177
|
+
f"Failed to load ADCP types. This may indicate a code generation issue. "
|
|
178
|
+
f"Try running 'scripts/generate_types.py' to regenerate types. Error: {e}"
|
|
179
|
+
) from e
|
|
180
|
+
|
|
181
|
+
_dispatch_table = {
|
|
182
|
+
# Protocol introspection (no request type needed)
|
|
183
|
+
"list_tools": ("list_tools", None),
|
|
184
|
+
"get_info": ("get_info", None),
|
|
185
|
+
# Core catalog
|
|
186
|
+
"get_products": ("get_products", gen.GetProductsRequest),
|
|
187
|
+
"list_creative_formats": ("list_creative_formats", gen.ListCreativeFormatsRequest),
|
|
188
|
+
"preview_creative": ("preview_creative", gen.PreviewCreativeRequest),
|
|
189
|
+
"build_creative": ("build_creative", gen.BuildCreativeRequest),
|
|
190
|
+
"sync_creatives": ("sync_creatives", gen.SyncCreativesRequest),
|
|
191
|
+
"list_creatives": ("list_creatives", gen.ListCreativesRequest),
|
|
192
|
+
# Media buy
|
|
193
|
+
"create_media_buy": ("create_media_buy", gen.CreateMediaBuyRequest),
|
|
194
|
+
"update_media_buy": ("update_media_buy", gen.UpdateMediaBuyRequest),
|
|
195
|
+
"get_media_buy_delivery": ("get_media_buy_delivery", gen.GetMediaBuyDeliveryRequest),
|
|
196
|
+
"list_authorized_properties": (
|
|
197
|
+
"list_authorized_properties",
|
|
198
|
+
gen.ListAuthorizedPropertiesRequest,
|
|
199
|
+
),
|
|
200
|
+
# Signals
|
|
201
|
+
"get_signals": ("get_signals", gen.GetSignalsRequest),
|
|
202
|
+
"activate_signal": ("activate_signal", gen.ActivateSignalRequest),
|
|
203
|
+
"provide_performance_feedback": (
|
|
204
|
+
"provide_performance_feedback",
|
|
205
|
+
gen.ProvidePerformanceFeedbackRequest,
|
|
206
|
+
),
|
|
207
|
+
# V3 Protocol Discovery
|
|
208
|
+
"get_adcp_capabilities": ("get_adcp_capabilities", gen.GetAdcpCapabilitiesRequest),
|
|
209
|
+
# V3 Content Standards
|
|
210
|
+
"create_content_standards": (
|
|
211
|
+
"create_content_standards",
|
|
212
|
+
gen.CreateContentStandardsRequest,
|
|
213
|
+
),
|
|
214
|
+
"get_content_standards": ("get_content_standards", gen.GetContentStandardsRequest),
|
|
215
|
+
"list_content_standards": ("list_content_standards", gen.ListContentStandardsRequest),
|
|
216
|
+
"update_content_standards": (
|
|
217
|
+
"update_content_standards",
|
|
218
|
+
gen.UpdateContentStandardsRequest,
|
|
219
|
+
),
|
|
220
|
+
"calibrate_content": ("calibrate_content", gen.CalibrateContentRequest),
|
|
221
|
+
"validate_content_delivery": (
|
|
222
|
+
"validate_content_delivery",
|
|
223
|
+
gen.ValidateContentDeliveryRequest,
|
|
224
|
+
),
|
|
225
|
+
"get_media_buy_artifacts": ("get_media_buy_artifacts", gen.GetMediaBuyArtifactsRequest),
|
|
226
|
+
# V3 Sponsored Intelligence
|
|
227
|
+
"si_get_offering": ("si_get_offering", gen.SiGetOfferingRequest),
|
|
228
|
+
"si_initiate_session": ("si_initiate_session", gen.SiInitiateSessionRequest),
|
|
229
|
+
"si_send_message": ("si_send_message", gen.SiSendMessageRequest),
|
|
230
|
+
"si_terminate_session": ("si_terminate_session", gen.SiTerminateSessionRequest),
|
|
231
|
+
# V3 Governance (Property Lists)
|
|
232
|
+
"create_property_list": ("create_property_list", gen.CreatePropertyListRequest),
|
|
233
|
+
"get_property_list": ("get_property_list", gen.GetPropertyListRequest),
|
|
234
|
+
"list_property_lists": ("list_property_lists", gen.ListPropertyListsRequest),
|
|
235
|
+
"update_property_list": ("update_property_list", gen.UpdatePropertyListRequest),
|
|
236
|
+
"delete_property_list": ("delete_property_list", gen.DeletePropertyListRequest),
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return _dispatch_table
|
|
176
240
|
|
|
177
241
|
|
|
178
242
|
async def _dispatch_tool(client: ADCPClient, tool_name: str, payload: dict[str, Any]) -> Any:
|
|
@@ -191,40 +255,14 @@ async def _dispatch_tool(client: ADCPClient, tool_name: str, payload: dict[str,
|
|
|
191
255
|
"""
|
|
192
256
|
from pydantic import ValidationError
|
|
193
257
|
|
|
194
|
-
from adcp.types import _generated as gen
|
|
195
258
|
from adcp.types.core import TaskResult, TaskStatus
|
|
196
259
|
|
|
197
|
-
#
|
|
198
|
-
|
|
199
|
-
TOOL_DISPATCH["get_products"] = ("get_products", gen.GetProductsRequest)
|
|
200
|
-
TOOL_DISPATCH["list_creative_formats"] = (
|
|
201
|
-
"list_creative_formats",
|
|
202
|
-
gen.ListCreativeFormatsRequest,
|
|
203
|
-
)
|
|
204
|
-
TOOL_DISPATCH["preview_creative"] = ("preview_creative", gen.PreviewCreativeRequest)
|
|
205
|
-
TOOL_DISPATCH["build_creative"] = ("build_creative", gen.BuildCreativeRequest)
|
|
206
|
-
TOOL_DISPATCH["sync_creatives"] = ("sync_creatives", gen.SyncCreativesRequest)
|
|
207
|
-
TOOL_DISPATCH["list_creatives"] = ("list_creatives", gen.ListCreativesRequest)
|
|
208
|
-
TOOL_DISPATCH["create_media_buy"] = ("create_media_buy", gen.CreateMediaBuyRequest)
|
|
209
|
-
TOOL_DISPATCH["update_media_buy"] = ("update_media_buy", gen.UpdateMediaBuyRequest)
|
|
210
|
-
TOOL_DISPATCH["get_media_buy_delivery"] = (
|
|
211
|
-
"get_media_buy_delivery",
|
|
212
|
-
gen.GetMediaBuyDeliveryRequest,
|
|
213
|
-
)
|
|
214
|
-
TOOL_DISPATCH["list_authorized_properties"] = (
|
|
215
|
-
"list_authorized_properties",
|
|
216
|
-
gen.ListAuthorizedPropertiesRequest,
|
|
217
|
-
)
|
|
218
|
-
TOOL_DISPATCH["get_signals"] = ("get_signals", gen.GetSignalsRequest)
|
|
219
|
-
TOOL_DISPATCH["activate_signal"] = ("activate_signal", gen.ActivateSignalRequest)
|
|
220
|
-
TOOL_DISPATCH["provide_performance_feedback"] = (
|
|
221
|
-
"provide_performance_feedback",
|
|
222
|
-
gen.ProvidePerformanceFeedbackRequest,
|
|
223
|
-
)
|
|
260
|
+
# Get dispatch table (initializes types on first access, fails fast on import errors)
|
|
261
|
+
dispatch_table = _get_dispatch_table()
|
|
224
262
|
|
|
225
263
|
# Check if tool exists
|
|
226
|
-
if tool_name not in
|
|
227
|
-
available = ", ".join(sorted(
|
|
264
|
+
if tool_name not in dispatch_table:
|
|
265
|
+
available = ", ".join(sorted(dispatch_table.keys()))
|
|
228
266
|
return TaskResult(
|
|
229
267
|
status=TaskStatus.FAILED,
|
|
230
268
|
success=False,
|
|
@@ -232,7 +270,7 @@ async def _dispatch_tool(client: ADCPClient, tool_name: str, payload: dict[str,
|
|
|
232
270
|
)
|
|
233
271
|
|
|
234
272
|
# Get method and request type
|
|
235
|
-
method_name, request_type =
|
|
273
|
+
method_name, request_type = dispatch_table[tool_name]
|
|
236
274
|
method = getattr(client, method_name)
|
|
237
275
|
|
|
238
276
|
# Special case: list_tools and get_info take no parameters and return
|
|
@@ -451,6 +489,11 @@ def main() -> None:
|
|
|
451
489
|
print(" adcp myagent list_tools")
|
|
452
490
|
print(' adcp myagent get_products \'{"brief":"TV ads"}\'')
|
|
453
491
|
print(" adcp https://agent.example.com list_tools")
|
|
492
|
+
print("\nV3 Protocol Examples:")
|
|
493
|
+
print(" adcp myagent get_adcp_capabilities")
|
|
494
|
+
print(" adcp cs-agent calibrate_content '{\"content_standards_id\":\"cs-123\"}'")
|
|
495
|
+
print(" adcp si-agent si_get_offering")
|
|
496
|
+
print(" adcp gov-agent list_property_lists")
|
|
454
497
|
sys.exit(0)
|
|
455
498
|
|
|
456
499
|
# Handle configuration commands
|
|
@@ -280,6 +280,10 @@ def verify_agent_authorization(
|
|
|
280
280
|
return False
|
|
281
281
|
|
|
282
282
|
|
|
283
|
+
# Maximum number of authoritative_location redirects to follow
|
|
284
|
+
MAX_REDIRECT_DEPTH = 5
|
|
285
|
+
|
|
286
|
+
|
|
283
287
|
async def fetch_adagents(
|
|
284
288
|
publisher_domain: str,
|
|
285
289
|
timeout: float = 10.0,
|
|
@@ -288,6 +292,11 @@ async def fetch_adagents(
|
|
|
288
292
|
) -> dict[str, Any]:
|
|
289
293
|
"""Fetch and parse adagents.json from publisher domain.
|
|
290
294
|
|
|
295
|
+
Follows authoritative_location redirects per the AdCP specification. When a
|
|
296
|
+
publisher's adagents.json contains an authoritative_location field instead of
|
|
297
|
+
authorized_agents, this function fetches the referenced URL to get the actual
|
|
298
|
+
authorization data.
|
|
299
|
+
|
|
291
300
|
Args:
|
|
292
301
|
publisher_domain: Domain hosting the adagents.json file
|
|
293
302
|
timeout: Request timeout in seconds
|
|
@@ -297,11 +306,12 @@ async def fetch_adagents(
|
|
|
297
306
|
If None, a new client is created for this request.
|
|
298
307
|
|
|
299
308
|
Returns:
|
|
300
|
-
Parsed adagents.json data
|
|
309
|
+
Parsed adagents.json data (resolved from authoritative_location if present)
|
|
301
310
|
|
|
302
311
|
Raises:
|
|
303
312
|
AdagentsNotFoundError: If adagents.json not found (404)
|
|
304
|
-
AdagentsValidationError: If JSON is invalid or
|
|
313
|
+
AdagentsValidationError: If JSON is invalid, malformed, or redirects
|
|
314
|
+
exceed maximum depth or form a loop
|
|
305
315
|
AdagentsTimeoutError: If request times out
|
|
306
316
|
|
|
307
317
|
Notes:
|
|
@@ -311,13 +321,67 @@ async def fetch_adagents(
|
|
|
311
321
|
# Validate and normalize domain for security
|
|
312
322
|
publisher_domain = _validate_publisher_domain(publisher_domain)
|
|
313
323
|
|
|
314
|
-
# Construct URL
|
|
324
|
+
# Construct initial URL
|
|
315
325
|
url = f"https://{publisher_domain}/.well-known/adagents.json"
|
|
316
326
|
|
|
327
|
+
# Track visited URLs to detect loops
|
|
328
|
+
visited_urls: set[str] = set()
|
|
329
|
+
|
|
330
|
+
for depth in range(MAX_REDIRECT_DEPTH + 1):
|
|
331
|
+
# Check for redirect loop
|
|
332
|
+
if url in visited_urls:
|
|
333
|
+
raise AdagentsValidationError(
|
|
334
|
+
f"Circular redirect detected: {url} already visited"
|
|
335
|
+
)
|
|
336
|
+
visited_urls.add(url)
|
|
337
|
+
|
|
338
|
+
data = await _fetch_adagents_url(url, timeout, user_agent, client)
|
|
339
|
+
|
|
340
|
+
# Check if this is a redirect. A response with authoritative_location but no
|
|
341
|
+
# authorized_agents indicates a redirect. If both are present, authorized_agents
|
|
342
|
+
# takes precedence (response is treated as final).
|
|
343
|
+
if "authoritative_location" in data and "authorized_agents" not in data:
|
|
344
|
+
authoritative_url = data["authoritative_location"]
|
|
345
|
+
|
|
346
|
+
# Validate HTTPS requirement
|
|
347
|
+
if not isinstance(authoritative_url, str) or not authoritative_url.startswith(
|
|
348
|
+
"https://"
|
|
349
|
+
):
|
|
350
|
+
raise AdagentsValidationError(
|
|
351
|
+
f"authoritative_location must be an HTTPS URL, got: {authoritative_url!r}"
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
# Check if we've exceeded max depth
|
|
355
|
+
if depth >= MAX_REDIRECT_DEPTH:
|
|
356
|
+
raise AdagentsValidationError(
|
|
357
|
+
f"Maximum redirect depth ({MAX_REDIRECT_DEPTH}) exceeded"
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# Follow the redirect
|
|
361
|
+
url = authoritative_url
|
|
362
|
+
continue
|
|
363
|
+
|
|
364
|
+
# We have the final data with authorized_agents (or both fields present,
|
|
365
|
+
# in which case authorized_agents takes precedence)
|
|
366
|
+
return data
|
|
367
|
+
|
|
368
|
+
# Unreachable: loop always exits via return or raise above
|
|
369
|
+
raise AssertionError("Unreachable") # pragma: no cover
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
async def _fetch_adagents_url(
|
|
373
|
+
url: str,
|
|
374
|
+
timeout: float,
|
|
375
|
+
user_agent: str,
|
|
376
|
+
client: httpx.AsyncClient | None,
|
|
377
|
+
) -> dict[str, Any]:
|
|
378
|
+
"""Fetch and parse adagents.json from a specific URL.
|
|
379
|
+
|
|
380
|
+
This is the core fetch logic, separated to support redirect following.
|
|
381
|
+
"""
|
|
317
382
|
try:
|
|
318
383
|
# Use provided client or create a new one
|
|
319
384
|
if client is not None:
|
|
320
|
-
# Reuse provided client (connection pooling)
|
|
321
385
|
response = await client.get(
|
|
322
386
|
url,
|
|
323
387
|
headers={"User-Agent": user_agent},
|
|
@@ -325,7 +389,6 @@ async def fetch_adagents(
|
|
|
325
389
|
follow_redirects=True,
|
|
326
390
|
)
|
|
327
391
|
else:
|
|
328
|
-
# Create new client for single request
|
|
329
392
|
async with httpx.AsyncClient() as new_client:
|
|
330
393
|
response = await new_client.get(
|
|
331
394
|
url,
|
|
@@ -334,9 +397,11 @@ async def fetch_adagents(
|
|
|
334
397
|
follow_redirects=True,
|
|
335
398
|
)
|
|
336
399
|
|
|
337
|
-
# Process response
|
|
400
|
+
# Process response
|
|
338
401
|
if response.status_code == 404:
|
|
339
|
-
|
|
402
|
+
# Extract domain from URL for error message
|
|
403
|
+
parsed = urlparse(url)
|
|
404
|
+
raise AdagentsNotFoundError(parsed.netloc)
|
|
340
405
|
|
|
341
406
|
if response.status_code != 200:
|
|
342
407
|
raise AdagentsValidationError(
|
|
@@ -353,22 +418,29 @@ async def fetch_adagents(
|
|
|
353
418
|
if not isinstance(data, dict):
|
|
354
419
|
raise AdagentsValidationError("adagents.json must be a JSON object")
|
|
355
420
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
421
|
+
# If this has authorized_agents, validate it
|
|
422
|
+
if "authorized_agents" in data:
|
|
423
|
+
if not isinstance(data["authorized_agents"], list):
|
|
424
|
+
raise AdagentsValidationError("'authorized_agents' must be an array")
|
|
425
|
+
|
|
426
|
+
# Validate mutual exclusivity constraints
|
|
427
|
+
try:
|
|
428
|
+
validate_adagents(data)
|
|
429
|
+
except ValidationError as e:
|
|
430
|
+
raise AdagentsValidationError(
|
|
431
|
+
f"Invalid adagents.json structure: {e}"
|
|
432
|
+
) from e
|
|
433
|
+
elif "authoritative_location" not in data:
|
|
434
|
+
# Neither authorized_agents nor authoritative_location
|
|
435
|
+
raise AdagentsValidationError(
|
|
436
|
+
"adagents.json must have either 'authorized_agents' or 'authoritative_location'"
|
|
437
|
+
)
|
|
367
438
|
|
|
368
439
|
return data
|
|
369
440
|
|
|
370
441
|
except httpx.TimeoutException as e:
|
|
371
|
-
|
|
442
|
+
parsed = urlparse(url)
|
|
443
|
+
raise AdagentsTimeoutError(parsed.netloc, timeout) from e
|
|
372
444
|
except httpx.RequestError as e:
|
|
373
445
|
raise AdagentsValidationError(f"Failed to fetch adagents.json: {e}") from e
|
|
374
446
|
|