mlrun 1.10.0rc16__py3-none-any.whl → 1.10.0rc18__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.
Files changed (35) hide show
  1. mlrun/common/constants.py +2 -0
  2. mlrun/common/formatters/artifact.py +1 -0
  3. mlrun/common/schemas/__init__.py +1 -0
  4. mlrun/common/schemas/model_monitoring/__init__.py +1 -0
  5. mlrun/common/schemas/model_monitoring/constants.py +33 -6
  6. mlrun/common/schemas/serving.py +3 -0
  7. mlrun/common/schemas/workflow.py +1 -0
  8. mlrun/config.py +15 -5
  9. mlrun/datastore/datastore.py +4 -4
  10. mlrun/datastore/datastore_profile.py +26 -0
  11. mlrun/datastore/model_provider/huggingface_provider.py +183 -0
  12. mlrun/datastore/model_provider/model_provider.py +6 -1
  13. mlrun/datastore/model_provider/openai_provider.py +24 -12
  14. mlrun/datastore/utils.py +6 -0
  15. mlrun/db/base.py +1 -0
  16. mlrun/db/httpdb.py +4 -0
  17. mlrun/model_monitoring/api.py +5 -3
  18. mlrun/model_monitoring/applications/base.py +107 -28
  19. mlrun/model_monitoring/applications/results.py +4 -7
  20. mlrun/model_monitoring/controller.py +175 -121
  21. mlrun/model_monitoring/stream_processing.py +29 -2
  22. mlrun/projects/project.py +7 -2
  23. mlrun/run.py +3 -1
  24. mlrun/serving/server.py +98 -11
  25. mlrun/serving/states.py +8 -19
  26. mlrun/serving/system_steps.py +20 -10
  27. mlrun/utils/helpers.py +6 -1
  28. mlrun/utils/logger.py +3 -1
  29. mlrun/utils/version/version.json +2 -2
  30. {mlrun-1.10.0rc16.dist-info → mlrun-1.10.0rc18.dist-info}/METADATA +2 -2
  31. {mlrun-1.10.0rc16.dist-info → mlrun-1.10.0rc18.dist-info}/RECORD +35 -34
  32. {mlrun-1.10.0rc16.dist-info → mlrun-1.10.0rc18.dist-info}/WHEEL +0 -0
  33. {mlrun-1.10.0rc16.dist-info → mlrun-1.10.0rc18.dist-info}/entry_points.txt +0 -0
  34. {mlrun-1.10.0rc16.dist-info → mlrun-1.10.0rc18.dist-info}/licenses/LICENSE +0 -0
  35. {mlrun-1.10.0rc16.dist-info → mlrun-1.10.0rc18.dist-info}/top_level.txt +0 -0
mlrun/serving/server.py CHANGED
@@ -22,8 +22,10 @@ import os
22
22
  import socket
23
23
  import traceback
24
24
  import uuid
25
+ from datetime import datetime, timezone
25
26
  from typing import Any, Optional, Union
26
27
 
28
+ import pandas as pd
27
29
  import storey
28
30
  from nuclio import Context as NuclioContext
29
31
  from nuclio.request import Logger as NuclioLogger
@@ -40,6 +42,7 @@ from mlrun.secrets import SecretsStore
40
42
 
41
43
  from ..common.helpers import parse_versioned_object_uri
42
44
  from ..common.schemas.model_monitoring.constants import FileTargetKind
45
+ from ..common.schemas.serving import MAX_BATCH_JOB_DURATION
43
46
  from ..datastore import DataItem, get_stream_pusher
44
47
  from ..datastore.store_resources import ResourceCache
45
48
  from ..errors import MLRunInvalidArgumentError
