fiddler-client 3.0.0.dev14__tar.gz → 3.0.0.dev15__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 (117) hide show
  1. {fiddler-client-3.0.0.dev14/fiddler_client.egg-info → fiddler-client-3.0.0.dev15}/PKG-INFO +1 -1
  2. fiddler-client-3.0.0.dev15/fiddler/VERSION +1 -0
  3. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/events.py +51 -16
  4. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/custom_features.py +29 -29
  5. fiddler-client-3.0.0.dev15/fiddler/schemas/model_spec.py +32 -0
  6. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15/fiddler_client.egg-info}/PKG-INFO +1 -1
  7. fiddler-client-3.0.0.dev14/fiddler/VERSION +0 -1
  8. fiddler-client-3.0.0.dev14/fiddler/schemas/model_spec.py +0 -30
  9. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/LICENSE.txt +0 -0
  10. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/MANIFEST.in +0 -0
  11. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/PUBLIC.md +0 -0
  12. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/README.md +0 -0
  13. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/__init__.py +0 -0
  14. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/configs.py +0 -0
  15. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/connection.py +0 -0
  16. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/__init__.py +0 -0
  17. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/alert_rule.py +0 -0
  18. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/baseline.py +0 -0
  19. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/common.py +0 -0
  20. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/dataset.py +0 -0
  21. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/events.py +0 -0
  22. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/job.py +0 -0
  23. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/model.py +0 -0
  24. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/model_deployment.py +0 -0
  25. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/constants/xai.py +0 -0
  26. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/decorators.py +0 -0
  27. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/__init__.py +0 -0
  28. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/alert_record.py +0 -0
  29. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/alert_rule.py +0 -0
  30. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/base.py +0 -0
  31. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/baseline.py +0 -0
  32. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/custom_expression.py +0 -0
  33. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/dataset.py +0 -0
  34. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/file.py +0 -0
  35. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/job.py +0 -0
  36. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/model.py +0 -0
  37. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/model_artifact.py +0 -0
  38. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/model_deployment.py +0 -0
  39. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/organization.py +0 -0
  40. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/project.py +0 -0
  41. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/surrogate.py +0 -0
  42. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/user.py +0 -0
  43. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/webhook.py +0 -0
  44. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/entities/xai.py +0 -0
  45. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/exceptions.py +0 -0
  46. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/libs/__init__.py +0 -0
  47. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/libs/http_client.py +0 -0
  48. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/libs/json_encoder.py +0 -0
  49. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/libs/semver.py +0 -0
  50. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/packtools/__init__.py +0 -0
  51. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/packtools/gem.py +0 -0
  52. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/packtools/keras_ig_helpers.py +0 -0
  53. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/packtools/project_attributions_helpers.py +0 -0
  54. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/packtools/template_model.py +0 -0
  55. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/__init__.py +0 -0
  56. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/alert_record.py +0 -0
  57. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/alert_rule.py +0 -0
  58. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/base.py +0 -0
  59. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/baseline.py +0 -0
  60. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/custom_expression.py +0 -0
  61. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/dataset.py +0 -0
  62. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/events.py +0 -0
  63. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/file.py +0 -0
  64. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/filter_query.py +0 -0
  65. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/job.py +0 -0
  66. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/model.py +0 -0
  67. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/model_deployment.py +0 -0
  68. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/model_schema.py +0 -0
  69. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/model_task_params.py +0 -0
  70. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/organization.py +0 -0
  71. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/project.py +0 -0
  72. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/response.py +0 -0
  73. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/server_info.py +0 -0
  74. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/user.py +0 -0
  75. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/webhook.py +0 -0
  76. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/xai.py +0 -0
  77. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/schemas/xai_params.py +0 -0
  78. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/__init__.py +0 -0
  79. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/__init__.py +0 -0
  80. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_alert_record.py +0 -0
  81. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_alert_rule.py +0 -0
  82. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_baseline.py +0 -0
  83. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_custom_metric.py +0 -0
  84. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_dataset.py +0 -0
  85. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_events.py +0 -0
  86. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_files.py +0 -0
  87. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_generate_model.py +0 -0
  88. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_job.py +0 -0
  89. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_mixin.py +0 -0
  90. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_model.py +0 -0
  91. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_model_artifact.py +0 -0
  92. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_model_deployment.py +0 -0
  93. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_model_surrogate.py +0 -0
  94. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_project.py +0 -0
  95. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_segment.py +0 -0
  96. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_webhook.py +0 -0
  97. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/apis/test_xai.py +0 -0
  98. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/conftest.py +0 -0
  99. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/constants.py +0 -0
  100. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/test_connection.py +0 -0
  101. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/test_json_encoder.py +0 -0
  102. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/test_logger.py +0 -0
  103. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/test_utils.py +0 -0
  104. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/tests/utils.py +0 -0
  105. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/utils/__init__.py +0 -0
  106. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/utils/helpers.py +0 -0
  107. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/utils/logger.py +0 -0
  108. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/utils/model_generator.py +0 -0
  109. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/utils/validations.py +0 -0
  110. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/utils/version.py +0 -0
  111. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler/version.py +0 -0
  112. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler_client.egg-info/SOURCES.txt +0 -0
  113. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler_client.egg-info/dependency_links.txt +0 -0
  114. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler_client.egg-info/requires.txt +0 -0
  115. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/fiddler_client.egg-info/top_level.txt +0 -0
  116. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/setup.cfg +0 -0
  117. {fiddler-client-3.0.0.dev14 → fiddler-client-3.0.0.dev15}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.0.0.dev14
