mlrun 1.10.0rc40__tar.gz → 1.10.0rc41__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- {mlrun-1.10.0rc40/mlrun.egg-info → mlrun-1.10.0rc41}/PKG-INFO +1 -1
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/model_monitoring/helpers.py +1 -1
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/secrets.py +22 -1
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model.py +7 -1
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/context.py +1 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/base.py +2 -4
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +8 -9
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +154 -76
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/projects/project.py +15 -2
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/mounts.py +5 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/serving.py +7 -1
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/pod.py +59 -10
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/states.py +45 -21
- mlrun-1.10.0rc41/mlrun/utils/version/version.json +4 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41/mlrun.egg-info}/PKG-INFO +1 -1
- mlrun-1.10.0rc40/mlrun/utils/version/version.json +0 -4
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/LICENSE +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/MANIFEST.in +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/Makefile +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/README.md +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/dependencies.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/dev-requirements.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/dockerfiles/mlrun-api/requirements.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/archive.zip +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/function.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/infile.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/load-project.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_basics.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_dask.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_db.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_export_import.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_jobs.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_sparkk8s.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/mlrun_vault.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/model.bst +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/new-project.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/nulltst.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/params.csv +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/remote-spark.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/secrets.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/spark-function.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/training.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/v2_model_server.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/examples/xgb_serving.ipynb +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/extras-requirements.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/__main__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/alerts/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/alerts/alert.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/dataset.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/document.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/helpers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/llm_prompt.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/manager.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/model.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/artifacts/plots.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/constants.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/db/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/db/dialects.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/artifact.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/feature_set.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/function.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/model_endpoint.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/pipeline.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/project.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/formatters/run.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/helpers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/model_monitoring/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/runtimes/constants.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/alert.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/api_gateway.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/artifact.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/auth.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/background_task.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/client_spec.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/clusterization_spec.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/common.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/constants.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/datastore_profile.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/events.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/feature_store.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/frontend_spec.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/function.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/http.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/hub.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/k8s.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/memory_reports.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/model_monitoring/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/model_monitoring/constants.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/model_monitoring/functions.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/model_monitoring/grafana.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/model_monitoring/model_endpoints.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/notification.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/object.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/pagination.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/partition.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/pipeline.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/project.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/regex.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/runs.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/runtime_resource.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/schedule.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/secret.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/serving.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/tag.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/schemas/workflow.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/common/types.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/config.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/data_types/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/data_types/data_types.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/data_types/infer.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/data_types/spark.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/data_types/to_pandas.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/alibaba_oss.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/azure_blob.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/datastore.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/datastore_profile.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/dbfs_store.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/filestore.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/google_cloud_storage.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/hdfs.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/inmem.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/model_provider/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/model_provider/huggingface_provider.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/model_provider/mock_model_provider.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/model_provider/model_provider.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/model_provider/openai_provider.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/redis.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/remote_client.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/s3.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/snowflake_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/sources.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/spark_udf.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/spark_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/store_resources.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/storeytargets.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/targets.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/v3io.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/vectorstore.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/wasbfs/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/datastore/wasbfs/fs.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/db/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/db/auth_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/db/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/db/factory.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/db/httpdb.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/db/nopdb.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/errors.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/execution.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/api.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/common.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/feature_set.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/feature_vector.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/feature_vector_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/ingestion.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/dask_merger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/job.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/local_merger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/spark_merger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/retrieval/storey_merger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/feature_store/steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/features.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/artifacts_library.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/producer.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_common/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/loggers/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/loggers/logger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_dl_common/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/artifacts_library.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/loggers/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/loggers/logger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/pkl_model_server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plans/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plans/dataset_plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/producer.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/_ml_common/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/auto_mlrun/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/auto_mlrun/auto_mlrun.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/huggingface/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/huggingface/model_server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/callbacks/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/callbacks/callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/callbacks/logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/model_server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/lgbm/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/onnx/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/onnx/dataset.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/onnx/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/onnx/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/onnx/model_server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/parallel_coordinates.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/callbacks/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/callbacks/callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/callbacks/logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/callbacks_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/model_server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/pytorch/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/estimator.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/metric.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/metrics_library.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/sklearn/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/callbacks/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/callbacks/logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/model_server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/tf_keras/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/xgboost/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/xgboost/mlrun_interface.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/xgboost/model_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/frameworks/xgboost/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/hub/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/hub/module.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/k8s_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/launcher/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/launcher/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/launcher/client.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/launcher/factory.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/launcher/local.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/launcher/remote.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/lists.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/api.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/_application_steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/evidently/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/evidently/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/histogram_data_drift.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/applications/results.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/controller.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/_schedules.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/_stats.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/helpers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connection.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/writer_graph_steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/v3io/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/features_drift_table.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/helpers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/metrics/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/metrics/histogram_distance.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/stream_processing.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/writer.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/context_handler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/errors.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packager.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packagers/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packagers/default_packager.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packagers/numpy_packagers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packagers/pandas_packagers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packagers/python_standard_library_packagers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/packagers_manager.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/_archiver.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/_formatter.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/_pickler.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/_supported_format.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/log_hint_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/package/utils/type_hint_utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/platforms/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/platforms/iguazio.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/projects/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/projects/operations.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/projects/pipelines.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/render.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/run.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/daskjob.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/databricks_job/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/databricks_job/databricks_cancel_task.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/databricks_job/databricks_runtime.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/databricks_job/databricks_wrapper.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/funcdoc.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/function_reference.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/generators.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/kubejob.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/local.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/mpijob/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/mpijob/abstract.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/mpijob/v1.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/api_gateway.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/application/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/application/application.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/application/reverse_proxy.go +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/function.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/nuclio/nuclio.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/remotesparkjob.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/sparkjob/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/sparkjob/spark3job.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/runtimes/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/secrets.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/merger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/remote.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/routers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/server.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/serving_wrapper.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/system_steps.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/utils.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/v1_serving.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/serving/v2_serving.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/track/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/track/tracker.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/track/tracker_manager.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/track/trackers/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/track/trackers/mlflow_tracker.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/async_http.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/azure_vault.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/clones.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/condition_evaluator.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/helpers.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/http.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/logger.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/base.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/console.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/git.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/ipython.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/mail.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/slack.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification/webhook.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/notifications/notification_pusher.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/regex.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/retryer.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/singleton.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/v3io_clients.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/vault.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/version/__init__.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/utils/version/version.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun.egg-info/SOURCES.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun.egg-info/dependency_links.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun.egg-info/entry_points.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun.egg-info/not-zip-safe +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun.egg-info/requires.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun.egg-info/top_level.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/packages.py +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/pyproject.toml +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/requirements.txt +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/setup.cfg +0 -0
- {mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/setup.py +0 -0
|
@@ -170,6 +170,6 @@ def log_background_task_state(
|
|
|
170
170
|
f"Model endpoint creation task is still in progress with the current state: "
|
|
171
171
|
f"{background_task_state}. Events will not be monitored for the next "
|
|
172
172
|
f"{mlrun.mlconf.model_endpoint_monitoring.model_endpoint_creation_check_period} seconds",
|
|
173
|
-
function_name=server.
|
|
173
|
+
function_name=server.function_name,
|
|
174
174
|
background_task_check_timestamp=background_task_check_timestamp.isoformat(),
|
|
175
175
|
)
|
|
@@ -11,10 +11,31 @@
|
|
|
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
|
+
import re
|
|
15
15
|
from abc import ABC, abstractmethod
|
|
16
16
|
|
|
17
17
|
import mlrun.common.schemas
|
|
18
|
+
from mlrun.config import config as mlconf
|
|
19
|
+
|
|
20
|
+
_AUTH_SECRET_NAME_TEMPLATE = re.escape(
|
|
21
|
+
mlconf.secret_stores.kubernetes.auth_secret_name.format(
|
|
22
|
+
hashed_access_key="",
|
|
23
|
+
)
|
|
24
|
+
)
|
|
25
|
+
AUTH_SECRET_PATTERN = re.compile(f"^{_AUTH_SECRET_NAME_TEMPLATE}.*")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def validate_not_forbidden_secret(secret_name: str) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Forbid client-supplied references to internal MLRun auth/project secrets.
|
|
31
|
+
No-op when running inside the API server (API enrichments are allowed).
|
|
32
|
+
"""
|
|
33
|
+
if not secret_name or mlrun.config.is_running_as_api():
|
|
34
|
+
return
|
|
35
|
+
if AUTH_SECRET_PATTERN.match(secret_name):
|
|
36
|
+
raise mlrun.errors.MLRunInvalidArgumentError(
|
|
37
|
+
f"Forbidden secret '{secret_name}' matches MLRun auth-secret pattern."
|
|
38
|
+
)
|
|
18
39
|
|
|
19
40
|
|
|
20
41
|
class SecretProviderInterface(ABC):
|
|
@@ -29,6 +29,7 @@ import pydantic.v1.error_wrappers
|
|
|
29
29
|
import mlrun
|
|
30
30
|
import mlrun.common.constants as mlrun_constants
|
|
31
31
|
import mlrun.common.schemas.notification
|
|
32
|
+
import mlrun.common.secrets
|
|
32
33
|
import mlrun.utils.regex
|
|
33
34
|
|
|
34
35
|
from .utils import (
|
|
@@ -1616,7 +1617,12 @@ class RunTemplate(ModelObj):
|
|
|
1616
1617
|
|
|
1617
1618
|
:returns: The RunTemplate object
|
|
1618
1619
|
"""
|
|
1619
|
-
|
|
1620
|
+
if kind == "azure_vault" and isinstance(source, dict):
|
|
1621
|
+
candidate_secret_name = (source.get("k8s_secret") or "").strip()
|
|
1622
|
+
if candidate_secret_name:
|
|
1623
|
+
mlrun.common.secrets.validate_not_forbidden_secret(
|
|
1624
|
+
candidate_secret_name
|
|
1625
|
+
)
|
|
1620
1626
|
if kind == "vault" and isinstance(source, list):
|
|
1621
1627
|
source = {"project": self.metadata.project, "secrets": source}
|
|
1622
1628
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
from abc import ABC, abstractmethod
|
|
16
16
|
from datetime import datetime, timedelta
|
|
17
|
-
from typing import
|
|
17
|
+
from typing import ClassVar, Literal, Optional, Union
|
|
18
18
|
|
|
19
19
|
import pandas as pd
|
|
20
20
|
import pydantic.v1
|
|
@@ -444,11 +444,9 @@ class TSDBConnector(ABC):
|
|
|
444
444
|
]
|
|
445
445
|
"""
|
|
446
446
|
|
|
447
|
-
|
|
447
|
+
def add_basic_metrics(
|
|
448
448
|
self,
|
|
449
449
|
model_endpoint_objects: list[mlrun.common.schemas.ModelEndpoint],
|
|
450
|
-
project: str,
|
|
451
|
-
run_in_threadpool: Callable,
|
|
452
450
|
metric_list: Optional[list[str]] = None,
|
|
453
451
|
) -> list[mlrun.common.schemas.ModelEndpoint]:
|
|
454
452
|
raise NotImplementedError()
|
{mlrun-1.10.0rc40 → mlrun-1.10.0rc41}/mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py
RENAMED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import threading
|
|
16
16
|
from datetime import datetime, timedelta
|
|
17
|
-
from typing import
|
|
17
|
+
from typing import Final, Literal, Optional, Union
|
|
18
18
|
|
|
19
19
|
import pandas as pd
|
|
20
20
|
import taosws
|
|
@@ -1057,7 +1057,6 @@ class TDEngineConnector(TSDBConnector):
|
|
|
1057
1057
|
]
|
|
1058
1058
|
):
|
|
1059
1059
|
metric_objects = []
|
|
1060
|
-
|
|
1061
1060
|
if not df_results.empty:
|
|
1062
1061
|
df_results.rename(
|
|
1063
1062
|
columns={
|
|
@@ -1069,7 +1068,9 @@ class TDEngineConnector(TSDBConnector):
|
|
|
1069
1068
|
metric_objects.append(
|
|
1070
1069
|
mm_schemas.ApplicationResultRecord(
|
|
1071
1070
|
time=datetime.fromisoformat(
|
|
1072
|
-
row[mm_schemas.WriterEvent.END_INFER_TIME]
|
|
1071
|
+
row[mm_schemas.WriterEvent.END_INFER_TIME].replace(
|
|
1072
|
+
" +", "+"
|
|
1073
|
+
)
|
|
1073
1074
|
),
|
|
1074
1075
|
result_name=row[mm_schemas.ResultData.RESULT_NAME],
|
|
1075
1076
|
kind=row[mm_schemas.ResultData.RESULT_KIND],
|
|
@@ -1089,7 +1090,9 @@ class TDEngineConnector(TSDBConnector):
|
|
|
1089
1090
|
metric_objects.append(
|
|
1090
1091
|
mm_schemas.ApplicationMetricRecord(
|
|
1091
1092
|
time=datetime.fromisoformat(
|
|
1092
|
-
row[mm_schemas.WriterEvent.END_INFER_TIME]
|
|
1093
|
+
row[mm_schemas.WriterEvent.END_INFER_TIME].replace(
|
|
1094
|
+
" +", "+"
|
|
1095
|
+
)
|
|
1093
1096
|
),
|
|
1094
1097
|
metric_name=row[mm_schemas.MetricData.METRIC_NAME],
|
|
1095
1098
|
value=row[mm_schemas.MetricData.METRIC_VALUE],
|
|
@@ -1248,11 +1251,9 @@ class TDEngineConnector(TSDBConnector):
|
|
|
1248
1251
|
df.dropna(inplace=True)
|
|
1249
1252
|
return df
|
|
1250
1253
|
|
|
1251
|
-
|
|
1254
|
+
def add_basic_metrics(
|
|
1252
1255
|
self,
|
|
1253
1256
|
model_endpoint_objects: list[mlrun.common.schemas.ModelEndpoint],
|
|
1254
|
-
project: str,
|
|
1255
|
-
run_in_threadpool: Callable,
|
|
1256
1257
|
metric_list: Optional[list[str]] = None,
|
|
1257
1258
|
) -> list[mlrun.common.schemas.ModelEndpoint]:
|
|
1258
1259
|
"""
|
|
@@ -1260,8 +1261,6 @@ class TDEngineConnector(TSDBConnector):
|
|
|
1260
1261
|
|
|
1261
1262
|
:param model_endpoint_objects: A list of `ModelEndpoint` objects that will
|
|
1262
1263
|
be filled with the relevant basic metrics.
|
|
1263
|
-
:param project: The name of the project.
|
|
1264
|
-
:param run_in_threadpool: A function that runs another function in a thread pool.
|
|
1265
1264
|
:param metric_list: List of metrics to include from the time series DB. Defaults to all metrics.
|
|
1266
1265
|
|
|
1267
1266
|
:return: A list of `ModelEndpointMonitoringMetric` objects.
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import math
|
|
15
|
-
from datetime import datetime, timedelta
|
|
15
|
+
from datetime import datetime, timedelta, timezone
|
|
16
16
|
from io import StringIO
|
|
17
|
-
from typing import
|
|
17
|
+
from typing import Literal, Optional, Union
|
|
18
18
|
|
|
19
19
|
import pandas as pd
|
|
20
20
|
import v3io_frames
|
|
@@ -1230,11 +1230,9 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
1230
1230
|
)
|
|
1231
1231
|
return df.reset_index(drop=True)
|
|
1232
1232
|
|
|
1233
|
-
|
|
1233
|
+
def add_basic_metrics(
|
|
1234
1234
|
self,
|
|
1235
1235
|
model_endpoint_objects: list[mlrun.common.schemas.ModelEndpoint],
|
|
1236
|
-
project: str,
|
|
1237
|
-
run_in_threadpool: Callable,
|
|
1238
1236
|
metric_list: Optional[list[str]] = None,
|
|
1239
1237
|
) -> list[mlrun.common.schemas.ModelEndpoint]:
|
|
1240
1238
|
"""
|
|
@@ -1242,8 +1240,6 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
1242
1240
|
|
|
1243
1241
|
:param model_endpoint_objects: A list of `ModelEndpoint` objects that will
|
|
1244
1242
|
be filled with the relevant basic metrics.
|
|
1245
|
-
:param project: The name of the project.
|
|
1246
|
-
:param run_in_threadpool: A function that runs another function in a thread pool.
|
|
1247
1243
|
:param metric_list: List of metrics to include from the time series DB. Defaults to all metrics.
|
|
1248
1244
|
|
|
1249
1245
|
:return: A list of `ModelEndpointMonitoringMetric` objects.
|
|
@@ -1272,8 +1268,7 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
1272
1268
|
function,
|
|
1273
1269
|
_,
|
|
1274
1270
|
) in metric_name_to_function_and_column_name.items():
|
|
1275
|
-
metric_name_to_result[metric_name] =
|
|
1276
|
-
function,
|
|
1271
|
+
metric_name_to_result[metric_name] = function(
|
|
1277
1272
|
endpoint_ids=uids,
|
|
1278
1273
|
get_raw=True,
|
|
1279
1274
|
)
|
|
@@ -1344,7 +1339,7 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
1344
1339
|
else:
|
|
1345
1340
|
filter_query = app_filter_query
|
|
1346
1341
|
|
|
1347
|
-
|
|
1342
|
+
raw_frames: list[v3io_frames.client.RawFrame] = self._get_records(
|
|
1348
1343
|
table=mm_schemas.V3IOTSDBTables.APP_RESULTS,
|
|
1349
1344
|
start=start,
|
|
1350
1345
|
end=end,
|
|
@@ -1353,39 +1348,33 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
1353
1348
|
mm_schemas.ResultData.RESULT_STATUS,
|
|
1354
1349
|
],
|
|
1355
1350
|
filter_query=filter_query,
|
|
1351
|
+
get_raw=True,
|
|
1356
1352
|
)
|
|
1357
1353
|
|
|
1358
|
-
|
|
1359
|
-
if result_status_list and not df.empty:
|
|
1360
|
-
df = df[df[mm_schemas.ResultData.RESULT_STATUS].isin(result_status_list)]
|
|
1361
|
-
|
|
1362
|
-
if df.empty:
|
|
1354
|
+
if not raw_frames:
|
|
1363
1355
|
return {}
|
|
1364
|
-
else:
|
|
1365
|
-
# convert application name to lower case
|
|
1366
|
-
df[mm_schemas.ApplicationEvent.APPLICATION_NAME] = df[
|
|
1367
|
-
mm_schemas.ApplicationEvent.APPLICATION_NAME
|
|
1368
|
-
].str.lower()
|
|
1369
|
-
|
|
1370
|
-
df = (
|
|
1371
|
-
df[
|
|
1372
|
-
[
|
|
1373
|
-
mm_schemas.ApplicationEvent.APPLICATION_NAME,
|
|
1374
|
-
mm_schemas.ResultData.RESULT_STATUS,
|
|
1375
|
-
mm_schemas.ResultData.RESULT_VALUE,
|
|
1376
|
-
]
|
|
1377
|
-
]
|
|
1378
|
-
.groupby(
|
|
1379
|
-
[
|
|
1380
|
-
mm_schemas.ApplicationEvent.APPLICATION_NAME,
|
|
1381
|
-
mm_schemas.ResultData.RESULT_STATUS,
|
|
1382
|
-
],
|
|
1383
|
-
observed=True,
|
|
1384
|
-
)
|
|
1385
|
-
.count()
|
|
1386
|
-
)
|
|
1387
1356
|
|
|
1388
|
-
|
|
1357
|
+
# Count occurrences by (application_name, result_status) from RawFrame objects
|
|
1358
|
+
count_dict = {}
|
|
1359
|
+
|
|
1360
|
+
for frame in raw_frames:
|
|
1361
|
+
# Extract column data from each RawFrame
|
|
1362
|
+
app_name = frame.column_data(mm_schemas.ApplicationEvent.APPLICATION_NAME)[
|
|
1363
|
+
0
|
|
1364
|
+
]
|
|
1365
|
+
statuses = frame.column_data(mm_schemas.ResultData.RESULT_STATUS)
|
|
1366
|
+
|
|
1367
|
+
for status in statuses:
|
|
1368
|
+
# Filter by result status if specified
|
|
1369
|
+
if result_status_list and status not in result_status_list:
|
|
1370
|
+
continue
|
|
1371
|
+
|
|
1372
|
+
# Convert application name to lower case
|
|
1373
|
+
key = (app_name.lower(), status)
|
|
1374
|
+
|
|
1375
|
+
# Update the count in the dictionary
|
|
1376
|
+
count_dict[key] = count_dict.get(key, 0) + 1
|
|
1377
|
+
return count_dict
|
|
1389
1378
|
|
|
1390
1379
|
def count_processed_model_endpoints(
|
|
1391
1380
|
self,
|
|
@@ -1543,51 +1532,140 @@ class V3IOTSDBConnector(TSDBConnector):
|
|
|
1543
1532
|
) -> mm_schemas.ModelEndpointDriftValues:
|
|
1544
1533
|
table = mm_schemas.V3IOTSDBTables.APP_RESULTS
|
|
1545
1534
|
start, end, interval = self._prepare_aligned_start_end(start, end)
|
|
1546
|
-
|
|
1535
|
+
raw_frames: list[v3io_frames.client.RawFrame] = self._get_records(
|
|
1547
1536
|
table=table,
|
|
1548
1537
|
start=start,
|
|
1549
1538
|
end=end,
|
|
1550
1539
|
columns=[mm_schemas.ResultData.RESULT_STATUS],
|
|
1540
|
+
get_raw=True,
|
|
1551
1541
|
)
|
|
1552
|
-
|
|
1553
|
-
if
|
|
1542
|
+
|
|
1543
|
+
if not raw_frames:
|
|
1544
|
+
return mm_schemas.ModelEndpointDriftValues(values=[])
|
|
1545
|
+
|
|
1546
|
+
aggregated_data = self._aggregate_raw_drift_data(
|
|
1547
|
+
raw_frames=raw_frames, start=start, end=end, interval=interval
|
|
1548
|
+
)
|
|
1549
|
+
if not aggregated_data:
|
|
1550
|
+
return mm_schemas.ModelEndpointDriftValues(values=[])
|
|
1551
|
+
|
|
1552
|
+
# Filter to only include entries with max result_status >= 1
|
|
1553
|
+
filtered_data = [
|
|
1554
|
+
(endpoint_id, timestamp, max_status)
|
|
1555
|
+
for endpoint_id, timestamp, max_status in aggregated_data
|
|
1556
|
+
if max_status >= 1
|
|
1557
|
+
]
|
|
1558
|
+
|
|
1559
|
+
if not filtered_data:
|
|
1554
1560
|
return mm_schemas.ModelEndpointDriftValues(values=[])
|
|
1555
|
-
|
|
1556
|
-
return self.
|
|
1561
|
+
|
|
1562
|
+
return self._convert_drift_data_to_values(aggregated_data=filtered_data)
|
|
1557
1563
|
|
|
1558
1564
|
@staticmethod
|
|
1559
1565
|
def _aggregate_raw_drift_data(
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1566
|
+
raw_frames: list[v3io_frames.client.RawFrame],
|
|
1567
|
+
start: datetime,
|
|
1568
|
+
end: datetime,
|
|
1569
|
+
interval: str,
|
|
1570
|
+
) -> list[tuple[str, datetime, float]]:
|
|
1571
|
+
"""
|
|
1572
|
+
Aggregate raw drift data from RawFrame objects.
|
|
1573
|
+
|
|
1574
|
+
:param raw_frames: List of RawFrame objects containing drift data.
|
|
1575
|
+
:param start: Start datetime for filtering data.
|
|
1576
|
+
:param end: End datetime for filtering data.
|
|
1577
|
+
:param interval: Time interval string (e.g., '5min') for aggregation
|
|
1578
|
+
|
|
1579
|
+
:returns: list of tuples: (endpoint_id, timestamp, max_result_status)
|
|
1580
|
+
"""
|
|
1581
|
+
if not raw_frames:
|
|
1582
|
+
return []
|
|
1583
|
+
|
|
1584
|
+
# Parse interval to get timedelta
|
|
1585
|
+
interval_td = pd.Timedelta(interval)
|
|
1586
|
+
|
|
1587
|
+
# Collect all data points from RawFrame objects
|
|
1588
|
+
data_points = []
|
|
1589
|
+
for frame in raw_frames:
|
|
1590
|
+
endpoint_id = frame.column_data(EventFieldType.ENDPOINT_ID)[0]
|
|
1591
|
+
result_statuses = frame.column_data(mm_schemas.ResultData.RESULT_STATUS)
|
|
1592
|
+
timestamps = frame.indices()[0].times
|
|
1593
|
+
|
|
1594
|
+
# Combine data from this frame
|
|
1595
|
+
for i, (status, timestamp) in enumerate(zip(result_statuses, timestamps)):
|
|
1596
|
+
# V3IO TSDB returns timestamps in nanoseconds
|
|
1597
|
+
timestamp_dt = pd.Timestamp(
|
|
1598
|
+
timestamp, unit="ns", tzinfo=timezone.utc
|
|
1599
|
+
).to_pydatetime()
|
|
1600
|
+
|
|
1601
|
+
# Filter by time window
|
|
1602
|
+
if start <= timestamp_dt < end:
|
|
1603
|
+
data_points.append((endpoint_id, timestamp_dt, status))
|
|
1604
|
+
|
|
1605
|
+
if not data_points:
|
|
1606
|
+
return []
|
|
1607
|
+
|
|
1608
|
+
# Group by endpoint_id and time intervals, then find max status
|
|
1609
|
+
# Create time buckets aligned to start
|
|
1610
|
+
grouped_data = {}
|
|
1611
|
+
for endpoint_id, timestamp, status in data_points:
|
|
1612
|
+
# Calculate which interval bucket this timestamp falls into
|
|
1613
|
+
time_diff = timestamp - start
|
|
1614
|
+
bucket_index = int(time_diff / interval_td)
|
|
1615
|
+
bucket_start = start + (bucket_index * interval_td)
|
|
1616
|
+
|
|
1617
|
+
key = (endpoint_id, bucket_start)
|
|
1618
|
+
if key not in grouped_data:
|
|
1619
|
+
grouped_data[key] = status
|
|
1620
|
+
else:
|
|
1621
|
+
# Keep the maximum status value
|
|
1622
|
+
grouped_data[key] = max(grouped_data[key], status)
|
|
1623
|
+
|
|
1624
|
+
# Convert to list of tuples
|
|
1625
|
+
result = [
|
|
1626
|
+
(endpoint_id, timestamp, max_status)
|
|
1627
|
+
for (endpoint_id, timestamp), max_status in grouped_data.items()
|
|
1572
1628
|
]
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1629
|
+
|
|
1630
|
+
return result
|
|
1631
|
+
|
|
1632
|
+
@staticmethod
|
|
1633
|
+
def _convert_drift_data_to_values(
|
|
1634
|
+
aggregated_data: list[tuple[str, datetime, float]],
|
|
1635
|
+
) -> mm_schemas.ModelEndpointDriftValues:
|
|
1636
|
+
"""
|
|
1637
|
+
Convert aggregated drift data to ModelEndpointDriftValues format.
|
|
1638
|
+
|
|
1639
|
+
:param aggregated_data: List of tuples (endpoint_id, timestamp, max_result_status)
|
|
1640
|
+
:return: ModelEndpointDriftValues with counts of suspected and detected per timestamp
|
|
1641
|
+
"""
|
|
1642
|
+
suspected_val = mm_schemas.constants.ResultStatusApp.potential_detection.value
|
|
1643
|
+
detected_val = mm_schemas.constants.ResultStatusApp.detected.value
|
|
1644
|
+
|
|
1645
|
+
# Group by timestamp and result status, then count occurrences
|
|
1646
|
+
timestamp_status_counts = {}
|
|
1647
|
+
for _, timestamp, max_status in aggregated_data:
|
|
1648
|
+
key = (timestamp, max_status)
|
|
1649
|
+
timestamp_status_counts[key] = timestamp_status_counts.get(key, 0) + 1
|
|
1650
|
+
|
|
1651
|
+
# Organize by timestamp with counts for suspected and detected
|
|
1652
|
+
timestamp_counts = {}
|
|
1653
|
+
for (timestamp, status), count in timestamp_status_counts.items():
|
|
1654
|
+
if timestamp not in timestamp_counts:
|
|
1655
|
+
timestamp_counts[timestamp] = {
|
|
1656
|
+
"count_suspected": 0,
|
|
1657
|
+
"count_detected": 0,
|
|
1588
1658
|
}
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1659
|
+
|
|
1660
|
+
if status == suspected_val:
|
|
1661
|
+
timestamp_counts[timestamp]["count_suspected"] = count
|
|
1662
|
+
elif status == detected_val:
|
|
1663
|
+
timestamp_counts[timestamp]["count_detected"] = count
|
|
1664
|
+
|
|
1665
|
+
# Convert to the expected format: list of (timestamp, count_suspected, count_detected)
|
|
1666
|
+
values = [
|
|
1667
|
+
(timestamp, counts["count_suspected"], counts["count_detected"])
|
|
1668
|
+
for timestamp, counts in sorted(timestamp_counts.items())
|
|
1669
|
+
]
|
|
1670
|
+
|
|
1671
|
+
return mm_schemas.ModelEndpointDriftValues(values=values)
|
|
@@ -45,6 +45,7 @@ import mlrun.common.runtimes.constants
|
|
|
45
45
|
import mlrun.common.schemas.alert
|
|
46
46
|
import mlrun.common.schemas.artifact
|
|
47
47
|
import mlrun.common.schemas.model_monitoring.constants as mm_constants
|
|
48
|
+
import mlrun.common.secrets
|
|
48
49
|
import mlrun.datastore.datastore_profile
|
|
49
50
|
import mlrun.db
|
|
50
51
|
import mlrun.errors
|
|
@@ -3418,7 +3419,12 @@ class MlrunProject(ModelObj):
|
|
|
3418
3419
|
self._initialized = True
|
|
3419
3420
|
return self.spec._function_objects
|
|
3420
3421
|
|
|
3421
|
-
def with_secrets(
|
|
3422
|
+
def with_secrets(
|
|
3423
|
+
self,
|
|
3424
|
+
kind,
|
|
3425
|
+
source,
|
|
3426
|
+
prefix="",
|
|
3427
|
+
):
|
|
3422
3428
|
"""register a secrets source (file, env or dict)
|
|
3423
3429
|
|
|
3424
3430
|
read secrets from a source provider to be used in workflows, example::
|
|
@@ -3440,12 +3446,19 @@ class MlrunProject(ModelObj):
|
|
|
3440
3446
|
|
|
3441
3447
|
This will enable access to all secrets in vault registered to the current project.
|
|
3442
3448
|
|
|
3443
|
-
:param kind: secret type (file, inline, env, vault)
|
|
3449
|
+
:param kind: secret type (file, inline, env, vault, azure_vault)
|
|
3444
3450
|
:param source: secret data or link (see example)
|
|
3445
3451
|
:param prefix: add a prefix to the keys in this source
|
|
3446
3452
|
|
|
3447
3453
|
:returns: project object
|
|
3448
3454
|
"""
|
|
3455
|
+
# Block using mlrun-auth-secrets.* via azure_vault's k8s_secret param (client-side only)
|
|
3456
|
+
if kind == "azure_vault" and isinstance(source, dict):
|
|
3457
|
+
candidate_secret_name = (source.get("k8s_secret") or "").strip()
|
|
3458
|
+
if candidate_secret_name:
|
|
3459
|
+
mlrun.common.secrets.validate_not_forbidden_secret(
|
|
3460
|
+
candidate_secret_name
|
|
3461
|
+
)
|
|
3449
3462
|
|
|
3450
3463
|
if kind == "vault" and isinstance(source, list):
|
|
3451
3464
|
source = {"project": self.metadata.name, "secrets": source}
|
|
@@ -17,6 +17,8 @@ import typing
|
|
|
17
17
|
import warnings
|
|
18
18
|
from collections import namedtuple
|
|
19
19
|
|
|
20
|
+
import mlrun.common.secrets
|
|
21
|
+
import mlrun.errors
|
|
20
22
|
from mlrun.config import config
|
|
21
23
|
from mlrun.config import config as mlconf
|
|
22
24
|
from mlrun.errors import MLRunInvalidArgumentError
|
|
@@ -412,6 +414,9 @@ def mount_secret(
|
|
|
412
414
|
the specified paths, and unlisted keys will not be
|
|
413
415
|
present."""
|
|
414
416
|
|
|
417
|
+
if secret_name:
|
|
418
|
+
mlrun.common.secrets.validate_not_forbidden_secret(secret_name.strip())
|
|
419
|
+
|
|
415
420
|
def _mount_secret(runtime: "KubeResource"):
|
|
416
421
|
# Define the secret volume source
|
|
417
422
|
secret_volume_source = {
|
|
@@ -23,6 +23,7 @@ from nuclio import KafkaTrigger
|
|
|
23
23
|
|
|
24
24
|
import mlrun
|
|
25
25
|
import mlrun.common.schemas as schemas
|
|
26
|
+
import mlrun.common.secrets
|
|
26
27
|
import mlrun.datastore.datastore_profile as ds_profile
|
|
27
28
|
from mlrun.datastore import get_kafka_brokers_from_dict, parse_kafka_url
|
|
28
29
|
from mlrun.model import ObjectList
|
|
@@ -635,7 +636,12 @@ class ServingRuntime(RemoteRuntime):
|
|
|
635
636
|
|
|
636
637
|
:returns: The Runtime (function) object
|
|
637
638
|
"""
|
|
638
|
-
|
|
639
|
+
if kind == "azure_vault" and isinstance(source, dict):
|
|
640
|
+
candidate_secret_name = (source.get("k8s_secret") or "").strip()
|
|
641
|
+
if candidate_secret_name:
|
|
642
|
+
mlrun.common.secrets.validate_not_forbidden_secret(
|
|
643
|
+
candidate_secret_name
|
|
644
|
+
)
|
|
639
645
|
if kind == "vault" and isinstance(source, list):
|
|
640
646
|
source = {"project": self.metadata.project, "secrets": source}
|
|
641
647
|
|
|
@@ -20,12 +20,14 @@ import typing
|
|
|
20
20
|
import warnings
|
|
21
21
|
from collections.abc import Iterable
|
|
22
22
|
from enum import Enum
|
|
23
|
+
from typing import Optional
|
|
23
24
|
|
|
24
25
|
import dotenv
|
|
25
26
|
import kubernetes.client as k8s_client
|
|
26
27
|
from kubernetes.client import V1Volume, V1VolumeMount
|
|
27
28
|
|
|
28
29
|
import mlrun.common.constants
|
|
30
|
+
import mlrun.common.secrets
|
|
29
31
|
import mlrun.errors
|
|
30
32
|
import mlrun.runtimes.mounts
|
|
31
33
|
import mlrun.utils.regex
|
|
@@ -708,19 +710,45 @@ class KubeResource(BaseRuntime):
|
|
|
708
710
|
def spec(self, spec):
|
|
709
711
|
self._spec = self._verify_dict(spec, "spec", KubeResourceSpec)
|
|
710
712
|
|
|
711
|
-
def set_env_from_secret(
|
|
712
|
-
|
|
713
|
-
|
|
713
|
+
def set_env_from_secret(
|
|
714
|
+
self,
|
|
715
|
+
name: str,
|
|
716
|
+
secret: Optional[str] = None,
|
|
717
|
+
secret_key: Optional[str] = None,
|
|
718
|
+
):
|
|
719
|
+
"""
|
|
720
|
+
Set an environment variable from a Kubernetes Secret.
|
|
721
|
+
Client-side guard forbids MLRun internal auth/project secrets; no-op on API.
|
|
722
|
+
"""
|
|
723
|
+
mlrun.common.secrets.validate_not_forbidden_secret(secret)
|
|
724
|
+
key = secret_key or name
|
|
714
725
|
value_from = k8s_client.V1EnvVarSource(
|
|
715
|
-
secret_key_ref=k8s_client.V1SecretKeySelector(name=secret, key=
|
|
726
|
+
secret_key_ref=k8s_client.V1SecretKeySelector(name=secret, key=key)
|
|
716
727
|
)
|
|
717
|
-
return self._set_env(name, value_from=value_from)
|
|
728
|
+
return self._set_env(name=name, value_from=value_from)
|
|
718
729
|
|
|
719
|
-
def set_env(
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
730
|
+
def set_env(
|
|
731
|
+
self,
|
|
732
|
+
name: str,
|
|
733
|
+
value: Optional[str] = None,
|
|
734
|
+
value_from: Optional[typing.Any] = None,
|
|
735
|
+
):
|
|
736
|
+
"""
|
|
737
|
+
Set an environment variable.
|
|
738
|
+
If value comes from a Secret, validate on client-side only.
|
|
739
|
+
"""
|
|
740
|
+
if value_from is not None:
|
|
741
|
+
secret_name = self._extract_secret_name_from_value_from(
|
|
742
|
+
value_from=value_from
|
|
743
|
+
)
|
|
744
|
+
if secret_name:
|
|
745
|
+
mlrun.common.secrets.validate_not_forbidden_secret(secret_name)
|
|
746
|
+
return self._set_env(name=name, value_from=value_from)
|
|
747
|
+
|
|
748
|
+
# Plain literal value path
|
|
749
|
+
return self._set_env(
|
|
750
|
+
name=name, value=(str(value) if value is not None else None)
|
|
751
|
+
)
|
|
724
752
|
|
|
725
753
|
def with_annotations(self, annotations: dict):
|
|
726
754
|
"""set a key/value annotations in the metadata of the pod"""
|
|
@@ -1366,6 +1394,27 @@ class KubeResource(BaseRuntime):
|
|
|
1366
1394
|
|
|
1367
1395
|
return self.status.state
|
|
1368
1396
|
|
|
1397
|
+
@staticmethod
|
|
1398
|
+
def _extract_secret_name_from_value_from(
|
|
1399
|
+
value_from: typing.Any,
|
|
1400
|
+
) -> Optional[str]:
|
|
1401
|
+
"""Extract secret name from a V1EnvVarSource or dict representation."""
|
|
1402
|
+
if isinstance(value_from, k8s_client.V1EnvVarSource):
|
|
1403
|
+
if value_from.secret_key_ref:
|
|
1404
|
+
return value_from.secret_key_ref.name
|
|
1405
|
+
elif isinstance(value_from, dict):
|
|
1406
|
+
value_from = (
|
|
1407
|
+
value_from.get("valueFrom")
|
|
1408
|
+
or value_from.get("value_from")
|
|
1409
|
+
or value_from
|
|
1410
|
+
)
|
|
1411
|
+
secret_key_ref = (value_from or {}).get("secretKeyRef") or (
|
|
1412
|
+
value_from or {}
|
|
1413
|
+
).get("secret_key_ref")
|
|
1414
|
+
if isinstance(secret_key_ref, dict):
|
|
1415
|
+
return secret_key_ref.get("name")
|
|
1416
|
+
return None
|
|
1417
|
+
|
|
1369
1418
|
|
|
1370
1419
|
def _resolve_if_type_sanitized(attribute_name, attribute):
|
|
1371
1420
|
attribute_config = sanitized_attributes[attribute_name]
|