fiddler-client 2.2.1__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fiddler-client-2.2.1/fiddler_client.egg-info → fiddler-client-2.3.0}/PKG-INFO +6 -1
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/PUBLIC.md +5 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/__init__.py +1 -4
- fiddler-client-2.3.0/fiddler/_version.py +1 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/alert_mixin.py +2 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/api.py +1 -3
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/alert.py +14 -8
- fiddler-client-2.3.0/fiddler3/__init__.py +39 -0
- fiddler-client-2.3.0/fiddler3/configs.py +5 -0
- fiddler-client-2.3.0/fiddler3/connection.py +117 -0
- fiddler-client-2.3.0/fiddler3/constants/common.py +3 -0
- fiddler-client-2.3.0/fiddler3/constants/job.py +13 -0
- fiddler-client-2.3.0/fiddler3/constants/model.py +64 -0
- fiddler-client-2.3.0/fiddler3/decorators.py +52 -0
- fiddler-client-2.3.0/fiddler3/entities/__init__.py +3 -0
- fiddler-client-2.3.0/fiddler3/entities/base.py +76 -0
- fiddler-client-2.3.0/fiddler3/entities/helpers.py +21 -0
- fiddler-client-2.3.0/fiddler3/entities/job.py +145 -0
- fiddler-client-2.3.0/fiddler3/entities/model.py +198 -0
- fiddler-client-2.3.0/fiddler3/entities/project.py +90 -0
- fiddler-client-2.3.0/fiddler3/exceptions.py +87 -0
- fiddler-client-2.3.0/fiddler3/libs/http_client.py +220 -0
- fiddler-client-2.3.0/fiddler3/libs/semver.py +489 -0
- fiddler-client-2.3.0/fiddler3/schemas/__init__.py +5 -0
- fiddler-client-2.3.0/fiddler3/schemas/base.py +8 -0
- fiddler-client-2.3.0/fiddler3/schemas/custom_features.py +98 -0
- fiddler-client-2.3.0/fiddler3/schemas/job.py +19 -0
- fiddler-client-2.3.0/fiddler3/schemas/model.py +48 -0
- {fiddler-client-2.2.1/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/model_schema.py +1 -1
- {fiddler-client-2.2.1/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/model_spec.py +1 -1
- {fiddler-client-2.2.1/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/model_task_params.py +1 -1
- fiddler-client-2.3.0/fiddler3/schemas/organization.py +8 -0
- fiddler-client-2.3.0/fiddler3/schemas/project.py +19 -0
- fiddler-client-2.3.0/fiddler3/schemas/response.py +51 -0
- fiddler-client-2.3.0/fiddler3/schemas/server_info.py +18 -0
- fiddler-client-2.3.0/fiddler3/schemas/user.py +9 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/__init__.py +0 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_generate_schema.py +149 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_job.py +82 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_model.py +373 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_project.py +221 -0
- fiddler-client-2.3.0/fiddler3/tests/conftest.py +30 -0
- fiddler-client-2.3.0/fiddler3/tests/constants.py +14 -0
- fiddler-client-2.3.0/fiddler3/tests/test_connection.py +41 -0
- fiddler-client-2.3.0/fiddler3/tests/test_utils.py +15 -0
- fiddler-client-2.3.0/fiddler3/tests/utils.py +14 -0
- fiddler-client-2.3.0/fiddler3/utils/__init__.py +0 -0
- fiddler-client-2.3.0/fiddler3/utils/logger.py +8 -0
- fiddler-client-2.2.1/fiddler/api/generate_schema_mixin.py → fiddler-client-2.3.0/fiddler3/utils/model_schema_generator.py +23 -53
- fiddler-client-2.3.0/fiddler3/utils/version.py +17 -0
- fiddler-client-2.3.0/fiddler3/version.py +1 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0/fiddler_client.egg-info}/PKG-INFO +6 -1
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler_client.egg-info/SOURCES.txt +48 -6
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler_client.egg-info/top_level.txt +1 -0
- fiddler-client-2.3.0/tests/__init__.py +0 -0
- fiddler-client-2.3.0/tests/fiddler/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_alert.py +40 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_events_api.py +2 -2
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_upload_dataset.py +1 -1
- fiddler-client-2.3.0/tests/fiddler/utils/__init__.py +0 -0
- fiddler-client-2.2.1/fiddler/_version.py +0 -1
- fiddler-client-2.2.1/tests/fiddler/test_generate_schema.py +0 -113
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/LICENSE.txt +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/MANIFEST.in +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/README.md +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/baseline_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/custom_metrics_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/dataset_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/events_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/explainability_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/helpers.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/job_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/model_artifact_deploy.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/model_deployment_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/model_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/project_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/segments_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/api/webhooks_mixin.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/assets/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/assets/pg_reserved_words.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/constants.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/core_objects.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/exceptions.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/libs/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/libs/http_client.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/packtools/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/packtools/gem.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/packtools/keras_ig_helpers.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/packtools/project_attributions_helpers.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/packtools/template_model.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/base.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/baseline.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/custom_metric.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/dataset.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/events.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/job.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/model.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/model_deployment.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/project.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/segment.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/server_info.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/user.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schema/webhook.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schemas/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/schemas/custom_features.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/decorators.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/formatting.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/general_checks.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/helpers.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/logger.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/pandas_helper.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/response_handler.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/semver_version.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/validations.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/utils/validator.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/validators/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler/validators/dataset_validator.py +0 -0
- {fiddler-client-2.2.1/tests → fiddler-client-2.3.0/fiddler3/constants}/__init__.py +0 -0
- {fiddler-client-2.2.1/tests/fiddler → fiddler-client-2.3.0/fiddler3/libs}/__init__.py +0 -0
- {fiddler-client-2.2.1/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/xai_params.py +0 -0
- {fiddler-client-2.2.1/tests/fiddler/utils → fiddler-client-2.3.0/fiddler3/tests}/__init__.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler_client.egg-info/dependency_links.txt +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/fiddler_client.egg-info/requires.txt +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/setup.cfg +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/setup.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/base.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/helper.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_add_model.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_baseline.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_check_version_decorator.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_custom_features.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_custom_metrics.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_dataset_api.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_exceptions.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_explainability_apis.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_file_upload.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_helpers.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_job.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_model.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_project.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_response_handler.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_validations.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/test_webhook.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/utils/test_general_checks.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/utils/test_pandas.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/fiddler/utils/tests_utils.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/tests/test_object_inference.py +0 -0
- {fiddler-client-2.2.1 → fiddler-client-2.3.0}/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.3.0
|
|
4
4
|
Summary: Python client for Fiddler Service
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -42,6 +42,11 @@ Documentation for the API can be found [here](https://docs.fiddler.ai/reference/
|
|
|
42
42
|
|
|
43
43
|
Version History
|
|
44
44
|
-------------
|
|
45
|
+
### 2.3.0
|
|
46
|
+
- #### **New Features**
|
|
47
|
+
- Added support for creating alerts on the `Frequency` metric.
|
|
48
|
+
- #### **Modifications**
|
|
49
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
45
50
|
|
|
46
51
|
### 2.2.1
|
|
47
52
|
- #### **Modifications**
|
|
@@ -19,6 +19,11 @@ Documentation for the API can be found [here](https://docs.fiddler.ai/reference/
|
|
|
19
19
|
|
|
20
20
|
Version History
|
|
21
21
|
-------------
|
|
22
|
+
### 2.3.0
|
|
23
|
+
- #### **New Features**
|
|
24
|
+
- Added support for creating alerts on the `Frequency` metric.
|
|
25
|
+
- #### **Modifications**
|
|
26
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
22
27
|
|
|
23
28
|
### 2.2.1
|
|
24
29
|
- #### **Modifications**
|
|
@@ -45,11 +45,11 @@ from fiddler.schema.alert import (
|
|
|
45
45
|
from fiddler.schema.model_deployment import DeploymentParams, DeploymentType
|
|
46
46
|
from fiddler.schemas.custom_features import (
|
|
47
47
|
CustomFeature,
|
|
48
|
+
CustomFeatureType,
|
|
48
49
|
ImageEmbedding,
|
|
49
50
|
Multivariate,
|
|
50
51
|
TextEmbedding,
|
|
51
52
|
VectorFeature,
|
|
52
|
-
CustomFeatureType,
|
|
53
53
|
)
|
|
54
54
|
from fiddler.utils import ColorLogger
|
|
55
55
|
from fiddler.utils.logger import get_logger
|
|
@@ -61,9 +61,6 @@ from fiddler.utils.validator import (
|
|
|
61
61
|
|
|
62
62
|
logger = get_logger(__name__)
|
|
63
63
|
|
|
64
|
-
SUPPORTED_API_VERSIONS = ['v2']
|
|
65
|
-
|
|
66
|
-
|
|
67
64
|
__all__ = [
|
|
68
65
|
'__version__',
|
|
69
66
|
'BatchPublishType',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.3.0'
|
|
@@ -54,6 +54,7 @@ class AlertMixin:
|
|
|
54
54
|
alert_type: Optional[AlertType] = None,
|
|
55
55
|
baseline_id: Optional[str] = None,
|
|
56
56
|
compare_period: Optional[ComparePeriod] = None,
|
|
57
|
+
category: Optional[str] = None,
|
|
57
58
|
column: Optional[str] = None,
|
|
58
59
|
columns: Optional[List[str]] = None,
|
|
59
60
|
warning_threshold: Optional[float] = None,
|
|
@@ -146,6 +147,7 @@ class AlertMixin:
|
|
|
146
147
|
alert_type=alert_type,
|
|
147
148
|
metric=metric,
|
|
148
149
|
metric_id=metric,
|
|
150
|
+
category=category,
|
|
149
151
|
compare_to=compare_to,
|
|
150
152
|
compare_period=compare_period,
|
|
151
153
|
priority=priority,
|
|
@@ -4,18 +4,17 @@ from urllib.parse import urljoin
|
|
|
4
4
|
from fiddler._version import __version__
|
|
5
5
|
from fiddler.api.alert_mixin import AlertMixin
|
|
6
6
|
from fiddler.api.baseline_mixin import BaselineMixin
|
|
7
|
+
from fiddler.api.custom_metrics_mixin import CustomMetricsMixin
|
|
7
8
|
|
|
8
9
|
# @todo: This is v1 implementation needs to have a proper v2 approach
|
|
9
10
|
from fiddler.api.dataset_mixin import DatasetMixin
|
|
10
11
|
from fiddler.api.events_mixin import EventsMixin
|
|
11
12
|
from fiddler.api.explainability_mixin import ExplainabilityMixin
|
|
12
|
-
from fiddler.api.generate_schema_mixin import GenerateSchemaMixin
|
|
13
13
|
from fiddler.api.job_mixin import JobMixin
|
|
14
14
|
from fiddler.api.model_deployment_mixin import ModelDeploymentMixin
|
|
15
15
|
from fiddler.api.model_mixin import ModelMixin
|
|
16
16
|
from fiddler.api.project_mixin import ProjectMixin
|
|
17
17
|
from fiddler.api.webhooks_mixin import WebhookMixin
|
|
18
|
-
from fiddler.api.custom_metrics_mixin import CustomMetricsMixin
|
|
19
18
|
from fiddler.constants import (
|
|
20
19
|
CURRENT_API_VERSION,
|
|
21
20
|
FIDDLER_CLIENT_VERSION_HEADER,
|
|
@@ -40,7 +39,6 @@ class FiddlerClient(
|
|
|
40
39
|
AlertMixin,
|
|
41
40
|
ExplainabilityMixin,
|
|
42
41
|
ModelDeploymentMixin,
|
|
43
|
-
GenerateSchemaMixin,
|
|
44
42
|
WebhookMixin,
|
|
45
43
|
CustomMetricsMixin,
|
|
46
44
|
):
|
|
@@ -30,9 +30,9 @@ class Metric(str, enum.Enum):
|
|
|
30
30
|
PSI = 'psi'
|
|
31
31
|
|
|
32
32
|
## Data Integrity Metrics
|
|
33
|
-
MISSING_VALUE = '
|
|
34
|
-
RANGE_VIOLATION = '
|
|
35
|
-
TYPE_VIOLATION = '
|
|
33
|
+
MISSING_VALUE = 'null_violation_count'
|
|
34
|
+
RANGE_VIOLATION = 'range_violation_count'
|
|
35
|
+
TYPE_VIOLATION = 'type_violation_count'
|
|
36
36
|
|
|
37
37
|
## Performance metrics
|
|
38
38
|
# Binary Classification
|
|
@@ -40,10 +40,13 @@ class Metric(str, enum.Enum):
|
|
|
40
40
|
RECALL = 'recall'
|
|
41
41
|
FPR = 'fpr'
|
|
42
42
|
PRECISION = 'precision'
|
|
43
|
-
TPR = 'tpr'
|
|
44
43
|
AUC = 'auc'
|
|
45
44
|
F1_SCORE = 'f1_score'
|
|
46
|
-
ECE = '
|
|
45
|
+
ECE = 'expected_calibration_error'
|
|
46
|
+
CALIBRATED_THRESHOLD = 'calibrated_threshold'
|
|
47
|
+
GMEAN = 'geometric_mean'
|
|
48
|
+
LOG_LOSS = 'log_loss'
|
|
49
|
+
|
|
47
50
|
|
|
48
51
|
# Regression
|
|
49
52
|
R2 = 'r2'
|
|
@@ -53,18 +56,19 @@ class Metric(str, enum.Enum):
|
|
|
53
56
|
MAE = 'mae'
|
|
54
57
|
|
|
55
58
|
# Multiclass Classification
|
|
56
|
-
|
|
59
|
+
LOG_LOSS_COUNT = 'log_loss_count'
|
|
57
60
|
|
|
58
61
|
# Ranking
|
|
59
62
|
MAP = 'map'
|
|
60
|
-
|
|
63
|
+
NDCG_MEAN = 'ndcg_mean'
|
|
61
64
|
|
|
62
65
|
## Service Metrics
|
|
63
|
-
TRAFFIC = '
|
|
66
|
+
TRAFFIC = 'traffic'
|
|
64
67
|
|
|
65
68
|
## Statistic
|
|
66
69
|
AVERAGE = 'average'
|
|
67
70
|
SUM = 'sum'
|
|
71
|
+
FREQUENCY = 'frequency'
|
|
68
72
|
|
|
69
73
|
def __repr__(self) -> str:
|
|
70
74
|
return f'{self.__class__.__name__}.{self.name}'
|
|
@@ -144,6 +148,7 @@ class AlertRulePayload(BaseDataSchema):
|
|
|
144
148
|
metric_id: Union[Metric, str]
|
|
145
149
|
feature_name: Optional[str]
|
|
146
150
|
feature_names: Optional[List[str]]
|
|
151
|
+
category: Optional[str]
|
|
147
152
|
priority: Priority
|
|
148
153
|
compare_to: CompareTo
|
|
149
154
|
baseline_name: Optional[str]
|
|
@@ -172,6 +177,7 @@ class AlertRule(BaseDataSchema):
|
|
|
172
177
|
metric: str
|
|
173
178
|
column: Optional[str] = Field(alias='feature_name', default=None)
|
|
174
179
|
columns: Optional[List[str]] = Field(alias='feature_names', default=None)
|
|
180
|
+
category: Optional[str]
|
|
175
181
|
baseline_name: Optional[str]
|
|
176
182
|
priority: Priority
|
|
177
183
|
compare_to: CompareTo
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from fiddler3.configs import DEFAULT_CONNECTION_TIMEOUT
|
|
4
|
+
from fiddler3.connection import Connection
|
|
5
|
+
from fiddler3.entities import * # noqa
|
|
6
|
+
from fiddler3.exceptions import * # noqa
|
|
7
|
+
from fiddler3.schemas import * # noqa
|
|
8
|
+
|
|
9
|
+
# Global connection object
|
|
10
|
+
connection: Connection | None = None
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def init(
|
|
14
|
+
url: str,
|
|
15
|
+
token: str,
|
|
16
|
+
proxies: dict | None = None,
|
|
17
|
+
timeout: int = DEFAULT_CONNECTION_TIMEOUT,
|
|
18
|
+
verify: bool = True,
|
|
19
|
+
validate: bool = True,
|
|
20
|
+
) -> None:
|
|
21
|
+
"""
|
|
22
|
+
Initiate Python Client Connection
|
|
23
|
+
:param url: URL of Fiddler Platform
|
|
24
|
+
:param token: Authorization token
|
|
25
|
+
:param proxies: Dictionary mapping protocol to the URL of the proxy
|
|
26
|
+
:param timeout: Seconds to wait for the server to send data before giving up
|
|
27
|
+
:param verify: Controls whether we verify the server’s TLS certificate
|
|
28
|
+
:param validate: Whether to validate the server/client version compatibility.
|
|
29
|
+
Some functionalities might not work if this is turned off.
|
|
30
|
+
"""
|
|
31
|
+
global connection
|
|
32
|
+
connection = Connection(
|
|
33
|
+
url=url,
|
|
34
|
+
token=token,
|
|
35
|
+
proxies=proxies,
|
|
36
|
+
timeout=timeout,
|
|
37
|
+
verify=verify,
|
|
38
|
+
validate=validate,
|
|
39
|
+
)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from fiddler3.configs import DEFAULT_CONNECTION_TIMEOUT, MIN_SERVER_VERSION
|
|
7
|
+
from fiddler3.constants.common import CLIENT_NAME, FIDDLER_CLIENT_VERSION_HEADER
|
|
8
|
+
from fiddler3.decorators import handle_api_error
|
|
9
|
+
from fiddler3.exceptions import IncompatibleClient
|
|
10
|
+
from fiddler3.libs.http_client import RequestClient
|
|
11
|
+
from fiddler3.schemas.server_info import ServerInfo, Version
|
|
12
|
+
from fiddler3.utils.logger import get_logger
|
|
13
|
+
from fiddler3.utils.version import match_semver
|
|
14
|
+
from fiddler3.version import __version__
|
|
15
|
+
|
|
16
|
+
logger = get_logger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Connection:
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
url: str,
|
|
23
|
+
token: str,
|
|
24
|
+
proxies: dict | None = None,
|
|
25
|
+
timeout: int = DEFAULT_CONNECTION_TIMEOUT,
|
|
26
|
+
verify: bool = True,
|
|
27
|
+
validate: bool = True,
|
|
28
|
+
) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Initiate connection to Fiddler Platform
|
|
31
|
+
:param url: URL of Fiddler Platform
|
|
32
|
+
:param token: Authorization token
|
|
33
|
+
:param proxies: Dictionary mapping protocol to the URL of the proxy
|
|
34
|
+
:param timeout: Seconds to wait for the server to send data before giving up
|
|
35
|
+
:param verify: Controls whether we verify the server’s TLS certificate
|
|
36
|
+
:param validate: Whether to validate the server/client version compatibility.
|
|
37
|
+
Some functionalities might not work if this is turned off.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
self.url = url
|
|
41
|
+
self.token = token
|
|
42
|
+
self.proxies = proxies
|
|
43
|
+
self.timeout = timeout
|
|
44
|
+
self.verify = verify
|
|
45
|
+
|
|
46
|
+
if not url:
|
|
47
|
+
raise ValueError('Please pass a valid url')
|
|
48
|
+
|
|
49
|
+
if not token:
|
|
50
|
+
raise ValueError('Please pass a valid token')
|
|
51
|
+
|
|
52
|
+
self.request_headers = {
|
|
53
|
+
'Authorization': f'Bearer {token}',
|
|
54
|
+
FIDDLER_CLIENT_VERSION_HEADER: __version__,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if validate:
|
|
58
|
+
self._check_server_version()
|
|
59
|
+
self._check_version_compatibility()
|
|
60
|
+
|
|
61
|
+
@cached_property
|
|
62
|
+
def client(self) -> RequestClient:
|
|
63
|
+
"""Request client instance"""
|
|
64
|
+
return RequestClient(
|
|
65
|
+
base_url=self.url,
|
|
66
|
+
headers=self.request_headers,
|
|
67
|
+
proxies=self.proxies,
|
|
68
|
+
verify=self.verify,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@cached_property
|
|
72
|
+
def server_info(self) -> ServerInfo:
|
|
73
|
+
"""Server info instance"""
|
|
74
|
+
return self._get_server_info()
|
|
75
|
+
|
|
76
|
+
@cached_property
|
|
77
|
+
def server_version(self) -> Version:
|
|
78
|
+
"""Server semver version"""
|
|
79
|
+
return self.server_info.server_version
|
|
80
|
+
|
|
81
|
+
@cached_property
|
|
82
|
+
def organization_name(self) -> str:
|
|
83
|
+
"""Organization name"""
|
|
84
|
+
return self.server_info.organization.name
|
|
85
|
+
|
|
86
|
+
@cached_property
|
|
87
|
+
def organization_id(self) -> UUID:
|
|
88
|
+
"""Organization id"""
|
|
89
|
+
return self.server_info.organization.id
|
|
90
|
+
|
|
91
|
+
@handle_api_error
|
|
92
|
+
def _get_server_info(self) -> ServerInfo:
|
|
93
|
+
"""Get server info"""
|
|
94
|
+
response = self.client.get(
|
|
95
|
+
url='/v3/server-info',
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return ServerInfo(**response.json().get('data'))
|
|
99
|
+
|
|
100
|
+
@handle_api_error
|
|
101
|
+
def _check_version_compatibility(self) -> None:
|
|
102
|
+
"""Check whether Client version is compatible with Fiddler Platform version"""
|
|
103
|
+
|
|
104
|
+
self.client.get(
|
|
105
|
+
url='/v3/version-compatibility',
|
|
106
|
+
params={
|
|
107
|
+
'client_version': __version__,
|
|
108
|
+
'client_name': CLIENT_NAME,
|
|
109
|
+
},
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
def _check_server_version(self) -> None:
|
|
113
|
+
"""Check whether Fiddler Platform version is compatible with Client version"""
|
|
114
|
+
if match_semver(self.server_version, f'>={MIN_SERVER_VERSION}'):
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
raise IncompatibleClient(server_version=str(self.server_version))
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import enum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@enum.unique
|
|
7
|
+
class ModelInputType(str, enum.Enum):
|
|
8
|
+
"""Input data type used by the model"""
|
|
9
|
+
|
|
10
|
+
TABULAR = 'structured'
|
|
11
|
+
TEXT = 'text'
|
|
12
|
+
MIXED = 'mixed'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@enum.unique
|
|
16
|
+
class ModelTask(str, enum.Enum):
|
|
17
|
+
"""Task the model is designed to address"""
|
|
18
|
+
|
|
19
|
+
BINARY_CLASSIFICATION = 'binary_classification'
|
|
20
|
+
MULTICLASS_CLASSIFICATION = 'multiclass_classification'
|
|
21
|
+
REGRESSION = 'regression'
|
|
22
|
+
RANKING = 'ranking'
|
|
23
|
+
LLM = 'llm'
|
|
24
|
+
NOT_SET = 'not_set'
|
|
25
|
+
|
|
26
|
+
def is_classification(self) -> bool:
|
|
27
|
+
return self in {
|
|
28
|
+
ModelTask.BINARY_CLASSIFICATION,
|
|
29
|
+
ModelTask.MULTICLASS_CLASSIFICATION,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
def is_regression(self) -> bool:
|
|
33
|
+
return self == ModelTask.REGRESSION
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@enum.unique
|
|
37
|
+
class DataType(str, enum.Enum):
|
|
38
|
+
"""Data types supported for model columns"""
|
|
39
|
+
|
|
40
|
+
FLOAT = 'float'
|
|
41
|
+
INTEGER = 'int'
|
|
42
|
+
BOOLEAN = 'bool'
|
|
43
|
+
STRING = 'str'
|
|
44
|
+
CATEGORY = 'category'
|
|
45
|
+
TIMESTAMP = 'timestamp'
|
|
46
|
+
VECTOR = 'vector'
|
|
47
|
+
|
|
48
|
+
def is_numeric(self) -> bool:
|
|
49
|
+
return self in {DataType.INTEGER, DataType.FLOAT}
|
|
50
|
+
|
|
51
|
+
def is_bool_or_cat(self) -> bool:
|
|
52
|
+
return self in {DataType.BOOLEAN, DataType.CATEGORY}
|
|
53
|
+
|
|
54
|
+
def is_vector(self) -> bool:
|
|
55
|
+
return self == DataType.VECTOR
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@enum.unique
|
|
59
|
+
class ArtifactStatus(str, enum.Enum):
|
|
60
|
+
"""Artifact Status"""
|
|
61
|
+
|
|
62
|
+
NO_MODEL = 'no_model'
|
|
63
|
+
SURROGATE = 'surrogate'
|
|
64
|
+
USER_UPLOADED = 'user_uploaded'
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from functools import wraps
|
|
2
|
+
from http import HTTPStatus
|
|
3
|
+
from typing import Any, Callable, TypeVar, cast
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
from fiddler3.exceptions import ApiError, Conflict, HttpError, NotFound, Unsupported
|
|
8
|
+
from fiddler3.schemas.response import ErrorResponse
|
|
9
|
+
from fiddler3.utils.logger import get_logger
|
|
10
|
+
|
|
11
|
+
logger = get_logger(__name__)
|
|
12
|
+
|
|
13
|
+
_WrappedFuncType = TypeVar( # pylint: disable=invalid-name
|
|
14
|
+
'_WrappedFuncType', bound=Callable[..., Any]
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def handle_api_error(func: _WrappedFuncType) -> _WrappedFuncType:
|
|
19
|
+
@wraps(func)
|
|
20
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
21
|
+
try:
|
|
22
|
+
return func(*args, **kwargs)
|
|
23
|
+
except requests.JSONDecodeError as e:
|
|
24
|
+
raise HttpError(message=f'Invalid JSON response - {e.doc}') # type: ignore
|
|
25
|
+
except requests.HTTPError as e:
|
|
26
|
+
logger.error(
|
|
27
|
+
'HTTP request to %s failed with %s - %s',
|
|
28
|
+
getattr(e.request, 'url', 'unknown'),
|
|
29
|
+
getattr(e.response, 'status_code', 'unknown'),
|
|
30
|
+
getattr(e.response, 'content', 'missing'),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
status_code = e.response.status_code or HTTPStatus.INTERNAL_SERVER_ERROR
|
|
34
|
+
|
|
35
|
+
if status_code == HTTPStatus.METHOD_NOT_ALLOWED:
|
|
36
|
+
raise Unsupported()
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
error_resp = ErrorResponse(**e.response.json())
|
|
40
|
+
except requests.JSONDecodeError:
|
|
41
|
+
raise HttpError(
|
|
42
|
+
message=f'Invalid response content-type - {e.response.content}'
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
if status_code == HTTPStatus.CONFLICT:
|
|
46
|
+
raise Conflict(error_resp.error)
|
|
47
|
+
if status_code == HTTPStatus.NOT_FOUND:
|
|
48
|
+
raise NotFound(error_resp.error)
|
|
49
|
+
|
|
50
|
+
raise ApiError(error_resp.error)
|
|
51
|
+
|
|
52
|
+
return cast(_WrappedFuncType, wrapper)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Iterator, TypeVar
|
|
4
|
+
|
|
5
|
+
from requests import Response
|
|
6
|
+
|
|
7
|
+
from fiddler3 import Connection
|
|
8
|
+
from fiddler3.configs import DEFAULT_PAGE_SIZE
|
|
9
|
+
from fiddler3.libs.http_client import RequestClient
|
|
10
|
+
from fiddler3.schemas.response import PaginatedApiResponse
|
|
11
|
+
|
|
12
|
+
BaseEntityType = TypeVar( # pylint: disable=invalid-name
|
|
13
|
+
'BaseEntityType', bound='BaseEntity'
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BaseEntity:
|
|
18
|
+
@classmethod
|
|
19
|
+
def _connection(cls) -> Connection:
|
|
20
|
+
"""Fiddler connection instance"""
|
|
21
|
+
from fiddler3 import connection
|
|
22
|
+
|
|
23
|
+
assert connection is not None
|
|
24
|
+
return connection
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def _client(cls) -> RequestClient:
|
|
28
|
+
"""Request client instance"""
|
|
29
|
+
return cls._connection().client
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def _from_response(cls: type[BaseEntityType], response: Response) -> BaseEntityType:
|
|
33
|
+
"""Build entity object from the given response"""
|
|
34
|
+
return cls._from_dict(data=response.json()['data'])
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def _from_dict(cls: type[BaseEntityType], data: dict) -> BaseEntityType:
|
|
38
|
+
"""Build entity object from the given dictionary"""
|
|
39
|
+
raise NotImplementedError()
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def _paginate(
|
|
43
|
+
cls, url: str, params: dict | None = None, page_size: int = DEFAULT_PAGE_SIZE
|
|
44
|
+
) -> Iterator[dict]:
|
|
45
|
+
"""
|
|
46
|
+
Iterator over pagination API
|
|
47
|
+
:param url: Pagination endpoint
|
|
48
|
+
:param page_size: Number of items per page
|
|
49
|
+
:return: Iterator of items
|
|
50
|
+
"""
|
|
51
|
+
offset = 0
|
|
52
|
+
params = params or {}
|
|
53
|
+
params.update(
|
|
54
|
+
{
|
|
55
|
+
'limit': page_size,
|
|
56
|
+
'offset': offset,
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
while True:
|
|
61
|
+
response = cls._client().get(
|
|
62
|
+
url=url,
|
|
63
|
+
params={
|
|
64
|
+
'limit': page_size,
|
|
65
|
+
'offset': offset,
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
resp_obj = PaginatedApiResponse(**response.json()).data
|
|
69
|
+
|
|
70
|
+
if resp_obj.page_count == resp_obj.page_index:
|
|
71
|
+
break
|
|
72
|
+
|
|
73
|
+
yield from resp_obj.items
|
|
74
|
+
|
|
75
|
+
# Update offset
|
|
76
|
+
offset = resp_obj.offset + page_size
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
|
|
3
|
+
from fiddler3.exceptions import NotFound
|
|
4
|
+
from fiddler3.schemas.response import ErrorData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def raise_not_found(message: str) -> None:
|
|
8
|
+
"""Raise NotFound if the resource is not found while fetching with names"""
|
|
9
|
+
raise NotFound(
|
|
10
|
+
error=ErrorData(
|
|
11
|
+
code=HTTPStatus.NOT_FOUND,
|
|
12
|
+
message=message,
|
|
13
|
+
errors=[
|
|
14
|
+
{
|
|
15
|
+
'reason': 'ObjectNotFound', # type: ignore
|
|
16
|
+
'message': message,
|
|
17
|
+
'help': '',
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
),
|
|
21
|
+
)
|