@@ -561,6 +564,7 @@ def v2_serving_init(context, namespace=None):
561
564
  async def async_execute_graph(
562
565
  context: MLClientCtx,
563
566
  data: DataItem,
567
+ timestamp_column: Optional[str],
564
568
  batching: bool,
565
569
  batch_size: Optional[int],
566
570
  read_as_lists: bool,
@@ -605,10 +609,43 @@ async def async_execute_graph(
605
609
  f"(status='{task_state}')"
606
610
  )
607
611
 
612
+ df = data.as_df()
613
+
614
+ if df.empty:
615
+ context.logger.warn("Job terminated due to empty inputs (0 rows)")
616
+ return []
617
+
618
+ track_models = spec.get("track_models")
619
+
620
+ if track_models and timestamp_column:
621
+ context.logger.info(f"Sorting dataframe by {timestamp_column}")
622
+ df[timestamp_column] = pd.to_datetime( # in case it's a string
623
+ df[timestamp_column]
624
+ )
625
+ df.sort_values(by=timestamp_column, inplace=True)
626
+ if len(df) > 1:
627
+ start_time = df[timestamp_column].iloc[0]
628
+ end_time = df[timestamp_column].iloc[-1]
629
+ time_range = end_time - start_time
630
+ start_time = start_time.isoformat()
631
+ end_time = end_time.isoformat()
632
+ # TODO: tie this to the controller's base period
633
+ if time_range > pd.Timedelta(MAX_BATCH_JOB_DURATION):
634
+ raise mlrun.errors.MLRunRuntimeError(
635
+ f"Dataframe time range is too long: {time_range}. "
636
+ "Please disable tracking or reduce the input dataset's time range below the defined limit "
637
+ f"of {MAX_BATCH_JOB_DURATION}."
638
+ )
639
+ else:
640
+ start_time = end_time = df["timestamp"].iloc[0].isoformat()
641
+ else:
642
+ # end time will be set from clock time when the batch completes
643
+ start_time = datetime.now(tz=timezone.utc).isoformat()
644
+
608
645
  server.graph = add_system_steps_to_graph(
609
646
  server.project,
610
647
  copy.deepcopy(server.graph),
611
- spec.get("track_models"),
648
+ track_models,
612
649
  context,
613
650
  spec,
614
651
  pause_until_background_task_completion=False, # we've already awaited it
@@ -633,19 +670,28 @@ async def async_execute_graph(
633
670
  if server.verbose:
634
671
  context.logger.info(server.to_yaml())
635
672
 
636
- df = data.as_df()
637
-
638
- responses = []
639
-
640
673
  async def run(body):
641
674
  event = storey.Event(id=index, body=body)
642
- response = await server.run(event, context)
643
- responses.append(response)
675
+ if timestamp_column:
676
+ if batching:
677
+ # we use the first row in the batch to determine the timestamp for the whole batch
678
+ body = body[0]
679
+ if not isinstance(body, dict):
680
+ raise mlrun.errors.MLRunRuntimeError(
681
+ f"When timestamp_column=True, event body must be a dict – got {type(body).__name__} instead"
682
+ )
683
+ if timestamp_column not in body:
684
+ raise mlrun.errors.MLRunRuntimeError(
685
+ f"Event body '{body}' did not contain timestamp column '{timestamp_column}'"
686
+ )
687
+ event._original_timestamp = body[timestamp_column]
688
+ return await server.run(event, context)
644
689
 
645
690
  if batching and not batch_size:
646
691
  batch_size = len(df)
647
692
 
648
693
  batch = []
694
+ tasks = []
649
695
  for index, row in df.iterrows():
650
696
  data = row.to_list() if read_as_lists else row.to_dict()
651
697
  if nest_under_inputs:
@@ -653,24 +699,56 @@ async def async_execute_graph(
653
699
  if batching:
654
700
  batch.append(data)
655
701
  if len(batch) == batch_size:
656
- await run(batch)
702
+ tasks.append(asyncio.create_task(run(batch)))
657
703
  batch = []
658
704
  else:
659
- await run(data)
705
+ tasks.append(asyncio.create_task(run(data)))
660
706
 
661
707
  if batch:
662
- await run(batch)
708
+ tasks.append(asyncio.create_task(run(batch)))
709
+
710
+ responses = await asyncio.gather(*tasks)
663
711
 
664
712
  termination_result = server.wait_for_completion()
665
713
  if asyncio.iscoroutine(termination_result):
666
714
  await termination_result
667
715
 
716
+ model_endpoint_uids = spec.get("model_endpoint_uids", [])
717
+
718
+ # needed for output_stream to be created
719
+ server = GraphServer.from_dict(spec)
720
+ server.init_states(None, namespace)
721
+
722
+ batch_completion_time = datetime.now(tz=timezone.utc).isoformat()
723
+
724
+ if not timestamp_column:
725
+ end_time = batch_completion_time
726
+
727
+ mm_stream_record = dict(
728
+ kind="batch_complete",
729
+ project=context.project,
730
+ first_timestamp=start_time,
731
+ last_timestamp=end_time,
732
+ batch_completion_time=batch_completion_time,
733
+ )
734
+ output_stream = server.context.stream.output_stream
735
+ for mep_uid in spec.get("model_endpoint_uids", []):
736
+ mm_stream_record["endpoint_id"] = mep_uid
737
+ output_stream.push(mm_stream_record, partition_key=mep_uid)
738
+
739
+ context.logger.info(
740
+ f"Job completed processing {len(df)} rows",
741
+ timestamp_column=timestamp_column,
742
+ model_endpoint_uids=model_endpoint_uids,
743
+ )
744
+
668
745
  return responses
669
746
 
670
747
 
671
748
  def execute_graph(
672
749
  context: MLClientCtx,
673
750
  data: DataItem,
751
+ timestamp_column: Optional[str] = None,
674
752
  batching: bool = False,
675
753
  batch_size: Optional[int] = None,
676
754
  read_as_lists: bool = False,
@@ -681,6 +759,9 @@ def execute_graph(
681
759
 
682
760
  :param context: The job's execution client context.
683
761
  :param data: The input data to the job, to be pushed into the graph row by row, or in batches.
762
+ :param timestamp_column: The name of the column that will be used as the timestamp for model monitoring purposes.
763
+ when timestamp_column is used in conjunction with batching, the first timestamp will be used for the entire
764
+ batch.
684
765
  :param batching: Whether to push one or more batches into the graph rather than row by row.
685
766
  :param batch_size: The number of rows to push per batch. If not set, and batching=True, the entire dataset will
686
767
  be pushed into the graph in one batch.
@@ -691,7 +772,13 @@ def execute_graph(
691
772
  """
692
773
  return asyncio.run(
693
774
  async_execute_graph(
694
- context, data, batching, batch_size, read_as_lists, nest_under_inputs
775
+ context,
776
+ data,
777
+ timestamp_column,
778
+ batching,
779
+ batch_size,
780
+ read_as_lists,
781
+ nest_under_inputs,
695
782
  )
696
783
  )
697
784
 
mlrun/serving/states.py CHANGED
@@ -1206,7 +1206,7 @@ class Model(storey.ParallelExecutionRunnable, ModelObj):
1206
1206
 
1207
1207
  class LLModel(Model):
1208
1208
  def __init__(
1209
- self, name: str, input_path: Optional[Union[str, list[str]]], **kwargs
1209
+ self, name: str, input_path: Optional[Union[str, list[str]]] = None, **kwargs
1210
1210
  ):
1211
1211
  super().__init__(name, **kwargs)
1212
1212
  self._input_path = split_path(input_path)
@@ -1754,9 +1754,10 @@ class ModelRunnerStep(MonitoredStep):
1754
1754
  except (
1755
1755
  mlrun.errors.MLRunNotFoundError,
1756
1756
  mlrun.errors.MLRunInvalidArgumentError,
1757
- ):
1757
+ ) as ex:
1758
1758
  logger.warning(
1759
- f"Model endpoint not found, using default output schema for model {name}"
1759
+ f"Model endpoint not found, using default output schema for model {name}",
1760
+ error=f"{type(ex).__name__}: {ex}",
1760
1761
  )
1761
1762
  return output_schema
1762
1763
 
@@ -1768,22 +1769,6 @@ class ModelRunnerStep(MonitoredStep):
1768
1769
  )
1769
1770
  if isinstance(monitoring_data, dict):
1770
1771
  for model in monitoring_data:
1771
- monitoring_data[model][schemas.MonitoringData.OUTPUTS] = (
1772
- monitoring_data.get(model, {}).get(schemas.MonitoringData.OUTPUTS)
1773
- or self._get_model_endpoint_output_schema(
1774
- name=model,
1775
- project=self.context.project if self.context else None,
1776
- uid=monitoring_data.get(model, {}).get(
1777
- mlrun.common.schemas.MonitoringData.MODEL_ENDPOINT_UID
1778
- ),
1779
- )
1780
- )
1781
- # Prevent calling _get_model_output_schema for same model more than once
1782
- self.class_args[
1783
- mlrun.common.schemas.ModelRunnerStepData.MONITORING_DATA
1784
- ][model][schemas.MonitoringData.OUTPUTS] = monitoring_data[model][
1785
- schemas.MonitoringData.OUTPUTS
1786
- ]
1787
1772
  monitoring_data[model][schemas.MonitoringData.INPUT_PATH] = split_path(
1788
1773
  monitoring_data[model][schemas.MonitoringData.INPUT_PATH]
1789
1774
  )
@@ -1791,6 +1776,10 @@ class ModelRunnerStep(MonitoredStep):
1791
1776
  monitoring_data[model][schemas.MonitoringData.RESULT_PATH]
1792
1777
  )
1793
1778
  return monitoring_data
1779
+ else:
1780
+ raise mlrun.errors.MLRunInvalidArgumentError(
1781
+ "Monitoring data must be a dictionary."
1782
+ )
1794
1783
 
1795
1784
  def init_object(self, context, namespace, mode="sync", reset=False, **extra_kwargs):
1796
1785
  self.context = context
@@ -104,7 +104,7 @@ class MonitoringPreProcessor(storey.MapClass):
104
104
  @staticmethod
105
105
  def transpose_by_key(
106
106
  data: dict, schema: Optional[Union[str, list[str]]] = None
107
- ) -> Union[list[float], list[list[float]]]:
107
+ ) -> Union[list[Any], list[list[Any]]]:
108
108
  """
109
109
  Transpose values from a dictionary by keys.
110
110
 
@@ -146,7 +146,11 @@ class MonitoringPreProcessor(storey.MapClass):
146
146
  else:
147
147
  keys = schema
148
148
 
149
- values = [data[key] for key in keys]
149
+ values = [data[key] for key in keys if key in data]
150
+ if len(values) != len(keys):
151
+ raise mlrun.MLRunInvalidArgumentError(
152
+ f"Schema keys {keys} do not match the data keys {list(data.keys())}."
153
+ )
150
154
 
151
155
  # Detect if all are scalars ie: int,float,str
152
156
  all_scalars = all(not isinstance(v, (list, tuple, np.ndarray)) for v in values)
@@ -158,9 +162,9 @@ class MonitoringPreProcessor(storey.MapClass):
158
162
  )
159
163
 
160
164
  if all_scalars:
161
- transposed = np.array([values])
165
+ transposed = np.array([values], dtype=object)
162
166
  elif all_lists and len(keys) > 1:
163
- arrays = [np.array(v) for v in values]
167
+ arrays = [np.array(v, dtype=object) for v in values]
164
168
  mat = np.stack(arrays, axis=0)
165
169
  transposed = mat.T
166
170
  else:
@@ -192,6 +196,12 @@ class MonitoringPreProcessor(storey.MapClass):
192
196
  request, resp = self.reconstruct_request_resp_fields(
193
197
  event, model, monitoring_data[model]
194
198
  )
199
+ if hasattr(event, "_original_timestamp"):
200
+ when = event._original_timestamp
201
+ else:
202
+ when = event._metadata.get(model, {}).get(
203
+ mm_schemas.StreamProcessingEvent.WHEN
204
+ )
195
205
  monitoring_event_list.append(
196
206
  {
197
207
  mm_schemas.StreamProcessingEvent.MODEL: model,
@@ -201,9 +211,7 @@ class MonitoringPreProcessor(storey.MapClass):
201
211
  mm_schemas.StreamProcessingEvent.MICROSEC: event._metadata.get(
202
212
  model, {}
203
213
  ).get(mm_schemas.StreamProcessingEvent.MICROSEC),
204
- mm_schemas.StreamProcessingEvent.WHEN: event._metadata.get(
205
- model, {}
206
- ).get(mm_schemas.StreamProcessingEvent.WHEN),
214
+ mm_schemas.StreamProcessingEvent.WHEN: when,
207
215
  mm_schemas.StreamProcessingEvent.ENDPOINT_ID: monitoring_data[
208
216
  model
209
217
  ].get(
@@ -236,6 +244,10 @@ class MonitoringPreProcessor(storey.MapClass):
236
244
  request, resp = self.reconstruct_request_resp_fields(
237
245
  event, model, monitoring_data[model]
238
246
  )
247
+ if hasattr(event, "_original_timestamp"):
248
+ when = event._original_timestamp
249
+ else:
250
+ when = event._metadata.get(mm_schemas.StreamProcessingEvent.WHEN)
239
251
  monitoring_event_list.append(
240
252
  {
241
253
  mm_schemas.StreamProcessingEvent.MODEL: model,
@@ -245,9 +257,7 @@ class MonitoringPreProcessor(storey.MapClass):
245
257
  mm_schemas.StreamProcessingEvent.MICROSEC: event._metadata.get(
246
258
  mm_schemas.StreamProcessingEvent.MICROSEC
247
259
  ),
248
- mm_schemas.StreamProcessingEvent.WHEN: event._metadata.get(
249
- mm_schemas.StreamProcessingEvent.WHEN
250
- ),
260
+ mm_schemas.StreamProcessingEvent.WHEN: when,
251
261
  mm_schemas.StreamProcessingEvent.ENDPOINT_ID: monitoring_data[
252
262
  model
253
263
  ].get(mlrun.common.schemas.MonitoringData.MODEL_ENDPOINT_UID),
mlrun/utils/helpers.py CHANGED
@@ -800,7 +800,12 @@ def remove_tag_from_artifact_uri(uri: str) -> Optional[str]:
800
800
  "store://key:tag" => "store://key"
801
801
  "store://models/remote-model-project/my_model#0@tree" => unchanged (no tag)
802
802
  """
803
- return re.sub(r"(?<=/[^/:]\+):[^@^:\s]+(?=(@|\^|$))", "", uri)
803
+ add_store = False
804
+ if mlrun.datastore.is_store_uri(uri):
805
+ uri = uri.removeprefix(DB_SCHEMA + "://")
806
+ add_store = True
807
+ uri = re.sub(r"(#[^:@\s]*)?:[^@^:\s]+(?=(@|\^|$))", lambda m: m.group(1) or "", uri)
808
+ return uri if not add_store else DB_SCHEMA + "://" + uri
804
809
 
805
810
 
806
811
  def extend_hub_uri_if_needed(uri) -> tuple[str, bool]:
mlrun/utils/logger.py CHANGED
@@ -393,12 +393,14 @@ def resolve_formatter_by_kind(
393
393
 
394
394
 
395
395
  def create_test_logger(name: str = "mlrun", stream: IO[str] = stdout) -> Logger:
396
- return create_logger(
396
+ logger = create_logger(
397
397
  level="debug",
398
398
  formatter_kind=FormatterKinds.HUMAN_EXTENDED.name,
399
399
  name=name,
400
400
  stream=stream,
401
401
  )
402
+ logger._logger.propagate = True # pass records up to pytest’s handler
403
+ return logger
402
404
 
403
405
 
404
406
  def create_logger(
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "78045e1e85e7c81eee93682240c4ebe7b22fa67c",
3
- "version": "1.10.0-rc16"
2
+ "git_commit": "ef58f2d7ada676ba266aaf084b7a46714b95ba4e",
3
+ "version": "1.10.0-rc18"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mlrun
3
- Version: 1.10.0rc16
3
+ Version: 1.10.0rc18
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -44,7 +44,7 @@ Requires-Dist: semver~=3.0
44
44
  Requires-Dist: dependency-injector~=4.41
45
45
  Requires-Dist: fsspec<2024.7,>=2023.9.2
46
46
  Requires-Dist: v3iofs~=0.1.17
47
- Requires-Dist: storey~=1.10.8
47
+ Requires-Dist: storey~=1.10.9
48
48
  Requires-Dist: inflection~=0.5.0
49
49
  Requires-Dist: python-dotenv~=1.0
50
50
  Requires-Dist: setuptools>=75.2
@@ -1,6 +1,6 @@
1
1
  mlrun/__init__.py,sha256=Y_AFhZV1hEx4vfiO-cyjup0aLGcp6R0SeL75GqLFQrc,7514
2
2
  mlrun/__main__.py,sha256=wQNaxW7QsqFBtWffnPkw-497fnpsrQzUnscBQQAP_UM,48364
3
- mlrun/config.py,sha256=_-WgQPZeSbvd51ndG9qFAaV6TXdDaEgZa9W9B0Imvq8,72399
3
+ mlrun/config.py,sha256=XAAb68MwEHpuPddPMtKBULtFk0hI9YC25DniYQk1DKk,72853
4
4
  mlrun/errors.py,sha256=bAk0t_qmCxQSPNK0TugOAfA5R6f0G6OYvEvXUWSJ_5U,9062
5
5
  mlrun/execution.py,sha256=dJ4PFwg5AlDHbCL2Q9dVDjWA_i64UTq2qBiF8kTU9tw,56922
6
6
  mlrun/features.py,sha256=jMEXo6NB36A6iaxNEJWzdtYwUmglYD90OIKTIEeWhE8,15841
@@ -8,7 +8,7 @@ mlrun/k8s_utils.py,sha256=mMnGyouHoJC93ZD2KGf9neJM1pD7mR9IXLnHOEwYVTQ,21469
8
8
  mlrun/lists.py,sha256=OlaV2QIFUzmenad9kxNJ3k4whlDyxI3zFbGwr6vpC5Y,8561
9
9
  mlrun/model.py,sha256=wHtM8LylSOEFk6Hxl95CVm8DOPhofjsANYdIvKHH6dw,88956
10
10
  mlrun/render.py,sha256=5DlhD6JtzHgmj5RVlpaYiHGhX84Q7qdi4RCEUj2UMgw,13195
11
- mlrun/run.py,sha256=_ban8NoNWfQHps3QIVyWh_Hn2S6usNrFBTUMObaeueo,46904
11
+ mlrun/run.py,sha256=6I4I_88Slpj27WzGnoq0c02SNpDaGsJllC8Y-2BED0E,46951
12
12
  mlrun/secrets.py,sha256=dZPdkc_zzfscVQepOHUwmzFqnBavDCBXV9DQoH_eIYM,7800
13
13
  mlrun/alerts/__init__.py,sha256=0gtG1BG0DXxFrXegIkjbM1XEN4sP9ODo0ucXrNld1hU,601
14
14
  mlrun/alerts/alert.py,sha256=QQFZGydQbx9RvAaSiaH-ALQZVcDKQX5lgizqj_rXW2k,15948
@@ -23,14 +23,14 @@ mlrun/artifacts/manager.py,sha256=_cDNCS7wwmFIsucJ2uOgHxZQECmIGb8Wye64b6oLgKU,16
23
23
  mlrun/artifacts/model.py,sha256=8EVaD70SOkTohQIWqkDk0MEwskdofxs3wJTgspa2sho,25615
24
24
  mlrun/artifacts/plots.py,sha256=wmaxVXiAPSCyn3M7pIlcBu9pP3O8lrq0Ewx6iHRDF9s,4238
25
25
  mlrun/common/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
26
- mlrun/common/constants.py,sha256=bkWWccWZJHB08mkSrrnWuCFXZWdNKf4Q9SwuLowQrVM,4059
26
+ mlrun/common/constants.py,sha256=BDxV8kAAf8D2W-gsa7IP8HJe5da-sPwVUfiodQ1O7kI,4127
27
27
  mlrun/common/helpers.py,sha256=DIdqs_eN3gO5bZ8iFobIvx8cEiOxYxhFIyut6-O69T0,1385
28
28
  mlrun/common/secrets.py,sha256=8g9xtIw-9DGcwiZRT62a5ozSQM-aYo8yK5Ghey9WM0g,5179
29
29
  mlrun/common/types.py,sha256=1gxThbmC0Vd0U1ffIkEwz4T4S7JOgHt70rvw8TCO21c,1073
30
30
  mlrun/common/db/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
31
31
  mlrun/common/db/dialects.py,sha256=QN9bx7CTo32IIdJ2J3ZrsX8IUdp_BPxBtl0LyjMEC9g,868
32
32
  mlrun/common/formatters/__init__.py,sha256=au7S3M3wa9964RpQhFSvflk5-i5SWMeb3kek8Gvt4kg,889
33
- mlrun/common/formatters/artifact.py,sha256=NT2RPfReUGWVQ-Rhv1zexgXfLuKI5FvtneJDhihZK5g,1462
33
+ mlrun/common/formatters/artifact.py,sha256=JRs1B3nEvTdn4h69FLHjZZY_Dy40E9-BgvxfjcL_DKU,1503
34
34
  mlrun/common/formatters/base.py,sha256=85vQ0t4ZfqCs8b8QV1RLfRcEvANztKvTvsa__sD3zTo,4099
35
35
  mlrun/common/formatters/feature_set.py,sha256=SmSSiNYXZtmzQDCvQJhIpArtjOInmDN0g1xFqrDdWsw,1534
36
36
  mlrun/common/formatters/function.py,sha256=H8bHilWSn1NXm5WWlFH2dx8slomCGm3e8ghsmWOOh48,1493
@@ -41,7 +41,7 @@ mlrun/common/formatters/run.py,sha256=LlqhhVY4dAp5y17k_sWBtHaJogdNdtJWF0iO9sX-bU
41
41
  mlrun/common/model_monitoring/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
42
42
  mlrun/common/model_monitoring/helpers.py,sha256=AkuHz4u318MEP4ebxmNWlNXh6HiNLrI5oF7QvJiJkYc,2707
43
43
  mlrun/common/runtimes/constants.py,sha256=CGMHE2gdsNHXNsa-u3eL0o8sQmDs6PN5FLpMlCDClns,12218
44
- mlrun/common/schemas/__init__.py,sha256=Mx_N6UtivKP-FQeIvVu6n0unkT7w461lahyNJbaOL_I,5468
44
+ mlrun/common/schemas/__init__.py,sha256=HbnF4nd6jIGbej9Qj6WYjajIr44f3vYNpgWyeLk7N6I,5486
45
45
  mlrun/common/schemas/alert.py,sha256=u6INAHBhQIfm-mMsGqDJo1_JDN6gOuWZa-8fOU-aOUE,10182
46
46
  mlrun/common/schemas/api_gateway.py,sha256=bgC3vXbyb1SVwsSZkLXtEoQLCe_QDKpIhAVX3X_HWW4,7126
47
47
  mlrun/common/schemas/artifact.py,sha256=JojMRRa4n0Rge2olGOpUyp348hkTGsMEnvUBRSoo4oE,4310
@@ -71,11 +71,11 @@ mlrun/common/schemas/runs.py,sha256=yKY29ByTS4SruWQyPpDNFGulMrcT9Ms-3lnwBUDp3us,
71
71
  mlrun/common/schemas/runtime_resource.py,sha256=TybJmCHJXmm1z3s5J1dd89TeFE6lG5t7vjcrf1R9YfE,1568
72
72
  mlrun/common/schemas/schedule.py,sha256=L7z9Lp06-xmFmdp0q5PypCU_DCl6zZIyQTVoJa01gfM,4291
73
73
  mlrun/common/schemas/secret.py,sha256=Td2UAeWHSAdA4nIP3rQv_PIVKVqcBnCnK6xjr528tS8,1486
74
- mlrun/common/schemas/serving.py,sha256=-3U45YLtmVWMZrx4R8kaPgFGoJ4JmD7RE3nydpYNTz8,1359
74
+ mlrun/common/schemas/serving.py,sha256=4ek9JZDagkdeXyfkX6P6xp4deUNSf_kqXUaXcKSuv-g,1391
75
75
  mlrun/common/schemas/tag.py,sha256=1wqEiAujsElojWb3qmuyfcaLFjXSNAAQdafkDx7fkn0,891
76
- mlrun/common/schemas/workflow.py,sha256=GS6RNp66v7iV2flBMXZs4R5mQr15KJx6PMXFlAjyOmc,2496
77
- mlrun/common/schemas/model_monitoring/__init__.py,sha256=lQkWiDZagEmZd7pNE_-ySVJEzTjEzH-JS6OKZPmJiVk,1907
78
- mlrun/common/schemas/model_monitoring/constants.py,sha256=yjTaSGiRs0zYIE20QSuJuMNnS5iuJpnV1wBiq7leVpg,13238
76
+ mlrun/common/schemas/workflow.py,sha256=Y-FHJnxs5c86yetuOAPdEJPkne__tLPCxjSXSb4lrjo,2541
77
+ mlrun/common/schemas/model_monitoring/__init__.py,sha256=FqFiFIDcylquQdY0XTBamB5kMzMrMFEpVYM_ecsVfLg,1925
78
+ mlrun/common/schemas/model_monitoring/constants.py,sha256=WhuUWgOwk91BI0dP5c1rm6X_W0V4UBV3l6KvRNHHE-E,13898
79
79
  mlrun/common/schemas/model_monitoring/functions.py,sha256=GpfSGp05D87wEKemECD3USL368pvnAM2WfS-nef5qOg,2210
80
80
  mlrun/common/schemas/model_monitoring/grafana.py,sha256=THQlLfPBevBksta8p5OaIsBaJtsNSXexLvHrDxOaVns,2095
81
81
  mlrun/common/schemas/model_monitoring/model_endpoints.py,sha256=aCrVqgoJsUEwvDJ84YFabDSy78CHcVBV3b0RdWj4JUw,13250
@@ -88,8 +88,8 @@ mlrun/datastore/__init__.py,sha256=UKGHkUfj5A9dqTiOeW4UScvwv0vq91NS_xs3-_QA7Jk,5
88
88
  mlrun/datastore/alibaba_oss.py,sha256=E0t0-e9Me2t2Mux2LWdC9riOG921TgNjhoy897JJX7o,4932
89
89
  mlrun/datastore/azure_blob.py,sha256=3LG7tOTwT97ZFBmyq-sfAIe5_SkuFgisRQtipv4kKUw,12779
90
90
  mlrun/datastore/base.py,sha256=yLdnFCL2k_rcasdbxXjnQr7Lwm-A79LnW9AITtn9-p4,25450
91
- mlrun/datastore/datastore.py,sha256=IbAUi2GZesWcmqPimURZD9iP5GpCB8se7GYA9afkAjA,13236
92
- mlrun/datastore/datastore_profile.py,sha256=fRR01v9mqC40UML49-6rdx-28b2FaRLj7iZeWJgSiT0,22842
91
+ mlrun/datastore/datastore.py,sha256=gOlMyPDelD9CRieoraDPYf1NNig_GrQRuuQxLmRq8Bo,13298
92
+ mlrun/datastore/datastore_profile.py,sha256=Y4VtaatIK4UXuTdpffCkAcsCBSxj5KOgnX7KlL-Yds8,23803
93
93
  mlrun/datastore/dbfs_store.py,sha256=CJwst1598qxiu63-Qa0c3e5E8LjeCv1XbMyWI7A6irY,6560
94
94
  mlrun/datastore/filestore.py,sha256=OcykjzhbUAZ6_Cb9bGAXRL2ngsOpxXSb4rR0lyogZtM,3773
95
95
  mlrun/datastore/google_cloud_storage.py,sha256=NREwZT7BCI0HfmOGkjpy5S3psiL_rgQSi43MaazJcKk,8711
@@ -105,19 +105,20 @@ mlrun/datastore/spark_utils.py,sha256=dn0RWpYzee-M8UZw-NVuHAdqlNAZ7VO-fNtI8ZiDky
105
105
  mlrun/datastore/store_resources.py,sha256=s2794zqkzy_mjRMvRedDNs_tycTLoF8wxTqsWRQphCE,6839
106
106
  mlrun/datastore/storeytargets.py,sha256=TvHbY3XS0qOg8ImXW1ET61UnjUPcYJbfSGAga3vgC-o,6492
107
107
  mlrun/datastore/targets.py,sha256=8dRnLy1wBYJbVyommYkpGeztdT1CsfFHZY6Zh7o8X-Q,79165
108
- mlrun/datastore/utils.py,sha256=7qhGMRos-IgV2o-dywWbMvCGQDlbRs_CZcwfvTxZTvw,11798
108
+ mlrun/datastore/utils.py,sha256=jxvq4lgQfgqb7dwKe4Kp51fYCCyOvitEdIfV2mzlqxg,11936
109
109
  mlrun/datastore/v3io.py,sha256=sMn5473k_bXyIJovNf0rahbVHRmO0YPdOwIhbs06clg,8201
110
110
  mlrun/datastore/vectorstore.py,sha256=k-yom5gfw20hnVG0Rg7aBEehuXwvAloZwn0cx0VGals,11708
111
111
  mlrun/datastore/model_provider/__init__.py,sha256=kXGBqhLN0rlAx0kTXhozGzFsIdSqW0uTSKMmsLgq_is,569
112
- mlrun/datastore/model_provider/model_provider.py,sha256=eDkTdwFsVxSFzTkYUwyXfl34d5IIulcQrLRjxWM2BFc,7911
113
- mlrun/datastore/model_provider/openai_provider.py,sha256=KmuE9i3EbeOc7QACvFLwnU2n3i_PmIw429BaZC0Y9Zw,8463
112
+ mlrun/datastore/model_provider/huggingface_provider.py,sha256=KTmErt_WHhAV9t8803_iCHoa7jO-0y-7bch7KMTMDKo,7264
113
+ mlrun/datastore/model_provider/model_provider.py,sha256=dJIc1R0wbExsk-uzWgpt9w_FK027mr4lTBxYpQx-icY,8083
114
+ mlrun/datastore/model_provider/openai_provider.py,sha256=Tl3HXLDOtHkp54rb0ZCddlCWU-gUruhFJwSC6ocbv1Y,9157
114
115
  mlrun/datastore/wasbfs/__init__.py,sha256=s5Ul-0kAhYqFjKDR2X0O2vDGDbLQQduElb32Ev56Te4,1343
115
116
  mlrun/datastore/wasbfs/fs.py,sha256=ge8NK__5vTcFT-krI155_8RDUywQw4SIRX6BWATXy9Q,6299
116
117
  mlrun/db/__init__.py,sha256=WqJ4x8lqJ7ZoKbhEyFqkYADd9P6E3citckx9e9ZLcIU,1163
117
118
  mlrun/db/auth_utils.py,sha256=hpg8D2r82oN0BWabuWN04BTNZ7jYMAF242YSUpK7LFM,5211
118
- mlrun/db/base.py,sha256=afej-ZtJiBBv0MtZx2B1MH1ZRXno4s94aL_Qs5u-WCA,32044
119
+ mlrun/db/base.py,sha256=QUncUfRYep_2Bsui7y-DduAEm8qdgIlWIYmrns-S7HA,32110
119
120
  mlrun/db/factory.py,sha256=yP2vVmveUE7LYTCHbS6lQIxP9rW--zdISWuPd_I3d_4,2111
120
- mlrun/db/httpdb.py,sha256=MiXRygol2qMIMVLDOB89pouR8oICDaR510rVpZtPc4w,239160
121
+ mlrun/db/httpdb.py,sha256=oSzc4zigDgu9S2Vs7Lkz_NY1Oc78OGyHN-xeV19nVtk,239397
121
122
  mlrun/db/nopdb.py,sha256=kRWKEEI9LUskI3mp2ofTdAWVLov-99-nSMdaqhi3XT8,28194
122
123
  mlrun/feature_store/__init__.py,sha256=SlI845bWt6xX34SXunHHqhmFAR9-5v2ak8N-qpcAPGo,1328
123
124
  mlrun/feature_store/api.py,sha256=qKj5Tk6prTab6XWatWhBuPRVp0eJEctoxRMN2wz48vA,32168
@@ -225,18 +226,18 @@ mlrun/launcher/factory.py,sha256=RW7mfzEFi8fR0M-4W1JQg1iq3_muUU6OTqT_3l4Ubrk,233
225
226
  mlrun/launcher/local.py,sha256=3gv-IQYoIChSmRaZ0vLUh0Tu26oLMCx9GbBYh4fWygQ,12161
226
227
  mlrun/launcher/remote.py,sha256=zFXE52Cq_7EkC8lfNKT0ceIbye0CfFiundF7O1YU4Xw,7810
227
228
  mlrun/model_monitoring/__init__.py,sha256=qDQnncjya9XPTlfvGyfWsZWiXc-glGZrrNja-5QmCZk,782
228
- mlrun/model_monitoring/api.py,sha256=lAsUp-gzqw8D1cpHVGA2_nPMYn5R4jdxk9UaGOiQ8fE,25945
229
- mlrun/model_monitoring/controller.py,sha256=CQxK9Sq5k8XonvVBQnSimakpTwMMAyqT5mOaG534MaM,37660
229
+ mlrun/model_monitoring/api.py,sha256=9UsBIy8LYeAOoiIDTYthuD0mx1TYZxeGgaEM_H2qBkM,26092
230
+ mlrun/model_monitoring/controller.py,sha256=FVckATzREAzldj68D1KxcnKSdilgKUDRdqhRUf9XpWU,39592
230
231
  mlrun/model_monitoring/features_drift_table.py,sha256=c6GpKtpOJbuT1u5uMWDL_S-6N4YPOmlktWMqPme3KFY,25308
231
232
  mlrun/model_monitoring/helpers.py,sha256=0xhIYKzhaBrgyjLiA_ekCZsXzi3GBXpLyG40Bhj-PTY,23596
232
- mlrun/model_monitoring/stream_processing.py,sha256=Gu3TQzYoNjbreZYI73-F49QpYrod9RZOyGSgininBsA,33373
233
+ mlrun/model_monitoring/stream_processing.py,sha256=Mzn9Pelcblw8UzOFLGKb9oXOX0tkP2aoPcFbjtfHhcA,34247
233
234
  mlrun/model_monitoring/writer.py,sha256=rGRFzSOkqZWvD3Y6sVk2H1Gepfnkzkp9ce00PsApTLo,8288
234
235
  mlrun/model_monitoring/applications/__init__.py,sha256=MaH_n4GiqqQvSkntM5yQ7_FCANtM_IfgK-IJTdo4G_E,757
235
236
  mlrun/model_monitoring/applications/_application_steps.py,sha256=t9LDIqQUGE10cyjyhlg0QqN1yVx0apD1HpERYLJfm8U,7409
236
- mlrun/model_monitoring/applications/base.py,sha256=nkJK0X3-7xEjcWGjtfLmvMomi5F14mmWs_M0_L8op5o,40547
237
+ mlrun/model_monitoring/applications/base.py,sha256=tfxXcE7WOvPEd68b6gbZWFG-8gkeeSaRRN0G0HYn0C8,43932
237
238
  mlrun/model_monitoring/applications/context.py,sha256=fAGFNCyNhSnVJPSIeJxv-XmEL2JhDmjK5Ouog9qyvdc,17035
238
239
  mlrun/model_monitoring/applications/histogram_data_drift.py,sha256=2qgfFmrpHf-x0_EaHD-0T28piwSQzw-HH71aV1GwbZs,15389
239
- mlrun/model_monitoring/applications/results.py,sha256=_qmj6TWT0SR2bi7gUyRKBU418eGgGoLW2_hTJ7S-ock,5782
240
+ mlrun/model_monitoring/applications/results.py,sha256=LfBQOmkpKGvVGNrcj5QiXsRIG2IRgcv_Xqe4QJBmauk,5699
240
241
  mlrun/model_monitoring/applications/evidently/__init__.py,sha256=-DqdPnBSrjZhFvKOu_Ie3MiFvlur9sPTZpZ1u0_1AE8,690
241
242
  mlrun/model_monitoring/applications/evidently/base.py,sha256=shH9YwuFrGNWy1IDAbv622l-GE4o1z_u1bqhqTyTHDA,5661
242
243
  mlrun/model_monitoring/db/__init__.py,sha256=r47xPGZpIfMuv8J3PQCZTSqVPMhUta4sSJCZFKcS7FM,644
@@ -277,7 +278,7 @@ mlrun/platforms/iguazio.py,sha256=6VBTq8eQ3mzT96tzjYhAtcMQ2VjF4x8LpIPW5DAcX2Q,13
277
278
  mlrun/projects/__init__.py,sha256=hdCOA6_fp8X4qGGGT7Bj7sPbkM1PayWuaVZL0DkpuZw,1240
278
279
  mlrun/projects/operations.py,sha256=Rc__P5ucNAY2G-lHc2LrnZs15PUbNFt8-NqNNT2Bjpk,20623
279
280
  mlrun/projects/pipelines.py,sha256=nGDzBABEOqoe9sWbax4SfF8CVLgrvK0NLWBadzEthVE,52219
280
- mlrun/projects/project.py,sha256=B2KCd5bAGMeHOGhEdVr5NKtTOigL6O-A-Bbs2FLvokY,253884
281
+ mlrun/projects/project.py,sha256=a75Sj1lYzWNggTXIKxerSwy52YqNciGvrT2k-ddRmkQ,254149
281
282
  mlrun/runtimes/__init__.py,sha256=8cqrYKy1a0_87XG7V_p96untQ4t8RocadM4LVEEN1JM,9029
282
283
  mlrun/runtimes/base.py,sha256=FVEooeQMpwxIK2iW1R0FNbC5P1sZ_efKtJcsdNSYNmc,38266
283
284
  mlrun/runtimes/daskjob.py,sha256=kR5sDQtXtXY_VGn5Y3mapjEEB5P6Lj30pSrPe1DqsAg,20077
@@ -311,10 +312,10 @@ mlrun/serving/__init__.py,sha256=nriJAcVn5aatwU03T7SsE6ngJEGTxr3wIGt4WuvCCzY,139
311
312
  mlrun/serving/merger.py,sha256=pfOQoozUyObCTpqXAMk94PmhZefn4bBrKufO3MKnkAc,6193
312
313
  mlrun/serving/remote.py,sha256=Igha2FipK3-6rV_PZ1K464kTbiTu8rhc6SMm-HiEJ6o,18817
313
314
  mlrun/serving/routers.py,sha256=SmBOlHn7rT2gWTa-W8f16UB0UthgIFc4D1cPOZAA9ss,54003
314
- mlrun/serving/server.py,sha256=aFhPlIauww1e2OleZdrQxRiqMmEsoHEdTSujnAZeNe4,35202
315
+ mlrun/serving/server.py,sha256=_P_SR4_7YKqruVzzDHgSPHWlNLGPG5-ksSUwuGhnmjg,38851
315
316
  mlrun/serving/serving_wrapper.py,sha256=UL9hhWCfMPcTJO_XrkvNaFvck1U1E7oS8trTZyak0cA,835
316
- mlrun/serving/states.py,sha256=ZKhlPRlyvbRaGqNueR74IP3q7n8_k-4lYzq0QhPp88Q,124767
317
- mlrun/serving/system_steps.py,sha256=G-vFdFXGDMZECasT831GxAayitCORNfpxPPRgK5a86w,17960
317
+ mlrun/serving/states.py,sha256=-eo1IGLm96Kd0bTrwj211nUcwomMizQ6MxrqtURNxAg,124069
318
+ mlrun/serving/system_steps.py,sha256=tCxkJ54peOzRTMaqvHQCbcwx0ITqZkSpGXbtpRUEfzU,18463
318
319
  mlrun/serving/utils.py,sha256=Zbfqm8TKNcTE8zRBezVBzpvR2WKeKeIRN7otNIaiYEc,4170
319
320
  mlrun/serving/v1_serving.py,sha256=c6J_MtpE-Tqu00-6r4eJOCO6rUasHDal9W2eBIcrl50,11853
320
321
  mlrun/serving/v2_serving.py,sha256=257LVOvWxV0KjeY0-Kxro6YgKmPu2QzNne2IORlXi5E,25434
@@ -328,9 +329,9 @@ mlrun/utils/async_http.py,sha256=8Olx8TNNeXB07nEGwlqhEgFgnFAD71vBU_bqaA9JW-w,122
328
329
  mlrun/utils/azure_vault.py,sha256=IEFizrDGDbAaoWwDr1WoA88S_EZ0T--vjYtY-i0cvYQ,3450
329
330
  mlrun/utils/clones.py,sha256=qbAGyEbSvlewn3Tw_DpQZP9z6MGzFhSaZfI1CblX8Fg,7515
330
331
  mlrun/utils/condition_evaluator.py,sha256=-nGfRmZzivn01rHTroiGY4rqEv8T1irMyhzxEei-sKc,1897
331
- mlrun/utils/helpers.py,sha256=ympa9GWzF_NMNemKSas29s8I0-2seHGhfErFT1b-6tY,82419
332
+ mlrun/utils/helpers.py,sha256=fMlwtYBzUK98nCTFCA5FGm1imqIdpJi0CuAPmO10YZs,82641
332
333
  mlrun/utils/http.py,sha256=5ZU2VpokaUM_DT3HBSqTm8xjUqTPjZN5fKkSIvKlTl0,8704
333
- mlrun/utils/logger.py,sha256=RG0m1rx6gfkJ-2C1r_p41MMpPiaDYqaYM2lYHDlNZEU,14767
334
+ mlrun/utils/logger.py,sha256=uaCgI_ezzaXf7nJDCy-1Nrjds8vSXqDbzmjmb3IyCQo,14864
334
335
  mlrun/utils/regex.py,sha256=FcRwWD8x9X3HLhCCU2F0AVKTFah784Pr7ZAe3a02jw8,5199
335
336
  mlrun/utils/retryer.py,sha256=SHddxyNdUjIyvNJ3idTDyBzXARihCSuo3zWlZj6fqB0,7852
336
337
  mlrun/utils/singleton.py,sha256=fNOfAUtha6OPCV_M1umWnGD0iabnnRwBke9otIspv30,868
@@ -347,11 +348,11 @@ mlrun/utils/notifications/notification/mail.py,sha256=ZyJ3eqd8simxffQmXzqd3bgbAq
347
348
  mlrun/utils/notifications/notification/slack.py,sha256=kfhogR5keR7Zjh0VCjJNK3NR5_yXT7Cv-x9GdOUW4Z8,7294
348
349
  mlrun/utils/notifications/notification/webhook.py,sha256=zxh8CAlbPnTazsk6r05X5TKwqUZVOH5KBU2fJbzQlG4,5330
349
350
  mlrun/utils/version/__init__.py,sha256=YnzE6tlf24uOQ8y7Z7l96QLAI6-QEii7-77g8ynmzy0,613
350
- mlrun/utils/version/version.json,sha256=yzjgOoSOXuxZFECc2IfKerszx07aKIlhF7wENYuFF_E,90
351
+ mlrun/utils/version/version.json,sha256=1hAlhHbCP3fWtgQa3l5zk4ROJntlDhuVxmDS5HRBMiY,90
351
352
  mlrun/utils/version/version.py,sha256=M2hVhRrgkN3SxacZHs3ZqaOsqAA7B6a22ne324IQ1HE,1877
352
- mlrun-1.10.0rc16.dist-info/licenses/LICENSE,sha256=zTiv1CxWNkOk1q8eJS1G_8oD4gWpWLwWxj_Agcsi8Os,11337
353
- mlrun-1.10.0rc16.dist-info/METADATA,sha256=U1uo_EFf7k8D102Lq0z_EQ1K2AOCjwU5iNQuLVvCVjM,26195
354
- mlrun-1.10.0rc16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
355
- mlrun-1.10.0rc16.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
356
- mlrun-1.10.0rc16.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
357
- mlrun-1.10.0rc16.dist-info/RECORD,,
353
+ mlrun-1.10.0rc18.dist-info/licenses/LICENSE,sha256=zTiv1CxWNkOk1q8eJS1G_8oD4gWpWLwWxj_Agcsi8Os,11337
354
+ mlrun-1.10.0rc18.dist-info/METADATA,sha256=Rx-oVfq1W7TA73agpQeaFDhrevZ_RYVTXG6ormcXWvk,26195
355
+ mlrun-1.10.0rc18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
356
+ mlrun-1.10.0rc18.dist-info/entry_points.txt,sha256=1Owd16eAclD5pfRCoJpYC2ZJSyGNTtUr0nCELMioMmU,46
357
+ mlrun-1.10.0rc18.dist-info/top_level.txt,sha256=NObLzw3maSF9wVrgSeYBv-fgnHkAJ1kEkh12DLdd5KM,6
358
+ mlrun-1.10.0rc18.dist-info/RECORD,,