mlrun 1.7.0rc24__py3-none-any.whl → 1.7.0rc25__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.

mlrun/__main__.py CHANGED
@@ -102,7 +102,9 @@ def main():
102
102
  )
103
103
  @click.option("--uid", help="unique run ID")
104
104
  @click.option("--name", help="run name")
105
- @click.option("--workflow", help="workflow name/id")
105
+ @click.option(
106
+ "--workflow", help="sets the run labels to match the given workflow name/id"
107
+ )
106
108
  @click.option("--project", help="project name/id")
107
109
  @click.option("--db", default="", help="save run results to path or DB url")
108
110
  @click.option(
@@ -17,3 +17,4 @@ from .artifact import ArtifactFormat # noqa
17
17
  from .function import FunctionFormat # noqa
18
18
  from .pipeline import PipelineFormat # noqa
19
19
  from .project import ProjectFormat # noqa
20
+ from .run import RunFormat # noqa
@@ -13,9 +13,32 @@
13
13
  # limitations under the License.
14
14
  #
15
15
 
16
+ import typing
17
+
16
18
  import mlrun.common.types
17
19
 
20
+ from .base import ObjectFormat
21
+
22
+
23
+ class ArtifactFormat(ObjectFormat, mlrun.common.types.StrEnum):
24
+ minimal = "minimal"
18
25
 
19
- # TODO: add a format that returns a minimal response with ObjectFormat
20
- class ArtifactFormat(mlrun.common.types.StrEnum):
21
- full = "full"
26
+ @staticmethod
27
+ def format_method(_format: str) -> typing.Optional[typing.Callable]:
28
+ return {
29
+ ArtifactFormat.full: None,
30
+ ArtifactFormat.minimal: ArtifactFormat.filter_obj_method(
31
+ [
32
+ "kind",
33
+ "metadata",
34
+ "status",
35
+ "project",
36
+ "spec.producer",
37
+ "spec.db_key",
38
+ "spec.size",
39
+ "spec.framework",
40
+ "spec.metrics",
41
+ "spec.target_path",
42
+ ]
43
+ ),
44
+ }[_format]
@@ -0,0 +1,26 @@
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
+
17
+ import mlrun.common.types
18
+ from mlrun.common.formatters.base import ObjectFormat
19
+
20
+
21
+ class RunFormat(ObjectFormat, mlrun.common.types.StrEnum):
22
+ # No enrichment, data is pulled as-is from the database.
23
+ standard = "standard"
24
+
25
+ # Performs run enrichment, including the run's artifacts. Only available for the `get` run API.
26
+ full = "full"
@@ -91,7 +91,9 @@ from .feature_store import (
91
91
  FeatureRecord,
92
92
  FeatureSet,
93
93
  FeatureSetDigestOutput,
94
+ FeatureSetDigestOutputV2,
94
95
  FeatureSetDigestSpec,
96
+ FeatureSetDigestSpecV2,
95
97
  FeatureSetIngestInput,
96
98
  FeatureSetIngestOutput,
97
99
  FeatureSetRecord,
@@ -104,7 +104,7 @@ class AlertCriteria(pydantic.BaseModel):
104
104
  pydantic.Field(
105
105
  description="Number of events to wait until notification is sent"
106
106
  ),
107
- ] = 0
107
+ ] = 1
108
108
  period: Annotated[
109
109
  str,
110
110
  pydantic.Field(
@@ -15,6 +15,7 @@
15
15
  import typing
16
16
 
17
17
  import pydantic
18
+ from deprecated import deprecated
18
19
 
19
20
  import mlrun.common.types
20
21
 
@@ -58,6 +59,16 @@ class ArtifactIdentifier(pydantic.BaseModel):
58
59
  # hash: typing.Optional[str]
59
60
 
60
61
 
62
+ @deprecated(
63
+ version="1.7.0",
64
+ reason="mlrun.common.schemas.ArtifactsFormat is deprecated and will be removed in 1.9.0. "
65
+ "Use mlrun.common.formatters.ArtifactFormat instead.",
66
+ category=FutureWarning,
67
+ )
68
+ class ArtifactsFormat(mlrun.common.types.StrEnum):
69
+ full = "full"
70
+
71
+
61
72
  class ArtifactMetadata(pydantic.BaseModel):
62
73
  key: str
63
74
  project: str
@@ -46,16 +46,6 @@ class Feature(FeatureStoreBaseModel):
46
46
  extra = pydantic.Extra.allow
47
47
 
48
48
 
49
- class QualifiedFeature(FeatureStoreBaseModel):
50
- name: str
51
- value_type: str
52
- feature_set_index: int
53
- labels: Optional[dict] = {}
54
-
55
- class Config:
56
- extra = pydantic.Extra.allow
57
-
58
-
59
49
  class Entity(FeatureStoreBaseModel):
60
50
  name: str
61
51
  value_type: str
@@ -65,16 +55,6 @@ class Entity(FeatureStoreBaseModel):
65
55
  extra = pydantic.Extra.allow
66
56
 
67
57
 
68
- class QualifiedEntity(FeatureStoreBaseModel):
69
- name: str
70
- value_type: str
71
- feature_set_index: int
72
- labels: Optional[dict] = {}
73
-
74
- class Config:
75
- extra = pydantic.Extra.allow
76
-
77
-
78
58
  class FeatureSetSpec(ObjectSpec):
79
59
  entities: list[Entity] = []
80
60
  features: list[Feature] = []
@@ -156,7 +136,7 @@ class FeaturesOutput(FeatureStoreBaseModel):
156
136
 
157
137
 
158
138
  class FeaturesOutputV2(FeatureStoreBaseModel):
159
- features: list[QualifiedFeature]
139
+ features: list[Feature]
160
140
  feature_set_digests: list[FeatureSetDigestOutputV2]
161
141
 
162
142
 
@@ -166,7 +146,7 @@ class EntityListOutput(FeatureStoreBaseModel):
166
146
 
167
147
 
168
148
  class EntitiesOutputV2(FeatureStoreBaseModel):
169
- entities: list[QualifiedEntity]
149
+ entities: list[Entity]
170
150
  feature_set_digests: list[FeatureSetDigestOutputV2]
171
151
 
172
152
 
@@ -15,6 +15,22 @@
15
15
  import typing
16
16
 
17
17
  import pydantic
18
+ from deprecated import deprecated
19
+
20
+ import mlrun.common.types
21
+
22
+
23
+ @deprecated(
24
+ version="1.7.0",
25
+ reason="mlrun.common.schemas.PipelinesFormat is deprecated and will be removed in 1.9.0. "
26
+ "Use mlrun.common.formatters.PipelineFormat instead.",
27
+ category=FutureWarning,
28
+ )
29
+ class PipelinesFormat(mlrun.common.types.StrEnum):
30
+ full = "full"
31
+ metadata_only = "metadata_only"
32
+ summary = "summary"
33
+ name_only = "name_only"
18
34
 
19
35
 
20
36
  class PipelinesPagination(str):
@@ -16,6 +16,7 @@ import datetime
16
16
  import typing
17
17
 
18
18
  import pydantic
19
+ from deprecated import deprecated
19
20
 
20
21
  import mlrun.common.types
21
22
 
@@ -23,6 +24,22 @@ from .common import ImageBuilder
23
24
  from .object import ObjectKind, ObjectStatus
24
25
 
25
26
 
27
+ @deprecated(
28
+ version="1.7.0",
29
+ reason="mlrun.common.schemas.ProjectsFormat is deprecated and will be removed in 1.9.0. "
30
+ "Use mlrun.common.formatters.ProjectFormat instead.",
31
+ category=FutureWarning,
32
+ )
33
+ class ProjectsFormat(mlrun.common.types.StrEnum):
34
+ full = "full"
35
+ name_only = "name_only"
36
+ # minimal format removes large fields from the response (e.g. functions, workflows, artifacts)
37
+ # and is used for faster response times (in the UI)
38
+ minimal = "minimal"
39
+ # internal - allowed only in follower mode, only for the leader for upgrade purposes
40
+ leader = "leader"
41
+
42
+
26
43
  class ProjectMetadata(pydantic.BaseModel):
27
44
  name: str
28
45
  created: typing.Optional[datetime.datetime] = None
@@ -15,9 +15,26 @@
15
15
  import typing
16
16
 
17
17
  import pydantic
18
+ from deprecated import deprecated
19
+
20
+ import mlrun.common.types
18
21
 
19
22
 
20
23
  class RunIdentifier(pydantic.BaseModel):
21
24
  kind: typing.Literal["run"] = "run"
22
25
  uid: typing.Optional[str]
23
26
  iter: typing.Optional[int]
27
+
28
+
29
+ @deprecated(
30
+ version="1.7.0",
31
+ reason="mlrun.common.schemas.RunsFormat is deprecated and will be removed in 1.9.0. "
32
+ "Use mlrun.common.formatters.RunFormat instead.",
33
+ category=FutureWarning,
34
+ )
35
+ class RunsFormat(mlrun.common.types.StrEnum):
36
+ # No enrichment, data is pulled as-is from the database.
37
+ standard = "standard"
38
+
39
+ # Performs run enrichment, including the run's artifacts. Only available for the `get` run API.
40
+ full = "full"
mlrun/common/types.py CHANGED
@@ -30,3 +30,8 @@ class HTTPMethod(StrEnum):
30
30
  GET = "GET"
31
31
  POST = "POST"
32
32
  DELETE = "DELETE"
33
+
34
+
35
+ class Operation(StrEnum):
36
+ ADD = "add"
37
+ REMOVE = "remove"
mlrun/config.py CHANGED
@@ -707,7 +707,7 @@ default_config = {
707
707
  "mode": "enabled",
708
708
  # maximum number of alerts we allow to be configured.
709
709
  # user will get an error when exceeding this
710
- "max_allowed": 1000,
710
+ "max_allowed": 10000,
711
711
  },
712
712
  "auth_with_client_id": {
713
713
  "enabled": False,
@@ -938,24 +938,6 @@ class Config:
938
938
  f"is not allowed for iguazio version: {igz_version} < 3.5.1"
939
939
  )
940
940
 
941
- def resolve_kfp_url(self, namespace=None):
942
- if config.kfp_url:
943
- return config.kfp_url
944
- igz_version = self.get_parsed_igz_version()
945
- # TODO: When Iguazio 3.4 will deprecate we can remove this line
946
- if igz_version and igz_version <= semver.VersionInfo.parse("3.6.0-b1"):
947
- if namespace is None:
948
- if not config.namespace:
949
- raise mlrun.errors.MLRunNotFoundError(
950
- "For KubeFlow Pipelines to function, a namespace must be configured"
951
- )
952
- namespace = config.namespace
953
- # When instead of host we provided namespace we tackled this issue
954
- # https://github.com/canonical/bundle-kubeflow/issues/412
955
- # TODO: When we'll move to kfp 1.4.0 (server side) it should be resolved
956
- return f"http://ml-pipeline.{namespace}.svc.cluster.local:8888"
957
- return None
958
-
959
941
  def resolve_chief_api_url(self) -> str:
960
942
  if self.httpdb.clusterization.chief.url:
961
943
  return self.httpdb.clusterization.chief.url
@@ -696,6 +696,7 @@ class BaseStoreTarget(DataTargetBase):
696
696
  self.kind, self.name, self.get_target_templated_path()
697
697
  )
698
698
  target = self._target
699
+ target.attributes = self.attributes
699
700
  target.run_id = self.run_id
700
701
  target.status = status or target.status or "created"
701
702
  target.updated = now_date().isoformat()
@@ -727,8 +728,18 @@ class BaseStoreTarget(DataTargetBase):
727
728
  raise NotImplementedError()
728
729
 
729
730
  def purge(self):
731
+ """
732
+ Delete the files of the target.
733
+
734
+ Do not use this function directly from the sdk. Use FeatureSet.purge_targets.
735
+ """
730
736
  store, path_in_store, target_path = self._get_store_and_path()
731
- store.rm(target_path, recursive=True)
737
+ if path_in_store not in ["", "/"]:
738
+ store.rm(path_in_store, recursive=True)
739
+ else:
740
+ raise mlrun.errors.MLRunInvalidArgumentError(
741
+ "Unable to delete target. Please Use purge_targets from FeatureSet object."
742
+ )
732
743
 
733
744
  def as_df(
734
745
  self,
mlrun/db/base.py CHANGED
@@ -16,6 +16,8 @@ import datetime
16
16
  from abc import ABC, abstractmethod
17
17
  from typing import Optional, Union
18
18
 
19
+ from deprecated import deprecated
20
+
19
21
  import mlrun.alerts
20
22
  import mlrun.common
21
23
  import mlrun.common.formatters
@@ -56,7 +58,13 @@ class RunDBInterface(ABC):
56
58
  pass
57
59
 
58
60
  @abstractmethod
59
- def read_run(self, uid, project="", iter=0):
61
+ def read_run(
62
+ self,
63
+ uid: str,
64
+ project: str = "",
65
+ iter: int = 0,
66
+ format_: mlrun.common.formatters.RunFormat = mlrun.common.formatters.RunFormat.full,
67
+ ):
60
68
  pass
61
69
 
62
70
  @abstractmethod
@@ -103,7 +111,16 @@ class RunDBInterface(ABC):
103
111
  pass
104
112
 
105
113
  @abstractmethod
106
- def read_artifact(self, key, tag="", iter=None, project="", tree=None, uid=None):
114
+ def read_artifact(
115
+ self,
116
+ key,
117
+ tag="",
118
+ iter=None,
119
+ project="",
120
+ tree=None,
121
+ uid=None,
122
+ format_: mlrun.common.formatters.ArtifactFormat = mlrun.common.formatters.ArtifactFormat.full,
123
+ ):
107
124
  pass
108
125
 
109
126
  @abstractmethod
@@ -120,6 +137,7 @@ class RunDBInterface(ABC):
120
137
  kind: str = None,
121
138
  category: Union[str, mlrun.common.schemas.ArtifactCategories] = None,
122
139
  tree: str = None,
140
+ format_: mlrun.common.formatters.ArtifactFormat = mlrun.common.formatters.ArtifactFormat.full,
123
141
  ):
124
142
  pass
125
143
 
@@ -302,6 +320,12 @@ class RunDBInterface(ABC):
302
320
  ) -> dict:
