mlrun 1.7.0rc45__py3-none-any.whl → 1.7.0rc47__py3-none-any.whl

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.

Potentially problematic release.


This version of mlrun might be problematic. Click here for more details.

@@ -18,3 +18,4 @@ from .function import FunctionFormat # noqa
18
18
  from .pipeline import PipelineFormat # noqa
19
19
  from .project import ProjectFormat # noqa
20
20
  from .run import RunFormat # noqa
21
+ from .feature_set import FeatureSetFormat # noqa
@@ -0,0 +1,33 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ import typing
17
+
18
+ import mlrun.common.types
19
+
20
+ from .base import ObjectFormat
21
+
22
+
23
+ class FeatureSetFormat(ObjectFormat, mlrun.common.types.StrEnum):
24
+ minimal = "minimal"
25
+
26
+ @staticmethod
27
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
28
+ return {
29
+ FeatureSetFormat.full: None,
30
+ FeatureSetFormat.minimal: FeatureSetFormat.filter_obj_method(
31
+ ["kind", "metadata", "spec", "status.state"]
32
+ ),
33
+ }[_format]
@@ -175,6 +175,7 @@ from .project import (
175
175
  ProjectOwner,
176
176
  ProjectsOutput,
177
177
  ProjectSpec,
178
+ ProjectSpecOut,
178
179
  ProjectState,
179
180
  ProjectStatus,
180
181
  ProjectSummariesOutput,
@@ -25,6 +25,7 @@ from .constants import (
25
25
  FileTargetKind,
26
26
  FunctionURI,
27
27
  MetricData,
28
+ ModelEndpointMonitoringMetricType,
28
29
  ModelEndpointTarget,
29
30
  ModelEndpointTargetSchemas,
30
31
  ModelMonitoringMode,
@@ -34,6 +35,7 @@ from .constants import (
34
35
  ProjectSecretKeys,
35
36
  ResultData,
36
37
  ResultKindApp,
38
+ ResultStatusApp,
37
39
  SchedulingKeys,
38
40
  SpecialApps,
39
41
  TDEngineSuperTables,
@@ -60,7 +62,6 @@ from .model_endpoints import (
60
62
  ModelEndpointMetadata,
61
63
  ModelEndpointMonitoringMetric,
62
64
  ModelEndpointMonitoringMetricNoData,
63
- ModelEndpointMonitoringMetricType,
64
65
  ModelEndpointMonitoringMetricValues,
65
66
  ModelEndpointMonitoringResultValues,
66
67
  ModelEndpointSpec,
@@ -13,7 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import hashlib
16
- from dataclasses import dataclass
16
+ import re
17
+ from dataclasses import dataclass, field
17
18
  from enum import Enum, IntEnum
18
19
  from typing import Optional
19
20
 
@@ -295,7 +296,7 @@ class EndpointUID:
295
296
  function_hash_key: str
296
297
  model: str
297
298
  model_version: str
298
- uid: Optional[str] = None
299
+ uid: str = field(init=False)
299
300
 
300
301
  def __post_init__(self):
301
302
  function_ref = (
@@ -372,3 +373,23 @@ _RESERVED_FUNCTION_NAMES = MonitoringFunctionNames.list() + [SpecialApps.MLRUN_I
372
373
 
373
374
 
374
375
  V3IO_MODEL_MONITORING_DB = "v3io"
376
+
377
+
378
+ class ModelEndpointMonitoringMetricType(StrEnum):
379
+ RESULT = "result"
380
+ METRIC = "metric"
381
+
382
+
383
+ _FQN_PART_PATTERN = r"[a-zA-Z0-9_-]+"
384
+ FQN_PATTERN = (
385
+ rf"^(?P<project>{_FQN_PART_PATTERN})\."
386
+ rf"(?P<app>{_FQN_PART_PATTERN})\."
387
+ rf"(?P<type>{ModelEndpointMonitoringMetricType.RESULT}|{ModelEndpointMonitoringMetricType.METRIC})\."
388
+ rf"(?P<name>{_FQN_PART_PATTERN})$"
389
+ )
390
+ FQN_REGEX = re.compile(FQN_PATTERN)
391
+
392
+ # refer to `mlrun.utils.regex.project_name`
393
+ PROJECT_PATTERN = r"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$"
394
+
395
+ MODEL_ENDPOINT_ID_PATTERN = r"^[a-zA-Z0-9_-]+$"
@@ -14,26 +14,32 @@
14
14
 
15
15
  import enum
16
16
  import json
17
- import re
18
17
  from datetime import datetime
19
- from typing import Any, NamedTuple, Optional
18
+ from typing import Any, NamedTuple, Optional, TypeVar
20
19
 
21
- from pydantic import BaseModel, Field, validator
22
- from pydantic.main import Extra
20
+ from pydantic import BaseModel, Extra, Field, constr, validator
23
21
 
24
- import mlrun.common.types
22
+ # TODO: remove the unused import below after `mlrun.datastore` and `mlrun.utils` usage is removed.
23
+ # At the moment `make lint` fails if this is removed.
24
+ import mlrun.common.model_monitoring
25
25
 
26
26
  from ..object import ObjectKind, ObjectSpec, ObjectStatus
27
27
  from .constants import (
28
+ FQN_REGEX,
29
+ MODEL_ENDPOINT_ID_PATTERN,
30
+ PROJECT_PATTERN,
28
31
  EndpointType,
29
32
  EventFieldType,
30
33
  EventKeyMetrics,
31
34
  EventLiveStats,
35
+ ModelEndpointMonitoringMetricType,
32
36
  ModelMonitoringMode,
33
37
  ResultKindApp,
34
38
  ResultStatusApp,
35
39
  )
36
40
 
41
+ Model = TypeVar("Model", bound=BaseModel)
42
+
37
43
 
38
44
  class ModelMonitoringStoreKinds:
39
45
  # TODO: do changes in examples & demos In 1.5.0 remove
@@ -42,9 +48,9 @@ class ModelMonitoringStoreKinds:
42
48
 
43
49
 
44
50
  class ModelEndpointMetadata(BaseModel):
45
- project: Optional[str] = ""
51
+ project: constr(regex=PROJECT_PATTERN)
52
+ uid: constr(regex=MODEL_ENDPOINT_ID_PATTERN)
46
53
  labels: Optional[dict] = {}
47
- uid: Optional[str] = ""
48
54
 
49
55
  class Config:
50
56
  extra = Extra.allow
@@ -57,12 +63,11 @@ class ModelEndpointMetadata(BaseModel):
57
63
  :param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
58
64
  dictionary using json.loads().
59
65
  """
60
- new_object = cls()
61
66
  if json_parse_values is None:
62
67
  json_parse_values = [EventFieldType.LABELS]
63
68
 
64
69
  return _mapping_attributes(
65
- base_model=new_object,
70
+ model_class=cls,
66
71
  flattened_dictionary=endpoint_dict,
67
72
  json_parse_values=json_parse_values,
68
73
  )
@@ -89,7 +94,6 @@ class ModelEndpointSpec(ObjectSpec):
89
94
  :param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
90
95
  dictionary using json.loads().
91
96
  """
92
- new_object = cls()
93
97
  if json_parse_values is None:
94
98
  json_parse_values = [
95
99
  EventFieldType.FEATURE_NAMES,
@@ -97,7 +101,7 @@ class ModelEndpointSpec(ObjectSpec):
97
101
  EventFieldType.MONITOR_CONFIGURATION,
98
102
  ]
99
103
  return _mapping_attributes(
100
- base_model=new_object,
104
+ model_class=cls,
101
105
  flattened_dictionary=endpoint_dict,
102
106
  json_parse_values=json_parse_values,
103
107
  )
@@ -191,7 +195,6 @@ class ModelEndpointStatus(ObjectStatus):
191
195
  :param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
192
196
  dictionary using json.loads().
193
197
  """
194
- new_object = cls()
195
198
  if json_parse_values is None:
196
199
  json_parse_values = [
197
200
  EventFieldType.FEATURE_STATS,
@@ -203,7 +206,7 @@ class ModelEndpointStatus(ObjectStatus):
203
206
  EventFieldType.ENDPOINT_TYPE,
204
207
  ]
205
208
  return _mapping_attributes(
206
- base_model=new_object,
209
+ model_class=cls,
207
210
  flattened_dictionary=endpoint_dict,
208
211
  json_parse_values=json_parse_values,
209
212
  )
@@ -211,22 +214,13 @@ class ModelEndpointStatus(ObjectStatus):
211
214
 
212
215
  class ModelEndpoint(BaseModel):
213
216
  kind: ObjectKind = Field(ObjectKind.model_endpoint, const=True)
214
- metadata: ModelEndpointMetadata = ModelEndpointMetadata()
217
+ metadata: ModelEndpointMetadata
215
218
  spec: ModelEndpointSpec = ModelEndpointSpec()
216
219
  status: ModelEndpointStatus = ModelEndpointStatus()
217
220
 
218
221
  class Config:
219
222
  extra = Extra.allow
220
223
 
221
- def __init__(self, **data: Any):
222
- super().__init__(**data)
223
- if self.metadata.uid is None:
224
- uid = mlrun.common.model_monitoring.create_model_endpoint_uid(
225
- function_uri=self.spec.function_uri,
226
- versioned_model=self.spec.model,
227
- )
228
- self.metadata.uid = str(uid)
229
-
230
224
  def flat_dict(self):
231
225
  """Generate a flattened `ModelEndpoint` dictionary. The flattened dictionary result is important for storing
232
226
  the model endpoint object in the database.
@@ -267,7 +261,7 @@ class ModelEndpoint(BaseModel):
267
261
  return flatten_dict
268
262
 
269
263
  @classmethod
270
- def from_flat_dict(cls, endpoint_dict: dict):
264
+ def from_flat_dict(cls, endpoint_dict: dict) -> "ModelEndpoint":
271
265
  """Create a `ModelEndpoint` object from an endpoint flattened dictionary. Because the provided dictionary
272
266
  is flattened, we pass it as is to the subclasses without splitting the keys into spec, metadata, and status.
273
267
 
@@ -285,11 +279,6 @@ class ModelEndpointList(BaseModel):
285
279
  endpoints: list[ModelEndpoint] = []
286
280
 
287
281
 
288
- class ModelEndpointMonitoringMetricType(mlrun.common.types.StrEnum):
289
- RESULT = "result"
290
- METRIC = "metric"
291
-
292
-
293
282
  class ModelEndpointMonitoringMetric(BaseModel):
294
283
  project: str
295
284
  app: str
@@ -308,18 +297,8 @@ def _compose_full_name(
308
297
  return ".".join([project, app, type, name])
309
298
 
310
299
 
311
- _FQN_PART_PATTERN = r"[a-zA-Z0-9_-]+"
312
- _FQN_PATTERN = (
313
- rf"^(?P<project>{_FQN_PART_PATTERN})\."
314
- rf"(?P<app>{_FQN_PART_PATTERN})\."
315
- rf"(?P<type>{ModelEndpointMonitoringMetricType.RESULT}|{ModelEndpointMonitoringMetricType.METRIC})\."
316
- rf"(?P<name>{_FQN_PART_PATTERN})$"
317
- )
318
- _FQN_REGEX = re.compile(_FQN_PATTERN)
319
-
320
-
321
300
  def _parse_metric_fqn_to_monitoring_metric(fqn: str) -> ModelEndpointMonitoringMetric:
322
- match = _FQN_REGEX.fullmatch(fqn)
301
+ match = FQN_REGEX.fullmatch(fqn)
323
302
  if match is None:
324
303
  raise ValueError("The fully qualified name is not in the expected format")
325
304
  return ModelEndpointMonitoringMetric.parse_obj(
@@ -364,20 +343,18 @@ class ModelEndpointMonitoringMetricNoData(_ModelEndpointMonitoringMetricValuesBa
364
343
 
365
344
 
366
345
  def _mapping_attributes(
367
- base_model: BaseModel,
368
- flattened_dictionary: dict,
369
- json_parse_values: list = None,
370
- ):
346
+ model_class: type[Model], flattened_dictionary: dict, json_parse_values: list
347
+ ) -> Model:
371
348
  """Generate a `BaseModel` object with the provided dictionary attributes.
372
349
 
373
- :param base_model: `BaseModel` object (e.g. `ModelEndpointMetadata`).
350
+ :param model_class: `BaseModel` class (e.g. `ModelEndpointMetadata`).
374
351
  :param flattened_dictionary: Flattened dictionary that contains the model endpoint attributes.
375
352
  :param json_parse_values: List of dictionary keys with a JSON string value that will be parsed into a
376
353
  dictionary using json.loads().
377
354
  """
378
355
  # Get the fields of the provided base model object. These fields will be used to filter to relevent keys
379
356
  # from the flattened dictionary.
380
- wanted_keys = base_model.__fields__.keys()
357
+ wanted_keys = model_class.__fields__.keys()
381
358
 
382
359
  # Generate a filtered flattened dictionary that will be parsed into the BaseModel object
383
360
  dict_to_parse = {}
@@ -391,7 +368,7 @@ def _mapping_attributes(
391
368
  else:
392
369
  dict_to_parse[field_key] = flattened_dictionary[field_key]
393
370
 
394
- return base_model.parse_obj(dict_to_parse)
371
+ return model_class.parse_obj(dict_to_parse)
395
372
 
396
373
 
397
374
  def _json_loads_if_not_none(field: Any) -> Any:
mlrun/datastore/s3.py CHANGED
@@ -36,6 +36,7 @@ class S3Store(DataStore):
36
36
 
37
37
  access_key_id = self._get_secret_or_env("AWS_ACCESS_KEY_ID")
38
38
  secret_key = self._get_secret_or_env("AWS_SECRET_ACCESS_KEY")
39
+ token_file = self._get_secret_or_env("AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE")
39
40
  endpoint_url = self._get_secret_or_env("S3_ENDPOINT_URL")
40
41
  force_non_anonymous = self._get_secret_or_env("S3_NON_ANONYMOUS")
41
42
  profile_name = self._get_secret_or_env("AWS_PROFILE")
@@ -94,14 +95,15 @@ class S3Store(DataStore):
94
95
  self.s3 = boto3.resource(
95
96
  "s3", region_name=region, endpoint_url=endpoint_url
96
97
  )
97
- # If not using credentials, boto will still attempt to sign the requests, and will fail any operations
98
- # due to no credentials found. These commands disable signing and allow anonymous mode (same as
99
- # anon in the storage_options when working with fsspec).
100
- from botocore.handlers import disable_signing
101
-
102
- self.s3.meta.client.meta.events.register(
103
- "choose-signer.s3.*", disable_signing
104
- )
98
+ if not token_file:
99
+ # If not using credentials, boto will still attempt to sign the requests, and will fail any operations
100
+ # due to no credentials found. These commands disable signing and allow anonymous mode (same as
101
+ # anon in the storage_options when working with fsspec).
102
+ from botocore.handlers import disable_signing
103
+
104
+ self.s3.meta.client.meta.events.register(
105
+ "choose-signer.s3.*", disable_signing
106
+ )
105
107
 
106
108
  def get_spark_options(self):
107
109
  res = {}
@@ -139,6 +141,7 @@ class S3Store(DataStore):
139
141
  endpoint_url = self._get_secret_or_env("S3_ENDPOINT_URL")
140
142
  access_key_id = self._get_secret_or_env("AWS_ACCESS_KEY_ID")
141
143
  secret = self._get_secret_or_env("AWS_SECRET_ACCESS_KEY")
144
+ token_file = self._get_secret_or_env("AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE")
142
145
 
143
146
  if self._temp_credentials:
144
147
  access_key_id = self._temp_credentials["AccessKeyId"]
@@ -148,7 +151,7 @@ class S3Store(DataStore):
148
151
  token = None
149
152
 
150
153
  storage_options = dict(
151
- anon=not (force_non_anonymous or (access_key_id and secret)),
154
+ anon=not (force_non_anonymous or (access_key_id and secret) or token_file),
152
155
  key=access_key_id,
153
156
  secret=secret,
154
157
  token=token,
@@ -19,6 +19,7 @@ import mlrun
19
19
  import mlrun.model_monitoring.helpers
20
20
  from mlrun.datastore.base import DataStore
21
21
 
22
+ from ..platforms.iguazio import parse_path
22
23
  from .utils import (
23
24
  parse_kafka_url,
24
25
  )
@@ -82,12 +83,14 @@ class StreamStoreyTarget(storey.StreamTarget):
82
83
  def __init__(self, *args, **kwargs):
83
84
  args = list(args)
84
85
 
85
- path = args[0] if args else kwargs.get("stream_path")
86
- endpoint, storage_options = get_url_and_storage_options(path)
86
+ uri = args[0] if args else kwargs.get("stream_path")
87
87
 
88
- if not path:
88
+ if not uri:
89
89
  raise mlrun.errors.MLRunInvalidArgumentError("StreamTarget requires a path")
90
90
 
91
+ _, storage_options = get_url_and_storage_options(uri)
92
+ endpoint, path = parse_path(uri)
93
+
91
94
  access_key = storage_options.get("v3io_access_key")
92
95
  storage = V3ioDriver(
93
96
  webapi=endpoint or mlrun.mlconf.v3io_api, access_key=access_key
@@ -98,7 +101,7 @@ class StreamStoreyTarget(storey.StreamTarget):
98
101
  if args:
99
102
  args[0] = endpoint
100
103
  if "stream_path" in kwargs:
101
- kwargs["stream_path"] = endpoint
104
+ kwargs["stream_path"] = path
102
105
 
103
106
  super().__init__(*args, **kwargs)
104
107
 
mlrun/db/base.py CHANGED
@@ -395,6 +395,9 @@ class RunDBInterface(ABC):
395
395
  partition_order: Union[
396
396
  mlrun.common.schemas.OrderType, str
397
397
  ] = mlrun.common.schemas.OrderType.desc,
398
+ format_: Union[
399
+ str, mlrun.common.formatters.FeatureSetFormat
400
+ ] = mlrun.common.formatters.FeatureSetFormat.full,
398
401
  ) -> list[dict]:
399
402
  pass
400
403
 
mlrun/db/httpdb.py CHANGED
@@ -2235,6 +2235,9 @@ class HTTPRunDB(RunDBInterface):
2235
2235
  partition_order: Union[
2236
2236
  mlrun.common.schemas.OrderType, str
2237
2237
  ] = mlrun.common.schemas.OrderType.desc,
2238
+ format_: Union[
2239
+ str, mlrun.common.formatters.FeatureSetFormat
2240
+ ] = mlrun.common.formatters.FeatureSetFormat.full,
2238
2241
  ) -> list[FeatureSet]:
2239
2242
  """Retrieve a list of feature-sets matching the criteria provided.
2240
2243
 
@@ -2252,6 +2255,9 @@ class HTTPRunDB(RunDBInterface):
2252
2255
  :param partition_sort_by: What field to sort the results by, within each partition defined by `partition_by`.
2253
2256
  Currently the only allowed value are `created` and `updated`.
2254
2257
  :param partition_order: Order of sorting within partitions - `asc` or `desc`. Default is `desc`.
2258
+ :param format_: Format of the results. Possible values are:
2259
+ - ``minimal`` - Return minimal feature set objects, not including stats and preview for each feature set.
2260
+ - ``full`` - Return full feature set objects.
2255
2261
  :returns: List of matching :py:class:`~mlrun.feature_store.FeatureSet` objects.
2256
2262
  """
2257
2263
 
@@ -2264,6 +2270,7 @@ class HTTPRunDB(RunDBInterface):
2264
2270
  "entity": entities or [],
2265
2271
  "feature": features or [],
2266
2272
  "label": labels or [],
2273
+ "format": format_,
2267
2274
  }
2268
2275
  if partition_by:
2269
2276
  params.update(
mlrun/db/nopdb.py CHANGED
@@ -326,6 +326,9 @@ class NopDB(RunDBInterface):
326
326
  partition_order: Union[
327
327
  mlrun.common.schemas.OrderType, str
328
328
  ] = mlrun.common.schemas.OrderType.desc,
329
+ format_: Union[
330
+ str, mlrun.common.formatters.FeatureSetFormat
331
+ ] = mlrun.common.formatters.FeatureSetFormat.full,
329
332
  ) -> list[dict]:
330
333
  pass
331
334
 
mlrun/model.py CHANGED
@@ -2044,6 +2044,8 @@ class DataSource(ModelObj):
2044
2044
  ]
2045
2045
  kind = None
2046
2046
 
2047
+ _fields_to_serialize = ["start_time", "end_time"]
2048
+
2047
2049
  def __init__(
2048
2050
  self,
2049
2051
  name: str = None,
@@ -2072,6 +2074,16 @@ class DataSource(ModelObj):
2072
2074
  def set_secrets(self, secrets):
2073
2075
  self._secrets = secrets
2074
2076
 
2077
+ def _serialize_field(
2078
+ self, struct: dict, field_name: str = None, strip: bool = False
2079
+ ) -> typing.Any:
2080
+ value = super()._serialize_field(struct, field_name, strip)
2081
+ # We pull the field from self and not from struct because it was excluded from the struct when looping over
2082
+ # the fields to save.
2083
+ if field_name in ("start_time", "end_time") and isinstance(value, datetime):
2084
+ return value.isoformat()
2085
+ return value
2086
+
2075
2087
 
2076
2088
  class DataTargetBase(ModelObj):
2077
2089
  """data target spec, specify a destination for the feature set data"""
@@ -29,8 +29,8 @@ class _ModelMonitoringApplicationDataRes(ABC):
29
29
  def __post_init__(self):
30
30
  pat = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*")
31
31
  if not re.fullmatch(pat, self.name):
32
- raise mlrun.errors.MLRunInvalidArgumentError(
33
- "Attribute name must be of the format [a-zA-Z_][a-zA-Z0-9_]*"
32
+ raise mlrun.errors.MLRunValueError(
33
+ "Attribute name must comply with the regex `[a-zA-Z_][a-zA-Z0-9_]*`"
34
34
  )
35
35
 
36
36
  @abstractmethod
@@ -11,6 +11,7 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
14
15
  import json
15
16
  import typing
16
17
  from abc import ABC, abstractmethod
@@ -94,20 +94,20 @@ class TDEngineSchema:
94
94
  tags = ", ".join(f"{col} {val}" for col, val in self.tags.items())
95
95
  return f"CREATE STABLE if NOT EXISTS {self.database}.{self.super_table} ({columns}) TAGS ({tags});"
96
96
 
97
- def _create_subtable_query(
97
+ def _create_subtable_sql(
98
98
  self,
99
99
  subtable: str,
100
100
  values: dict[str, Union[str, int, float, datetime.datetime]],
101
101
  ) -> str:
102
102
  try:
103
- values = ", ".join(f"'{values[val]}'" for val in self.tags)
103
+ tags = ", ".join(f"'{values[val]}'" for val in self.tags)
104
104
  except KeyError:
105
105
  raise mlrun.errors.MLRunInvalidArgumentError(
106
106
  f"values must contain all tags: {self.tags.keys()}"
107
107
  )
108
- return f"CREATE TABLE if NOT EXISTS {self.database}.{subtable} USING {self.super_table} TAGS ({values});"
108
+ return f"CREATE TABLE if NOT EXISTS {self.database}.{subtable} USING {self.super_table} TAGS ({tags});"
109
109
 
110
- def _insert_subtable_query(
110
+ def _insert_subtable_stmt(
111
111
  self,
112
112
  connection: taosws.Connection,
113
113
  subtable: str,
@@ -116,7 +116,7 @@ class TDEngineSchema:
116
116
  stmt = connection.statement()
117
117
  question_marks = ", ".join("?" * len(self.columns))
118
118
  stmt.prepare(f"INSERT INTO ? VALUES ({question_marks});")
119
- stmt.set_tbname_tags(subtable, [])
119
+ stmt.set_tbname(subtable)
120
120
 
121
121
  bind_params = []
122
122
 
@@ -211,7 +211,7 @@ class TDEngineSchema:
211
211
  if filter_query:
212
212
  query.write(f"{filter_query} AND ")
213
213
  if start:
214
- query.write(f"{timestamp_column} >= '{start}'" + " AND ")
214
+ query.write(f"{timestamp_column} >= '{start}' AND ")
215
215
  if end:
216
216
  query.write(f"{timestamp_column} <= '{end}'")
217
217
  if interval:
@@ -97,7 +97,7 @@ class TDEngineConnector(TSDBConnector):
97
97
  self,
98
98
  event: dict,
99
99
  kind: mm_schemas.WriterEventKind = mm_schemas.WriterEventKind.RESULT,
100
- ):
100
+ ) -> None:
101
101
  """
102
102
  Write a single result or metric to TSDB.
103
103
  """
@@ -113,7 +113,7 @@ class TDEngineConnector(TSDBConnector):
113
113
  # Write a new result
114
114
  table = self.tables[mm_schemas.TDEngineSuperTables.APP_RESULTS]
115
115
  table_name = (
116
- f"{table_name}_" f"{event[mm_schemas.ResultData.RESULT_NAME]}"
116
+ f"{table_name}_{event[mm_schemas.ResultData.RESULT_NAME]}"
117
117
  ).replace("-", "_")
118
118
  event.pop(mm_schemas.ResultData.CURRENT_STATS, None)
119
119
 
@@ -121,9 +121,13 @@ class TDEngineConnector(TSDBConnector):
121
121
  # Write a new metric
122
122
  table = self.tables[mm_schemas.TDEngineSuperTables.METRICS]
123
123
  table_name = (
124
- f"{table_name}_" f"{event[mm_schemas.MetricData.METRIC_NAME]}"
124
+ f"{table_name}_{event[mm_schemas.MetricData.METRIC_NAME]}"
125
125
  ).replace("-", "_")
126
126
 
127
+ # Escape the table name for case-sensitivity (ML-7908)
128
+ # https://github.com/taosdata/taos-connector-python/issues/260
129
+ table_name = f"`{table_name}`"
130
+
127
131
  # Convert the datetime strings to datetime objects
128
132
  event[mm_schemas.WriterEvent.END_INFER_TIME] = self._convert_to_datetime(
129
133
  val=event[mm_schemas.WriterEvent.END_INFER_TIME]
@@ -132,15 +136,11 @@ class TDEngineConnector(TSDBConnector):
132
136
  val=event[mm_schemas.WriterEvent.START_INFER_TIME]
133
137
  )
134
138
 
135
- create_table_query = table._create_subtable_query(
136
- subtable=table_name, values=event
137
- )
138
- self.connection.execute(create_table_query)
139
+ create_table_sql = table._create_subtable_sql(subtable=table_name, values=event)
140
+ self.connection.execute(create_table_sql)
139
141
 
140
- insert_statement = table._insert_subtable_query(
141
- self.connection,
142
- subtable=table_name,
143
- values=event,
142
+ insert_statement = table._insert_subtable_stmt(
143
+ self.connection, subtable=table_name, values=event
144
144
  )
145
145
  insert_statement.add_batch()
146
146
  insert_statement.execute()
@@ -262,7 +262,7 @@ class TDEngineConnector(TSDBConnector):
262
262
 
263
263
  project_condition = f"project = '{self.project}'"
264
264
  filter_query = (
265
- f"{filter_query} AND {project_condition}"
265
+ f"({filter_query}) AND ({project_condition})"
266
266
  if filter_query
267
267
  else project_condition
268
268
  )
@@ -280,6 +280,7 @@ class TDEngineConnector(TSDBConnector):
280
280
  timestamp_column=timestamp_column,
281
281
  database=self.database,
282
282
  )
283
+ logger.debug("Querying TDEngine", query=full_query)
283
284
  try:
284
285
  query_result = self.connection.query(full_query)
285
286
  except taosws.QueryError as e:
@@ -336,11 +337,11 @@ class TDEngineConnector(TSDBConnector):
336
337
 
337
338
  metrics_condition = " OR ".join(
338
339
  [
339
- f"({mm_schemas.WriterEvent.APPLICATION_NAME} = '{metric.app}' AND {name} = '{metric.name}')"
340
+ f"({mm_schemas.WriterEvent.APPLICATION_NAME}='{metric.app}' AND {name}='{metric.name}')"
340
341
  for metric in metrics
341
342
  ]
342
343
  )
343
- filter_query = f"endpoint_id='{endpoint_id}' AND ({metrics_condition})"
344
+ filter_query = f"(endpoint_id='{endpoint_id}') AND ({metrics_condition})"
344
345
 
345
346
  df = self._get_records(
346
347
  table=table,
@@ -18,6 +18,10 @@ import typing
18
18
  import numpy as np
19
19
  import pandas as pd
20
20
 
21
+ if typing.TYPE_CHECKING:
22
+ from mlrun.db.base import RunDBInterface
23
+ from mlrun.projects import MlrunProject
24
+
21
25
  import mlrun
22
26
  import mlrun.artifacts
23
27
  import mlrun.common.model_monitoring.helpers
@@ -26,16 +30,11 @@ import mlrun.data_types.infer
26
30
  import mlrun.model_monitoring
27
31
  from mlrun.common.schemas.model_monitoring.model_endpoints import (
28
32
  ModelEndpointMonitoringMetric,
29
- ModelEndpointMonitoringMetricType,
30
33
  _compose_full_name,
31
34
  )
32
35
  from mlrun.model_monitoring.model_endpoint import ModelEndpoint
33
36
  from mlrun.utils import logger
34
37
 
35
- if typing.TYPE_CHECKING:
36
- from mlrun.db.base import RunDBInterface
37
- from mlrun.projects import MlrunProject
38
-
39
38
 
40
39
  class _BatchDict(typing.TypedDict):
41
40
  minutes: int
@@ -301,7 +300,7 @@ def get_invocations_fqn(project: str) -> str:
301
300
  project=project,
302
301
  app=mm_constants.SpecialApps.MLRUN_INFRA,
303
302
  name=mm_constants.PredictionsQueryConstants.INVOCATIONS,
304
- type=ModelEndpointMonitoringMetricType.METRIC,
303
+ type=mm_constants.ModelEndpointMonitoringMetricType.METRIC,
305
304
  )
306
305
 
307
306
 
@@ -315,7 +314,7 @@ def get_invocations_metric(project: str) -> ModelEndpointMonitoringMetric:
315
314
  return ModelEndpointMonitoringMetric(
316
315
  project=project,
317
316
  app=mm_constants.SpecialApps.MLRUN_INFRA,
318
- type=ModelEndpointMonitoringMetricType.METRIC,
317
+ type=mm_constants.ModelEndpointMonitoringMetricType.METRIC,
319
318
  name=mm_constants.PredictionsQueryConstants.INVOCATIONS,
320
319
  full_name=get_invocations_fqn(project),
321
320
  )
mlrun/projects/project.py CHANGED
@@ -1552,7 +1552,7 @@ class MlrunProject(ModelObj):
1552
1552
  url = path.normpath(path.join(self.spec.get_code_path(), url))
1553
1553
 
1554
1554
  if (not in_context or check_path_in_context) and not path.isfile(url):
1555
- raise mlrun.errors.MLRunNotFoundError(f"{url} not found")
1555
+ raise FileNotFoundError(f"{url} not found")
1556
1556
 
1557
1557
  return url, in_context
1558
1558
 
@@ -2900,6 +2900,16 @@ class MlrunProject(ModelObj):
2900
2900
  continue
2901
2901
 
2902
2902
  raise mlrun.errors.MLRunMissingDependencyError(message) from exc
2903
+
2904
+ except Exception as exc:
2905
+ if silent:
2906
+ logger.warn(
2907
+ "Failed to instantiate function",
2908
+ name=name,
2909
+ error=mlrun.utils.err_to_str(exc),
2910
+ )
2911
+ continue
2912
+ raise exc
2903
2913
  else:
2904
2914
  message = f"Function {name} must be an object or dict."
2905
2915
  if silent:
@@ -525,12 +525,8 @@ class RemoteRuntime(KubeResource):
525
525
  extra_attributes["ackWindowSize"] = ack_window_size
526
526
 
527
527
  access_key = kwargs.pop("access_key", None)
528
- if access_key:
529
- logger.warning(
530
- "The access_key parameter is deprecated and will be ignored, "
531
- "use the V3IO_ACCESS_KEY environment variable instead"
532
- )
533
- access_key = self._resolve_v3io_access_key()
528
+ if not access_key:
529
+ access_key = self._resolve_v3io_access_key()
534
530
 
535
531
  self.add_trigger(
536
532
  name,
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "39ed61397fb9111cb466b6106ece9009a1476f14",
3
- "version": "1.7.0-rc45"
2
+ "git_commit": "efce6df76e301a94049bc8cd8eb236302c3193ec",
3
+ "version": "1.7.0-rc47"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mlrun
3
- Version: 1.7.0rc45
3
+ Version: 1.7.0rc47
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -31,7 +31,7 @@ Requires-Dist: ipython ~=8.10
31
31
  Requires-Dist: nuclio-jupyter ~=0.10.4
32
32
  Requires-Dist: numpy <1.27.0,>=1.16.5
33
33
  Requires-Dist: pandas <2.2,>=1.2
34
- Requires-Dist: pyarrow <15,>=10.0
34
+ Requires-Dist: pyarrow <18,>=10.0
35
35
  Requires-Dist: pyyaml <7,>=5.4.1
36
36
  Requires-Dist: requests ~=2.32
37
37
  Requires-Dist: tabulate ~=0.8.6
@@ -43,7 +43,7 @@ Requires-Dist: semver ~=3.0
43
43
  Requires-Dist: dependency-injector ~=4.41
44
44
  Requires-Dist: fsspec <2024.7,>=2023.9.2
45
45
  Requires-Dist: v3iofs ~=0.1.17
46
- Requires-Dist: storey ~=1.7.24
46
+ Requires-Dist: storey ~=1.7.27
47
47
  Requires-Dist: inflection ~=0.5.0
48
48
  Requires-Dist: python-dotenv ~=0.17.0
49
49
  Requires-Dist: setuptools ~=71.0
@@ -84,7 +84,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'all'
84
84
  Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'all'
85
85
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'all'
86
86
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'all'
87
- Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'all'
87
+ Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'all'
88
88
  Provides-Extra: api
89
89
  Requires-Dist: uvicorn ~=0.27.1 ; extra == 'api'
90
90
  Requires-Dist: dask-kubernetes ~=0.11.0 ; extra == 'api'
@@ -137,7 +137,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'complete'
137
137
  Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete'
138
138
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete'
139
139
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete'
140
- Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'complete'
140
+ Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'complete'
141
141
  Provides-Extra: complete-api
142
142
  Requires-Dist: adlfs ==2023.9.0 ; extra == 'complete-api'
143
143
  Requires-Dist: aiobotocore <2.16,>=2.5.0 ; extra == 'complete-api'
@@ -174,7 +174,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'complete-api'
174
174
  Requires-Dist: s3fs <2024.7,>=2023.9.2 ; extra == 'complete-api'
175
175
  Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'complete-api'
176
176
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete-api'
177
- Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'complete-api'
177
+ Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'complete-api'
178
178
  Requires-Dist: timelength ~=1.1 ; extra == 'complete-api'
179
179
  Requires-Dist: uvicorn ~=0.27.1 ; extra == 'complete-api'
180
180
  Requires-Dist: memray ~=1.12 ; (sys_platform != "win32") and extra == 'complete-api'
@@ -209,7 +209,7 @@ Requires-Dist: snowflake-connector-python ~=3.7 ; extra == 'snowflake'
209
209
  Provides-Extra: sqlalchemy
210
210
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'sqlalchemy'
211
211
  Provides-Extra: tdengine
212
- Requires-Dist: taos-ws-py ~=0.3.2 ; extra == 'tdengine'
212
+ Requires-Dist: taos-ws-py ~=0.3.3 ; extra == 'tdengine'
213
213
 
214
214
  <a id="top"></a>
215
215
  [![Build Status](https://github.com/mlrun/mlrun/actions/workflows/build.yaml/badge.svg?branch=development)](https://github.com/mlrun/mlrun/actions/workflows/build.yaml?query=branch%3Adevelopment)
@@ -6,7 +6,7 @@ mlrun/execution.py,sha256=EGsEeSqOFnSxYFL4_YVKv8DEx2YsmJ9aA1gXBAV5W5A,42563
6
6
  mlrun/features.py,sha256=m17K_3l9Jktwb9dOwlHLTAPTlemsWrRF7dJhXUX0iJU,15429
7
7
  mlrun/k8s_utils.py,sha256=mRQMs6NzPq36vx1n5_2BfFapXysc8wv3NcrZ77_2ANA,8949
8
8
  mlrun/lists.py,sha256=3PqBdcajdwhTe1XuFsAaHTuFVM2kjwepf31qqE82apg,8384
9
- mlrun/model.py,sha256=WcRg13FSww_4YLpL-WDRnfoBnfiEHXRFTMLEMJIeICk,80694
9
+ mlrun/model.py,sha256=pWE8L9SIaNu3pAgoqVTea5i-MRXcWqorOWvL0AiwM5E,81226
10
10
  mlrun/render.py,sha256=940H9fBBFeghH4dlifbURvtjlvw4GlWdAXezN6ky4rI,13275
11
11
  mlrun/run.py,sha256=hNxV-TnixbH8MCos2jqz8jdTDlK7dBSvJMil_QoGKQI,43616
12
12
  mlrun/secrets.py,sha256=ibtCK79u7JVBZF6F0SP1-xXXF5MyrLEUs_TCWiJAnlc,7798
@@ -26,9 +26,10 @@ mlrun/common/secrets.py,sha256=vc8WV82EZsCB5ENjUkObFOzZP59aZ1w8F82PTnqwBnc,5181
26
26
  mlrun/common/types.py,sha256=APVFvumnHpCG-yXlt6OSioMfkyT-DADPiW3dGG3dUFQ,1057
27
27
  mlrun/common/db/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
28
28
  mlrun/common/db/sql_session.py,sha256=J6b-0xrnFb-8n_xdksPXeA8kArSMfAiSDN4n7iOhtus,2708
29
- mlrun/common/formatters/__init__.py,sha256=91yPb5xoLK7fTIOC5C7ndJMvyEBlQY6f0CjenLYbsZw,785
29
+ mlrun/common/formatters/__init__.py,sha256=topwMC5auQYTDBq8dwa31-5e8bWvHcLYmUqyXysXVWQ,835
30
30
  mlrun/common/formatters/artifact.py,sha256=t4LmoWCFjPJ_YzzQCC2aMJwOeeLi84le979m6OTRyoM,1401
31
31
  mlrun/common/formatters/base.py,sha256=LHwWWnQJCmvlnOCCmG8YtJ_xzs0xBI8PujYDL5Ky9H4,4101
32
+ mlrun/common/formatters/feature_set.py,sha256=lH5RL9Mo6weRexHrruUnmL1qqv_mZocBOQcyVOtXoIk,1056
32
33
  mlrun/common/formatters/function.py,sha256=fGa5m5aI_XvQdvrUr73dmUwrEJrE_8wM4_P4q8RgBTg,1477
33
34
  mlrun/common/formatters/pipeline.py,sha256=hGUV_3wcTEMa-JouspbjgJ1JGKa2Wc5cXSaH2XhOdMc,1763
34
35
  mlrun/common/formatters/project.py,sha256=rdGf7fq_CfwFwd8iKWl8sW-tqTJilK3gJtV5oLdaY-M,1756
@@ -36,7 +37,7 @@ mlrun/common/formatters/run.py,sha256=eEBy1NEwGT9b98TWS2OetEbDnDrnHBIBVMrlXsxveo
36
37
  mlrun/common/model_monitoring/__init__.py,sha256=x0EMEvxVjHsm858J1t6IEA9dtKTdFpJ9sKhss10ld8A,721
37
38
  mlrun/common/model_monitoring/helpers.py,sha256=1CpxIDQPumFnpUB1eqcvCpLlyPFVeW2sL6prM-N5A1A,4405
38
39
  mlrun/common/runtimes/constants.py,sha256=Rl0Sd8n_L7Imo-uF1LL9CJ5Szi0W1gUm36yrF8PXfSc,10989
39
- mlrun/common/schemas/__init__.py,sha256=xCRh98GdHfB6Tzb7_lrOhgoO9UnkUfTcsjStLZll8tc,5247
40
+ mlrun/common/schemas/__init__.py,sha256=QZMyVHjIoa88JmyVy45JGkNGz5K39XX7A72TUnXrLNA,5267
40
41
  mlrun/common/schemas/alert.py,sha256=qWYCISNYMdkgAARVQNxshVr9d-s8LGscfLKpczkTBms,6749
41
42
  mlrun/common/schemas/api_gateway.py,sha256=9ilorgLOiWxFZbv89-dbPNfVdaChlGOIdC4SLTxQwNI,7118
42
43
  mlrun/common/schemas/artifact.py,sha256=V3ngobnzI1v2eoOroWBEedjAZu0ntCSIQ-LzsOK1Z9k,3570
@@ -67,10 +68,10 @@ mlrun/common/schemas/schedule.py,sha256=nD9kxH2KjXkbGZPNfzVNlNSxbyFZmZUlwtT04_z2
67
68
  mlrun/common/schemas/secret.py,sha256=51tCN1F8DFTq4y_XdHIMDy3I1TnMEBX8kO8BHKavYF4,1484
68
69
  mlrun/common/schemas/tag.py,sha256=OAn9Qt6z8ibqw8uU8WQSvuwY8irUv45Dhx2Ko5FzUss,884
69
70
  mlrun/common/schemas/workflow.py,sha256=WxmlwtwrzwL4lfHYjQTOp03uv6PWYMpZ4cNBMOA6N6E,1897
70
- mlrun/common/schemas/model_monitoring/__init__.py,sha256=uCnHhhVZkWbbtsawIjOa3ub9ShDJK2md-s2fbx46crg,1792
71
- mlrun/common/schemas/model_monitoring/constants.py,sha256=YaKwvMHhJVIwFJDsLg2Iu6zCv2YgxdiiJ1owvb5IGGk,9568
71
+ mlrun/common/schemas/model_monitoring/__init__.py,sha256=q2icasMdgI7OG-p5eVwCu6sBuPrBMpRxByC6rxYk0DM,1813
72
+ mlrun/common/schemas/model_monitoring/constants.py,sha256=KD6gaw24EAKFow5LPl0JkMlSXHUMca3DS-S41sWAre8,10158
72
73
  mlrun/common/schemas/model_monitoring/grafana.py,sha256=SG13MFUUz_tk6-mWeSx17qcdEW4ekicxqNtnMSwRTCY,1559
73
- mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=FdKbO8Lb_SDrEXtEHn19GEiAWUWLd_fS6bk0ytanhmo,13762
74
+ mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=5vvjNX1bV98VSGdT4jwHr5ArKC9v_c1iHlaTf82fSUY,13198
74
75
  mlrun/data_types/__init__.py,sha256=EkxfkFoHb91zz3Aymq-KZfCHlPMzEc3bBqgzPUwmHWY,1087
75
76
  mlrun/data_types/data_types.py,sha256=3dmmIxJ2_uKzf-dbbgOwbYJx8cvUYrPiQan40vcSqJo,4948
76
77
  mlrun/data_types/infer.py,sha256=z2EbSpR6xWEE5-HRUtDZkapHQld3xMbzXtTX83K-690,6134
@@ -88,13 +89,13 @@ mlrun/datastore/google_cloud_storage.py,sha256=Lkr3jud2REXAf-ohI3Or7bbTKbb_MCKOW
88
89
  mlrun/datastore/hdfs.py,sha256=TfL1zUWVRxEHF9kswZtOzrMdDmhSfiSVIAjz7fxWyVw,1876
89
90
  mlrun/datastore/inmem.py,sha256=d2dIvHlOQylhc-i4B5Kk9e9ayXnF7DICc5yUlHcNwqs,2873
90
91
  mlrun/datastore/redis.py,sha256=vTjqtn8l6AvVXqjN0DroumnYFxlMhzVnqsW96p15c-0,5630
91
- mlrun/datastore/s3.py,sha256=I7C-2jU59U1XPTAAMe63MjClzLCQq6BfY3nQ_6vV3vk,8747
92
+ mlrun/datastore/s3.py,sha256=CBBgZlZDX_PyvQBbJRjY4gSaLpGWMygt_fG8n-xY28c,8994
92
93
  mlrun/datastore/snowflake_utils.py,sha256=Wohvnlmq8j1d98RCaknll-iWdZZpSlCrKhUOEy0_-CA,1483
93
94
  mlrun/datastore/sources.py,sha256=op90ksx95wqaBtoiORpHnqEgw4iGEDPsJ3_lI8ftS-E,48801
94
95
  mlrun/datastore/spark_udf.py,sha256=NnnB3DZxZb-rqpRy7b-NC7QWXuuqFn3XkBDc86tU4mQ,1498
95
96
  mlrun/datastore/spark_utils.py,sha256=_AsVoU5Ix_-W7Gyq8io8V-2GTk0m8THJNDP3WGGaWJY,2865
96
97
  mlrun/datastore/store_resources.py,sha256=rcLoG506AMmR8qPJU_gE-G5d34VJVV_vNlZ3VHqho6c,6869
97
- mlrun/datastore/storeytargets.py,sha256=t1TCqeXr2GZ-w_tgKhPyubOtlFRcYAnvXXR3peR0T-8,5015
98
+ mlrun/datastore/storeytargets.py,sha256=uNYG4nCBD3JIfa51CG4cDe9ryc9oIcqUdUXKvCPB6uE,5086
98
99
  mlrun/datastore/targets.py,sha256=TkG2HG4h7SaQ3qG2sKAHAuJJyj_gnE-eChaIsyjlq1o,80450
99
100
  mlrun/datastore/utils.py,sha256=l9dLZb_VCbHs_htqMFRv4qiestZ8z8K-4eY1MxHS8wE,7720
100
101
  mlrun/datastore/v3io.py,sha256=HxP6mygiYM6leDAbQ9KdTxObLCt9yGMro0YhfdU6KUo,8157
@@ -102,10 +103,10 @@ mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev
102
103
  mlrun/datastore/wasbfs/fs.py,sha256=MnSj7Q4OKA2L55ihCmUnj2t3GA3B77oLMdAw-yxvN9w,6151
103
104
  mlrun/db/__init__.py,sha256=WqJ4x8lqJ7ZoKbhEyFqkYADd9P6E3citckx9e9ZLcIU,1163
104
105
  mlrun/db/auth_utils.py,sha256=hpg8D2r82oN0BWabuWN04BTNZ7jYMAF242YSUpK7LFM,5211
105
- mlrun/db/base.py,sha256=VztBik6tUYFKGRVXIsXZE7HrALx0hO_sgpCcE2O0cLU,24156
106
+ mlrun/db/base.py,sha256=lUfJrCWbuRUErIrUUXAKI2sSlrwfB-dHDz-Ck_cnZHU,24297
106
107
  mlrun/db/factory.py,sha256=ibIrE5QkIIyzDU1FXKrfbc31cZiRLYKDZb8dqCpQwyU,2397
107
- mlrun/db/httpdb.py,sha256=VzfHIdqKLd9KFF7RV0qx2f6znyz413bNQNL8zRZ29Yw,184207
108
- mlrun/db/nopdb.py,sha256=Juj4Wq9r6IRBdsktFL7TT7T3ueuEouKOHlLAvRvp9n0,21479
108
+ mlrun/db/httpdb.py,sha256=5-xdym1Ls6iaR_5DD4Iv805fQAKH0Zx-4oc4n9Z6p8Y,184623
109
+ mlrun/db/nopdb.py,sha256=1oCZR2EmQQDkwXUgmyI3SB76zvOwA6Ml3Lk_xvuwHfc,21620
109
110
  mlrun/feature_store/__init__.py,sha256=FhHRc8NdqL_HWpCs7A8dKruxJS5wEm55Gs3dcgBiRUg,1522
110
111
  mlrun/feature_store/api.py,sha256=SWBbFD4KU2U4TUaAbD2hRLSquFWxX46mZGCToI0GfFQ,49994
111
112
  mlrun/feature_store/common.py,sha256=mSlfEj_LIbtM-pNiIWUGIdX0Z0y5ZoH5nKow7KMc5VQ,12673
@@ -216,7 +217,7 @@ mlrun/model_monitoring/application.py,sha256=RJ8HeAPfGO3P2A_dEZYNg60c1wKTADh2YSv
216
217
  mlrun/model_monitoring/controller.py,sha256=ZKp3mWMhj6irCuREs-OH1MYYh5DzqNEDe04kVPVrZzw,27971
217
218
  mlrun/model_monitoring/evidently_application.py,sha256=iOc42IVjj8m6PDBmVcKIMWm46Bu0EdO9SDcH40Eqhyo,769
218
219
  mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
219
- mlrun/model_monitoring/helpers.py,sha256=zoUfwo0IMOBa71p-DQgxS2lnpX3STcCv-XgClnBqWOU,12770
220
+ mlrun/model_monitoring/helpers.py,sha256=KsbSH0kEjCPajvLUpv3q5GWyvx0bZj-JkghGJlzbLZI,12757
220
221
  mlrun/model_monitoring/model_endpoint.py,sha256=7VX0cBATqLsA4sSinDzouf41ndxqh2mf5bO9BW0G5Z4,4017
221
222
  mlrun/model_monitoring/stream_processing.py,sha256=0eu1Gq1Obq87LFno6eIZ55poXoFaeloqYTLiQgyfd0k,38687
222
223
  mlrun/model_monitoring/tracking_policy.py,sha256=sQq956akAQpntkrJwIgFWcEq-JpyVcg0FxgNa4h3V70,5502
@@ -227,11 +228,11 @@ mlrun/model_monitoring/applications/base.py,sha256=snr3xYdqv6Po19yS0Z1VktyoLrbl8
227
228
  mlrun/model_monitoring/applications/context.py,sha256=jTZaRdPZBc2m8-rcC3gKFkSsaQByWn6ZCQuqCOOWdWo,12747
228
229
  mlrun/model_monitoring/applications/evidently_base.py,sha256=6hzfO6s0jEVHj4R_pujcn_p6LvdkKUDb9S4B6j2XEUY,8024
229
230
  mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=OOPojE-KIP9rAPZ6va6uJOjqJOb3c8K_VAmITXZd918,13341
230
- mlrun/model_monitoring/applications/results.py,sha256=d1Ffsz8rCymus8U3Ei7IUhL3Iie-AEGPsuFlhdQAGg0,3593
231
+ mlrun/model_monitoring/applications/results.py,sha256=B0YuLig4rgBzBs3OAh01yLavhtNgj8Oz1RD8UfEkENU,3590
231
232
  mlrun/model_monitoring/db/__init__.py,sha256=6Ic-X3Fh9XLPYMytmevGNSs-Hii1rAjLLoFTSPwTguw,736
232
233
  mlrun/model_monitoring/db/stores/__init__.py,sha256=m6Z6rPQyaufq5oXF3HVUYGDN34biAX1JE1F6OxLN9B8,4752
233
234
  mlrun/model_monitoring/db/stores/base/__init__.py,sha256=JufJETW3BXzPhFwbRa8dMf7BFGGZKceIWIMgr5x9n9c,599
234
- mlrun/model_monitoring/db/stores/base/store.py,sha256=xaiaUwXDYYV1z6e17Ny9IiE3a7pSiEFg8nffdWHSq0A,7517
235
+ mlrun/model_monitoring/db/stores/base/store.py,sha256=KDNiAil7wF7zTEp3KytyJeMGGT4oblt4-q1CvJlhB1k,7518
235
236
  mlrun/model_monitoring/db/stores/sqldb/__init__.py,sha256=6CsTXAxeLbbf8yfCADTaxmiavqwrLEdYFJ-qc5kgDAY,569
236
237
  mlrun/model_monitoring/db/stores/sqldb/sql_store.py,sha256=9YjYqLue1GV1K4G2VRLVFObySEaIDnGqivvvXDM29to,26154
237
238
  mlrun/model_monitoring/db/stores/sqldb/models/__init__.py,sha256=lCiGw9WKPtHAIgrtNS2jyvM5OZvZvogBh76iurNYblg,2453
@@ -244,9 +245,9 @@ mlrun/model_monitoring/db/tsdb/__init__.py,sha256=Zqh_27I2YAEHk9nl0Z6lUxP7VEfrgr
244
245
  mlrun/model_monitoring/db/tsdb/base.py,sha256=X89X763sDrShfRXE1N-p8k97E8NBs7O1QJFiO-CffLM,18583
245
246
  mlrun/model_monitoring/db/tsdb/helpers.py,sha256=0oUXc4aUkYtP2SGP6jTb3uPPKImIUsVsrb9otX9a7O4,1189
246
247
  mlrun/model_monitoring/db/tsdb/tdengine/__init__.py,sha256=vgBdsKaXUURKqIf3M0y4sRatmSVA4CQiJs7J5dcVBkQ,620
247
- mlrun/model_monitoring/db/tsdb/tdengine/schemas.py,sha256=1I47m4gbplXYiYgV_RP3mKF7WbfG6cyFJPABXHDMrfs,10524
248
+ mlrun/model_monitoring/db/tsdb/tdengine/schemas.py,sha256=7yZFn42sF597TBumVM-xhh1bjIQCbIo6qIvMK5WpWO0,10503
248
249
  mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py,sha256=Hb0vcCBP-o0ET78mU4P32fnhUL65QZv-pMuv2lnCby4,1586
249
- mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=CaBTBi-skQzM9kvLjYWNc_I3yrAtvsaN3dAOefanh04,18489
250
+ mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py,sha256=L4cDFfuGOVyF_bnPbUJ_xhMEt_DGwY6FWwoO4VEXSW4,18671
250
251
  mlrun/model_monitoring/db/tsdb/v3io/__init__.py,sha256=aL3bfmQsUQ-sbvKGdNihFj8gLCK3mSys0qDcXtYOwgc,616
251
252
  mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py,sha256=mbmhN4f_F58ptVjhwoMF6ifZSdnZWhK7x8eNsWS39IA,6217
252
253
  mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py,sha256=1H-IBXPNJPRAaxDMGWpUU25QqfR87LpZbJ03vaJkICs,32858
@@ -274,7 +275,7 @@ mlrun/platforms/iguazio.py,sha256=1h5BpdAEQJBg2vIt7ySjUADU0ip5OkaMYr0_VREi9ys,13
274
275
  mlrun/projects/__init__.py,sha256=Lv5rfxyXJrw6WGOWJKhBz66M6t3_zsNMCfUD6waPwx4,1153
275
276
  mlrun/projects/operations.py,sha256=UEpiW4bDscth4pwWcLWF1xz-IU7bnZfckPR7sXp3O-g,19441
276
277
  mlrun/projects/pipelines.py,sha256=tFqmE_diKiGURwZPCHVPZmwEKza_gyfpr7F8bLS3plA,40173
277
- mlrun/projects/project.py,sha256=e6rvQFjFFeQoyHScn-N8tJqDp_2RHhNlBE_8R_kH4Ho,190255
278
+ mlrun/projects/project.py,sha256=rw0QQ2XtBUevW3cv8baCGDGsqISxsHYYziPcOABLOpg,190604
278
279
  mlrun/runtimes/__init__.py,sha256=egLM94cDMUyQ1GVABdFGXUQcDhU70lP3k7qSnM_UnHY,9008
279
280
  mlrun/runtimes/base.py,sha256=JXWmTIcm3b0klGUOHDlyFNa3bUgsNzQIgWhUQpSZoE0,37692
280
281
  mlrun/runtimes/daskjob.py,sha256=Ka_xqim8LkCYjp-M_WgteJy6ZN_3qfmLLHvXs7N6pa4,19411
@@ -295,7 +296,7 @@ mlrun/runtimes/mpijob/abstract.py,sha256=kDWo-IY1FKLZhI30j38Xx9HMhlUvHezfd1DT2Sh
295
296
  mlrun/runtimes/mpijob/v1.py,sha256=1XQZC7AIMGX_AQCbApcwpH8I7y39-v0v2O35MvxjXoo,3213
296
297
  mlrun/runtimes/nuclio/__init__.py,sha256=gx1kizzKv8pGT5TNloN1js1hdbxqDw3rM90sLVYVffY,794
297
298
  mlrun/runtimes/nuclio/api_gateway.py,sha256=2sHtkVHSS3L1DuV2KNWatJJRxvoGSBOjB6tnqv6SA5w,26730
298
- mlrun/runtimes/nuclio/function.py,sha256=OgPqTFFpfP-QtwKXq5b114jnKpxAN_okzQ_OWCZv_xI,52290
299
+ mlrun/runtimes/nuclio/function.py,sha256=TQt6RyxK_iyzNJr2r57BRtVXuy2GMrhdeFOlFjb2AZg,52106
299
300
  mlrun/runtimes/nuclio/nuclio.py,sha256=sLK8KdGO1LbftlL3HqPZlFOFTAAuxJACZCVl1c0Ha6E,2942
300
301
  mlrun/runtimes/nuclio/serving.py,sha256=X0fYJnidH0S5xrupoTC74OhZz7Tym34iw6hFSzahMCk,29720
301
302
  mlrun/runtimes/nuclio/application/__init__.py,sha256=rRs5vasy_G9IyoTpYIjYDafGoL6ifFBKgBtsXn31Atw,614
@@ -342,11 +343,11 @@ mlrun/utils/notifications/notification/ipython.py,sha256=ZtVL30B_Ha0VGoo4LxO-voT
342
343
  mlrun/utils/notifications/notification/slack.py,sha256=wqpFGr5BTvFO5KuUSzFfxsgmyU1Ohq7fbrGeNe9TXOk,7006
343
344
  mlrun/utils/notifications/notification/webhook.py,sha256=cb9w1Mc8ENfJBdgan7iiVHK9eVls4-R3tUxmXM-P-8I,4746
344
345
  mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
345
- mlrun/utils/version/version.json,sha256=2SNY7ygI-aD63JsgGzknLUNHzNvkj2GDLMmmUEeTEPU,89
346
+ mlrun/utils/version/version.json,sha256=q5cEJlSDRoZA0OSLYB_pHTa6NDst7rvigtmJRxEHYLw,89
346
347
  mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
347
- mlrun-1.7.0rc45.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
348
- mlrun-1.7.0rc45.dist-info/METADATA,sha256=Uwx_ZH45pJOp1i9093x75g4sp9cKL4azSR8oTeoxf-U,19943
349
- mlrun-1.7.0rc45.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
350
- mlrun-1.7.0rc45.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
351
- mlrun-1.7.0rc45.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
352
- mlrun-1.7.0rc45.dist-info/RECORD,,
348
+ mlrun-1.7.0rc47.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
349
+ mlrun-1.7.0rc47.dist-info/METADATA,sha256=mFz9Rh9j0hxTRo8fwrTziz_722E5JijvBB8K32E3X7s,19943
350
+ mlrun-1.7.0rc47.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
351
+ mlrun-1.7.0rc47.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
352
+ mlrun-1.7.0rc47.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
353
+ mlrun-1.7.0rc47.dist-info/RECORD,,