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.
Files changed (116) hide show
  1. {fiddler-client-3.0.0.dev3/fiddler_client.egg-info → fiddler-client-3.0.0.dev5}/PKG-INFO +5 -1
  2. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/PUBLIC.md +4 -0
  3. fiddler-client-3.0.0.dev5/fiddler/VERSION +1 -0
  4. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/__init__.py +3 -0
  5. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/common.py +0 -1
  6. fiddler-client-3.0.0.dev5/fiddler/entities/custom_metric.py +222 -0
  7. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/file.py +5 -8
  8. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/model_artifact.py +2 -1
  9. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/http_client.py +10 -32
  10. fiddler-client-3.0.0.dev5/fiddler/schemas/custom_metric.py +23 -0
  11. fiddler-client-3.0.0.dev5/fiddler/tests/apis/test_custom_metric.py +352 -0
  12. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_utils.py +32 -1
  13. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/helpers.py +1 -1
  14. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5/fiddler_client.egg-info}/PKG-INFO +5 -1
  15. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/SOURCES.txt +3 -1
  16. fiddler-client-3.0.0.dev3/fiddler/VERSION +0 -1
  17. fiddler-client-3.0.0.dev3/fiddler/_version.py +0 -1
  18. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/LICENSE.txt +0 -0
  19. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/MANIFEST.in +0 -0
  20. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/README.md +0 -0
  21. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/configs.py +0 -0
  22. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/connection.py +0 -0
  23. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/__init__.py +0 -0
  24. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/alert_rule.py +0 -0
  25. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/baseline.py +0 -0
  26. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/dataset.py +0 -0
  27. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/events.py +0 -0
  28. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/job.py +0 -0
  29. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/model.py +0 -0
  30. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/model_deployment.py +0 -0
  31. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/constants/xai.py +0 -0
  32. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/decorators.py +0 -0
  33. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/__init__.py +0 -0
  34. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/alert_record.py +0 -0
  35. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/alert_rule.py +0 -0
  36. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/base.py +0 -0
  37. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/baseline.py +0 -0
  38. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/dataset.py +0 -0
  39. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/events.py +0 -0
  40. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/job.py +0 -0
  41. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/model.py +0 -0
  42. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/model_deployment.py +0 -0
  43. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/organization.py +0 -0
  44. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/project.py +0 -0
  45. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/surrogate.py +0 -0
  46. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/user.py +0 -0
  47. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/webhook.py +0 -0
  48. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/entities/xai.py +0 -0
  49. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/exceptions.py +0 -0
  50. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/__init__.py +0 -0
  51. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/json_encoder.py +0 -0
  52. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/libs/semver.py +0 -0
  53. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/__init__.py +0 -0
  54. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/gem.py +0 -0
  55. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/keras_ig_helpers.py +0 -0
  56. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/project_attributions_helpers.py +0 -0
  57. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/packtools/template_model.py +0 -0
  58. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/__init__.py +0 -0
  59. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/alert_record.py +0 -0
  60. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/alert_rule.py +0 -0
  61. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/base.py +0 -0
  62. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/baseline.py +0 -0
  63. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/custom_features.py +0 -0
  64. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/dataset.py +0 -0
  65. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/events.py +0 -0
  66. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/file.py +0 -0
  67. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/filter_query.py +0 -0
  68. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/job.py +0 -0
  69. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model.py +0 -0
  70. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_deployment.py +0 -0
  71. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_schema.py +0 -0
  72. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_spec.py +0 -0
  73. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/model_task_params.py +0 -0
  74. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/organization.py +0 -0
  75. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/project.py +0 -0
  76. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/response.py +0 -0
  77. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/server_info.py +0 -0
  78. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/user.py +0 -0
  79. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/webhook.py +0 -0
  80. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/xai.py +0 -0
  81. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/schemas/xai_params.py +0 -0
  82. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/__init__.py +0 -0
  83. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/__init__.py +0 -0
  84. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_alert_record.py +0 -0
  85. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_alert_rule.py +0 -0
  86. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_baseline.py +0 -0
  87. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_dataset.py +0 -0
  88. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_events.py +0 -0
  89. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_files.py +0 -0
  90. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_generate_model.py +0 -0
  91. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_job.py +0 -0
  92. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_mixin.py +0 -0
  93. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model.py +0 -0
  94. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model_artifact.py +0 -0
  95. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model_deployment.py +0 -0
  96. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_model_surrogate.py +0 -0
  97. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_project.py +0 -0
  98. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_webhook.py +0 -0
  99. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/apis/test_xai.py +0 -0
  100. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/conftest.py +0 -0
  101. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/constants.py +0 -0
  102. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_connection.py +0 -0
  103. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_json_encoder.py +0 -0
  104. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/test_logger.py +0 -0
  105. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/tests/utils.py +0 -0
  106. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/__init__.py +0 -0
  107. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/logger.py +0 -0
  108. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/model_generator.py +0 -0
  109. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/validations.py +0 -0
  110. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/utils/version.py +0 -0
  111. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler/version.py +0 -0
  112. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/dependency_links.txt +0 -0
  113. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/requires.txt +0 -0
  114. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/fiddler_client.egg-info/top_level.txt +0 -0
  115. {fiddler-client-3.0.0.dev3 → fiddler-client-3.0.0.dev5}/setup.cfg +0 -0
  116. {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.dev3
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
- response = self._client().post(
81
- url='/v3/files/upload',
82
- data=multipart_data,
83
- headers={'Content-Type': multipart_data.content_type},
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
- if files_encoders:
91
- encoders = list(files_encoders.values())
92
- if encoders:
93
- request_headers['Content-Type'] = encoders[0].content_type
94
- response = self.session.request(
95
- method,
96
- full_url,
97
- params=params,
98
- files=files_encoders,
99
- headers=request_headers,
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"""