303
321
  pass
304
322
 
323
+ # TODO: remove in 1.9.0
324
+ @deprecated(
325
+ version="1.9.0",
326
+ reason="'list_features' will be removed in 1.9.0, use 'list_features_v2' instead",
327
+ category=FutureWarning,
328
+ )
305
329
  @abstractmethod
306
330
  def list_features(
307
331
  self,
@@ -313,6 +337,23 @@ class RunDBInterface(ABC):
313
337
  ) -> mlrun.common.schemas.FeaturesOutput:
314
338
  pass
315
339
 
340
+ @abstractmethod
341
+ def list_features_v2(
342
+ self,
343
+ project: str,
344
+ name: str = None,
345
+ tag: str = None,
346
+ entities: list[str] = None,
347
+ labels: list[str] = None,
348
+ ) -> mlrun.common.schemas.FeaturesOutputV2:
349
+ pass
350
+
351
+ # TODO: remove in 1.9.0
352
+ @deprecated(
353
+ version="1.9.0",
354
+ reason="'list_entities' will be removed in 1.9.0, use 'list_entities_v2' instead",
355
+ category=FutureWarning,
356
+ )
316
357
  @abstractmethod
317
358
  def list_entities(
318
359
  self,
@@ -323,6 +364,16 @@ class RunDBInterface(ABC):
323
364
  ) -> mlrun.common.schemas.EntitiesOutput:
324
365
  pass
325
366
 
367
+ @abstractmethod
368
+ def list_entities_v2(
369
+ self,
370
+ project: str,
371
+ name: str = None,
372
+ tag: str = None,
373
+ labels: list[str] = None,
374
+ ) -> mlrun.common.schemas.EntitiesOutputV2:
375
+ pass
376
+
326
377
  @abstractmethod
327
378
  def list_feature_sets(
328
379
  self,
mlrun/db/httpdb.py CHANGED
@@ -725,16 +725,26 @@ class HTTPRunDB(RunDBInterface):
725
725
  )
726
726
  return None
727
727
 
728
- def read_run(self, uid, project="", iter=0):
728
+ def read_run(
729
+ self,
730
+ uid,
731
+ project="",
732
+ iter=0,
733
+ format_: mlrun.common.formatters.RunFormat = mlrun.common.formatters.RunFormat.full,
734
+ ):
729
735
  """Read the details of a stored run from the DB.
730
736
 
731
- :param uid: The run's unique ID.
732
- :param project: Project name.
733
- :param iter: Iteration within a specific execution.
737
+ :param uid: The run's unique ID.
738
+ :param project: Project name.
739
+ :param iter: Iteration within a specific execution.
740
+ :param format_: The format in which to return the run details.
734
741
  """
