fiddler-client 3.0.0.dev3__tar.gz → 3.0.0.dev5__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.0.0.dev3/fiddler_client.egg-info → fiddler-client-3.0.0.dev5}/PKG-INFO +5 -1
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/PUBLIC.md +4 -0
- fiddler-client-3.0.0.dev5/fiddler/VERSION +1 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/__init__.py +3 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/common.py +0 -1
- fiddler-client-3.0.0.dev5/fiddler/entities/custom_metric.py +222 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/file.py +5 -8
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/model_artifact.py +2 -1
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/http_client.py +10 -32
- fiddler-client-3.0.0.dev5/fiddler/schemas/custom_metric.py +23 -0
- fiddler-client-3.0.0.dev5/fiddler/tests/apis/test_custom_metric.py +352 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_utils.py +32 -1
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/helpers.py +1 -1
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5/fiddler_client.egg-info}/PKG-INFO +5 -1
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/SOURCES.txt +3 -1
- fiddler-client-3.0.0.dev3/fiddler/VERSION +0 -1
- fiddler-client-3.0.0.dev3/fiddler/_version.py +0 -1
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/LICENSE.txt +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/MANIFEST.in +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/README.md +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/configs.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/connection.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/alert_rule.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/baseline.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/dataset.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/events.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/job.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/model.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/model_deployment.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/xai.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/decorators.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/alert_record.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/alert_rule.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/base.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/baseline.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/dataset.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/events.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/job.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/model.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/model_deployment.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/organization.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/project.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/surrogate.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/user.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/webhook.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/xai.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/exceptions.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/json_encoder.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/semver.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/gem.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/keras_ig_helpers.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/project_attributions_helpers.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/template_model.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/alert_record.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/alert_rule.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/base.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/baseline.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/custom_features.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/dataset.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/events.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/file.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/filter_query.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/job.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_deployment.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_schema.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_spec.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_task_params.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/organization.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/project.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/response.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/server_info.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/user.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/webhook.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/xai.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/xai_params.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_alert_record.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_alert_rule.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_baseline.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_dataset.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_events.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_files.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_generate_model.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_job.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_mixin.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model_artifact.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model_deployment.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model_surrogate.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_project.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_webhook.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_xai.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/conftest.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/constants.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_connection.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_json_encoder.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_logger.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/utils.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/__init__.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/logger.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/model_generator.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/validations.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/version.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/version.py +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/dependency_links.txt +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/requires.txt +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/top_level.txt +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/setup.cfg +0 -0
- {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 3.0.0.
|
|
3
|
+
Version: 3.0.0.dev5
|
|
4
4
|
Summary: Python client for Fiddler Platform
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -49,6 +49,10 @@ Version History
|
|
|
49
49
|
- Add percentage violation metrics for alert
|
|
50
50
|
- Support for alert revisions
|
|
51
51
|
|
|
52
|
+
### 2.4.1
|
|
53
|
+
- ### **Modifications**
|
|
54
|
+
- Fix slice query with `vector` type columns
|
|
55
|
+
|
|
52
56
|
### 2.4.0
|
|
53
57
|
- ### **New Features**
|
|
54
58
|
- Add support for segments
|
|
@@ -26,6 +26,10 @@ Version History
|
|
|
26
26
|
- Add percentage violation metrics for alert
|
|
27
27
|
- Support for alert revisions
|
|
28
28
|
|
|
29
|
+
### 2.4.1
|
|
30
|
+
- ### **Modifications**
|
|
31
|
+
- Fix slice query with `vector` type columns
|
|
32
|
+
|
|
29
33
|
### 2.4.0
|
|
30
34
|
- ### **New Features**
|
|
31
35
|
- Add support for segments
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.0.0.dev5
|
|
@@ -20,6 +20,7 @@ from fiddler.constants.xai import ExplainMethod # noqa
|
|
|
20
20
|
from fiddler.entities.alert_record import AlertRecord # noqa
|
|
21
21
|
from fiddler.entities.alert_rule import AlertRule # noqa
|
|
22
22
|
from fiddler.entities.baseline import Baseline # noqa
|
|
23
|
+
from fiddler.entities.custom_metric import CustomMetric, Segment # noqa
|
|
23
24
|
from fiddler.entities.dataset import Dataset # noqa
|
|
24
25
|
from fiddler.entities.file import File # noqa
|
|
25
26
|
from fiddler.entities.job import Job # noqa
|
|
@@ -103,11 +104,13 @@ __all__ = [
|
|
|
103
104
|
'AlertRule',
|
|
104
105
|
'Baseline',
|
|
105
106
|
'Dataset',
|
|
107
|
+
'CustomMetric',
|
|
106
108
|
'File',
|
|
107
109
|
'Job',
|
|
108
110
|
'Model',
|
|
109
111
|
'ModelDeployment',
|
|
110
112
|
'Project',
|
|
113
|
+
'Segment',
|
|
111
114
|
'Webhook',
|
|
112
115
|
# Exceptions
|
|
113
116
|
'NotFound',
|
|
@@ -11,5 +11,4 @@ CONTENT_TYPE_OCTET_STREAM = 'application/octet-stream'
|
|
|
11
11
|
CONTENT_TYPE_OCTET_STREAM_HEADER = {CONTENT_TYPE_HEADER_KEY: CONTENT_TYPE_OCTET_STREAM}
|
|
12
12
|
|
|
13
13
|
# Multi-part upload
|
|
14
|
-
MULTI_PART_UPLOAD_SIZE_THRESHOLD = 5 * 1024 * 1024 # 5MB in bytes
|
|
15
14
|
MULTI_PART_CHUNK_SIZE = 100 * 1024 * 1024 # 100MB in bytes
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Any, Iterator
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from fiddler.decorators import handle_api_error
|
|
9
|
+
from fiddler.entities.base import BaseEntity
|
|
10
|
+
from fiddler.entities.model import Model
|
|
11
|
+
from fiddler.schemas.custom_metric import (
|
|
12
|
+
CustomExpressionResp,
|
|
13
|
+
CustomMetricResp,
|
|
14
|
+
SegmentResp,
|
|
15
|
+
)
|
|
16
|
+
from fiddler.schemas.filter_query import OperatorType, QueryCondition, QueryRule
|
|
17
|
+
from fiddler.utils.helpers import raise_not_found
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CustomExpression(BaseEntity):
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
name: str,
|
|
24
|
+
model_id: UUID,
|
|
25
|
+
definition: str,
|
|
26
|
+
description: str | None = None,
|
|
27
|
+
) -> None:
|
|
28
|
+
"""Construct a custom expression instance."""
|
|
29
|
+
self.name = name
|
|
30
|
+
self.model_id = model_id
|
|
31
|
+
self.definition = definition
|
|
32
|
+
self.description = description
|
|
33
|
+
|
|
34
|
+
self.id: UUID | None = None
|
|
35
|
+
self.created_at: datetime | None = None
|
|
36
|
+
|
|
37
|
+
# Deserialized response object
|
|
38
|
+
self._resp: CustomExpressionResp | None = None
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def _get_url(id_: UUID | str | None = None) -> str:
|
|
43
|
+
"""Get custom expression resource/item url."""
|
|
44
|
+
|
|
45
|
+
def _refresh(self, data: dict) -> None:
|
|
46
|
+
"""Refresh the fields of this instance from the given response dictionary"""
|
|
47
|
+
# Deserialize the response
|
|
48
|
+
resp_obj = CustomMetricResp(**data)
|
|
49
|
+
assert self.model_id
|
|
50
|
+
fields = [
|
|
51
|
+
'id',
|
|
52
|
+
'name',
|
|
53
|
+
'definition',
|
|
54
|
+
'description',
|
|
55
|
+
'created_at',
|
|
56
|
+
]
|
|
57
|
+
for field in fields:
|
|
58
|
+
setattr(self, field, getattr(resp_obj, field, None))
|
|
59
|
+
|
|
60
|
+
self._resp = resp_obj
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def _from_dict(cls, data: dict) -> CustomExpression:
|
|
64
|
+
"""Build entity object from the given dictionary."""
|
|
65
|
+
|
|
66
|
+
# Deserialize the response
|
|
67
|
+
resp_obj = CustomMetricResp(**data)
|
|
68
|
+
model = Model.from_name(
|
|
69
|
+
name=resp_obj.model_name, project_name=resp_obj.project_name
|
|
70
|
+
)
|
|
71
|
+
assert model.id
|
|
72
|
+
# Initialize
|
|
73
|
+
instance = cls(
|
|
74
|
+
name=resp_obj.name,
|
|
75
|
+
model_id=model.id,
|
|
76
|
+
definition=resp_obj.definition,
|
|
77
|
+
description=resp_obj.description,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Add remaining fields
|
|
81
|
+
fields = [
|
|
82
|
+
'id',
|
|
83
|
+
'created_at',
|
|
84
|
+
]
|
|
85
|
+
for field in fields:
|
|
86
|
+
setattr(instance, field, getattr(resp_obj, field, None))
|
|
87
|
+
|
|
88
|
+
instance._resp = resp_obj
|
|
89
|
+
|
|
90
|
+
return instance
|
|
91
|
+
|
|
92
|
+
@classmethod
|
|
93
|
+
@handle_api_error
|
|
94
|
+
def get(cls, id_: UUID | str) -> CustomExpression:
|
|
95
|
+
"""
|
|
96
|
+
Get the CustomMetric instance using custom metric id.
|
|
97
|
+
|
|
98
|
+
:param id_: unique uuid format identifier for custom metric
|
|
99
|
+
:return: CustomMetric instance
|
|
100
|
+
"""
|
|
101
|
+
response = cls._client().get(url=cls._get_url(id_=id_))
|
|
102
|
+
return cls._from_response(response=response)
|
|
103
|
+
|
|
104
|
+
@classmethod
|
|
105
|
+
@handle_api_error
|
|
106
|
+
def from_name(
|
|
107
|
+
cls, name: str, model_name: str, project_name: str
|
|
108
|
+
) -> CustomExpression:
|
|
109
|
+
"""
|
|
110
|
+
Get the custom metric instance using custom metric name, model name and project name.
|
|
111
|
+
|
|
112
|
+
:param name: Custom metric name
|
|
113
|
+
:param model_name: Name of the model associated with the custom metric
|
|
114
|
+
:param project_name: Name of the project associated with the custom metric
|
|
115
|
+
|
|
116
|
+
:return: CustomMetric instance for the provided params
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
_filter = QueryCondition(
|
|
120
|
+
rules=[
|
|
121
|
+
QueryRule(field='name', operator=OperatorType.EQUAL, value=name),
|
|
122
|
+
]
|
|
123
|
+
)
|
|
124
|
+
params: dict[str, Any] = {
|
|
125
|
+
'filter': _filter.json(),
|
|
126
|
+
'organization_name': cls.get_organization_name(),
|
|
127
|
+
'project_name': project_name,
|
|
128
|
+
'model_name': model_name,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
response = cls._client().get(
|
|
132
|
+
url=cls._get_url(),
|
|
133
|
+
params=params,
|
|
134
|
+
)
|
|
135
|
+
if response.json()['data']['total'] == 0:
|
|
136
|
+
raise_not_found('Custom metric not found for the given identifier')
|
|
137
|
+
|
|
138
|
+
return cls._from_dict(data=response.json()['data']['items'][0])
|
|
139
|
+
|
|
140
|
+
@classmethod
|
|
141
|
+
@handle_api_error
|
|
142
|
+
def list(
|
|
143
|
+
cls,
|
|
144
|
+
model_id: UUID,
|
|
145
|
+
) -> Iterator[CustomExpression]:
|
|
146
|
+
"""Get a list of all custom metrics in the organization."""
|
|
147
|
+
|
|
148
|
+
model = Model.get(id_=model_id)
|
|
149
|
+
params: dict[str, Any] = {
|
|
150
|
+
'organization_name': cls.get_organization_name(),
|
|
151
|
+
'project_name': model.project.name,
|
|
152
|
+
'model_name': model.name,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
for custom_metric in cls._paginate(
|
|
156
|
+
url=cls._get_url(),
|
|
157
|
+
params=params,
|
|
158
|
+
):
|
|
159
|
+
yield cls._from_dict(data=custom_metric)
|
|
160
|
+
|
|
161
|
+
@handle_api_error
|
|
162
|
+
def create(self) -> CustomExpression:
|
|
163
|
+
"""Create a new custom metric."""
|
|
164
|
+
model = Model.get(id_=self.model_id)
|
|
165
|
+
payload = {
|
|
166
|
+
'name': self.name,
|
|
167
|
+
'organization_name': self.get_organization_name(),
|
|
168
|
+
'project_name': model.project.name,
|
|
169
|
+
'model_name': model.name,
|
|
170
|
+
'definition': self.definition,
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if self.description:
|
|
174
|
+
payload['description'] = self.description
|
|
175
|
+
|
|
176
|
+
response = self._client().post(
|
|
177
|
+
url=self._get_url(),
|
|
178
|
+
data=payload,
|
|
179
|
+
)
|
|
180
|
+
self._refresh_from_response(response=response)
|
|
181
|
+
return self
|
|
182
|
+
|
|
183
|
+
@handle_api_error
|
|
184
|
+
def delete(self) -> None:
|
|
185
|
+
"""Delete a custom metric."""
|
|
186
|
+
assert self.id is not None
|
|
187
|
+
|
|
188
|
+
self._client().delete(url=self._get_url(id_=self.id))
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class CustomMetric(CustomExpression):
|
|
192
|
+
def __init__(
|
|
193
|
+
self, name: str, model_id: UUID, definition: str, description: str | None = None
|
|
194
|
+
) -> None:
|
|
195
|
+
"""Construct a custom metric instance."""
|
|
196
|
+
super().__init__(name, model_id, definition, description)
|
|
197
|
+
|
|
198
|
+
# Deserialized response object
|
|
199
|
+
self._resp: CustomMetricResp | None = None
|
|
200
|
+
|
|
201
|
+
@staticmethod
|
|
202
|
+
def _get_url(id_: UUID | str | None = None) -> str:
|
|
203
|
+
"""Get custom metric resource/item url."""
|
|
204
|
+
url = '/v2/custom-metrics'
|
|
205
|
+
return url if not id_ else f'{url}/{id_}'
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
class Segment(CustomExpression):
|
|
209
|
+
def __init__(
|
|
210
|
+
self, name: str, model_id: UUID, definition: str, description: str | None = None
|
|
211
|
+
) -> None:
|
|
212
|
+
"""Construct a segment instance."""
|
|
213
|
+
super().__init__(name, model_id, definition, description)
|
|
214
|
+
|
|
215
|
+
# Deserialized response object
|
|
216
|
+
self._resp: SegmentResp | None = None
|
|
217
|
+
|
|
218
|
+
@staticmethod
|
|
219
|
+
def _get_url(id_: UUID | str | None = None) -> str:
|
|
220
|
+
"""Get segment resource/item url."""
|
|
221
|
+
url = '/v2/segments'
|
|
222
|
+
return url if not id_ else f'{url}/{id_}'
|
|
@@ -8,7 +8,6 @@ from typing import Any
|
|
|
8
8
|
from uuid import UUID
|
|
9
9
|
|
|
10
10
|
from requests import Response
|
|
11
|
-
from requests_toolbelt import MultipartEncoder
|
|
12
11
|
|
|
13
12
|
from fiddler.constants.common import MULTI_PART_CHUNK_SIZE
|
|
14
13
|
from fiddler.decorators import handle_api_error
|
|
@@ -74,14 +73,12 @@ class File(BaseEntity, CreatedByMixin, UpdatedByMixin):
|
|
|
74
73
|
@handle_api_error
|
|
75
74
|
def single_upload(self) -> File:
|
|
76
75
|
"""Single part file upload"""
|
|
77
|
-
with open(self.path, 'rb') as f:
|
|
78
|
-
multipart_data = MultipartEncoder(fields={'file': (self.name, f)})
|
|
79
76
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
77
|
+
response = self._client().post(
|
|
78
|
+
url='/v3/files/upload',
|
|
79
|
+
files={'file': (self.name, open(self.path, 'rb'))},
|
|
80
|
+
headers={'Content-Type': None},
|
|
81
|
+
)
|
|
85
82
|
|
|
86
83
|
self._refresh_from_response(response)
|
|
87
84
|
return self
|
|
@@ -66,9 +66,10 @@ class ModelArtifact(ConnectionMixin):
|
|
|
66
66
|
)
|
|
67
67
|
|
|
68
68
|
logger.info(
|
|
69
|
-
'Model[%s] - Model artifact tar file created at %s',
|
|
69
|
+
'Model[%s] - Model artifact tar file created at %s - %d bytes',
|
|
70
70
|
self.model_id,
|
|
71
71
|
file_path,
|
|
72
|
+
os.path.getsize(file_path),
|
|
72
73
|
)
|
|
73
74
|
|
|
74
75
|
# Upload file
|
|
@@ -7,7 +7,6 @@ from urllib.parse import urljoin
|
|
|
7
7
|
import requests
|
|
8
8
|
import simplejson
|
|
9
9
|
from requests.adapters import HTTPAdapter
|
|
10
|
-
from requests_toolbelt.multipart.encoder import MultipartEncoder
|
|
11
10
|
|
|
12
11
|
from fiddler.constants.common import JSON_CONTENT_TYPE
|
|
13
12
|
from fiddler.exceptions import ( # pylint: disable=redefined-builtin
|
|
@@ -51,7 +50,6 @@ class RequestClient:
|
|
|
51
50
|
headers: dict | None = None,
|
|
52
51
|
data: dict | bytes | None = None,
|
|
53
52
|
timeout: int | None = None,
|
|
54
|
-
files_encoders: dict[str, MultipartEncoder] | None = None,
|
|
55
53
|
**kwargs: Any,
|
|
56
54
|
) -> requests.Response:
|
|
57
55
|
"""
|
|
@@ -63,9 +61,6 @@ class RequestClient:
|
|
|
63
61
|
:param headers: Request headers
|
|
64
62
|
:param data: Dict/binary data
|
|
65
63
|
:param timeout: Request timeout in seconds
|
|
66
|
-
:param files_encoders: Dictionary of 'filename': file-like-objects
|
|
67
|
-
for multipart encoding upload. Make sure all MultipartEncoder values have
|
|
68
|
-
same content_type.
|
|
69
64
|
"""
|
|
70
65
|
logger.debug('Making %s call to %s', method, url)
|
|
71
66
|
|
|
@@ -87,31 +82,16 @@ class RequestClient:
|
|
|
87
82
|
# So setting that as default here
|
|
88
83
|
kwargs.setdefault('verify', self.session.verify)
|
|
89
84
|
try:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
timeout=timeout,
|
|
101
|
-
proxies=self.proxies,
|
|
102
|
-
**kwargs,
|
|
103
|
-
)
|
|
104
|
-
else:
|
|
105
|
-
response = self.session.request(
|
|
106
|
-
method,
|
|
107
|
-
full_url,
|
|
108
|
-
params=params,
|
|
109
|
-
data=data,
|
|
110
|
-
headers=request_headers,
|
|
111
|
-
timeout=timeout,
|
|
112
|
-
proxies=self.proxies,
|
|
113
|
-
**kwargs,
|
|
114
|
-
)
|
|
85
|
+
response = self.session.request(
|
|
86
|
+
method,
|
|
87
|
+
full_url,
|
|
88
|
+
params=params,
|
|
89
|
+
data=data,
|
|
90
|
+
headers=request_headers,
|
|
91
|
+
timeout=timeout,
|
|
92
|
+
proxies=self.proxies,
|
|
93
|
+
**kwargs,
|
|
94
|
+
)
|
|
115
95
|
|
|
116
96
|
except requests.Timeout as exc:
|
|
117
97
|
logger.error('%s call failed with Timeout error for URL %s', method, url)
|
|
@@ -173,7 +153,6 @@ class RequestClient:
|
|
|
173
153
|
headers: dict | None = None,
|
|
174
154
|
timeout: int | None = None,
|
|
175
155
|
data: dict | bytes | None = None,
|
|
176
|
-
files_encoders: dict[str, MultipartEncoder] | None = None,
|
|
177
156
|
**kwargs: dict[str, Any],
|
|
178
157
|
) -> requests.Response:
|
|
179
158
|
"""Construct a post request instance."""
|
|
@@ -184,7 +163,6 @@ class RequestClient:
|
|
|
184
163
|
headers=headers,
|
|
185
164
|
timeout=timeout,
|
|
186
165
|
data=data,
|
|
187
|
-
files_encoders=files_encoders,
|
|
188
166
|
**kwargs,
|
|
189
167
|
)
|
|
190
168
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Optional
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
from fiddler.schemas.base import BaseModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CustomExpressionResp(BaseModel):
|
|
9
|
+
id: UUID
|
|
10
|
+
name: str
|
|
11
|
+
model_name: str
|
|
12
|
+
project_name: str
|
|
13
|
+
definition: str
|
|
14
|
+
description: Optional[str]
|
|
15
|
+
created_at: datetime
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CustomMetricResp(CustomExpressionResp):
|
|
19
|
+
"""Custom metric response object"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SegmentResp(CustomExpressionResp):
|
|
23
|
+
"""Segment response object"""
|