sequenzy 2.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.
- sequenzy/.fern/metadata.json +12 -0
- sequenzy/__init__.py +3017 -0
- sequenzy/_default_clients.py +30 -0
- sequenzy/ab_tests/__init__.py +91 -0
- sequenzy/ab_tests/client.py +1229 -0
- sequenzy/ab_tests/raw_client.py +2275 -0
- sequenzy/ab_tests/types/__init__.py +89 -0
- sequenzy/ab_tests/types/add_variant_ab_tests_response.py +32 -0
- sequenzy/ab_tests/types/create_ab_tests_request_test_type.py +5 -0
- sequenzy/ab_tests/types/create_ab_tests_request_variants_item.py +32 -0
- sequenzy/ab_tests/types/create_ab_tests_request_winner_criteria.py +5 -0
- sequenzy/ab_tests/types/create_ab_tests_response.py +50 -0
- sequenzy/ab_tests/types/delete_ab_tests_response.py +19 -0
- sequenzy/ab_tests/types/delete_variant_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/get_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/get_stats_ab_tests_request_period.py +5 -0
- sequenzy/ab_tests/types/get_stats_ab_tests_response.py +31 -0
- sequenzy/ab_tests/types/get_stats_ab_tests_response_variants_item.py +27 -0
- sequenzy/ab_tests/types/list_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/restart_ab_tests_request_test_type.py +5 -0
- sequenzy/ab_tests/types/restart_ab_tests_response.py +41 -0
- sequenzy/ab_tests/types/update_ab_tests_request_test_type.py +5 -0
- sequenzy/ab_tests/types/update_ab_tests_request_winner_criteria.py +5 -0
- sequenzy/ab_tests/types/update_ab_tests_response.py +30 -0
- sequenzy/ab_tests/types/update_variant_ab_tests_response.py +28 -0
- sequenzy/account/__init__.py +103 -0
- sequenzy/account/client.py +646 -0
- sequenzy/account/raw_client.py +1257 -0
- sequenzy/account/types/__init__.py +103 -0
- sequenzy/account/types/create_api_key_request_preset.py +17 -0
- sequenzy/account/types/create_api_key_response.py +27 -0
- sequenzy/account/types/create_api_key_response_api_key.py +42 -0
- sequenzy/account/types/create_api_key_response_api_key_permissions.py +39 -0
- sequenzy/account/types/get_account_response.py +42 -0
- sequenzy/account/types/get_account_response_api_key_permissions.py +136 -0
- sequenzy/account/types/get_account_response_api_key_permissions_active_key.py +31 -0
- sequenzy/account/types/get_account_response_api_key_permissions_active_key_type.py +5 -0
- sequenzy/account/types/get_account_response_api_key_permissions_preset.py +18 -0
- sequenzy/account/types/get_account_response_companies_item.py +25 -0
- sequenzy/account/types/get_account_response_companies_item_role.py +5 -0
- sequenzy/account/types/get_account_response_user.py +19 -0
- sequenzy/account/types/get_integration_guide_response.py +23 -0
- sequenzy/account/types/list_api_keys_response.py +25 -0
- sequenzy/account/types/request_api_key_handoff_request_preset.py +17 -0
- sequenzy/account/types/request_api_key_handoff_response.py +27 -0
- sequenzy/account/types/request_api_key_handoff_response_handoff.py +81 -0
- sequenzy/account/types/request_api_key_handoff_response_handoff_key_type.py +5 -0
- sequenzy/account/types/request_api_key_handoff_response_handoff_replaces.py +30 -0
- sequenzy/account/types/revoke_api_key_response.py +24 -0
- sequenzy/account/types/update_api_key_request_preset.py +17 -0
- sequenzy/account/types/update_api_key_response.py +24 -0
- sequenzy/analytics/__init__.py +163 -0
- sequenzy/analytics/client.py +1896 -0
- sequenzy/analytics/raw_client.py +3036 -0
- sequenzy/analytics/types/__init__.py +167 -0
- sequenzy/analytics/types/get_campaign_metrics_request_period.py +5 -0
- sequenzy/analytics/types/get_campaign_metrics_response.py +67 -0
- sequenzy/analytics/types/get_campaign_stats_legacy_request_period.py +5 -0
- sequenzy/analytics/types/get_campaign_stats_legacy_response.py +63 -0
- sequenzy/analytics/types/get_metrics_request_email_type.py +5 -0
- sequenzy/analytics/types/get_metrics_request_period.py +5 -0
- sequenzy/analytics/types/get_metrics_response.py +76 -0
- sequenzy/analytics/types/get_metrics_response_email_type.py +5 -0
- sequenzy/analytics/types/get_recipients_request_period.py +5 -0
- sequenzy/analytics/types/get_recipients_response.py +23 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item.py +24 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_clicked_item.py +41 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_clicked_item_engagement_quality.py +7 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_opened_item.py +40 -0
- sequenzy/analytics/types/get_recipients_response_recipients_item_opened_item_engagement_quality.py +7 -0
- sequenzy/analytics/types/get_sequence_metrics_request_period.py +5 -0
- sequenzy/analytics/types/get_sequence_metrics_response.py +58 -0
- sequenzy/analytics/types/get_sequence_metrics_response_enrollment_skipped.py +37 -0
- sequenzy/analytics/types/get_sequence_metrics_response_steps_item.py +61 -0
- sequenzy/analytics/types/get_sequence_metrics_response_steps_item_failed_subscribers_item.py +52 -0
- sequenzy/analytics/types/get_stats_legacy_request_email_type.py +5 -0
- sequenzy/analytics/types/get_stats_legacy_request_period.py +5 -0
- sequenzy/analytics/types/get_stats_legacy_response.py +52 -0
- sequenzy/analytics/types/get_stats_legacy_response_email_type.py +5 -0
- sequenzy/analytics/types/get_transactional_metrics_legacy_request_period.py +5 -0
- sequenzy/analytics/types/get_transactional_metrics_request_period.py +5 -0
- sequenzy/analytics/types/list_campaign_events_request_event_type.py +10 -0
- sequenzy/analytics/types/list_campaign_events_request_period.py +5 -0
- sequenzy/analytics/types/list_campaign_events_response.py +31 -0
- sequenzy/analytics/types/list_campaign_poll_responses_legacy_response.py +31 -0
- sequenzy/analytics/types/list_campaign_poll_responses_response.py +37 -0
- sequenzy/analytics/types/list_email_metrics_request_email_type.py +5 -0
- sequenzy/analytics/types/list_email_metrics_request_order.py +5 -0
- sequenzy/analytics/types/list_email_metrics_request_period.py +5 -0
- sequenzy/analytics/types/list_email_metrics_request_sort.py +20 -0
- sequenzy/analytics/types/list_email_metrics_response.py +55 -0
- sequenzy/analytics/types/list_email_metrics_response_email_type.py +5 -0
- sequenzy/analytics/types/list_email_metrics_response_emails_item.py +63 -0
- sequenzy/analytics/types/list_email_metrics_response_emails_item_email_type.py +5 -0
- sequenzy/analytics/types/list_sequence_events_request_event_type.py +10 -0
- sequenzy/analytics/types/list_sequence_events_request_period.py +5 -0
- sequenzy/analytics/types/list_sequence_events_response.py +36 -0
- sequenzy/audience_syncs/__init__.py +64 -0
- sequenzy/audience_syncs/client.py +484 -0
- sequenzy/audience_syncs/raw_client.py +954 -0
- sequenzy/audience_syncs/types/__init__.py +62 -0
- sequenzy/audience_syncs/types/create_audience_syncs_request.py +5 -0
- sequenzy/audience_syncs/types/create_audience_syncs_request_frequency.py +5 -0
- sequenzy/audience_syncs/types/create_audience_syncs_response.py +25 -0
- sequenzy/audience_syncs/types/delete_audience_syncs_response.py +19 -0
- sequenzy/audience_syncs/types/list_ad_accounts_response.py +25 -0
- sequenzy/audience_syncs/types/list_audience_syncs_response.py +27 -0
- sequenzy/audience_syncs/types/run_now_audience_syncs_response.py +20 -0
- sequenzy/audience_syncs/types/update_audience_syncs_request_frequency.py +5 -0
- sequenzy/audience_syncs/types/update_audience_syncs_response.py +25 -0
- sequenzy/campaigns/__init__.py +145 -0
- sequenzy/campaigns/client.py +2788 -0
- sequenzy/campaigns/raw_client.py +4803 -0
- sequenzy/campaigns/types/__init__.py +143 -0
- sequenzy/campaigns/types/cancel_campaigns_response.py +26 -0
- sequenzy/campaigns/types/create_campaigns_request_email_preset.py +5 -0
- sequenzy/campaigns/types/create_campaigns_request_status.py +5 -0
- sequenzy/campaigns/types/create_campaigns_response.py +23 -0
- sequenzy/campaigns/types/create_campaigns_response_campaign.py +98 -0
- sequenzy/campaigns/types/create_goal_campaigns_response.py +21 -0
- sequenzy/campaigns/types/create_share_link_campaigns_response.py +44 -0
- sequenzy/campaigns/types/delete_campaigns_response.py +19 -0
- sequenzy/campaigns/types/delete_goal_campaigns_response.py +24 -0
- sequenzy/campaigns/types/duplicate_campaigns_request_mode.py +5 -0
- sequenzy/campaigns/types/duplicate_campaigns_response.py +26 -0
- sequenzy/campaigns/types/duplicate_campaigns_response_campaign.py +245 -0
- sequenzy/campaigns/types/get_audience_campaigns_response.py +51 -0
- sequenzy/campaigns/types/get_campaigns_response.py +26 -0
- sequenzy/campaigns/types/list_campaigns_request_status.py +8 -0
- sequenzy/campaigns/types/list_campaigns_response.py +23 -0
- sequenzy/campaigns/types/list_campaigns_response_pagination.py +27 -0
- sequenzy/campaigns/types/list_goals_campaigns_response.py +21 -0
- sequenzy/campaigns/types/pause_campaigns_response.py +26 -0
- sequenzy/campaigns/types/preview_computed_data_campaigns_request_subscriber.py +36 -0
- sequenzy/campaigns/types/preview_computed_data_campaigns_response.py +22 -0
- sequenzy/campaigns/types/preview_computed_data_campaigns_response_lists_item.py +21 -0
- sequenzy/campaigns/types/resend_to_non_openers_campaigns_response.py +40 -0
- sequenzy/campaigns/types/resend_to_non_openers_campaigns_response_campaign.py +245 -0
- sequenzy/campaigns/types/resume_campaigns_response.py +26 -0
- sequenzy/campaigns/types/revoke_share_link_campaigns_response.py +24 -0
- sequenzy/campaigns/types/schedule_campaigns_request_recurring_interval.py +5 -0
- sequenzy/campaigns/types/schedule_campaigns_response.py +36 -0
- sequenzy/campaigns/types/schedule_campaigns_response_campaign.py +60 -0
- sequenzy/campaigns/types/schedule_campaigns_response_campaign_status.py +5 -0
- sequenzy/campaigns/types/send_test_campaigns_response.py +48 -0
- sequenzy/campaigns/types/unschedule_campaigns_response.py +26 -0
- sequenzy/campaigns/types/update_campaigns_request_email_preset.py +5 -0
- sequenzy/campaigns/types/update_campaigns_response.py +23 -0
- sequenzy/campaigns/types/update_campaigns_response_campaign.py +71 -0
- sequenzy/campaigns/types/update_goal_campaigns_response.py +21 -0
- sequenzy/client.py +974 -0
- sequenzy/companies/__init__.py +79 -0
- sequenzy/companies/client.py +624 -0
- sequenzy/companies/raw_client.py +962 -0
- sequenzy/companies/types/__init__.py +77 -0
- sequenzy/companies/types/create_companies_response.py +22 -0
- sequenzy/companies/types/create_companies_response_company.py +26 -0
- sequenzy/companies/types/get_companies_response.py +21 -0
- sequenzy/companies/types/list_companies_response.py +26 -0
- sequenzy/companies/types/update_companies_request_email_direction.py +5 -0
- sequenzy/companies/types/update_companies_request_email_length_preference.py +7 -0
- sequenzy/companies/types/update_companies_request_email_theme.py +60 -0
- sequenzy/companies/types/update_companies_request_email_theme_button_style.py +5 -0
- sequenzy/companies/types/update_companies_request_email_theme_colors.py +46 -0
- sequenzy/companies/types/update_companies_request_email_theme_layout.py +53 -0
- sequenzy/companies/types/update_companies_request_email_theme_preset_id.py +7 -0
- sequenzy/companies/types/update_companies_request_email_theme_typography.py +90 -0
- sequenzy/companies/types/update_companies_request_reply_tracking_domain_mode.py +5 -0
- sequenzy/companies/types/update_companies_response.py +21 -0
- sequenzy/conversations/__init__.py +70 -0
- sequenzy/conversations/client.py +529 -0
- sequenzy/conversations/raw_client.py +938 -0
- sequenzy/conversations/types/__init__.py +70 -0
- sequenzy/conversations/types/get_conversations_response.py +24 -0
- sequenzy/conversations/types/list_conversations_request_status.py +5 -0
- sequenzy/conversations/types/list_conversations_request_unread.py +5 -0
- sequenzy/conversations/types/list_conversations_response.py +23 -0
- sequenzy/conversations/types/mark_read_conversations_response.py +23 -0
- sequenzy/conversations/types/send_message_conversations_request_type.py +5 -0
- sequenzy/conversations/types/send_message_conversations_response.py +21 -0
- sequenzy/conversations/types/update_status_conversations_request_status.py +5 -0
- sequenzy/conversations/types/update_status_conversations_response.py +21 -0
- sequenzy/conversations/types/update_status_conversations_response_conversation.py +23 -0
- sequenzy/conversations/types/update_status_conversations_response_conversation_status.py +5 -0
- sequenzy/core/__init__.py +127 -0
- sequenzy/core/api_error.py +23 -0
- sequenzy/core/client_wrapper.py +146 -0
- sequenzy/core/datetime_utils.py +70 -0
- sequenzy/core/file.py +67 -0
- sequenzy/core/force_multipart.py +18 -0
- sequenzy/core/http_client.py +940 -0
- sequenzy/core/http_response.py +63 -0
- sequenzy/core/http_sse/__init__.py +42 -0
- sequenzy/core/http_sse/_api.py +455 -0
- sequenzy/core/http_sse/_decoders.py +74 -0
- sequenzy/core/http_sse/_exceptions.py +7 -0
- sequenzy/core/http_sse/_models.py +17 -0
- sequenzy/core/jsonable_encoder.py +133 -0
- sequenzy/core/logging.py +107 -0
- sequenzy/core/parse_error.py +36 -0
- sequenzy/core/pydantic_utilities.py +508 -0
- sequenzy/core/query_encoder.py +58 -0
- sequenzy/core/remove_none_from_dict.py +11 -0
- sequenzy/core/request_options.py +40 -0
- sequenzy/core/serialization.py +347 -0
- sequenzy/email_blocks/__init__.py +49 -0
- sequenzy/email_blocks/client.py +207 -0
- sequenzy/email_blocks/raw_client.py +344 -0
- sequenzy/email_blocks/types/__init__.py +47 -0
- sequenzy/email_blocks/types/get_email_blocks_request_condition_fields.py +5 -0
- sequenzy/email_blocks/types/get_email_blocks_response.py +55 -0
- sequenzy/email_blocks/types/list_email_blocks_request_creatable_only.py +5 -0
- sequenzy/email_blocks/types/list_email_blocks_response.py +45 -0
- sequenzy/email_components/__init__.py +79 -0
- sequenzy/email_components/client.py +717 -0
- sequenzy/email_components/raw_client.py +1373 -0
- sequenzy/email_components/types/__init__.py +77 -0
- sequenzy/email_components/types/create_email_components_request_component_type.py +5 -0
- sequenzy/email_components/types/create_email_components_response.py +28 -0
- sequenzy/email_components/types/delete_email_components_response.py +20 -0
- sequenzy/email_components/types/get_default_email_components_request_slot.py +5 -0
- sequenzy/email_components/types/get_default_email_components_response.py +26 -0
- sequenzy/email_components/types/get_email_components_response.py +26 -0
- sequenzy/email_components/types/list_email_components_request_defaults_only.py +5 -0
- sequenzy/email_components/types/list_email_components_request_slot.py +5 -0
- sequenzy/email_components/types/list_email_components_request_type.py +5 -0
- sequenzy/email_components/types/list_email_components_response.py +26 -0
- sequenzy/email_components/types/set_default_email_components_request_slot.py +5 -0
- sequenzy/email_components/types/set_default_email_components_response.py +28 -0
- sequenzy/email_components/types/update_email_components_request_component_type.py +5 -0
- sequenzy/email_components/types/update_email_components_response.py +28 -0
- sequenzy/email_sends/__init__.py +64 -0
- sequenzy/email_sends/client.py +342 -0
- sequenzy/email_sends/raw_client.py +559 -0
- sequenzy/email_sends/types/__init__.py +62 -0
- sequenzy/email_sends/types/get_email_sends_response.py +30 -0
- sequenzy/email_sends/types/get_email_sends_response_source.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_bounce_type.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_email_type.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_sort_field.py +7 -0
- sequenzy/email_sends/types/list_email_sends_request_sort_order.py +5 -0
- sequenzy/email_sends/types/list_email_sends_request_status.py +10 -0
- sequenzy/email_sends/types/list_email_sends_response.py +32 -0
- sequenzy/email_sends/types/list_email_sends_response_email_sends_item.py +27 -0
- sequenzy/emails/__init__.py +49 -0
- sequenzy/emails/client.py +435 -0
- sequenzy/emails/raw_client.py +800 -0
- sequenzy/emails/types/__init__.py +47 -0
- sequenzy/emails/types/create_emails_response.py +28 -0
- sequenzy/emails/types/update_blocks_emails_request_type.py +5 -0
- sequenzy/emails/types/update_blocks_emails_response.py +28 -0
- sequenzy/emails/types/update_emails_response.py +28 -0
- sequenzy/environment.py +7 -0
- sequenzy/errors/__init__.py +62 -0
- sequenzy/errors/bad_request_error.py +10 -0
- sequenzy/errors/conflict_error.py +10 -0
- sequenzy/errors/forbidden_error.py +11 -0
- sequenzy/errors/internal_server_error.py +10 -0
- sequenzy/errors/not_found_error.py +10 -0
- sequenzy/errors/service_unavailable_error.py +10 -0
- sequenzy/errors/too_many_requests_error.py +10 -0
- sequenzy/errors/unauthorized_error.py +10 -0
- sequenzy/errors/unprocessable_entity_error.py +10 -0
- sequenzy/events/__init__.py +37 -0
- sequenzy/events/client.py +129 -0
- sequenzy/events/raw_client.py +201 -0
- sequenzy/events/types/__init__.py +38 -0
- sequenzy/events/types/get_schemas_events_request_provider.py +7 -0
- sequenzy/events/types/get_schemas_events_response.py +40 -0
- sequenzy/feedback/__init__.py +49 -0
- sequenzy/feedback/client.py +212 -0
- sequenzy/feedback/raw_client.py +317 -0
- sequenzy/feedback/types/__init__.py +47 -0
- sequenzy/feedback/types/submit_feedback_request_category.py +7 -0
- sequenzy/feedback/types/submit_feedback_request_source.py +5 -0
- sequenzy/feedback/types/submit_feedback_request_tool_calls_item.py +32 -0
- sequenzy/feedback/types/submit_feedback_response.py +20 -0
- sequenzy/generation/__init__.py +55 -0
- sequenzy/generation/client.py +352 -0
- sequenzy/generation/raw_client.py +676 -0
- sequenzy/generation/types/__init__.py +53 -0
- sequenzy/generation/types/generate_email_request_email_type.py +5 -0
- sequenzy/generation/types/generate_email_response.py +38 -0
- sequenzy/generation/types/generate_sms_messages_response.py +22 -0
- sequenzy/generation/types/generate_sms_messages_response_messages_item.py +27 -0
- sequenzy/generation/types/generate_sms_messages_response_messages_item_encoding.py +5 -0
- sequenzy/generation/types/generate_subject_lines_response.py +21 -0
- sequenzy/integrations/__init__.py +82 -0
- sequenzy/integrations/client.py +851 -0
- sequenzy/integrations/raw_client.py +1689 -0
- sequenzy/integrations/types/__init__.py +80 -0
- sequenzy/integrations/types/activate_pixel_integrations_response.py +33 -0
- sequenzy/integrations/types/connect_integrations_request_history_import.py +61 -0
- sequenzy/integrations/types/connect_integrations_request_history_import_region.py +5 -0
- sequenzy/integrations/types/connect_integrations_request_provider.py +8 -0
- sequenzy/integrations/types/connect_integrations_request_settings.py +30 -0
- sequenzy/integrations/types/connect_integrations_response.py +60 -0
- sequenzy/integrations/types/connect_integrations_response_history.py +25 -0
- sequenzy/integrations/types/list_activity_integrations_request_status.py +7 -0
- sequenzy/integrations/types/list_activity_integrations_response.py +27 -0
- sequenzy/integrations/types/list_capabilities_integrations_response.py +21 -0
- sequenzy/integrations/types/list_integrations_response.py +21 -0
- sequenzy/integrations/types/sync_integrations_response.py +44 -0
- sequenzy/integrations/types/sync_integrations_response_sync_target.py +31 -0
- sequenzy/integrations/types/update_sync_integrations_response.py +73 -0
- sequenzy/integrations/types/update_sync_integrations_response_list_targeting.py +7 -0
- sequenzy/landing_pages/__init__.py +88 -0
- sequenzy/landing_pages/client.py +1368 -0
- sequenzy/landing_pages/raw_client.py +2615 -0
- sequenzy/landing_pages/types/__init__.py +86 -0
- sequenzy/landing_pages/types/connect_dedicated_domain_landing_pages_response.py +22 -0
- sequenzy/landing_pages/types/connect_domain_landing_pages_response.py +22 -0
- sequenzy/landing_pages/types/create_landing_pages_request_template.py +20 -0
- sequenzy/landing_pages/types/create_landing_pages_response.py +26 -0
- sequenzy/landing_pages/types/delete_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/duplicate_landing_pages_response.py +26 -0
- sequenzy/landing_pages/types/get_dedicated_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/get_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/get_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/list_landing_pages_response.py +31 -0
- sequenzy/landing_pages/types/publish_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/remove_dedicated_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/unpublish_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/update_domain_settings_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/update_landing_pages_response.py +25 -0
- sequenzy/landing_pages/types/verify_dedicated_domain_landing_pages_response.py +21 -0
- sequenzy/landing_pages/types/verify_domain_landing_pages_response.py +21 -0
- sequenzy/lists/__init__.py +64 -0
- sequenzy/lists/client.py +608 -0
- sequenzy/lists/raw_client.py +1095 -0
- sequenzy/lists/types/__init__.py +62 -0
- sequenzy/lists/types/add_subscribers_lists_request_duplicate_strategy.py +5 -0
- sequenzy/lists/types/add_subscribers_lists_request_opt_in_mode.py +5 -0
- sequenzy/lists/types/add_subscribers_lists_response.py +41 -0
- sequenzy/lists/types/add_subscribers_lists_response_results_item.py +29 -0
- sequenzy/lists/types/create_lists_response.py +25 -0
- sequenzy/lists/types/delete_lists_response.py +30 -0
- sequenzy/lists/types/list_lists_response.py +21 -0
- sequenzy/lists/types/remove_subscribers_lists_response.py +35 -0
- sequenzy/lists/types/update_lists_response.py +25 -0
- sequenzy/media/__init__.py +49 -0
- sequenzy/media/client.py +375 -0
- sequenzy/media/raw_client.py +682 -0
- sequenzy/media/types/__init__.py +47 -0
- sequenzy/media/types/complete_email_image_upload_response.py +21 -0
- sequenzy/media/types/complete_email_image_upload_response_asset.py +39 -0
- sequenzy/media/types/create_email_image_upload_url_response.py +31 -0
- sequenzy/media/types/upload_email_image_bytes_response.py +25 -0
- sequenzy/migrations/__init__.py +58 -0
- sequenzy/migrations/client.py +645 -0
- sequenzy/migrations/raw_client.py +1250 -0
- sequenzy/migrations/types/__init__.py +56 -0
- sequenzy/migrations/types/approve_plan_migrations_response.py +20 -0
- sequenzy/migrations/types/cancel_migrations_response.py +20 -0
- sequenzy/migrations/types/connect_source_migrations_response.py +20 -0
- sequenzy/migrations/types/discover_source_migrations_response.py +20 -0
- sequenzy/migrations/types/get_agent_package_migrations_response.py +20 -0
- sequenzy/migrations/types/get_run_migrations_response.py +20 -0
- sequenzy/migrations/types/start_migrations_response.py +20 -0
- sequenzy/notification_preferences/__init__.py +4 -0
- sequenzy/notification_preferences/client.py +198 -0
- sequenzy/notification_preferences/raw_client.py +311 -0
- sequenzy/orders/__init__.py +49 -0
- sequenzy/orders/client.py +393 -0
- sequenzy/orders/raw_client.py +539 -0
- sequenzy/orders/types/__init__.py +47 -0
- sequenzy/orders/types/push_orders_request_customer_totals.py +30 -0
- sequenzy/orders/types/push_orders_request_status.py +5 -0
- sequenzy/orders/types/push_orders_response.py +29 -0
- sequenzy/orders/types/track_checkout_started_response.py +30 -0
- sequenzy/products/__init__.py +82 -0
- sequenzy/products/client.py +905 -0
- sequenzy/products/raw_client.py +1642 -0
- sequenzy/products/types/__init__.py +82 -0
- sequenzy/products/types/attach_delivery_products_request_source.py +5 -0
- sequenzy/products/types/attach_delivery_products_response.py +21 -0
- sequenzy/products/types/create_delivery_upload_url_products_response.py +30 -0
- sequenzy/products/types/delete_products_response.py +20 -0
- sequenzy/products/types/get_products_response.py +21 -0
- sequenzy/products/types/list_products_request_provider.py +7 -0
- sequenzy/products/types/list_products_response.py +23 -0
- sequenzy/products/types/list_products_response_pagination.py +40 -0
- sequenzy/products/types/register_back_in_stock_response.py +24 -0
- sequenzy/products/types/remove_delivery_products_response.py +21 -0
- sequenzy/products/types/sync_stripe_products_response.py +24 -0
- sequenzy/products/types/upsert_products_request_products_item.py +89 -0
- sequenzy/products/types/upsert_products_request_products_item_variants_item.py +53 -0
- sequenzy/products/types/upsert_products_request_products_item_variants_item_options_item.py +20 -0
- sequenzy/products/types/upsert_products_response.py +36 -0
- sequenzy/reference.md +27269 -0
- sequenzy/segments/__init__.py +61 -0
- sequenzy/segments/client.py +445 -0
- sequenzy/segments/raw_client.py +831 -0
- sequenzy/segments/types/__init__.py +59 -0
- sequenzy/segments/types/create_segments_request.py +5 -0
- sequenzy/segments/types/create_segments_request_filter_join_operator.py +5 -0
- sequenzy/segments/types/create_segments_response.py +30 -0
- sequenzy/segments/types/delete_segments_response.py +19 -0
- sequenzy/segments/types/get_count_segments_response.py +25 -0
- sequenzy/segments/types/list_segments_response.py +26 -0
- sequenzy/segments/types/update_segments_request_filter_join_operator.py +5 -0
- sequenzy/segments/types/update_segments_response.py +30 -0
- sequenzy/sender_profiles/__init__.py +38 -0
- sequenzy/sender_profiles/client.py +269 -0
- sequenzy/sender_profiles/raw_client.py +524 -0
- sequenzy/sender_profiles/types/__init__.py +40 -0
- sequenzy/sender_profiles/types/list_sender_profiles_response.py +43 -0
- sequenzy/sender_profiles/types/update_reply_profile_response.py +30 -0
- sequenzy/sender_profiles/types/update_sender_profiles_response.py +32 -0
- sequenzy/sending_status/__init__.py +34 -0
- sequenzy/sending_status/client.py +182 -0
- sequenzy/sending_status/raw_client.py +363 -0
- sequenzy/sending_status/types/__init__.py +34 -0
- sequenzy/sending_status/types/resume_sending_status_response.py +28 -0
- sequenzy/sequences/__init__.py +139 -0
- sequenzy/sequences/client.py +4043 -0
- sequenzy/sequences/raw_client.py +6760 -0
- sequenzy/sequences/types/__init__.py +139 -0
- sequenzy/sequences/types/archive_sequences_response.py +21 -0
- sequenzy/sequences/types/configure_inbound_webhook_sequences_response.py +21 -0
- sequenzy/sequences/types/create_goal_sequences_response.py +21 -0
- sequenzy/sequences/types/delete_goal_sequences_response.py +24 -0
- sequenzy/sequences/types/duplicate_sequences_response.py +25 -0
- sequenzy/sequences/types/enroll_subscribers_in_sequences_response.py +58 -0
- sequenzy/sequences/types/generate_sequences_response.py +25 -0
- sequenzy/sequences/types/get_inbound_webhook_sequences_response.py +21 -0
- sequenzy/sequences/types/get_sequences_response.py +26 -0
- sequenzy/sequences/types/get_stats_sequences_request_period.py +5 -0
- sequenzy/sequences/types/get_stats_sequences_response.py +58 -0
- sequenzy/sequences/types/get_stats_sequences_response_enrollment_skipped.py +37 -0
- sequenzy/sequences/types/get_stats_sequences_response_steps_item.py +61 -0
- sequenzy/sequences/types/get_stats_sequences_response_steps_item_failed_subscribers_item.py +31 -0
- sequenzy/sequences/types/list_enrollments_sequences_request_sort.py +7 -0
- sequenzy/sequences/types/list_goals_sequences_response.py +21 -0
- sequenzy/sequences/types/list_sequences_response.py +23 -0
- sequenzy/sequences/types/list_sequences_response_pagination.py +31 -0
- sequenzy/sequences/types/rotate_inbound_webhook_secret_sequences_response.py +21 -0
- sequenzy/sequences/types/send_test_email_sequences_response.py +26 -0
- sequenzy/sequences/types/send_test_email_sequences_response_results_item.py +43 -0
- sequenzy/sequences/types/sequence_create_request_email_style.py +5 -0
- sequenzy/sequences/types/sequence_create_request_inactivity_baseline.py +7 -0
- sequenzy/sequences/types/sequence_create_request_list_scope.py +5 -0
- sequenzy/sequences/types/sequence_enrollment_move_request_sort.py +7 -0
- sequenzy/sequences/types/sequence_update_request_inactivity_baseline.py +7 -0
- sequenzy/sequences/types/sequence_update_request_list_scope.py +5 -0
- sequenzy/sequences/types/simulate_sequences_response.py +43 -0
- sequenzy/sequences/types/simulate_sequences_response_readiness.py +25 -0
- sequenzy/sequences/types/unarchive_sequences_response.py +21 -0
- sequenzy/sequences/types/update_goal_sequences_response.py +21 -0
- sequenzy/sequences/types/update_sequences_response.py +23 -0
- sequenzy/sequences/types/update_sequences_response_sequence.py +162 -0
- sequenzy/sequences/types/update_sequences_response_sequence_graph_edit_action.py +7 -0
- sequenzy/shopify/__init__.py +37 -0
- sequenzy/shopify/client.py +215 -0
- sequenzy/shopify/raw_client.py +432 -0
- sequenzy/shopify/types/__init__.py +38 -0
- sequenzy/shopify/types/get_automation_settings_shopify_response.py +43 -0
- sequenzy/shopify/types/update_automation_settings_shopify_response.py +44 -0
- sequenzy/sms/__init__.py +55 -0
- sequenzy/sms/client.py +313 -0
- sequenzy/sms/raw_client.py +663 -0
- sequenzy/sms/types/__init__.py +53 -0
- sequenzy/sms/types/get_settings_sms_response.py +22 -0
- sequenzy/sms/types/get_settings_sms_response_sms.py +35 -0
- sequenzy/sms/types/get_settings_sms_response_sms_numbers_item.py +39 -0
- sequenzy/sms/types/send_test_sms_response.py +28 -0
- sequenzy/sms/types/update_number_label_sms_response.py +22 -0
- sequenzy/sms/types/update_number_label_sms_response_number.py +25 -0
- sequenzy/subscribers/__init__.py +229 -0
- sequenzy/subscribers/client.py +2872 -0
- sequenzy/subscribers/events/__init__.py +67 -0
- sequenzy/subscribers/events/client.py +352 -0
- sequenzy/subscribers/events/raw_client.py +460 -0
- sequenzy/subscribers/events/types/__init__.py +65 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_request_events_item.py +47 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response.py +38 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response_events_item.py +41 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response_opt_in.py +28 -0
- sequenzy/subscribers/events/types/trigger_bulk_events_response_subscriber.py +25 -0
- sequenzy/subscribers/events/types/trigger_events_response.py +76 -0
- sequenzy/subscribers/events/types/trigger_events_response_event.py +35 -0
- sequenzy/subscribers/events/types/trigger_events_response_events_item.py +26 -0
- sequenzy/subscribers/events/types/trigger_events_response_opt_in.py +28 -0
- sequenzy/subscribers/events/types/trigger_events_response_subscriber.py +25 -0
- sequenzy/subscribers/raw_client.py +4840 -0
- sequenzy/subscribers/tags/__init__.py +58 -0
- sequenzy/subscribers/tags/client.py +302 -0
- sequenzy/subscribers/tags/raw_client.py +415 -0
- sequenzy/subscribers/tags/types/__init__.py +56 -0
- sequenzy/subscribers/tags/types/add_tags_response.py +38 -0
- sequenzy/subscribers/tags/types/add_tags_response_opt_in.py +28 -0
- sequenzy/subscribers/tags/types/add_tags_response_subscriber.py +30 -0
- sequenzy/subscribers/tags/types/add_tags_response_tag.py +25 -0
- sequenzy/subscribers/tags/types/remove_tags_response.py +23 -0
- sequenzy/subscribers/tags/types/remove_tags_response_subscriber.py +30 -0
- sequenzy/subscribers/tags/types/remove_tags_response_tag.py +23 -0
- sequenzy/subscribers/types/__init__.py +173 -0
- sequenzy/subscribers/types/add_tags_bulk_response.py +38 -0
- sequenzy/subscribers/types/add_tags_bulk_response_opt_in.py +28 -0
- sequenzy/subscribers/types/add_tags_bulk_response_subscriber.py +26 -0
- sequenzy/subscribers/types/add_tags_bulk_response_tags.py +27 -0
- sequenzy/subscribers/types/create_import_subscribers_request_duplicate_strategy.py +5 -0
- sequenzy/subscribers/types/create_import_subscribers_request_opt_in_mode.py +7 -0
- sequenzy/subscribers/types/create_import_subscribers_response.py +27 -0
- sequenzy/subscribers/types/create_note_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/create_note_subscribers_response.py +21 -0
- sequenzy/subscribers/types/create_subscribers_request_duplicate_strategy.py +5 -0
- sequenzy/subscribers/types/create_subscribers_request_opt_in_mode.py +5 -0
- sequenzy/subscribers/types/create_subscribers_request_status.py +5 -0
- sequenzy/subscribers/types/create_subscribers_response.py +35 -0
- sequenzy/subscribers/types/create_subscribers_response_opt_in.py +28 -0
- sequenzy/subscribers/types/create_subscribers_response_subscriber.py +33 -0
- sequenzy/subscribers/types/delete_by_external_id_path_subscribers_response.py +20 -0
- sequenzy/subscribers/types/delete_by_external_id_subscribers_response.py +20 -0
- sequenzy/subscribers/types/delete_note_subscribers_response.py +26 -0
- sequenzy/subscribers/types/delete_subscribers_response.py +20 -0
- sequenzy/subscribers/types/get_account_info_response.py +21 -0
- sequenzy/subscribers/types/get_account_info_response_account.py +26 -0
- sequenzy/subscribers/types/get_by_external_id_path_subscribers_response.py +21 -0
- sequenzy/subscribers/types/get_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/get_import_subscribers_response.py +25 -0
- sequenzy/subscribers/types/get_subscribers_response.py +21 -0
- sequenzy/subscribers/types/import_events_subscribers_request_events_item.py +71 -0
- sequenzy/subscribers/types/import_events_subscribers_response.py +83 -0
- sequenzy/subscribers/types/import_events_subscribers_response_failures_item.py +20 -0
- sequenzy/subscribers/types/import_events_subscribers_response_side_effect_failures_item.py +21 -0
- sequenzy/subscribers/types/list_notes_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/list_notes_subscribers_response.py +21 -0
- sequenzy/subscribers/types/list_subscribers_request_attribute_operator.py +7 -0
- sequenzy/subscribers/types/list_subscribers_request_include_total.py +5 -0
- sequenzy/subscribers/types/list_subscribers_request_status.py +5 -0
- sequenzy/subscribers/types/list_subscribers_response.py +23 -0
- sequenzy/subscribers/types/update_by_external_id_path_subscribers_request_custom_attributes_strategy.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_path_subscribers_request_status.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_path_subscribers_response.py +21 -0
- sequenzy/subscribers/types/update_by_external_id_subscribers_request_custom_attributes_strategy.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_subscribers_request_status.py +7 -0
- sequenzy/subscribers/types/update_by_external_id_subscribers_response.py +21 -0
- sequenzy/subscribers/types/update_subscribers_request_custom_attributes_strategy.py +5 -0
- sequenzy/subscribers/types/update_subscribers_request_status.py +5 -0
- sequenzy/subscribers/types/update_subscribers_response.py +21 -0
- sequenzy/suppressions/__init__.py +94 -0
- sequenzy/suppressions/client.py +358 -0
- sequenzy/suppressions/raw_client.py +760 -0
- sequenzy/suppressions/types/__init__.py +98 -0
- sequenzy/suppressions/types/get_suppressions_response.py +21 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression.py +29 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_local.py +51 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_local_scope.py +5 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_local_suppression_type.py +7 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_ses.py +25 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_ses_entries_item.py +36 -0
- sequenzy/suppressions/types/get_suppressions_response_suppression_ses_entries_item_reason.py +5 -0
- sequenzy/suppressions/types/list_suppressions_request_order.py +5 -0
- sequenzy/suppressions/types/list_suppressions_request_sort.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response.py +49 -0
- sequenzy/suppressions/types/list_suppressions_response_sort_by.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_sort_order.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item.py +63 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_reason.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_scope.py +5 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_source.py +7 -0
- sequenzy/suppressions/types/list_suppressions_response_suppressions_item_suppression_type.py +7 -0
- sequenzy/suppressions/types/remove_suppressions_response.py +52 -0
- sequenzy/sync_rules/__init__.py +34 -0
- sequenzy/sync_rules/client.py +223 -0
- sequenzy/sync_rules/raw_client.py +330 -0
- sequenzy/sync_rules/types/__init__.py +38 -0
- sequenzy/sync_rules/types/get_sync_rules_response.py +34 -0
- sequenzy/sync_rules/types/update_sync_rules_response.py +29 -0
- sequenzy/tags/__init__.py +39 -0
- sequenzy/tags/client.py +340 -0
- sequenzy/tags/raw_client.py +746 -0
- sequenzy/tags/types/__init__.py +42 -0
- sequenzy/tags/types/create_tags_response.py +21 -0
- sequenzy/tags/types/delete_tags_response.py +19 -0
- sequenzy/tags/types/list_tags_response.py +21 -0
- sequenzy/tags/types/update_tags_response.py +21 -0
- sequenzy/team/__init__.py +55 -0
- sequenzy/team/client.py +282 -0
- sequenzy/team/raw_client.py +658 -0
- sequenzy/team/types/__init__.py +53 -0
- sequenzy/team/types/cancel_invitation_team_response.py +19 -0
- sequenzy/team/types/invite_team_request_role.py +5 -0
- sequenzy/team/types/invite_team_response.py +23 -0
- sequenzy/team/types/invite_team_response_invitation.py +35 -0
- sequenzy/team/types/invite_team_response_invitation_role.py +5 -0
- sequenzy/team/types/list_team_response.py +21 -0
- sequenzy/templates/__init__.py +73 -0
- sequenzy/templates/client.py +1152 -0
- sequenzy/templates/raw_client.py +2088 -0
- sequenzy/templates/types/__init__.py +71 -0
- sequenzy/templates/types/create_share_link_templates_response.py +44 -0
- sequenzy/templates/types/create_templates_response.py +23 -0
- sequenzy/templates/types/create_templates_response_template.py +22 -0
- sequenzy/templates/types/delete_templates_response.py +25 -0
- sequenzy/templates/types/get_templates_response.py +27 -0
- sequenzy/templates/types/list_templates_response.py +33 -0
- sequenzy/templates/types/list_templates_response_pagination.py +34 -0
- sequenzy/templates/types/revoke_share_link_templates_response.py +24 -0
- sequenzy/templates/types/set_localization_templates_response.py +33 -0
- sequenzy/templates/types/sync_localizations_templates_response.py +30 -0
- sequenzy/templates/types/update_templates_response.py +24 -0
- sequenzy/templates/types/update_templates_response_template.py +27 -0
- sequenzy/tests/conftest.py +21 -0
- sequenzy/tests/test_aiohttp_autodetect.py +113 -0
- sequenzy/tracking_settings/__init__.py +37 -0
- sequenzy/tracking_settings/client.py +267 -0
- sequenzy/tracking_settings/raw_client.py +415 -0
- sequenzy/tracking_settings/types/__init__.py +38 -0
- sequenzy/tracking_settings/types/update_tracking_settings_request_auto_utm_settings.py +27 -0
- sequenzy/tracking_settings/types/update_tracking_settings_response.py +20 -0
- sequenzy/transactional/__init__.py +103 -0
- sequenzy/transactional/client.py +968 -0
- sequenzy/transactional/raw_client.py +1678 -0
- sequenzy/transactional/types/__init__.py +103 -0
- sequenzy/transactional/types/create_transactional_response.py +28 -0
- sequenzy/transactional/types/delete_transactional_response.py +22 -0
- sequenzy/transactional/types/delete_transactional_response_deleted.py +35 -0
- sequenzy/transactional/types/get_transactional_response.py +26 -0
- sequenzy/transactional/types/list_transactional_request_order.py +5 -0
- sequenzy/transactional/types/list_transactional_request_sort.py +7 -0
- sequenzy/transactional/types/list_transactional_request_status.py +5 -0
- sequenzy/transactional/types/list_transactional_response.py +21 -0
- sequenzy/transactional/types/send_transactional_request_bcc.py +5 -0
- sequenzy/transactional/types/send_transactional_request_cc.py +5 -0
- sequenzy/transactional/types/send_transactional_request_email_type.py +5 -0
- sequenzy/transactional/types/send_transactional_request_to.py +5 -0
- sequenzy/transactional/types/send_transactional_request_tracking_settings.py +46 -0
- sequenzy/transactional/types/send_transactional_response.py +8 -0
- sequenzy/transactional/types/send_transactional_response_one.py +67 -0
- sequenzy/transactional/types/send_transactional_response_one_email_type.py +5 -0
- sequenzy/transactional/types/send_transactional_response_one_to.py +5 -0
- sequenzy/transactional/types/send_transactional_response_transactional.py +69 -0
- sequenzy/transactional/types/send_transactional_response_transactional_email_type.py +5 -0
- sequenzy/transactional/types/send_transactional_response_transactional_to.py +5 -0
- sequenzy/transactional/types/send_transactional_response_transactional_transactional.py +21 -0
- sequenzy/transactional/types/update_transactional_response.py +28 -0
- sequenzy/types/__init__.py +1409 -0
- sequenzy/types/ab_test.py +119 -0
- sequenzy/types/ab_test_content_editing.py +30 -0
- sequenzy/types/ab_test_kind.py +5 -0
- sequenzy/types/ab_test_test_type.py +5 -0
- sequenzy/types/ab_test_variant.py +63 -0
- sequenzy/types/ad_account.py +20 -0
- sequenzy/types/agent_friendly_error.py +55 -0
- sequenzy/types/api_key_metadata.py +65 -0
- sequenzy/types/api_key_metadata_type.py +5 -0
- sequenzy/types/attachment.py +58 -0
- sequenzy/types/audience_sync.py +72 -0
- sequenzy/types/audience_sync_frequency.py +5 -0
- sequenzy/types/bad_request_error_body.py +21 -0
- sequenzy/types/bad_request_error_body_error.py +20 -0
- sequenzy/types/block_field_warnings.py +8 -0
- sequenzy/types/bulk_subscriber_tag_request.py +63 -0
- sequenzy/types/bulk_subscriber_tag_response.py +76 -0
- sequenzy/types/bulk_subscriber_tag_response_failures_item.py +25 -0
- sequenzy/types/bulk_subscriber_tag_response_not_found.py +31 -0
- sequenzy/types/campaign_channel.py +5 -0
- sequenzy/types/campaign_detail.py +108 -0
- sequenzy/types/campaign_goal.py +71 -0
- sequenzy/types/campaign_goal_attribute_condition.py +5 -0
- sequenzy/types/campaign_goal_input.py +65 -0
- sequenzy/types/campaign_goal_input_attribute_condition.py +7 -0
- sequenzy/types/campaign_goal_input_trigger_type.py +5 -0
- sequenzy/types/campaign_goal_metrics.py +33 -0
- sequenzy/types/campaign_goal_scope.py +5 -0
- sequenzy/types/campaign_goal_trigger_type.py +5 -0
- sequenzy/types/campaign_status.py +8 -0
- sequenzy/types/campaign_summary.py +160 -0
- sequenzy/types/clicked_link.py +36 -0
- sequenzy/types/commerce_customer.py +41 -0
- sequenzy/types/commerce_forecast_range.py +26 -0
- sequenzy/types/commerce_order_item.py +55 -0
- sequenzy/types/commerce_product.py +99 -0
- sequenzy/types/commerce_product_provider.py +5 -0
- sequenzy/types/commerce_product_variants_item.py +47 -0
- sequenzy/types/commerce_product_variants_item_options_item.py +20 -0
- sequenzy/types/commerce_value_forecast.py +47 -0
- sequenzy/types/commerce_value_forecast_actual.py +33 -0
- sequenzy/types/commerce_value_forecast_confidence.py +5 -0
- sequenzy/types/commerce_value_forecast_eligibility.py +20 -0
- sequenzy/types/commerce_value_forecast_eligibility_reasons_item.py +22 -0
- sequenzy/types/commerce_value_forecast_forecast.py +56 -0
- sequenzy/types/commerce_value_forecast_history.py +40 -0
- sequenzy/types/commerce_value_forecast_status.py +5 -0
- sequenzy/types/company.py +204 -0
- sequenzy/types/company_email_length_preference.py +5 -0
- sequenzy/types/company_reply_tracking_domain_mode.py +5 -0
- sequenzy/types/conversation_message.py +61 -0
- sequenzy/types/conversation_message_type.py +5 -0
- sequenzy/types/conversation_summary.py +51 -0
- sequenzy/types/conversation_summary_context.py +27 -0
- sequenzy/types/conversation_summary_status.py +5 -0
- sequenzy/types/detailed_subscriber.py +37 -0
- sequenzy/types/email.py +44 -0
- sequenzy/types/email_block.py +108 -0
- sequenzy/types/email_block_condition_field_reference.py +74 -0
- sequenzy/types/email_block_condition_field_reference_preview_support.py +7 -0
- sequenzy/types/email_block_conditions_item.py +31 -0
- sequenzy/types/email_block_conditions_item_field.py +7 -0
- sequenzy/types/email_block_conditions_item_operator.py +8 -0
- sequenzy/types/email_block_field_reference.py +53 -0
- sequenzy/types/email_block_layout.py +5 -0
- sequenzy/types/email_block_overlay_position.py +5 -0
- sequenzy/types/email_block_styles.py +69 -0
- sequenzy/types/email_block_styles_text_align.py +5 -0
- sequenzy/types/email_block_type.py +47 -0
- sequenzy/types/email_block_type_reference.py +49 -0
- sequenzy/types/email_body_input.py +34 -0
- sequenzy/types/email_component.py +64 -0
- sequenzy/types/email_component_component_type.py +5 -0
- sequenzy/types/email_component_default_slot.py +5 -0
- sequenzy/types/email_event.py +89 -0
- sequenzy/types/email_event_email_type.py +5 -0
- sequenzy/types/email_event_event_type.py +10 -0
- sequenzy/types/email_preset.py +5 -0
- sequenzy/types/email_send.py +250 -0
- sequenzy/types/email_send_additional_recipients.py +25 -0
- sequenzy/types/email_send_automation.py +20 -0
- sequenzy/types/email_send_campaign.py +20 -0
- sequenzy/types/email_send_email_type.py +5 -0
- sequenzy/types/email_send_event.py +101 -0
- sequenzy/types/email_send_event_delivery_policy.py +5 -0
- sequenzy/types/email_send_event_email_type.py +5 -0
- sequenzy/types/email_send_internal_failure_code.py +7 -0
- sequenzy/types/email_send_status.py +10 -0
- sequenzy/types/email_send_subscriber.py +28 -0
- sequenzy/types/email_send_suppression_reason.py +5 -0
- sequenzy/types/email_send_type.py +5 -0
- sequenzy/types/email_theme_patch.py +40 -0
- sequenzy/types/email_theme_patch_button_style.py +5 -0
- sequenzy/types/email_theme_patch_colors.py +33 -0
- sequenzy/types/email_theme_patch_layout.py +52 -0
- sequenzy/types/email_theme_patch_preset_id.py +5 -0
- sequenzy/types/email_theme_patch_typography.py +55 -0
- sequenzy/types/engagement_stats.py +143 -0
- sequenzy/types/engagement_stats_rate_denominator_basis.py +5 -0
- sequenzy/types/error.py +30 -0
- sequenzy/types/event_schema.py +71 -0
- sequenzy/types/event_schema_documented_providers_item.py +7 -0
- sequenzy/types/event_schema_providers_item.py +33 -0
- sequenzy/types/event_schema_providers_item_properties_item.py +43 -0
- sequenzy/types/event_schema_providers_item_provider.py +7 -0
- sequenzy/types/filter_group.py +39 -0
- sequenzy/types/filter_group_children_item.py +54 -0
- sequenzy/types/filter_group_join_operator.py +5 -0
- sequenzy/types/filter_group_kind.py +5 -0
- sequenzy/types/filter_leaf.py +41 -0
- sequenzy/types/filter_leaf_field.py +33 -0
- sequenzy/types/filter_leaf_kind.py +5 -0
- sequenzy/types/filter_leaf_operator.py +25 -0
- sequenzy/types/integration_activity_entry.py +86 -0
- sequenzy/types/integration_activity_entry_status.py +7 -0
- sequenzy/types/integration_detail.py +74 -0
- sequenzy/types/integration_detail_activity.py +42 -0
- sequenzy/types/integration_detail_activity_recent_failures_item.py +30 -0
- sequenzy/types/integration_detail_ingestion.py +88 -0
- sequenzy/types/integration_detail_ingestion_list_targeting.py +7 -0
- sequenzy/types/integration_detail_ingestion_lists_item.py +20 -0
- sequenzy/types/integration_detail_integration.py +91 -0
- sequenzy/types/integration_detail_integration_category.py +7 -0
- sequenzy/types/integration_detail_pixel.py +40 -0
- sequenzy/types/integration_detail_recommendations_item.py +23 -0
- sequenzy/types/integration_detail_recommendations_item_severity.py +5 -0
- sequenzy/types/integration_event_wiring.py +81 -0
- sequenzy/types/integration_event_wiring_listeners_item.py +37 -0
- sequenzy/types/integration_event_wiring_rule_source.py +5 -0
- sequenzy/types/integration_event_wiring_rules_item.py +27 -0
- sequenzy/types/integration_pixel_state.py +47 -0
- sequenzy/types/integration_pixel_state_pixel.py +68 -0
- sequenzy/types/integration_provider_capability.py +78 -0
- sequenzy/types/integration_provider_capability_actions_item.py +10 -0
- sequenzy/types/integration_provider_capability_availability.py +5 -0
- sequenzy/types/integration_provider_capability_category.py +7 -0
- sequenzy/types/integration_provider_capability_connect_fields_item.py +26 -0
- sequenzy/types/integration_provider_capability_connect_fields_item_key.py +7 -0
- sequenzy/types/integration_provider_capability_connect_method.py +7 -0
- sequenzy/types/integration_provider_capability_emits_item.py +27 -0
- sequenzy/types/integration_provider_capability_writes_attributes_item.py +20 -0
- sequenzy/types/integration_summary.py +91 -0
- sequenzy/types/integration_summary_category.py +7 -0
- sequenzy/types/integration_sync_skip_summary.py +47 -0
- sequenzy/types/integration_sync_skip_summary_records_item.py +27 -0
- sequenzy/types/integration_sync_skip_summary_records_item_outcome.py +5 -0
- sequenzy/types/internal_server_error_body.py +20 -0
- sequenzy/types/landing_page_content.py +41 -0
- sequenzy/types/landing_page_content_seo.py +50 -0
- sequenzy/types/landing_page_content_theme.py +46 -0
- sequenzy/types/landing_page_content_theme_section_animation.py +7 -0
- sequenzy/types/landing_page_content_theme_section_animation_speed.py +5 -0
- sequenzy/types/landing_page_domain.py +125 -0
- sequenzy/types/landing_page_domain_dns_record_type.py +5 -0
- sequenzy/types/landing_page_domain_domain_scope.py +5 -0
- sequenzy/types/landing_page_summary.py +94 -0
- sequenzy/types/landing_page_summary_custom_domain_scope.py +5 -0
- sequenzy/types/landing_page_summary_status.py +5 -0
- sequenzy/types/not_found_error_body.py +21 -0
- sequenzy/types/not_found_error_body_error.py +20 -0
- sequenzy/types/notification_preference.py +29 -0
- sequenzy/types/notification_preference_event.py +7 -0
- sequenzy/types/notification_preference_mode.py +5 -0
- sequenzy/types/notification_preferences.py +47 -0
- sequenzy/types/outbound_webhook_delivery.py +56 -0
- sequenzy/types/outbound_webhook_delivery_attempt.py +40 -0
- sequenzy/types/outbound_webhook_delivery_attempt_status.py +5 -0
- sequenzy/types/outbound_webhook_delivery_status.py +7 -0
- sequenzy/types/outbound_webhook_endpoint.py +80 -0
- sequenzy/types/outbound_webhook_endpoint_signing_secrets_item.py +26 -0
- sequenzy/types/outbound_webhook_endpoint_status.py +5 -0
- sequenzy/types/outbound_webhook_event_type.py +34 -0
- sequenzy/types/pagination.py +26 -0
- sequenzy/types/poll_response.py +85 -0
- sequenzy/types/poll_response_variant.py +5 -0
- sequenzy/types/poll_results_summary.py +84 -0
- sequenzy/types/poll_results_summary_answers_item.py +33 -0
- sequenzy/types/poll_results_summary_nps.py +30 -0
- sequenzy/types/poll_results_summary_variant.py +5 -0
- sequenzy/types/product.py +60 -0
- sequenzy/types/product_digital_delivery.py +40 -0
- sequenzy/types/product_digital_delivery_source.py +5 -0
- sequenzy/types/product_provider.py +5 -0
- sequenzy/types/recommendation_metrics.py +83 -0
- sequenzy/types/recommendation_metrics_revenue_by_currency_item.py +33 -0
- sequenzy/types/recommendation_metrics_top_products_item.py +35 -0
- sequenzy/types/render_email_request.py +65 -0
- sequenzy/types/render_email_request_subscriber.py +40 -0
- sequenzy/types/render_email_response.py +86 -0
- sequenzy/types/render_email_response_entity.py +26 -0
- sequenzy/types/render_email_response_entity_type.py +5 -0
- sequenzy/types/render_email_response_unevaluated_conditions_item.py +41 -0
- sequenzy/types/render_email_response_unevaluated_conditions_item_reason.py +7 -0
- sequenzy/types/render_email_response_unresolved_merge_tags_item.py +28 -0
- sequenzy/types/render_email_response_unresolved_merge_tags_item_reason.py +5 -0
- sequenzy/types/reply_profile_summary.py +30 -0
- sequenzy/types/resolved_audience_entity.py +28 -0
- sequenzy/types/resolved_audience_rule.py +24 -0
- sequenzy/types/resolved_audience_rule_type.py +5 -0
- sequenzy/types/resolved_campaign_audience.py +67 -0
- sequenzy/types/resolved_campaign_audience_filter_join_operator.py +5 -0
- sequenzy/types/resolved_campaign_audience_type.py +7 -0
- sequenzy/types/saved_popup.py +81 -0
- sequenzy/types/saved_popup_embed.py +36 -0
- sequenzy/types/saved_popup_frequency.py +30 -0
- sequenzy/types/saved_popup_schedule.py +37 -0
- sequenzy/types/saved_popup_stats.py +58 -0
- sequenzy/types/saved_popup_status.py +5 -0
- sequenzy/types/saved_popup_targeting.py +31 -0
- sequenzy/types/saved_popup_targeting_device.py +5 -0
- sequenzy/types/saved_popup_trigger.py +56 -0
- sequenzy/types/saved_popup_trigger_type.py +5 -0
- sequenzy/types/saved_popup_visual.py +37 -0
- sequenzy/types/saved_popup_visual_placement.py +5 -0
- sequenzy/types/saved_popup_visual_style.py +7 -0
- sequenzy/types/segment.py +53 -0
- sequenzy/types/segment_filter_join_operator.py +5 -0
- sequenzy/types/segment_format.py +5 -0
- sequenzy/types/sender_health_metric.py +37 -0
- sequenzy/types/sender_health_threshold_bound.py +24 -0
- sequenzy/types/sender_profile_summary.py +55 -0
- sequenzy/types/sending_status.py +85 -0
- sequenzy/types/sending_status_metrics_window.py +42 -0
- sequenzy/types/sending_status_metrics_window_kind.py +5 -0
- sequenzy/types/sending_status_pause_reason_kind.py +10 -0
- sequenzy/types/sending_status_remediation.py +37 -0
- sequenzy/types/sending_status_self_resume.py +78 -0
- sequenzy/types/sending_status_self_resume_ai_review_status.py +7 -0
- sequenzy/types/sending_status_self_resume_unavailable_reason.py +8 -0
- sequenzy/types/sending_status_sender_health.py +71 -0
- sequenzy/types/sending_status_sender_health_enforcement_mode.py +5 -0
- sequenzy/types/sending_status_status.py +5 -0
- sequenzy/types/sequence_ab_test_step_summary.py +53 -0
- sequenzy/types/sequence_ab_test_step_summary_test_type.py +5 -0
- sequenzy/types/sequence_ab_test_step_variant.py +54 -0
- sequenzy/types/sequence_action_response.py +79 -0
- sequenzy/types/sequence_branch_condition_input.py +155 -0
- sequenzy/types/sequence_branch_condition_input_activity_scope.py +7 -0
- sequenzy/types/sequence_branch_condition_input_condition_type.py +21 -0
- sequenzy/types/sequence_branch_input.py +102 -0
- sequenzy/types/sequence_branch_input_split_mode.py +5 -0
- sequenzy/types/sequence_branch_path_step_input.py +210 -0
- sequenzy/types/sequence_branch_path_step_input_ineligible_action.py +5 -0
- sequenzy/types/sequence_branch_path_step_input_node_type.py +22 -0
- sequenzy/types/sequence_branch_path_step_input_type.py +10 -0
- sequenzy/types/sequence_create_response.py +51 -0
- sequenzy/types/sequence_create_response_event_tracking.py +72 -0
- sequenzy/types/sequence_create_response_event_tracking_integration_guide.py +20 -0
- sequenzy/types/sequence_create_response_event_tracking_payload_contract.py +42 -0
- sequenzy/types/sequence_create_response_sequence.py +107 -0
- sequenzy/types/sequence_delay_input.py +134 -0
- sequenzy/types/sequence_delay_input_direction.py +5 -0
- sequenzy/types/sequence_delay_input_missing_action.py +5 -0
- sequenzy/types/sequence_delay_input_mode.py +5 -0
- sequenzy/types/sequence_delay_input_until_missing_action.py +5 -0
- sequenzy/types/sequence_delay_input_until_offset_direction.py +5 -0
- sequenzy/types/sequence_delay_offset_input.py +25 -0
- sequenzy/types/sequence_details.py +91 -0
- sequenzy/types/sequence_details_enrichment_status.py +5 -0
- sequenzy/types/sequence_discount_input.py +173 -0
- sequenzy/types/sequence_discount_input_discount_type.py +5 -0
- sequenzy/types/sequence_discount_input_duration.py +5 -0
- sequenzy/types/sequence_discount_input_provider.py +5 -0
- sequenzy/types/sequence_effective_status.py +7 -0
- sequenzy/types/sequence_email.py +206 -0
- sequenzy/types/sequence_email_delay_mode.py +5 -0
- sequenzy/types/sequence_email_email_preset.py +5 -0
- sequenzy/types/sequence_email_node_type.py +5 -0
- sequenzy/types/sequence_email_update_input.py +203 -0
- sequenzy/types/sequence_email_update_input_email_preset.py +5 -0
- sequenzy/types/sequence_enrollment_cancel_response.py +70 -0
- sequenzy/types/sequence_enrollment_cancel_response_enrollments_item.py +33 -0
- sequenzy/types/sequence_enrollment_counts.py +50 -0
- sequenzy/types/sequence_enrollment_counts_by_current_node_item.py +77 -0
- sequenzy/types/sequence_enrollment_list_response.py +61 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item.py +203 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item_entered_via.py +44 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item_entered_via_kind.py +8 -0
- sequenzy/types/sequence_enrollment_list_response_enrollments_item_status.py +7 -0
- sequenzy/types/sequence_enrollment_list_response_pagination.py +27 -0
- sequenzy/types/sequence_enrollment_mode.py +5 -0
- sequenzy/types/sequence_enrollment_move_response.py +133 -0
- sequenzy/types/sequence_enrollment_move_response_enqueue_errors_item.py +24 -0
- sequenzy/types/sequence_enrollment_move_response_enrollments_item.py +33 -0
- sequenzy/types/sequence_enrollment_realign_job_response.py +36 -0
- sequenzy/types/sequence_enrollment_realign_job_response_status.py +7 -0
- sequenzy/types/sequence_enrollment_realign_queued_response.py +30 -0
- sequenzy/types/sequence_enrollment_realign_queued_response_status.py +5 -0
- sequenzy/types/sequence_enrollment_realign_response.py +125 -0
- sequenzy/types/sequence_enrollment_realign_response_changes_item.py +42 -0
- sequenzy/types/sequence_goal.py +69 -0
- sequenzy/types/sequence_goal_attribute_condition.py +5 -0
- sequenzy/types/sequence_goal_input.py +65 -0
- sequenzy/types/sequence_goal_input_attribute_condition.py +7 -0
- sequenzy/types/sequence_goal_input_trigger_type.py +5 -0
- sequenzy/types/sequence_goal_trigger_type.py +5 -0
- sequenzy/types/sequence_graph_edge_input.py +42 -0
- sequenzy/types/sequence_graph_edit_input.py +76 -0
- sequenzy/types/sequence_graph_edit_input_action.py +7 -0
- sequenzy/types/sequence_inbound_webhook.py +50 -0
- sequenzy/types/sequence_inbound_webhook_field_mapping.py +32 -0
- sequenzy/types/sequence_inbound_webhook_status.py +5 -0
- sequenzy/types/sequence_linear_step_insertion_input.py +42 -0
- sequenzy/types/sequence_node.py +64 -0
- sequenzy/types/sequence_node_update_hints.py +45 -0
- sequenzy/types/sequence_node_update_input.py +47 -0
- sequenzy/types/sequence_node_update_input_changes.py +49 -0
- sequenzy/types/sequence_node_update_input_changes_email_preset.py +5 -0
- sequenzy/types/sequence_path_step_config.py +329 -0
- sequenzy/types/sequence_path_step_config_activity_scope.py +7 -0
- sequenzy/types/sequence_path_step_config_condition_type.py +21 -0
- sequenzy/types/sequence_path_step_config_method.py +5 -0
- sequenzy/types/sequence_path_step_config_on_error.py +5 -0
- sequenzy/types/sequence_path_step_config_output_fields_item.py +46 -0
- sequenzy/types/sequence_path_step_config_timeout_action.py +5 -0
- sequenzy/types/sequence_position.py +20 -0
- sequenzy/types/sequence_sending_window.py +56 -0
- sequenzy/types/sequence_sending_window_days_item.py +7 -0
- sequenzy/types/sequence_sms_step_update_input.py +64 -0
- sequenzy/types/sequence_sms_step_update_input_ineligible_action.py +5 -0
- sequenzy/types/sequence_status.py +5 -0
- sequenzy/types/sequence_step_input.py +388 -0
- sequenzy/types/sequence_step_input_discount_type.py +5 -0
- sequenzy/types/sequence_step_input_duration.py +5 -0
- sequenzy/types/sequence_step_input_ineligible_action.py +5 -0
- sequenzy/types/sequence_step_input_node_type.py +7 -0
- sequenzy/types/sequence_step_input_provider.py +5 -0
- sequenzy/types/sequence_step_input_type.py +7 -0
- sequenzy/types/sequence_stop_condition.py +43 -0
- sequenzy/types/sequence_stop_condition_match_config.py +110 -0
- sequenzy/types/sequence_stop_condition_match_config_entry_audience.py +25 -0
- sequenzy/types/sequence_stop_condition_match_config_entry_audience_audience.py +5 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property.py +22 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_filter.py +34 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_filter_property_filters_item.py +31 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_filter_property_filters_item_operator.py +8 -0
- sequenzy/types/sequence_stop_condition_match_config_event_property_rules_item.py +26 -0
- sequenzy/types/sequence_stop_condition_match_config_field_value.py +23 -0
- sequenzy/types/sequence_stop_condition_match_config_field_value_operator.py +7 -0
- sequenzy/types/sequence_stop_condition_type.py +17 -0
- sequenzy/types/sequence_subscriber_update_step_update_input.py +30 -0
- sequenzy/types/sequence_summary.py +151 -0
- sequenzy/types/sequence_summary_paused_by_user.py +21 -0
- sequenzy/types/sequence_trigger_property_filter.py +34 -0
- sequenzy/types/sequence_trigger_property_filter_operator.py +8 -0
- sequenzy/types/sequence_trigger_property_filter_value.py +9 -0
- sequenzy/types/sequence_trigger_property_filter_value_three_item.py +5 -0
- sequenzy/types/sequence_trigger_type.py +10 -0
- sequenzy/types/sequence_wait_until_input.py +93 -0
- sequenzy/types/sequence_wait_until_input_direction.py +5 -0
- sequenzy/types/sequence_wait_until_input_missing_action.py +5 -0
- sequenzy/types/sequence_wait_until_input_until_missing_action.py +5 -0
- sequenzy/types/sequence_wait_until_input_until_offset_direction.py +5 -0
- sequenzy/types/sequence_wait_until_weekday_input.py +86 -0
- sequenzy/types/service_unavailable_error_body.py +26 -0
- sequenzy/types/shopify_browse_abandonment_settings.py +48 -0
- sequenzy/types/shopify_cart_abandonment_settings.py +60 -0
- sequenzy/types/shopify_price_drop_settings.py +59 -0
- sequenzy/types/subscriber.py +91 -0
- sequenzy/types/subscriber_activity_event.py +108 -0
- sequenzy/types/subscriber_activity_event_engagement_quality.py +5 -0
- sequenzy/types/subscriber_email_stats.py +25 -0
- sequenzy/types/subscriber_import.py +96 -0
- sequenzy/types/subscriber_import_record.py +69 -0
- sequenzy/types/subscriber_import_record_custom_attributes_value.py +11 -0
- sequenzy/types/subscriber_import_record_custom_attributes_value_three_item.py +5 -0
- sequenzy/types/subscriber_import_record_status.py +5 -0
- sequenzy/types/subscriber_import_status.py +5 -0
- sequenzy/types/subscriber_list.py +62 -0
- sequenzy/types/subscriber_list_membership.py +42 -0
- sequenzy/types/subscriber_list_pagination.py +54 -0
- sequenzy/types/subscriber_note.py +40 -0
- sequenzy/types/subscriber_note_author.py +21 -0
- sequenzy/types/subscriber_sequence_enrollment.py +54 -0
- sequenzy/types/subscriber_sms_status.py +7 -0
- sequenzy/types/subscriber_status.py +5 -0
- sequenzy/types/subscriber_update_config.py +39 -0
- sequenzy/types/subscriber_update_config_custom_attribute_updates_item.py +37 -0
- sequenzy/types/subscriber_update_config_custom_attribute_updates_item_value.py +5 -0
- sequenzy/types/subscriber_update_config_custom_attribute_updates_item_value_type.py +7 -0
- sequenzy/types/subscriber_update_config_status.py +5 -0
- sequenzy/types/sync_rule.py +36 -0
- sequenzy/types/sync_rule_actions.py +26 -0
- sequenzy/types/sync_rule_conditions.py +56 -0
- sequenzy/types/sync_rule_conditions_purchased_product.py +32 -0
- sequenzy/types/tag_definition.py +26 -0
- sequenzy/types/team_member.py +53 -0
- sequenzy/types/team_member_invited_by.py +21 -0
- sequenzy/types/team_member_kind.py +5 -0
- sequenzy/types/team_member_role.py +5 -0
- sequenzy/types/team_member_status.py +5 -0
- sequenzy/types/team_member_user.py +22 -0
- sequenzy/types/template_detail.py +52 -0
- sequenzy/types/template_localization.py +51 -0
- sequenzy/types/template_localization_status.py +5 -0
- sequenzy/types/template_summary.py +43 -0
- sequenzy/types/too_many_requests_error_body.py +20 -0
- sequenzy/types/tracking_settings.py +50 -0
- sequenzy/types/tracking_settings_auto_utm.py +20 -0
- sequenzy/types/tracking_settings_consent.py +59 -0
- sequenzy/types/tracking_settings_reply_tracking.py +31 -0
- sequenzy/types/tracking_settings_tracking.py +48 -0
- sequenzy/types/tracking_settings_tracking_domain.py +37 -0
- sequenzy/types/transactional_email.py +34 -0
- sequenzy/types/transactional_email_details.py +40 -0
- sequenzy/types/transactional_email_list_item.py +28 -0
- sequenzy/types/transactional_email_list_item_stats.py +31 -0
- sequenzy/types/transactional_metrics_response.py +49 -0
- sequenzy/types/transactional_metrics_response_bounce_breakdown.py +25 -0
- sequenzy/types/transactional_metrics_response_bounce_breakdown_subtypes_item.py +28 -0
- sequenzy/types/transactional_metrics_response_bounce_breakdown_subtypes_item_type.py +7 -0
- sequenzy/types/transactional_metrics_response_clicked_links_item.py +21 -0
- sequenzy/types/transactional_metrics_response_complaints.py +20 -0
- sequenzy/types/transactional_metrics_response_engagement_breakdown.py +26 -0
- sequenzy/types/transactional_metrics_response_engagement_breakdown_human.py +20 -0
- sequenzy/types/transactional_metrics_response_engagement_breakdown_machine.py +20 -0
- sequenzy/types/transactional_metrics_response_stats.py +25 -0
- sequenzy/types/transactional_metrics_response_transactional.py +21 -0
- sequenzy/types/transactional_send_diagnostics.py +41 -0
- sequenzy/types/transactional_send_diagnostics_missing_required_variables_item.py +34 -0
- sequenzy/types/transactional_send_diagnostics_missing_required_variables_item_used_in_item.py +31 -0
- sequenzy/types/transactional_send_diagnostics_missing_required_variables_item_used_in_item_surface.py +7 -0
- sequenzy/types/transactional_send_diagnostics_status.py +5 -0
- sequenzy/types/transactional_send_diagnostics_unused_variables_item.py +21 -0
- sequenzy/types/unauthorized_error_body.py +21 -0
- sequenzy/types/unauthorized_error_body_error.py +20 -0
- sequenzy/types/unprocessable_entity_error_body.py +26 -0
- sequenzy/types/url_attachment.py +31 -0
- sequenzy/types/web_tracking_key.py +100 -0
- sequenzy/types/website.py +102 -0
- sequenzy/types/website_readiness.py +26 -0
- sequenzy/types/website_readiness_reason.py +10 -0
- sequenzy/types/website_readiness_status.py +7 -0
- sequenzy/types/website_status.py +7 -0
- sequenzy/web_tracking_keys/__init__.py +55 -0
- sequenzy/web_tracking_keys/client.py +554 -0
- sequenzy/web_tracking_keys/raw_client.py +1087 -0
- sequenzy/web_tracking_keys/types/__init__.py +53 -0
- sequenzy/web_tracking_keys/types/create_web_tracking_keys_response.py +22 -0
- sequenzy/web_tracking_keys/types/delete_web_tracking_keys_response.py +20 -0
- sequenzy/web_tracking_keys/types/get_web_tracking_keys_response.py +21 -0
- sequenzy/web_tracking_keys/types/list_web_tracking_keys_response.py +21 -0
- sequenzy/web_tracking_keys/types/mint_identity_web_tracking_keys_response.py +47 -0
- sequenzy/web_tracking_keys/types/update_web_tracking_keys_response.py +21 -0
- sequenzy/webhooks/__init__.py +70 -0
- sequenzy/webhooks/client.py +834 -0
- sequenzy/webhooks/raw_client.py +1602 -0
- sequenzy/webhooks/types/__init__.py +68 -0
- sequenzy/webhooks/types/add_signing_secret_webhooks_response.py +21 -0
- sequenzy/webhooks/types/create_webhooks_response.py +21 -0
- sequenzy/webhooks/types/delete_webhooks_response.py +21 -0
- sequenzy/webhooks/types/list_deliveries_webhooks_response.py +21 -0
- sequenzy/webhooks/types/list_delivery_attempts_webhooks_response.py +21 -0
- sequenzy/webhooks/types/list_webhooks_response.py +21 -0
- sequenzy/webhooks/types/remove_signing_secret_webhooks_response.py +21 -0
- sequenzy/webhooks/types/replay_delivery_webhooks_response.py +21 -0
- sequenzy/webhooks/types/test_webhooks_response.py +29 -0
- sequenzy/webhooks/types/update_webhooks_request_status.py +5 -0
- sequenzy/webhooks/types/update_webhooks_response.py +21 -0
- sequenzy/websites/__init__.py +39 -0
- sequenzy/websites/client.py +320 -0
- sequenzy/websites/raw_client.py +696 -0
- sequenzy/websites/types/__init__.py +42 -0
- sequenzy/websites/types/add_websites_response.py +21 -0
- sequenzy/websites/types/get_websites_response.py +21 -0
- sequenzy/websites/types/list_websites_response.py +21 -0
- sequenzy/websites/types/verify_sending_domain_response.py +42 -0
- sequenzy/widgets/__init__.py +133 -0
- sequenzy/widgets/client.py +2327 -0
- sequenzy/widgets/preferences/__init__.py +34 -0
- sequenzy/widgets/preferences/client.py +123 -0
- sequenzy/widgets/preferences/raw_client.py +224 -0
- sequenzy/widgets/preferences/types/__init__.py +34 -0
- sequenzy/widgets/preferences/types/generate_token_preferences_response.py +23 -0
- sequenzy/widgets/raw_client.py +3966 -0
- sequenzy/widgets/types/__init__.py +127 -0
- sequenzy/widgets/types/create_saved_form_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/create_saved_form_response.py +21 -0
- sequenzy/widgets/types/create_saved_popup_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/create_saved_popup_request_placement.py +5 -0
- sequenzy/widgets/types/create_saved_popup_request_presentation.py +7 -0
- sequenzy/widgets/types/create_saved_popup_request_status.py +5 -0
- sequenzy/widgets/types/create_saved_popup_request_template.py +21 -0
- sequenzy/widgets/types/create_saved_popup_response.py +24 -0
- sequenzy/widgets/types/delete_saved_popup_response.py +25 -0
- sequenzy/widgets/types/duplicate_saved_popup_response.py +22 -0
- sequenzy/widgets/types/get_saved_form_embed_response.py +22 -0
- sequenzy/widgets/types/get_saved_form_embed_response_embed.py +36 -0
- sequenzy/widgets/types/get_saved_popup_embed_response.py +23 -0
- sequenzy/widgets/types/get_saved_popup_response.py +23 -0
- sequenzy/widgets/types/list_saved_forms_response.py +24 -0
- sequenzy/widgets/types/list_saved_forms_response_forms_item.py +27 -0
- sequenzy/widgets/types/list_saved_popups_request_include_content.py +5 -0
- sequenzy/widgets/types/list_saved_popups_response.py +30 -0
- sequenzy/widgets/types/submit_company_scoped_saved_signup_form_request_duplicate_strategy.py +7 -0
- sequenzy/widgets/types/submit_company_scoped_saved_signup_form_response.py +19 -0
- sequenzy/widgets/types/submit_saved_popup_response.py +32 -0
- sequenzy/widgets/types/submit_signup_form_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/submit_signup_form_response.py +19 -0
- sequenzy/widgets/types/update_saved_form_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/update_saved_form_response.py +26 -0
- sequenzy/widgets/types/update_saved_popup_request_duplicate_strategy.py +5 -0
- sequenzy/widgets/types/update_saved_popup_request_placement.py +5 -0
- sequenzy/widgets/types/update_saved_popup_request_presentation.py +7 -0
- sequenzy/widgets/types/update_saved_popup_request_status.py +5 -0
- sequenzy/widgets/types/update_saved_popup_response.py +24 -0
- sequenzy-2.0.0.dist-info/METADATA +204 -0
- sequenzy-2.0.0.dist-info/RECORD +1149 -0
- sequenzy-2.0.0.dist-info/WHEEL +4 -0
- sequenzy-2.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
+
|
|
3
|
+
from typing import Dict, Generic, TypeVar
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
|
|
7
|
+
# Generic to represent the underlying type of the data wrapped by the HTTP response.
|
|
8
|
+
T = TypeVar("T")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class BaseHttpResponse:
|
|
12
|
+
"""Minimalist HTTP response wrapper that exposes response headers and status code."""
|
|
13
|
+
|
|
14
|
+
_response: httpx.Response
|
|
15
|
+
|
|
16
|
+
def __init__(self, response: httpx.Response):
|
|
17
|
+
self._response = response
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def headers(self) -> Dict[str, str]:
|
|
21
|
+
return dict(self._response.headers)
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def status_code(self) -> int:
|
|
25
|
+
return self._response.status_code
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def response(self) -> httpx.Response:
|
|
29
|
+
return self._response
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class HttpResponse(Generic[T], BaseHttpResponse):
|
|
33
|
+
"""HTTP response wrapper that exposes response headers and data."""
|
|
34
|
+
|
|
35
|
+
_data: T
|
|
36
|
+
|
|
37
|
+
def __init__(self, response: httpx.Response, data: T):
|
|
38
|
+
super().__init__(response)
|
|
39
|
+
self._data = data
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def data(self) -> T:
|
|
43
|
+
return self._data
|
|
44
|
+
|
|
45
|
+
def close(self) -> None:
|
|
46
|
+
self._response.close()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class AsyncHttpResponse(Generic[T], BaseHttpResponse):
|
|
50
|
+
"""HTTP response wrapper that exposes response headers and data."""
|
|
51
|
+
|
|
52
|
+
_data: T
|
|
53
|
+
|
|
54
|
+
def __init__(self, response: httpx.Response, data: T):
|
|
55
|
+
super().__init__(response)
|
|
56
|
+
self._data = data
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def data(self) -> T:
|
|
60
|
+
return self._data
|
|
61
|
+
|
|
62
|
+
async def close(self) -> None:
|
|
63
|
+
await self._response.aclose()
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
+
|
|
3
|
+
# isort: skip_file
|
|
4
|
+
|
|
5
|
+
import typing
|
|
6
|
+
from importlib import import_module
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from ._api import EventSource, aconnect_sse, connect_sse
|
|
10
|
+
from ._exceptions import SSEError
|
|
11
|
+
from ._models import ServerSentEvent
|
|
12
|
+
_dynamic_imports: typing.Dict[str, str] = {
|
|
13
|
+
"EventSource": "._api",
|
|
14
|
+
"SSEError": "._exceptions",
|
|
15
|
+
"ServerSentEvent": "._models",
|
|
16
|
+
"aconnect_sse": "._api",
|
|
17
|
+
"connect_sse": "._api",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def __getattr__(attr_name: str) -> typing.Any:
|
|
22
|
+
module_name = _dynamic_imports.get(attr_name)
|
|
23
|
+
if module_name is None:
|
|
24
|
+
raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}")
|
|
25
|
+
try:
|
|
26
|
+
module = import_module(module_name, __package__)
|
|
27
|
+
if module_name == f".{attr_name}":
|
|
28
|
+
return module
|
|
29
|
+
else:
|
|
30
|
+
return getattr(module, attr_name)
|
|
31
|
+
except ImportError as e:
|
|
32
|
+
raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e
|
|
33
|
+
except AttributeError as e:
|
|
34
|
+
raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def __dir__():
|
|
38
|
+
lazy_attrs = list(_dynamic_imports.keys())
|
|
39
|
+
return sorted(lazy_attrs)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
__all__ = ["EventSource", "SSEError", "ServerSentEvent", "aconnect_sse", "connect_sse"]
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
+
|
|
3
|
+
import codecs
|
|
4
|
+
import re
|
|
5
|
+
import time
|
|
6
|
+
from contextlib import asynccontextmanager, contextmanager
|
|
7
|
+
from typing import (
|
|
8
|
+
Any,
|
|
9
|
+
AsyncContextManager,
|
|
10
|
+
AsyncGenerator,
|
|
11
|
+
AsyncIterator,
|
|
12
|
+
Callable,
|
|
13
|
+
ContextManager,
|
|
14
|
+
Iterator,
|
|
15
|
+
Optional,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
import anyio
|
|
19
|
+
import httpx
|
|
20
|
+
from ._decoders import SSEDecoder
|
|
21
|
+
from ._exceptions import SSEError
|
|
22
|
+
from ._models import ServerSentEvent
|
|
23
|
+
|
|
24
|
+
MAX_LINE_SIZE: int = 1_048_576 # 1 MiB
|
|
25
|
+
|
|
26
|
+
# Reconnection defaults, mirroring the TypeScript SDK's Stream implementation.
|
|
27
|
+
DEFAULT_MAX_RECONNECTION_ATTEMPTS: int = 5
|
|
28
|
+
DEFAULT_RECONNECT_DELAY_MS: int = 1_000
|
|
29
|
+
MAX_RECONNECT_DELAY_MS: int = 30_000
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# A reconnect callback re-issues the original request (with a ``Last-Event-ID``
|
|
33
|
+
# header set to the supplied event id) and returns a *context manager* yielding
|
|
34
|
+
# a fresh streaming ``httpx.Response``. Sync clients supply a sync context
|
|
35
|
+
# manager; async clients supply an async one.
|
|
36
|
+
class EventSource:
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
response: httpx.Response,
|
|
40
|
+
*,
|
|
41
|
+
resumable: bool = False,
|
|
42
|
+
stream_reconnection_enabled: bool = True,
|
|
43
|
+
max_stream_reconnection_attempts: Optional[int] = None,
|
|
44
|
+
stream_terminator: Optional[str] = None,
|
|
45
|
+
reconnect: Optional[Callable[[str], Any]] = None,
|
|
46
|
+
) -> None:
|
|
47
|
+
self._response = response
|
|
48
|
+
self._resumable = resumable
|
|
49
|
+
self._stream_reconnection_enabled = stream_reconnection_enabled
|
|
50
|
+
self._max_stream_reconnection_attempts = max_stream_reconnection_attempts
|
|
51
|
+
self._stream_terminator = stream_terminator
|
|
52
|
+
self._reconnect = reconnect
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def _is_event_stream(response: httpx.Response) -> bool:
|
|
56
|
+
content_type = response.headers.get("content-type", "").partition(";")[0]
|
|
57
|
+
return "text/event-stream" in content_type
|
|
58
|
+
|
|
59
|
+
def _check_content_type(self) -> None:
|
|
60
|
+
if not self._is_event_stream(self._response):
|
|
61
|
+
content_type = self._response.headers.get("content-type", "").partition(";")[0]
|
|
62
|
+
raise SSEError(
|
|
63
|
+
f"Expected response header Content-Type to contain 'text/event-stream', got {content_type!r}"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def _is_reconnect_response_usable(self, response: httpx.Response) -> bool:
|
|
67
|
+
"""Whether a reconnected response can be resumed as an SSE stream.
|
|
68
|
+
|
|
69
|
+
``httpx.stream`` does not raise on non-success status, so a resume that
|
|
70
|
+
returns an error page (e.g. ``200 text/html`` or a ``500`` body) would
|
|
71
|
+
otherwise be parsed as SSE and yield garbage/zero events. Such a
|
|
72
|
+
response is treated as a failed attempt (back off and retry) instead.
|
|
73
|
+
"""
|
|
74
|
+
return response.status_code < 400 and self._is_event_stream(response)
|
|
75
|
+
|
|
76
|
+
def _get_charset(self, response: Optional[httpx.Response] = None) -> str:
|
|
77
|
+
"""Extract charset from Content-Type header, fallback to UTF-8."""
|
|
78
|
+
resolved = response if response is not None else self._response
|
|
79
|
+
content_type = resolved.headers.get("content-type", "")
|
|
80
|
+
|
|
81
|
+
# Parse charset parameter using regex
|
|
82
|
+
charset_match = re.search(r"charset=([^;\s]+)", content_type, re.IGNORECASE)
|
|
83
|
+
if charset_match:
|
|
84
|
+
charset = charset_match.group(1).strip("\"'")
|
|
85
|
+
# Validate that it's a known encoding
|
|
86
|
+
try:
|
|
87
|
+
# Test if the charset is valid by trying to encode/decode
|
|
88
|
+
"test".encode(charset).decode(charset)
|
|
89
|
+
return charset
|
|
90
|
+
except (LookupError, UnicodeError):
|
|
91
|
+
# If charset is invalid, fall back to UTF-8
|
|
92
|
+
pass
|
|
93
|
+
|
|
94
|
+
# Default to UTF-8 if no charset specified or invalid charset
|
|
95
|
+
return "utf-8"
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def response(self) -> httpx.Response:
|
|
99
|
+
return self._response
|
|
100
|
+
|
|
101
|
+
@staticmethod
|
|
102
|
+
def _normalize_sse_line_endings(buf: str) -> str:
|
|
103
|
+
"""Normalize line endings per the SSE spec (\\r\\n → \\n, bare \\r → \\n).
|
|
104
|
+
|
|
105
|
+
A trailing \\r is preserved because it may pair with a leading \\n in
|
|
106
|
+
the next chunk to form a single \\r\\n terminator.
|
|
107
|
+
"""
|
|
108
|
+
buf = buf.replace("\r\n", "\n")
|
|
109
|
+
if buf.endswith("\r"):
|
|
110
|
+
return buf[:-1].replace("\r", "\n") + "\r"
|
|
111
|
+
return buf.replace("\r", "\n")
|
|
112
|
+
|
|
113
|
+
def _new_text_decoder(self, response: Optional[httpx.Response] = None) -> "codecs.IncrementalDecoder":
|
|
114
|
+
return codecs.getincrementaldecoder(self._get_charset(response))(errors="replace")
|
|
115
|
+
|
|
116
|
+
def _reconnect_applicable(self) -> bool:
|
|
117
|
+
"""Whether reconnection is configured for this stream at all.
|
|
118
|
+
|
|
119
|
+
This is the terminator-gating half of the reconnect decision, kept
|
|
120
|
+
separate from :meth:`_should_reconnect` (which additionally requires a
|
|
121
|
+
last *dispatched* id and an unexhausted attempt budget). The split lets
|
|
122
|
+
a mid-stream transport error terminate consistently:
|
|
123
|
+
- a stream that can never reconnect (non-resumable, no terminator,
|
|
124
|
+
disabled, or no callback) must re-raise the error to the caller, so a
|
|
125
|
+
truncated stream is not mistaken for a clean completion;
|
|
126
|
+
- a resumable stream that has merely run out of attempts (or has no id
|
|
127
|
+
to resume from) ends cleanly — the same way an exhausted empty/error
|
|
128
|
+
-body resume already does, matching the TypeScript ``return``.
|
|
129
|
+
"""
|
|
130
|
+
return (
|
|
131
|
+
self._resumable
|
|
132
|
+
and self._stream_terminator is not None
|
|
133
|
+
and self._stream_reconnection_enabled
|
|
134
|
+
and self._reconnect is not None
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
def _should_reconnect(self, last_dispatched_id: Optional[str], reconnect_attempts: int) -> bool:
|
|
138
|
+
"""Decide whether a prematurely-ended stream should be reconnected.
|
|
139
|
+
|
|
140
|
+
Mirrors the TypeScript ``shouldReconnect`` gating:
|
|
141
|
+
- only resumable SSE endpoints with a configured terminator, reconnect
|
|
142
|
+
enabled, and a reconnect callback are eligible (see
|
|
143
|
+
:meth:`_reconnect_applicable`);
|
|
144
|
+
- a last *dispatched* event id must exist to resume from;
|
|
145
|
+
- the consecutive-failed-attempt cap must not be exceeded.
|
|
146
|
+
"""
|
|
147
|
+
if not self._reconnect_applicable():
|
|
148
|
+
return False
|
|
149
|
+
if not last_dispatched_id:
|
|
150
|
+
return False
|
|
151
|
+
max_attempts = (
|
|
152
|
+
self._max_stream_reconnection_attempts
|
|
153
|
+
if self._max_stream_reconnection_attempts is not None
|
|
154
|
+
else DEFAULT_MAX_RECONNECTION_ATTEMPTS
|
|
155
|
+
)
|
|
156
|
+
if reconnect_attempts >= max_attempts:
|
|
157
|
+
return False
|
|
158
|
+
return True
|
|
159
|
+
|
|
160
|
+
def _reconnect_delay_seconds(self, last_retry: Optional[int]) -> float:
|
|
161
|
+
"""Backoff before a reconnect.
|
|
162
|
+
|
|
163
|
+
Uses the server's most recent ``retry:`` directive (milliseconds) when
|
|
164
|
+
present, otherwise a default of ``DEFAULT_RECONNECT_DELAY_MS``, clamped
|
|
165
|
+
to ``MAX_RECONNECT_DELAY_MS``.
|
|
166
|
+
"""
|
|
167
|
+
base_ms = last_retry if (last_retry is not None and last_retry > 0) else DEFAULT_RECONNECT_DELAY_MS
|
|
168
|
+
return min(base_ms, MAX_RECONNECT_DELAY_MS) / 1000.0
|
|
169
|
+
|
|
170
|
+
def _sleep_before_reconnect(self, last_retry: Optional[int]) -> None:
|
|
171
|
+
# ``time.sleep`` blocks the calling thread but remains interruptible by
|
|
172
|
+
# signals (e.g. ``KeyboardInterrupt``), which propagate out and abort
|
|
173
|
+
# the reconnect without issuing another request.
|
|
174
|
+
time.sleep(self._reconnect_delay_seconds(last_retry))
|
|
175
|
+
|
|
176
|
+
async def _asleep_before_reconnect(self, last_retry: Optional[int]) -> None:
|
|
177
|
+
# ``anyio.sleep`` is cancellation-aware: if the consumer cancels the task
|
|
178
|
+
# or closes the async generator mid-delay, this raises (and no further
|
|
179
|
+
# request is issued) instead of blocking for the whole interval.
|
|
180
|
+
await anyio.sleep(self._reconnect_delay_seconds(last_retry))
|
|
181
|
+
|
|
182
|
+
def _decode_response(
|
|
183
|
+
self,
|
|
184
|
+
response: httpx.Response,
|
|
185
|
+
decoder: SSEDecoder,
|
|
186
|
+
text_decoder: "codecs.IncrementalDecoder",
|
|
187
|
+
) -> Iterator[ServerSentEvent]:
|
|
188
|
+
buf = ""
|
|
189
|
+
for chunk in response.iter_bytes():
|
|
190
|
+
buf += text_decoder.decode(chunk)
|
|
191
|
+
buf = self._normalize_sse_line_endings(buf)
|
|
192
|
+
|
|
193
|
+
while "\n" in buf:
|
|
194
|
+
line, buf = buf.split("\n", 1)
|
|
195
|
+
sse = decoder.decode(line)
|
|
196
|
+
if sse is not None:
|
|
197
|
+
yield sse
|
|
198
|
+
|
|
199
|
+
if len(buf) > MAX_LINE_SIZE:
|
|
200
|
+
raise SSEError(
|
|
201
|
+
f"SSE line exceeded maximum size of {MAX_LINE_SIZE} characters without encountering a newline"
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
yield from self._flush_decoder(buf, decoder, text_decoder)
|
|
205
|
+
|
|
206
|
+
async def _adecode_response(
|
|
207
|
+
self,
|
|
208
|
+
response: httpx.Response,
|
|
209
|
+
decoder: SSEDecoder,
|
|
210
|
+
text_decoder: "codecs.IncrementalDecoder",
|
|
211
|
+
) -> AsyncGenerator[ServerSentEvent, None]:
|
|
212
|
+
buf = ""
|
|
213
|
+
async for chunk in response.aiter_bytes():
|
|
214
|
+
buf += text_decoder.decode(chunk)
|
|
215
|
+
buf = self._normalize_sse_line_endings(buf)
|
|
216
|
+
|
|
217
|
+
while "\n" in buf:
|
|
218
|
+
line, buf = buf.split("\n", 1)
|
|
219
|
+
sse = decoder.decode(line)
|
|
220
|
+
if sse is not None:
|
|
221
|
+
yield sse
|
|
222
|
+
|
|
223
|
+
if len(buf) > MAX_LINE_SIZE:
|
|
224
|
+
raise SSEError(
|
|
225
|
+
f"SSE line exceeded maximum size of {MAX_LINE_SIZE} characters without encountering a newline"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
for sse in self._flush_decoder(buf, decoder, text_decoder):
|
|
229
|
+
yield sse
|
|
230
|
+
|
|
231
|
+
def _flush_decoder(
|
|
232
|
+
self,
|
|
233
|
+
buf: str,
|
|
234
|
+
decoder: SSEDecoder,
|
|
235
|
+
text_decoder: "codecs.IncrementalDecoder",
|
|
236
|
+
) -> Iterator[ServerSentEvent]:
|
|
237
|
+
# Flush any remaining bytes from the incremental decoder
|
|
238
|
+
buf += text_decoder.decode(b"", final=True)
|
|
239
|
+
buf = buf.replace("\r\n", "\n").replace("\r", "\n")
|
|
240
|
+
|
|
241
|
+
if len(buf) > MAX_LINE_SIZE:
|
|
242
|
+
raise SSEError(
|
|
243
|
+
f"SSE line exceeded maximum size of {MAX_LINE_SIZE} characters without encountering a newline"
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
while "\n" in buf:
|
|
247
|
+
line, buf = buf.split("\n", 1)
|
|
248
|
+
sse = decoder.decode(line)
|
|
249
|
+
if sse is not None:
|
|
250
|
+
yield sse
|
|
251
|
+
|
|
252
|
+
if buf.strip():
|
|
253
|
+
sse = decoder.decode(buf)
|
|
254
|
+
if sse is not None:
|
|
255
|
+
yield sse
|
|
256
|
+
|
|
257
|
+
def iter_sse(self) -> Iterator[ServerSentEvent]:
|
|
258
|
+
self._check_content_type()
|
|
259
|
+
decoder = SSEDecoder()
|
|
260
|
+
text_decoder = self._new_text_decoder()
|
|
261
|
+
|
|
262
|
+
last_dispatched_id: Optional[str] = None
|
|
263
|
+
last_retry: Optional[int] = None
|
|
264
|
+
# Consecutive failed reconnection attempts. Reset to 0 whenever an event
|
|
265
|
+
# is successfully dispatched (reset-on-progress) — matching browser
|
|
266
|
+
# `EventSource` semantics: a server that emits >=1 event then drops on
|
|
267
|
+
# every connection can reconnect indefinitely.
|
|
268
|
+
reconnect_attempts = 0
|
|
269
|
+
|
|
270
|
+
# ``None`` means there is no live stream to read this iteration (e.g. a
|
|
271
|
+
# failed reconnect); the loop then re-evaluates the reconnect decision
|
|
272
|
+
# without re-reading an exhausted response.
|
|
273
|
+
response: Optional[httpx.Response] = self._response
|
|
274
|
+
# Context manager for a response we opened ourselves and must close.
|
|
275
|
+
# The initial response is owned by the caller, so it starts as None.
|
|
276
|
+
owned_cm: Optional[ContextManager[httpx.Response]] = None
|
|
277
|
+
try:
|
|
278
|
+
while True:
|
|
279
|
+
if response is not None:
|
|
280
|
+
events = self._decode_response(response, decoder, text_decoder)
|
|
281
|
+
while True:
|
|
282
|
+
try:
|
|
283
|
+
sse = next(events)
|
|
284
|
+
except StopIteration:
|
|
285
|
+
break
|
|
286
|
+
except SSEError:
|
|
287
|
+
# A protocol violation (e.g. an oversized line) is a
|
|
288
|
+
# genuine error, not a dropped connection; propagate it.
|
|
289
|
+
# Listed first because ``SSEError`` subclasses
|
|
290
|
+
# ``httpx.TransportError``.
|
|
291
|
+
raise
|
|
292
|
+
except httpx.TransportError:
|
|
293
|
+
# A transport error mid-stream (e.g. the server dropped
|
|
294
|
+
# the connection: ``ReadError``/``RemoteProtocolError``)
|
|
295
|
+
# is a premature end. Only swallow it when reconnection
|
|
296
|
+
# is configured for this stream; otherwise re-raise so a
|
|
297
|
+
# non-resumable stream still surfaces the error to the
|
|
298
|
+
# caller instead of looking like a clean completion.
|
|
299
|
+
# When reconnection is applicable but the attempt budget
|
|
300
|
+
# is exhausted, we ``break`` and end cleanly below — the
|
|
301
|
+
# same way an exhausted empty/error-body resume does, so
|
|
302
|
+
# give-up is consistent regardless of failure shape.
|
|
303
|
+
# ``next`` is used rather than ``for`` so this cannot
|
|
304
|
+
# swallow a ``GeneratorExit`` raised at a ``yield``.
|
|
305
|
+
if not self._reconnect_applicable():
|
|
306
|
+
raise
|
|
307
|
+
break
|
|
308
|
+
yield sse
|
|
309
|
+
if sse.id:
|
|
310
|
+
last_dispatched_id = sse.id
|
|
311
|
+
if sse.retry is not None:
|
|
312
|
+
last_retry = sse.retry
|
|
313
|
+
reconnect_attempts = 0
|
|
314
|
+
|
|
315
|
+
if not self._should_reconnect(last_dispatched_id, reconnect_attempts):
|
|
316
|
+
return
|
|
317
|
+
reconnect_attempts += 1
|
|
318
|
+
|
|
319
|
+
self._sleep_before_reconnect(last_retry)
|
|
320
|
+
|
|
321
|
+
# Close the previously-opened reconnect response before opening
|
|
322
|
+
# a new one so we never hold more than one extra connection.
|
|
323
|
+
if owned_cm is not None:
|
|
324
|
+
owned_cm.__exit__(None, None, None)
|
|
325
|
+
owned_cm = None
|
|
326
|
+
|
|
327
|
+
assert self._reconnect is not None # guaranteed by _should_reconnect
|
|
328
|
+
try:
|
|
329
|
+
cm: ContextManager[httpx.Response] = self._reconnect(last_dispatched_id or "")
|
|
330
|
+
new_response = cm.__enter__()
|
|
331
|
+
except Exception:
|
|
332
|
+
# A failed reconnect consumes an attempt; back off and retry.
|
|
333
|
+
response = None
|
|
334
|
+
continue
|
|
335
|
+
owned_cm = cm
|
|
336
|
+
if new_response is None or not self._is_reconnect_response_usable(new_response):
|
|
337
|
+
# Null/empty body or a non-SSE/error response (e.g. 204/304,
|
|
338
|
+
# a 500, or an HTML error page): treat as a failed attempt.
|
|
339
|
+
response = None
|
|
340
|
+
continue
|
|
341
|
+
|
|
342
|
+
response = new_response
|
|
343
|
+
# Drop any partial event left over from the dropped stream, but
|
|
344
|
+
# keep the last event id (per the SSE spec) and start a fresh
|
|
345
|
+
# incremental text decoder for the new connection.
|
|
346
|
+
decoder.reset_in_progress_event()
|
|
347
|
+
text_decoder = self._new_text_decoder(new_response)
|
|
348
|
+
finally:
|
|
349
|
+
if owned_cm is not None:
|
|
350
|
+
owned_cm.__exit__(None, None, None)
|
|
351
|
+
|
|
352
|
+
async def aiter_sse(self) -> AsyncGenerator[ServerSentEvent, None]:
|
|
353
|
+
self._check_content_type()
|
|
354
|
+
decoder = SSEDecoder()
|
|
355
|
+
text_decoder = self._new_text_decoder()
|
|
356
|
+
|
|
357
|
+
last_dispatched_id: Optional[str] = None
|
|
358
|
+
last_retry: Optional[int] = None
|
|
359
|
+
reconnect_attempts = 0
|
|
360
|
+
|
|
361
|
+
response: Optional[httpx.Response] = self._response
|
|
362
|
+
owned_cm: Optional[AsyncContextManager[httpx.Response]] = None
|
|
363
|
+
try:
|
|
364
|
+
while True:
|
|
365
|
+
if response is not None:
|
|
366
|
+
events = self._adecode_response(response, decoder, text_decoder)
|
|
367
|
+
while True:
|
|
368
|
+
try:
|
|
369
|
+
sse = await events.__anext__()
|
|
370
|
+
except StopAsyncIteration:
|
|
371
|
+
break
|
|
372
|
+
except SSEError:
|
|
373
|
+
# A protocol violation (e.g. an oversized line) is a
|
|
374
|
+
# genuine error, not a dropped connection; propagate it.
|
|
375
|
+
# Listed first because ``SSEError`` subclasses
|
|
376
|
+
# ``httpx.TransportError``.
|
|
377
|
+
raise
|
|
378
|
+
except httpx.TransportError:
|
|
379
|
+
# A transport error mid-stream (e.g. the server dropped
|
|
380
|
+
# the connection: ``ReadError``/``RemoteProtocolError``)
|
|
381
|
+
# is a premature end. Only swallow it when reconnection
|
|
382
|
+
# is configured for this stream; otherwise re-raise so a
|
|
383
|
+
# non-resumable stream still surfaces the error to the
|
|
384
|
+
# caller instead of looking like a clean completion.
|
|
385
|
+
# When reconnection is applicable but the attempt budget
|
|
386
|
+
# is exhausted, we ``break`` and end cleanly below — the
|
|
387
|
+
# same way an exhausted empty/error-body resume does, so
|
|
388
|
+
# give-up is consistent regardless of failure shape.
|
|
389
|
+
if not self._reconnect_applicable():
|
|
390
|
+
raise
|
|
391
|
+
break
|
|
392
|
+
yield sse
|
|
393
|
+
if sse.id:
|
|
394
|
+
last_dispatched_id = sse.id
|
|
395
|
+
if sse.retry is not None:
|
|
396
|
+
last_retry = sse.retry
|
|
397
|
+
reconnect_attempts = 0
|
|
398
|
+
|
|
399
|
+
if not self._should_reconnect(last_dispatched_id, reconnect_attempts):
|
|
400
|
+
return
|
|
401
|
+
reconnect_attempts += 1
|
|
402
|
+
|
|
403
|
+
await self._asleep_before_reconnect(last_retry)
|
|
404
|
+
|
|
405
|
+
if owned_cm is not None:
|
|
406
|
+
await owned_cm.__aexit__(None, None, None)
|
|
407
|
+
owned_cm = None
|
|
408
|
+
|
|
409
|
+
assert self._reconnect is not None # guaranteed by _should_reconnect
|
|
410
|
+
try:
|
|
411
|
+
cm: AsyncContextManager[httpx.Response] = self._reconnect(last_dispatched_id or "")
|
|
412
|
+
new_response = await cm.__aenter__()
|
|
413
|
+
except Exception:
|
|
414
|
+
response = None
|
|
415
|
+
continue
|
|
416
|
+
owned_cm = cm
|
|
417
|
+
if new_response is None or not self._is_reconnect_response_usable(new_response):
|
|
418
|
+
response = None
|
|
419
|
+
continue
|
|
420
|
+
|
|
421
|
+
response = new_response
|
|
422
|
+
decoder.reset_in_progress_event()
|
|
423
|
+
text_decoder = self._new_text_decoder(new_response)
|
|
424
|
+
finally:
|
|
425
|
+
if owned_cm is not None:
|
|
426
|
+
# Shield the close so a cancellation delivered while reading a
|
|
427
|
+
# reconnected response still fully tears the connection down
|
|
428
|
+
# instead of leaking it until the client is closed.
|
|
429
|
+
with anyio.CancelScope(shield=True):
|
|
430
|
+
await owned_cm.__aexit__(None, None, None)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
@contextmanager
|
|
434
|
+
def connect_sse(client: httpx.Client, method: str, url: str, **kwargs: Any) -> Iterator[EventSource]:
|
|
435
|
+
headers = kwargs.pop("headers", {})
|
|
436
|
+
headers["Accept"] = "text/event-stream"
|
|
437
|
+
headers["Cache-Control"] = "no-store"
|
|
438
|
+
|
|
439
|
+
with client.stream(method, url, headers=headers, **kwargs) as response:
|
|
440
|
+
yield EventSource(response)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@asynccontextmanager
|
|
444
|
+
async def aconnect_sse(
|
|
445
|
+
client: httpx.AsyncClient,
|
|
446
|
+
method: str,
|
|
447
|
+
url: str,
|
|
448
|
+
**kwargs: Any,
|
|
449
|
+
) -> AsyncIterator[EventSource]:
|
|
450
|
+
headers = kwargs.pop("headers", {})
|
|
451
|
+
headers["Accept"] = "text/event-stream"
|
|
452
|
+
headers["Cache-Control"] = "no-store"
|
|
453
|
+
|
|
454
|
+
async with client.stream(method, url, headers=headers, **kwargs) as response:
|
|
455
|
+
yield EventSource(response)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from ._models import ServerSentEvent
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SSEDecoder:
|
|
9
|
+
def __init__(self) -> None:
|
|
10
|
+
self._event = ""
|
|
11
|
+
self._data: List[str] = []
|
|
12
|
+
self._last_event_id = ""
|
|
13
|
+
self._retry: Optional[int] = None
|
|
14
|
+
|
|
15
|
+
def reset_in_progress_event(self) -> None:
|
|
16
|
+
"""Discard any partially-parsed (undispatched) event.
|
|
17
|
+
|
|
18
|
+
Used when a stream ends mid-event before reconnecting: the buffered
|
|
19
|
+
``event``/``data``/``retry`` fields of the never-dispatched event must
|
|
20
|
+
be dropped so they do not corrupt the first event of the reconnected
|
|
21
|
+
stream. Per the SSE spec the last event id is *not* reset here — it
|
|
22
|
+
persists across connections.
|
|
23
|
+
"""
|
|
24
|
+
self._event = ""
|
|
25
|
+
self._data = []
|
|
26
|
+
self._retry = None
|
|
27
|
+
|
|
28
|
+
def decode(self, line: str) -> Optional[ServerSentEvent]:
|
|
29
|
+
# See: https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation # noqa: E501
|
|
30
|
+
|
|
31
|
+
if not line:
|
|
32
|
+
if not self._event and not self._data and not self._last_event_id and self._retry is None:
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
sse = ServerSentEvent(
|
|
36
|
+
event=self._event,
|
|
37
|
+
data="\n".join(self._data),
|
|
38
|
+
id=self._last_event_id,
|
|
39
|
+
retry=self._retry,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# NOTE: as per the SSE spec, do not reset last_event_id.
|
|
43
|
+
self._event = ""
|
|
44
|
+
self._data = []
|
|
45
|
+
self._retry = None
|
|
46
|
+
|
|
47
|
+
return sse
|
|
48
|
+
|
|
49
|
+
if line.startswith(":"):
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
fieldname, _, value = line.partition(":")
|
|
53
|
+
|
|
54
|
+
if value.startswith(" "):
|
|
55
|
+
value = value[1:]
|
|
56
|
+
|
|
57
|
+
if fieldname == "event":
|
|
58
|
+
self._event = value
|
|
59
|
+
elif fieldname == "data":
|
|
60
|
+
self._data.append(value)
|
|
61
|
+
elif fieldname == "id":
|
|
62
|
+
if "\0" in value:
|
|
63
|
+
pass
|
|
64
|
+
else:
|
|
65
|
+
self._last_event_id = value
|
|
66
|
+
elif fieldname == "retry":
|
|
67
|
+
try:
|
|
68
|
+
self._retry = int(value)
|
|
69
|
+
except (TypeError, ValueError):
|
|
70
|
+
pass
|
|
71
|
+
else:
|
|
72
|
+
pass # Field is ignored.
|
|
73
|
+
|
|
74
|
+
return None
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any, Optional
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class ServerSentEvent:
|
|
10
|
+
event: str = "message"
|
|
11
|
+
data: str = ""
|
|
12
|
+
id: str = ""
|
|
13
|
+
retry: Optional[int] = None
|
|
14
|
+
|
|
15
|
+
def json(self) -> Any:
|
|
16
|
+
"""Parse the data field as JSON."""
|
|
17
|
+
return json.loads(self.data)
|