fiddler-client 2.2.1__tar.gz → 2.3.0__tar.gz

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