fiddler-client 3.0.0.dev10__tar.gz → 3.1.0.dev1__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.dev10/fiddler_client.egg-info → fiddler-client-3.1.0.dev1}/PKG-INFO +1 -1
  2. fiddler-client-3.1.0.dev1/fiddler/VERSION +1 -0
  3. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/__init__.py +23 -6
  4. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/connection.py +15 -13
  5. fiddler-client-3.1.0.dev1/fiddler/constants/baseline.py +15 -0
  6. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/baseline.py +13 -12
  7. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/events.py +20 -23
  8. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/model.py +70 -18
  9. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/model_deployment.py +1 -1
  10. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/baseline.py +2 -2
  11. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/model.py +1 -0
  12. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_baseline.py +4 -4
  13. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_events.py +39 -12
  14. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_generate_model.py +6 -1
  15. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_model.py +115 -6
  16. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_xai.py +2 -0
  17. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/conftest.py +1 -1
  18. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/constants.py +1 -0
  19. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1/fiddler_client.egg-info}/PKG-INFO +1 -1
  20. fiddler-client-3.0.0.dev10/fiddler/VERSION +0 -1
  21. fiddler-client-3.0.0.dev10/fiddler/constants/baseline.py +0 -18
  22. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/LICENSE.txt +0 -0
  23. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/MANIFEST.in +0 -0
  24. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/PUBLIC.md +0 -0
  25. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/README.md +0 -0
  26. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/configs.py +0 -0
  27. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/__init__.py +0 -0
  28. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/alert_rule.py +0 -0
  29. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/common.py +0 -0
  30. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/dataset.py +0 -0
  31. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/events.py +0 -0
  32. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/job.py +0 -0
  33. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/model.py +0 -0
  34. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/model_deployment.py +0 -0
  35. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/constants/xai.py +0 -0
  36. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/decorators.py +0 -0
  37. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/__init__.py +0 -0
  38. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/alert_record.py +0 -0
  39. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/alert_rule.py +0 -0
  40. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/base.py +0 -0
  41. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/custom_expression.py +0 -0
  42. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/dataset.py +0 -0
  43. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/file.py +0 -0
  44. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/job.py +0 -0
  45. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/model_artifact.py +0 -0
  46. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/organization.py +0 -0
  47. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/project.py +0 -0
  48. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/surrogate.py +0 -0
  49. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/user.py +0 -0
  50. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/webhook.py +0 -0
  51. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/entities/xai.py +0 -0
  52. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/exceptions.py +0 -0
  53. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/libs/__init__.py +0 -0
  54. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/libs/http_client.py +0 -0
  55. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/libs/json_encoder.py +0 -0
  56. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/libs/semver.py +0 -0
  57. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/packtools/__init__.py +0 -0
  58. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/packtools/gem.py +0 -0
  59. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/packtools/keras_ig_helpers.py +0 -0
  60. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/packtools/project_attributions_helpers.py +0 -0
  61. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/packtools/template_model.py +0 -0
  62. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/__init__.py +0 -0
  63. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/alert_record.py +0 -0
  64. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/alert_rule.py +0 -0
  65. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/base.py +0 -0
  66. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/custom_expression.py +0 -0
  67. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/custom_features.py +0 -0
  68. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/dataset.py +0 -0
  69. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/events.py +0 -0
  70. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/file.py +0 -0
  71. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/filter_query.py +0 -0
  72. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/job.py +0 -0
  73. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/model_deployment.py +0 -0
  74. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/model_schema.py +0 -0
  75. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/model_spec.py +0 -0
  76. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/model_task_params.py +0 -0
  77. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/organization.py +0 -0
  78. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/project.py +0 -0
  79. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/response.py +0 -0
  80. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/server_info.py +0 -0
  81. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/user.py +0 -0
  82. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/webhook.py +0 -0
  83. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/xai.py +0 -0
  84. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/schemas/xai_params.py +0 -0
  85. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/__init__.py +0 -0
  86. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/__init__.py +0 -0
  87. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_alert_record.py +0 -0
  88. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_alert_rule.py +0 -0
  89. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_custom_metric.py +0 -0
  90. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_dataset.py +0 -0
  91. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_files.py +0 -0
  92. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_job.py +0 -0
  93. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_mixin.py +0 -0
  94. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_model_artifact.py +0 -0
  95. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_model_deployment.py +0 -0
  96. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_model_surrogate.py +0 -0
  97. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_project.py +0 -0
  98. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_segment.py +0 -0
  99. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/apis/test_webhook.py +0 -0
  100. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/test_connection.py +0 -0
  101. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/test_json_encoder.py +0 -0
  102. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/test_logger.py +0 -0
  103. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/test_utils.py +0 -0
  104. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/tests/utils.py +0 -0
  105. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/utils/__init__.py +0 -0
  106. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/utils/helpers.py +0 -0
  107. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/utils/logger.py +0 -0
  108. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/utils/model_generator.py +0 -0
  109. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/utils/validations.py +0 -0
  110. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/utils/version.py +0 -0
  111. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler/version.py +0 -0
  112. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler_client.egg-info/SOURCES.txt +0 -0
  113. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler_client.egg-info/dependency_links.txt +0 -0
  114. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler_client.egg-info/requires.txt +0 -0
  115. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/fiddler_client.egg-info/top_level.txt +0 -0
  116. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/setup.cfg +0 -0
  117. {fiddler-client-3.0.0.dev10 → fiddler-client-3.1.0.dev1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.0.0.dev10
3
+ Version: 3.1.0.dev1
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.dev1
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from fiddler.connection import Connection, ConnectionMixin, init # noqa
2
4
  from fiddler.constants.alert_rule import ( # noqa
3
5
  AlertCondition,
@@ -5,7 +7,7 @@ from fiddler.constants.alert_rule import ( # noqa
5
7
  CompareTo,
6
8
  Priority,
7
9
  )
8
- from fiddler.constants.baseline import BaselineType, WindowSize # noqa
10
+ from fiddler.constants.baseline import BaselineType, WindowBinSize # noqa
9
11
  from fiddler.constants.dataset import EnvType # noqa
10
12
  from fiddler.constants.job import JobStatus # noqa
11
13
  from fiddler.constants.model import ( # noqa
@@ -19,14 +21,14 @@ from fiddler.constants.model_deployment import ArtifactType, DeploymentType # n
19
21
  from fiddler.constants.xai import ExplainMethod # noqa
20
22
  from fiddler.entities.alert_record import AlertRecord # noqa
21
23
  from fiddler.entities.alert_rule import AlertRule # noqa
22
- from fiddler.entities.baseline import Baseline # noqa
24
+ from fiddler.entities.baseline import Baseline, BaselineCompact # noqa
23
25
  from fiddler.entities.custom_expression import CustomMetric, Segment # noqa
24
- from fiddler.entities.dataset import Dataset # noqa
26
+ from fiddler.entities.dataset import Dataset, DatasetCompact # noqa
25
27
  from fiddler.entities.file import File # noqa
26
28
  from fiddler.entities.job import Job # noqa
27
- from fiddler.entities.model import Model # noqa
29
+ from fiddler.entities.model import Model, ModelCompact # noqa
28
30
  from fiddler.entities.model_deployment import ModelDeployment # noqa
29
- from fiddler.entities.project import Project # noqa
31
+ from fiddler.entities.project import Project, ProjectCompact # noqa
30
32
  from fiddler.entities.webhook import Webhook # noqa
31
33
  from fiddler.exceptions import ( # noqa
32
34
  ApiError,
@@ -62,11 +64,22 @@ from fiddler.schemas.xai_params import XaiParams # noqa
62
64
  from fiddler.utils.logger import set_logging # noqa
63
65
  from fiddler.version import __version__ # noqa
64
66
 
67
+ # Global connection object
68
+ conn: Connection | None = None
69
+
70
+
71
+ def set_conn(conn_: Connection) -> None:
72
+ """Set global conn variable"""
73
+ global conn
74
+ conn = conn_
75
+
76
+
65
77
  __all__ = [
66
78
  '__version__',
67
79
  'Connection',
68
80
  'ConnectionMixin',
69
81
  'init',
82
+ 'conn',
70
83
  # Constants
71
84
  'AlertCondition',
72
85
  'ArtifactStatus',
@@ -82,7 +95,7 @@ __all__ = [
82
95
  'ModelInputType',
83
96
  'ModelTask',
84
97
  'Priority',
85
- 'WindowSize',
98
+ 'WindowBinSize',
86
99
  # Schemas
87
100
  'CustomFeature',
88
101
  'DatasetDataSource',
@@ -103,13 +116,17 @@ __all__ = [
103
116
  'AlertRecord',
104
117
  'AlertRule',
105
118
  'Baseline',
119
+ 'BaselineCompact',
106
120
  'Dataset',
121
+ 'DatasetCompact',
107
122
  'CustomMetric',
108
123
  'File',
109
124
  'Job',
110
125
  'Model',
126
+ 'ModelCompact',
111
127
  'ModelDeployment',
112
128
  'Project',
129
+ 'ProjectCompact',
113
130
  'Segment',
114
131
  'Webhook',
115
132
  # Exceptions
@@ -15,9 +15,6 @@ from fiddler.version import __version__
15
15
 
16
16
  logger = get_logger(__name__)
17
17
 
18
- # Global connection object
19
- connection: Connection | None = None
20
-
21
18
 
22
19
  class Connection:
23
20
  def __init__( # pylint: disable=too-many-arguments
@@ -123,35 +120,37 @@ class Connection:
123
120
 
124
121
  class ConnectionMixin:
125
122
  @classmethod
126
- def _connection(cls) -> Connection:
123
+ def _conn(cls) -> Connection:
127
124
  """Fiddler connection instance"""
128
- assert connection is not None
129
- return connection
125
+ from fiddler import conn
126
+
127
+ assert conn is not None
128
+ return conn
130
129
 
131
130
  @classmethod
132
131
  def _client(cls) -> RequestClient:
133
132
  """Request client instance"""
134
- return cls._connection().client
133
+ return cls._conn().client
135
134
 
136
135
  @property
137
136
  def organization_name(self) -> str:
138
137
  """Organization name property"""
139
- return self._connection().server_info.organization.name
138
+ return self._conn().server_info.organization.name
140
139
 
141
140
  @property
142
141
  def organization_id(self) -> UUID:
143
142
  """Organization id property"""
144
- return self._connection().server_info.organization.id
143
+ return self._conn().server_info.organization.id
145
144
 
146
145
  @classmethod
147
146
  def get_organization_name(cls) -> str:
148
147
  """Organization name"""
149
- return cls._connection().server_info.organization.name
148
+ return cls._conn().server_info.organization.name
150
149
 
151
150
  @classmethod
152
151
  def get_organization_id(cls) -> UUID:
153
152
  """Organization id"""
154
- return cls._connection().server_info.organization.id
153
+ return cls._conn().server_info.organization.id
155
154
 
156
155
 
157
156
  def init( # pylint: disable=too-many-arguments
@@ -173,8 +172,9 @@ def init( # pylint: disable=too-many-arguments
173
172
  :param validate: Whether to validate the server/client version compatibility.
174
173
  Some functionalities might not work if this is turned off.
175
174
  """
176
- global connection # pylint: disable=global-statement
177
- connection = Connection(
175
+ from fiddler import set_conn
176
+
177
+ conn = Connection(
178
178
  url=url,
179
179
  token=token,
180
180
  proxies=proxies,
@@ -182,3 +182,5 @@ def init( # pylint: disable=too-many-arguments
182
182
  verify=verify,
183
183
  validate=validate,
184
184
  )
185
+
186
+ set_conn(conn_=conn)
@@ -0,0 +1,15 @@
1
+ import enum
2
+
3
+
4
+ @enum.unique
5
+ class BaselineType(str, enum.Enum):
6
+ STATIC = 'STATIC'
7
+ ROLLING = 'ROLLING'
8
+
9
+
10
+ @enum.unique
11
+ class WindowBinSize(str, enum.Enum):
12
+ HOUR = 'Hour'
13
+ DAY = 'Day'
14
+ WEEK = 'Week'
15
+ MONTH = 'Month'
@@ -5,6 +5,7 @@ from datetime import datetime
5
5
  from typing import Any, Iterator
6
6
  from uuid import UUID
7
7
 
8
+ from fiddler.constants.baseline import WindowBinSize
8
9
  from fiddler.constants.dataset import EnvType
9
10
  from fiddler.decorators import handle_api_error
10
11
  from fiddler.entities.base import BaseEntity
@@ -28,8 +29,8 @@ class Baseline(
28
29
  dataset_id: UUID | str | None = None,
29
30
  start_time: int | None = None,
30
31
  end_time: int | None = None,
31
- offset: int | None = None,
32
- window_size: int | None = None,
32
+ offset_delta: int | None = None,
33
+ window_bin_size: WindowBinSize | str | None = None,
33
34
  ) -> None:
34
35
  """Construct a baseline instance."""
35
36
  self.name = name
@@ -39,8 +40,8 @@ class Baseline(
39
40
  self.dataset_id = dataset_id
40
41
  self.start_time = start_time
41
42
  self.end_time = end_time
42
- self.offset = offset
43
- self.window_size = window_size
43
+ self.offset_delta = offset_delta
44
+ self.window_bin_size = window_bin_size
44
45
 
45
46
  self.id: UUID | None = None
46
47
  self.row_count: int | None = None
@@ -73,8 +74,8 @@ class Baseline(
73
74
  type_=resp_obj.type,
74
75
  start_time=resp_obj.start_time,
75
76
  end_time=resp_obj.end_time,
76
- offset=resp_obj.offset,
77
- window_size=resp_obj.window_size,
77
+ offset_delta=resp_obj.offset_delta,
78
+ window_bin_size=resp_obj.window_bin_size,
78
79
  )
79
80
 
80
81
  # Add remaining fields
@@ -109,8 +110,8 @@ class Baseline(
109
110
  'type',
110
111
  'start_time',
111
112
  'end_time',
112
- 'offset',
113
- 'window_size',
113
+ 'offset_delta',
114
+ 'window_bin_size',
114
115
  'created_at',
115
116
  'updated_at',
116
117
  'row_count',
@@ -210,10 +211,10 @@ class Baseline(
210
211
  payload['start_time'] = self.start_time
211
212
  if self.end_time:
212
213
  payload['end_time'] = self.end_time
213
- if self.offset:
214
- payload['offset'] = self.offset
215
- if self.window_size:
216
- payload['window_size'] = self.window_size
214
+ if self.offset_delta:
215
+ payload['offset_delta'] = self.offset_delta
216
+ if self.window_bin_size:
217
+ payload['window_bin_size'] = self.window_bin_size
217
218
 
218
219
  response = self._client().post(
219
220
  url=self._get_url(),
@@ -1,11 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import tempfile
3
4
  from pathlib import Path
4
- from typing import Any, Iterator
5
+ from typing import Any
5
6
  from uuid import UUID
6
7
 
7
8
  import pandas as pd
8
9
  from requests import Response
10
+ from tqdm import tqdm
9
11
 
10
12
  from fiddler.configs import STREAM_EVENT_LIMIT
11
13
  from fiddler.connection import ConnectionMixin
@@ -28,21 +30,6 @@ class EventPublisher(ConnectionMixin):
28
30
  """
29
31
  self.model_id = model_id
30
32
 
31
- def _get_stream_chunks(
32
- self, source: pd.DataFrame | list[dict[str, Any]]
33
- ) -> Iterator[list[dict[str, Any]]]:
34
- """Chunk the source based on stream limit"""
35
-
36
- for i in range(0, len(source), self.STREAM_LIMIT):
37
- chunk = source[i : i + self.STREAM_LIMIT]
38
-
39
- if isinstance(chunk, pd.DataFrame):
40
- events = chunk.to_dict('records')
41
- else:
42
- events = chunk
43
-
44
- yield events
45
-
46
33
  @handle_api_error
47
34
  def publish(
48
35
  self,
@@ -56,13 +43,13 @@ class EventPublisher(ConnectionMixin):
56
43
 
57
44
  :param source: one of:
58
45
  Path or str path: path for data file.
59
- list[dict]: list of event dicts (max 1000) EnvType.PRE_PRODUCTION is not supported
60
- dataframe: events dataframe. EnvType.PRE_PRODUCTION not supported.
46
+ dataframe: events dataframe.
47
+ list[dict]: list of event dicts EnvType.PRE_PRODUCTION is not supported
61
48
  :param environment: Either EnvType.PRE_PRODUCTION or EnvType.PRODUCTION
62
49
  :param dataset_name: Name of the dataset. Not supported for EnvType.PRODUCTION
63
50
  :param update: flag indicating if the events are updates to previously published rows
64
51
 
65
- :return: list[UUID] for list of dicts or dataframe source and Job object for file path source.
52
+ :return: list[UUID] for list of dicts source and Job object for file path or dataframe source.
66
53
  """
67
54
  if isinstance(source, (str, Path)):
68
55
  return self._publish_file(
@@ -72,20 +59,30 @@ class EventPublisher(ConnectionMixin):
72
59
  update=update,
73
60
  )
74
61
 
75
- if isinstance(source, (list, pd.DataFrame)):
62
+ if isinstance(source, pd.DataFrame):
63
+ with tempfile.NamedTemporaryFile(suffix='.csv') as temp_file:
64
+ source.to_csv(temp_file.name, index=False)
65
+ return self._publish_file(
66
+ source=temp_file.name,
67
+ environment=environment,
68
+ dataset_name=dataset_name,
69
+ update=update,
70
+ )
71
+
72
+ elif isinstance(source, list):
76
73
  return self._publish_stream(source=source, update=update)
77
74
 
78
75
  raise ValueError(f'Unsupported source - {type(source)}')
79
76
 
80
77
  def _publish_stream(
81
78
  self,
82
- source: list[dict[str, Any]] | pd.DataFrame,
79
+ source: list[dict[str, Any]],
83
80
  update: bool = False,
84
81
  ) -> list[UUID]:
85
82
  event_ids = []
86
- for events in self._get_stream_chunks(source=source):
83
+ for i in tqdm(range(0, len(source), self.STREAM_LIMIT)):
87
84
  response = self._publish_call(
88
- source=EventsSource(events=events),
85
+ source=EventsSource(events=source[i : i + self.STREAM_LIMIT]),
89
86
  environment=EnvType.PRODUCTION,
90
87
  dataset_name=None,
91
88
  update=update,
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import builtins
4
+ import copy
4
5
  import typing
5
6
  from dataclasses import dataclass
6
7
  from datetime import datetime
@@ -52,6 +53,7 @@ class Model(
52
53
  project_id: UUID | str,
53
54
  schema: ModelSchema,
54
55
  spec: ModelSpec,
56
+ version: str | None = None,
55
57
  input_type: str = ModelInputType.TABULAR,
56
58
  task: str = ModelTask.NOT_SET,
57
59
  task_params: ModelTaskParams | None = None,
@@ -63,6 +65,7 @@ class Model(
63
65
  ) -> None:
64
66
  """Construct a model instance"""
65
67
  self.name = name
68
+ self.version = version
66
69
  self.project_id = project_id
67
70
  self.schema = schema
68
71
  self.input_type = input_type
@@ -101,6 +104,7 @@ class Model(
101
104
  # Initialize
102
105
  instance = cls(
103
106
  name=resp_obj.name,
107
+ version=resp_obj.version,
104
108
  schema=resp_obj.schema_,
105
109
  spec=resp_obj.spec,
106
110
  project_id=resp_obj.project.id,
@@ -141,6 +145,7 @@ class Model(
141
145
  fields = [
142
146
  'id',
143
147
  'name',
148
+ 'version',
144
149
  'spec',
145
150
  'input_type',
146
151
  'task',
@@ -188,12 +193,20 @@ class Model(
188
193
 
189
194
  @classmethod
190
195
  @handle_api_error
191
- def from_name(cls, name: str, project_id: UUID | str) -> Model:
196
+ def from_name(
197
+ cls,
198
+ name: str,
199
+ project_id: UUID | str,
200
+ version: str | None = None,
201
+ latest: bool = False,
202
+ ) -> Model:
192
203
  """
193
204
  Get the model instance from model name within a project.
194
205
 
195
206
  :param name: Model name
196
207
  :param project_id: Project identifier
208
+ :param version: Version name
209
+ :param latest: Whether to fetch the latest version of the model or first version
197
210
  :return: Model instance
198
211
  """
199
212
  _filter = QueryCondition(
@@ -207,8 +220,15 @@ class Model(
207
220
  ]
208
221
  )
209
222
 
223
+ if version:
224
+ _filter.add_rule(
225
+ QueryRule(field='version', operator=OperatorType.EQUAL, value=version)
226
+ )
227
+
228
+ ordering = '-created_at' if latest else 'created_at'
210
229
  response = cls._client().get(
211
- url=cls._get_url(), params={'filter': _filter.json()}
230
+ url=cls._get_url(),
231
+ params={'filter': _filter.json(), 'limit': 1, 'ordering': ordering},
212
232
  )
213
233
 
214
234
  if response.json()['data']['total'] == 0:
@@ -219,22 +239,27 @@ class Model(
219
239
  @handle_api_error
220
240
  def create(self) -> Model:
221
241
  """Create a new model."""
242
+ payload = {
243
+ 'name': self.name,
244
+ 'project_id': str(self.project_id),
245
+ 'schema': self.schema.dict(),
246
+ 'spec': self.spec.dict(),
247
+ 'input_type': self.input_type,
248
+ 'task': self.task,
249
+ 'task_params': self.task_params.dict(),
250
+ 'description': self.description,
251
+ 'event_id_col': self.event_id_col,
252
+ 'event_ts_col': self.event_ts_col,
253
+ 'event_ts_format': self.event_ts_format,
254
+ 'xai_params': self.xai_params.dict(),
255
+ }
256
+
257
+ if self.version:
258
+ payload['version'] = self.version
259
+
222
260
  response = self._client().post(
223
261
  url=self._get_url(),
224
- data={
225
- 'name': self.name,
226
- 'project_id': str(self.project_id),
227
- 'schema': self.schema.dict(),
228
- 'spec': self.spec.dict(),
229
- 'input_type': self.input_type,
230
- 'task': self.task,
231
- 'task_params': self.task_params.dict(),
232
- 'description': self.description,
233
- 'event_id_col': self.event_id_col,
234
- 'event_ts_col': self.event_ts_col,
235
- 'event_ts_format': self.event_ts_format,
236
- 'xai_params': self.xai_params.dict(),
237
- },
262
+ data=payload,
238
263
  )
239
264
  self._refresh_from_response(response=response)
240
265
  return self
@@ -243,6 +268,7 @@ class Model(
243
268
  def update(self) -> None:
244
269
  """Update an existing model."""
245
270
  body: dict[str, Any] = {
271
+ 'version': self.version,
246
272
  'xai_params': self.xai_params.dict(),
247
273
  'description': self.description,
248
274
  'event_id_col': self.event_id_col,
@@ -256,13 +282,13 @@ class Model(
256
282
  @classmethod
257
283
  @handle_api_error
258
284
  def list(
259
- cls,
260
- project_id: UUID | str,
285
+ cls, project_id: UUID | str, name: str | None = None
261
286
  ) -> Iterator[ModelCompact]:
262
287
  """
263
288
  Get a list of all models with the given filters
264
289
 
265
290
  :param project_id: Project identifier
291
+ :param name: Model name, use this for listing all the versions of a model
266
292
  :return: ModelCompact iterator
267
293
  """
268
294
  _filter = QueryCondition(
@@ -273,11 +299,34 @@ class Model(
273
299
  ]
274
300
  )
275
301
 
302
+ if name:
303
+ _filter.add_rule(
304
+ QueryRule(field='name', operator=OperatorType.EQUAL, value=name)
305
+ )
306
+
276
307
  params = {'filter': _filter.json()}
277
308
 
278
309
  for model in cls._paginate(url=cls._get_url(), params=params):
279
310
  yield ModelCompact(id=model['id'], name=model['name'])
280
311
 
312
+ def duplicate(self, version: str | None = None) -> Model:
313
+ """
314
+ Duplicate the model instance with the given version name.
315
+
316
+ This call will not save the model on server. After making changes to the model
317
+ instance call .create() to add the model version to Fiddler Platform.
318
+
319
+ :param version: Version name for the new instance
320
+ :return: Model instance
321
+ """
322
+ self_copy = copy.deepcopy(self)
323
+ self_copy.id = None
324
+
325
+ if version:
326
+ self_copy.version = version
327
+
328
+ return self_copy
329
+
281
330
  @property
282
331
  def datasets(self) -> Iterator[Dataset]:
283
332
  """Fetch all the datasets of this model"""
@@ -316,6 +365,7 @@ class Model(
316
365
  name: str,
317
366
  project_id: UUID | str,
318
367
  spec: ModelSpec | None = None,
368
+ version: str | None = None,
319
369
  input_type: str = ModelInputType.TABULAR,
320
370
  task: str = ModelTask.NOT_SET,
321
371
  task_params: ModelTaskParams | None = None,
@@ -334,6 +384,7 @@ class Model(
334
384
  :param name: Model name
335
385
  :param project_id: Project identifier
336
386
  :param spec: ModelSpec instance
387
+ :param version: Model version name
337
388
  :param input_type: Model input task type
338
389
  :param task: Model task like Regression, Binary classification etc.
339
390
  :param task_params: Parameters based on the task type
@@ -354,6 +405,7 @@ class Model(
354
405
 
355
406
  return Model(
356
407
  name=name,
408
+ version=version,
357
409
  schema=resp_obj.schema_,
358
410
  spec=resp_obj.spec,
359
411
  project_id=project_id,
@@ -110,7 +110,7 @@ class ModelDeployment(
110
110
  self._refresh_from_response(response=response)
111
111
 
112
112
  @classmethod
113
- def of(cls, model_id: UUID) -> ModelDeployment:
113
+ def of(cls, model_id: UUID | str) -> ModelDeployment:
114
114
  """
115
115
  Get model deployment instance of the given model
116
116
 
@@ -24,8 +24,8 @@ class BaselineResp(BaseModel):
24
24
  type: str
25
25
  start_time: Optional[int]
26
26
  end_time: Optional[int]
27
- offset: Optional[int]
28
- window_size: Optional[int]
27
+ offset_delta: Optional[int]
28
+ window_bin_size: Optional[str]
29
29
  row_count: Optional[int]
30
30
 
31
31
  model: ModelCompactResp
@@ -22,6 +22,7 @@ class ModelCompactResp(BaseModel):
22
22
  class ModelResp(BaseModel):
23
23
  id: UUID
24
24
  name: str
25
+ version: str
25
26
  input_type: str
26
27
  task: str
27
28
  task_params: ModelTaskParams
@@ -29,8 +29,8 @@ API_RESPONSE_200 = {
29
29
  'type': 'STATIC',
30
30
  'start_time': None,
31
31
  'end_time': None,
32
- 'offset': None,
33
- 'window_size': None,
32
+ 'offset_delta': None,
33
+ 'window_bin_size': None,
34
34
  'row_count': 20000,
35
35
  'model': {
36
36
  'id': MODEL_ID,
@@ -80,8 +80,8 @@ LIST_API_RESPONSE = {
80
80
  'type': 'STATIC',
81
81
  'start_time': None,
82
82
  'end_time': None,
83
- 'offset': None,
84
- 'window_size': None,
83
+ 'offset_delta': None,
84
+ 'window_bin_size': None,
85
85
  'row_count': 20000,
86
86
  'model': {
87
87
  'id': MODEL_ID,