735
742
 
736
743
  path = self._path_of("runs", project, uid)
737
- params = {"iter": iter}
744
+ params = {
745
+ "iter": iter,
746
+ "format": format_.value,
747
+ }
738
748
  error = f"get run {project}/{uid}"
739
749
  resp = self.api_call("GET", path, error, params=params)
740
750
  return resp.json()["data"]
@@ -979,6 +989,7 @@ class HTTPRunDB(RunDBInterface):
979
989
  project="",
980
990
  tree=None,
981
991
  uid=None,
992
+ format_: mlrun.common.formatters.ArtifactFormat = mlrun.common.formatters.ArtifactFormat.full,
982
993
  ):
983
994
  """Read an artifact, identified by its key, tag, tree and iteration.
984
995
 
@@ -988,20 +999,20 @@ class HTTPRunDB(RunDBInterface):
988
999
  :param project: Project that the artifact belongs to.
989
1000
  :param tree: The tree which generated this artifact.
990
1001
  :param uid: A unique ID for this specific version of the artifact (the uid that was generated in the backend)
1002
+ :param format_: The format in which to return the artifact. Default is 'full'.
991
1003
  """
992
1004
 
993
1005
  project = project or config.default_project
994
1006
  tag = tag or "latest"
995
1007
  endpoint_path = f"projects/{project}/artifacts/{key}"
996
1008
  error = f"read artifact {project}/{key}"
997
- # explicitly set artifacts format to 'full' since old servers may default to 'legacy'
998
1009
  params = {
999
- "format": mlrun.common.formatters.ArtifactFormat.full.value,
1010
+ "format": format_,
1000
1011
  "tag": tag,
1001
1012
  "tree": tree,
1002
1013
  "uid": uid,
1003
1014
  }
1004
- if iter:
1015
+ if iter is not None:
1005
1016
  params["iter"] = str(iter)
1006
1017
  resp = self.api_call("GET", endpoint_path, error, params=params, version="v2")
1007
1018
  return resp.json()
@@ -1061,6 +1072,7 @@ class HTTPRunDB(RunDBInterface):
1061
1072
  category: Union[str, mlrun.common.schemas.ArtifactCategories] = None,
1062
1073
  tree: str = None,
1063
1074
  producer_uri: str = None,
1075
+ format_: mlrun.common.formatters.ArtifactFormat = mlrun.common.formatters.ArtifactFormat.full,
1064
1076
  ) -> ArtifactList:
1065
1077
  """List artifacts filtered by various parameters.
1066
1078
 
@@ -1095,6 +1107,7 @@ class HTTPRunDB(RunDBInterface):
1095
1107
  :param producer_uri: Return artifacts produced by the requested producer URI. Producer URI usually
1096
1108
  points to a run and is used to filter artifacts by the run that produced them when the artifact producer id
1097
1109
  is a workflow id (artifact was created as part of a workflow).
1110
+ :param format_: The format in which to return the artifacts. Default is 'full'.
1098
1111
  """
1099
1112
 
1100
1113
  project = project or config.default_project
@@ -1112,7 +1125,7 @@ class HTTPRunDB(RunDBInterface):
1112
1125
  "kind": kind,
1113
1126
  "category": category,
1114
1127
  "tree": tree,
1115
- "format": mlrun.common.formatters.ArtifactFormat.full.value,
1128
+ "format": format_,
1116
1129
  "producer_uri": producer_uri,
1117
1130
  }
1118
1131
  error = "list artifacts"
@@ -2110,6 +2123,41 @@ class HTTPRunDB(RunDBInterface):
2110
2123
  resp = self.api_call("GET", path, error_message, params=params)
2111
2124
  return resp.json()["features"]
2112
2125
 