3
+ Version: 3.0.0.dev15
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.0.0.dev15
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import tempfile
4
4
  from pathlib import Path
5
- from typing import Any
5
+ from typing import Any, Callable
6
6
  from uuid import UUID
7
7
 
8
8
  import pandas as pd
@@ -17,6 +17,9 @@ from fiddler.entities.job import Job
17
17
  from fiddler.schemas.dataset import EnvType
18
18
  from fiddler.schemas.events import EventsSource, FileSource
19
19
  from fiddler.schemas.job import JobCompactResp
20
+ from fiddler.utils.logger import get_logger
21
+
22
+ logger = get_logger(__name__)
20
23
 
21
24
 
22
25
  class EventPublisher(ConnectionMixin):
@@ -51,40 +54,72 @@ class EventPublisher(ConnectionMixin):
51
54
 
52
55
  :return: list[UUID] for list of dicts source and Job object for file path or dataframe source.
53
56
  """
57
+
58
+ publish_method = self._get_publish_method(source=source)
59
+
60
+ return publish_method(
61
+ source=source,
62
+ environment=environment,
63
+ dataset_name=dataset_name,
64
+ update=update,
65
+ )
66
+
67
+ def _get_publish_method(
68
+ self, source: list[dict[str, Any]] | str | Path | pd.DataFrame
69
+ ) -> Callable:
54
70
  if isinstance(source, (str, Path)):
55
- return self._publish_file(
56
- source=source,
57
- environment=environment,
58
- dataset_name=dataset_name,
59
- update=update,
60
- )
71
+ return self._publish_file
61
72
 
62
73
  if isinstance(source, pd.DataFrame):
63
- with tempfile.NamedTemporaryFile(suffix='.csv') as temp_file:
64
- source.to_csv(temp_file.name, index=False)
74
+ return self._publish_df
75
+
76
+ if isinstance(source, list):
77
+ return self._publish_stream
78
+
79
+ raise ValueError(f'Unsupported source - {type(source)}')
80
+
81
+ def _publish_df(
82
+ self,
83
+ source: pd.DataFrame,
84
+ environment: EnvType,
85
+ dataset_name: str | None = None,
86
+ update: bool = False,
87
+ ) -> Job:
88
+ with tempfile.NamedTemporaryFile(suffix='.parquet') as temp_file:
89
+ try:
90
+ source.to_parquet(temp_file.name, index=False)
65
91
  return self._publish_file(
66
92
  source=temp_file.name,
67
93
  environment=environment,
68
94
  dataset_name=dataset_name,
69
95
  update=update,
70
96
  )
71
-
72
- elif isinstance(source, list):
73
- return self._publish_stream(source=source, update=update)
74
-
75
- raise ValueError(f'Unsupported source - {type(source)}')
97
+ except Exception:
98
+ logger.warning(
99
+ 'Failed to convert input dataframe to parquet format. Retrying as a CSV file.'
100
+ )
101
+ with tempfile.NamedTemporaryFile(suffix='.csv') as temp_file:
102
+ source.to_csv(temp_file.name, index=False)
103
+ return self._publish_file(
104
+ source=temp_file.name,
105
+ environment=environment,
106
+ dataset_name=dataset_name,
107
+ update=update,
108
+ )
76
109
 
77
110
  def _publish_stream(
78
111
  self,
79
112
  source: list[dict[str, Any]],
113
+ environment: EnvType = EnvType.PRODUCTION,
114
+ dataset_name: str | None = None,
80
115
  update: bool = False,
81
116
  ) -> list[UUID]:
82
117
  event_ids = []
83
118
  for i in tqdm(range(0, len(source), self.STREAM_LIMIT)):
84
119
  response = self._publish_call(
85
120
  source=EventsSource(events=source[i : i + self.STREAM_LIMIT]),
86
- environment=EnvType.PRODUCTION,
87
- dataset_name=None,
121
+ environment=environment,
122
+ dataset_name=dataset_name,
88
123
  update=update,
89
124
  )
90
125
  event_ids.extend(response.json()['data']['event_ids'])
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict, List, Optional, Type, TypeVar
1
+ from typing import Any, Dict, List, Optional, Type, TypeVar, Literal
2
2
 
3
3
  from pydantic import BaseModel, validator
4
4
 
@@ -10,18 +10,12 @@ CustomFeatureTypeVar = TypeVar('CustomFeatureTypeVar', bound='CustomFeature')
10
10
 
11
11
  class CustomFeature(BaseModel):
12
12
  name: str
13
- type: CustomFeatureType
14
- n_clusters: Optional[int] = DEFAULT_NUM_CLUSTERS
15
- centroids: Optional[List] = None
16
-
17
- @validator('n_clusters')
18
- def validate_n_clusters(cls, value: int) -> int: # noqa: N805
19
- if value < 0:
20
- raise ValueError('n_clusters must be greater than 0')
21
- return value
13
+ type: Any
22
14
 
23
15
  class Config:
24
16
  allow_mutation = False
17
+ use_enum_values = True
18
+ discriminator = 'type'
25
19
 
26
20
  @classmethod
27
21
  def from_columns(
@@ -53,12 +47,13 @@ class CustomFeature(BaseModel):
53
47
  return_dict: Dict[str, Any] = {
54
48
  'name': self.name,
55
49
  'type': self.type.value,
56
- 'n_clusters': self.n_clusters,
57
50
  }
58
51
  if isinstance(self, Multivariate):
59
52
  return_dict['columns'] = self.columns
53
+ return_dict['n_clusters'] = self.n_clusters
60
54
  elif isinstance(self, VectorFeature):
61
55
  return_dict['column'] = self.column
56
+ return_dict['n_clusters'] = self.n_clusters
62
57
  if isinstance(self, (ImageEmbedding, TextEmbedding)):
63
58
  return_dict['source_column'] = self.source_column
64
59
  if isinstance(self, TextEmbedding):
@@ -74,7 +69,9 @@ class CustomFeature(BaseModel):
74
69
 
75
70
 
76
71
  class Multivariate(CustomFeature):
77
- type: CustomFeatureType = CustomFeatureType.FROM_COLUMNS
72
+ type: Literal['FROM_COLUMNS'] = CustomFeatureType.FROM_COLUMNS.value
73
+ n_clusters: Optional[int] = DEFAULT_NUM_CLUSTERS
74
+ centroids: Optional[List] = None
78
75
  columns: List[str]
79
76
  monitor_components: bool = False
80
77
 
@@ -84,24 +81,32 @@ class Multivariate(CustomFeature):
84
81
  raise ValueError('Multivariate columns must be greater than 1')
85
82
  return value
86
83
 
84
+ @validator('n_clusters')
85
+ def validate_n_clusters(cls, value: int) -> int: # noqa: N805
86
+ if value < 0:
87
+ raise ValueError('n_clusters must be greater than 0')
88
+ return value
89
+
87
90
 
88
91
  class VectorFeature(CustomFeature):
89
- type: CustomFeatureType = CustomFeatureType.FROM_VECTOR
90
- source_column: Optional[str] = None
92
+ type: Literal['FROM_VECTOR'] = CustomFeatureType.FROM_VECTOR.value
93
+ n_clusters: Optional[int] = DEFAULT_NUM_CLUSTERS
94
+ centroids: Optional[List] = None
91
95
  column: str
92
96
 
97
+ @validator('n_clusters')
98
+ def validate_n_clusters(cls, value: int) -> int: # noqa: N805
99
+ if value < 0:
100
+ raise ValueError('n_clusters must be greater than 0')
101
+ return value
102
+
93
103
 
94
104
  class TextEmbedding(VectorFeature):
95
- type: CustomFeatureType = CustomFeatureType.FROM_TEXT_EMBEDDING
105
+ type: Literal['FROM_TEXT_EMBEDDING'] = CustomFeatureType.FROM_TEXT_EMBEDDING.value # type: ignore
106
+ source_column: str
96
107
  n_tags: Optional[int] = DEFAULT_NUM_TAGS
97
108
  tf_idf: Optional[Dict[str, List]] = None
98
109
 
99
- @validator('source_column')
100
- def validate_source_column(cls, value: str) -> str: # noqa: N805
101
- if value is None:
102
- raise ValueError('source_column must be specified')
103
- return value
104
-
105
110
  @validator('n_tags')
106
111
  def validate_n_tags(cls, value: int) -> int: # noqa: N805
107
112
  if value < 0:
@@ -110,13 +115,8 @@ class TextEmbedding(VectorFeature):
110
115
 
111
116
 
112
117
  class ImageEmbedding(VectorFeature):
113
- type: CustomFeatureType = CustomFeatureType.FROM_IMAGE_EMBEDDING
114
-
115
- @validator('source_column')
116
- def validate_source_column(cls, value: str) -> str: # noqa: N805
117
- if value is None:
118
- raise ValueError('source_column must be specified')
119
- return value
118
+ type: Literal['FROM_IMAGE_EMBEDDING'] = CustomFeatureType.FROM_IMAGE_EMBEDDING.value # type: ignore
119
+ source_column: str
120
120
 
121
121
 
122
122
  class Enrichment(CustomFeature):
@@ -135,7 +135,7 @@ class Enrichment(CustomFeature):
135
135
  """
