fiddler-client 3.1.0.dev3__tar.gz → 3.1.0.dev4__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.1.0.dev3/fiddler_client.egg-info → fiddler_client-3.1.0.dev4}/PKG-INFO +1 -1
  2. fiddler_client-3.1.0.dev4/fiddler/VERSION +1 -0
  3. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/alert_rule.py +19 -17
  4. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/model.py +5 -5
  5. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/model_deployment.py +5 -1
  6. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/packtools/template_model.py +3 -2
  7. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/alert_rule.py +17 -9
  8. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_alert_rule.py +97 -53
  9. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_model.py +6 -0
  10. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_model_deployment.py +35 -1
  11. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4/fiddler_client.egg-info}/PKG-INFO +1 -1
  12. fiddler-client-3.1.0.dev3/fiddler/VERSION +0 -1
  13. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/LICENSE.txt +0 -0
  14. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/MANIFEST.in +0 -0
  15. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/PUBLIC.md +0 -0
  16. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/README.md +0 -0
  17. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/__init__.py +0 -0
  18. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/configs.py +0 -0
  19. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/connection.py +0 -0
  20. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/__init__.py +0 -0
  21. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/alert_rule.py +0 -0
  22. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/baseline.py +0 -0
  23. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/common.py +0 -0
  24. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/dataset.py +0 -0
  25. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/events.py +0 -0
  26. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/job.py +0 -0
  27. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/model.py +0 -0
  28. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/model_deployment.py +0 -0
  29. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/constants/xai.py +0 -0
  30. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/decorators.py +0 -0
  31. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/__init__.py +0 -0
  32. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/alert_record.py +0 -0
  33. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/base.py +0 -0
  34. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/baseline.py +0 -0
  35. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/custom_expression.py +0 -0
  36. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/dataset.py +0 -0
  37. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/events.py +0 -0
  38. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/file.py +0 -0
  39. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/job.py +0 -0
  40. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/model_artifact.py +0 -0
  41. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/organization.py +0 -0
  42. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/project.py +0 -0
  43. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/surrogate.py +0 -0
  44. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/user.py +0 -0
  45. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/webhook.py +0 -0
  46. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/entities/xai.py +0 -0
  47. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/exceptions.py +0 -0
  48. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/libs/__init__.py +0 -0
  49. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/libs/http_client.py +0 -0
  50. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/libs/json_encoder.py +0 -0
  51. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/libs/semver.py +0 -0
  52. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/packtools/__init__.py +0 -0
  53. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/packtools/gem.py +0 -0
  54. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/packtools/keras_ig_helpers.py +0 -0
  55. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/packtools/project_attributions_helpers.py +0 -0
  56. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/__init__.py +0 -0
  57. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/alert_record.py +0 -0
  58. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/base.py +0 -0
  59. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/baseline.py +0 -0
  60. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/custom_expression.py +0 -0
  61. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/custom_features.py +0 -0
  62. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/dataset.py +0 -0
  63. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/events.py +0 -0
  64. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/file.py +0 -0
  65. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/filter_query.py +0 -0
  66. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/job.py +0 -0
  67. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/model.py +0 -0
  68. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/model_deployment.py +0 -0
  69. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/model_schema.py +0 -0
  70. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/model_spec.py +0 -0
  71. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/model_task_params.py +0 -0
  72. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/organization.py +0 -0
  73. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/project.py +0 -0
  74. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/response.py +0 -0
  75. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/server_info.py +0 -0
  76. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/user.py +0 -0
  77. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/webhook.py +0 -0
  78. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/xai.py +0 -0
  79. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/schemas/xai_params.py +0 -0
  80. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/__init__.py +0 -0
  81. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/__init__.py +0 -0
  82. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_alert_record.py +0 -0
  83. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_baseline.py +0 -0
  84. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_custom_metric.py +0 -0
  85. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_dataset.py +0 -0
  86. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_events.py +0 -0
  87. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_files.py +0 -0
  88. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_generate_model.py +0 -0
  89. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_job.py +0 -0
  90. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_mixin.py +0 -0
  91. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_model_artifact.py +0 -0
  92. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_model_surrogate.py +0 -0
  93. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_project.py +0 -0
  94. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_segment.py +0 -0
  95. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_webhook.py +0 -0
  96. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/apis/test_xai.py +0 -0
  97. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/conftest.py +0 -0
  98. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/constants.py +0 -0
  99. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/test_connection.py +0 -0
  100. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/test_json_encoder.py +0 -0
  101. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/test_logger.py +0 -0
  102. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/test_utils.py +0 -0
  103. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/tests/utils.py +0 -0
  104. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/utils/__init__.py +0 -0
  105. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/utils/helpers.py +0 -0
  106. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/utils/logger.py +0 -0
  107. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/utils/model_generator.py +0 -0
  108. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/utils/validations.py +0 -0
  109. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/utils/version.py +0 -0
  110. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler/version.py +0 -0
  111. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler_client.egg-info/SOURCES.txt +0 -0
  112. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler_client.egg-info/dependency_links.txt +0 -0
  113. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler_client.egg-info/requires.txt +0 -0
  114. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/fiddler_client.egg-info/top_level.txt +0 -0
  115. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/setup.cfg +0 -0
  116. {fiddler-client-3.1.0.dev3 → fiddler_client-3.1.0.dev4}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.1.0.dev3