2126
+ def list_features_v2(
2127
+ self,
2128
+ project: str,
2129
+ name: str = None,
2130
+ tag: str = None,
2131
+ entities: list[str] = None,
2132
+ labels: list[str] = None,
2133
+ ) -> dict[str, list[dict]]:
2134
+ """List feature-sets which contain specific features. This function may return multiple versions of the same
2135
+ feature-set if a specific tag is not requested. Note that the various filters of this function actually
2136
+ refer to the feature-set object containing the features, not to the features themselves.
2137
+
2138
+ :param project: Project which contains these features.
2139
+ :param name: Name of the feature to look for. The name is used in a like query, and is not case-sensitive. For
2140
+ example, looking for ``feat`` will return features which are named ``MyFeature`` as well as ``defeat``.
2141
+ :param tag: Return feature-sets which contain the features looked for, and are tagged with the specific tag.
2142
+ :param entities: Return only feature-sets which contain an entity whose name is contained in this list.
2143
+ :param labels: Return only feature-sets which are labeled as requested.
2144
+ :returns: A list of features, and a list of their corresponding feature sets.
2145
+ """
2146
+
2147
+ project = project or config.default_project
2148
+ params = {
2149
+ "name": name,
2150
+ "tag": tag,
2151
+ "entity": entities or [],
2152
+ "label": labels or [],
2153
+ }
2154
+
2155
+ path = f"projects/{project}/features"
2156
+
2157
+ error_message = f"Failed listing features, project: {project}, query: {params}"
2158
+ resp = self.api_call("GET", path, error_message, params=params, version="v2")
2159
+ return resp.json()
2160
+
2113
2161
  def list_entities(
2114
2162
  self,
2115
2163
  project: str,
@@ -2135,6 +2183,31 @@ class HTTPRunDB(RunDBInterface):
2135
2183
  resp = self.api_call("GET", path, error_message, params=params)
2136
2184
  return resp.json()["entities"]
2137
2185
 
2186
+ def list_entities_v2(
2187
+ self,
2188
+ project: str,
2189
+ name: str = None,
2190
+ tag: str = None,
2191
+ labels: list[str] = None,
2192
+ ) -> dict[str, list[dict]]:
2193
+ """Retrieve a list of entities and their mapping to the containing feature-sets. This function is similar
2194
+ to the :py:func:`~list_features_v2` function, and uses the same logic. However, the entities are matched
2195
+ against the name rather than the features.
2196
+ """
2197
+
2198
+ project = project or config.default_project
2199
+ params = {
2200
+ "name": name,
2201
+ "tag": tag,
2202
+ "label": labels or [],
2203
+ }
2204
+
2205
+ path = f"projects/{project}/entities"
2206
+
2207
+ error_message = f"Failed listing entities, project: {project}, query: {params}"
2208
+ resp = self.api_call("GET", path, error_message, params=params, version="v2")
2209
+ return resp.json()
2210
+
2138
2211
  @staticmethod
2139
2212
  def _generate_partition_by_params(
2140
2213
  partition_by_cls,
mlrun/db/nopdb.py CHANGED
@@ -73,7 +73,13 @@ class NopDB(RunDBInterface):
73
73
  def abort_run(self, uid, project="", iter=0, timeout=45, status_text=""):
74
74
  pass
75
75
 
76
- def read_run(self, uid, project="", iter=0):
76
+ def read_run(
77
+ self,
78
+ uid,
79
+ project="",
80
+ iter=0,
81
+ format_: mlrun.common.formatters.RunFormat = mlrun.common.formatters.RunFormat.full,
82
+ ):
77
83
  pass
78
84
 
79
85
  def list_runs(
@@ -115,7 +121,16 @@ class NopDB(RunDBInterface):
115
121
  ):
116
122
  pass
117
123
 
118
- def read_artifact(self, key, tag="", iter=None, project="", tree=None, uid=None):
124
+ def read_artifact(
125
+ self,
126
+ key,
127
+ tag="",
128
+ iter=None,
129
+ project="",
130
+ tree=None,
131
+ uid=None,
132
+ format_: mlrun.common.formatters.ArtifactFormat = mlrun.common.formatters.ArtifactFormat.full,
133
+ ):
119
134
  pass
120
135
 
121
136
  def list_artifacts(
@@ -131,6 +146,7 @@ class NopDB(RunDBInterface):
131
146
  kind: str = None,
132
147
  category: Union[str, mlrun.common.schemas.ArtifactCategories] = None,
133
148
  tree: str = None,
149
+ format_: mlrun.common.formatters.ArtifactFormat = mlrun.common.formatters.ArtifactFormat.full,
134
150
  ):
135
151
  pass
136
152
 
@@ -252,11 +268,26 @@ class NopDB(RunDBInterface):
252
268
  ) -> mlrun.common.schemas.FeaturesOutput:
253
269
  pass
254
270
 
271
+ def list_features_v2(
272
+ self,
273
+ project: str,
274
+ name: str = None,
275
+ tag: str = None,
276
+ entities: list[str] = None,
277
+ labels: list[str] = None,
278
+ ) -> mlrun.common.schemas.FeaturesOutputV2:
279
+ pass
280
+
255
281
  def list_entities(
256
282
  self, project: str, name: str = None, tag: str = None, labels: list[str] = None
257
283
  ) -> mlrun.common.schemas.EntitiesOutput:
258
284
  pass
259
285
 
286
+ def list_entities_v2(
287
+ self, project: str, name: str = None, tag: str = None, labels: list[str] = None
288
+ ) -> mlrun.common.schemas.EntitiesOutputV2:
289
+ pass
290
+
260
291
  def list_feature_sets(
261
292
  self,
262
293
  project: str = "",
mlrun/model.py CHANGED
@@ -1989,6 +1989,7 @@ class DataTarget(DataTargetBase):
1989
1989
  "name",
1990
1990
  "kind",
1991
1991
  "path",
1992
+ "attributes",
1992
1993
  "start_time",
1993
1994
  "online",
1994
1995
  "status",
@@ -2020,6 +2021,7 @@ class DataTarget(DataTargetBase):
2020
2021
  self.last_written = None
2021
2022
  self._producer = None
2022
2023
  self.producer = {}
2024
+ self.attributes = {}
2023
2025
 
2024
2026
  @property
2025
2027
  def producer(self) -> FeatureSetProducer:
@@ -193,7 +193,7 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBaseV2):
193
193
  status=status,
194
194
  extra_data={
195
195
  EventFieldType.CURRENT_STATS: json.dumps(
196
- monitoring_context.feature_stats
196
+ monitoring_context.sample_df_stats
197
197
  ),
198
198
  EventFieldType.DRIFT_MEASURES: metrics_per_feature.T.to_json(),
199
199
  EventFieldType.DRIFT_STATUS: status.value,
@@ -22,8 +22,7 @@ import uuid
22
22
 
23
23
  import mlrun_pipelines.common.models
24
24
  import mlrun_pipelines.patcher
25
- from kfp.compiler import compiler
26
- from mlrun_pipelines.helpers import new_pipe_metadata
25
+ import mlrun_pipelines.utils
27
26
 
28
27
  import mlrun
29
28
  import mlrun.common.runtimes.constants
@@ -220,9 +219,10 @@ class _PipelineContext:
220
219
  force_run_local = mlrun.mlconf.force_run_local
221
220
  if force_run_local is None or force_run_local == "auto":
222
221
  force_run_local = not mlrun.mlconf.is_api_running_on_k8s()
223
- kfp_url = mlrun.mlconf.resolve_kfp_url()
224
- if not kfp_url:
222
+ if not mlrun.mlconf.kfp_url:
223
+ logger.debug("Kubeflow pipeline URL is not set, running locally")
225
224
  force_run_local = True
225
+
226
226
  if self.workflow:
227
227
  force_run_local = force_run_local or self.workflow.run_local
228
228
 
@@ -502,13 +502,14 @@ class _KFPRunner(_PipelineRunner):
502
502
  functions,
503
503
  secrets=project._secrets,
504
504
  )
505
- artifact_path = artifact_path or project.spec.artifact_path
506
-
507
- conf = new_pipe_metadata(
508
- artifact_path=artifact_path,
505
+ mlrun_pipelines.utils.compile_pipeline(
506
+ artifact_path=artifact_path or project.spec.artifact_path,
509
507
  cleanup_ttl=workflow_spec.cleanup_ttl,
508
+ ops=None,
509
+ pipeline=pipeline,
510
+ pipe_file=target,
511
+ type_check=True,
510
512
  )
511
- compiler.Compiler().compile(pipeline, target, pipeline_conf=conf)
512
513
  workflow_spec.clear_tmp()
513
514
  pipeline_context.clear()
514
515
 
mlrun/projects/project.py CHANGED
@@ -51,6 +51,7 @@ import mlrun.runtimes.nuclio.api_gateway
51
51
  import mlrun.runtimes.pod
52
52
  import mlrun.runtimes.utils
53
53
  import mlrun.serving
54
+ import mlrun.utils
54
55
  import mlrun.utils.regex
55
56
  from mlrun.alerts.alert import AlertConfig
56
57
  from mlrun.common.schemas.alert import AlertTemplate
@@ -993,15 +994,24 @@ class ProjectSpec(ModelObj):
993
994
 
994
995
  artifacts_dict = {}
995
996
  for artifact in artifacts:
996
- if not isinstance(artifact, dict) and not hasattr(artifact, "to_dict"):
997
+ invalid_object_type = not isinstance(artifact, dict) and not hasattr(
998
+ artifact, "to_dict"
999
+ )
1000
+ is_artifact_model = not isinstance(artifact, dict) and hasattr(
1001
+ artifact, "to_dict"
1002
+ )
1003
+
1004
+ if invalid_object_type:
997
1005
  raise ValueError("artifacts must be a dict or class")
998
- if isinstance(artifact, dict):
999
- key = artifact.get("metadata", {}).get("key", "")
1000
- if not key:
1001
- raise ValueError('artifacts "metadata.key" must be specified')
1002
- else:
1006
+ elif is_artifact_model:
1003
1007
  key = artifact.key
1004
1008
  artifact = artifact.to_dict()
1009
+ else: # artifact is a dict
1010
+ # imported artifacts don't have metadata,spec,status fields
1011
+ key_field = "key" if _is_imported_artifact(artifact) else "metadata.key"
1012
+ key = mlrun.utils.get_in(artifact, key_field, "")
1013
+ if not key:
1014
+ raise ValueError(f'artifacts "{key_field}" must be specified')
1005
1015
 
1006
1016
  artifacts_dict[key] = artifact
1007
1017
 
mlrun/run.py CHANGED
@@ -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 importlib.util as imputil
15
16
  import json
16
17
  import os
@@ -28,9 +29,9 @@ from typing import Optional, Union
28
29
 
29
30
  import nuclio
30
31
  import yaml
31
- from kfp import Client
32
32
  from mlrun_pipelines.common.models import RunStatuses
33
33
  from mlrun_pipelines.common.ops import format_summary_from_kfp_run, show_kfp_run
34
+ from mlrun_pipelines.utils import get_client
34
35
 
35
36
  import mlrun.common.constants as mlrun_constants
36
37
  import mlrun.common.formatters
@@ -293,10 +294,14 @@ def get_or_create_ctx(
293
294
  newspec["metadata"]["project"] = (
294
295
  newspec["metadata"].get("project") or project or mlconf.default_project
295
296
  )
297
+
296
298
  newspec["metadata"].setdefault("labels", {})
297
- newspec["metadata"]["labels"] = {
298
- mlrun_constants.MLRunInternalLabels.kind: RuntimeKinds.local
299
- }
299
+
300
+ # This function can also be called as a local run if it is not called within a function.
301
+ # It will create a local run, and the run kind must be local by default.
302
+ newspec["metadata"]["labels"].setdefault(
303
+ mlrun_constants.MLRunInternalLabels.kind, RuntimeKinds.local
304
+ )
300
305
 
301
306
  ctx = MLClientCtx.from_dict(
302
307
  newspec, rundb=out, autocommit=autocommit, tmp=tmp, host=socket.gethostname()
@@ -948,7 +953,7 @@ def wait_for_pipeline_completion(
948
953
  _wait_for_pipeline_completion,
949
954
  )
950
955
  else:
951
- client = Client(namespace=namespace)
956
+ client = get_client(namespace=namespace)
952
957
  resp = client.wait_for_run_completion(run_id, timeout)
953
958
  if resp:
954
959
  resp = resp.to_dict()
@@ -1009,7 +1014,7 @@ def get_pipeline(
1009
1014
  )
1010
1015
 
1011
1016
  else:
1012
- client = Client(namespace=namespace)
1017
+ client = get_client(namespace=namespace)
1013
1018
  resp = client.get_run(run_id)
1014
1019
  if resp:
1015
1020
  resp = resp.to_dict()
mlrun/runtimes/base.py CHANGED
@@ -426,13 +426,19 @@ class BaseRuntime(ModelObj):
426
426
  reset_on_run=reset_on_run,
427
427
  )
428
428
 
429
- def _get_db_run(self, task: RunObject = None):
429
+ def _get_db_run(
430
+ self,
431
+ task: RunObject = None,
432
+ run_format: mlrun.common.formatters.RunFormat = mlrun.common.formatters.RunFormat.full,
433
+ ):
430
434
  if self._get_db() and task:
431
435
  project = task.metadata.project
432
436
  uid = task.metadata.uid
433
437
  iter = task.metadata.iteration
434
438
  try:
435
- return self._get_db().read_run(uid, project, iter=iter)
439
+ return self._get_db().read_run(
440
+ uid, project, iter=iter, format_=run_format
441
+ )
436
442
  except mlrun.db.RunDBError:
437
443
  return None
438
444
  if task:
@@ -549,13 +555,14 @@ class BaseRuntime(ModelObj):
549
555
  self,
550
556
  resp: dict = None,
551
557
  task: RunObject = None,
552
- err=None,
558
+ err: Union[Exception, str] = None,
559
+ run_format: mlrun.common.formatters.RunFormat = mlrun.common.formatters.RunFormat.full,
553
560
  ) -> typing.Optional[dict]:
554
561
  """update the task state in the DB"""
555
562
  was_none = False
556
563
  if resp is None and task:
557
564
  was_none = True
558
- resp = self._get_db_run(task)
565
+ resp = self._get_db_run(task, run_format)
559
566
 
560
567
  if not resp:
561
568
  self.store_run(task)
mlrun/serving/server.py CHANGED
@@ -383,8 +383,14 @@ def v2_serving_handler(context, event, get_body=False):
383
383
  if event.body == b"":
384
384
  event.body = None
385
385
 
386
- # ML-6065 workaround for NUC-178
387
- if hasattr(event, "trigger") and event.trigger.kind in ("kafka", "kafka-cluster"):
386
+ # original path is saved in stream_path so it can be used by explicit ack, but path is reset to / as a
387
+ # workaround for NUC-178
388
+ event.stream_path = event.path
389
+ if hasattr(event, "trigger") and event.trigger.kind in (
390
+ "kafka",
391
+ "kafka-cluster",
392
+ "v3ioStream",
393
+ ):
388
394
  event.path = "/"
389
395
 
390
396
  return context._server.run(event, context, get_body)
mlrun/serving/states.py CHANGED
@@ -832,6 +832,35 @@ class QueueStep(BaseStep):
832
832
  def async_object(self):
833
833
  return self._async_object
834
834
 
835
+ def to(
836
+ self,
837
+ class_name: Union[str, StepToDict] = None,
838
+ name: str = None,
839
+ handler: str = None,
840
+ graph_shape: str = None,
841
+ function: str = None,
842
+ full_event: bool = None,
843
+ input_path: str = None,
844
+ result_path: str = None,
845
+ **class_args,
846
+ ):
847
+ if not function:
848
+ name = get_name(name, class_name)
849
+ raise mlrun.errors.MLRunInvalidArgumentError(
850
+ f"step '{name}' must specify a function, because it follows a queue step"
851
+ )
852
+ return super().to(
853
+ class_name,
854
+ name,
855
+ handler,
856
+ graph_shape,
857
+ function,
858
+ full_event,
859
+ input_path,
860
+ result_path,
861
+ **class_args,
862
+ )
863
+
835
864
  def run(self, event, *args, **kwargs):
836
865
  data = event.body
837
866
  if not data:
mlrun/utils/helpers.py CHANGED
@@ -674,6 +674,8 @@ def parse_artifact_uri(uri, default_project=""):
674
674
  raise ValueError(
675
675
  f"illegal store path '{uri}', iteration must be integer value"
676
676
  )
677
+ else:
678
+ iteration = 0
677
679
  return (
678
680
  group_dict["project"] or default_project,
679
681
  group_dict["key"],
@@ -1314,6 +1316,7 @@ def format_run(run: PipelineRun, with_project=False) -> dict:
1314
1316
  "scheduled_at",
1315
1317
  "finished_at",
1316
1318
  "description",
1319
+ "experiment_id",
1317
1320
  ]
1318
1321
 
1319
1322
  if with_project:
@@ -20,9 +20,9 @@ import traceback
20
20
  import typing
21
21
  from concurrent.futures import ThreadPoolExecutor
22
22
 
23
- import kfp
24
23
  import mlrun_pipelines.common.ops
25
24
  import mlrun_pipelines.models
25
+ import mlrun_pipelines.utils
26
26
 
27
27
  import mlrun.common.constants as mlrun_constants
28
28
  import mlrun.common.runtimes.constants
@@ -484,13 +484,7 @@ class NotificationPusher(_NotificationPusherBase):
484
484
  def _get_workflow_manifest(
485
485
  workflow_id: str,
486
486
  ) -> typing.Optional[mlrun_pipelines.models.PipelineManifest]:
487
- kfp_url = mlrun.mlconf.resolve_kfp_url(mlrun.mlconf.namespace)
488
- if not kfp_url:
489
- raise mlrun.errors.MLRunNotFoundError(
490
- "KubeFlow Pipelines is not configured"
491
- )
492
-
493
- kfp_client = kfp.Client(host=kfp_url)
487
+ kfp_client = mlrun_pipelines.utils.get_client(mlrun.mlconf)
494
488
 
495
489
  # arbitrary timeout of 5 seconds, the workflow should be done by now
496
490
  kfp_run = kfp_client.wait_for_run_completion(workflow_id, 5)
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "fb5875ed70c2de21f86d2f112a830946d10bf5e2",
3
- "version": "1.7.0-rc24"
2
+ "git_commit": "a0adb214a48c9a8ba1e379d27e0f62bd20fd55a1",
3
+ "version": "1.7.0-rc25"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mlrun
3
- Version: 1.7.0rc24
3
+ Version: 1.7.0rc25
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -43,7 +43,7 @@ Requires-Dist: semver ~=3.0
43
43
  Requires-Dist: dependency-injector ~=4.41
44
44
  Requires-Dist: fsspec <2024.4,>=2023.9.2
45
45
  Requires-Dist: v3iofs ~=0.1.17
46
- Requires-Dist: storey ~=1.7.17
46
+ Requires-Dist: storey ~=1.7.20
47
47
  Requires-Dist: inflection ~=0.5.0
48
48
  Requires-Dist: python-dotenv ~=0.17.0
49
49
  Requires-Dist: setuptools ~=69.1
@@ -1,14 +1,14 @@
1
1
  mlrun/__init__.py,sha256=y08M1JcKXy5-9_5WaI9fn5aV5BxIQ5QkbduJK0OxWbA,7470
2
- mlrun/__main__.py,sha256=F65N1MUdAn5hO4qFuJ1v5M3XSCLHUKv7C010toZd-P4,45852
3
- mlrun/config.py,sha256=sG_gjNcQ8UPoa9-nTfeT2UMLcZhbezcojs4RMHN4Xvk,65499
2
+ mlrun/__main__.py,sha256=KzJQH8Rw7izeIdnfVIJO0ZDjdyUMCyicT0f_n0HhtAw,45897
3
+ mlrun/config.py,sha256=A6kKM_-jDyG3qgCD9ZjQhgp7S_Muk5BJCJxWoal94Bc,64563
4
4
  mlrun/errors.py,sha256=Y26Czt93m5HCSPd6CyrHFiWO4R7spiTrOnk4FqaUUxE,7345
5
5
  mlrun/execution.py,sha256=ZSk61dXqnEmxnUYxaAjtSzobMlD1yF9VaW56KLmaiUs,41717
6
6
  mlrun/features.py,sha256=m17K_3l9Jktwb9dOwlHLTAPTlemsWrRF7dJhXUX0iJU,15429
7
7
  mlrun/k8s_utils.py,sha256=WdUajadvAhTR7sAMQdwFqKeJMimuTyqm02VdwK1A4xU,7023
8
8
  mlrun/lists.py,sha256=3PqBdcajdwhTe1XuFsAaHTuFVM2kjwepf31qqE82apg,8384
9
- mlrun/model.py,sha256=bX9OrxF32jAcgphDPJoZkQ9Ov39ECLvdUvoAEcknJOk,72150
9
+ mlrun/model.py,sha256=ZILAK8-HTdVf3hI_ANwQfBTRYtm2wB9kEtg-HRoK9Xk,72201
10
10
  mlrun/render.py,sha256=uVI4kk7XqMAxamholZ_stPQ0nPUebij50ZpgAdjDQ6U,13131
11
- mlrun/run.py,sha256=HpvrKd77umuOKXH245EaXKFTkzXeqG7D37e1IxoDsB8,42682
11
+ mlrun/run.py,sha256=1jMUIeucjyynHzRyHAyBgg8kZUwJ0751SAoz965IsDo,42893
12
12
  mlrun/secrets.py,sha256=ibtCK79u7JVBZF6F0SP1-xXXF5MyrLEUs_TCWiJAnlc,7798
13
13
  mlrun/alerts/__init__.py,sha256=0gtG1BG0DXxFrXegIkjbM1XEN4sP9ODo0ucXrNld1hU,601
14
14
  mlrun/alerts/alert.py,sha256=dAXff9Y0UY5gwuUiofs6BngiNoebkVWI503oATihAXM,6040
@@ -23,22 +23,23 @@ mlrun/common/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
23
23
  mlrun/common/constants.py,sha256=glR3bAqDanX6fOOfuM7vJ9GSy-2RVmn1wNtLFeHqjr0,2987
24
24
  mlrun/common/helpers.py,sha256=LRIULbCg8afKkPnzsZ99-B-JPVjcwR1G9vO--1rzRrQ,1387
25
25
  mlrun/common/secrets.py,sha256=vc8WV82EZsCB5ENjUkObFOzZP59aZ1w8F82PTnqwBnc,5181
26
- mlrun/common/types.py,sha256=8BSjewHKuFHIfbwr-UZYu9NVkO6-wvMXwEyYPVAWxLQ,971
26
+ mlrun/common/types.py,sha256=cs8AtoI6LSuf2LF5Hg2ZSQ0QTex5_KqVSmNAU8_rnlk,1037
27
27
  mlrun/common/db/__init__.py,sha256=xY3wHC4TEJgez7qtnn1pQvHosi8-5UJOCtyGBS7FcGE,571
28
28
  mlrun/common/db/sql_session.py,sha256=Znc8KE2oLy4lg3_vRki1sVlNx59TgDSOTCXfU561hBU,2659
29
- mlrun/common/formatters/__init__.py,sha256=LvqyfZGHDseVxl5vV-2yZzqQphk8FyrN9LJPP0zUpq4,750
30
- mlrun/common/formatters/artifact.py,sha256=Pj70W47fZv6abxFVRfaIx9ayFpWyS-0arMOTFsRf_yg,739
29
+ mlrun/common/formatters/__init__.py,sha256=91yPb5xoLK7fTIOC5C7ndJMvyEBlQY6f0CjenLYbsZw,785
30
+ mlrun/common/formatters/artifact.py,sha256=rwMSedrkcNz6XVHhyuxVqfFTnHNrT2XU8hg42VVKvwE,1363
31
31
  mlrun/common/formatters/base.py,sha256=1dBjmE22S3WvaV_JV6fw6Q2U5NxeB6ZzsFFH2dVvFYA,4101
32
32
  mlrun/common/formatters/function.py,sha256=fGa5m5aI_XvQdvrUr73dmUwrEJrE_8wM4_P4q8RgBTg,1477
33
33
  mlrun/common/formatters/pipeline.py,sha256=hGUV_3wcTEMa-JouspbjgJ1JGKa2Wc5cXSaH2XhOdMc,1763
34
34
  mlrun/common/formatters/project.py,sha256=rdGf7fq_CfwFwd8iKWl8sW-tqTJilK3gJtV5oLdaY-M,1756
35
+ mlrun/common/formatters/run.py,sha256=eEBy1NEwGT9b98TWS2OetEbDnDrnHBIBVMrlXsxveo4,920
35
36
  mlrun/common/model_monitoring/__init__.py,sha256=x0EMEvxVjHsm858J1t6IEA9dtKTdFpJ9sKhss10ld8A,721
36
37
  mlrun/common/model_monitoring/helpers.py,sha256=1CpxIDQPumFnpUB1eqcvCpLlyPFVeW2sL6prM-N5A1A,4405
37
38
  mlrun/common/runtimes/constants.py,sha256=Rl0Sd8n_L7Imo-uF1LL9CJ5Szi0W1gUm36yrF8PXfSc,10989
38
- mlrun/common/schemas/__init__.py,sha256=Vg3S4JKA41y43S4nxCYfGOkpAw86sC9tn6BsD5qe_s4,5178
39
- mlrun/common/schemas/alert.py,sha256=yzXcmrhW8EHb-NxArVSlH0pRPrBLyqpMCTgMCDz4ExM,6644
39
+ mlrun/common/schemas/__init__.py,sha256=uqXeeg275X7NlM9FrH5JBORLA5s87P8MSrd7fwPoTlY,5236
40
+ mlrun/common/schemas/alert.py,sha256=a5zUqPRzfE8mMiBDc1n0x7mQ6INExlU7-IRq0q8LY3Q,6644
40
41
  mlrun/common/schemas/api_gateway.py,sha256=QydwqvklisZZu8-cCvGdnhqORwq7Q7cUhY88na57Fh0,6725
41
- mlrun/common/schemas/artifact.py,sha256=hlKBK3L1Rg4Hv2XSu3u_gxdrsm0NbsaPjIS9cE_Equ4,3247
42
+ mlrun/common/schemas/artifact.py,sha256=V3ngobnzI1v2eoOroWBEedjAZu0ntCSIQ-LzsOK1Z9k,3570
42
43
  mlrun/common/schemas/auth.py,sha256=5c4WSn3KdX1v04ttSQblkF_gyjdjuJSHG7BTCx4_LWM,6336
43
44
  mlrun/common/schemas/background_task.py,sha256=2qZxib2qrF_nPZj0ncitCG-2jxz2hg1qj0hFc8eswWQ,1707
44
45
  mlrun/common/schemas/client_spec.py,sha256=xQ_9S5i5q7vJmkp2_3IYD0FSYnWoAr1k-W9MU2ClgEU,2955
@@ -47,7 +48,7 @@ mlrun/common/schemas/common.py,sha256=00upzVLPN7O511Q87yt-fvRcDQFbXra4j0_lqMGg6r
47
48
  mlrun/common/schemas/constants.py,sha256=UnnhyLeF-SSjy8KaV5a-TBw4Ws675gueYGiP1fr5NfU,6476
48
49
  mlrun/common/schemas/datastore_profile.py,sha256=hJ8q54A8VZKsnOvSIjcllj4MZ1bBhb_EmBgsqpwSF_Y,750
49
50
  mlrun/common/schemas/events.py,sha256=ROHJLo_fqYjc96pek7yhAUPpPRIuAR76lwxvNz8LIr8,1026
50
- mlrun/common/schemas/feature_store.py,sha256=Y_83p3tQmlIj-GiymkDbm056I9DHeocSqL_kO7TXza8,5189
51
+ mlrun/common/schemas/feature_store.py,sha256=T0yKYcv6cb3ZwgY5Jh9kWp94zLv2ImxAQUy6x68Imd0,4776
51
52
  mlrun/common/schemas/frontend_spec.py,sha256=CNPq3YV0U1jCbCMbb84_Oid2Snow5EXYt1F5wsuhgD8,2454
52
53
  mlrun/common/schemas/function.py,sha256=Khd5Jd6ept1nHWkW1WdIy1u8iK4O8_Ddf3a7cv3Hf1I,4652
53
54
  mlrun/common/schemas/http.py,sha256=1PtYFhF6sqLSBRcuPMtYcUGmroBhaleqLmYidSdL9LM,705
@@ -57,10 +58,10 @@ mlrun/common/schemas/memory_reports.py,sha256=tpS3fpvxa6VcBpzCRzcZTt0fCF0h6ReUet
57
58
  mlrun/common/schemas/notification.py,sha256=Ge7eWNGf_XUFkjOnUkyUOubdEbmXh9z_OSGcSturt4w,1768
58
59
  mlrun/common/schemas/object.py,sha256=VleJSUmDJMl92knLgaDE8SWCi3ky0UaHcwcwOIapPQ8,1980
59
60
  mlrun/common/schemas/pagination.py,sha256=q7nk6bipkDiE7HExIVqhy5ANl-zv0x8QC9Kg6AkLtDA,887
60
- mlrun/common/schemas/pipeline.py,sha256=uB3vN6b-84yTR1ARIMWi-WFi2qNvaszr3eMOTP0s9E4,991
61
- mlrun/common/schemas/project.py,sha256=b_Tx0SZ7hzsj_WY0irSKQtCCdtHxd-5WRiM_sCf2MEM,4247
61
+ mlrun/common/schemas/pipeline.py,sha256=MhH07_fAQXNAnmf5j6oXZp8qh9cxGcZlReMdt-ZJf40,1429
62
+ mlrun/common/schemas/project.py,sha256=YVmnF187RjVaD0RYcw8hZuk7g_sv9grSv-K9R4cjDhw,4885
62
63
  mlrun/common/schemas/regex.py,sha256=8_vbDeAE0SODJDj7yUFg1FbaB9CNydYQTJ29JxE74Kc,776
63
- mlrun/common/schemas/runs.py,sha256=H9QhaN83cFUN42eE9TLgi1gs6Xdq11oQSZ96ESM94mI,745
64
+ mlrun/common/schemas/runs.py,sha256=yGGJxSHT_Mq4RLjlfuxW4pm9i-Py9eOsGUAofs_VqVM,1268
64
65
  mlrun/common/schemas/runtime_resource.py,sha256=2rSuYL-9JkESSomlnU91mYDbfV-IkqZeXx6OHuMmDxs,1554
65
66
  mlrun/common/schemas/schedule.py,sha256=e9nAeRkZkyk37Ws1cBNseHVKPOQqmWV16rt-zr_eAJU,4287
66
67
  mlrun/common/schemas/secret.py,sha256=51tCN1F8DFTq4y_XdHIMDy3I1TnMEBX8kO8BHKavYF4,1484
@@ -93,17 +94,17 @@ mlrun/datastore/sources.py,sha256=p6wDgR6AMpaHYi5iP58oNViUtUGK4lfyD68ffN4XtKI,45
93
94
  mlrun/datastore/spark_udf.py,sha256=NnnB3DZxZb-rqpRy7b-NC7QWXuuqFn3XkBDc86tU4mQ,1498
94
95
  mlrun/datastore/spark_utils.py,sha256=50rllp6xXpXY__1LbU7aTXUU5ca8dKAfoskPre3npZo,1611
95
96
  mlrun/datastore/store_resources.py,sha256=iKVWhAK8uwoYap14j48sbaDPrx6WsboWJFHQCJNWxyM,6832
96
- mlrun/datastore/targets.py,sha256=KMyqYaYGiWs3Uk3CkkNWEH528wziED3q1Guzfa_S2n4,79003
97
+ mlrun/datastore/targets.py,sha256=R_xntuaxAtkGdhFrilvc6TQ9mWdLNZNdAaPH3l70-J4,79425
97
98
  mlrun/datastore/utils.py,sha256=l9dLZb_VCbHs_htqMFRv4qiestZ8z8K-4eY1MxHS8wE,7720
98
99
  mlrun/datastore/v3io.py,sha256=tmZ2S-POZhjjKPE_0T1EkHcv6Q10pz5KQiaTXE1Be-4,8102
99
100
  mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev56Te4,1343
100
101
  mlrun/datastore/wasbfs/fs.py,sha256=MnSj7Q4OKA2L55ihCmUnj2t3GA3B77oLMdAw-yxvN9w,6151
101
102
  mlrun/db/__init__.py,sha256=WqJ4x8lqJ7ZoKbhEyFqkYADd9P6E3citckx9e9ZLcIU,1163
102
103
  mlrun/db/auth_utils.py,sha256=hpg8D2r82oN0BWabuWN04BTNZ7jYMAF242YSUpK7LFM,5211
103
- mlrun/db/base.py,sha256=g1x5cIxuLjHocmVIsbMmUgDseS0nNfitl_aN9wixH4M,22404
104
+ mlrun/db/base.py,sha256=N3y6YzTuEohZufQidU4Yfe2fn4SSsQ6WQHM5-KP6p9I,23751
104
105
  mlrun/db/factory.py,sha256=ibIrE5QkIIyzDU1FXKrfbc31cZiRLYKDZb8dqCpQwyU,2397
105
- mlrun/db/httpdb.py,sha256=52rjQ0e0MnZHEegwcmwjsCm9vx7dbMNcMlckwB1YWWQ,179816
106
- mlrun/db/nopdb.py,sha256=fO34H7vxiy2tmSu37EQ8lxm6OW_yz8AwUEtTJjANblo,19676
106
+ mlrun/db/httpdb.py,sha256=Ei49Xta7JRYnsAbZ3zIU0nfq9YVj-ceLHwegK_aLGuo,182913
107
+ mlrun/db/nopdb.py,sha256=UwFtaqKDRdYojpUVSzHf0UMyBCJ4YIxdlV9QTOz_FUI,20498
107
108
  mlrun/feature_store/__init__.py,sha256=FhHRc8NdqL_HWpCs7A8dKruxJS5wEm55Gs3dcgBiRUg,1522
108
109
  mlrun/feature_store/api.py,sha256=uYheyPkJOVCrz1jivvpGatgy_JBAq0It0XZqPpNVQkE,48699
109
110
  mlrun/feature_store/common.py,sha256=DKmoRk04NCS1gv7qZuEUa2-g8WsfR6IWjYctcrqKVlg,12853
@@ -227,7 +228,7 @@ mlrun/model_monitoring/applications/_application_steps.py,sha256=-g9jxIAFM5f22iJ
227
228
  mlrun/model_monitoring/applications/base.py,sha256=buVKyghH4AB3chZ5py1vyMIFnTF-deY8YDf_fPC9BnQ,11307
228
229
  mlrun/model_monitoring/applications/context.py,sha256=i-9h6pWyrS8mjw53zd0kb_Dsf9ReS8cSfnth8PvOEI4,8571
229
230
  mlrun/model_monitoring/applications/evidently_base.py,sha256=AE_eIz-GEYm3AZTrMCiqF9bcSMlvYk08LJb6bKWAQLg,8057
230
- mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=HZmNg09SCjAKkIlKmJwqR7hr-8sXrwFEqXgJCitVbXc,13039
231
+ mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=G3afA0q9r7clmtcEAoXAzsr8zYXHIOYXiRxQEwVio_E,13041
231
232
  mlrun/model_monitoring/applications/results.py,sha256=VVlu9Si7Tj2LNJzPQrp4_Qeyh9mxOVMu1Jwb5K2LfvY,3577
232
233
  mlrun/model_monitoring/db/__init__.py,sha256=6Ic-X3Fh9XLPYMytmevGNSs-Hii1rAjLLoFTSPwTguw,736
233
234
  mlrun/model_monitoring/db/stores/__init__.py,sha256=8lCEvKBJsOa2DPiqw4Y9D___nkfYM8T_-OuD5AAlKa4,4144
@@ -274,10 +275,10 @@ mlrun/platforms/__init__.py,sha256=ggSGF7inITs6S-vj9u4S9X_5psgbA0G3GVqf7zu8qYc,2
274
275
  mlrun/platforms/iguazio.py,sha256=1h5BpdAEQJBg2vIt7ySjUADU0ip5OkaMYr0_VREi9ys,13084
275
276
  mlrun/projects/__init__.py,sha256=Lv5rfxyXJrw6WGOWJKhBz66M6t3_zsNMCfUD6waPwx4,1153
276
277
  mlrun/projects/operations.py,sha256=NEN4PmSvLO9QMwSG4TncmBgTKC9wJp7hGo5lA7OYN_Q,19199
277
- mlrun/projects/pipelines.py,sha256=c9HhMtXk-6kmTCiY-f0Cmd3GWgL_fBFE6HXp2lrhRtE,40009
278
- mlrun/projects/project.py,sha256=cG8yEmViov3c6pqM0K3l8Bbs4GDMVD8X_aKw3S0Jy9k,181672
278
+ mlrun/projects/pipelines.py,sha256=Xc9tQSBBPEg1Yxn-b4RseFdfO7SvrYC-ekdw_hAcPH8,40006
279
+ mlrun/projects/project.py,sha256=QG0jCz6ZIWTHTWAJWlP7fM_BjJmTLLvihgBzkPPa_P0,182082
279
280
  mlrun/runtimes/__init__.py,sha256=0-tYDkew-Cr4DM-wztvMbzDA5xq385Jjo-GrtO_84Sc,8741
280
- mlrun/runtimes/base.py,sha256=SvaKfWtAKFhrX2RW7wy3B76OUAg9XdTDaJPpbCEhsdY,37323
281
+ mlrun/runtimes/base.py,sha256=yw5SceU2Js1AOr4f0ByZ3l1VsZUAnKKeC41DRTmNi68,37633
281
282
  mlrun/runtimes/daskjob.py,sha256=_3jQIEroNxG587ZJ0cW5nVJVBb1IcOECor_bkgZHtMk,19194
282
283
  mlrun/runtimes/funcdoc.py,sha256=CC9cWRPgBiM2sk4NJTqusjc6O9kZ-49vGA5WRPjREKE,9796
283
284
  mlrun/runtimes/function_reference.py,sha256=iWKRe4r2GTc5S8FOIASYUNLwwne8NqIui51PFr8Q4mg,4918
@@ -308,9 +309,9 @@ mlrun/serving/__init__.py,sha256=-SMRV3q_5cGVPDxRslXPU0zGYZIygs0cSj7WKlOJJUc,116
308
309
  mlrun/serving/merger.py,sha256=PXLn3A21FiLteJHaDSLm5xKNT-80eTTjfHUJnBX1gKY,6116
309
310
  mlrun/serving/remote.py,sha256=MrFByphQWmIsKXqw-MOwl2Q1hbtWReYVRKvlcKj9pfw,17980
310
311
  mlrun/serving/routers.py,sha256=scvpXD0VmgGRLJb2UqNq0o39ML2_F_SyZ4OXVQhJIOM,55086
311
- mlrun/serving/server.py,sha256=jQ3ZHijujJgZgbKXsYWJ9qKatbWpuTLz1YgUJ01wsEg,21235
312
+ mlrun/serving/server.py,sha256=5tkSxuqRFnoy8U8p-Nv9iW26E54NuhUABVbQ5taBCgk,21410
312
313
  mlrun/serving/serving_wrapper.py,sha256=R670-S6PX_d5ER6jiHtRvacuPyFzQH0mEf2K0sBIIOM,836
313
- mlrun/serving/states.py,sha256=n3RPtzwqfQB1o4H80AoVsP5exL3L3i39ONs-CorWGyM,58539
314
+ mlrun/serving/states.py,sha256=XA9GJB9JZNcaywCGJ1DLxHoS225J3aF8s8B8Y_-bKM8,59341
314
315
  mlrun/serving/utils.py,sha256=lej7XcUPX1MmHkEOi_0KZRGSpfbmpnE0GK_Sn4zLkHY,4025
315
316
  mlrun/serving/v1_serving.py,sha256=by4myxlnwyZ0ijQ5fURilGCK1sUpdQL2Il1VR3Xqpxg,11805
316
317
  mlrun/serving/v2_serving.py,sha256=wJmDZc-YEof0vXmYHM5t8aKSaWuzUbjVtWYuVyl1hPg,24226
@@ -325,7 +326,7 @@ mlrun/utils/azure_vault.py,sha256=IEFizrDGDbAaoWwDr1WoA88S_EZ0T--vjYtY-i0cvYQ,34
325
326
  mlrun/utils/clones.py,sha256=mJpx4nyFiY6jlBCvFABsNuyi_mr1mvfPWn81vlafpOU,7361
326
327
  mlrun/utils/condition_evaluator.py,sha256=-nGfRmZzivn01rHTroiGY4rqEv8T1irMyhzxEei-sKc,1897
327
328
  mlrun/utils/db.py,sha256=KEa-vzicUhzIwo1wBXax2ZuXtYgf5to7wnsY3CYCiOQ,1713
328
- mlrun/utils/helpers.py,sha256=bJdHRqIaLI6th5FK6IA1gKvypoazeYgV0IjtLyKFgRY,55436
329
+ mlrun/utils/helpers.py,sha256=ISPNg7JQ2Bt8M8TD8lI4exk59oH51Yylo0kAWQVWISY,55493
329
330
  mlrun/utils/http.py,sha256=l_JCPrCq8bfYUcUcAFWUPvb9Xu-93bLGIhV-H-XCU9s,8707
330
331
  mlrun/utils/logger.py,sha256=CG5pgkMeU3VAkIP0pSGOwvFtm0tJYzmPVF8jEp2EtlU,9073
331
332
  mlrun/utils/regex.py,sha256=b0AUa2THS-ELzJj0grl5b8Stq609F2XomTZkD9SB1fQ,4900
@@ -334,7 +335,7 @@ mlrun/utils/singleton.py,sha256=p1Y-X0mPSs_At092GS-pZCA8CTR62HOqPU07_ZH6-To,869
334
335
  mlrun/utils/v3io_clients.py,sha256=F7zO2NaXSSih6B35LkwuKW_y2CdV5C1ztP-Xs2FsgpQ,1282
335
336
  mlrun/utils/vault.py,sha256=xUiKL17dCXjwQJ33YRzQj0oadUXATlFWPzKKYAESoQk,10447
336
337
  mlrun/utils/notifications/__init__.py,sha256=eUzQDBxSQmMZASRY-YAnYS6tL5801P0wEjycp3Dvoe0,990
337
- mlrun/utils/notifications/notification_pusher.py,sha256=v-bB05rkDW04f52Wsh_1-UD77M2FNFukmQO9wglVIRg,26918
338
+ mlrun/utils/notifications/notification_pusher.py,sha256=ptspFcc_X6u3q7toIuuDJWV-P7sNma60XOmTd6UHgcw,26742
338
339
  mlrun/utils/notifications/notification/__init__.py,sha256=2in3F2q8gtYDiDoQ4i9BIIE2I06OokT2EW49vs2krRA,2168
339
340
  mlrun/utils/notifications/notification/base.py,sha256=Bv6tUEFlF27SdkzFr1aY9a0gYX7tIbxsHbI7vOSqTsU,4196
340
341
  mlrun/utils/notifications/notification/console.py,sha256=MAVk7v5PJ52vdGRv76YcEPixWgV0licBPWGpR01uR40,2643
@@ -343,11 +344,11 @@ mlrun/utils/notifications/notification/ipython.py,sha256=ZtVL30B_Ha0VGoo4LxO-voT
343
344
  mlrun/utils/notifications/notification/slack.py,sha256=EXhIDyhFkwCSzq8trX3TqGHh5ppFKzMxItxM0s0-ukM,6728
344
345
  mlrun/utils/notifications/notification/webhook.py,sha256=WgfxX1cpm8n2A-O08pwnsP4tzbxxv_vNUSnyXG4uKts,2752
345
346
  mlrun/utils/version/__init__.py,sha256=7kkrB7hEZ3cLXoWj1kPoDwo4MaswsI2JVOBpbKgPAgc,614
346
- mlrun/utils/version/version.json,sha256=eOwXdgA17MTE7ncOR7XaKiORCmVdcrhoB_XIcXc2CZ0,89
347
+ mlrun/utils/version/version.json,sha256=8ClI6i_4ST4Ev0HbJS7s14XSY9TLmGymVG1d_AIzQJQ,89
347
348
  mlrun/utils/version/version.py,sha256=eEW0tqIAkU9Xifxv8Z9_qsYnNhn3YH7NRAfM-pPLt1g,1878
348
- mlrun-1.7.0rc24.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
349
- mlrun-1.7.0rc24.dist-info/METADATA,sha256=SQgJEbBc_9z9kfYZFk7wM5uV1KPX3leVkWZ3Cg7LsMQ,19237
350
- mlrun-1.7.0rc24.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
351
- mlrun-1.7.0rc24.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
352
- mlrun-1.7.0rc24.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
353
- mlrun-1.7.0rc24.dist-info/RECORD,,
349
+ mlrun-1.7.0rc25.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
350
+ mlrun-1.7.0rc25.dist-info/METADATA,sha256=kqDt9YgQWFkfTvBOHEveq_nSYnbrd0u7UZ83Dht_vfs,19237
351
+ mlrun-1.7.0rc25.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
352
+ mlrun-1.7.0rc25.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
353
+ mlrun-1.7.0rc25.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
354
+ mlrun-1.7.0rc25.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5