fiddler-client 3.4.0.dev2__tar.gz → 3.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-3.4.0.dev2/fiddler_client.egg-info → fiddler_client-3.5.0.dev2}/PKG-INFO +2 -2
- fiddler_client-3.5.0.dev2/fiddler/VERSION +1 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/__init__.py +2 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/connection.py +6 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/common.py +2 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/xai.py +9 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/alert_rule.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/xai.py +99 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/exceptions.py +2 -2
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/alert_record.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/alert_rule.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/base.py +2 -2
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/baseline.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/custom_features.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/file.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/model.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/model_schema.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/model_spec.py +11 -5
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/user.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/xai.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/xai_params.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_alert_rule.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model.py +11 -5
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_webhook.py +6 -6
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_xai.py +30 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/constants.py +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/test_connection.py +11 -1
- fiddler_client-3.5.0.dev2/fiddler/utils/decorators.py +48 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2/fiddler_client.egg-info}/PKG-INFO +2 -2
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler_client.egg-info/SOURCES.txt +1 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler_client.egg-info/requires.txt +1 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/setup.py +4 -1
- fiddler_client-3.4.0.dev2/fiddler/VERSION +0 -1
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/LICENSE.txt +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/MANIFEST.in +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/PUBLIC.md +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/README.md +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/configs.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/alert_rule.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/baseline.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/dataset.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/events.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/job.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/model.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/model_deployment.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/decorators.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/alert_record.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/base.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/baseline.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/custom_expression.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/dataset.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/events.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/file.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/job.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/model.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/model_artifact.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/model_deployment.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/organization.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/project.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/surrogate.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/user.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/webhook.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/libs/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/libs/http_client.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/libs/json_encoder.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/libs/semver.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/packtools/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/packtools/gem.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/packtools/keras_ig_helpers.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/packtools/project_attributions_helpers.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/packtools/template_model.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/custom_expression.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/dataset.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/events.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/filter_query.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/job.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/model_deployment.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/model_task_params.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/organization.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/project.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/response.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/server_info.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/webhook.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_alert_record.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_baseline.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_custom_metric.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_dataset.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_events.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_files.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_generate_model.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_job.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_mixin.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model_artifact.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model_deployment.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model_surrogate.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_project.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_segment.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/conftest.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/test_json_encoder.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/test_logger.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/test_utils.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/utils.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/utils/__init__.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/utils/helpers.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/utils/logger.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/utils/model_generator.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/utils/validations.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/utils/version.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/version.py +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler_client.egg-info/dependency_links.txt +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler_client.egg-info/top_level.txt +0 -0
- {fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.0.dev2
|
|
4
4
|
Summary: Python client for Fiddler Platform
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -14,7 +14,7 @@ Requires-Dist: pip>=21.0
|
|
|
14
14
|
Requires-Dist: requests<3
|
|
15
15
|
Requires-Dist: requests-toolbelt
|
|
16
16
|
Requires-Dist: pandas>=1.2.5
|
|
17
|
-
Requires-Dist: pydantic
|
|
17
|
+
Requires-Dist: pydantic>=1.10.17
|
|
18
18
|
Requires-Dist: deprecated==1.2.14
|
|
19
19
|
Requires-Dist: tqdm
|
|
20
20
|
Requires-Dist: simplejson>=3.17.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.5.0.dev2
|
|
@@ -18,7 +18,7 @@ from fiddler.constants.model import ( # noqa
|
|
|
18
18
|
ModelTask,
|
|
19
19
|
)
|
|
20
20
|
from fiddler.constants.model_deployment import ArtifactType, DeploymentType # noqa
|
|
21
|
-
from fiddler.constants.xai import ExplainMethod # noqa
|
|
21
|
+
from fiddler.constants.xai import DownloadFormat, ExplainMethod # noqa
|
|
22
22
|
from fiddler.entities.alert_record import AlertRecord # noqa
|
|
23
23
|
from fiddler.entities.alert_rule import AlertRule # noqa
|
|
24
24
|
from fiddler.entities.baseline import Baseline, BaselineCompact # noqa
|
|
@@ -89,6 +89,7 @@ __all__ = [
|
|
|
89
89
|
'CompareTo',
|
|
90
90
|
'DataType',
|
|
91
91
|
'DeploymentType',
|
|
92
|
+
'DownloadFormat',
|
|
92
93
|
'EnvType',
|
|
93
94
|
'ExplainMethod',
|
|
94
95
|
'JobStatus',
|
|
@@ -4,7 +4,11 @@ from functools import cached_property
|
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
6
|
from fiddler.configs import DEFAULT_CONNECTION_TIMEOUT, MIN_SERVER_VERSION
|
|
7
|
-
from fiddler.constants.common import
|
|
7
|
+
from fiddler.constants.common import (
|
|
8
|
+
CLIENT_NAME,
|
|
9
|
+
FIDDLER_CLIENT_NAME_HEADER,
|
|
10
|
+
FIDDLER_CLIENT_VERSION_HEADER,
|
|
11
|
+
)
|
|
8
12
|
from fiddler.decorators import handle_api_error
|
|
9
13
|
from fiddler.exceptions import IncompatibleClient
|
|
10
14
|
from fiddler.libs.http_client import RequestClient
|
|
@@ -52,6 +56,7 @@ class Connection:
|
|
|
52
56
|
|
|
53
57
|
self.request_headers = {
|
|
54
58
|
'Authorization': f'Bearer {token}',
|
|
59
|
+
FIDDLER_CLIENT_NAME_HEADER: CLIENT_NAME,
|
|
55
60
|
FIDDLER_CLIENT_VERSION_HEADER: __version__,
|
|
56
61
|
}
|
|
57
62
|
|
|
@@ -6,6 +6,8 @@ TIMESTAMP_FORMAT = '%Y-%m-%d %H:%M:%S.%f'
|
|
|
6
6
|
# Headers
|
|
7
7
|
CONTENT_TYPE_HEADER_KEY = 'Content-Type'
|
|
8
8
|
JSON_CONTENT_TYPE = 'application/json'
|
|
9
|
+
|
|
10
|
+
FIDDLER_CLIENT_NAME_HEADER = 'X-Fiddler-Client-Name'
|
|
9
11
|
FIDDLER_CLIENT_VERSION_HEADER = 'X-Fiddler-Client-Version'
|
|
10
12
|
|
|
11
13
|
# Multi-part upload
|
|
@@ -9,3 +9,12 @@ class ExplainMethod(str, enum.Enum):
|
|
|
9
9
|
PERMUTE = 'PERMUTE'
|
|
10
10
|
ZERO_RESET = 'ZERO_RESET'
|
|
11
11
|
MEAN_RESET = 'MEAN_RESET'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@enum.unique
|
|
15
|
+
class DownloadFormat(str, enum.Enum):
|
|
16
|
+
PARQUET = 'PARQUET'
|
|
17
|
+
CSV = 'CSV'
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
DEFAULT_DOWNLOAD_CHUNK_SIZE = 1000
|
|
@@ -5,7 +5,7 @@ from datetime import datetime
|
|
|
5
5
|
from typing import Any, Iterator
|
|
6
6
|
from uuid import UUID
|
|
7
7
|
|
|
8
|
-
from pydantic import ValidationError
|
|
8
|
+
from pydantic.v1 import ValidationError
|
|
9
9
|
|
|
10
10
|
from fiddler.constants.alert_rule import AlertCondition, BinSize, CompareTo, Priority
|
|
11
11
|
from fiddler.decorators import handle_api_error
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
from collections import namedtuple
|
|
5
|
+
from datetime import datetime, timezone
|
|
5
6
|
from io import BytesIO
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import Any, Callable
|
|
@@ -10,7 +11,11 @@ from uuid import UUID
|
|
|
10
11
|
import pandas as pd
|
|
11
12
|
|
|
12
13
|
from fiddler.constants.dataset import EnvType
|
|
13
|
-
from fiddler.constants.xai import
|
|
14
|
+
from fiddler.constants.xai import (
|
|
15
|
+
DEFAULT_DOWNLOAD_CHUNK_SIZE,
|
|
16
|
+
DownloadFormat,
|
|
17
|
+
ExplainMethod,
|
|
18
|
+
)
|
|
14
19
|
from fiddler.decorators import handle_api_error
|
|
15
20
|
from fiddler.entities.job import Job
|
|
16
21
|
from fiddler.schemas.job import JobCompactResp
|
|
@@ -20,6 +25,7 @@ from fiddler.schemas.xai import (
|
|
|
20
25
|
RowDataSource,
|
|
21
26
|
SqlSliceQueryDataSource,
|
|
22
27
|
)
|
|
28
|
+
from fiddler.utils.decorators import check_version
|
|
23
29
|
from fiddler.utils.helpers import try_series_retype
|
|
24
30
|
from fiddler.utils.logger import get_logger
|
|
25
31
|
|
|
@@ -134,6 +140,97 @@ class XaiMixin:
|
|
|
134
140
|
df[column_name] = try_series_retype(df[column_name], dtype)
|
|
135
141
|
return df
|
|
136
142
|
|
|
143
|
+
@handle_api_error
|
|
144
|
+
def download_data( # pylint: disable=too-many-arguments
|
|
145
|
+
self,
|
|
146
|
+
output_dir: Path | str,
|
|
147
|
+
env_type: EnvType,
|
|
148
|
+
env_id: UUID | None = None,
|
|
149
|
+
start_time: datetime | None = None,
|
|
150
|
+
end_time: datetime | None = None,
|
|
151
|
+
segment_id: UUID | None = None,
|
|
152
|
+
segment_definition: UUID | None = None,
|
|
153
|
+
max_rows: int | None = None,
|
|
154
|
+
columns: list[str] | None = None,
|
|
155
|
+
chunk_size: int | None = DEFAULT_DOWNLOAD_CHUNK_SIZE,
|
|
156
|
+
fetch_vectors: bool | None = None,
|
|
157
|
+
output_format: DownloadFormat = DownloadFormat.PARQUET,
|
|
158
|
+
) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Download data with a slice data configuration to PARQUET or CSV file.
|
|
161
|
+
|
|
162
|
+
:param output_dir: Path to download the file
|
|
163
|
+
:param env_type: Type of environment to query (PRODUCTION or PRE_PRODUCTION)
|
|
164
|
+
:param env_id: If PRE_PRODUCTION env selected, provide the uuid of the dataset to query
|
|
165
|
+
:param start_time: Start time to retrieve data, only for PRODUCTION env. If not time zone is indicated, we will infer UTC time zone.
|
|
166
|
+
:param start_time: End time to retrieve data, only for PRODUCTION env. If not time zone is indicated, we will infer UTC time zone.
|
|
167
|
+
:param segment_id: Optional segment UUID to query data using a saved segment associated with the model
|
|
168
|
+
:param segment_definition: Optional segment FQL definition to query data using an applied segment. This segment will not be saved to the model.
|
|
169
|
+
:param columns: Allows caller to explicitly specify list of columns to retrieve. Default to None which fetch all columns from the model.
|
|
170
|
+
:param max_rows: Number of maximum rows to fetch
|
|
171
|
+
:param chunk_size: Number of rows per chunk to download data. Default to 1000. You can increase that number for faster download if you query less than 1000 columns and don't have vector columns.
|
|
172
|
+
:param fetch_vectors: Whether the vectors columns are fetched or not. Default to False.
|
|
173
|
+
:param output_format: Format indicating if the result should be a CSV file or a PARQUET file. Default to PARQUET file.
|
|
174
|
+
"""
|
|
175
|
+
self._check_id_attributes()
|
|
176
|
+
|
|
177
|
+
output_dir = Path(output_dir)
|
|
178
|
+
if not output_dir.exists():
|
|
179
|
+
os.makedirs(output_dir)
|
|
180
|
+
|
|
181
|
+
payload: dict[str, Any] = {
|
|
182
|
+
'model_id': self.id,
|
|
183
|
+
'env_type': env_type,
|
|
184
|
+
'csv': True if output_format == DownloadFormat.CSV else False,
|
|
185
|
+
'column_names': columns,
|
|
186
|
+
}
|
|
187
|
+
if env_id:
|
|
188
|
+
payload['env_id'] = env_id
|
|
189
|
+
if start_time or end_time:
|
|
190
|
+
payload['time_filter'] = {
|
|
191
|
+
'start_time': start_time.astimezone(timezone.utc).strftime(
|
|
192
|
+
'%Y-%m-%d %H:%M:%S'
|
|
193
|
+
)
|
|
194
|
+
if start_time
|
|
195
|
+
else None,
|
|
196
|
+
'end_time': end_time.astimezone(timezone.utc).strftime(
|
|
197
|
+
'%Y-%m-%d %H:%M:%S'
|
|
198
|
+
)
|
|
199
|
+
if end_time
|
|
200
|
+
else None,
|
|
201
|
+
'time_zone': 'UTC',
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if segment_id or segment_definition:
|
|
205
|
+
payload['segment'] = {'id': segment_id, 'definition': segment_definition}
|
|
206
|
+
|
|
207
|
+
if max_rows:
|
|
208
|
+
payload['num_samples'] = max_rows
|
|
209
|
+
|
|
210
|
+
if chunk_size:
|
|
211
|
+
payload['chunk_size'] = chunk_size
|
|
212
|
+
|
|
213
|
+
if fetch_vectors:
|
|
214
|
+
payload['fetch_vectors'] = fetch_vectors
|
|
215
|
+
|
|
216
|
+
file_path = os.path.join(
|
|
217
|
+
output_dir,
|
|
218
|
+
'output.csv' if output_format == DownloadFormat.CSV else 'output.parquet',
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
with self._client().post(
|
|
222
|
+
url='/v3/analytics/download-slice-data', data=payload
|
|
223
|
+
) as resp:
|
|
224
|
+
# Download file
|
|
225
|
+
with open(file_path, 'wb') as f:
|
|
226
|
+
for chunk in resp.iter_content(chunk_size=chunk_size):
|
|
227
|
+
if chunk:
|
|
228
|
+
f.write(chunk)
|
|
229
|
+
|
|
230
|
+
logger.info(
|
|
231
|
+
'Data succesfully downloaded',
|
|
232
|
+
)
|
|
233
|
+
|
|
137
234
|
@handle_api_error
|
|
138
235
|
def download_slice( # pylint: disable=too-many-arguments
|
|
139
236
|
self,
|
|
@@ -536,6 +633,7 @@ class XaiMixin:
|
|
|
536
633
|
'API response.'
|
|
537
634
|
)
|
|
538
635
|
|
|
636
|
+
@check_version(version_expr='>=24.11.1')
|
|
539
637
|
@handle_api_error
|
|
540
638
|
def upload_feature_impact(
|
|
541
639
|
self, feature_impact_map: dict, update: bool = False
|
|
@@ -34,8 +34,8 @@ class IncompatibleClient(BaseError):
|
|
|
34
34
|
# @TODO - Add link to compatibility matrix doc
|
|
35
35
|
)
|
|
36
36
|
|
|
37
|
-
def __init__(self, server_version: str) -> None:
|
|
38
|
-
self.message = self.message.format(
|
|
37
|
+
def __init__(self, server_version: str, message: str | None = None) -> None:
|
|
38
|
+
self.message = message or self.message.format(
|
|
39
39
|
client_version=__version__, server_version=server_version
|
|
40
40
|
)
|
|
41
41
|
|
|
@@ -2,7 +2,7 @@ from datetime import datetime
|
|
|
2
2
|
from typing import List, Optional, Union
|
|
3
3
|
from uuid import UUID
|
|
4
4
|
|
|
5
|
-
from pydantic import Field
|
|
5
|
+
from pydantic.v1 import Field
|
|
6
6
|
|
|
7
7
|
from fiddler.constants.alert_rule import AlertCondition, BinSize, CompareTo, Priority
|
|
8
8
|
from fiddler.schemas.base import BaseModel
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import Any, Dict, List, Optional, Type, TypeVar, Literal
|
|
2
2
|
|
|
3
|
-
from pydantic import BaseModel, validator
|
|
3
|
+
from pydantic.v1 import BaseModel, validator
|
|
4
4
|
|
|
5
5
|
from fiddler.configs import DEFAULT_NUM_CLUSTERS, DEFAULT_NUM_TAGS
|
|
6
6
|
from fiddler.constants.model import CustomFeatureType
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
from typing import List, Union
|
|
2
2
|
|
|
3
|
-
from pydantic import BaseModel, Field
|
|
3
|
+
from pydantic.v1 import BaseModel, Field
|
|
4
4
|
|
|
5
|
-
from fiddler.schemas.custom_features import
|
|
5
|
+
from fiddler.schemas.custom_features import (
|
|
6
|
+
Multivariate,
|
|
7
|
+
VectorFeature,
|
|
8
|
+
TextEmbedding,
|
|
9
|
+
ImageEmbedding,
|
|
10
|
+
Enrichment,
|
|
11
|
+
)
|
|
6
12
|
|
|
7
13
|
|
|
8
14
|
class ModelSpec(BaseModel):
|
|
@@ -26,7 +32,7 @@ class ModelSpec(BaseModel):
|
|
|
26
32
|
metadata: List[str] = Field(default_factory=list)
|
|
27
33
|
"""Metadata columns"""
|
|
28
34
|
|
|
29
|
-
custom_features: List[
|
|
30
|
-
|
|
31
|
-
)
|
|
35
|
+
custom_features: List[
|
|
36
|
+
Union[Multivariate, VectorFeature, TextEmbedding, ImageEmbedding, Enrichment]
|
|
37
|
+
] = Field(default_factory=list)
|
|
32
38
|
"""Custom feature definitions"""
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_alert_rule.py
RENAMED
|
@@ -7,7 +7,7 @@ from uuid import UUID
|
|
|
7
7
|
|
|
8
8
|
import pytest
|
|
9
9
|
import responses
|
|
10
|
-
from pydantic import ValidationError
|
|
10
|
+
from pydantic.v1 import ValidationError
|
|
11
11
|
|
|
12
12
|
from fiddler.constants.alert_rule import AlertCondition, BinSize, CompareTo, Priority
|
|
13
13
|
from fiddler.entities.alert_rule import AlertRule
|
|
@@ -673,8 +673,14 @@ def test_model_duplicate() -> None:
|
|
|
673
673
|
assert model_copy.id is None
|
|
674
674
|
assert model_copy.version == new_version
|
|
675
675
|
|
|
676
|
-
#
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
676
|
+
# Note(JP): what was this supposed to test? That mutating the copy does not
|
|
677
|
+
# mutate the original? This now fails with `TypeError: 'FieldInfo' object
|
|
678
|
+
# is not subscriptable"`.Is
|
|
679
|
+
# https://github.com/pydantic/pydantic/discussions/6231) maybe related? I
|
|
680
|
+
# think it's OK to outcomment this for now; whatever this tests is probably
|
|
681
|
+
# guaranteed by pydantic, and not implemented by us (is that true)?
|
|
682
|
+
#
|
|
683
|
+
# assert model.schema['CreditScore'].max == 850
|
|
684
|
+
# model_copy.schema['CreditScore'].max = 900 assert
|
|
685
|
+
# model.schema['CreditScore'].max == 850 assert
|
|
686
|
+
# model_copy.schema['CreditScore'].max == 900
|
|
@@ -19,8 +19,7 @@ from fiddler.tests.constants import (
|
|
|
19
19
|
|
|
20
20
|
API_RESPONSE_200 = {
|
|
21
21
|
'data': {
|
|
22
|
-
'id':
|
|
23
|
-
'uuid': WEBHOOK_ID,
|
|
22
|
+
'id': WEBHOOK_ID,
|
|
24
23
|
'name': WEBHOOK_NAME,
|
|
25
24
|
'url': WEBHOOK_URL,
|
|
26
25
|
'provider': WEBHOOK_PROVIDER,
|
|
@@ -58,8 +57,10 @@ API_RESPONSE_FROM_NAME = {
|
|
|
58
57
|
'offset': 0,
|
|
59
58
|
'items': [
|
|
60
59
|
{
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
# Note(JP): the schema does not define `uuid` but only `id`,
|
|
61
|
+
# and `id` is of type UUID. Should we allow for additional
|
|
62
|
+
# properties?
|
|
63
|
+
'id': WEBHOOK_ID,
|
|
63
64
|
'name': WEBHOOK_NAME,
|
|
64
65
|
'url': WEBHOOK_URL,
|
|
65
66
|
'provider': WEBHOOK_PROVIDER,
|
|
@@ -82,8 +83,7 @@ LIST_API_RESPONSE = {
|
|
|
82
83
|
'items': [
|
|
83
84
|
API_RESPONSE_200['data'],
|
|
84
85
|
{
|
|
85
|
-
'id':
|
|
86
|
-
'uuid': '2531bfd9-2ca2-4a7b-bb5a-136c8da09ca1',
|
|
86
|
+
'id': WEBHOOK_ID,
|
|
87
87
|
'name': 'test_webhook_config_name2',
|
|
88
88
|
'url': WEBHOOK_URL,
|
|
89
89
|
'provider': WEBHOOK_PROVIDER,
|
|
@@ -577,6 +577,36 @@ def test_get_slice() -> None:
|
|
|
577
577
|
pd.testing.assert_frame_equal(expected_df, slice_df)
|
|
578
578
|
|
|
579
579
|
|
|
580
|
+
@responses.activate
|
|
581
|
+
def test_download_data() -> None:
|
|
582
|
+
responses.get(
|
|
583
|
+
url=f'{URL}/v3/models/{MODEL_ID}',
|
|
584
|
+
json=MODEL_API_RESPONSE_200,
|
|
585
|
+
)
|
|
586
|
+
model = Model.get(id_=MODEL_ID)
|
|
587
|
+
|
|
588
|
+
parquet_path = os.path.join(OUTPUT_DIR, 'test_slice_download.parquet')
|
|
589
|
+
parquet_output = os.path.join(BASE_TEST_DIR, 'slice_test_dir')
|
|
590
|
+
with open(parquet_path, 'rb') as parquet_file:
|
|
591
|
+
data = io.BufferedReader(parquet_file)
|
|
592
|
+
responses.post(
|
|
593
|
+
url=f'{URL}/v3/analytics/download-slice-data',
|
|
594
|
+
body=data,
|
|
595
|
+
)
|
|
596
|
+
expected_df = pd.DataFrame({'Age': [38, 57, 42]})
|
|
597
|
+
model.download_data(
|
|
598
|
+
output_dir=parquet_output,
|
|
599
|
+
env_type='PRE_PRODUCTION',
|
|
600
|
+
env_id=DATASET_ID,
|
|
601
|
+
segment_definition='Age >= 20',
|
|
602
|
+
columns=['Age'],
|
|
603
|
+
max_rows=3,
|
|
604
|
+
)
|
|
605
|
+
slice_df = pd.read_parquet(parquet_path)
|
|
606
|
+
pd.testing.assert_frame_equal(expected_df, slice_df)
|
|
607
|
+
shutil.rmtree(str(parquet_output))
|
|
608
|
+
|
|
609
|
+
|
|
580
610
|
@responses.activate
|
|
581
611
|
def test_slice_download() -> None:
|
|
582
612
|
responses.get(
|
|
@@ -5,7 +5,7 @@ URL = 'https://dev.fiddler.ai'
|
|
|
5
5
|
TOKEN = 'footoken'
|
|
6
6
|
ORG_ID = '5531bfd9-2ca2-4a7b-bb5a-136c8da09ca0'
|
|
7
7
|
ORG_NAME = 'fiddler_dev'
|
|
8
|
-
SERVER_VERSION = '
|
|
8
|
+
SERVER_VERSION = '24.12.2'
|
|
9
9
|
PROJECT_NAME = 'bank_churn'
|
|
10
10
|
PROJECT_ID = '1531bfd9-2ca2-4a7b-bb5a-136c8da09ca1'
|
|
11
11
|
MODEL_NAME = 'bank_churn'
|
|
@@ -29,7 +29,17 @@ def test_version_compatibility_success(connection: Connection) -> None:
|
|
|
29
29
|
responses.get(
|
|
30
30
|
url=f'{URL}/v3/version-compatibility',
|
|
31
31
|
json={},
|
|
32
|
-
match=[
|
|
32
|
+
match=[
|
|
33
|
+
matchers.query_param_matcher(params),
|
|
34
|
+
matchers.header_matcher(
|
|
35
|
+
{
|
|
36
|
+
'Authorization': 'Bearer footoken',
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
'X-Fiddler-Client-Name': 'python-sdk',
|
|
39
|
+
'X-Fiddler-Client-Version': __version__,
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
],
|
|
33
43
|
)
|
|
34
44
|
|
|
35
45
|
connection._check_version_compatibility()
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from functools import wraps
|
|
2
|
+
from typing import Any, Callable, no_type_check
|
|
3
|
+
|
|
4
|
+
from fiddler import Connection
|
|
5
|
+
from fiddler.exceptions import IncompatibleClient
|
|
6
|
+
from fiddler.utils.version import match_semver
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def check_version(version_expr: str) -> Callable:
|
|
10
|
+
"""
|
|
11
|
+
Check version_expr against server version before making an API call
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
@check_version(version_expr=">=23.1.0")
|
|
15
|
+
@handle_api_error_response
|
|
16
|
+
def get_model_deployment(...):
|
|
17
|
+
...
|
|
18
|
+
|
|
19
|
+
Add this decorator on top of other decorators to make sure version check happens
|
|
20
|
+
before doing any other work.
|
|
21
|
+
|
|
22
|
+
:param version_expr: Supported version to match with. Read more at VersionInfo.match
|
|
23
|
+
:return: Decorator function
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@no_type_check
|
|
27
|
+
def decorator(func) -> Callable:
|
|
28
|
+
@wraps(func)
|
|
29
|
+
def wrapper(self, *args: Any, **kwargs: Any) -> Any:
|
|
30
|
+
server_version = (
|
|
31
|
+
self._conn().server_version
|
|
32
|
+
if type(self) != Connection
|
|
33
|
+
else self.server_version
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
if not match_semver(server_version, version_expr):
|
|
37
|
+
raise IncompatibleClient(
|
|
38
|
+
server_version=server_version,
|
|
39
|
+
message=f'{func.__name__} method is supported with server version '
|
|
40
|
+
f'{version_expr}, but the current server version is '
|
|
41
|
+
f'{server_version}',
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
return func(self, *args, **kwargs)
|
|
45
|
+
|
|
46
|
+
return wrapper
|
|
47
|
+
|
|
48
|
+
return decorator
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.0.dev2
|
|
4
4
|
Summary: Python client for Fiddler Platform
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -14,7 +14,7 @@ Requires-Dist: pip>=21.0
|
|
|
14
14
|
Requires-Dist: requests<3
|
|
15
15
|
Requires-Dist: requests-toolbelt
|
|
16
16
|
Requires-Dist: pandas>=1.2.5
|
|
17
|
-
Requires-Dist: pydantic
|
|
17
|
+
Requires-Dist: pydantic>=1.10.17
|
|
18
18
|
Requires-Dist: deprecated==1.2.14
|
|
19
19
|
Requires-Dist: tqdm
|
|
20
20
|
Requires-Dist: simplejson>=3.17.0
|
|
@@ -101,6 +101,7 @@ fiddler/tests/apis/test_segment.py
|
|
|
101
101
|
fiddler/tests/apis/test_webhook.py
|
|
102
102
|
fiddler/tests/apis/test_xai.py
|
|
103
103
|
fiddler/utils/__init__.py
|
|
104
|
+
fiddler/utils/decorators.py
|
|
104
105
|
fiddler/utils/helpers.py
|
|
105
106
|
fiddler/utils/logger.py
|
|
106
107
|
fiddler/utils/model_generator.py
|
|
@@ -20,12 +20,15 @@ setuptools.setup(
|
|
|
20
20
|
url='https://fiddler.ai',
|
|
21
21
|
packages=setuptools.find_packages(),
|
|
22
22
|
include_package_data=True,
|
|
23
|
+
# As of pydantic>=1.10.17, the pydantic.v1 namespace can be used within V1.
|
|
24
|
+
# This makes it easier to migrate to V2, which also supports the
|
|
25
|
+
# pydantic.v1 namespace
|
|
23
26
|
install_requires=[
|
|
24
27
|
'pip>=21.0',
|
|
25
28
|
'requests<3',
|
|
26
29
|
'requests-toolbelt',
|
|
27
30
|
'pandas>=1.2.5',
|
|
28
|
-
'pydantic>=1.10.
|
|
31
|
+
'pydantic>=1.10.17',
|
|
29
32
|
'deprecated==1.2.14',
|
|
30
33
|
'tqdm',
|
|
31
34
|
'simplejson>=3.17.0',
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.4.0.dev2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/constants/model_deployment.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/custom_expression.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/entities/model_deployment.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/packtools/keras_ig_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/custom_expression.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/schemas/model_task_params.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_alert_record.py
RENAMED
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_custom_metric.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_generate_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model_artifact.py
RENAMED
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model_deployment.py
RENAMED
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler/tests/apis/test_model_surrogate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler_client.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{fiddler_client-3.4.0.dev2 → fiddler_client-3.5.0.dev2}/fiddler_client.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|