3
+ Version: 3.1.0.dev4
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -0,0 +1 @@
1
+ 3.1.0.dev4
@@ -8,8 +8,8 @@ from uuid import UUID
8
8
  from fiddler.constants.alert_rule import AlertCondition, BinSize, CompareTo, Priority
9
9
  from fiddler.decorators import handle_api_error
10
10
  from fiddler.entities.base import BaseEntity
11
- from fiddler.entities.baseline import Baseline, BaselineCompactMixin
12
- from fiddler.entities.model import Model, ModelCompactMixin
11
+ from fiddler.entities.baseline import BaselineCompactMixin
12
+ from fiddler.entities.model import ModelCompactMixin
13
13
  from fiddler.entities.project import ProjectCompactMixin
14
14
  from fiddler.schemas.alert_rule import AlertRuleResp, NotificationConfig
15
15
  from fiddler.schemas.filter_query import OperatorType, QueryCondition, QueryRule
@@ -63,6 +63,12 @@ class AlertRule(
63
63
 
64
64
  @staticmethod
65
65
  def _get_url(id_: UUID | str | None = None) -> str:
66
+ """Get model resource/item url."""
67
+ url = '/v3/alert-rules'
68
+ return url if not id_ else f'{url}/{id_}'
69
+
70
+ @staticmethod
71
+ def _get_url_v2(id_: UUID | str | None = None) -> str:
66
72
  """Get model resource/item url."""
67
73
  url = '/v2/alert-configs'
68
74
  return url if not id_ else f'{url}/{id_}'
@@ -78,7 +84,7 @@ class AlertRule(
78
84
  instance = cls(
79
85
  name=resp_obj.name,
80
86
  model_id=resp_obj.model.id,
81
- metric_id=resp_obj.metric_id,
87
+ metric_id=resp_obj.metric.id,
82
88
  priority=resp_obj.priority,
83
89
  compare_to=resp_obj.compare_to,
84
90
  condition=resp_obj.condition,
@@ -113,11 +119,11 @@ class AlertRule(
113
119
  # Reset properties
114
120
  self.model_id = resp_obj.model.id
115
121
  self.project_id = resp_obj.project.id
122
+ self.metric_id = resp_obj.metric.id
116
123
 
117
124
  # Add remaining fields
118
125
  fields = [
119
126
  'id',
120
- 'metric_id',
121
127
  'created_at',
122
128
  'updated_at',
123
129
  ]
@@ -179,7 +185,9 @@ class AlertRule(
179
185
  if columns:
180
186
  for column in columns:
181
187
  rules.append(
182
- QueryRule(field='columns', operator=OperatorType.ANY, value=column)
188
+ QueryRule(
189
+ field='feature_names', operator=OperatorType.ANY, value=column
190
+ )
183
191
  )
184
192
 
185
193
  _filter = QueryCondition(rules=rules)
@@ -188,7 +196,6 @@ class AlertRule(
188
196
  if ordering:
189
197
  params['ordering'] = ','.join(ordering)
190
198
 
191
- params['organization_name'] = cls.get_organization_name()
192
199
  for rule in cls._paginate(url=cls._get_url(), params=params):
193
200
  yield cls._from_dict(data=rule)
194
201
 
@@ -202,12 +209,9 @@ class AlertRule(
202
209
  @handle_api_error
203
210
  def create(self) -> AlertRule:
204
211
  """Create a new alert rule."""
205
- model = Model.get(self.model_id)
206
212
  payload: dict[str, Any] = {
207
213
  'name': self.name,
208
- 'organization_name': self.organization_name,
209
- 'model_name': model.name,
210
- 'project_name': model.project.name,
214
+ 'model_id': self.model_id,
211
215
  'metric_id': self.metric_id,
212
216
  'priority': self.priority,
213
217
  'compare_to': self.compare_to,
@@ -218,11 +222,9 @@ class AlertRule(
218
222
  'warning_threshold': self.warning_threshold,
219
223
  'feature_names': self.columns,
220
224
  'compare_bin_delta': self.compare_bin_delta,
221
- 'notifications': self._get_notifications_dict(),
222
225
  }
223
226
  if self.baseline_id:
224
- baseline = Baseline.get(self.baseline_id)
225
- payload['baseline_name'] = baseline.name
227
+ payload['baseline_id'] = self.baseline_id
226
228
 
227
229
  response = self._client().post(
228
230
  url=self._get_url(),
@@ -236,7 +238,7 @@ class AlertRule(
236
238
  def enable_notifications(self) -> None:
237
239
  """Enable notifications for an alert rule"""
238
240
  self._client().patch(
239
- url=self._get_url(id_=self.id), data={'enable_notification': True}
241
+ url=self._get_url_v2(id_=self.id), data={'enable_notification': True}
240
242
  )
241
243
  logger.info(
242
244
  'Notifications have been enabled for alert rule with id: %s', self.id
@@ -246,7 +248,7 @@ class AlertRule(
246
248
  def disable_notifications(self) -> None:
247
249
  """Disable notifications for an alert rule"""
248
250
  self._client().patch(
249
- url=self._get_url(id_=self.id), data={'enable_notification': False}
251
+ url=self._get_url_v2(id_=self.id), data={'enable_notification': False}
250
252
  )
251
253
  logger.info(
252
254
  'Notifications have been disabled for alert rule with id: %s', self.id
@@ -277,7 +279,7 @@ class AlertRule(
277
279
  webhooks=webhooks,
278
280
  )
279
281
  response = self._client().patch(
280
- url=self._get_url(id_=self.id),
282
+ url=self._get_url_v2(id_=self.id),
281
283
  data={'notifications': notifications},
282
284
  )
283
285
 
@@ -293,7 +295,7 @@ class AlertRule(
293
295
  :return: NotificationConfig object
294
296
  """
295
297
 
296
- response = self._client().get(url=self._get_url(id_=self.id))
298
+ response = self._client().get(url=self._get_url_v2(id_=self.id))
297
299
 
298
300
  return self._get_notifications_from_dict(
299
301
  response.json()['data']['notifications']
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import builtins
4
4
  import typing
5
+ from copy import deepcopy
5
6
  from dataclasses import dataclass
6
7
  from datetime import datetime
7
8
  from functools import cached_property
@@ -39,7 +40,6 @@ if typing.TYPE_CHECKING:
39
40
  from fiddler.entities.baseline import Baseline
40
41
  from fiddler.entities.dataset import Dataset
41
42
 
42
-
43
43
  logger = get_logger(__name__)
44
44
 
45
45
 
@@ -327,17 +327,17 @@ class Model(
327
327
  return Model(
328
328
  name=self.name,
329
329
  project_id=self.project_id,
330
- schema=self.schema,
331
- spec=self.spec,
330
+ schema=deepcopy(self.schema),
331
+ spec=deepcopy(self.spec),
332
332
  version=version if version else self.version,
333
333
  input_type=self.input_type,
334
334
  task=self.task,
335
- task_params=self.task_params,
335
+ task_params=deepcopy(self.task_params),
336
336
  description=self.description,
337
337
  event_id_col=self.event_id_col,
338
338
  event_ts_col=self.event_ts_col,
339
339
  event_ts_format=self.event_ts_format,
340
- xai_params=self.xai_params,
340
+ xai_params=deepcopy(self.xai_params),
341
341
  )
342
342
 
343
343
  @property
@@ -6,7 +6,9 @@ from uuid import UUID
6
6
 
7
7
  from fiddler.decorators import handle_api_error
8
8
  from fiddler.entities.base import BaseEntity
9
+ from fiddler.entities.job import Job
9
10
  from fiddler.entities.project import ProjectCompactMixin
11
+ from fiddler.schemas.job import JobCompactResp
10
12
  from fiddler.schemas.model_deployment import ModelDeploymentResponse
11
13
  from fiddler.utils.logger import get_logger
12
14
 
@@ -94,7 +96,7 @@ class ModelDeployment(
94
96
  self._resp = resp_obj
95
97
 
96
98
  @handle_api_error
97
- def update(self) -> None:
99
+ def update(self) -> Job:
98
100
  """Update an existing model deployment."""
99
101
  payload: dict[str, Any] = {'active': self.active}
100
102
  if self.replicas is not None:
@@ -108,6 +110,8 @@ class ModelDeployment(
108
110
  url=self._get_url(model_id=self.model_id), data=payload
109
111
  )
110
112
  self._refresh_from_response(response=response)
113
+ job_compact = JobCompactResp(**response.json()['data']['job'])
114
+ return Job.get(id_=job_compact.id)
111
115
 
112
116
  @classmethod
113
117
  def of(cls, model_id: UUID | str) -> ModelDeployment:
@@ -36,7 +36,8 @@ class TemplateKerasTF2Model:
36
36
  :param hybrid: Boolean value for hybrid data type (for example matrices). Default to False.
37
37
  """
38
38
  import tensorflow as tf
39
- from packtools.keras_ig_helpers import ComputeGradientsKerasTF2
39
+
40
+ from fiddler.packtools.keras_ig_helpers import ComputeGradientsKerasTF2
40
41
 
41
42
  embedding_names = embedding_names or []
42
43
  batch_input_shape_list = batch_input_shape_list or []
@@ -197,7 +198,7 @@ class TemplateTreeShap:
197
198
  :return: explanations_by_output and extras_by_output: two dictionaries with keys the output columns and values
198
199
  the corresponding explanations and extra information necessary
199
200
  """
200
- from packtools.project_attributions_helpers import TreeShapAttributions
201
+ from fiddler.packtools.project_attributions_helpers import TreeShapAttributions
201
202
 
202
203
  if explanation_name != self.tree_shap_explanations:
203
204
  raise NotImplementedError(
@@ -12,25 +12,33 @@ from fiddler.schemas.model import ModelCompactResp
12
12
  from fiddler.schemas.project import ProjectCompactResp
13
13
 
14
14
 
15
+ class MetricResp(BaseModel):
16
+ id: Union[str, UUID]
17
+ display_name: str
18
+ type: str
19
+ type_display_name: str
20
+
21
+
15
22
  class AlertRuleResp(BaseModel):
16
- id: UUID = Field(alias='uuid')
23
+ id: UUID
17
24
  name: str
18
- model: ModelCompactResp
19
- project: ProjectCompactResp
20
- baseline: Optional[BaselineCompactResp]
21
- segment: Optional[SegmentCompactResp]
22
25
  priority: Union[str, Priority]
23
26
  compare_to: Union[str, CompareTo]
24
- metric_id: Union[str, UUID]
25
- critical_threshold: float
26
27
  condition: Union[str, AlertCondition]
28
+ compare_bin_delta: Optional[int]
27
29
  bin_size: Union[str, BinSize]
28
30
  columns: Optional[List[str]] = Field(alias='feature_names')
29
- compare_bin_delta: Optional[int]
31
+ critical_threshold: float
30
32
  warning_threshold: Optional[float]
31
33
 
32
34
  created_at: datetime
33
- updated_at: datetime = Field(alias='last_updated')
35
+ updated_at: datetime
36
+
37
+ metric: MetricResp
38
+ model: ModelCompactResp
39
+ project: ProjectCompactResp
40
+ baseline: Optional[BaselineCompactResp]
41
+ segment: Optional[SegmentCompactResp]
34
42
 
35
43
 
36
44
  class NotificationConfig(BaseModel):
@@ -27,6 +27,51 @@ from fiddler.tests.constants import (
27
27
  from fiddler.utils.logger import set_logging
28
28
 
29
29
  API_RESPONSE_200 = {
30
+ 'data': {
31
+ 'id': ALERT_RULE_ID,
32
+ 'model': {'id': MODEL_ID, 'name': MODEL_NAME, 'version': 'v1'},
33
+ 'project': {'id': PROJECT_ID, 'name': PROJECT_NAME},
34
+ 'organization': {
35
+ 'id': 'e03d6f02-6efa-4eb1-b828-7ea9d2a083d0',
36
+ 'name': 'scale154',
37
+ },
38
+ 'baseline': None,
39
+ 'segment': None,
40
+ 'version': 'rule_v3',
41
+ 'name': 'skdfvbj',
42
+ 'priority': 'HIGH',
43
+ 'feature_names': ['gender'],
44
+ 'bin_size': 'Hour',
45
+ 'compare_to': 'raw_value',
46
+ 'condition': 'greater',
47
+ 'warning_threshold': 1.0,
48
+ 'critical_threshold': 2.0,
49
+ 'updated_at': '2024-04-17T12:42:15.672909+00:00',
50
+ 'enable_notification': True,
51
+ 'compare_bin_delta': 0,
52
+ 'created_at': '2024-04-17T12:42:15.672909+00:00',
53
+ 'created_by': {
54
+ 'id': '287949c2-13f8-49fc-a559-55b2e6f36e9b',
55
+ 'full_name': 'Fiddler Administrator',
56
+ 'email': 'admin@fiddler.ai',
57
+ },
58
+ 'updated_by': {
59
+ 'id': '287949c2-13f8-49fc-a559-55b2e6f36e9b',
60
+ 'full_name': 'Fiddler Administrator',
61
+ 'email': 'admin@fiddler.ai',
62
+ },
63
+ 'metric': {
64
+ 'id': 'null_violation_percentage',
65
+ 'display_name': '% Missing Value Violation',
66
+ 'type': 'data_integrity',
67
+ 'type_display_name': 'Data Integrity',
68
+ },
69
+ },
70
+ 'api_version': '3.0',
71
+ 'kind': 'NORMAL',
72
+ }
73
+
74
+ API_RESPONSE_200_V2 = {
30
75
  'data': {
31
76
  'id': 794,
32
77
  'organization_name': 'mainbuild',
@@ -89,6 +134,7 @@ API_RESPONSE_200 = {
89
134
  'kind': 'NORMAL',
90
135
  }
91
136
 
137
+
92
138
  API_RESPONSE_404 = {
93
139
  'error': {
94
140
  'code': 404,
@@ -116,46 +162,44 @@ LIST_API_RESPONSE = {
116
162
  'items': [
117
163
  API_RESPONSE_200['data'],
118
164
  {
119
- 'critical_threshold': 100.0,
120
- 'created_by': 'admin@fiddler.ai',
121
- 'metric_display_name': 'Traffic',
122
- 'condition': 'lesser',
123
- 'metric': 'traffic',
124
- 'metric_id': 'traffic',
165
+ 'id': '3431b746-d18f-4aed-99ea-2da8d5b46fb6',
166
+ 'model': {'id': MODEL_ID, 'name': MODEL_NAME, 'version': 'v1'},
167
+ 'project': {'id': PROJECT_ID, 'name': PROJECT_NAME},
168
+ 'organization': {
169
+ 'id': 'e03d6f02-6efa-4eb1-b828-7ea9d2a083d0',
170
+ 'name': 'scale154',
171
+ },
172
+ 'baseline': {'id': BASELINE_ID, 'name': BASELINE_NAME},
173
+ 'segment': None,
174
+ 'version': 'rule_v3',
175
+ 'name': 'sfdvsefv',
176
+ 'priority': 'HIGH',
177
+ 'feature_names': ['numofproducts'],
125
178
  'bin_size': 'Hour',
179
+ 'compare_to': 'raw_value',
180
+ 'condition': 'greater',
181
+ 'warning_threshold': 1e-05,
182
+ 'critical_threshold': 0.001,
183
+ 'updated_at': '2024-04-17T12:43:23.871997+00:00',
126
184
  'enable_notification': True,
127
- 'is_active': True,
128
- 'project_name': PROJECT_NAME,
129
- 'project': {
130
- 'id': PROJECT_ID,
131
- 'name': PROJECT_NAME,
185
+ 'compare_bin_delta': 0,
186
+ 'created_at': '2024-04-17T12:43:23.871997+00:00',
187
+ 'created_by': {
188
+ 'id': '287949c2-13f8-49fc-a559-55b2e6f36e9b',
189
+ 'full_name': 'Fiddler Administrator',
190
+ 'email': 'admin@fiddler.ai',
132
191
  },
133
- 'name': 'traffic-lt-1hr',
134
- 'created_at': '2023-11-28T08:04:10.916498+00:00',
135
- 'baseline_name': 'DEFAULT (bank_churn)',
136
- 'baseline': {
137
- 'id': BASELINE_ID,
138
- 'name': BASELINE_NAME,
192
+ 'updated_by': {
193
+ 'id': '287949c2-13f8-49fc-a559-55b2e6f36e9b',
194
+ 'full_name': 'Fiddler Administrator',
195
+ 'email': 'admin@fiddler.ai',
139
196
  },
140
- 'organization_name': 'mainbuild',
141
- 'priority': 'HIGH',
142
- 'category': None,
143
- 'warning_threshold': 200.0,
144
- 'segment': None,
145
- 'alert_type': 'service_metrics',
146
- 'time_bucket': 3600000,
147
- 'alert_type_display_name': 'Traffic',
148
- 'compare_period': 5,
149
- 'compare_to': 'time_period',
150
- 'uuid': '42eb6d51-dc5c-4e04-82aa-440b2d840704',
151
- 'id': 618,
152
- 'feature_names': None,
153
- 'model_name': MODEL_NAME,
154
- 'model': {
155
- 'id': MODEL_ID,
156
- 'name': MODEL_NAME,
197
+ 'metric': {
198
+ 'id': 'jsd',
199
+ 'display_name': 'Jensen-Shannon Distance',
200
+ 'type': 'drift',
201
+ 'type_display_name': 'Data Drift',
157
202
  },
158
- 'last_updated': '2023-11-28T08:04:10.918587+00:00',
159
203
  },
160
204
  ],
161
205
  }
@@ -177,7 +221,7 @@ LIST_API_RESPONSE_EMPTY = {
177
221
  @responses.activate
178
222
  def test_get_alert_rule_success() -> None:
179
223
  responses.get(
180
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
224
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
181
225
  json=API_RESPONSE_200,
182
226
  )
183
227
 
@@ -189,7 +233,7 @@ def test_get_alert_rule_success() -> None:
189
233
  @responses.activate
190
234
  def test_get_alert_rule_not_found() -> None:
191
235
  responses.get(
192
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
236
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
193
237
  json=API_RESPONSE_404,
194
238
  status=HTTPStatus.NOT_FOUND,
195
239
  )
@@ -201,7 +245,7 @@ def test_get_alert_rule_not_found() -> None:
201
245
  @responses.activate
202
246
  def test_alert_rule_list_success() -> None:
203
247
  responses.get(
204
- url=f'{URL}/v2/alert-configs',
248
+ url=f'{URL}/v3/alert-rules',
205
249
  json=LIST_API_RESPONSE,
206
250
  )
207
251
  for rule in AlertRule.list(model_id=MODEL_ID):
@@ -212,7 +256,7 @@ def test_alert_rule_list_success() -> None:
212
256
  def test_alert_rule_list_empty() -> None:
213
257
 
214
258
  responses.get(
215
- url=f'{URL}/v2/alert-configs',
259
+ url=f'{URL}/v3/alert-rules',
216
260
  json=LIST_API_RESPONSE_EMPTY,
217
261
  )
218
262
 
@@ -222,13 +266,13 @@ def test_alert_rule_list_empty() -> None:
222
266
  @responses.activate
223
267
  def test_delete_alert_rule() -> None:
224
268
  responses.get(
225
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
269
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
226
270
  json=API_RESPONSE_200,
227
271
  )
228
272
  rule = AlertRule.get(id_=ALERT_RULE_ID)
229
273
 
230
274
  responses.delete(
231
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
275
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
232
276
  )
233
277
 
234
278
  rule.delete()
@@ -237,13 +281,13 @@ def test_delete_alert_rule() -> None:
237
281
  @responses.activate
238
282
  def test_delete_alert_rule_not_found() -> None:
239
283
  responses.get(
240
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
284
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
241
285
  json=API_RESPONSE_200,
242
286
  )
243
287
  rule = AlertRule.get(id_=ALERT_RULE_ID)
244
288
 
245
289
  responses.delete(
246
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
290
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
247
291
  json=API_RESPONSE_404,
248
292
  status=HTTPStatus.NOT_FOUND,
249
293
  )
@@ -263,7 +307,7 @@ def test_add_alert_rule_success() -> None:
263
307
  json=BASELINE_API_RESPONSE_200,
264
308
  )
265
309
  responses.post(
266
- url=f'{URL}/v2/alert-configs',
310
+ url=f'{URL}/v3/alert-rules',
267
311
  json=API_RESPONSE_200,
268
312
  )
269
313
  alert_rule = AlertRule(
@@ -288,7 +332,7 @@ def test_add_alert_rule_success() -> None:
288
332
  @responses.activate
289
333
  def test_enable_notifications(caplog) -> None:
290
334
  responses.get(
291
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
335
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
292
336
  json=API_RESPONSE_200,
293
337
  )
294
338
 
@@ -296,7 +340,7 @@ def test_enable_notifications(caplog) -> None:
296
340
 
297
341
  resp = responses.patch(
298
342
  url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
299
- json=API_RESPONSE_200,
343
+ json=API_RESPONSE_200_V2,
300
344
  )
301
345
  set_logging(logging.INFO)
302
346
 
@@ -311,7 +355,7 @@ def test_enable_notifications(caplog) -> None:
311
355
  @responses.activate
312
356
  def test_disable_notifications(caplog) -> None:
313
357
  responses.get(
314
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
358
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
315
359
  json=API_RESPONSE_200,
316
360
  )
317
361
 
@@ -321,7 +365,7 @@ def test_disable_notifications(caplog) -> None:
321
365
 
322
366
  resp = responses.patch(
323
367
  url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
324
- json=API_RESPONSE_200,
368
+ json=API_RESPONSE_200_V2,
325
369
  )
326
370
 
327
371
  set_logging(logging.INFO)
@@ -336,12 +380,12 @@ def test_disable_notifications(caplog) -> None:
336
380
  @responses.activate
337
381
  def test_set_notifications() -> None:
338
382
  responses.get(
339
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
383
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
340
384
  json=API_RESPONSE_200,
341
385
  )
342
386
 
343
387
  alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
344
- API_RESPONSE_200['data']['notifications'] = {
388
+ API_RESPONSE_200_V2['data']['notifications'] = {
345
389
  'webhooks': [
346
390
  {'uuid': 'e20bf4cc-d2cf-4540-baef-d96913b14f1b'},
347
391
  {'uuid': '6e796fda-0111-4a72-82cd-f0f219e903e1'},
@@ -358,7 +402,7 @@ def test_set_notifications() -> None:
358
402
  }
359
403
  responses.patch(
360
404
  url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
361
- json=API_RESPONSE_200,
405
+ json=API_RESPONSE_200_V2,
362
406
  )
363
407
  notifications = alert_rule.set_notification_config(
364
408
  emails=['nikhil@fiddler.ai', 'admin@fiddler.ai'],
@@ -381,14 +425,14 @@ def test_set_notifications() -> None:
381
425
  @responses.activate
382
426
  def test_get_notifications() -> None:
383
427
  responses.get(
384
- url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
428
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
385
429
  json=API_RESPONSE_200,
386
430
  )
387
431
 
388
432
  alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
389
433
  responses.get(
390
434
  url=f'{URL}/v2/alert-configs/{ALERT_RULE_ID}',
391
- json=API_RESPONSE_200,
435
+ json=API_RESPONSE_200_V2,
392
436
  )
393
437
  notifications = alert_rule.get_notification_config()
394
438
  assert notifications == NotificationConfig(
@@ -672,3 +672,9 @@ def test_model_duplicate() -> None:
672
672
  model_copy = model.duplicate(version=new_version)
673
673
  assert model_copy.id is None
674
674
  assert model_copy.version == new_version
675
+
676
+ # Update new version
677
+ assert model.schema['CreditScore'].max == 850
678
+ model_copy.schema['CreditScore'].max = 900
679
+ assert model.schema['CreditScore'].max == 850
680
+ assert model_copy.schema['CreditScore'].max == 900
@@ -3,9 +3,12 @@ from http import HTTPStatus
3
3
  import pytest
4
4
  import responses
5
5
 
6
+ from fiddler.entities.job import Job
6
7
  from fiddler.entities.model_deployment import ModelDeployment
7
8
  from fiddler.exceptions import NotFound
8
9
  from fiddler.tests.constants import (
10
+ JOB_ID,
11
+ JOB_NAME,
9
12
  MODEL_DEPLOYMENT_ID,
10
13
  MODEL_ID,
11
14
  MODEL_NAME,
@@ -50,6 +53,7 @@ API_RESPONSE_200 = {
50
53
  'full_name': USER_NAME,
51
54
  'email': USER_EMAIL,
52
55
  },
56
+ 'job': {'id': JOB_ID, 'name': 'Deploy artifact model - manual'},
53
57
  },
54
58
  }
55
59
 
@@ -67,6 +71,31 @@ API_RESPONSE_404 = {
67
71
  }
68
72
  }
69
73
 
74
+ JOB_API_RESPONSE_200 = {
75
+ 'api_version': '3.0',
76
+ 'kind': 'NORMAL',
77
+ 'data': {
78
+ 'name': JOB_NAME,
79
+ 'info': {
80
+ 'resource_type': 'MODEL',
81
+ 'resource_name': 'bank_churn',
82
+ 'project_name': 'bank_churn',
83
+ },
84
+ 'id': JOB_ID,
85
+ 'status': 'SUCCESS',
86
+ 'progress': 100,
87
+ 'error_message': None,
88
+ 'error_reason': None,
89
+ 'extras': {
90
+ 'e36d1cf2-766f-4705-8269-b6f93bf1ca14': {
91
+ 'status': 'SUCCESS',
92
+ 'result': {'result': 'Success'},
93
+ 'error_message': None,
94
+ }
95
+ },
96
+ },
97
+ }
98
+
70
99
 
71
100
  @responses.activate
72
101
  def test_update_model_deployment_success() -> None:
@@ -79,8 +108,13 @@ def test_update_model_deployment_success() -> None:
79
108
  model_deployment.cpu = 300
80
109
  model_deployment.active = True
81
110
 
82
- model_deployment.update()
111
+ responses.get(
112
+ url=f'{URL}/v3/jobs/{JOB_ID}',
113
+ json=JOB_API_RESPONSE_200,
114
+ )
115
+ job = model_deployment.update()
83
116
  assert isinstance(model_deployment, ModelDeployment)
117
+ assert isinstance(job, Job)
84
118
  assert model_deployment.cpu == 300
85
119
  assert model_deployment.active
86
120
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.1.0.dev3
3
+ Version: 3.1.0.dev4
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -1 +0,0 @@
1
- 3.1.0.dev3