qwak-core 0.1.37__py3-none-any.whl → 0.5.19__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.
Potentially problematic release.
This version of qwak-core might be problematic. Click here for more details.
- _qwak_proto/jfml/hosting_gateway/v1/build_upload_url_pb2.py +29 -0
- _qwak_proto/jfml/hosting_gateway/v1/build_upload_url_pb2.pyi +70 -0
- _qwak_proto/jfml/hosting_gateway/v1/build_upload_url_pb2_grpc.py +4 -0
- _qwak_proto/jfml/hosting_gateway/v1/hosting_gateway_service_pb2.py +32 -0
- _qwak_proto/jfml/hosting_gateway/v1/hosting_gateway_service_pb2.pyi +48 -0
- _qwak_proto/jfml/hosting_gateway/v1/hosting_gateway_service_pb2_grpc.py +67 -0
- _qwak_proto/qwak/administration/account/v1/account_pb2.py +29 -60
- _qwak_proto/qwak/administration/account/v1/account_pb2.pyi +120 -2
- _qwak_proto/qwak/administration/account/v1/account_service_pb2.py +67 -0
- _qwak_proto/qwak/administration/account/v1/account_service_pb2.pyi +345 -0
- _qwak_proto/qwak/administration/account/v1/account_service_pb2_grpc.py +338 -0
- _qwak_proto/qwak/administration/account/v1/jfrog_tenant_details_pb2.py +49 -0
- _qwak_proto/qwak/administration/account/v1/jfrog_tenant_details_pb2.pyi +209 -0
- _qwak_proto/qwak/administration/account/v1/jfrog_tenant_details_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/account/v1/personalization_pb2.py +8 -24
- _qwak_proto/qwak/administration/account/v1/preferences_pb2.py +6 -14
- _qwak_proto/qwak/administration/account/v1/terms_pb2.py +35 -0
- _qwak_proto/qwak/administration/account/v1/terms_pb2.pyi +94 -0
- _qwak_proto/qwak/administration/account/v1/terms_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/authenticated_user/v1/authenticated_user_service_pb2.py +18 -67
- _qwak_proto/qwak/administration/authenticated_user/v1/credentials_pb2.py +8 -24
- _qwak_proto/qwak/administration/authenticated_user/v1/credentials_pb2.pyi +1 -1
- _qwak_proto/qwak/administration/authenticated_user/v1/details_pb2.py +14 -54
- _qwak_proto/qwak/administration/cluster/v2/cluster_pb2.py +62 -0
- _qwak_proto/qwak/administration/cluster/v2/cluster_pb2.pyi +354 -0
- _qwak_proto/qwak/administration/cluster/v2/cluster_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/container_registry_config_pb2.py +32 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/container_registry_config_pb2.pyi +65 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/container_registry_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/creds/auth_pb2.py +28 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/creds/auth_pb2.pyi +36 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/creds/auth_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/creds/secret_pb2.py +29 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/creds/secret_pb2.pyi +49 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/creds/secret_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/data_catalog_config_pb2.py +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/data_catalog_config_pb2.pyi +89 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/data_catalog_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.py +34 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2.pyi +97 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/databricks/auth_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/elasticsearch_config_pb2.py +28 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/elasticsearch_config_pb2.pyi +39 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/elasticsearch_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/kafka_config_pb2.py +34 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/kafka_config_pb2.pyi +79 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/kafka_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/prometheus_config_pb2.py +29 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/prometheus_config_pb2.pyi +46 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/prometheus_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/redis_config_pb2.py +28 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/redis_config_pb2.pyi +39 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/redis_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/victoriametrics_config_pb2.py +28 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/victoriametrics_config_pb2.pyi +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/external/victoriametrics_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/feature_store_config_pb2.py +32 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/feature_store_config_pb2.pyi +66 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/feature_store_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/aws/auth_pb2.py +42 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/aws/auth_pb2.pyi +159 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/aws/auth_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.py +39 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2.pyi +126 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting/azure/auth_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting_config_pb2.py +40 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting_config_pb2.pyi +146 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/hosting_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/logs_storage_config_pb2.py +28 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/logs_storage_config_pb2.pyi +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/logs_storage_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/model_analytics_storage_config_pb2.py +28 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/model_analytics_storage_config_pb2.pyi +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/model_analytics_storage_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/network_config_pb2.py +36 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/network_config_pb2.pyi +107 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/network_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/object_storage_config_pb2.py +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/object_storage_config_pb2.pyi +93 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/object_storage_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/observability_config_pb2.py +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/observability_config_pb2.pyi +79 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/observability_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/runtime_config_pb2.py +36 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/runtime_config_pb2.pyi +72 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/runtime_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/sql_engine_config_pb2.py +33 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/sql_engine_config_pb2.pyi +83 -0
- _qwak_proto/qwak/administration/runtime_configuration/v0/sql_engine_config_pb2_grpc.py +4 -0
- _qwak_proto/qwak/administration/v0/authentication/authentication_service_pb2.py +14 -47
- _qwak_proto/qwak/administration/v0/environments/configuration_pb2.py +23 -55
- _qwak_proto/qwak/administration/v0/environments/configuration_pb2.pyi +103 -7
- _qwak_proto/qwak/administration/v0/environments/environment_pb2.py +15 -33
- _qwak_proto/qwak/administration/v0/environments/environment_pb2.pyi +50 -2
- _qwak_proto/qwak/administration/v0/environments/environment_service_pb2.py +36 -158
- _qwak_proto/qwak/administration/v0/environments/personalization_pb2.py +8 -24
- _qwak_proto/qwak/administration/v0/users/user_pb2.py +18 -71
- _qwak_proto/qwak/admiral/secret/v0/secret_pb2.py +53 -0
- _qwak_proto/qwak/admiral/secret/v0/secret_pb2.pyi +256 -0
- _qwak_proto/qwak/admiral/secret/v0/secret_pb2_grpc.py +4 -0
- _qwak_proto/qwak/admiral/secret/v0/secret_service_pb2.py +40 -0
- _qwak_proto/qwak/admiral/secret/v0/secret_service_pb2.pyi +93 -0
- _qwak_proto/qwak/admiral/secret/v0/secret_service_pb2_grpc.py +135 -0
- _qwak_proto/qwak/admiral/secret/v0/system_secret_service_pb2.py +40 -0
- _qwak_proto/qwak/admiral/secret/v0/system_secret_service_pb2.pyi +101 -0
- _qwak_proto/qwak/admiral/secret/v0/system_secret_service_pb2_grpc.py +135 -0
- _qwak_proto/qwak/admiral/user_application_instance/v0/user_application_instance_pb2.py +39 -105
- _qwak_proto/qwak/admiral/user_application_instance/v0/user_application_instance_pb2.pyi +131 -3
- _qwak_proto/qwak/admiral/user_application_instance/v0/user_application_instance_service_pb2.py +22 -87
- _qwak_proto/qwak/analytics/analytics_pb2.py +28 -123
- _qwak_proto/qwak/analytics/analytics_pb2.pyi +5 -1
- _qwak_proto/qwak/analytics/analytics_service_pb2.py +48 -149
- _qwak_proto/qwak/analytics/analytics_service_pb2.pyi +87 -0
- _qwak_proto/qwak/analytics/analytics_service_pb2_grpc.py +101 -0
- _qwak_proto/qwak/artifactory_settings/artifactory_settings_pb2.py +29 -0
- _qwak_proto/qwak/artifactory_settings/artifactory_settings_pb2.pyi +57 -0
- _qwak_proto/qwak/artifactory_settings/artifactory_settings_pb2_grpc.py +4 -0
- _qwak_proto/qwak/audience/v1/audience_api_pb2.py +30 -127
- _qwak_proto/qwak/audience/v1/audience_pb2.py +27 -114
- _qwak_proto/qwak/audience/v1/audience_pb2.pyi +5 -1
- _qwak_proto/qwak/auto_scaling/v1/auto_scaling_pb2.py +18 -79
- _qwak_proto/qwak/auto_scaling/v1/auto_scaling_service_pb2.py +10 -27
- _qwak_proto/qwak/automation/v1/action_pb2.py +42 -164
- _qwak_proto/qwak/automation/v1/action_pb2.pyi +82 -7
- _qwak_proto/qwak/automation/v1/auto_scaling_pb2.py +19 -77
- _qwak_proto/qwak/automation/v1/auto_scaling_pb2.pyi +6 -0
- _qwak_proto/qwak/automation/v1/automation_execution_pb2.py +12 -43
- _qwak_proto/qwak/automation/v1/automation_management_service_pb2.py +56 -258
- _qwak_proto/qwak/automation/v1/automation_pb2.py +11 -35
- _qwak_proto/qwak/automation/v1/automation_pb2.pyi +8 -1
- _qwak_proto/qwak/automation/v1/common_pb2.py +11 -33
- _qwak_proto/qwak/automation/v1/common_pb2.pyi +6 -0
- _qwak_proto/qwak/automation/v1/notification_pb2.py +16 -68
- _qwak_proto/qwak/automation/v1/trigger_pb2.py +14 -54
- _qwak_proto/qwak/batch_job/v1/batch_job_events_pb2.py +27 -116
- _qwak_proto/qwak/batch_job/v1/batch_job_events_pb2.pyi +6 -1
- _qwak_proto/qwak/batch_job/v1/batch_job_resources_pb2.py +9 -26
- _qwak_proto/qwak/batch_job/v1/batch_job_resources_pb2.pyi +2 -0
- _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.py +121 -502
- _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2.pyi +111 -4
- _qwak_proto/qwak/batch_job/v1/batch_job_service_pb2_grpc.py +67 -0
- _qwak_proto/qwak/build/v1/build_api_pb2.py +98 -278
- _qwak_proto/qwak/build/v1/build_api_pb2.pyi +220 -0
- _qwak_proto/qwak/build/v1/build_api_pb2_grpc.py +198 -0
- _qwak_proto/qwak/build/v1/build_pb2.py +115 -417
- _qwak_proto/qwak/build/v1/build_pb2.pyi +294 -5
- _qwak_proto/qwak/build_settings/build_settings_api_pb2.py +40 -0
- _qwak_proto/qwak/build_settings/build_settings_api_pb2.pyi +106 -0
- _qwak_proto/qwak/build_settings/build_settings_api_pb2_grpc.py +132 -0
- _qwak_proto/qwak/build_settings/build_settings_pb2.py +39 -0
- _qwak_proto/qwak/build_settings/build_settings_pb2.pyi +148 -0
- _qwak_proto/qwak/build_settings/build_settings_pb2_grpc.py +4 -0
- _qwak_proto/qwak/builds/build_pb2.py +46 -200
- _qwak_proto/qwak/builds/build_pb2.pyi +111 -5
- _qwak_proto/qwak/builds/build_url_pb2.py +27 -54
- _qwak_proto/qwak/builds/build_url_pb2.pyi +131 -2
- _qwak_proto/qwak/builds/build_values_pb2.py +82 -0
- _qwak_proto/qwak/builds/build_values_pb2.pyi +559 -0
- _qwak_proto/qwak/builds/build_values_pb2_grpc.py +4 -0
- _qwak_proto/qwak/builds/builds_orchestrator_service_pb2.py +93 -168
- _qwak_proto/qwak/builds/builds_orchestrator_service_pb2.pyi +342 -3
- _qwak_proto/qwak/builds/builds_orchestrator_service_pb2_grpc.py +166 -0
- _qwak_proto/qwak/builds/builds_pb2.py +87 -528
- _qwak_proto/qwak/builds/builds_pb2.pyi +5 -192
- _qwak_proto/qwak/builds/builds_pb2_grpc.py +0 -233
- _qwak_proto/qwak/builds/internal_builds_orchestrator_service_pb2.py +12 -37
- _qwak_proto/qwak/data_versioning/data_versioning_pb2.py +9 -15
- _qwak_proto/qwak/data_versioning/data_versioning_pb2.pyi +21 -0
- _qwak_proto/qwak/data_versioning/data_versioning_service_pb2.py +15 -48
- _qwak_proto/qwak/data_versioning/data_versioning_service_pb2.pyi +12 -1
- _qwak_proto/qwak/deployment/alert_pb2.py +25 -108
- _qwak_proto/qwak/deployment/alert_pb2.pyi +2 -0
- _qwak_proto/qwak/deployment/alert_service_pb2.py +30 -127
- _qwak_proto/qwak/deployment/deployment_messages_pb2.py +6 -14
- _qwak_proto/qwak/deployment/deployment_pb2.py +127 -578
- _qwak_proto/qwak/deployment/deployment_pb2.pyi +51 -8
- _qwak_proto/qwak/deployment/deployment_service_pb2.py +91 -400
- _qwak_proto/qwak/deployment/deployment_service_pb2.pyi +30 -0
- _qwak_proto/qwak/deployment/deployment_service_pb2_grpc.py +34 -0
- _qwak_proto/qwak/ecosystem/jfrog/v0/token_pb2.py +72 -0
- _qwak_proto/qwak/ecosystem/jfrog/v0/token_pb2.pyi +489 -0
- _qwak_proto/qwak/ecosystem/jfrog/v0/token_pb2_grpc.py +4 -0
- _qwak_proto/qwak/ecosystem/jfrog/v0/token_service_pb2.py +44 -0
- _qwak_proto/qwak/ecosystem/jfrog/v0/token_service_pb2.pyi +144 -0
- _qwak_proto/qwak/ecosystem/jfrog/v0/token_service_pb2_grpc.py +169 -0
- _qwak_proto/qwak/ecosystem/v0/auth_pb2.py +28 -0
- _qwak_proto/qwak/ecosystem/v0/auth_pb2.pyi +37 -0
- _qwak_proto/qwak/ecosystem/v0/auth_pb2_grpc.py +4 -0
- _qwak_proto/qwak/ecosystem/v0/azure_credentials_pb2.py +37 -0
- _qwak_proto/qwak/ecosystem/v0/azure_credentials_pb2.pyi +117 -0
- _qwak_proto/qwak/ecosystem/v0/azure_credentials_pb2_grpc.py +4 -0
- _qwak_proto/qwak/ecosystem/v0/credentials_pb2.py +13 -26
- _qwak_proto/qwak/ecosystem/v0/credentials_pb2.pyi +33 -3
- _qwak_proto/qwak/ecosystem/v0/ecosystem_pb2.py +34 -140
- _qwak_proto/qwak/ecosystem/v0/ecosystem_pb2.pyi +45 -7
- _qwak_proto/qwak/ecosystem/v0/ecosystem_runtime_service_pb2.py +54 -229
- _qwak_proto/qwak/ecosystem/v0/ecosystem_runtime_service_pb2.pyi +22 -3
- _qwak_proto/qwak/execution/v1/backfill_pb2.py +18 -74
- _qwak_proto/qwak/execution/v1/batch_pb2.py +10 -34
- _qwak_proto/qwak/execution/v1/deletion_pb2.py +33 -0
- _qwak_proto/qwak/execution/v1/deletion_pb2.pyi +67 -0
- _qwak_proto/qwak/execution/v1/deletion_pb2_grpc.py +4 -0
- _qwak_proto/qwak/execution/v1/execution_pb2.py +20 -60
- _qwak_proto/qwak/execution/v1/execution_pb2.pyi +61 -4
- _qwak_proto/qwak/execution/v1/execution_service_pb2.py +70 -108
- _qwak_proto/qwak/execution/v1/execution_service_pb2.pyi +306 -0
- _qwak_proto/qwak/execution/v1/execution_service_pb2_grpc.py +304 -2
- _qwak_proto/qwak/execution/v1/internal/deployment/platform_details_pb2.py +27 -0
- _qwak_proto/qwak/execution/v1/internal/deployment/platform_details_pb2.pyi +29 -0
- _qwak_proto/qwak/execution/v1/internal/deployment/platform_details_pb2_grpc.py +4 -0
- _qwak_proto/qwak/execution/v1/jobs/job_pb2.py +19 -67
- _qwak_proto/qwak/execution/v1/jobs/job_pb2.pyi +33 -2
- _qwak_proto/qwak/execution/v1/jobs/job_service_pb2.py +56 -88
- _qwak_proto/qwak/execution/v1/jobs/job_service_pb2.pyi +311 -0
- _qwak_proto/qwak/execution/v1/jobs/job_service_pb2_grpc.py +231 -0
- _qwak_proto/qwak/execution/v1/jobs/reports/report_pb2.py +21 -75
- _qwak_proto/qwak/execution/v1/jobs/reports/report_pb2.pyi +29 -2
- _qwak_proto/qwak/execution/v1/state/execution_state_pb2.py +6 -14
- _qwak_proto/qwak/execution/v1/state/execution_state_service_pb2.py +31 -108
- _qwak_proto/qwak/execution/v1/state/execution_state_service_pb2.pyi +30 -0
- _qwak_proto/qwak/execution/v1/state/execution_state_service_pb2_grpc.py +34 -0
- _qwak_proto/qwak/execution/v1/state/featureset_state_pb2.py +6 -14
- _qwak_proto/qwak/execution/v1/state/spark_execution_state_pb2.py +14 -68
- _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.py +42 -0
- _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2.pyi +165 -0
- _qwak_proto/qwak/execution/v1/streaming_aggregation_pb2_grpc.py +4 -0
- _qwak_proto/qwak/execution/v1/streaming_pb2.py +33 -0
- _qwak_proto/qwak/execution/v1/streaming_pb2.pyi +79 -0
- _qwak_proto/qwak/execution/v1/streaming_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/entities/entity_pb2.py +16 -57
- _qwak_proto/qwak/feature_store/entities/entity_service_pb2.py +30 -127
- _qwak_proto/qwak/feature_store/features/aggregation_pb2.py +38 -175
- _qwak_proto/qwak/feature_store/features/deployment_pb2.py +36 -167
- _qwak_proto/qwak/feature_store/features/deployment_service_pb2.py +10 -27
- _qwak_proto/qwak/feature_store/features/execution_pb2.py +14 -56
- _qwak_proto/qwak/feature_store/features/feature_set_attribute_pb2.py +28 -0
- _qwak_proto/qwak/feature_store/features/feature_set_attribute_pb2.pyi +33 -0
- _qwak_proto/qwak/feature_store/features/feature_set_attribute_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/features/feature_set_pb2.py +49 -106
- _qwak_proto/qwak/feature_store/features/feature_set_pb2.pyi +154 -8
- _qwak_proto/qwak/feature_store/features/feature_set_service_pb2.py +101 -349
- _qwak_proto/qwak/feature_store/features/feature_set_service_pb2.pyi +160 -0
- _qwak_proto/qwak/feature_store/features/feature_set_service_pb2_grpc.py +170 -0
- _qwak_proto/qwak/feature_store/features/feature_set_state_pb2.py +38 -181
- _qwak_proto/qwak/feature_store/features/feature_set_state_service_pb2.py +26 -107
- _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.py +84 -298
- _qwak_proto/qwak/feature_store/features/feature_set_types_pb2.pyi +123 -7
- _qwak_proto/qwak/feature_store/features/monitoring_pb2.py +10 -34
- _qwak_proto/qwak/feature_store/features/real_time_feature_extractor_pb2.py +32 -143
- _qwak_proto/qwak/feature_store/jobs/job_pb2.py +12 -46
- _qwak_proto/qwak/feature_store/jobs/job_service_pb2.py +30 -127
- _qwak_proto/qwak/feature_store/jobs/v1/job_pb2.py +13 -36
- _qwak_proto/qwak/feature_store/jobs/v1/job_pb2.pyi +19 -0
- _qwak_proto/qwak/feature_store/jobs/v1/job_service_pb2.py +44 -148
- _qwak_proto/qwak/feature_store/jobs/v1/job_service_pb2.pyi +64 -0
- _qwak_proto/qwak/feature_store/jobs/v1/job_service_pb2_grpc.py +67 -0
- _qwak_proto/qwak/feature_store/platform/platform_details_pb2.py +30 -0
- _qwak_proto/qwak/feature_store/platform/platform_details_pb2.pyi +54 -0
- _qwak_proto/qwak/feature_store/platform/platform_details_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/reports/report_pb2.py +14 -53
- _qwak_proto/qwak/feature_store/repository/common/platform_pb2.py +31 -0
- _qwak_proto/qwak/feature_store/repository/common/platform_pb2.pyi +70 -0
- _qwak_proto/qwak/feature_store/repository/common/platform_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/serving/management_pb2.py +36 -0
- _qwak_proto/qwak/feature_store/serving/management_pb2.pyi +72 -0
- _qwak_proto/qwak/feature_store/serving/management_pb2_grpc.py +101 -0
- _qwak_proto/qwak/feature_store/serving/metadata_pb2.py +13 -35
- _qwak_proto/qwak/feature_store/serving/metadata_pb2.pyi +27 -0
- _qwak_proto/qwak/feature_store/serving/serving_pb2.py +50 -222
- _qwak_proto/qwak/feature_store/serving/v1/value_pb2.py +8 -24
- _qwak_proto/qwak/feature_store/sinks/sink_pb2.py +36 -0
- _qwak_proto/qwak/feature_store/sinks/sink_pb2.pyi +137 -0
- _qwak_proto/qwak/feature_store/sinks/sink_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/sources/batch_pb2.py +80 -175
- _qwak_proto/qwak/feature_store/sources/batch_pb2.pyi +461 -13
- _qwak_proto/qwak/feature_store/sources/data_source_attribute_pb2.py +28 -0
- _qwak_proto/qwak/feature_store/sources/data_source_attribute_pb2.pyi +33 -0
- _qwak_proto/qwak/feature_store/sources/data_source_attribute_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/sources/data_source_pb2.py +21 -55
- _qwak_proto/qwak/feature_store/sources/data_source_pb2.pyi +39 -4
- _qwak_proto/qwak/feature_store/sources/data_source_service_pb2.py +41 -148
- _qwak_proto/qwak/feature_store/sources/data_source_service_pb2.pyi +25 -0
- _qwak_proto/qwak/feature_store/sources/data_source_service_pb2_grpc.py +34 -0
- _qwak_proto/qwak/feature_store/sources/streaming_pb2.py +34 -146
- _qwak_proto/qwak/feature_store/v1/common/jfrog_artifact/jfrog_artifact_pb2.py +27 -0
- _qwak_proto/qwak/feature_store/v1/common/jfrog_artifact/jfrog_artifact_pb2.pyi +30 -0
- _qwak_proto/qwak/feature_store/v1/common/jfrog_artifact/jfrog_artifact_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/v1/common/source_code/source_code_pb2.py +32 -0
- _qwak_proto/qwak/feature_store/v1/common/source_code/source_code_pb2.pyi +77 -0
- _qwak_proto/qwak/feature_store/v1/common/source_code/source_code_pb2_grpc.py +4 -0
- _qwak_proto/qwak/feature_store/v1/internal/data_source/data_source_service_pb2.py +39 -0
- _qwak_proto/qwak/feature_store/v1/internal/data_source/data_source_service_pb2.pyi +99 -0
- _qwak_proto/qwak/feature_store/v1/internal/data_source/data_source_service_pb2_grpc.py +99 -0
- _qwak_proto/qwak/feature_store/v1/internal/featureset/featureset_token_service_pb2.py +31 -0
- _qwak_proto/qwak/feature_store/v1/internal/featureset/featureset_token_service_pb2.pyi +46 -0
- _qwak_proto/qwak/feature_store/v1/internal/featureset/featureset_token_service_pb2_grpc.py +66 -0
- _qwak_proto/qwak/features_operator/v1/features_operator_pb2.py +14 -54
- _qwak_proto/qwak/features_operator/v1/features_operator_service_pb2.py +14 -47
- _qwak_proto/qwak/features_operator/v2/features_operator_pb2.py +16 -64
- _qwak_proto/qwak/features_operator/v2/features_operator_service_pb2.py +12 -37
- _qwak_proto/qwak/features_operator/v3/features_operator_async_service_pb2.py +26 -107
- _qwak_proto/qwak/features_operator/v3/features_operator_pb2.py +16 -64
- _qwak_proto/qwak/file_versioning/file_versioning_pb2.py +11 -24
- _qwak_proto/qwak/file_versioning/file_versioning_pb2.pyi +21 -0
- _qwak_proto/qwak/file_versioning/file_versioning_service_pb2.py +15 -48
- _qwak_proto/qwak/file_versioning/file_versioning_service_pb2.pyi +12 -1
- _qwak_proto/qwak/fitness_service/constructs_pb2.py +23 -93
- _qwak_proto/qwak/fitness_service/constructs_pb2.pyi +59 -1
- _qwak_proto/qwak/fitness_service/fitness_pb2.py +7 -34
- _qwak_proto/qwak/fitness_service/fitness_pb2.pyi +0 -77
- _qwak_proto/qwak/fitness_service/status_pb2.py +17 -107
- _qwak_proto/qwak/fitness_service/status_pb2.pyi +1 -117
- _qwak_proto/qwak/inference/feedback/feedback_pb2.py +28 -96
- _qwak_proto/qwak/instance_template/instance_template_pb2.py +13 -41
- _qwak_proto/qwak/instance_template/instance_template_pb2.pyi +13 -1
- _qwak_proto/qwak/instance_template/instance_template_service_pb2.py +14 -47
- _qwak_proto/qwak/integration/hugging_face_integration_pb2.py +37 -0
- _qwak_proto/qwak/integration/hugging_face_integration_pb2.pyi +106 -0
- _qwak_proto/qwak/integration/hugging_face_integration_pb2_grpc.py +4 -0
- _qwak_proto/qwak/integration/integration_pb2.py +55 -0
- _qwak_proto/qwak/integration/integration_pb2.pyi +357 -0
- _qwak_proto/qwak/integration/integration_pb2_grpc.py +4 -0
- _qwak_proto/qwak/integration/integration_service_pb2.py +56 -0
- _qwak_proto/qwak/integration/integration_service_pb2.pyi +234 -0
- _qwak_proto/qwak/integration/integration_service_pb2_grpc.py +271 -0
- _qwak_proto/qwak/integration/open_a_i_integration_pb2.py +37 -0
- _qwak_proto/qwak/integration/open_a_i_integration_pb2.pyi +109 -0
- _qwak_proto/qwak/integration/open_a_i_integration_pb2_grpc.py +4 -0
- _qwak_proto/qwak/integration/opsgenie_integration_pb2.py +43 -0
- _qwak_proto/qwak/integration/opsgenie_integration_pb2.pyi +168 -0
- _qwak_proto/qwak/integration/opsgenie_integration_pb2_grpc.py +4 -0
- _qwak_proto/qwak/integration/pagerduty_integration_pb2.py +47 -0
- _qwak_proto/qwak/integration/pagerduty_integration_pb2.pyi +195 -0
- _qwak_proto/qwak/integration/pagerduty_integration_pb2_grpc.py +4 -0
- _qwak_proto/qwak/integration/slack_app_integration_pb2.py +47 -0
- _qwak_proto/qwak/integration/slack_app_integration_pb2.pyi +198 -0
- _qwak_proto/qwak/integration/slack_app_integration_pb2_grpc.py +4 -0
- _qwak_proto/qwak/kube_deployment_captain/alert_pb2.py +22 -97
- _qwak_proto/qwak/kube_deployment_captain/alerting_pb2.py +12 -44
- _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.py +76 -249
- _qwak_proto/qwak/kube_deployment_captain/batch_job_pb2.pyi +283 -6
- _qwak_proto/qwak/kube_deployment_captain/deployment_pb2.py +45 -161
- _qwak_proto/qwak/kube_deployment_captain/deployment_pb2.pyi +52 -1
- _qwak_proto/qwak/kube_deployment_captain/feature_set_deployment_pb2.py +33 -145
- _qwak_proto/qwak/kube_deployment_captain/feature_set_deployment_pb2.pyi +6 -2
- _qwak_proto/qwak/kube_deployment_captain/kube_deployment_captain_service_pb2.py +111 -510
- _qwak_proto/qwak/kube_deployment_captain/kube_deployment_captain_service_pb2.pyi +24 -1
- _qwak_proto/qwak/kube_deployment_captain/kube_deployment_captain_service_pb2_grpc.py +34 -0
- _qwak_proto/qwak/kube_deployment_captain/traffic_mapping_pb2.py +8 -24
- _qwak_proto/qwak/logging/log_filter_pb2.py +12 -44
- _qwak_proto/qwak/logging/log_line_pb2.py +8 -25
- _qwak_proto/qwak/logging/log_reader_service_pb2.py +10 -27
- _qwak_proto/qwak/logging/log_source_pb2.py +30 -134
- _qwak_proto/qwak/model_descriptor/open_ai_descriptor_pb2.py +40 -0
- _qwak_proto/qwak/model_descriptor/open_ai_descriptor_pb2.pyi +215 -0
- _qwak_proto/qwak/model_descriptor/open_ai_descriptor_pb2_grpc.py +4 -0
- _qwak_proto/qwak/model_group/model_group_pb2.py +47 -0
- _qwak_proto/qwak/model_group/model_group_pb2.pyi +192 -0
- _qwak_proto/qwak/model_group/model_group_pb2_grpc.py +169 -0
- _qwak_proto/qwak/model_group/model_group_repository_details_pb2.py +43 -0
- _qwak_proto/qwak/model_group/model_group_repository_details_pb2.pyi +172 -0
- _qwak_proto/qwak/model_group/model_group_repository_details_pb2_grpc.py +4 -0
- _qwak_proto/qwak/models/models_pb2.py +101 -356
- _qwak_proto/qwak/models/models_pb2.pyi +221 -6
- _qwak_proto/qwak/models/models_pb2_grpc.py +68 -0
- _qwak_proto/qwak/models/models_query_pb2.py +37 -0
- _qwak_proto/qwak/models/models_query_pb2.pyi +157 -0
- _qwak_proto/qwak/models/models_query_pb2_grpc.py +4 -0
- _qwak_proto/qwak/monitoring/v0/alerting_channel_management_service_pb2.py +30 -127
- _qwak_proto/qwak/monitoring/v0/alerting_channel_pb2.py +34 -152
- _qwak_proto/qwak/monitoring/v0/alerting_channel_sync_service_pb2.py +14 -47
- _qwak_proto/qwak/offline/serving/v1/feature_values_pb2.py +27 -0
- _qwak_proto/qwak/offline/serving/v1/feature_values_pb2.pyi +37 -0
- _qwak_proto/qwak/offline/serving/v1/feature_values_pb2_grpc.py +4 -0
- _qwak_proto/qwak/offline/serving/v1/offline_serving_async_service_pb2.py +55 -0
- _qwak_proto/qwak/offline/serving/v1/offline_serving_async_service_pb2.pyi +279 -0
- _qwak_proto/qwak/offline/serving/v1/offline_serving_async_service_pb2_grpc.py +165 -0
- _qwak_proto/qwak/offline/serving/v1/options_pb2.py +27 -0
- _qwak_proto/qwak/offline/serving/v1/options_pb2.pyi +30 -0
- _qwak_proto/qwak/offline/serving/v1/options_pb2_grpc.py +4 -0
- _qwak_proto/qwak/offline/serving/v1/population_pb2.py +35 -0
- _qwak_proto/qwak/offline/serving/v1/population_pb2.pyi +99 -0
- _qwak_proto/qwak/offline/serving/v1/population_pb2_grpc.py +4 -0
- _qwak_proto/qwak/projects/jfrog_project_spec_pb2.py +27 -0
- _qwak_proto/qwak/projects/jfrog_project_spec_pb2.pyi +32 -0
- _qwak_proto/qwak/projects/jfrog_project_spec_pb2_grpc.py +4 -0
- _qwak_proto/qwak/projects/projects_pb2.py +51 -142
- _qwak_proto/qwak/projects/projects_pb2.pyi +149 -3
- _qwak_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.py +77 -0
- _qwak_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2.pyi +417 -0
- _qwak_proto/qwak/prompt/v1/prompt/prompt_manager_service_pb2_grpc.py +441 -0
- _qwak_proto/qwak/prompt/v1/prompt/prompt_pb2.py +69 -0
- _qwak_proto/qwak/prompt/v1/prompt/prompt_pb2.pyi +415 -0
- _qwak_proto/qwak/prompt/v1/prompt/prompt_pb2_grpc.py +4 -0
- _qwak_proto/qwak/secret_service/secret_service_pb2.py +18 -67
- _qwak_proto/qwak/secret_service/secret_service_pb2.pyi +1 -1
- _qwak_proto/qwak/self_service/account/v0/account_membership_pb2.py +30 -65
- _qwak_proto/qwak/self_service/account/v0/account_membership_pb2.pyi +99 -2
- _qwak_proto/qwak/self_service/account/v0/account_membership_service_pb2.py +51 -208
- _qwak_proto/qwak/self_service/account/v0/account_membership_service_pb2.pyi +28 -0
- _qwak_proto/qwak/self_service/account/v0/account_membership_service_pb2_grpc.py +34 -0
- _qwak_proto/qwak/self_service/account/v0/account_status_pb2.py +44 -0
- _qwak_proto/qwak/self_service/account/v0/account_status_pb2.pyi +172 -0
- _qwak_proto/qwak/self_service/account/v0/account_status_pb2_grpc.py +4 -0
- _qwak_proto/qwak/self_service/account/v0/managing_account_pb2.py +60 -0
- _qwak_proto/qwak/self_service/account/v0/managing_account_pb2.pyi +317 -0
- _qwak_proto/qwak/self_service/account/v0/managing_account_pb2_grpc.py +4 -0
- _qwak_proto/qwak/self_service/account/v0/managing_account_service_pb2.py +45 -0
- _qwak_proto/qwak/self_service/account/v0/managing_account_service_pb2.pyi +136 -0
- _qwak_proto/qwak/self_service/account/v0/managing_account_service_pb2_grpc.py +169 -0
- _qwak_proto/qwak/self_service/user/v1/api_key_pb2.py +6 -14
- _qwak_proto/qwak/self_service/user/v1/user_pb2.py +6 -14
- _qwak_proto/qwak/self_service/user/v1/user_service_pb2.py +30 -121
- _qwak_proto/qwak/service_discovery/service_discovery_location_pb2.py +33 -0
- _qwak_proto/qwak/service_discovery/service_discovery_location_pb2.pyi +73 -0
- _qwak_proto/qwak/service_discovery/service_discovery_location_pb2_grpc.py +4 -0
- _qwak_proto/qwak/service_discovery/service_discovery_location_service_pb2.py +32 -0
- _qwak_proto/qwak/service_discovery/service_discovery_location_service_pb2.pyi +41 -0
- _qwak_proto/qwak/service_discovery/service_discovery_location_service_pb2_grpc.py +231 -0
- _qwak_proto/qwak/traffic/v1/traffic_api_pb2.py +23 -88
- _qwak_proto/qwak/traffic/v1/traffic_api_pb2.pyi +13 -2
- _qwak_proto/qwak/traffic/v1/traffic_pb2.py +27 -114
- _qwak_proto/qwak/traffic/v1/traffic_pb2.pyi +5 -1
- _qwak_proto/qwak/user_application/common/v0/resources_pb2.py +31 -132
- _qwak_proto/qwak/user_application/common/v0/resources_pb2.pyi +54 -0
- _qwak_proto/qwak/user_application/v0/user_application_pb2.py +15 -39
- _qwak_proto/qwak/user_application/v0/user_application_pb2.pyi +16 -0
- _qwak_proto/qwak/vectors/v1/collection/collection_pb2.py +25 -104
- _qwak_proto/qwak/vectors/v1/collection/collection_pb2.pyi +17 -1
- _qwak_proto/qwak/vectors/v1/collection/collection_service_pb2.py +38 -167
- _qwak_proto/qwak/vectors/v1/collection/event/collection_event_pb2.py +7 -15
- _qwak_proto/qwak/vectors/v1/collection/event/collection_event_pb2.pyi +5 -1
- _qwak_proto/qwak/vectors/v1/filters_pb2.py +30 -134
- _qwak_proto/qwak/vectors/v1/vector_pb2.py +17 -45
- _qwak_proto/qwak/vectors/v1/vector_pb2.pyi +25 -2
- _qwak_proto/qwak/vectors/v1/vector_service_pb2.py +31 -108
- _qwak_proto/qwak/vectors/v1/vector_service_pb2.pyi +30 -7
- _qwak_proto/qwak/workspace/workspace_pb2.py +23 -108
- _qwak_proto/qwak/workspace/workspace_pb2.pyi +10 -2
- _qwak_proto/qwak/workspace/workspace_service_pb2.py +63 -248
- _qwak_proto/qwak/workspace/workspace_service_pb2.pyi +56 -0
- _qwak_proto/qwak/workspace/workspace_service_pb2_grpc.py +66 -0
- qwak/__init__.py +2 -3
- qwak/automations/automation_executions.py +14 -10
- qwak/automations/automations.py +33 -23
- qwak/automations/build_and_deploy_action.py +147 -28
- qwak/automations/common.py +6 -0
- qwak/clients/administration/eco_system/client.py +2 -2
- qwak/clients/administration/eco_system/eco_system_utils.py +15 -0
- qwak/clients/administration/environment/client.py +16 -0
- qwak/clients/analytics/client.py +28 -3
- qwak/clients/batch_job_management/client.py +94 -3
- qwak/clients/batch_job_management/executions_config.py +18 -0
- qwak/clients/build_orchestrator/build_model_request_getter.py +3 -0
- qwak/clients/build_orchestrator/client.py +155 -12
- qwak/clients/data_versioning/client.py +19 -1
- qwak/clients/data_versioning/data_tag_filter.py +32 -0
- qwak/clients/deployment/client.py +14 -0
- qwak/clients/feature_store/execution_management_client.py +28 -0
- qwak/clients/feature_store/management_client.py +203 -146
- qwak/clients/feature_store/offline_serving_client.py +251 -0
- qwak/clients/feature_store/operator_client.py +21 -4
- qwak/clients/file_versioning/client.py +19 -1
- qwak/clients/file_versioning/file_tag_filter.py +32 -0
- qwak/clients/instance_template/client.py +11 -10
- qwak/clients/integration_management/integration_manager_client.py +34 -0
- qwak/clients/integration_management/integration_utils.py +27 -0
- qwak/clients/integration_management/openai/openai_system_secret.py +56 -0
- qwak/clients/kube_deployment_captain/client.py +3 -1
- qwak/clients/location_discovery/__init__.py +1 -0
- qwak/clients/location_discovery/client.py +73 -0
- qwak/clients/logging_client/client.py +13 -18
- qwak/clients/model_management/client.py +7 -2
- qwak/clients/project/client.py +7 -2
- qwak/clients/prompt_manager/__init__.py +0 -0
- qwak/clients/prompt_manager/model_descriptor_mapper.py +183 -0
- qwak/clients/prompt_manager/prompt_manager_client.py +167 -0
- qwak/clients/prompt_manager/prompt_proto_mapper.py +236 -0
- qwak/clients/secret_service/client.py +8 -3
- qwak/clients/system_secret/__init__.py +0 -0
- qwak/clients/system_secret/system_secret_client.py +30 -0
- qwak/clients/vector_store/management_client.py +2 -0
- qwak/clients/vector_store/serving_client.py +64 -18
- qwak/clients/workspace_manager/client.py +15 -0
- qwak/exceptions/__init__.py +7 -0
- qwak/exceptions/qwak_decode_exception.py +7 -0
- qwak/exceptions/qwak_exception.py +2 -1
- qwak/exceptions/qwak_external_exception.py +11 -0
- qwak/exceptions/qwak_general_build_exception.py +13 -0
- qwak/exceptions/qwak_grpc_address_exception.py +9 -0
- qwak/exceptions/qwak_load_configuration_exception.py +2 -0
- qwak/exceptions/qwak_remote_build_failed.py +5 -0
- qwak/exceptions/qwak_suggestion_exception.py +27 -0
- qwak/feature_store/_common/artifact_utils.py +59 -0
- qwak/feature_store/_common/feature_set_utils.py +142 -19
- qwak/feature_store/_common/functions.py +0 -43
- qwak/feature_store/_common/packaging.py +262 -0
- qwak/feature_store/_common/source_code_spec.py +108 -0
- qwak/feature_store/_common/source_code_spec_factory.py +104 -0
- qwak/feature_store/_common/value.py +10 -0
- qwak/feature_store/data_sources/__init__.py +53 -17
- qwak/feature_store/data_sources/attributes.py +23 -0
- qwak/feature_store/data_sources/base.py +125 -0
- qwak/feature_store/data_sources/batch/__init__.py +0 -0
- qwak/feature_store/data_sources/batch/_batch.py +9 -0
- qwak/feature_store/data_sources/{batch_sources → batch}/_jdbc.py +2 -1
- qwak/feature_store/data_sources/batch/athena.py +260 -0
- qwak/feature_store/data_sources/{batch_sources → batch}/big_query.py +5 -5
- qwak/feature_store/data_sources/batch/clickhouse.py +60 -0
- qwak/feature_store/data_sources/{batch_sources → batch}/csv.py +9 -5
- qwak/feature_store/data_sources/{batch_sources → batch}/elastic_search.py +5 -5
- qwak/feature_store/data_sources/batch/filesystem/__init__.py +0 -0
- qwak/feature_store/data_sources/{batch_sources/filesystem_config.py → batch/filesystem/aws.py} +30 -38
- qwak/feature_store/data_sources/batch/filesystem/base_config.py +13 -0
- qwak/feature_store/data_sources/batch/filesystem/gcp.py +50 -0
- qwak/feature_store/data_sources/batch/filesystem/utils.py +51 -0
- qwak/feature_store/data_sources/{batch_sources → batch}/mongodb.py +6 -5
- qwak/feature_store/data_sources/{batch_sources → batch}/mysql.py +5 -7
- qwak/feature_store/data_sources/{batch_sources → batch}/parquet.py +10 -7
- qwak/feature_store/data_sources/{batch_sources → batch}/postgres.py +5 -7
- qwak/feature_store/data_sources/{batch_sources → batch}/redshift.py +6 -7
- qwak/feature_store/data_sources/{batch_sources → batch}/snowflake.py +39 -13
- qwak/feature_store/data_sources/batch/unity_catalog.py +107 -0
- qwak/feature_store/data_sources/{batch_sources → batch}/vertica.py +6 -5
- qwak/feature_store/data_sources/source_authentication.py +33 -0
- qwak/feature_store/data_sources/streaming/__init__.py +0 -0
- qwak/feature_store/data_sources/streaming/_streaming.py +9 -0
- qwak/feature_store/data_sources/streaming/kafka/__init__.py +25 -0
- qwak/feature_store/data_sources/streaming/kafka/authentication.py +120 -0
- qwak/feature_store/data_sources/streaming/kafka/deserialization.py +109 -0
- qwak/feature_store/data_sources/streaming/kafka/kafka.py +120 -0
- qwak/feature_store/data_sources/time_partition_columns.py +166 -0
- qwak/feature_store/entities/entity.py +17 -4
- qwak/feature_store/execution/backfill.py +8 -2
- qwak/feature_store/execution/streaming_backfill.py +48 -0
- qwak/feature_store/feature_sets/_utils/_featureset_utils.py +45 -0
- qwak/feature_store/feature_sets/backfill.py +13 -0
- qwak/feature_store/feature_sets/base_feature_set.py +148 -0
- qwak/feature_store/feature_sets/batch.py +142 -151
- qwak/feature_store/feature_sets/execution_spec.py +6 -0
- qwak/feature_store/feature_sets/metadata.py +51 -1
- qwak/feature_store/feature_sets/streaming.py +655 -0
- qwak/feature_store/feature_sets/streaming_backfill.py +223 -0
- qwak/feature_store/feature_sets/transformations/__init__.py +33 -0
- qwak/feature_store/feature_sets/transformations/aggregations/__init__.py +0 -0
- qwak/feature_store/feature_sets/transformations/aggregations/aggregations.py +425 -0
- qwak/feature_store/feature_sets/transformations/aggregations/windows.py +70 -0
- qwak/feature_store/feature_sets/transformations/functions/__init__.py +10 -0
- qwak/feature_store/feature_sets/transformations/functions/qwak_pandas.py +64 -0
- qwak/feature_store/feature_sets/transformations/functions/schema.py +57 -0
- qwak/feature_store/feature_sets/transformations/transformations.py +451 -0
- qwak/feature_store/feature_sets/transformations/validations/validations_util.py +78 -0
- qwak/feature_store/offline/__init__.py +2 -2
- qwak/feature_store/offline/_offline_serving_validations.py +31 -0
- qwak/feature_store/offline/client_v2.py +327 -0
- qwak/feature_store/offline/feature_set_features.py +25 -0
- qwak/feature_store/online/client.py +152 -46
- qwak/feature_store/online/endpoint_utils.py +63 -0
- qwak/feature_store/sinks/__init__.py +0 -0
- qwak/feature_store/sinks/base.py +18 -0
- qwak/feature_store/sinks/kafka.py +59 -0
- qwak/feature_store/sinks/streaming/__init__.py +0 -0
- qwak/feature_store/sinks/streaming/attachment.py +30 -0
- qwak/feature_store/sinks/streaming/factory.py +60 -0
- qwak/feature_store/validations/__init__.py +0 -0
- qwak/feature_store/validations/validation_decorators.py +70 -0
- qwak/feature_store/validations/validation_options.py +77 -0
- qwak/feature_store/validations/validation_response.py +119 -0
- qwak/feature_store/validations/validator.py +114 -0
- qwak/inner/build_config/__init__.py +0 -0
- qwak/inner/build_config/build_config_v1.py +311 -0
- qwak/inner/build_logic/__init__.py +0 -0
- qwak/inner/build_logic/build_loggers/__init__.py +0 -0
- qwak/inner/build_logic/build_loggers/trigger_build_logger.py +51 -0
- qwak/inner/build_logic/constants/__init__.py +0 -0
- qwak/inner/build_logic/constants/dependencies.py +5 -0
- qwak/inner/build_logic/constants/host_resource.py +4 -0
- qwak/inner/build_logic/constants/messages.py +3 -0
- qwak/inner/build_logic/constants/temp_dir.py +1 -0
- qwak/inner/build_logic/constants/upload_tag.py +7 -0
- qwak/inner/build_logic/dependency_manager_type.py +8 -0
- qwak/inner/build_logic/execute_build_pipeline.py +62 -0
- qwak/inner/build_logic/interface/__init__.py +0 -0
- qwak/inner/build_logic/interface/build_logger_interface.py +28 -0
- qwak/inner/build_logic/interface/build_phase.py +24 -0
- qwak/inner/build_logic/interface/context_interface.py +66 -0
- qwak/inner/build_logic/interface/phase_run_handler.py +71 -0
- qwak/inner/build_logic/interface/step_inteface.py +26 -0
- qwak/inner/build_logic/interface/time_source.py +23 -0
- qwak/inner/build_logic/phases/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_model_step.py +43 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/common.py +32 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/fetch_strategy_manager.py +62 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/folder/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/folder/folder_strategy.py +131 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/git/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/git/git_strategy.py +186 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/strategy.py +48 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/zip/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/fetch_strategy_manager/strategy/zip/zip_strategy.py +64 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/post_fetch_validation_step.py +140 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/pre_fetch_validation_step.py +266 -0
- qwak/inner/build_logic/phases/phase_010_fetch_model/set_version_step.py +33 -0
- qwak/inner/build_logic/phases/phase_020_remote_register_qwak_build/__init__.py +0 -0
- qwak/inner/build_logic/phases/phase_020_remote_register_qwak_build/cleanup_step.py +20 -0
- qwak/inner/build_logic/phases/phase_020_remote_register_qwak_build/start_remote_build_step.py +43 -0
- qwak/inner/build_logic/phases/phase_020_remote_register_qwak_build/upload_step.py +258 -0
- qwak/inner/build_logic/phases/phases_pipeline.py +44 -0
- qwak/inner/build_logic/run_handlers/__init__.py +0 -0
- qwak/inner/build_logic/run_handlers/programmatic_phase_run_handler.py +99 -0
- qwak/inner/build_logic/tools/__init__.py +0 -0
- qwak/inner/build_logic/tools/dependencies_tools.py +68 -0
- qwak/inner/build_logic/tools/files.py +237 -0
- qwak/inner/build_logic/tools/ignore_files.py +20 -0
- qwak/inner/build_logic/tools/text.py +9 -0
- qwak/inner/build_logic/trigger_build_context.py +10 -0
- qwak/inner/const.py +2 -4
- qwak/inner/di_configuration/__init__.py +1 -63
- qwak/inner/di_configuration/account.py +32 -15
- qwak/inner/di_configuration/config.yml +2 -0
- qwak/inner/di_configuration/containers.py +10 -2
- qwak/inner/di_configuration/dependency_wiring.py +98 -0
- qwak/inner/di_configuration/session.py +5 -0
- qwak/inner/instance_template/__init__.py +0 -0
- qwak/inner/instance_template/verify_template_id.py +48 -0
- qwak/inner/model_loggers_utils.py +10 -7
- qwak/inner/provider.py +6 -0
- qwak/inner/tool/auth.py +42 -7
- qwak/inner/tool/grpc/grpc_auth.py +27 -8
- qwak/inner/tool/grpc/grpc_tools.py +124 -4
- qwak/inner/tool/grpc/grpc_try_wrapping.py +139 -4
- qwak/inner/tool/protobuf_factory.py +45 -0
- qwak/inner/tool/run_config/__init__.py +2 -0
- qwak/inner/tool/run_config/base.py +32 -7
- qwak/inner/tool/run_config/utils.py +66 -1
- qwak/llmops/__init__.py +0 -0
- qwak/llmops/generation/__init__.py +0 -0
- qwak/llmops/generation/_steaming.py +77 -0
- qwak/llmops/generation/base.py +5 -0
- qwak/llmops/generation/chat/__init__.py +0 -0
- qwak/llmops/generation/chat/openai/LICENSE.txt +201 -0
- qwak/llmops/generation/chat/openai/types/__init__.py +0 -0
- qwak/llmops/generation/chat/openai/types/chat/__init__.py +0 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion.py +105 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_assistant_message_param.py +65 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_chunk.py +188 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_content_part_text_param.py +28 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_function_call_option_param.py +25 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_function_message_param.py +33 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_message.py +59 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_message_param.py +34 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_message_tool_call.py +46 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_message_tool_call_param.py +44 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_named_tool_choice_param.py +32 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_role.py +20 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_system_message_param.py +35 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_token_logprob.py +71 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_tool_choice_option_param.py +28 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_tool_message_param.py +31 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_tool_param.py +29 -0
- qwak/llmops/generation/chat/openai/types/chat/chat_completion_user_message_param.py +35 -0
- qwak/llmops/generation/chat/openai/types/chat/completion_create_params.py +279 -0
- qwak/llmops/generation/chat/openai/types/completion_choice.py +47 -0
- qwak/llmops/generation/chat/openai/types/completion_create_params.py +209 -0
- qwak/llmops/generation/chat/openai/types/completion_usage.py +30 -0
- qwak/llmops/generation/chat/openai/types/model.py +35 -0
- qwak/llmops/generation/chat/openai/types/shared/__init__.py +3 -0
- qwak/llmops/generation/chat/openai/types/shared/error_object.py +27 -0
- qwak/llmops/generation/chat/openai/types/shared/function_definition.py +49 -0
- qwak/llmops/generation/chat/openai/types/shared/function_parameters.py +20 -0
- qwak/llmops/generation/chat/openai/types/shared_params/__init__.py +2 -0
- qwak/llmops/generation/chat/openai/types/shared_params/function_definition.py +49 -0
- qwak/llmops/generation/chat/openai/types/shared_params/function_parameters.py +22 -0
- qwak/llmops/generation/streaming.py +26 -0
- qwak/llmops/model/__init__.py +0 -0
- qwak/llmops/model/descriptor.py +39 -0
- qwak/llmops/prompt/__init__.py +0 -0
- qwak/llmops/prompt/base.py +133 -0
- qwak/llmops/prompt/chat/__init__.py +0 -0
- qwak/llmops/prompt/chat/message.py +24 -0
- qwak/llmops/prompt/chat/template.py +113 -0
- qwak/llmops/prompt/chat/value.py +10 -0
- qwak/llmops/prompt/manager.py +134 -0
- qwak/llmops/prompt/template.py +24 -0
- qwak/llmops/prompt/value.py +14 -0
- qwak/llmops/provider/__init__.py +0 -0
- qwak/llmops/provider/chat.py +42 -0
- qwak/llmops/provider/openai/__init__.py +0 -0
- qwak/llmops/provider/openai/client.py +123 -0
- qwak/llmops/provider/openai/provider.py +89 -0
- qwak/model/_entity_extraction.py +40 -46
- qwak/model/adapters/input_adapters/multi_input_adapter.py +17 -1
- qwak/model/base.py +1 -1
- qwak/model/decorators/api.py +3 -1
- qwak/model/decorators/impl/api_implementation.py +1 -0
- qwak/model/fs_info_mapping_retriever.py +58 -0
- qwak/model/schema.py +1 -1
- qwak/model/schema_entities.py +1 -1
- qwak/model/tools/__init__.py +1 -1
- qwak/model/tools/adapters/input_adapters/dataframe_input.py +1 -1
- qwak/model/tools/adapters/output.py +1 -1
- qwak/model/tools/run_model_locally.py +15 -3
- qwak/model/utils/feature_utils.py +69 -0
- qwak/model_loggers/artifact_logger.py +46 -9
- qwak/model_loggers/data_logger.py +16 -2
- qwak/qwak_client/batch_jobs/execution.py +49 -0
- qwak/qwak_client/batch_jobs/task.py +43 -0
- qwak/qwak_client/build_api_helpers/__init__.py +0 -0
- qwak/qwak_client/build_api_helpers/build_api_steps.py +53 -0
- qwak/qwak_client/build_api_helpers/messages.py +6 -0
- qwak/qwak_client/build_api_helpers/trigger_build_api.py +65 -0
- qwak/qwak_client/client.py +276 -24
- qwak/qwak_client/data_versioning/__init__.py +0 -0
- qwak/qwak_client/data_versioning/data_tag.py +24 -0
- qwak/qwak_client/deployments/deployment.py +11 -9
- qwak/qwak_client/file_versioning/__init__.py +0 -0
- qwak/qwak_client/file_versioning/file_tag.py +24 -0
- qwak/qwak_client/projects/project.py +4 -2
- qwak/tools/logger/logger.py +1 -1
- qwak/utils/__init__.py +0 -0
- qwak/utils/datetime_utils.py +18 -0
- qwak/utils/dict_utils.py +12 -0
- qwak/vector_store/client.py +8 -0
- qwak/vector_store/collection.py +173 -73
- qwak/vector_store/inference_client.py +30 -2
- qwak/vector_store/rest_helpers.py +13 -21
- qwak/vector_store/utils/filter_utils.py +4 -17
- qwak/vector_store/utils/upsert_utils.py +217 -0
- {qwak_core-0.1.37.dist-info → qwak_core-0.5.19.dist-info}/METADATA +20 -15
- qwak_core-0.5.19.dist-info/RECORD +1100 -0
- {qwak_core-0.1.37.dist-info → qwak_core-0.5.19.dist-info}/WHEEL +1 -1
- qwak_services_mock/mocks/authentication_service.py +5 -4
- qwak_services_mock/mocks/batch_job_manager_service.py +53 -6
- qwak_services_mock/mocks/build_orchestrator_build_api.py +18 -1
- qwak_services_mock/mocks/build_orchestrator_build_settings_api.py +35 -0
- qwak_services_mock/mocks/build_orchestrator_service_api.py +4 -0
- qwak_services_mock/mocks/data_versioning_service.py +26 -2
- qwak_services_mock/mocks/deployment_management_service.py +46 -18
- qwak_services_mock/mocks/ecosystem_service_api.py +0 -1
- qwak_services_mock/mocks/execution_management_service.py +9 -1
- qwak_services_mock/mocks/feature_store_data_sources_manager_api.py +98 -2
- qwak_services_mock/mocks/feature_store_entities_manager_api.py +46 -3
- qwak_services_mock/mocks/feature_store_feature_set_manager_api.py +197 -21
- qwak_services_mock/mocks/features_online_serving_api.py +9 -0
- qwak_services_mock/mocks/features_operator_v3_service.py +20 -0
- qwak_services_mock/mocks/features_set_state_service_api.py +0 -1
- qwak_services_mock/mocks/file_versioning_service.py +29 -2
- qwak_services_mock/mocks/fs_offline_serving_service.py +53 -0
- qwak_services_mock/mocks/instance_template_management_service.py +35 -1
- qwak_services_mock/mocks/integration_management_service.py +72 -0
- qwak_services_mock/mocks/location_discovery_service_api.py +104 -0
- qwak_services_mock/mocks/model_management_service.py +11 -5
- qwak_services_mock/mocks/prompt_manager_service.py +244 -0
- qwak_services_mock/mocks/qwak_mocks.py +20 -2
- qwak_services_mock/mocks/system_secret_service.py +54 -0
- qwak_services_mock/mocks/vector_serving_api.py +44 -8
- qwak_services_mock/mocks/workspace_manager_service_mock.py +24 -8
- qwak_services_mock/services_mock.py +78 -12
- _qwak_proto/qwak/fitness_service/fitness_service_pb2.py +0 -110
- _qwak_proto/qwak/fitness_service/fitness_service_pb2.pyi +0 -121
- _qwak_proto/qwak/fitness_service/fitness_service_pb2_grpc.py +0 -169
- qwak/clients/build_management/__init__.py +0 -1
- qwak/clients/build_management/client.py +0 -114
- qwak/feature_store/_common/featureset_asterisk_handler.py +0 -115
- qwak/feature_store/data_sources/batch_sources/__init__.py +0 -6
- qwak/feature_store/data_sources/batch_sources/_batch.py +0 -86
- qwak/feature_store/feature_sets/transformations.py +0 -48
- qwak/feature_store/offline/_query_engine.py +0 -32
- qwak/feature_store/offline/athena/athena_query_engine.py +0 -153
- qwak/feature_store/offline/client.py +0 -699
- qwak/feature_store/validation_options.py +0 -69
- qwak_core-0.1.37.dist-info/RECORD +0 -682
- qwak_services_mock/mocks/build_management.py +0 -100
- {_qwak_proto → qwak/clients/integration_management}/__init__.py +0 -0
- /qwak/{feature_store/offline/athena → clients/integration_management/openai}/__init__.py +0 -0
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
import collections
|
|
2
|
+
import functools
|
|
3
|
+
import inspect
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from typing import TYPE_CHECKING, List, Optional, Tuple, Union
|
|
7
|
+
|
|
8
|
+
from _qwak_proto.qwak.feature_store.features.execution_pb2 import (
|
|
9
|
+
StreamingExecutionSpec as ProtoStreamingExecutionSpec,
|
|
10
|
+
)
|
|
11
|
+
from _qwak_proto.qwak.feature_store.features.feature_set_pb2 import (
|
|
12
|
+
FeatureSetSpec as ProtoFeatureSetSpec,
|
|
13
|
+
)
|
|
14
|
+
from _qwak_proto.qwak.feature_store.features.feature_set_types_pb2 import (
|
|
15
|
+
AggregationSpec as ProtoAggregationSpec,
|
|
16
|
+
FeatureSetType as ProtoFeatureSetType,
|
|
17
|
+
StreamingAggregationFeatureSet as ProtoStreamingAggregationFeatureSet,
|
|
18
|
+
StreamingFeatureSetV1 as ProtoStreamingFeatureSetV1,
|
|
19
|
+
)
|
|
20
|
+
from _qwak_proto.qwak.feature_store.sources.streaming_pb2 import (
|
|
21
|
+
StreamingSource,
|
|
22
|
+
StreamingSource as ProtoStreamingSource,
|
|
23
|
+
)
|
|
24
|
+
from google.protobuf.timestamp_pb2 import Timestamp as ProtoTimestamp
|
|
25
|
+
from qwak.clients.feature_store import FeatureRegistryClient
|
|
26
|
+
from qwak.exceptions import QwakException
|
|
27
|
+
from qwak.feature_store._common.artifact_utils import ArtifactSpec, ArtifactsUploader
|
|
28
|
+
from qwak.feature_store.entities.entity import Entity
|
|
29
|
+
from qwak.feature_store.feature_sets._utils._featureset_utils import FeaturesetUtils
|
|
30
|
+
from qwak.feature_store.feature_sets.base_feature_set import BaseFeatureSet
|
|
31
|
+
from qwak.feature_store.feature_sets.execution_spec import ClusterTemplate
|
|
32
|
+
from qwak.feature_store.feature_sets.metadata import (
|
|
33
|
+
Metadata,
|
|
34
|
+
get_metadata_from_function,
|
|
35
|
+
set_metadata_on_function,
|
|
36
|
+
)
|
|
37
|
+
from qwak.feature_store.feature_sets.streaming_backfill import (
|
|
38
|
+
BackfillDataSource,
|
|
39
|
+
StreamingBackfill,
|
|
40
|
+
)
|
|
41
|
+
from qwak.feature_store.feature_sets.transformations import (
|
|
42
|
+
BaseTransformation,
|
|
43
|
+
PySparkTransformation,
|
|
44
|
+
SparkSqlTransformation,
|
|
45
|
+
Window,
|
|
46
|
+
)
|
|
47
|
+
from qwak.feature_store.sinks.base import BaseSink
|
|
48
|
+
from qwak.feature_store.sinks.streaming.factory import StreamingSinkFactory
|
|
49
|
+
from qwak.feature_store.validations.validation_options import (
|
|
50
|
+
FeatureSetValidationOptions,
|
|
51
|
+
)
|
|
52
|
+
from typeguard import typechecked
|
|
53
|
+
|
|
54
|
+
if TYPE_CHECKING:
|
|
55
|
+
try:
|
|
56
|
+
import pandas as pd
|
|
57
|
+
except ImportError:
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
_OFFLINE_SCHEDULING_ATTRIBUTE = "_qwak_offline_scheduling"
|
|
61
|
+
_OFFLINE_CLUSTER_SPEC = "_qwak_offline_cluster_specification"
|
|
62
|
+
_ONLINE_TRIGGER_INTERVAL = "_qwak_online_trigger_interval"
|
|
63
|
+
_ONLINE_CLUSTER_SPEC = "_qwak_online_cluster_specification"
|
|
64
|
+
_METADATA_ = "_qwak_online_cluster_specification"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@typechecked
|
|
68
|
+
def feature_set(
|
|
69
|
+
*,
|
|
70
|
+
data_sources: List[str],
|
|
71
|
+
timestamp_column_name: str,
|
|
72
|
+
offline_scheduling_policy: Optional[str] = "*/30 * * * *",
|
|
73
|
+
online_trigger_interval: Optional[int] = 5,
|
|
74
|
+
name: Optional[str] = None,
|
|
75
|
+
entity: Optional[str] = None,
|
|
76
|
+
key: Optional[str] = None,
|
|
77
|
+
auxiliary_sinks: List[BaseSink] = [],
|
|
78
|
+
repository: Optional[str] = None,
|
|
79
|
+
backfill_max_timestamp: Optional[datetime] = None,
|
|
80
|
+
):
|
|
81
|
+
"""
|
|
82
|
+
Creates a streaming feature set for the specified entity using the given streaming data sources.
|
|
83
|
+
|
|
84
|
+
A streaming feature set allows for real-time updates of features from live data sources, letting ML models access
|
|
85
|
+
the most recent values without waiting for batch updates.
|
|
86
|
+
|
|
87
|
+
:param entity: The name of the entity for which the feature set is being created. An entity typically represents a
|
|
88
|
+
unique object or concept, like 'user', 'product', etc. Entity and key are mutually exclusive.
|
|
89
|
+
:param key: a column name in the feature set which is the key. Entity and key are mutually exclusive.
|
|
90
|
+
:param data_sources: A list of references to the data sources from which the feature values will be streamed.
|
|
91
|
+
Each data source should be capable of providing data in a streaming manner.
|
|
92
|
+
:param timestamp_column_name: The name of the column in the data source that contains timestamp information. This
|
|
93
|
+
is used to order the data chronologically and ensure that the feature values are
|
|
94
|
+
updated in the correct order.
|
|
95
|
+
:param offline_scheduling_policy: Defines the offline ingestion policy - which affects the data freshness of
|
|
96
|
+
the offline store. defaults to */30 * * * * (every 30 minutes)
|
|
97
|
+
:param online_trigger_interval: Defines the online ingestion policy - which affects the data freshness of
|
|
98
|
+
the online store. defaults to 5 seconds
|
|
99
|
+
:param name: An optional name for the feature set. If not provided, the name of the function will be used.
|
|
100
|
+
:param auxiliary_sinks: list of auxiliary sinks. Not supported with Aggregations
|
|
101
|
+
Example:
|
|
102
|
+
|
|
103
|
+
... code-block:: python
|
|
104
|
+
|
|
105
|
+
@streaming.feature_set(
|
|
106
|
+
entity="users",
|
|
107
|
+
data_sources=["users_registration_stream"],
|
|
108
|
+
timestamp_column_name="reg_date"
|
|
109
|
+
)
|
|
110
|
+
def user_streaming_features():
|
|
111
|
+
return SparkSqlTransformation("SELECT user_id, reg_country, reg_date FROM data_source")
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
def decorator(function):
|
|
115
|
+
if isinstance(function, StreamingBackfill):
|
|
116
|
+
raise QwakException(
|
|
117
|
+
"Backfill can no longer be defined as a decorator on the feature set, it must be triggered after feature set creation."
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
user_transformation = function()
|
|
121
|
+
FeaturesetUtils.validate_base_featureset_decorator(
|
|
122
|
+
user_transformation=user_transformation, entity=entity, key=key
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
FeaturesetUtils.validate_streaming_featureset_decorator(
|
|
126
|
+
online_trigger_interval=online_trigger_interval,
|
|
127
|
+
offline_scheduling_policy=offline_scheduling_policy,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
fs_name = name or function.__name__
|
|
131
|
+
streaming_feature_set = StreamingFeatureSet(
|
|
132
|
+
name=fs_name,
|
|
133
|
+
entity=entity if entity else None,
|
|
134
|
+
key=key if key else None,
|
|
135
|
+
repository=repository,
|
|
136
|
+
data_sources=data_sources,
|
|
137
|
+
timestamp_column_name=timestamp_column_name,
|
|
138
|
+
transformation=user_transformation,
|
|
139
|
+
metadata=get_metadata_from_function(
|
|
140
|
+
function, description=fs_name, display_name=fs_name
|
|
141
|
+
),
|
|
142
|
+
online_trigger_interval=(
|
|
143
|
+
online_trigger_interval if online_trigger_interval else 5
|
|
144
|
+
),
|
|
145
|
+
offline_scheduling_policy=(
|
|
146
|
+
offline_scheduling_policy
|
|
147
|
+
if offline_scheduling_policy
|
|
148
|
+
else "*/30 * * * *"
|
|
149
|
+
),
|
|
150
|
+
offline_cluster_template=getattr(
|
|
151
|
+
function, _OFFLINE_CLUSTER_SPEC, ClusterTemplate.SMALL
|
|
152
|
+
),
|
|
153
|
+
online_cluster_template=getattr(
|
|
154
|
+
function, _ONLINE_CLUSTER_SPEC, ClusterTemplate.SMALL
|
|
155
|
+
),
|
|
156
|
+
backfill_max_timestamp=backfill_max_timestamp,
|
|
157
|
+
__instance_module_path__=inspect.stack()[1].filename,
|
|
158
|
+
auxiliary_sinks=auxiliary_sinks,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
functools.update_wrapper(streaming_feature_set, user_transformation)
|
|
162
|
+
return streaming_feature_set
|
|
163
|
+
|
|
164
|
+
return decorator
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@typechecked
|
|
168
|
+
def execution_specification(
|
|
169
|
+
*,
|
|
170
|
+
online_cluster_template: Optional[ClusterTemplate] = None,
|
|
171
|
+
offline_cluster_template: Optional[ClusterTemplate] = None,
|
|
172
|
+
):
|
|
173
|
+
"""
|
|
174
|
+
Set the execution specification of the cluster running the feature set
|
|
175
|
+
|
|
176
|
+
:param online_cluster_template: Predefined template sizes
|
|
177
|
+
:param offline_cluster_template: Predefined template sizes
|
|
178
|
+
|
|
179
|
+
Cluster template example:
|
|
180
|
+
|
|
181
|
+
... code-block:: python
|
|
182
|
+
@streaming.feature_set(entity="users", data_sources=["streaming_users_source"])
|
|
183
|
+
@streaming.execution_specification(
|
|
184
|
+
offline_cluster_template=ClusterTemplate.MEDIUM,
|
|
185
|
+
online_cluster_template=ClusterTemplate.MEDIUM)
|
|
186
|
+
def user_streaming_features():
|
|
187
|
+
return SparkSqlTransformation("SELECT user_id, age, timestamp FROM streaming_users_source"
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
def decorator(user_transformation):
|
|
191
|
+
setattr(user_transformation, _ONLINE_CLUSTER_SPEC, online_cluster_template)
|
|
192
|
+
|
|
193
|
+
setattr(user_transformation, _OFFLINE_CLUSTER_SPEC, offline_cluster_template)
|
|
194
|
+
|
|
195
|
+
return user_transformation
|
|
196
|
+
|
|
197
|
+
return decorator
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
@typechecked
|
|
201
|
+
def backfill(
|
|
202
|
+
*,
|
|
203
|
+
feature_set_name: str,
|
|
204
|
+
start_date: Optional[datetime],
|
|
205
|
+
end_date: Optional[datetime],
|
|
206
|
+
data_sources: Union[List[str], List[BackfillDataSource]],
|
|
207
|
+
backfill_cluster_template: Optional[ClusterTemplate] = ClusterTemplate.SMALL,
|
|
208
|
+
):
|
|
209
|
+
"""
|
|
210
|
+
Triggers a backfill execution for an existing streaming featureset. Currently available for streaming
|
|
211
|
+
aggregation featuresets only.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
feature_set_name (str): Name of the FeatureSet to trigger a backfill for.
|
|
215
|
+
start_date (datetime): Backfill start date, on Streaming Aggregation Feature Sets,
|
|
216
|
+
needs to align with the FeatureSet tiles.
|
|
217
|
+
end_date (datetime): Backfill end date, on Streaming Aggregation Feature Sets,
|
|
218
|
+
needs to align with the FeatureSet tiles and be smaller than the Feature Set's backfill_max_timestamp.
|
|
219
|
+
data_sources (list[BackfillDataSource] | list[str]): A list of BackfillDataSource objects containing
|
|
220
|
+
batch source name and optional time range, or a list of batch source names (with no time range limits).
|
|
221
|
+
backfill_cluster_template (ClusterTemplate, optional): An optional cluster specification for the backfill job.
|
|
222
|
+
Defaults to SMALL.
|
|
223
|
+
|
|
224
|
+
Examples:
|
|
225
|
+
@streaming.backfill(
|
|
226
|
+
feature_set_name="user_streaming_agg_features",
|
|
227
|
+
start_date=datetime(2022,1,1,0,0,0),
|
|
228
|
+
end_date=datetime(2023,9,1,0,0,0),
|
|
229
|
+
data_sources=[BackfillDataSource(data_source_name="backfill_data_source",
|
|
230
|
+
start_datetime=datetime(2023,1,1,0,0,0),
|
|
231
|
+
end_datetime=datetime(2023,8,1,0,0,0))],
|
|
232
|
+
backfill_cluster_template=ClusterTemplate.SMALL
|
|
233
|
+
)
|
|
234
|
+
def backfill_transformation():
|
|
235
|
+
return SparkSqlTransformation("SELECT user_id, reg_country, reg_date FROM backfill_data_source")
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
def decorator(function):
|
|
239
|
+
if isinstance(function, StreamingFeatureSet):
|
|
240
|
+
raise QwakException(
|
|
241
|
+
"Backfill can no longer be defined as a decorator on the feature set, it must be triggered after feature set creation."
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
backfill_transformation: SparkSqlTransformation = function()
|
|
245
|
+
|
|
246
|
+
if not isinstance(backfill_transformation, SparkSqlTransformation):
|
|
247
|
+
raise QwakException(
|
|
248
|
+
"Backfill must defined on a method returning a SparkSqlTransformation"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
streaming_backfill = StreamingBackfill(
|
|
252
|
+
featureset_name=feature_set_name,
|
|
253
|
+
start_datetime=start_date,
|
|
254
|
+
end_datetime=end_date,
|
|
255
|
+
data_sources=StreamingBackfill._get_normalized_backfill_sources_spec(
|
|
256
|
+
data_sources
|
|
257
|
+
),
|
|
258
|
+
transform=backfill_transformation,
|
|
259
|
+
cluster_template=backfill_cluster_template,
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
functools.update_wrapper(streaming_backfill, backfill_transformation)
|
|
263
|
+
|
|
264
|
+
return streaming_backfill
|
|
265
|
+
|
|
266
|
+
return decorator
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
@typechecked
|
|
270
|
+
def metadata(
|
|
271
|
+
*,
|
|
272
|
+
owner: Optional[str] = None,
|
|
273
|
+
description: Optional[str] = None,
|
|
274
|
+
display_name: Optional[str] = None,
|
|
275
|
+
version_comment: Optional[str] = None,
|
|
276
|
+
):
|
|
277
|
+
"""
|
|
278
|
+
Sets additional user provided metadata
|
|
279
|
+
|
|
280
|
+
:param owner: feature set owner
|
|
281
|
+
:param description: General description of the feature set
|
|
282
|
+
:param display_name: Human readable name of the feature set
|
|
283
|
+
:param version_comment: Comment which describes the version
|
|
284
|
+
|
|
285
|
+
Example:
|
|
286
|
+
|
|
287
|
+
... code-block:: python
|
|
288
|
+
|
|
289
|
+
@streaming.feature_set(
|
|
290
|
+
entity="users",
|
|
291
|
+
data_sources=["users_registration_stream"],
|
|
292
|
+
timestamp_column_name="reg_date"
|
|
293
|
+
)
|
|
294
|
+
@streaming.metadata(
|
|
295
|
+
owner="datainfra@qwak.com",
|
|
296
|
+
display_name="User Streaming Features",
|
|
297
|
+
description="Users feature from the Kafka topic of users registration stream",
|
|
298
|
+
)
|
|
299
|
+
def user_streaming_features():
|
|
300
|
+
return SparkSqlTransformation("SELECT user_id, reg_country, reg_date FROM data_source")
|
|
301
|
+
|
|
302
|
+
"""
|
|
303
|
+
|
|
304
|
+
def decorator(function):
|
|
305
|
+
_validate_decorator_ordering(function)
|
|
306
|
+
set_metadata_on_function(
|
|
307
|
+
function=function,
|
|
308
|
+
owner=owner,
|
|
309
|
+
description=description,
|
|
310
|
+
display_name=display_name,
|
|
311
|
+
version_comment=version_comment,
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
return function
|
|
315
|
+
|
|
316
|
+
return decorator
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def _validate_decorator_ordering(function):
|
|
320
|
+
if isinstance(function, StreamingFeatureSet):
|
|
321
|
+
raise ValueError(
|
|
322
|
+
"Wrong decorator ordering - @streaming.feature_set should be the top most decorator"
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
@dataclass
|
|
327
|
+
class StreamingFeatureSet(BaseFeatureSet):
|
|
328
|
+
timestamp_column_name: str = str()
|
|
329
|
+
online_trigger_interval: int = int()
|
|
330
|
+
offline_scheduling_policy: str = str()
|
|
331
|
+
transformation: Optional[BaseTransformation] = None
|
|
332
|
+
offline_cluster_template: Optional[ClusterTemplate] = None
|
|
333
|
+
online_cluster_template: Optional[ClusterTemplate] = None
|
|
334
|
+
metadata: Optional[Metadata] = None
|
|
335
|
+
backfill_max_timestamp: Optional[datetime] = None
|
|
336
|
+
auxiliary_sinks: List[BaseSink] = field(default_factory=lambda: [])
|
|
337
|
+
|
|
338
|
+
def __post_init__(self):
|
|
339
|
+
self._validate()
|
|
340
|
+
|
|
341
|
+
@classmethod
|
|
342
|
+
def _from_proto(cls, proto: ProtoFeatureSetSpec):
|
|
343
|
+
streaming_def: ProtoStreamingFeatureSetV1 = (
|
|
344
|
+
proto.feature_set_type.streaming_feature_set_v1
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
return cls(
|
|
348
|
+
name=proto.name,
|
|
349
|
+
repository=proto.featureset_repository_name,
|
|
350
|
+
entity=Entity._from_proto(proto.entity).name,
|
|
351
|
+
data_sources=[ds.name for ds in streaming_def.data_sources],
|
|
352
|
+
timestamp_column_name=streaming_def.timestamp_column_name,
|
|
353
|
+
online_trigger_interval=streaming_def.online_trigger_interval,
|
|
354
|
+
offline_scheduling_policy=streaming_def.offline_scheduling_policy,
|
|
355
|
+
transformation=BaseTransformation._from_proto(streaming_def.transformation),
|
|
356
|
+
offline_cluster_template=ClusterTemplate.from_cluster_template_number(
|
|
357
|
+
streaming_def.execution_spec.offline_cluster_template
|
|
358
|
+
),
|
|
359
|
+
online_cluster_template=ClusterTemplate.from_cluster_template_number(
|
|
360
|
+
streaming_def.execution_spec.online_cluster_template
|
|
361
|
+
),
|
|
362
|
+
metadata=Metadata.from_proto(proto.metadata),
|
|
363
|
+
auxiliary_sinks=[
|
|
364
|
+
StreamingSinkFactory.get_streaming_sink(proto)
|
|
365
|
+
for proto in streaming_def.auxiliary_sinks
|
|
366
|
+
],
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
def _get_data_sources(
|
|
370
|
+
self, feature_registry: FeatureRegistryClient
|
|
371
|
+
) -> List[ProtoStreamingSource]:
|
|
372
|
+
sources: List[ProtoStreamingSource] = list()
|
|
373
|
+
|
|
374
|
+
for name in self.data_sources:
|
|
375
|
+
ds = feature_registry.get_data_source_by_name(name)
|
|
376
|
+
if not ds:
|
|
377
|
+
raise QwakException(
|
|
378
|
+
f"Trying to register a featureset with a non existing data source {name}"
|
|
379
|
+
)
|
|
380
|
+
else:
|
|
381
|
+
sources.append(
|
|
382
|
+
ds.data_source.data_source_definition.data_source_spec.stream_source
|
|
383
|
+
)
|
|
384
|
+
return sources
|
|
385
|
+
|
|
386
|
+
def _to_proto(
|
|
387
|
+
self,
|
|
388
|
+
git_commit,
|
|
389
|
+
features,
|
|
390
|
+
feature_registry: FeatureRegistryClient,
|
|
391
|
+
artifact_url: Optional[str] = None,
|
|
392
|
+
**kwargs,
|
|
393
|
+
) -> Tuple[ProtoFeatureSetSpec, Optional[str]]:
|
|
394
|
+
maybe_initial_tile_size: Optional[int] = self._validate_streaming_aggregation()
|
|
395
|
+
|
|
396
|
+
data_sources: List[StreamingSource] = self._get_data_sources(feature_registry)
|
|
397
|
+
|
|
398
|
+
if not artifact_url:
|
|
399
|
+
artifact: Optional[ArtifactSpec] = ArtifactsUploader.get_artifact_spec(
|
|
400
|
+
transformation=self.transformation,
|
|
401
|
+
featureset_name=self.name,
|
|
402
|
+
__instance_module_path__=self.__instance_module_path__,
|
|
403
|
+
)
|
|
404
|
+
if artifact:
|
|
405
|
+
artifact_url = ArtifactsUploader.upload(artifact)
|
|
406
|
+
|
|
407
|
+
proto_featureset_type: ProtoFeatureSetType
|
|
408
|
+
if maybe_initial_tile_size is None:
|
|
409
|
+
# row-level streaming
|
|
410
|
+
proto_featureset_type = self._get_streaming_featureset_proto(
|
|
411
|
+
artifact_url=artifact_url, streaming_sources=data_sources
|
|
412
|
+
)
|
|
413
|
+
else:
|
|
414
|
+
# streaming aggregation
|
|
415
|
+
proto_featureset_type = self._get_streaming_aggregation_featureset_proto(
|
|
416
|
+
artifact_url=artifact_url,
|
|
417
|
+
streaming_sources=data_sources,
|
|
418
|
+
initial_tile_size=maybe_initial_tile_size,
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
return (
|
|
422
|
+
ProtoFeatureSetSpec(
|
|
423
|
+
name=self.name,
|
|
424
|
+
metadata=self.metadata.to_proto(),
|
|
425
|
+
git_commit=git_commit,
|
|
426
|
+
features=features,
|
|
427
|
+
entity=self._get_entity_definition(feature_registry),
|
|
428
|
+
feature_set_type=proto_featureset_type,
|
|
429
|
+
featureset_repository_name=self.repository,
|
|
430
|
+
),
|
|
431
|
+
artifact_url,
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
def _validate(self):
|
|
435
|
+
import croniter
|
|
436
|
+
|
|
437
|
+
super()._validate()
|
|
438
|
+
|
|
439
|
+
# verify offline_scheduling_policy was set
|
|
440
|
+
if not self.offline_scheduling_policy:
|
|
441
|
+
raise QwakException("'offline_scheduling_policy' field must be set")
|
|
442
|
+
|
|
443
|
+
# verify the cron expression is valid
|
|
444
|
+
if not croniter.croniter.is_valid(self.offline_scheduling_policy):
|
|
445
|
+
raise QwakException(
|
|
446
|
+
f"offline scheduling policy "
|
|
447
|
+
f"'{self.offline_scheduling_policy}'"
|
|
448
|
+
f" is not a valid cron expression"
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
# verify the online scheduling policy is valid
|
|
452
|
+
if self.online_trigger_interval < 0:
|
|
453
|
+
raise QwakException(
|
|
454
|
+
f"Value '{self.online_trigger_interval}'"
|
|
455
|
+
f" is not a legal online scheduling policy, "
|
|
456
|
+
f"only non-negative integers are allowed"
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
# verify timestamp_col_name was set
|
|
460
|
+
if not self.timestamp_column_name:
|
|
461
|
+
raise QwakException("'timestamp_col_name' field must be set")
|
|
462
|
+
|
|
463
|
+
is_streaming_agg = bool(self._validate_streaming_aggregation())
|
|
464
|
+
|
|
465
|
+
# if sinks were configured, make sure it's not streaming-agg
|
|
466
|
+
if len(self.auxiliary_sinks) > 0 and is_streaming_agg:
|
|
467
|
+
raise QwakException(
|
|
468
|
+
"Auxiliary Sinks Are not supported in Streaming Aggregation Feature Sets"
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
if self.backfill_max_timestamp and not is_streaming_agg:
|
|
472
|
+
raise QwakException(
|
|
473
|
+
"backfill_max_timestamp can only be set for Streaming Aggregation FeatureSet."
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
# Validate transformation is PySpark when multiple data sources are used
|
|
477
|
+
if len(self.data_sources) > 1 and not isinstance(
|
|
478
|
+
self.transformation, PySparkTransformation
|
|
479
|
+
):
|
|
480
|
+
raise QwakException(
|
|
481
|
+
"When using multiple data sources, only `PySparkTransformation` is allowed."
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
def _validate_streaming_aggregation(self) -> Optional[int]:
|
|
485
|
+
if not (self.transformation.windows or self.transformation.aggregations):
|
|
486
|
+
# definitely not streaming aggregation
|
|
487
|
+
return None
|
|
488
|
+
|
|
489
|
+
# at least 1 window and/or at least 1 aggregate - so we need to verify
|
|
490
|
+
# it's a valid streaming aggregation definition
|
|
491
|
+
if not self.transformation.windows:
|
|
492
|
+
raise QwakException(
|
|
493
|
+
"When specifying aggregations, at least one time window must be defined"
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
if not self.transformation.aggregations:
|
|
497
|
+
raise QwakException(
|
|
498
|
+
"When specifying time windows, at least one aggregation must be defined"
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
(
|
|
502
|
+
initial_tile_size,
|
|
503
|
+
min_window,
|
|
504
|
+
) = StreamingFeatureSet._get_default_slide_period(self.transformation.windows)
|
|
505
|
+
|
|
506
|
+
if initial_tile_size > max(10.0, (min_window / 10)):
|
|
507
|
+
raise QwakException(
|
|
508
|
+
"Windows with such different cardinality (For example years vs days) can't be in "
|
|
509
|
+
"the same feature set. Please separate to different feature sets."
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
# Validate no feature duplications exist
|
|
513
|
+
|
|
514
|
+
# Get feature names, with or without aliases
|
|
515
|
+
final_feature_names = self.transformation.get_features_names()
|
|
516
|
+
|
|
517
|
+
# Look for duplicated feature names
|
|
518
|
+
group_by_feature_name_to_count = collections.Counter(final_feature_names)
|
|
519
|
+
features_with_duplicates = [
|
|
520
|
+
feature
|
|
521
|
+
for feature, count in group_by_feature_name_to_count.items()
|
|
522
|
+
if count > 1
|
|
523
|
+
]
|
|
524
|
+
if features_with_duplicates:
|
|
525
|
+
error_message_str = ""
|
|
526
|
+
for dup in features_with_duplicates:
|
|
527
|
+
error_message_str += (
|
|
528
|
+
f"{repr(dup)} feature, appears more than once in Aggregations.\n"
|
|
529
|
+
)
|
|
530
|
+
raise QwakException(error_message_str)
|
|
531
|
+
|
|
532
|
+
if not self.backfill_max_timestamp:
|
|
533
|
+
raise QwakException(
|
|
534
|
+
"""
|
|
535
|
+
backfill_max_timestamp must be set for Streaming Aggregation FeatureSet.
|
|
536
|
+
Events earlier than this timestamp can only be processed by triggering backfill,
|
|
537
|
+
the Streaming job will not process events that are earlier than this timestamp.
|
|
538
|
+
"""
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
self._validate_streaming_aggregation_backfill_max_timestamp()
|
|
542
|
+
|
|
543
|
+
return initial_tile_size
|
|
544
|
+
|
|
545
|
+
def _validate_streaming_aggregation_backfill_max_timestamp(self):
|
|
546
|
+
initial_tile_size, _ = StreamingFeatureSet._get_default_slide_period(
|
|
547
|
+
self.transformation.windows
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
if self.backfill_max_timestamp.timestamp() % initial_tile_size != 0:
|
|
551
|
+
raise QwakException(
|
|
552
|
+
f"Chosen backfill max timestamp is invalid,"
|
|
553
|
+
f" it has to be exactly dividable by slice size of {initial_tile_size} seconds."
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
@staticmethod
|
|
557
|
+
def _get_default_slide_period(
|
|
558
|
+
windows: List[Window], minimum_time_window_seconds: int = 10
|
|
559
|
+
):
|
|
560
|
+
"""
|
|
561
|
+
Tile size is the max between the `minimum_time_window_seconds`,
|
|
562
|
+
and the round down of the max window size divided by 2048.
|
|
563
|
+
By dividing by 2048 we promise that the max aggregation time contains
|
|
564
|
+
up to 2048 different tiles, which limit the amount of keys that exists in the Online Store.
|
|
565
|
+
:param windows:
|
|
566
|
+
:param minimum_time_window_seconds:
|
|
567
|
+
:return: tuple of tile size and the minimum window size seconds
|
|
568
|
+
"""
|
|
569
|
+
time_windows_in_seconds = [w.length * w.seconds_in_time_unit for w in windows]
|
|
570
|
+
max_window = max(time_windows_in_seconds)
|
|
571
|
+
min_window = min(time_windows_in_seconds)
|
|
572
|
+
|
|
573
|
+
if min_window < minimum_time_window_seconds:
|
|
574
|
+
raise QwakException(
|
|
575
|
+
f"The minimum time window is {minimum_time_window_seconds} seconds"
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
def round(k):
|
|
579
|
+
return k - (k % minimum_time_window_seconds)
|
|
580
|
+
|
|
581
|
+
initial_tile_size = round(max((max_window / 2048), minimum_time_window_seconds))
|
|
582
|
+
|
|
583
|
+
return int(initial_tile_size), min_window
|
|
584
|
+
|
|
585
|
+
def get_sample(
|
|
586
|
+
self,
|
|
587
|
+
number_of_rows: int = 10,
|
|
588
|
+
validation_options: Optional[FeatureSetValidationOptions] = None,
|
|
589
|
+
) -> "pd.DataFrame":
|
|
590
|
+
return super().get_sample(
|
|
591
|
+
number_of_rows=number_of_rows, validation_options=validation_options
|
|
592
|
+
)
|
|
593
|
+
|
|
594
|
+
def _get_streaming_featureset_proto(
|
|
595
|
+
self, artifact_url: Optional[str], streaming_sources: List[StreamingSource]
|
|
596
|
+
) -> ProtoFeatureSetType:
|
|
597
|
+
return ProtoFeatureSetType(
|
|
598
|
+
streaming_feature_set_v1=ProtoStreamingFeatureSetV1(
|
|
599
|
+
transformation=self.transformation._to_proto(
|
|
600
|
+
artifact_path=artifact_url
|
|
601
|
+
),
|
|
602
|
+
data_sources=streaming_sources,
|
|
603
|
+
execution_spec=ProtoStreamingExecutionSpec(
|
|
604
|
+
online_cluster_template=ClusterTemplate.to_proto(
|
|
605
|
+
self.online_cluster_template
|
|
606
|
+
),
|
|
607
|
+
offline_cluster_template=ClusterTemplate.to_proto(
|
|
608
|
+
self.offline_cluster_template
|
|
609
|
+
),
|
|
610
|
+
),
|
|
611
|
+
timestamp_column_name=self.timestamp_column_name,
|
|
612
|
+
online_trigger_interval=self.online_trigger_interval,
|
|
613
|
+
offline_scheduling_policy=self.offline_scheduling_policy,
|
|
614
|
+
auxiliary_sinks=[
|
|
615
|
+
s.to_proto_streaming_sink() for s in self.auxiliary_sinks
|
|
616
|
+
],
|
|
617
|
+
)
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
def _get_streaming_aggregation_featureset_proto(
|
|
621
|
+
self,
|
|
622
|
+
artifact_url: Optional[str],
|
|
623
|
+
streaming_sources: List[StreamingSource],
|
|
624
|
+
initial_tile_size: int,
|
|
625
|
+
) -> ProtoFeatureSetType:
|
|
626
|
+
backfill_max_timestamp = ProtoTimestamp()
|
|
627
|
+
backfill_max_timestamp.FromDatetime(
|
|
628
|
+
self.backfill_max_timestamp.astimezone(timezone.utc)
|
|
629
|
+
)
|
|
630
|
+
return ProtoFeatureSetType(
|
|
631
|
+
streaming_aggregation_feature_set=ProtoStreamingAggregationFeatureSet(
|
|
632
|
+
transformation=self.transformation._to_proto(
|
|
633
|
+
artifact_path=artifact_url
|
|
634
|
+
),
|
|
635
|
+
data_sources=streaming_sources,
|
|
636
|
+
execution_spec=ProtoStreamingExecutionSpec(
|
|
637
|
+
online_cluster_template=ClusterTemplate.to_proto(
|
|
638
|
+
self.online_cluster_template
|
|
639
|
+
),
|
|
640
|
+
offline_cluster_template=ClusterTemplate.to_proto(
|
|
641
|
+
self.offline_cluster_template
|
|
642
|
+
),
|
|
643
|
+
),
|
|
644
|
+
timestamp_column_name=self.timestamp_column_name,
|
|
645
|
+
online_trigger_interval=self.online_trigger_interval,
|
|
646
|
+
compaction_scheduling_policy=self.offline_scheduling_policy,
|
|
647
|
+
aggregation_spec=ProtoAggregationSpec(
|
|
648
|
+
slide_seconds=initial_tile_size,
|
|
649
|
+
allowed_late_arrival_seconds=60 * 10,
|
|
650
|
+
aggregations=self.transformation._get_aggregations_proto(),
|
|
651
|
+
),
|
|
652
|
+
backfill_spec=None,
|
|
653
|
+
backfill_max_timestamp=backfill_max_timestamp,
|
|
654
|
+
)
|
|
655
|
+
)
|