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,98 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from qwak.inner.const import QwakConstants
|
|
6
|
+
from qwak.inner.di_configuration import QwakContainer
|
|
7
|
+
from qwak.inner.tool.grpc.grpc_tools import validate_grpc_address
|
|
8
|
+
from qwak.tools.logger import get_qwak_logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
logger = get_qwak_logger()
|
|
12
|
+
|
|
13
|
+
__DEFAULT_CONFIG_FILE_PATH: Path = Path(__file__).parent / "config.yml"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def wire_dependencies():
|
|
17
|
+
container = QwakContainer()
|
|
18
|
+
|
|
19
|
+
container.config.from_yaml(__DEFAULT_CONFIG_FILE_PATH)
|
|
20
|
+
control_plane_grpc_address_override: Optional[str] = os.getenv(
|
|
21
|
+
QwakConstants.CONTROL_PLANE_GRPC_ADDRESS_ENVAR_NAME
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if control_plane_grpc_address_override:
|
|
25
|
+
validate_grpc_address(control_plane_grpc_address_override)
|
|
26
|
+
__override_control_plane_grpc_address(
|
|
27
|
+
container, control_plane_grpc_address_override
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
from qwak.clients import (
|
|
31
|
+
administration,
|
|
32
|
+
alert_management,
|
|
33
|
+
alerts_registry,
|
|
34
|
+
analytics,
|
|
35
|
+
audience,
|
|
36
|
+
automation_management,
|
|
37
|
+
autoscaling,
|
|
38
|
+
batch_job_management,
|
|
39
|
+
build_orchestrator,
|
|
40
|
+
data_versioning,
|
|
41
|
+
deployment,
|
|
42
|
+
feature_store,
|
|
43
|
+
file_versioning,
|
|
44
|
+
instance_template,
|
|
45
|
+
integration_management,
|
|
46
|
+
kube_deployment_captain,
|
|
47
|
+
logging_client,
|
|
48
|
+
model_management,
|
|
49
|
+
project,
|
|
50
|
+
prompt_manager,
|
|
51
|
+
system_secret,
|
|
52
|
+
user_application_instance,
|
|
53
|
+
vector_store,
|
|
54
|
+
workspace_manager,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
container.wire(
|
|
58
|
+
packages=[
|
|
59
|
+
administration,
|
|
60
|
+
alert_management,
|
|
61
|
+
audience,
|
|
62
|
+
automation_management,
|
|
63
|
+
autoscaling,
|
|
64
|
+
analytics,
|
|
65
|
+
batch_job_management,
|
|
66
|
+
build_orchestrator,
|
|
67
|
+
data_versioning,
|
|
68
|
+
deployment,
|
|
69
|
+
file_versioning,
|
|
70
|
+
instance_template,
|
|
71
|
+
kube_deployment_captain,
|
|
72
|
+
logging_client,
|
|
73
|
+
model_management,
|
|
74
|
+
project,
|
|
75
|
+
feature_store,
|
|
76
|
+
user_application_instance,
|
|
77
|
+
alerts_registry,
|
|
78
|
+
workspace_manager,
|
|
79
|
+
vector_store,
|
|
80
|
+
integration_management,
|
|
81
|
+
system_secret,
|
|
82
|
+
prompt_manager,
|
|
83
|
+
]
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
return container
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def __override_control_plane_grpc_address(
|
|
90
|
+
container: "QwakContainer", control_plane_grpc_address_override: str
|
|
91
|
+
):
|
|
92
|
+
logger.debug(
|
|
93
|
+
"Overriding control plane gRPC address from environment variable to %s.",
|
|
94
|
+
control_plane_grpc_address_override,
|
|
95
|
+
)
|
|
96
|
+
container.config.grpc.core.address.from_value(
|
|
97
|
+
control_plane_grpc_address_override.strip()
|
|
98
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from _qwak_proto.qwak.instance_template.instance_template_pb2 import InstanceType
|
|
4
|
+
from qwak.clients.instance_template.client import InstanceTemplateManagementClient
|
|
5
|
+
from qwak.exceptions import QwakException
|
|
6
|
+
from qwak.inner.provider import Provider
|
|
7
|
+
|
|
8
|
+
INVALID_TEMPLATE_ID_ERROR_FORMAT = (
|
|
9
|
+
"Invalid instance: {template_id}. Valid instances are: {cpu_templates}. "
|
|
10
|
+
"For GPU instances you can use {gpu_templates}."
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def verify_template_id(
|
|
15
|
+
template_id: str,
|
|
16
|
+
instance_template_client: InstanceTemplateManagementClient,
|
|
17
|
+
provider: Optional[Provider] = None,
|
|
18
|
+
) -> None:
|
|
19
|
+
all_templates = instance_template_client.list_instance_templates()
|
|
20
|
+
valid_templates = [template for template in all_templates if template.enabled]
|
|
21
|
+
if provider == Provider.AWS:
|
|
22
|
+
valid_templates = [
|
|
23
|
+
template for template in valid_templates if template.aws_supported
|
|
24
|
+
]
|
|
25
|
+
elif provider == Provider.GCP:
|
|
26
|
+
valid_templates = [
|
|
27
|
+
template for template in valid_templates if template.gcp_supported
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
existing_templates = {template.id: template for template in valid_templates}
|
|
31
|
+
if template_id not in existing_templates.keys():
|
|
32
|
+
cpu_template_ids = [
|
|
33
|
+
template.id
|
|
34
|
+
for template in sorted(valid_templates, key=lambda template: template.order)
|
|
35
|
+
if template.instance_type == InstanceType.INSTANCE_TYPE_CPU
|
|
36
|
+
]
|
|
37
|
+
gpu_template_ids = [
|
|
38
|
+
template.id
|
|
39
|
+
for template in sorted(valid_templates, key=lambda template: template.order)
|
|
40
|
+
if template.instance_type == InstanceType.INSTANCE_TYPE_GPU
|
|
41
|
+
]
|
|
42
|
+
raise QwakException(
|
|
43
|
+
INVALID_TEMPLATE_ID_ERROR_FORMAT.format(
|
|
44
|
+
template_id=template_id,
|
|
45
|
+
cpu_templates=", ".join(cpu_template_ids),
|
|
46
|
+
gpu_templates=", ".join(gpu_template_ids),
|
|
47
|
+
)
|
|
48
|
+
)
|
|
@@ -3,6 +3,7 @@ import re
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
|
+
|
|
6
7
|
from qwak.clients.model_management.client import ModelsManagementClient
|
|
7
8
|
from qwak.exceptions import QwakException
|
|
8
9
|
|
|
@@ -67,23 +68,25 @@ def fetch_build_id() -> Optional[str]:
|
|
|
67
68
|
def upload_data(
|
|
68
69
|
upload_url: str,
|
|
69
70
|
data: bytes,
|
|
71
|
+
headers: dict,
|
|
70
72
|
content_type: str = "text/plain",
|
|
71
|
-
)
|
|
73
|
+
):
|
|
72
74
|
"""
|
|
73
75
|
Upload data
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
:param upload_url: the url to upload to.
|
|
77
|
+
:param data: the data to upload
|
|
78
|
+
:param headers: authentication details for upload data
|
|
79
|
+
:param content_type: Uploaded content-type
|
|
78
80
|
"""
|
|
79
81
|
try:
|
|
82
|
+
headers["Content-Type"] = content_type
|
|
80
83
|
http_response = requests.put( # nosec B113
|
|
81
84
|
upload_url,
|
|
82
85
|
data=data,
|
|
83
|
-
headers=
|
|
86
|
+
headers=headers,
|
|
84
87
|
)
|
|
85
88
|
|
|
86
|
-
if http_response.status_code
|
|
89
|
+
if http_response.status_code not in [200, 201]:
|
|
87
90
|
raise QwakException(
|
|
88
91
|
f"Failed to upload data. "
|
|
89
92
|
f"Status: [{http_response.status_code}], "
|
qwak/inner/provider.py
ADDED
qwak/inner/tool/auth.py
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import warnings
|
|
2
|
+
from filelock import FileLock
|
|
2
3
|
|
|
3
4
|
from qwak.inner.di_configuration.session import Session
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from typing import Optional
|
|
4
7
|
|
|
5
8
|
warnings.filterwarnings(action="ignore", module=".*jose.*")
|
|
6
9
|
|
|
@@ -13,12 +16,29 @@ from qwak.exceptions import QwakLoginException # noqa E402
|
|
|
13
16
|
from qwak.inner.const import QwakConstants # noqa E402
|
|
14
17
|
|
|
15
18
|
|
|
16
|
-
class
|
|
19
|
+
class BaseAuthClient(ABC):
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def get_token(self) -> Optional[str]:
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def login(self) -> None:
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def get_base_url(self) -> str:
|
|
30
|
+
"""
|
|
31
|
+
Returns the base URL for the authentication service.
|
|
32
|
+
"""
|
|
33
|
+
return ""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Auth0ClientBase(BaseAuthClient):
|
|
17
37
|
_TOKENS_FIELD = "TOKENS"
|
|
18
38
|
|
|
19
39
|
def __init__(
|
|
20
40
|
self,
|
|
21
|
-
api_key,
|
|
41
|
+
api_key=None,
|
|
22
42
|
auth_file=QwakConstants.QWAK_AUTHORIZATION_FILE,
|
|
23
43
|
audience=QwakConstants.TOKEN_AUDIENCE,
|
|
24
44
|
):
|
|
@@ -30,8 +50,15 @@ class Auth0ClientBase:
|
|
|
30
50
|
self.audience = audience
|
|
31
51
|
self.api_key = api_key
|
|
32
52
|
|
|
53
|
+
def get_base_url(self) -> str:
|
|
54
|
+
return QwakConstants.QWAK_APP_URL
|
|
55
|
+
|
|
33
56
|
# Returns Non if token is expired
|
|
34
57
|
def get_token(self):
|
|
58
|
+
if self._environment != Session().get_environment():
|
|
59
|
+
self.token = None
|
|
60
|
+
self.api_key = None
|
|
61
|
+
self._environment = Session().get_environment()
|
|
35
62
|
try:
|
|
36
63
|
if not self.token:
|
|
37
64
|
self._config.read(self._auth_file)
|
|
@@ -54,6 +81,12 @@ class Auth0ClientBase:
|
|
|
54
81
|
def login(self):
|
|
55
82
|
from qwak.clients.administration import AuthenticationClient
|
|
56
83
|
|
|
84
|
+
if not self.api_key:
|
|
85
|
+
from qwak.inner.di_configuration import UserAccountConfiguration
|
|
86
|
+
|
|
87
|
+
user_account = UserAccountConfiguration().get_user_config()
|
|
88
|
+
self.api_key = user_account.api_key
|
|
89
|
+
|
|
57
90
|
self.token = AuthenticationClient().authenticate(self.api_key).access_token
|
|
58
91
|
|
|
59
92
|
from pathlib import Path
|
|
@@ -61,12 +94,14 @@ class Auth0ClientBase:
|
|
|
61
94
|
Path(self._auth_file).parent.mkdir(parents=True, exist_ok=True)
|
|
62
95
|
self._config.read(self._auth_file)
|
|
63
96
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
97
|
+
lock_path = f"{self._auth_file}.lock" # Create a lock file
|
|
98
|
+
with FileLock(lock_path): # Use file lock
|
|
99
|
+
with open(self._auth_file, "w") as configfile:
|
|
100
|
+
self._config[self._environment] = {
|
|
101
|
+
self._TOKENS_FIELD: json.dumps(self.token)
|
|
102
|
+
}
|
|
68
103
|
|
|
69
|
-
|
|
104
|
+
self._config.write(configfile)
|
|
70
105
|
|
|
71
106
|
def get_claims(self):
|
|
72
107
|
try:
|
|
@@ -1,17 +1,36 @@
|
|
|
1
|
+
from typing import Callable, Tuple
|
|
2
|
+
|
|
1
3
|
import grpc
|
|
2
|
-
from qwak.inner.tool.auth import Auth0ClientBase
|
|
3
4
|
|
|
4
5
|
_SIGNATURE_HEADER_KEY = "authorization"
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
class Auth0Client(grpc.AuthMetadataPlugin
|
|
8
|
+
class Auth0Client(grpc.AuthMetadataPlugin):
|
|
8
9
|
def __init__(self):
|
|
9
|
-
|
|
10
|
+
self._auth_client = None
|
|
11
|
+
|
|
12
|
+
def __call__(
|
|
13
|
+
self,
|
|
14
|
+
context: grpc.AuthMetadataContext,
|
|
15
|
+
callback: Callable[[Tuple[Tuple[str, str]], None], None],
|
|
16
|
+
):
|
|
17
|
+
"""Implements authentication by passing metadata to a callback.
|
|
10
18
|
|
|
11
|
-
|
|
12
|
-
|
|
19
|
+
Args:
|
|
20
|
+
context: An AuthMetadataContext providing information on the RPC that
|
|
21
|
+
the plugin is being called to authenticate.
|
|
22
|
+
callback: A callback that accepts a tuple of metadata key/value pairs and a None
|
|
23
|
+
parameter.
|
|
24
|
+
"""
|
|
25
|
+
# Get token from Auth0 client
|
|
26
|
+
token = self.get_token()
|
|
27
|
+
metadata = ((_SIGNATURE_HEADER_KEY, f"Bearer {token}"),)
|
|
28
|
+
callback(metadata, None)
|
|
13
29
|
|
|
14
|
-
|
|
30
|
+
def get_token(self) -> str:
|
|
31
|
+
"""Get the authentication token."""
|
|
32
|
+
if not self._auth_client:
|
|
33
|
+
from qwak.inner.tool.auth import Auth0ClientBase
|
|
15
34
|
|
|
16
|
-
|
|
17
|
-
|
|
35
|
+
self._auth_client = Auth0ClientBase()
|
|
36
|
+
return self._auth_client.get_token()
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import re
|
|
2
3
|
import time
|
|
3
4
|
from abc import ABC, abstractmethod
|
|
4
5
|
from random import randint
|
|
5
|
-
from typing import Optional, Tuple
|
|
6
|
+
from typing import Callable, Optional, Tuple
|
|
7
|
+
from urllib.parse import urlparse, ParseResult
|
|
6
8
|
|
|
7
9
|
import grpc
|
|
8
|
-
from qwak.exceptions import QwakException
|
|
9
10
|
|
|
11
|
+
from qwak.exceptions import QwakException, QwakGrpcAddressException
|
|
10
12
|
from .grpc_auth import Auth0Client
|
|
11
13
|
|
|
12
14
|
logger = logging.getLogger()
|
|
15
|
+
HOSTNAME_REGEX: str = r"^(?!-)(?:[A-Za-z0-9-]{1,63}\.)*[A-Za-z0-9-]{1,63}(?<!-)$"
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
def create_grpc_channel(
|
|
@@ -19,7 +22,7 @@ def create_grpc_channel(
|
|
|
19
22
|
auth_metadata_plugin: grpc.AuthMetadataPlugin = None,
|
|
20
23
|
timeout: int = 100,
|
|
21
24
|
options=None,
|
|
22
|
-
backoff_options=
|
|
25
|
+
backoff_options=None,
|
|
23
26
|
max_attempts=4,
|
|
24
27
|
status_for_retry=(grpc.StatusCode.UNAVAILABLE,),
|
|
25
28
|
attempt=0,
|
|
@@ -40,6 +43,9 @@ def create_grpc_channel(
|
|
|
40
43
|
status_for_retry: grpc statuses to retry upon
|
|
41
44
|
Returns: Returns a grpc.Channel
|
|
42
45
|
"""
|
|
46
|
+
if backoff_options is None:
|
|
47
|
+
backoff_options = {}
|
|
48
|
+
|
|
43
49
|
if not url:
|
|
44
50
|
raise QwakException("Unable to create gRPC channel. URL has not been defined.")
|
|
45
51
|
|
|
@@ -101,11 +107,14 @@ def create_grpc_channel_or_none(
|
|
|
101
107
|
auth_metadata_plugin: grpc.AuthMetadataPlugin = None,
|
|
102
108
|
timeout: int = 30,
|
|
103
109
|
options=None,
|
|
104
|
-
backoff_options=
|
|
110
|
+
backoff_options=None,
|
|
105
111
|
max_attempts=2,
|
|
106
112
|
status_for_retry=(grpc.StatusCode.UNAVAILABLE,),
|
|
107
113
|
attempt=0,
|
|
108
114
|
) -> Callable[[Optional[str], Optional[bool]], Optional[grpc.Channel]]:
|
|
115
|
+
if backoff_options is None:
|
|
116
|
+
backoff_options = {}
|
|
117
|
+
|
|
109
118
|
def deferred_channel(
|
|
110
119
|
url_overwrite: Optional[str] = None, ssl_overwrite: Optional[bool] = None
|
|
111
120
|
):
|
|
@@ -129,6 +138,117 @@ def create_grpc_channel_or_none(
|
|
|
129
138
|
return deferred_channel
|
|
130
139
|
|
|
131
140
|
|
|
141
|
+
def validate_grpc_address(
|
|
142
|
+
grpc_address: str,
|
|
143
|
+
is_port_specification_allowed: bool = False,
|
|
144
|
+
is_url_scheme_allowed: bool = False,
|
|
145
|
+
):
|
|
146
|
+
"""
|
|
147
|
+
Validate gRPC address format
|
|
148
|
+
Args:
|
|
149
|
+
grpc_address (str): gRPC address to validate
|
|
150
|
+
is_port_specification_allowed (bool): Whether to allow port specification in the address
|
|
151
|
+
is_url_scheme_allowed (bool): Whether to allow URL scheme in the address
|
|
152
|
+
Raises:
|
|
153
|
+
QwakGrpcAddressException: If the gRPC address is invalid
|
|
154
|
+
"""
|
|
155
|
+
parsed_grpc_address: ParseResult = parse_address(grpc_address)
|
|
156
|
+
hostname: str = get_hostname_from_address(parsed_grpc_address)
|
|
157
|
+
validate_paths_are_not_included_in_address(parsed_grpc_address)
|
|
158
|
+
|
|
159
|
+
if not is_url_scheme_allowed:
|
|
160
|
+
__validate_url_scheme_not_included_in_address(parsed_grpc_address)
|
|
161
|
+
|
|
162
|
+
if not is_port_specification_allowed:
|
|
163
|
+
__validate_port_not_included_in_address(parsed_grpc_address)
|
|
164
|
+
|
|
165
|
+
if not is_valid_hostname(hostname):
|
|
166
|
+
raise QwakGrpcAddressException(
|
|
167
|
+
"gRPC address must be a simple hostname or fully qualified domain name.",
|
|
168
|
+
parsed_grpc_address,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def validate_paths_are_not_included_in_address(
|
|
173
|
+
parsed_grpc_address: ParseResult,
|
|
174
|
+
) -> None:
|
|
175
|
+
has_invalid_path: bool = (
|
|
176
|
+
parsed_grpc_address.path not in {"", "/"}
|
|
177
|
+
or parsed_grpc_address.query
|
|
178
|
+
or parsed_grpc_address.fragment
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
if has_invalid_path:
|
|
182
|
+
raise QwakGrpcAddressException(
|
|
183
|
+
"gRPC address must not contain paths, queries, or fragments.",
|
|
184
|
+
parsed_grpc_address,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def get_hostname_from_address(parsed_grpc_address: ParseResult) -> str:
|
|
189
|
+
hostname: Optional[str] = parsed_grpc_address.hostname
|
|
190
|
+
if not hostname:
|
|
191
|
+
raise QwakGrpcAddressException(
|
|
192
|
+
"gRPC address must contain a valid hostname.", parsed_grpc_address
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return hostname
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def __validate_url_scheme_not_included_in_address(
|
|
199
|
+
parsed_grpc_address: ParseResult,
|
|
200
|
+
) -> None:
|
|
201
|
+
if parsed_grpc_address.scheme:
|
|
202
|
+
raise QwakGrpcAddressException(
|
|
203
|
+
"URL scheme is not allowed in the gRPC address.", parsed_grpc_address
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def __validate_port_not_included_in_address(parsed_grpc_address: ParseResult):
|
|
208
|
+
try:
|
|
209
|
+
port: Optional[int] = parsed_grpc_address.port
|
|
210
|
+
except ValueError as exc:
|
|
211
|
+
raise QwakGrpcAddressException(
|
|
212
|
+
"Invalid port specification in the gRPC address.", parsed_grpc_address
|
|
213
|
+
) from exc
|
|
214
|
+
|
|
215
|
+
if port:
|
|
216
|
+
raise QwakGrpcAddressException(
|
|
217
|
+
"Port specification is not allowed in the gRPC address.",
|
|
218
|
+
parsed_grpc_address,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def parse_address(grpc_address: str) -> ParseResult:
|
|
223
|
+
if not grpc_address or not grpc_address.strip():
|
|
224
|
+
raise QwakGrpcAddressException(
|
|
225
|
+
"gRPC address must not be empty or whitespace.", grpc_address
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
trimmed_address: str = grpc_address.strip()
|
|
229
|
+
parsed_address: ParseResult = urlparse(
|
|
230
|
+
trimmed_address if "://" in trimmed_address else f"//{trimmed_address}"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
return parsed_address
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def is_valid_hostname(hostname: str) -> bool:
|
|
237
|
+
"""
|
|
238
|
+
Validate that the supplied hostname conforms to RFC-style label rules:
|
|
239
|
+
anchored pattern enforces full-string validation, negative lookahead/lookbehind block
|
|
240
|
+
leading or trailing hyphens per label, and each dot-separated label must be 1-63
|
|
241
|
+
alphanumeric/hyphen characters.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
hostname (str): The hostname to validate.
|
|
245
|
+
Returns:
|
|
246
|
+
bool: True if the hostname is valid, False otherwise.
|
|
247
|
+
"""
|
|
248
|
+
hostname_pattern: re.Pattern = re.compile(HOSTNAME_REGEX)
|
|
249
|
+
return bool(hostname_pattern.fullmatch(hostname))
|
|
250
|
+
|
|
251
|
+
|
|
132
252
|
class SleepingPolicy(ABC):
|
|
133
253
|
@abstractmethod
|
|
134
254
|
def sleep(self, try_i: int):
|
|
@@ -1,17 +1,152 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import functools
|
|
3
|
+
import inspect
|
|
4
|
+
from inspect import BoundArguments, Signature
|
|
5
|
+
from typing import Any, Callable, Optional
|
|
6
|
+
|
|
1
7
|
import grpc
|
|
2
8
|
from qwak.exceptions import QwakException
|
|
3
9
|
|
|
10
|
+
logger = logging.getLogger()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def grpc_try_catch_wrapper(
|
|
14
|
+
exception_message: str,
|
|
15
|
+
reraise_non_grpc_error_original_exception: Optional[bool] = False,
|
|
16
|
+
) -> Callable:
|
|
17
|
+
"""A decorator for handling exceptions in client methods.
|
|
18
|
+
|
|
19
|
+
This decorator wraps a function, catching any `grpc.RpcError` or other
|
|
20
|
+
`Exception`. it re-raises them as a `QwakException`. The error message can be a
|
|
21
|
+
static string or a template formatted with the decorated function's
|
|
22
|
+
runtime arguments.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
exception_message : str
|
|
27
|
+
The error message template. This can be a static string or a format
|
|
28
|
+
string using placeholders that match the decorated function's
|
|
29
|
+
parameter names (e.g., "Failed on item {item_id}").
|
|
30
|
+
reraise_non_grpc_error_original_exception : bool, optional
|
|
31
|
+
If `True`, any exception that is *not* a `grpc.RpcError` will be
|
|
32
|
+
re-raised in its original form. If `False` (the default), all
|
|
33
|
+
exceptions are wrapped in `QwakException`.
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
Callable
|
|
38
|
+
A decorator that wraps the function with the error handling logic.
|
|
39
|
+
|
|
40
|
+
Raises
|
|
41
|
+
------
|
|
42
|
+
QwakException
|
|
43
|
+
Raised when the decorated function encounters any exception, unless
|
|
44
|
+
`reraise_non_grpc_error_original_exception` is `True` and the error
|
|
45
|
+
is not a `grpc.RpcError`. The new exception's message is formatted
|
|
46
|
+
and includes details from the original error.
|
|
47
|
+
Exception
|
|
48
|
+
The original non-gRPC exception is re-raised if
|
|
49
|
+
`reraise_non_grpc_error_original_exception` is set to `True`.
|
|
50
|
+
|
|
51
|
+
Usage
|
|
52
|
+
-----
|
|
53
|
+
The decorator can be used with static strings and formatted strings
|
|
54
|
+
|
|
55
|
+
**1. Formatted Error Messages**
|
|
56
|
+
|
|
57
|
+
Use placeholders matching the function's parameter names to create
|
|
58
|
+
context-specific error messages.
|
|
59
|
+
|
|
60
|
+
@grpc_try_catch_wrapper("Failed to delete version {version_number} for FeatureSet {featureset_name}")
|
|
61
|
+
def delete_featureset_version(self, featureset_name: str, version_number: int):
|
|
62
|
+
# ... gRPC call ...
|
|
63
|
+
|
|
64
|
+
If this function fails with a gRPC error, a `QwakException` is raised with a message like:
|
|
65
|
+
`"Failed to delete version 2 for FeatureSet customer_churn - <original gRPC error code> - <original gRPC error details>."`
|
|
66
|
+
|
|
67
|
+
**2. Static Error Messages**
|
|
68
|
+
|
|
69
|
+
When no dynamic context is needed, a simple string is sufficient.
|
|
70
|
+
|
|
71
|
+
@grpc_try_catch_wrapper("Failed to retrieve featuresets mapping")
|
|
72
|
+
def get_featuresets_mapping(self):
|
|
73
|
+
# ... gRPC call ...
|
|
4
74
|
|
|
5
|
-
|
|
6
|
-
|
|
75
|
+
If this fails, the `QwakException` message will be:
|
|
76
|
+
`"Failed to retrieve featuresets mapping - <original gRPC error code> - <original gRPC error details>."`
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
def decorator(function: Callable):
|
|
80
|
+
@functools.wraps(function)
|
|
7
81
|
def _inner_wrapper(*args, **kwargs):
|
|
8
82
|
try:
|
|
9
83
|
return function(*args, **kwargs)
|
|
10
84
|
except grpc.RpcError as e:
|
|
11
|
-
|
|
12
|
-
exception_message
|
|
85
|
+
error_message: str = __get_error_msg(
|
|
86
|
+
exception_message=exception_message, e=e
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
formatted_message = __get_formatted_error_message(
|
|
90
|
+
exception_message=error_message,
|
|
91
|
+
function=function,
|
|
92
|
+
args=args,
|
|
93
|
+
kwargs=kwargs,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
raise QwakException(formatted_message) from e
|
|
97
|
+
|
|
98
|
+
except Exception as e:
|
|
99
|
+
if reraise_non_grpc_error_original_exception:
|
|
100
|
+
raise e
|
|
101
|
+
|
|
102
|
+
formatted_message = __get_formatted_error_message(
|
|
103
|
+
exception_message=exception_message,
|
|
104
|
+
function=function,
|
|
105
|
+
args=args,
|
|
106
|
+
kwargs=kwargs,
|
|
13
107
|
)
|
|
108
|
+
raise QwakException(f"{formatted_message}. Error is: {e}.") from e
|
|
14
109
|
|
|
15
110
|
return _inner_wrapper
|
|
16
111
|
|
|
17
112
|
return decorator
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def __get_error_msg(exception_message: str, e: grpc.RpcError) -> str:
|
|
116
|
+
err_msg: str = (
|
|
117
|
+
f"{exception_message} - {e.code() if hasattr(e, 'code') else 'UNKNOWN'}"
|
|
118
|
+
)
|
|
119
|
+
if hasattr(e, "details") and e.details() is not None:
|
|
120
|
+
err_msg: str = f"{err_msg} - {e.details()}"
|
|
121
|
+
elif hasattr(e, "debug_error_string"):
|
|
122
|
+
err_msg: str = f"{err_msg} - {e.debug_error_string()}"
|
|
123
|
+
logger.debug(f"{err_msg}: {e}")
|
|
124
|
+
return err_msg
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def __get_formatted_error_message(
|
|
128
|
+
exception_message: str, function: Callable, args: tuple[Any], kwargs: dict[str, Any]
|
|
129
|
+
) -> str:
|
|
130
|
+
"""Formats an error message string with the runtime arguments of a function.
|
|
131
|
+
|
|
132
|
+
It inspects the function's signature and binds the passed args and kwargs
|
|
133
|
+
to their parameter names, then uses them to format the message string.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
exception_message (str): The error message template with placeholders.
|
|
137
|
+
function (Callable): The decorated function.
|
|
138
|
+
args (tuple[Any]): The positional arguments passed to the function.
|
|
139
|
+
kwargs (dict[str, Any]): The keyword arguments passed to the function.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
str: The error message with placeholders filled in.
|
|
143
|
+
"""
|
|
144
|
+
try:
|
|
145
|
+
sig: Signature = inspect.signature(function)
|
|
146
|
+
bound_args: BoundArguments = sig.bind(*args, **kwargs)
|
|
147
|
+
bound_args.apply_defaults()
|
|
148
|
+
|
|
149
|
+
return exception_message.format(**bound_args.arguments)
|
|
150
|
+
except (ValueError, KeyError, TypeError):
|
|
151
|
+
# Fallback if formatting fails (e.g., missing key in template)
|
|
152
|
+
return exception_message
|