fiddler-client 2.4.0.dev2__tar.gz → 2.5.0.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fiddler-client-2.4.0.dev2/fiddler_client.egg-info → fiddler-client-2.5.0.dev2}/PKG-INFO +15 -5
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/PUBLIC.md +14 -4
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/__init__.py +2 -0
- fiddler-client-2.5.0.dev2/fiddler/_version.py +1 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/alert_mixin.py +51 -1
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/webhooks_mixin.py +6 -8
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/core_objects.py +76 -26
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/alert.py +9 -2
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schemas/custom_features.py +44 -1
- fiddler-client-2.5.0.dev2/fiddler3/__init__.py +122 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/configs.py +3 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/connection.py +68 -1
- fiddler-client-2.5.0.dev2/fiddler3/constants/alert_rule.py +30 -0
- fiddler-client-2.5.0.dev2/fiddler3/constants/events.py +7 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/model.py +9 -0
- fiddler-client-2.5.0.dev2/fiddler3/entities/alert_record.py +106 -0
- fiddler-client-2.5.0.dev2/fiddler3/entities/alert_rule.py +323 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/base.py +2 -16
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/baseline.py +21 -15
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/dataset.py +1 -1
- fiddler-client-2.5.0.dev2/fiddler3/entities/events.py +136 -0
- fiddler-client-2.5.0.dev2/fiddler3/entities/file.py +162 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/model.py +141 -24
- fiddler-client-2.5.0.dev2/fiddler3/entities/model_artifact.py +178 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/model_deployment.py +12 -1
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/project.py +2 -2
- fiddler-client-2.4.0.dev2/fiddler3/entities/model_surrogate.py → fiddler-client-2.5.0.dev2/fiddler3/entities/surrogate.py +27 -29
- fiddler-client-2.5.0.dev2/fiddler3/entities/webhook.py +128 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/xai.py +271 -5
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/libs/http_client.py +1 -1
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/libs/json_encoder.py +1 -1
- fiddler-client-2.5.0.dev2/fiddler3/schemas/alert_record.py +27 -0
- fiddler-client-2.5.0.dev2/fiddler3/schemas/alert_rule.py +39 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/custom_features.py +68 -12
- fiddler-client-2.5.0.dev2/fiddler3/schemas/events.py +15 -0
- fiddler-client-2.5.0.dev2/fiddler3/schemas/file.py +23 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/model.py +1 -6
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/model_deployment.py +5 -4
- fiddler-client-2.5.0.dev2/fiddler3/schemas/webhook.py +23 -0
- fiddler-client-2.5.0.dev2/fiddler3/tests/apis/test_alert_record.py +99 -0
- fiddler-client-2.5.0.dev2/fiddler3/tests/apis/test_alert_rule.py +393 -0
- fiddler-client-2.5.0.dev2/fiddler3/tests/apis/test_events.py +169 -0
- fiddler-client-2.5.0.dev2/fiddler3/tests/apis/test_files.py +164 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_model.py +60 -9
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_model_artifact.py +21 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_project.py +3 -3
- fiddler-client-2.5.0.dev2/fiddler3/tests/apis/test_webhook.py +257 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_xai.py +233 -1
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/conftest.py +2 -2
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/constants.py +5 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/test_connection.py +24 -1
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/test_json_encoder.py +2 -2
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/utils/helpers.py +20 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2/fiddler_client.egg-info}/PKG-INFO +15 -5
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler_client.egg-info/SOURCES.txt +18 -3
- fiddler-client-2.5.0.dev2/tests/fiddler/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_alert.py +95 -5
- fiddler-client-2.5.0.dev2/tests/fiddler/utils/__init__.py +0 -0
- fiddler-client-2.4.0.dev2/fiddler/_version.py +0 -1
- fiddler-client-2.4.0.dev2/fiddler3/__init__.py +0 -39
- fiddler-client-2.4.0.dev2/fiddler3/entities/__init__.py +0 -7
- fiddler-client-2.4.0.dev2/fiddler3/entities/helpers.py +0 -21
- fiddler-client-2.4.0.dev2/fiddler3/entities/model_artifact.py +0 -350
- fiddler-client-2.4.0.dev2/fiddler3/schemas/__init__.py +0 -9
- fiddler-client-2.4.0.dev2/fiddler3/schemas/model_artifact.py +0 -6
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/LICENSE.txt +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/MANIFEST.in +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/README.md +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/api.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/baseline_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/custom_metrics_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/dataset_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/events_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/explainability_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/helpers.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/job_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/model_artifact_deploy.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/model_deployment_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/model_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/project_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/api/segments_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/assets/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/assets/pg_reserved_words.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/constants.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/exceptions.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/libs/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/libs/http_client.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/packtools/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/packtools/gem.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/packtools/keras_ig_helpers.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/packtools/project_attributions_helpers.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/packtools/template_model.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/base.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/baseline.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/custom_metric.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/dataset.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/events.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/job.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/model.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/model_deployment.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/project.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/segment.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/server_info.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/user.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schema/webhook.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/schemas/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/decorators.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/formatting.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/general_checks.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/helpers.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/logger.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/pandas_helper.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/response_handler.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/semver_version.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/validations.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/utils/validator.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/validators/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler/validators/dataset_validator.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/baseline.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/common.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/dataset.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/job.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/model_deployment.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/constants/xai.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/decorators.py +0 -0
- {fiddler-client-2.4.0.dev2/fiddler3/libs → fiddler-client-2.5.0.dev2/fiddler3/entities}/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/job.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/organization.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/entities/user.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/exceptions.py +0 -0
- {fiddler-client-2.4.0.dev2/fiddler3/tests → fiddler-client-2.5.0.dev2/fiddler3/libs}/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/libs/semver.py +0 -0
- {fiddler-client-2.4.0.dev2/fiddler3/tests/apis → fiddler-client-2.5.0.dev2/fiddler3/schemas}/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/base.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/baseline.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/dataset.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/deployment_params.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/filter_query.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/job.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/model_schema.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/model_spec.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/model_task_params.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/organization.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/project.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/response.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/server_info.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/user.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/xai.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/schemas/xai_params.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2/fiddler3}/tests/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2/tests/fiddler → fiddler-client-2.5.0.dev2/fiddler3/tests/apis}/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_baseline.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_dataset.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_generate_schema.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_job.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_mixin.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_model_deployment.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/apis/test_model_surrogate.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/test_logger.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/test_utils.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/tests/utils.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/utils/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/utils/logger.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/utils/model_schema_generator.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/utils/validations.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/utils/version.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler3/version.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler_client.egg-info/dependency_links.txt +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler_client.egg-info/requires.txt +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/fiddler_client.egg-info/top_level.txt +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/setup.cfg +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/setup.py +0 -0
- {fiddler-client-2.4.0.dev2/tests/fiddler/utils → fiddler-client-2.5.0.dev2/tests}/__init__.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/base.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/helper.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_add_model.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_baseline.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_check_version_decorator.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_custom_features.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_custom_metrics.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_dataset_api.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_events_api.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_exceptions.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_explainability_apis.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_file_upload.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_helpers.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_job.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_model.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_project.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_response_handler.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_segments.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_upload_dataset.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_validations.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/test_webhook.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/utils/test_general_checks.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/utils/test_pandas.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/fiddler/utils/tests_utils.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/test_object_inference.py +0 -0
- {fiddler-client-2.4.0.dev2 → fiddler-client-2.5.0.dev2}/tests/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0.dev2
|
|
4
4
|
Summary: Python client for Fiddler Service
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -42,9 +42,17 @@ Documentation for the API can be found [here](https://docs.fiddler.ai/reference/
|
|
|
42
42
|
|
|
43
43
|
Version History
|
|
44
44
|
-------------
|
|
45
|
+
### 2.5.0
|
|
46
|
+
- #### **New Features**
|
|
47
|
+
- Add support for enrichments
|
|
48
|
+
- Allow pausing multiple alerts at once
|
|
49
|
+
- Add percentage violation metrics for alert
|
|
50
|
+
|
|
45
51
|
### 2.4.0
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
- ### **New Features**
|
|
53
|
+
- Add support for segments
|
|
54
|
+
- #### **Modifications**
|
|
55
|
+
- Ensure `TextEmbedding` and `ImageEmbedding` is supported for vectors in metadata
|
|
48
56
|
|
|
49
57
|
### 2.3.0
|
|
50
58
|
- #### **New Features**
|
|
@@ -57,8 +65,10 @@ Version History
|
|
|
57
65
|
- Relax pydantic version to allow any version between 1.9 and 2
|
|
58
66
|
|
|
59
67
|
### 2.2.0
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
- #### **Modifications**
|
|
69
|
+
- `add_custom_metric()` supports an optional `description` parameter
|
|
70
|
+
- `fql` is renamed to `definition` in `add_custom_metric()`
|
|
71
|
+
- A new `get_custom_metric()` function to get details about a single custom metric.
|
|
62
72
|
|
|
63
73
|
### 2.1.2
|
|
64
74
|
- #### **Modifications**
|
|
@@ -19,9 +19,17 @@ Documentation for the API can be found [here](https://docs.fiddler.ai/reference/
|
|
|
19
19
|
|
|
20
20
|
Version History
|
|
21
21
|
-------------
|
|
22
|
+
### 2.5.0
|
|
23
|
+
- #### **New Features**
|
|
24
|
+
- Add support for enrichments
|
|
25
|
+
- Allow pausing multiple alerts at once
|
|
26
|
+
- Add percentage violation metrics for alert
|
|
27
|
+
|
|
22
28
|
### 2.4.0
|
|
23
|
-
|
|
24
|
-
|
|
29
|
+
- ### **New Features**
|
|
30
|
+
- Add support for segments
|
|
31
|
+
- #### **Modifications**
|
|
32
|
+
- Ensure `TextEmbedding` and `ImageEmbedding` is supported for vectors in metadata
|
|
25
33
|
|
|
26
34
|
### 2.3.0
|
|
27
35
|
- #### **New Features**
|
|
@@ -34,8 +42,10 @@ Version History
|
|
|
34
42
|
- Relax pydantic version to allow any version between 1.9 and 2
|
|
35
43
|
|
|
36
44
|
### 2.2.0
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
- #### **Modifications**
|
|
46
|
+
- `add_custom_metric()` supports an optional `description` parameter
|
|
47
|
+
- `fql` is renamed to `definition` in `add_custom_metric()`
|
|
48
|
+
- A new `get_custom_metric()` function to get details about a single custom metric.
|
|
39
49
|
|
|
40
50
|
### 2.1.2
|
|
41
51
|
- #### **Modifications**
|
|
@@ -50,6 +50,7 @@ from fiddler.schemas.custom_features import (
|
|
|
50
50
|
Multivariate,
|
|
51
51
|
TextEmbedding,
|
|
52
52
|
VectorFeature,
|
|
53
|
+
Enrichment,
|
|
53
54
|
)
|
|
54
55
|
from fiddler.utils import ColorLogger
|
|
55
56
|
from fiddler.utils.logger import get_logger
|
|
@@ -71,6 +72,7 @@ __all__ = [
|
|
|
71
72
|
'VectorFeature',
|
|
72
73
|
'TextEmbedding',
|
|
73
74
|
'ImageEmbedding',
|
|
75
|
+
'Enrichment',
|
|
74
76
|
'ColorLogger',
|
|
75
77
|
'DatasetInfo',
|
|
76
78
|
'DataType',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.5.0.dev2'
|
|
@@ -6,6 +6,8 @@ from typing import Any, Dict, List, Optional, Union
|
|
|
6
6
|
|
|
7
7
|
from pydantic import parse_obj_as
|
|
8
8
|
|
|
9
|
+
import fiddler3
|
|
10
|
+
from fiddler3.entities.model import Model
|
|
9
11
|
from fiddler.libs.http_client import RequestClient
|
|
10
12
|
from fiddler.schema.alert import (
|
|
11
13
|
AlertCondition,
|
|
@@ -38,6 +40,8 @@ class AlertMixin:
|
|
|
38
40
|
client: RequestClient
|
|
39
41
|
organization_name: str
|
|
40
42
|
server_info: ServerInfo
|
|
43
|
+
url: str
|
|
44
|
+
auth_token: str
|
|
41
45
|
|
|
42
46
|
@handle_api_error_response
|
|
43
47
|
def add_alert_rule(
|
|
@@ -61,7 +65,7 @@ class AlertMixin:
|
|
|
61
65
|
warning_threshold: Optional[float] = None,
|
|
62
66
|
notifications_config: Optional[Dict[str, Any]] = None,
|
|
63
67
|
) -> AlertRule:
|
|
64
|
-
"""
|
|
68
|
+
f"""
|
|
65
69
|
To add an alert rule
|
|
66
70
|
|
|
67
71
|
:param project_id: Unique project name for which the alert rule is created
|
|
@@ -488,3 +492,49 @@ class AlertMixin:
|
|
|
488
492
|
},
|
|
489
493
|
'webhooks': webhooks_dict,
|
|
490
494
|
}
|
|
495
|
+
|
|
496
|
+
def update_alert_notification_status(
|
|
497
|
+
self,
|
|
498
|
+
notification_status: bool,
|
|
499
|
+
alert_config_ids: Optional[list[str]] = None,
|
|
500
|
+
model_id: Optional[str] = None,
|
|
501
|
+
) -> list[AlertRuleWithNotifications]:
|
|
502
|
+
"""
|
|
503
|
+
To enable/disable the notifications for a list of Alert Ids or for a given Model Id.
|
|
504
|
+
Either the Alert Ids should be given or the Model Id, but not both.
|
|
505
|
+
:param notification_status: The value of notification status for an alert
|
|
506
|
+
:param alert_config_ids: List of Alert Ids, on which we need to update notification
|
|
507
|
+
:param model_id: The Model Id which for whom we want to update all alerts.
|
|
508
|
+
:return: List of updated Alert Rules.
|
|
509
|
+
"""
|
|
510
|
+
if not alert_config_ids and not model_id:
|
|
511
|
+
raise ValueError('Either alert_config_ids or model_id must be specified')
|
|
512
|
+
elif alert_config_ids and model_id:
|
|
513
|
+
raise ValueError(
|
|
514
|
+
'Either alert_config_ids or model_id should be specified, not both.'
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
updated_alert_configs: list[AlertRuleWithNotifications] = []
|
|
518
|
+
alert_ids: list[str] = []
|
|
519
|
+
|
|
520
|
+
if alert_config_ids:
|
|
521
|
+
# verify that all the alert-configs are valid
|
|
522
|
+
for alert_id in alert_config_ids:
|
|
523
|
+
self.client.get(
|
|
524
|
+
url=f'alert-configs/{alert_id}',
|
|
525
|
+
)
|
|
526
|
+
alert_ids = alert_config_ids
|
|
527
|
+
|
|
528
|
+
if model_id:
|
|
529
|
+
fiddler3.init(url=self.url, token=self.auth_token)
|
|
530
|
+
model: Model = Model.get(id_=model_id)
|
|
531
|
+
alerts: list[AlertRule] = self.get_alert_rules(model_id=model.name)
|
|
532
|
+
alert_ids = [alert.alert_rule_uuid for alert in alerts]
|
|
533
|
+
|
|
534
|
+
for alert_id in alert_ids:
|
|
535
|
+
updated_alert_configs.append(
|
|
536
|
+
self.update_alert_rule(
|
|
537
|
+
alert_config_uuid=alert_id, enable_notification=notification_status
|
|
538
|
+
)
|
|
539
|
+
)
|
|
540
|
+
return updated_alert_configs
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from http import HTTPStatus
|
|
2
|
-
from typing import List
|
|
2
|
+
from typing import Dict, List
|
|
3
3
|
|
|
4
4
|
from pydantic import parse_obj_as
|
|
5
5
|
|
|
@@ -80,13 +80,11 @@ class WebhookMixin:
|
|
|
80
80
|
|
|
81
81
|
:returns: Updated `Webhook` object.
|
|
82
82
|
"""
|
|
83
|
-
request_body =
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
provider=provider,
|
|
89
|
-
).dict()
|
|
83
|
+
request_body: Dict[str, str] = {
|
|
84
|
+
'name': name,
|
|
85
|
+
'url': url,
|
|
86
|
+
'provider': provider,
|
|
87
|
+
}
|
|
90
88
|
response = self.client.patch(
|
|
91
89
|
url=f'webhooks/{uuid}',
|
|
92
90
|
data=request_body,
|
|
@@ -28,6 +28,7 @@ from pandas.api.types import CategoricalDtype
|
|
|
28
28
|
|
|
29
29
|
from fiddler.schemas.custom_features import (
|
|
30
30
|
CustomFeature,
|
|
31
|
+
Enrichment,
|
|
31
32
|
ImageEmbedding,
|
|
32
33
|
Multivariate,
|
|
33
34
|
TextEmbedding,
|
|
@@ -1231,10 +1232,10 @@ class ModelInfo:
|
|
|
1231
1232
|
'The custom_features argument only accepts a list of CustomFeature objects.'
|
|
1232
1233
|
)
|
|
1233
1234
|
|
|
1234
|
-
available_cols = (
|
|
1235
|
-
self.get_input_names()
|
|
1236
|
-
|
|
1237
|
-
|
|
1235
|
+
available_cols: Set[str] = set().union(
|
|
1236
|
+
self.get_input_names(),
|
|
1237
|
+
self.get_target_names(),
|
|
1238
|
+
self.get_metadata_names(),
|
|
1238
1239
|
)
|
|
1239
1240
|
|
|
1240
1241
|
numeric_cols = self.get_input_pandas_dtypes()
|
|
@@ -1243,19 +1244,18 @@ class ModelInfo:
|
|
|
1243
1244
|
if self.targets:
|
|
1244
1245
|
numeric_cols.update(self.get_target_pandas_dtypes())
|
|
1245
1246
|
|
|
1246
|
-
valid_numeric_names =
|
|
1247
|
+
valid_numeric_names = set(
|
|
1247
1248
|
k
|
|
1248
1249
|
for k, v in numeric_cols.items()
|
|
1249
1250
|
if v in (DataType.INTEGER.value, DataType.FLOAT.value)
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
valid_vector_cols = [
|
|
1251
|
+
)
|
|
1252
|
+
valid_vector_cols = set(
|
|
1253
1253
|
vec_col.name
|
|
1254
1254
|
for vec_col in (self.inputs or []) + (self.metadata or [])
|
|
1255
1255
|
if vec_col.data_type.is_vector()
|
|
1256
|
-
|
|
1256
|
+
)
|
|
1257
1257
|
|
|
1258
|
-
|
|
1258
|
+
valid_cf_names, valid_enrichment_names = set(), set()
|
|
1259
1259
|
for feature in self.custom_features:
|
|
1260
1260
|
if not isinstance(feature, CustomFeature):
|
|
1261
1261
|
raise ValueError(
|
|
@@ -1267,42 +1267,92 @@ class ModelInfo:
|
|
|
1267
1267
|
f'A column name "{feature.name}" already exists in the dataset. Please use a different name for custom feature {feature}.'
|
|
1268
1268
|
)
|
|
1269
1269
|
|
|
1270
|
-
if feature.name in
|
|
1270
|
+
if feature.name in valid_cf_names:
|
|
1271
1271
|
raise ValueError(
|
|
1272
1272
|
f'Multiple custom features are defined with the same name {feature.name}.'
|
|
1273
1273
|
)
|
|
1274
|
-
|
|
1275
|
-
|
|
1274
|
+
if isinstance(feature, Enrichment):
|
|
1275
|
+
valid_enrichment_names.add(feature.name)
|
|
1276
|
+
valid_cf_names.add(feature.name)
|
|
1276
1277
|
|
|
1278
|
+
for feature in self.custom_features:
|
|
1277
1279
|
if isinstance(feature, Multivariate):
|
|
1278
1280
|
self.validate_multivariate_cf(feature, valid_numeric_names)
|
|
1279
1281
|
elif isinstance(feature, TextEmbedding):
|
|
1280
|
-
self.
|
|
1282
|
+
self.validate_embedding_cf(
|
|
1281
1283
|
feature,
|
|
1282
1284
|
available_cols,
|
|
1283
1285
|
valid_vector_cols,
|
|
1286
|
+
valid_enrichment_names,
|
|
1287
|
+
)
|
|
1288
|
+
elif isinstance(feature, ImageEmbedding):
|
|
1289
|
+
self.validate_embedding_cf(
|
|
1290
|
+
feature,
|
|
1291
|
+
available_cols,
|
|
1292
|
+
valid_vector_cols,
|
|
1293
|
+
[],
|
|
1284
1294
|
)
|
|
1285
1295
|
elif isinstance(feature, VectorFeature):
|
|
1286
1296
|
self.validate_vector_cf(feature, valid_vector_cols)
|
|
1297
|
+
elif isinstance(feature, Enrichment):
|
|
1298
|
+
self.validate_enrichment_cf(feature, available_cols, valid_cf_names)
|
|
1287
1299
|
|
|
1288
|
-
def
|
|
1300
|
+
def validate_enrichment_cf(
|
|
1289
1301
|
self,
|
|
1290
|
-
feature:
|
|
1291
|
-
available_cols:
|
|
1292
|
-
|
|
1302
|
+
feature: Enrichment,
|
|
1303
|
+
available_cols: Iterable[str],
|
|
1304
|
+
valid_cf_names: Iterable[str],
|
|
1293
1305
|
) -> None:
|
|
1294
|
-
if feature.
|
|
1306
|
+
if not feature.columns:
|
|
1295
1307
|
raise ValueError(
|
|
1296
|
-
f
|
|
1308
|
+
f'{feature.name} ({feature.__class__.__name__}) must specify at least one enrichment/column/custom feature in columns.'
|
|
1297
1309
|
)
|
|
1310
|
+
for column in feature.columns:
|
|
1311
|
+
if column == feature.name:
|
|
1312
|
+
raise ValueError(
|
|
1313
|
+
f'{feature.name} ({feature.__class__.__name__}) cannot depend on itself.'
|
|
1314
|
+
)
|
|
1315
|
+
if column not in valid_cf_names and column not in available_cols:
|
|
1316
|
+
raise ValueError(
|
|
1317
|
+
f"Column '{column}' defined in {feature.name} ({feature.__class__.__name__}) does not exist in the data, as a custom feature or as an enrichment."
|
|
1318
|
+
)
|
|
1298
1319
|
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1320
|
+
def validate_embedding_cf(
|
|
1321
|
+
self,
|
|
1322
|
+
feature: Union[TextEmbedding, ImageEmbedding],
|
|
1323
|
+
available_cols: Iterable[str],
|
|
1324
|
+
valid_vector_cols: Iterable[str],
|
|
1325
|
+
valid_enrichment_names: Iterable[str],
|
|
1326
|
+
) -> None:
|
|
1327
|
+
if isinstance(feature, TextEmbedding):
|
|
1328
|
+
if not feature.n_tags:
|
|
1329
|
+
raise ValueError(
|
|
1330
|
+
f'{feature.name} ({feature.__class__.__name__}) must specify a number of tags.'
|
|
1331
|
+
)
|
|
1332
|
+
|
|
1333
|
+
if feature.n_tags < 0:
|
|
1334
|
+
raise ValueError(
|
|
1335
|
+
f'{feature.name} ({feature.__class__.__name__}) must specify a non-negative number of tags.'
|
|
1336
|
+
)
|
|
1337
|
+
|
|
1338
|
+
if feature.column not in valid_vector_cols:
|
|
1339
|
+
# we require either a column or source_column
|
|
1340
|
+
if not feature.source_column:
|
|
1341
|
+
raise ValueError(
|
|
1342
|
+
f'{feature.name} ({feature.__class__.__name__}) needs to specify source_column.'
|
|
1343
|
+
)
|
|
1344
|
+
if feature.source_column not in available_cols:
|
|
1345
|
+
raise ValueError(
|
|
1346
|
+
f'source_column {feature.source_column} defined in {feature.name} ({feature.__class__.__name__}) does not exist or cannot be used as a source column.'
|
|
1347
|
+
)
|
|
1348
|
+
# column could be the result of an enrichment
|
|
1349
|
+
if feature.column not in valid_enrichment_names:
|
|
1350
|
+
raise ValueError(
|
|
1351
|
+
f"Column/Enrichment'{feature.column}' defined in {feature.name} ({feature.__class__.__name__}) does not exist or not of type vector."
|
|
1352
|
+
)
|
|
1303
1353
|
|
|
1304
1354
|
def validate_vector_cf(
|
|
1305
|
-
self, feature: VectorFeature, valid_vector_cols:
|
|
1355
|
+
self, feature: VectorFeature, valid_vector_cols: Iterable[str]
|
|
1306
1356
|
) -> None:
|
|
1307
1357
|
if feature.column not in valid_vector_cols:
|
|
1308
1358
|
raise ValueError(
|
|
@@ -1310,7 +1360,7 @@ class ModelInfo:
|
|
|
1310
1360
|
)
|
|
1311
1361
|
|
|
1312
1362
|
def validate_multivariate_cf(
|
|
1313
|
-
self, feature: Multivariate, valid_numeric_names:
|
|
1363
|
+
self, feature: Multivariate, valid_numeric_names: Iterable[str]
|
|
1314
1364
|
) -> None:
|
|
1315
1365
|
if len(feature.columns or []) < 2:
|
|
1316
1366
|
raise ValueError(
|
|
@@ -34,6 +34,12 @@ class Metric(str, enum.Enum):
|
|
|
34
34
|
MISSING_VALUE = 'null_violation_count'
|
|
35
35
|
RANGE_VIOLATION = 'range_violation_count'
|
|
36
36
|
TYPE_VIOLATION = 'type_violation_count'
|
|
37
|
+
ANY_VIOLATION = 'any_violation_count'
|
|
38
|
+
|
|
39
|
+
MISSING_VALUE_PCT = 'null_violation_percentage'
|
|
40
|
+
RANGE_VIOLATION_PCT = 'range_violation_percentage'
|
|
41
|
+
TYPE_VIOLATION_PCT = 'type_violation_percentage'
|
|
42
|
+
ANY_VIOLATION_PCT = 'any_violation_percentage'
|
|
37
43
|
|
|
38
44
|
## Performance metrics
|
|
39
45
|
# Binary Classification
|
|
@@ -47,7 +53,6 @@ class Metric(str, enum.Enum):
|
|
|
47
53
|
CALIBRATED_THRESHOLD = 'calibrated_threshold'
|
|
48
54
|
GMEAN = 'geometric_mean'
|
|
49
55
|
LOG_LOSS = 'log_loss'
|
|
50
|
-
|
|
51
56
|
|
|
52
57
|
# Regression
|
|
53
58
|
R2 = 'r2'
|
|
@@ -192,7 +197,7 @@ class AlertRule(BaseDataSchema):
|
|
|
192
197
|
time_bucket: Optional[int]
|
|
193
198
|
alert_type_display_name: str
|
|
194
199
|
metric_display_name: str
|
|
195
|
-
enable_notification: bool
|
|
200
|
+
enable_notification: Optional[bool]
|
|
196
201
|
|
|
197
202
|
@root_validator(pre=True)
|
|
198
203
|
def set_feature_names(cls, values: dict) -> dict:
|
|
@@ -224,4 +229,6 @@ class TriggeredAlerts(BaseDataSchema):
|
|
|
224
229
|
message: str
|
|
225
230
|
multi_col_values: Optional[Dict[str, float]]
|
|
226
231
|
feature_name: Optional[str]
|
|
232
|
+
alert_record_main_version: Optional[int]
|
|
233
|
+
alert_record_sub_version: Optional[int]
|
|
227
234
|
segment: Optional[Segment]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
from typing import Any, Dict, List, Optional, Type, TypeVar
|
|
3
3
|
|
|
4
|
-
from pydantic import BaseModel, Extra
|
|
4
|
+
from pydantic import BaseModel, Extra, validator
|
|
5
5
|
|
|
6
6
|
CustomFeatureTypeVar = TypeVar('CustomFeatureTypeVar', bound='CustomFeature')
|
|
7
7
|
DEFAULT_NUM_CLUSTERS = 5
|
|
@@ -22,6 +22,12 @@ class CustomFeature(BaseModel):
|
|
|
22
22
|
n_clusters: Optional[int] = DEFAULT_NUM_CLUSTERS
|
|
23
23
|
centroids: Optional[List] = None
|
|
24
24
|
|
|
25
|
+
@validator('n_clusters')
|
|
26
|
+
def validate_n_clusters(cls, value: int) -> int: # noqa: N805
|
|
27
|
+
if value < 0:
|
|
28
|
+
raise ValueError('n_clusters must be greater than 0')
|
|
29
|
+
return value
|
|
30
|
+
|
|
25
31
|
class Config:
|
|
26
32
|
allow_mutation = False
|
|
27
33
|
extra = Extra.forbid
|
|
@@ -47,6 +53,8 @@ class CustomFeature(BaseModel):
|
|
|
47
53
|
return TextEmbedding.parse_obj(deserialized_json)
|
|
48
54
|
elif feature_type == CustomFeatureType.FROM_IMAGE_EMBEDDING:
|
|
49
55
|
return ImageEmbedding.parse_obj(deserialized_json)
|
|
56
|
+
elif feature_type == CustomFeatureType.ENRICHMENT:
|
|
57
|
+
return Enrichment.parse_obj(deserialized_json)
|
|
50
58
|
else:
|
|
51
59
|
raise ValueError(f'Unsupported feature type: {feature_type}')
|
|
52
60
|
|
|
@@ -64,6 +72,10 @@ class CustomFeature(BaseModel):
|
|
|
64
72
|
return_dict['source_column'] = self.source_column
|
|
65
73
|
if isinstance(self, TextEmbedding):
|
|
66
74
|
return_dict['n_tags'] = self.n_tags
|
|
75
|
+
elif isinstance(self, Enrichment):
|
|
76
|
+
return_dict['columns'] = self.columns
|
|
77
|
+
return_dict['enrichment'] = self.enrichment
|
|
78
|
+
return_dict['config'] = self.config
|
|
67
79
|
else:
|
|
68
80
|
raise ValueError(f'Unsupported feature type: {self.type} {type(self)}')
|
|
69
81
|
|
|
@@ -75,6 +87,12 @@ class Multivariate(CustomFeature):
|
|
|
75
87
|
columns: List[str]
|
|
76
88
|
monitor_components: bool = False
|
|
77
89
|
|
|
90
|
+
@validator('columns')
|
|
91
|
+
def validate_columns(cls, value: List[str]) -> List[str]: # noqa: N805
|
|
92
|
+
if len(value) < 2:
|
|
93
|
+
raise ValueError('Multivariate features must have at least 2 columns')
|
|
94
|
+
return value
|
|
95
|
+
|
|
78
96
|
|
|
79
97
|
class VectorFeature(CustomFeature):
|
|
80
98
|
type: CustomFeatureType = CustomFeatureType.FROM_VECTOR
|
|
@@ -86,6 +104,31 @@ class TextEmbedding(VectorFeature):
|
|
|
86
104
|
type: CustomFeatureType = CustomFeatureType.FROM_TEXT_EMBEDDING
|
|
87
105
|
n_tags: Optional[int] = DEFAULT_NUM_TAGS
|
|
88
106
|
|
|
107
|
+
@validator('source_column')
|
|
108
|
+
def validate_source_column(cls, value: str) -> str: # noqa: N805
|
|
109
|
+
if value is None:
|
|
110
|
+
raise ValueError('source_column must be specified')
|
|
111
|
+
return value
|
|
112
|
+
|
|
113
|
+
@validator('n_tags')
|
|
114
|
+
def validate_n_tags(cls, value: int) -> int: # noqa: N805
|
|
115
|
+
if value < 1:
|
|
116
|
+
raise ValueError('n_tags must be greater than 0')
|
|
117
|
+
return value
|
|
118
|
+
|
|
89
119
|
|
|
90
120
|
class ImageEmbedding(VectorFeature):
|
|
91
121
|
type: CustomFeatureType = CustomFeatureType.FROM_IMAGE_EMBEDDING
|
|
122
|
+
|
|
123
|
+
@validator('source_column')
|
|
124
|
+
def validate_source_column(cls, value: str) -> str: # noqa: N805
|
|
125
|
+
if value is None:
|
|
126
|
+
raise ValueError('source_column must be specified')
|
|
127
|
+
return value
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class Enrichment(CustomFeature):
|
|
131
|
+
type: CustomFeatureType = CustomFeatureType.ENRICHMENT
|
|
132
|
+
columns: List[str]
|
|
133
|
+
enrichment: str
|
|
134
|
+
config: Dict[str, Any] = {}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from fiddler3.connection import Connection, ConnectionMixin, init # noqa
|
|
2
|
+
from fiddler3.constants.alert_rule import ( # noqa
|
|
3
|
+
AlertCondition,
|
|
4
|
+
BinSize,
|
|
5
|
+
CompareTo,
|
|
6
|
+
Priority,
|
|
7
|
+
)
|
|
8
|
+
from fiddler3.constants.baseline import BaselineType, WindowSize # noqa
|
|
9
|
+
from fiddler3.constants.dataset import EnvType # noqa
|
|
10
|
+
from fiddler3.constants.job import JobStatus # noqa
|
|
11
|
+
from fiddler3.constants.model import ( # noqa
|
|
12
|
+
ArtifactStatus,
|
|
13
|
+
CustomFeatureType,
|
|
14
|
+
DataType,
|
|
15
|
+
ModelInputType,
|
|
16
|
+
ModelTask,
|
|
17
|
+
)
|
|
18
|
+
from fiddler3.constants.model_deployment import ArtifactType, DeploymentType # noqa
|
|
19
|
+
from fiddler3.constants.xai import ExplainMethod # noqa
|
|
20
|
+
from fiddler3.entities.alert_record import AlertRecord # noqa
|
|
21
|
+
from fiddler3.entities.alert_rule import AlertRule # noqa
|
|
22
|
+
from fiddler3.entities.baseline import Baseline # noqa
|
|
23
|
+
from fiddler3.entities.dataset import Dataset # noqa
|
|
24
|
+
from fiddler3.entities.file import File # noqa
|
|
25
|
+
from fiddler3.entities.job import Job # noqa
|
|
26
|
+
from fiddler3.entities.model import Model # noqa
|
|
27
|
+
from fiddler3.entities.model_deployment import ModelDeployment # noqa
|
|
28
|
+
from fiddler3.entities.project import Project # noqa
|
|
29
|
+
from fiddler3.entities.webhook import Webhook # noqa
|
|
30
|
+
from fiddler3.exceptions import ( # noqa
|
|
31
|
+
ApiError,
|
|
32
|
+
AsyncJobFailed,
|
|
33
|
+
Conflict,
|
|
34
|
+
ConnectionError,
|
|
35
|
+
ConnectionTimeout,
|
|
36
|
+
HttpError,
|
|
37
|
+
IncompatibleClient,
|
|
38
|
+
NotFound,
|
|
39
|
+
Unsupported,
|
|
40
|
+
)
|
|
41
|
+
from fiddler3.schemas.custom_features import ( # noqa
|
|
42
|
+
CustomFeature,
|
|
43
|
+
Enrichment,
|
|
44
|
+
ImageEmbedding,
|
|
45
|
+
Multivariate,
|
|
46
|
+
TextEmbedding,
|
|
47
|
+
VectorFeature,
|
|
48
|
+
)
|
|
49
|
+
from fiddler3.schemas.dataset import EnvType # noqa
|
|
50
|
+
from fiddler3.schemas.deployment_params import DeploymentParams # noqa
|
|
51
|
+
from fiddler3.schemas.model_schema import ModelSchema # noqa
|
|
52
|
+
from fiddler3.schemas.model_spec import ModelSpec # noqa
|
|
53
|
+
from fiddler3.schemas.model_task_params import ModelTaskParams # noqa
|
|
54
|
+
from fiddler3.schemas.xai import ( # noqa
|
|
55
|
+
DatasetDataSource,
|
|
56
|
+
EventIdDataSource,
|
|
57
|
+
RowDataSource,
|
|
58
|
+
SqlSliceQueryDataSource,
|
|
59
|
+
)
|
|
60
|
+
from fiddler3.schemas.xai_params import XaiParams # noqa
|
|
61
|
+
from fiddler3.utils.logger import set_logging # noqa
|
|
62
|
+
|
|
63
|
+
__all__ = [
|
|
64
|
+
'Connection',
|
|
65
|
+
'ConnectionMixin',
|
|
66
|
+
'init',
|
|
67
|
+
# Constants
|
|
68
|
+
'AlertCondition',
|
|
69
|
+
'ArtifactStatus',
|
|
70
|
+
'ArtifactType',
|
|
71
|
+
'BaselineType',
|
|
72
|
+
'BinSize',
|
|
73
|
+
'CompareTo',
|
|
74
|
+
'DataType',
|
|
75
|
+
'DeploymentType',
|
|
76
|
+
'EnvType',
|
|
77
|
+
'ExplainMethod',
|
|
78
|
+
'JobStatus',
|
|
79
|
+
'ModelInputType',
|
|
80
|
+
'ModelTask',
|
|
81
|
+
'Priority',
|
|
82
|
+
'WindowSize',
|
|
83
|
+
# Schemas
|
|
84
|
+
'CustomFeature',
|
|
85
|
+
'DatasetDataSource',
|
|
86
|
+
'DeploymentParams',
|
|
87
|
+
'Enrichment',
|
|
88
|
+
'EventIdDataSource',
|
|
89
|
+
'ImageEmbedding',
|
|
90
|
+
'ModelSchema',
|
|
91
|
+
'ModelSpec',
|
|
92
|
+
'ModelTaskParams',
|
|
93
|
+
'Multivariate',
|
|
94
|
+
'RowDataSource',
|
|
95
|
+
'SqlSliceQueryDataSource',
|
|
96
|
+
'TextEmbedding',
|
|
97
|
+
'VectorFeature',
|
|
98
|
+
'XaiParams',
|
|
99
|
+
# Entities
|
|
100
|
+
'AlertRecord',
|
|
101
|
+
'AlertRule',
|
|
102
|
+
'Baseline',
|
|
103
|
+
'Dataset',
|
|
104
|
+
'File',
|
|
105
|
+
'Job',
|
|
106
|
+
'Model',
|
|
107
|
+
'ModelDeployment',
|
|
108
|
+
'Project',
|
|
109
|
+
'Webhook',
|
|
110
|
+
# Exceptions
|
|
111
|
+
'NotFound',
|
|
112
|
+
'Conflict',
|
|
113
|
+
'IncompatibleClient',
|
|
114
|
+
'AsyncJobFailed',
|
|
115
|
+
'Unsupported',
|
|
116
|
+
'HttpError',
|
|
117
|
+
'ConnectionTimeout',
|
|
118
|
+
'ConnectionError',
|
|
119
|
+
'ApiError',
|
|
120
|
+
# Utilities
|
|
121
|
+
'set_logging',
|
|
122
|
+
]
|