136
136
 
137
137
  # Setting the feature type to ENRICHMENT
138
- type: CustomFeatureType = CustomFeatureType.ENRICHMENT
138
+ type: Literal['ENRICHMENT'] = CustomFeatureType.ENRICHMENT.value
139
139
 
140
140
  # List of input column names used to generate the enrichment
141
141
  columns: List[str]
@@ -0,0 +1,32 @@
1
+ from typing import List, Union
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from fiddler.schemas.custom_features import Multivariate, VectorFeature, TextEmbedding, ImageEmbedding, Enrichment
6
+
7
+
8
+ class ModelSpec(BaseModel):
9
+ """Model spec defines how model columns are used along with model task"""
10
+
11
+ schema_version: int = 1
12
+ """Schema version"""
13
+
14
+ inputs: List[str] = Field(default_factory=list)
15
+ """Feature columns"""
16
+
17
+ outputs: List[str] = Field(default_factory=list)
18
+ """Prediction columns"""
19
+
20
+ targets: List[str] = Field(default_factory=list)
21
+ """Label columns"""
22
+
23
+ decisions: List[str] = Field(default_factory=list)
24
+ """Decisions columns"""
25
+
26
+ metadata: List[str] = Field(default_factory=list)
27
+ """Metadata columns"""
28
+
29
+ custom_features: List[Union[Multivariate, VectorFeature, TextEmbedding, ImageEmbedding, Enrichment]] = Field(
30
+ default_factory=list
31
+ )
32
+ """Custom feature definitions"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.0.0.dev14
3
+ Version: 3.0.0.dev15
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.0.0.dev14
@@ -1,30 +0,0 @@
1
- from typing import List
2
-
3
- from pydantic import BaseModel
4
-
5
- from fiddler.schemas.custom_features import CustomFeature
6
-
7
-
8
- class ModelSpec(BaseModel):
9
- """Model spec defines how model columns are used along with model task"""
10
-
11
- schema_version: int = 1
12
- """Schema version"""
13
-
14
- inputs: List[str] = []
15
- """Feature columns"""
16
-
17
- outputs: List[str] = []
18
- """Prediction columns"""
19
-
20
- targets: List[str] = []
21
- """Label columns"""
22
-
23
- decisions: List[str] = []
24
- """Decisions columns"""
25
-
26
- metadata: List[str] = []
27
- """Metadata columns"""
28
-
29
- custom_features: List[CustomFeature] = []
30
- """Custom feature definitions"""