genesis-flow 1.0.0__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.
- genesis_flow-1.0.0.dist-info/METADATA +822 -0
- genesis_flow-1.0.0.dist-info/RECORD +645 -0
- genesis_flow-1.0.0.dist-info/WHEEL +5 -0
- genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
- genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
- genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
- mlflow/__init__.py +367 -0
- mlflow/__main__.py +3 -0
- mlflow/ag2/__init__.py +56 -0
- mlflow/ag2/ag2_logger.py +294 -0
- mlflow/anthropic/__init__.py +40 -0
- mlflow/anthropic/autolog.py +129 -0
- mlflow/anthropic/chat.py +144 -0
- mlflow/artifacts/__init__.py +268 -0
- mlflow/autogen/__init__.py +144 -0
- mlflow/autogen/chat.py +142 -0
- mlflow/azure/__init__.py +26 -0
- mlflow/azure/auth_handler.py +257 -0
- mlflow/azure/client.py +319 -0
- mlflow/azure/config.py +120 -0
- mlflow/azure/connection_factory.py +340 -0
- mlflow/azure/exceptions.py +27 -0
- mlflow/azure/stores.py +327 -0
- mlflow/azure/utils.py +183 -0
- mlflow/bedrock/__init__.py +45 -0
- mlflow/bedrock/_autolog.py +202 -0
- mlflow/bedrock/chat.py +122 -0
- mlflow/bedrock/stream.py +160 -0
- mlflow/bedrock/utils.py +43 -0
- mlflow/cli.py +707 -0
- mlflow/client.py +12 -0
- mlflow/config/__init__.py +56 -0
- mlflow/crewai/__init__.py +79 -0
- mlflow/crewai/autolog.py +253 -0
- mlflow/crewai/chat.py +29 -0
- mlflow/data/__init__.py +75 -0
- mlflow/data/artifact_dataset_sources.py +170 -0
- mlflow/data/code_dataset_source.py +40 -0
- mlflow/data/dataset.py +123 -0
- mlflow/data/dataset_registry.py +168 -0
- mlflow/data/dataset_source.py +110 -0
- mlflow/data/dataset_source_registry.py +219 -0
- mlflow/data/delta_dataset_source.py +167 -0
- mlflow/data/digest_utils.py +108 -0
- mlflow/data/evaluation_dataset.py +562 -0
- mlflow/data/filesystem_dataset_source.py +81 -0
- mlflow/data/http_dataset_source.py +145 -0
- mlflow/data/huggingface_dataset.py +258 -0
- mlflow/data/huggingface_dataset_source.py +118 -0
- mlflow/data/meta_dataset.py +104 -0
- mlflow/data/numpy_dataset.py +223 -0
- mlflow/data/pandas_dataset.py +231 -0
- mlflow/data/polars_dataset.py +352 -0
- mlflow/data/pyfunc_dataset_mixin.py +31 -0
- mlflow/data/schema.py +76 -0
- mlflow/data/sources.py +1 -0
- mlflow/data/spark_dataset.py +406 -0
- mlflow/data/spark_dataset_source.py +74 -0
- mlflow/data/spark_delta_utils.py +118 -0
- mlflow/data/tensorflow_dataset.py +350 -0
- mlflow/data/uc_volume_dataset_source.py +81 -0
- mlflow/db.py +27 -0
- mlflow/dspy/__init__.py +17 -0
- mlflow/dspy/autolog.py +197 -0
- mlflow/dspy/callback.py +398 -0
- mlflow/dspy/constant.py +1 -0
- mlflow/dspy/load.py +93 -0
- mlflow/dspy/save.py +393 -0
- mlflow/dspy/util.py +109 -0
- mlflow/dspy/wrapper.py +226 -0
- mlflow/entities/__init__.py +104 -0
- mlflow/entities/_mlflow_object.py +52 -0
- mlflow/entities/assessment.py +545 -0
- mlflow/entities/assessment_error.py +80 -0
- mlflow/entities/assessment_source.py +141 -0
- mlflow/entities/dataset.py +92 -0
- mlflow/entities/dataset_input.py +51 -0
- mlflow/entities/dataset_summary.py +62 -0
- mlflow/entities/document.py +48 -0
- mlflow/entities/experiment.py +109 -0
- mlflow/entities/experiment_tag.py +35 -0
- mlflow/entities/file_info.py +45 -0
- mlflow/entities/input_tag.py +35 -0
- mlflow/entities/lifecycle_stage.py +35 -0
- mlflow/entities/logged_model.py +228 -0
- mlflow/entities/logged_model_input.py +26 -0
- mlflow/entities/logged_model_output.py +32 -0
- mlflow/entities/logged_model_parameter.py +46 -0
- mlflow/entities/logged_model_status.py +74 -0
- mlflow/entities/logged_model_tag.py +33 -0
- mlflow/entities/metric.py +200 -0
- mlflow/entities/model_registry/__init__.py +29 -0
- mlflow/entities/model_registry/_model_registry_entity.py +13 -0
- mlflow/entities/model_registry/model_version.py +243 -0
- mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
- mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
- mlflow/entities/model_registry/model_version_search.py +25 -0
- mlflow/entities/model_registry/model_version_stages.py +25 -0
- mlflow/entities/model_registry/model_version_status.py +35 -0
- mlflow/entities/model_registry/model_version_tag.py +35 -0
- mlflow/entities/model_registry/prompt.py +73 -0
- mlflow/entities/model_registry/prompt_version.py +244 -0
- mlflow/entities/model_registry/registered_model.py +175 -0
- mlflow/entities/model_registry/registered_model_alias.py +35 -0
- mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
- mlflow/entities/model_registry/registered_model_search.py +25 -0
- mlflow/entities/model_registry/registered_model_tag.py +35 -0
- mlflow/entities/multipart_upload.py +74 -0
- mlflow/entities/param.py +49 -0
- mlflow/entities/run.py +97 -0
- mlflow/entities/run_data.py +84 -0
- mlflow/entities/run_info.py +188 -0
- mlflow/entities/run_inputs.py +59 -0
- mlflow/entities/run_outputs.py +43 -0
- mlflow/entities/run_status.py +41 -0
- mlflow/entities/run_tag.py +36 -0
- mlflow/entities/source_type.py +31 -0
- mlflow/entities/span.py +774 -0
- mlflow/entities/span_event.py +96 -0
- mlflow/entities/span_status.py +102 -0
- mlflow/entities/trace.py +317 -0
- mlflow/entities/trace_data.py +71 -0
- mlflow/entities/trace_info.py +220 -0
- mlflow/entities/trace_info_v2.py +162 -0
- mlflow/entities/trace_location.py +173 -0
- mlflow/entities/trace_state.py +39 -0
- mlflow/entities/trace_status.py +68 -0
- mlflow/entities/view_type.py +51 -0
- mlflow/environment_variables.py +866 -0
- mlflow/evaluation/__init__.py +16 -0
- mlflow/evaluation/assessment.py +369 -0
- mlflow/evaluation/evaluation.py +411 -0
- mlflow/evaluation/evaluation_tag.py +61 -0
- mlflow/evaluation/fluent.py +48 -0
- mlflow/evaluation/utils.py +201 -0
- mlflow/exceptions.py +213 -0
- mlflow/experiments.py +140 -0
- mlflow/gemini/__init__.py +81 -0
- mlflow/gemini/autolog.py +186 -0
- mlflow/gemini/chat.py +261 -0
- mlflow/genai/__init__.py +71 -0
- mlflow/genai/datasets/__init__.py +67 -0
- mlflow/genai/datasets/evaluation_dataset.py +131 -0
- mlflow/genai/evaluation/__init__.py +3 -0
- mlflow/genai/evaluation/base.py +411 -0
- mlflow/genai/evaluation/constant.py +23 -0
- mlflow/genai/evaluation/utils.py +244 -0
- mlflow/genai/judges/__init__.py +21 -0
- mlflow/genai/judges/databricks.py +404 -0
- mlflow/genai/label_schemas/__init__.py +153 -0
- mlflow/genai/label_schemas/label_schemas.py +209 -0
- mlflow/genai/labeling/__init__.py +159 -0
- mlflow/genai/labeling/labeling.py +250 -0
- mlflow/genai/optimize/__init__.py +13 -0
- mlflow/genai/optimize/base.py +198 -0
- mlflow/genai/optimize/optimizers/__init__.py +4 -0
- mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
- mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
- mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
- mlflow/genai/optimize/types.py +75 -0
- mlflow/genai/optimize/util.py +30 -0
- mlflow/genai/prompts/__init__.py +206 -0
- mlflow/genai/scheduled_scorers.py +431 -0
- mlflow/genai/scorers/__init__.py +26 -0
- mlflow/genai/scorers/base.py +492 -0
- mlflow/genai/scorers/builtin_scorers.py +765 -0
- mlflow/genai/scorers/scorer_utils.py +138 -0
- mlflow/genai/scorers/validation.py +165 -0
- mlflow/genai/utils/data_validation.py +146 -0
- mlflow/genai/utils/enum_utils.py +23 -0
- mlflow/genai/utils/trace_utils.py +211 -0
- mlflow/groq/__init__.py +42 -0
- mlflow/groq/_groq_autolog.py +74 -0
- mlflow/johnsnowlabs/__init__.py +888 -0
- mlflow/langchain/__init__.py +24 -0
- mlflow/langchain/api_request_parallel_processor.py +330 -0
- mlflow/langchain/autolog.py +147 -0
- mlflow/langchain/chat_agent_langgraph.py +340 -0
- mlflow/langchain/constant.py +1 -0
- mlflow/langchain/constants.py +1 -0
- mlflow/langchain/databricks_dependencies.py +444 -0
- mlflow/langchain/langchain_tracer.py +597 -0
- mlflow/langchain/model.py +919 -0
- mlflow/langchain/output_parsers.py +142 -0
- mlflow/langchain/retriever_chain.py +153 -0
- mlflow/langchain/runnables.py +527 -0
- mlflow/langchain/utils/chat.py +402 -0
- mlflow/langchain/utils/logging.py +671 -0
- mlflow/langchain/utils/serialization.py +36 -0
- mlflow/legacy_databricks_cli/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/provider.py +482 -0
- mlflow/litellm/__init__.py +175 -0
- mlflow/llama_index/__init__.py +22 -0
- mlflow/llama_index/autolog.py +55 -0
- mlflow/llama_index/chat.py +43 -0
- mlflow/llama_index/constant.py +1 -0
- mlflow/llama_index/model.py +577 -0
- mlflow/llama_index/pyfunc_wrapper.py +332 -0
- mlflow/llama_index/serialize_objects.py +188 -0
- mlflow/llama_index/tracer.py +561 -0
- mlflow/metrics/__init__.py +479 -0
- mlflow/metrics/base.py +39 -0
- mlflow/metrics/genai/__init__.py +25 -0
- mlflow/metrics/genai/base.py +101 -0
- mlflow/metrics/genai/genai_metric.py +771 -0
- mlflow/metrics/genai/metric_definitions.py +450 -0
- mlflow/metrics/genai/model_utils.py +371 -0
- mlflow/metrics/genai/prompt_template.py +68 -0
- mlflow/metrics/genai/prompts/__init__.py +0 -0
- mlflow/metrics/genai/prompts/v1.py +422 -0
- mlflow/metrics/genai/utils.py +6 -0
- mlflow/metrics/metric_definitions.py +619 -0
- mlflow/mismatch.py +34 -0
- mlflow/mistral/__init__.py +34 -0
- mlflow/mistral/autolog.py +71 -0
- mlflow/mistral/chat.py +135 -0
- mlflow/ml_package_versions.py +452 -0
- mlflow/models/__init__.py +97 -0
- mlflow/models/auth_policy.py +83 -0
- mlflow/models/cli.py +354 -0
- mlflow/models/container/__init__.py +294 -0
- mlflow/models/container/scoring_server/__init__.py +0 -0
- mlflow/models/container/scoring_server/nginx.conf +39 -0
- mlflow/models/dependencies_schemas.py +287 -0
- mlflow/models/display_utils.py +158 -0
- mlflow/models/docker_utils.py +211 -0
- mlflow/models/evaluation/__init__.py +23 -0
- mlflow/models/evaluation/_shap_patch.py +64 -0
- mlflow/models/evaluation/artifacts.py +194 -0
- mlflow/models/evaluation/base.py +1811 -0
- mlflow/models/evaluation/calibration_curve.py +109 -0
- mlflow/models/evaluation/default_evaluator.py +996 -0
- mlflow/models/evaluation/deprecated.py +23 -0
- mlflow/models/evaluation/evaluator_registry.py +80 -0
- mlflow/models/evaluation/evaluators/classifier.py +704 -0
- mlflow/models/evaluation/evaluators/default.py +233 -0
- mlflow/models/evaluation/evaluators/regressor.py +96 -0
- mlflow/models/evaluation/evaluators/shap.py +296 -0
- mlflow/models/evaluation/lift_curve.py +178 -0
- mlflow/models/evaluation/utils/metric.py +123 -0
- mlflow/models/evaluation/utils/trace.py +179 -0
- mlflow/models/evaluation/validation.py +434 -0
- mlflow/models/flavor_backend.py +93 -0
- mlflow/models/flavor_backend_registry.py +53 -0
- mlflow/models/model.py +1639 -0
- mlflow/models/model_config.py +150 -0
- mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
- mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
- mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
- mlflow/models/python_api.py +369 -0
- mlflow/models/rag_signatures.py +128 -0
- mlflow/models/resources.py +321 -0
- mlflow/models/signature.py +662 -0
- mlflow/models/utils.py +2054 -0
- mlflow/models/wheeled_model.py +280 -0
- mlflow/openai/__init__.py +57 -0
- mlflow/openai/_agent_tracer.py +364 -0
- mlflow/openai/api_request_parallel_processor.py +131 -0
- mlflow/openai/autolog.py +509 -0
- mlflow/openai/constant.py +1 -0
- mlflow/openai/model.py +824 -0
- mlflow/openai/utils/chat_schema.py +367 -0
- mlflow/optuna/__init__.py +3 -0
- mlflow/optuna/storage.py +646 -0
- mlflow/plugins/__init__.py +72 -0
- mlflow/plugins/base.py +358 -0
- mlflow/plugins/builtin/__init__.py +24 -0
- mlflow/plugins/builtin/pytorch_plugin.py +150 -0
- mlflow/plugins/builtin/sklearn_plugin.py +158 -0
- mlflow/plugins/builtin/transformers_plugin.py +187 -0
- mlflow/plugins/cli.py +321 -0
- mlflow/plugins/discovery.py +340 -0
- mlflow/plugins/manager.py +465 -0
- mlflow/plugins/registry.py +316 -0
- mlflow/plugins/templates/framework_plugin_template.py +329 -0
- mlflow/prompt/constants.py +20 -0
- mlflow/prompt/promptlab_model.py +197 -0
- mlflow/prompt/registry_utils.py +248 -0
- mlflow/promptflow/__init__.py +495 -0
- mlflow/protos/__init__.py +0 -0
- mlflow/protos/assessments_pb2.py +174 -0
- mlflow/protos/databricks_artifacts_pb2.py +489 -0
- mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
- mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
- mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
- mlflow/protos/databricks_pb2.py +267 -0
- mlflow/protos/databricks_trace_server_pb2.py +374 -0
- mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
- mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
- mlflow/protos/facet_feature_statistics_pb2.py +296 -0
- mlflow/protos/internal_pb2.py +77 -0
- mlflow/protos/mlflow_artifacts_pb2.py +336 -0
- mlflow/protos/model_registry_pb2.py +1073 -0
- mlflow/protos/scalapb/__init__.py +0 -0
- mlflow/protos/scalapb/scalapb_pb2.py +104 -0
- mlflow/protos/service_pb2.py +2600 -0
- mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
- mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
- mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
- mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
- mlflow/py.typed +0 -0
- mlflow/pydantic_ai/__init__.py +57 -0
- mlflow/pydantic_ai/autolog.py +173 -0
- mlflow/pyfunc/__init__.py +3844 -0
- mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
- mlflow/pyfunc/backend.py +523 -0
- mlflow/pyfunc/context.py +78 -0
- mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
- mlflow/pyfunc/loaders/__init__.py +7 -0
- mlflow/pyfunc/loaders/chat_agent.py +117 -0
- mlflow/pyfunc/loaders/chat_model.py +125 -0
- mlflow/pyfunc/loaders/code_model.py +31 -0
- mlflow/pyfunc/loaders/responses_agent.py +112 -0
- mlflow/pyfunc/mlserver.py +46 -0
- mlflow/pyfunc/model.py +1473 -0
- mlflow/pyfunc/scoring_server/__init__.py +604 -0
- mlflow/pyfunc/scoring_server/app.py +7 -0
- mlflow/pyfunc/scoring_server/client.py +146 -0
- mlflow/pyfunc/spark_model_cache.py +48 -0
- mlflow/pyfunc/stdin_server.py +44 -0
- mlflow/pyfunc/utils/__init__.py +3 -0
- mlflow/pyfunc/utils/data_validation.py +224 -0
- mlflow/pyfunc/utils/environment.py +22 -0
- mlflow/pyfunc/utils/input_converter.py +47 -0
- mlflow/pyfunc/utils/serving_data_parser.py +11 -0
- mlflow/pytorch/__init__.py +1171 -0
- mlflow/pytorch/_lightning_autolog.py +580 -0
- mlflow/pytorch/_pytorch_autolog.py +50 -0
- mlflow/pytorch/pickle_module.py +35 -0
- mlflow/rfunc/__init__.py +42 -0
- mlflow/rfunc/backend.py +134 -0
- mlflow/runs.py +89 -0
- mlflow/server/__init__.py +302 -0
- mlflow/server/auth/__init__.py +1224 -0
- mlflow/server/auth/__main__.py +4 -0
- mlflow/server/auth/basic_auth.ini +6 -0
- mlflow/server/auth/cli.py +11 -0
- mlflow/server/auth/client.py +537 -0
- mlflow/server/auth/config.py +34 -0
- mlflow/server/auth/db/__init__.py +0 -0
- mlflow/server/auth/db/cli.py +18 -0
- mlflow/server/auth/db/migrations/__init__.py +0 -0
- mlflow/server/auth/db/migrations/alembic.ini +110 -0
- mlflow/server/auth/db/migrations/env.py +76 -0
- mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
- mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
- mlflow/server/auth/db/models.py +67 -0
- mlflow/server/auth/db/utils.py +37 -0
- mlflow/server/auth/entities.py +165 -0
- mlflow/server/auth/logo.py +14 -0
- mlflow/server/auth/permissions.py +65 -0
- mlflow/server/auth/routes.py +18 -0
- mlflow/server/auth/sqlalchemy_store.py +263 -0
- mlflow/server/graphql/__init__.py +0 -0
- mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
- mlflow/server/graphql/graphql_custom_scalars.py +24 -0
- mlflow/server/graphql/graphql_errors.py +15 -0
- mlflow/server/graphql/graphql_no_batching.py +89 -0
- mlflow/server/graphql/graphql_schema_extensions.py +74 -0
- mlflow/server/handlers.py +3217 -0
- mlflow/server/prometheus_exporter.py +17 -0
- mlflow/server/validation.py +30 -0
- mlflow/shap/__init__.py +691 -0
- mlflow/sklearn/__init__.py +1994 -0
- mlflow/sklearn/utils.py +1041 -0
- mlflow/smolagents/__init__.py +66 -0
- mlflow/smolagents/autolog.py +139 -0
- mlflow/smolagents/chat.py +29 -0
- mlflow/store/__init__.py +10 -0
- mlflow/store/_unity_catalog/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/constants.py +2 -0
- mlflow/store/_unity_catalog/registry/__init__.py +6 -0
- mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
- mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
- mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
- mlflow/store/_unity_catalog/registry/utils.py +121 -0
- mlflow/store/artifact/__init__.py +0 -0
- mlflow/store/artifact/artifact_repo.py +472 -0
- mlflow/store/artifact/artifact_repository_registry.py +154 -0
- mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
- mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
- mlflow/store/artifact/cli.py +141 -0
- mlflow/store/artifact/cloud_artifact_repo.py +332 -0
- mlflow/store/artifact/databricks_artifact_repo.py +729 -0
- mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
- mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
- mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
- mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
- mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
- mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
- mlflow/store/artifact/ftp_artifact_repo.py +132 -0
- mlflow/store/artifact/gcs_artifact_repo.py +296 -0
- mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
- mlflow/store/artifact/http_artifact_repo.py +218 -0
- mlflow/store/artifact/local_artifact_repo.py +142 -0
- mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
- mlflow/store/artifact/models_artifact_repo.py +259 -0
- mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
- mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
- mlflow/store/artifact/r2_artifact_repo.py +70 -0
- mlflow/store/artifact/runs_artifact_repo.py +265 -0
- mlflow/store/artifact/s3_artifact_repo.py +330 -0
- mlflow/store/artifact/sftp_artifact_repo.py +141 -0
- mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
- mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
- mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
- mlflow/store/artifact/utils/__init__.py +0 -0
- mlflow/store/artifact/utils/models.py +148 -0
- mlflow/store/db/__init__.py +0 -0
- mlflow/store/db/base_sql_model.py +3 -0
- mlflow/store/db/db_types.py +10 -0
- mlflow/store/db/utils.py +314 -0
- mlflow/store/db_migrations/__init__.py +0 -0
- mlflow/store/db_migrations/alembic.ini +74 -0
- mlflow/store/db_migrations/env.py +84 -0
- mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
- mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
- mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
- mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
- mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
- mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
- mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
- mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
- mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
- mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
- mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
- mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
- mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
- mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
- mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
- mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
- mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
- mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
- mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
- mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
- mlflow/store/db_migrations/versions/__init__.py +0 -0
- mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
- mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
- mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
- mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
- mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
- mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
- mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
- mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
- mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
- mlflow/store/entities/__init__.py +3 -0
- mlflow/store/entities/paged_list.py +18 -0
- mlflow/store/model_registry/__init__.py +10 -0
- mlflow/store/model_registry/abstract_store.py +1081 -0
- mlflow/store/model_registry/base_rest_store.py +44 -0
- mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
- mlflow/store/model_registry/dbmodels/__init__.py +0 -0
- mlflow/store/model_registry/dbmodels/models.py +206 -0
- mlflow/store/model_registry/file_store.py +1091 -0
- mlflow/store/model_registry/rest_store.py +481 -0
- mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
- mlflow/store/tracking/__init__.py +23 -0
- mlflow/store/tracking/abstract_store.py +816 -0
- mlflow/store/tracking/dbmodels/__init__.py +0 -0
- mlflow/store/tracking/dbmodels/initial_models.py +243 -0
- mlflow/store/tracking/dbmodels/models.py +1073 -0
- mlflow/store/tracking/file_store.py +2438 -0
- mlflow/store/tracking/postgres_managed_identity.py +146 -0
- mlflow/store/tracking/rest_store.py +1131 -0
- mlflow/store/tracking/sqlalchemy_store.py +2785 -0
- mlflow/system_metrics/__init__.py +61 -0
- mlflow/system_metrics/metrics/__init__.py +0 -0
- mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
- mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
- mlflow/system_metrics/metrics/disk_monitor.py +21 -0
- mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
- mlflow/system_metrics/metrics/network_monitor.py +34 -0
- mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
- mlflow/system_metrics/system_metrics_monitor.py +198 -0
- mlflow/tracing/__init__.py +16 -0
- mlflow/tracing/assessment.py +356 -0
- mlflow/tracing/client.py +531 -0
- mlflow/tracing/config.py +125 -0
- mlflow/tracing/constant.py +105 -0
- mlflow/tracing/destination.py +81 -0
- mlflow/tracing/display/__init__.py +40 -0
- mlflow/tracing/display/display_handler.py +196 -0
- mlflow/tracing/export/async_export_queue.py +186 -0
- mlflow/tracing/export/inference_table.py +138 -0
- mlflow/tracing/export/mlflow_v3.py +137 -0
- mlflow/tracing/export/utils.py +70 -0
- mlflow/tracing/fluent.py +1417 -0
- mlflow/tracing/processor/base_mlflow.py +199 -0
- mlflow/tracing/processor/inference_table.py +175 -0
- mlflow/tracing/processor/mlflow_v3.py +47 -0
- mlflow/tracing/processor/otel.py +73 -0
- mlflow/tracing/provider.py +487 -0
- mlflow/tracing/trace_manager.py +200 -0
- mlflow/tracing/utils/__init__.py +616 -0
- mlflow/tracing/utils/artifact_utils.py +28 -0
- mlflow/tracing/utils/copy.py +55 -0
- mlflow/tracing/utils/environment.py +55 -0
- mlflow/tracing/utils/exception.py +21 -0
- mlflow/tracing/utils/once.py +35 -0
- mlflow/tracing/utils/otlp.py +63 -0
- mlflow/tracing/utils/processor.py +54 -0
- mlflow/tracing/utils/search.py +292 -0
- mlflow/tracing/utils/timeout.py +250 -0
- mlflow/tracing/utils/token.py +19 -0
- mlflow/tracing/utils/truncation.py +124 -0
- mlflow/tracing/utils/warning.py +76 -0
- mlflow/tracking/__init__.py +39 -0
- mlflow/tracking/_model_registry/__init__.py +1 -0
- mlflow/tracking/_model_registry/client.py +764 -0
- mlflow/tracking/_model_registry/fluent.py +853 -0
- mlflow/tracking/_model_registry/registry.py +67 -0
- mlflow/tracking/_model_registry/utils.py +251 -0
- mlflow/tracking/_tracking_service/__init__.py +0 -0
- mlflow/tracking/_tracking_service/client.py +883 -0
- mlflow/tracking/_tracking_service/registry.py +56 -0
- mlflow/tracking/_tracking_service/utils.py +275 -0
- mlflow/tracking/artifact_utils.py +179 -0
- mlflow/tracking/client.py +5900 -0
- mlflow/tracking/context/__init__.py +0 -0
- mlflow/tracking/context/abstract_context.py +35 -0
- mlflow/tracking/context/databricks_cluster_context.py +15 -0
- mlflow/tracking/context/databricks_command_context.py +15 -0
- mlflow/tracking/context/databricks_job_context.py +49 -0
- mlflow/tracking/context/databricks_notebook_context.py +41 -0
- mlflow/tracking/context/databricks_repo_context.py +43 -0
- mlflow/tracking/context/default_context.py +51 -0
- mlflow/tracking/context/git_context.py +32 -0
- mlflow/tracking/context/registry.py +98 -0
- mlflow/tracking/context/system_environment_context.py +15 -0
- mlflow/tracking/default_experiment/__init__.py +1 -0
- mlflow/tracking/default_experiment/abstract_context.py +43 -0
- mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
- mlflow/tracking/default_experiment/registry.py +75 -0
- mlflow/tracking/fluent.py +3595 -0
- mlflow/tracking/metric_value_conversion_utils.py +93 -0
- mlflow/tracking/multimedia.py +206 -0
- mlflow/tracking/registry.py +86 -0
- mlflow/tracking/request_auth/__init__.py +0 -0
- mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
- mlflow/tracking/request_auth/registry.py +60 -0
- mlflow/tracking/request_header/__init__.py +0 -0
- mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
- mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
- mlflow/tracking/request_header/default_request_header_provider.py +17 -0
- mlflow/tracking/request_header/registry.py +79 -0
- mlflow/transformers/__init__.py +2982 -0
- mlflow/transformers/flavor_config.py +258 -0
- mlflow/transformers/hub_utils.py +83 -0
- mlflow/transformers/llm_inference_utils.py +468 -0
- mlflow/transformers/model_io.py +301 -0
- mlflow/transformers/peft.py +51 -0
- mlflow/transformers/signature.py +183 -0
- mlflow/transformers/torch_utils.py +55 -0
- mlflow/types/__init__.py +21 -0
- mlflow/types/agent.py +270 -0
- mlflow/types/chat.py +240 -0
- mlflow/types/llm.py +935 -0
- mlflow/types/responses.py +139 -0
- mlflow/types/responses_helpers.py +416 -0
- mlflow/types/schema.py +1505 -0
- mlflow/types/type_hints.py +647 -0
- mlflow/types/utils.py +753 -0
- mlflow/utils/__init__.py +283 -0
- mlflow/utils/_capture_modules.py +256 -0
- mlflow/utils/_capture_transformers_modules.py +75 -0
- mlflow/utils/_spark_utils.py +201 -0
- mlflow/utils/_unity_catalog_oss_utils.py +97 -0
- mlflow/utils/_unity_catalog_utils.py +479 -0
- mlflow/utils/annotations.py +218 -0
- mlflow/utils/arguments_utils.py +16 -0
- mlflow/utils/async_logging/__init__.py +1 -0
- mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
- mlflow/utils/async_logging/async_logging_queue.py +366 -0
- mlflow/utils/async_logging/run_artifact.py +38 -0
- mlflow/utils/async_logging/run_batch.py +58 -0
- mlflow/utils/async_logging/run_operations.py +49 -0
- mlflow/utils/autologging_utils/__init__.py +737 -0
- mlflow/utils/autologging_utils/client.py +432 -0
- mlflow/utils/autologging_utils/config.py +33 -0
- mlflow/utils/autologging_utils/events.py +294 -0
- mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
- mlflow/utils/autologging_utils/metrics_queue.py +71 -0
- mlflow/utils/autologging_utils/safety.py +1104 -0
- mlflow/utils/autologging_utils/versioning.py +95 -0
- mlflow/utils/checkpoint_utils.py +206 -0
- mlflow/utils/class_utils.py +6 -0
- mlflow/utils/cli_args.py +257 -0
- mlflow/utils/conda.py +354 -0
- mlflow/utils/credentials.py +231 -0
- mlflow/utils/data_utils.py +17 -0
- mlflow/utils/databricks_utils.py +1436 -0
- mlflow/utils/docstring_utils.py +477 -0
- mlflow/utils/doctor.py +133 -0
- mlflow/utils/download_cloud_file_chunk.py +43 -0
- mlflow/utils/env_manager.py +16 -0
- mlflow/utils/env_pack.py +131 -0
- mlflow/utils/environment.py +1009 -0
- mlflow/utils/exception_utils.py +14 -0
- mlflow/utils/file_utils.py +978 -0
- mlflow/utils/git_utils.py +77 -0
- mlflow/utils/gorilla.py +797 -0
- mlflow/utils/import_hooks/__init__.py +363 -0
- mlflow/utils/lazy_load.py +51 -0
- mlflow/utils/logging_utils.py +168 -0
- mlflow/utils/mime_type_utils.py +58 -0
- mlflow/utils/mlflow_tags.py +103 -0
- mlflow/utils/model_utils.py +486 -0
- mlflow/utils/name_utils.py +346 -0
- mlflow/utils/nfs_on_spark.py +62 -0
- mlflow/utils/openai_utils.py +164 -0
- mlflow/utils/os.py +12 -0
- mlflow/utils/oss_registry_utils.py +29 -0
- mlflow/utils/plugins.py +17 -0
- mlflow/utils/process.py +182 -0
- mlflow/utils/promptlab_utils.py +146 -0
- mlflow/utils/proto_json_utils.py +743 -0
- mlflow/utils/pydantic_utils.py +54 -0
- mlflow/utils/request_utils.py +279 -0
- mlflow/utils/requirements_utils.py +704 -0
- mlflow/utils/rest_utils.py +673 -0
- mlflow/utils/search_logged_model_utils.py +127 -0
- mlflow/utils/search_utils.py +2111 -0
- mlflow/utils/secure_loading.py +221 -0
- mlflow/utils/security_validation.py +384 -0
- mlflow/utils/server_cli_utils.py +61 -0
- mlflow/utils/spark_utils.py +15 -0
- mlflow/utils/string_utils.py +138 -0
- mlflow/utils/thread_utils.py +63 -0
- mlflow/utils/time.py +54 -0
- mlflow/utils/timeout.py +42 -0
- mlflow/utils/uri.py +572 -0
- mlflow/utils/validation.py +662 -0
- mlflow/utils/virtualenv.py +458 -0
- mlflow/utils/warnings_utils.py +25 -0
- mlflow/utils/yaml_utils.py +179 -0
- mlflow/version.py +24 -0
@@ -0,0 +1,507 @@
|
|
1
|
+
import functools
|
2
|
+
import os
|
3
|
+
import shutil
|
4
|
+
from contextlib import contextmanager
|
5
|
+
from typing import Optional
|
6
|
+
|
7
|
+
import mlflow
|
8
|
+
from mlflow.exceptions import MlflowException
|
9
|
+
from mlflow.protos.unity_catalog_oss_messages_pb2 import (
|
10
|
+
READ_WRITE_MODEL_VERSION,
|
11
|
+
CreateModelVersion,
|
12
|
+
CreateRegisteredModel,
|
13
|
+
DeleteModelVersion,
|
14
|
+
DeleteRegisteredModel,
|
15
|
+
FinalizeModelVersion,
|
16
|
+
GenerateTemporaryModelVersionCredential,
|
17
|
+
GetModelVersion,
|
18
|
+
GetRegisteredModel,
|
19
|
+
ListModelVersions,
|
20
|
+
ListRegisteredModels,
|
21
|
+
ModelVersionInfo,
|
22
|
+
RegisteredModelInfo,
|
23
|
+
TemporaryCredentials,
|
24
|
+
UpdateModelVersion,
|
25
|
+
UpdateRegisteredModel,
|
26
|
+
)
|
27
|
+
from mlflow.protos.unity_catalog_oss_service_pb2 import UnityCatalogService
|
28
|
+
from mlflow.store.artifact.local_artifact_repo import LocalArtifactRepository
|
29
|
+
from mlflow.store.entities.paged_list import PagedList
|
30
|
+
from mlflow.store.model_registry.base_rest_store import BaseRestStore
|
31
|
+
from mlflow.utils._unity_catalog_oss_utils import (
|
32
|
+
get_model_version_from_uc_oss_proto,
|
33
|
+
get_model_version_search_from_uc_oss_proto,
|
34
|
+
get_registered_model_from_uc_oss_proto,
|
35
|
+
get_registered_model_search_from_uc_oss_proto,
|
36
|
+
parse_model_name,
|
37
|
+
)
|
38
|
+
from mlflow.utils._unity_catalog_utils import (
|
39
|
+
get_artifact_repo_from_storage_info,
|
40
|
+
get_full_name_from_sc,
|
41
|
+
)
|
42
|
+
from mlflow.utils.annotations import experimental
|
43
|
+
from mlflow.utils.oss_registry_utils import get_oss_host_creds
|
44
|
+
from mlflow.utils.proto_json_utils import message_to_json
|
45
|
+
from mlflow.utils.rest_utils import (
|
46
|
+
_UC_OSS_REST_API_PATH_PREFIX,
|
47
|
+
call_endpoint,
|
48
|
+
extract_all_api_info_for_service,
|
49
|
+
extract_api_info_for_service,
|
50
|
+
)
|
51
|
+
from mlflow.utils.uri import is_file_uri, is_fuse_or_uc_volumes_uri
|
52
|
+
|
53
|
+
_METHOD_TO_INFO = extract_api_info_for_service(UnityCatalogService, _UC_OSS_REST_API_PATH_PREFIX)
|
54
|
+
_METHOD_TO_ALL_INFO = extract_all_api_info_for_service(
|
55
|
+
UnityCatalogService, _UC_OSS_REST_API_PATH_PREFIX
|
56
|
+
)
|
57
|
+
|
58
|
+
|
59
|
+
def _raise_unsupported_arg(arg_name, message=None):
|
60
|
+
messages = [
|
61
|
+
f"Argument '{arg_name}' is unsupported for models in the Unity Catalog.",
|
62
|
+
]
|
63
|
+
if message is not None:
|
64
|
+
messages.append(message)
|
65
|
+
raise MlflowException(" ".join(messages))
|
66
|
+
|
67
|
+
|
68
|
+
def _require_arg_unspecified(arg_name, arg_value, default_values=None, message=None):
|
69
|
+
default_values = [None] if default_values is None else default_values
|
70
|
+
if arg_value not in default_values:
|
71
|
+
_raise_unsupported_arg(arg_name, message)
|
72
|
+
|
73
|
+
|
74
|
+
@experimental(version="2.17.0")
|
75
|
+
class UnityCatalogOssStore(BaseRestStore):
|
76
|
+
"""
|
77
|
+
Client for an Open Source Unity Catalog Server accessed via REST API calls.
|
78
|
+
"""
|
79
|
+
|
80
|
+
def __init__(self, store_uri):
|
81
|
+
super().__init__(get_host_creds=functools.partial(get_oss_host_creds, store_uri))
|
82
|
+
self.tracking_uri = None # OSS has no tracking URI
|
83
|
+
|
84
|
+
def _get_response_from_method(self, method):
|
85
|
+
method_to_response = {
|
86
|
+
CreateRegisteredModel: RegisteredModelInfo,
|
87
|
+
CreateModelVersion: ModelVersionInfo,
|
88
|
+
UpdateRegisteredModel: RegisteredModelInfo,
|
89
|
+
DeleteRegisteredModel: DeleteRegisteredModel,
|
90
|
+
DeleteModelVersion: DeleteModelVersion.Response,
|
91
|
+
GetRegisteredModel: RegisteredModelInfo,
|
92
|
+
GetModelVersion: ModelVersionInfo,
|
93
|
+
FinalizeModelVersion: ModelVersionInfo,
|
94
|
+
UpdateModelVersion: ModelVersionInfo,
|
95
|
+
GenerateTemporaryModelVersionCredential: TemporaryCredentials,
|
96
|
+
ListRegisteredModels: ListRegisteredModels.Response,
|
97
|
+
ListModelVersions: ListModelVersions.Response,
|
98
|
+
}
|
99
|
+
return method_to_response[method]()
|
100
|
+
|
101
|
+
def _get_endpoint_from_method(self, method):
|
102
|
+
return _METHOD_TO_INFO[method]
|
103
|
+
|
104
|
+
def _get_all_endpoints_from_method(self, method):
|
105
|
+
return _METHOD_TO_ALL_INFO[method]
|
106
|
+
|
107
|
+
def create_registered_model(self, name, tags=None, description=None, deployment_job_id=None):
|
108
|
+
"""
|
109
|
+
Create a new registered model in backend store.
|
110
|
+
|
111
|
+
Args:
|
112
|
+
name: Name of the new model. This is expected to be unique in the backend store.
|
113
|
+
tags: Not supported for Unity Catalog OSS yet.
|
114
|
+
description: Description of the model.
|
115
|
+
deployment_job_id: Optional deployment job ID.
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
A single object of :py:class:`mlflow.entities.model_registry.RegisteredModel`
|
119
|
+
created in the backend.
|
120
|
+
|
121
|
+
"""
|
122
|
+
[catalog_name, schema_name, model_name] = name.split(".")
|
123
|
+
comment = description if description else ""
|
124
|
+
# RegisteredModelInfo is inlined in the request and the response.
|
125
|
+
# https://docs.databricks.com/api/workspace/registeredmodels/create
|
126
|
+
# TODO: Update the above reference to UC OSS documentation when it's available
|
127
|
+
req_body = message_to_json(
|
128
|
+
CreateRegisteredModel(
|
129
|
+
name=model_name,
|
130
|
+
catalog_name=catalog_name,
|
131
|
+
schema_name=schema_name,
|
132
|
+
comment=comment,
|
133
|
+
)
|
134
|
+
)
|
135
|
+
registered_model_info = self._call_endpoint(CreateRegisteredModel, req_body)
|
136
|
+
return get_registered_model_from_uc_oss_proto(registered_model_info)
|
137
|
+
|
138
|
+
def update_registered_model(self, name, description, deployment_job_id=None):
|
139
|
+
"""
|
140
|
+
Update description of the registered model.
|
141
|
+
|
142
|
+
Args:
|
143
|
+
name: Registered model name.
|
144
|
+
description: New description.
|
145
|
+
deployment_job_id: Optional deployment job ID.
|
146
|
+
|
147
|
+
Returns:
|
148
|
+
A single updated :py:class:`mlflow.entities.model_registry.RegisteredModel` object.
|
149
|
+
"""
|
150
|
+
full_name = get_full_name_from_sc(name, None)
|
151
|
+
comment = description if description else ""
|
152
|
+
req_body = message_to_json(
|
153
|
+
UpdateRegisteredModel(
|
154
|
+
full_name=full_name,
|
155
|
+
comment=comment,
|
156
|
+
)
|
157
|
+
)
|
158
|
+
endpoint, method = _METHOD_TO_INFO[UpdateRegisteredModel]
|
159
|
+
registered_model_info = self._edit_endpoint_and_call(
|
160
|
+
endpoint=endpoint,
|
161
|
+
method=method,
|
162
|
+
req_body=req_body,
|
163
|
+
full_name=full_name,
|
164
|
+
proto_name=UpdateRegisteredModel,
|
165
|
+
)
|
166
|
+
return get_registered_model_from_uc_oss_proto(registered_model_info)
|
167
|
+
|
168
|
+
def rename_registered_model(self, name, new_name):
|
169
|
+
raise NotImplementedError("Method not implemented")
|
170
|
+
|
171
|
+
def delete_registered_model(self, name):
|
172
|
+
"""
|
173
|
+
Delete the registered model.
|
174
|
+
Backend raises exception if a registered model with given name does not exist.
|
175
|
+
|
176
|
+
Args:
|
177
|
+
name: Registered model name.
|
178
|
+
|
179
|
+
Returns:
|
180
|
+
None
|
181
|
+
"""
|
182
|
+
full_name = get_full_name_from_sc(name, None)
|
183
|
+
req_body = message_to_json(
|
184
|
+
DeleteRegisteredModel(
|
185
|
+
full_name=full_name,
|
186
|
+
)
|
187
|
+
)
|
188
|
+
endpoint, method = _METHOD_TO_INFO[DeleteRegisteredModel]
|
189
|
+
self._edit_endpoint_and_call(
|
190
|
+
endpoint=endpoint,
|
191
|
+
method=method,
|
192
|
+
req_body=req_body,
|
193
|
+
full_name=full_name,
|
194
|
+
proto_name=DeleteRegisteredModel,
|
195
|
+
)
|
196
|
+
|
197
|
+
def search_registered_models(
|
198
|
+
self, filter_string=None, max_results=None, order_by=None, page_token=None
|
199
|
+
):
|
200
|
+
"""
|
201
|
+
Search for registered models in backend that satisfy the filter criteria.
|
202
|
+
|
203
|
+
Args:
|
204
|
+
filter_string: Filter query string, defaults to searching all registered models.
|
205
|
+
max_results: Maximum number of registered models desired.
|
206
|
+
order_by: List of column names with ASC|DESC annotation, to be used for ordering
|
207
|
+
matching search results.
|
208
|
+
page_token: Token specifying the next page of results. It should be obtained from
|
209
|
+
a ``search_registered_models`` call.
|
210
|
+
|
211
|
+
Returns:
|
212
|
+
A PagedList of :py:class:`mlflow.entities.model_registry.RegisteredModel` objects
|
213
|
+
that satisfy the search expressions. The pagination token for the next page can be
|
214
|
+
obtained via the ``token`` attribute of the object.
|
215
|
+
|
216
|
+
"""
|
217
|
+
_require_arg_unspecified("filter_string", filter_string)
|
218
|
+
_require_arg_unspecified("order_by", order_by)
|
219
|
+
req_body = message_to_json(
|
220
|
+
ListRegisteredModels(
|
221
|
+
max_results=max_results,
|
222
|
+
page_token=page_token,
|
223
|
+
)
|
224
|
+
)
|
225
|
+
endpoint, method = _METHOD_TO_INFO[ListRegisteredModels]
|
226
|
+
response_proto = call_endpoint(
|
227
|
+
self.get_host_creds(),
|
228
|
+
endpoint=endpoint,
|
229
|
+
method=method,
|
230
|
+
json_body=req_body,
|
231
|
+
response_proto=self._get_response_from_method(ListRegisteredModels),
|
232
|
+
)
|
233
|
+
registered_models = [
|
234
|
+
get_registered_model_search_from_uc_oss_proto(registered_model)
|
235
|
+
for registered_model in response_proto.registered_models
|
236
|
+
]
|
237
|
+
return PagedList(registered_models, response_proto.next_page_token)
|
238
|
+
|
239
|
+
def get_registered_model(self, name):
|
240
|
+
full_name = get_full_name_from_sc(name, None)
|
241
|
+
req_body = message_to_json(GetRegisteredModel(full_name=full_name))
|
242
|
+
endpoint, method = _METHOD_TO_INFO[GetRegisteredModel]
|
243
|
+
registered_model_info = self._edit_endpoint_and_call(
|
244
|
+
endpoint=endpoint,
|
245
|
+
method=method,
|
246
|
+
req_body=req_body,
|
247
|
+
full_name=full_name,
|
248
|
+
proto_name=GetRegisteredModel,
|
249
|
+
version=None,
|
250
|
+
)
|
251
|
+
return get_registered_model_from_uc_oss_proto(registered_model_info)
|
252
|
+
|
253
|
+
def get_latest_versions(self, name, stages=None):
|
254
|
+
raise NotImplementedError("Method not implemented")
|
255
|
+
|
256
|
+
def set_registered_model_tag(self, name, tag):
|
257
|
+
raise NotImplementedError("Method not implemented")
|
258
|
+
|
259
|
+
def delete_registered_model_tag(self, name, key):
|
260
|
+
raise NotImplementedError("Method not implemented")
|
261
|
+
|
262
|
+
def create_model_version(
|
263
|
+
self,
|
264
|
+
name,
|
265
|
+
source,
|
266
|
+
run_id=None,
|
267
|
+
tags=None,
|
268
|
+
run_link=None,
|
269
|
+
description=None,
|
270
|
+
local_model_path=None,
|
271
|
+
model_id: Optional[str] = None,
|
272
|
+
):
|
273
|
+
with self._local_model_dir(source, local_model_path) as local_model_dir:
|
274
|
+
[catalog_name, schema_name, model_name] = name.split(".")
|
275
|
+
req_body = message_to_json(
|
276
|
+
CreateModelVersion(
|
277
|
+
model_name=model_name,
|
278
|
+
catalog_name=catalog_name,
|
279
|
+
schema_name=schema_name,
|
280
|
+
source=source,
|
281
|
+
run_id=run_id,
|
282
|
+
comment=description,
|
283
|
+
)
|
284
|
+
)
|
285
|
+
model_version = self._call_endpoint(CreateModelVersion, req_body)
|
286
|
+
store = self._get_artifact_repo(model_version)
|
287
|
+
store.log_artifacts(local_dir=local_model_dir, artifact_path="")
|
288
|
+
endpoint, method = _METHOD_TO_INFO[FinalizeModelVersion]
|
289
|
+
finalize_req_body = message_to_json(
|
290
|
+
FinalizeModelVersion(full_name=name, version=model_version.version)
|
291
|
+
)
|
292
|
+
registered_model_version = self._edit_endpoint_and_call(
|
293
|
+
endpoint=endpoint,
|
294
|
+
method=method,
|
295
|
+
req_body=finalize_req_body,
|
296
|
+
full_name=name,
|
297
|
+
proto_name=FinalizeModelVersion,
|
298
|
+
version=model_version.version,
|
299
|
+
)
|
300
|
+
return get_model_version_from_uc_oss_proto(registered_model_version)
|
301
|
+
|
302
|
+
def update_model_version(self, name, version, description):
|
303
|
+
full_name = get_full_name_from_sc(name, None)
|
304
|
+
version = int(version)
|
305
|
+
req_body = message_to_json(
|
306
|
+
UpdateModelVersion(
|
307
|
+
full_name=full_name,
|
308
|
+
version=version,
|
309
|
+
comment=description,
|
310
|
+
)
|
311
|
+
)
|
312
|
+
endpoint, method = _METHOD_TO_INFO[UpdateModelVersion]
|
313
|
+
registered_model_version = self._edit_endpoint_and_call(
|
314
|
+
endpoint=endpoint,
|
315
|
+
method=method,
|
316
|
+
req_body=req_body,
|
317
|
+
full_name=full_name,
|
318
|
+
proto_name=UpdateModelVersion,
|
319
|
+
version=version,
|
320
|
+
)
|
321
|
+
return get_model_version_from_uc_oss_proto(registered_model_version)
|
322
|
+
|
323
|
+
def transition_model_version_stage(self, name, version, stage, archive_existing_versions):
|
324
|
+
raise NotImplementedError("Method not implemented")
|
325
|
+
|
326
|
+
def delete_model_version(self, name, version):
|
327
|
+
full_name = get_full_name_from_sc(name, None)
|
328
|
+
version = int(version)
|
329
|
+
req_body = message_to_json(DeleteModelVersion(full_name=full_name, version=version))
|
330
|
+
endpoint, method = _METHOD_TO_INFO[DeleteModelVersion]
|
331
|
+
return self._edit_endpoint_and_call(
|
332
|
+
endpoint=endpoint,
|
333
|
+
method=method,
|
334
|
+
req_body=req_body,
|
335
|
+
full_name=full_name,
|
336
|
+
proto_name=FinalizeModelVersion,
|
337
|
+
version=version,
|
338
|
+
)
|
339
|
+
|
340
|
+
# This method exists to return the actual UC response object,
|
341
|
+
# which contains the storage location
|
342
|
+
def _get_model_version_endpoint_response(self, name, version):
|
343
|
+
full_name = get_full_name_from_sc(name, None)
|
344
|
+
version = int(version)
|
345
|
+
req_body = message_to_json(GetModelVersion(full_name=full_name, version=version))
|
346
|
+
endpoint, method = _METHOD_TO_INFO[GetModelVersion]
|
347
|
+
return self._edit_endpoint_and_call(
|
348
|
+
endpoint=endpoint,
|
349
|
+
method=method,
|
350
|
+
req_body=req_body,
|
351
|
+
full_name=full_name,
|
352
|
+
proto_name=GetModelVersion,
|
353
|
+
version=version,
|
354
|
+
)
|
355
|
+
|
356
|
+
def get_model_version(self, name, version):
|
357
|
+
return get_model_version_from_uc_oss_proto(
|
358
|
+
self._get_model_version_endpoint_response(name, version)
|
359
|
+
)
|
360
|
+
|
361
|
+
def search_model_versions(
|
362
|
+
self, filter_string=None, max_results=None, order_by=None, page_token=None
|
363
|
+
):
|
364
|
+
"""
|
365
|
+
Search for model versions in backend that satisfy the filter criteria.
|
366
|
+
|
367
|
+
Args:
|
368
|
+
filter_string: A filter string expression. Currently supports a single filter
|
369
|
+
condition either name of model like ``name = 'model_name'``
|
370
|
+
max_results: Maximum number of model versions desired.
|
371
|
+
order_by: List of column names with ASC|DESC annotation, to be used for ordering
|
372
|
+
matching search results.
|
373
|
+
page_token: Token specifying the next page of results. It should be obtained from
|
374
|
+
a ``search_model_versions`` call.
|
375
|
+
|
376
|
+
Returns:
|
377
|
+
A PagedList of :py:class:`mlflow.entities.model_registry.ModelVersion`
|
378
|
+
objects that satisfy the search expressions. The pagination token for the next
|
379
|
+
page can be obtained via the ``token`` attribute of the object.
|
380
|
+
|
381
|
+
"""
|
382
|
+
_require_arg_unspecified(arg_name="order_by", arg_value=order_by)
|
383
|
+
full_name = parse_model_name(filter_string)
|
384
|
+
req_body = message_to_json(
|
385
|
+
ListModelVersions(full_name=full_name, page_token=page_token, max_results=max_results)
|
386
|
+
)
|
387
|
+
endpoint, method = _METHOD_TO_INFO[ListModelVersions]
|
388
|
+
response_proto = self._edit_endpoint_and_call(
|
389
|
+
endpoint=endpoint,
|
390
|
+
method=method,
|
391
|
+
req_body=req_body,
|
392
|
+
full_name=full_name,
|
393
|
+
proto_name=ListModelVersions,
|
394
|
+
)
|
395
|
+
model_versions = [
|
396
|
+
get_model_version_search_from_uc_oss_proto(mvd) for mvd in response_proto.model_versions
|
397
|
+
]
|
398
|
+
return PagedList(model_versions, response_proto.next_page_token)
|
399
|
+
|
400
|
+
def set_model_version_tag(self, name, version, tag):
|
401
|
+
raise NotImplementedError("Method not implemented")
|
402
|
+
|
403
|
+
def delete_model_version_tag(self, name, version, key):
|
404
|
+
raise NotImplementedError("Method not implemented")
|
405
|
+
|
406
|
+
def set_registered_model_alias(self, name, alias, version):
|
407
|
+
raise NotImplementedError("Method not implemented")
|
408
|
+
|
409
|
+
def delete_registered_model_alias(self, name, alias):
|
410
|
+
raise NotImplementedError("Method not implemented")
|
411
|
+
|
412
|
+
def get_model_version_by_alias(self, name, alias):
|
413
|
+
raise NotImplementedError("Method not implemented")
|
414
|
+
|
415
|
+
def _get_artifact_repo(self, model_version):
|
416
|
+
if is_file_uri(model_version.storage_location):
|
417
|
+
return LocalArtifactRepository(artifact_uri=model_version.storage_location)
|
418
|
+
|
419
|
+
def base_credential_refresh_def():
|
420
|
+
return self._get_temporary_model_version_write_credentials_oss(
|
421
|
+
model_name=model_version.model_name,
|
422
|
+
catalog_name=model_version.catalog_name,
|
423
|
+
schema_name=model_version.schema_name,
|
424
|
+
version=model_version.version,
|
425
|
+
)
|
426
|
+
|
427
|
+
scoped_token = base_credential_refresh_def()
|
428
|
+
|
429
|
+
return get_artifact_repo_from_storage_info(
|
430
|
+
storage_location=model_version.storage_location,
|
431
|
+
scoped_token=scoped_token,
|
432
|
+
base_credential_refresh_def=base_credential_refresh_def,
|
433
|
+
is_oss=True,
|
434
|
+
)
|
435
|
+
|
436
|
+
def _get_temporary_model_version_write_credentials_oss( # noqa: D417
|
437
|
+
self, model_name, catalog_name, schema_name, version
|
438
|
+
):
|
439
|
+
"""
|
440
|
+
Get temporary credentials for uploading model version files
|
441
|
+
|
442
|
+
Args:
|
443
|
+
name: Registered model name.
|
444
|
+
version: Model version number.
|
445
|
+
|
446
|
+
Returns:
|
447
|
+
mlflow.protos.unity_catalog_oss_messages_pb2.TemporaryCredentials containing
|
448
|
+
temporary model version credentials.
|
449
|
+
"""
|
450
|
+
req_body = message_to_json(
|
451
|
+
GenerateTemporaryModelVersionCredential(
|
452
|
+
catalog_name=catalog_name,
|
453
|
+
schema_name=schema_name,
|
454
|
+
model_name=model_name,
|
455
|
+
version=int(version),
|
456
|
+
operation=READ_WRITE_MODEL_VERSION,
|
457
|
+
)
|
458
|
+
)
|
459
|
+
return self._call_endpoint(GenerateTemporaryModelVersionCredential, req_body)
|
460
|
+
|
461
|
+
def get_model_version_download_uri(self, name, version):
|
462
|
+
response = self._get_model_version_endpoint_response(name, int(version))
|
463
|
+
return response.storage_location
|
464
|
+
|
465
|
+
@contextmanager
|
466
|
+
def _local_model_dir(self, source, local_model_path):
|
467
|
+
if local_model_path is not None:
|
468
|
+
yield local_model_path
|
469
|
+
else:
|
470
|
+
try:
|
471
|
+
local_model_dir = mlflow.artifacts.download_artifacts(
|
472
|
+
artifact_uri=source, tracking_uri=self.tracking_uri
|
473
|
+
)
|
474
|
+
except Exception as e:
|
475
|
+
raise MlflowException(
|
476
|
+
"Unable to download model artifacts from source artifact location "
|
477
|
+
f"'{source}' in order to upload them to Unity Catalog. Please ensure "
|
478
|
+
"the source artifact location exists and that you can download from "
|
479
|
+
"it via mlflow.artifacts.download_artifacts()"
|
480
|
+
) from e
|
481
|
+
try:
|
482
|
+
yield local_model_dir
|
483
|
+
finally:
|
484
|
+
# Clean up temporary model directory at end of block. We assume a temporary
|
485
|
+
# model directory was created if the `source` is not a local path
|
486
|
+
# (must be downloaded from remote to a temporary directory) and
|
487
|
+
# `local_model_dir` is not a FUSE-mounted path. The check for FUSE-mounted
|
488
|
+
# paths is important as mlflow.artifacts.download_artifacts() can return
|
489
|
+
# a FUSE mounted path equivalent to the (remote) source path in some cases,
|
490
|
+
# e.g. return /dbfs/some/path for source dbfs:/some/path.
|
491
|
+
if not os.path.exists(source) and not is_fuse_or_uc_volumes_uri(local_model_dir):
|
492
|
+
shutil.rmtree(local_model_dir)
|
493
|
+
|
494
|
+
def _edit_endpoint_and_call(
|
495
|
+
self, endpoint, method, req_body, full_name, proto_name, version=None
|
496
|
+
):
|
497
|
+
if version is not None:
|
498
|
+
endpoint = endpoint.replace("{full_name}", full_name).replace("{version}", str(version))
|
499
|
+
else:
|
500
|
+
endpoint = endpoint.replace("{full_name}", full_name)
|
501
|
+
return call_endpoint(
|
502
|
+
self.get_host_creds(),
|
503
|
+
endpoint=endpoint,
|
504
|
+
method=method,
|
505
|
+
json_body=req_body,
|
506
|
+
response_proto=self._get_response_from_method(proto_name),
|
507
|
+
)
|
@@ -0,0 +1,121 @@
|
|
1
|
+
"""
|
2
|
+
Utility functions for converting between Unity Catalog proto and MLflow entities.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import Optional
|
6
|
+
|
7
|
+
from mlflow.entities.model_registry.prompt import Prompt
|
8
|
+
from mlflow.entities.model_registry.prompt_version import PromptVersion
|
9
|
+
from mlflow.protos.unity_catalog_prompt_messages_pb2 import (
|
10
|
+
PromptAlias as ProtoPromptAlias,
|
11
|
+
)
|
12
|
+
from mlflow.protos.unity_catalog_prompt_messages_pb2 import (
|
13
|
+
PromptTag as ProtoPromptTag,
|
14
|
+
)
|
15
|
+
from mlflow.protos.unity_catalog_prompt_messages_pb2 import (
|
16
|
+
PromptVersion as ProtoPromptVersion,
|
17
|
+
)
|
18
|
+
from mlflow.protos.unity_catalog_prompt_messages_pb2 import (
|
19
|
+
PromptVersionTag as ProtoPromptVersionTag,
|
20
|
+
)
|
21
|
+
|
22
|
+
|
23
|
+
def proto_to_mlflow_tags(proto_tags: list[ProtoPromptTag]) -> dict[str, str]:
|
24
|
+
"""Convert proto prompt tags to MLflow tags dictionary."""
|
25
|
+
return {tag.key: tag.value for tag in proto_tags} if proto_tags else {}
|
26
|
+
|
27
|
+
|
28
|
+
def mlflow_tags_to_proto(tags: dict[str, str]) -> list[ProtoPromptTag]:
|
29
|
+
"""Convert MLflow tags dictionary to proto prompt tags."""
|
30
|
+
return [ProtoPromptTag(key=k, value=v) for k, v in tags.items()] if tags else []
|
31
|
+
|
32
|
+
|
33
|
+
def proto_version_tags_to_mlflow_tags(
|
34
|
+
proto_tags: list[ProtoPromptVersionTag],
|
35
|
+
) -> dict[str, str]:
|
36
|
+
"""Convert proto prompt version tags to MLflow tags dictionary."""
|
37
|
+
return {tag.key: tag.value for tag in proto_tags} if proto_tags else {}
|
38
|
+
|
39
|
+
|
40
|
+
def mlflow_tags_to_proto_version_tags(tags: dict[str, str]) -> list[ProtoPromptVersionTag]:
|
41
|
+
"""Convert MLflow tags dictionary to proto prompt version tags."""
|
42
|
+
return [ProtoPromptVersionTag(key=k, value=v) for k, v in tags.items()] if tags else []
|
43
|
+
|
44
|
+
|
45
|
+
def proto_info_to_mlflow_prompt_info(
|
46
|
+
proto_info, # Prompt type from protobuf
|
47
|
+
prompt_tags: Optional[dict[str, str]] = None,
|
48
|
+
) -> Prompt:
|
49
|
+
"""Convert proto Prompt to MLflow PromptInfo entity.
|
50
|
+
|
51
|
+
Prompt doesn't have template or version fields.
|
52
|
+
This is used for create_prompt and search_prompts responses.
|
53
|
+
"""
|
54
|
+
tags = proto_to_mlflow_tags(proto_info.tags) if proto_info.tags else {}
|
55
|
+
if prompt_tags:
|
56
|
+
tags.update(prompt_tags)
|
57
|
+
|
58
|
+
return Prompt(
|
59
|
+
name=proto_info.name,
|
60
|
+
description=proto_info.description,
|
61
|
+
tags=tags,
|
62
|
+
)
|
63
|
+
|
64
|
+
|
65
|
+
def proto_to_mlflow_prompt(
|
66
|
+
proto_version, # PromptVersion type from protobuf
|
67
|
+
) -> PromptVersion:
|
68
|
+
"""Convert proto PromptVersion to MLflow prompt entity.
|
69
|
+
|
70
|
+
PromptVersion has template and version fields.
|
71
|
+
This is used for get_prompt_version responses.
|
72
|
+
"""
|
73
|
+
# Extract version tags
|
74
|
+
version_tags = (
|
75
|
+
proto_version_tags_to_mlflow_tags(proto_version.tags) if proto_version.tags else {}
|
76
|
+
)
|
77
|
+
|
78
|
+
# Extract aliases
|
79
|
+
aliases = []
|
80
|
+
if hasattr(proto_version, "aliases") and proto_version.aliases:
|
81
|
+
aliases = [alias.alias for alias in proto_version.aliases]
|
82
|
+
|
83
|
+
if not proto_version.version:
|
84
|
+
raise ValueError("Prompt is missing its version field.")
|
85
|
+
version = int(proto_version.version)
|
86
|
+
|
87
|
+
return PromptVersion(
|
88
|
+
name=proto_version.name,
|
89
|
+
version=version,
|
90
|
+
template=proto_version.template,
|
91
|
+
commit_message=proto_version.description,
|
92
|
+
creation_timestamp=proto_version.creation_timestamp,
|
93
|
+
tags=version_tags,
|
94
|
+
aliases=aliases,
|
95
|
+
)
|
96
|
+
|
97
|
+
|
98
|
+
def mlflow_prompt_to_proto(prompt: PromptVersion) -> ProtoPromptVersion:
|
99
|
+
"""Convert MLflow prompt entity to proto prompt version."""
|
100
|
+
proto_version = ProtoPromptVersion()
|
101
|
+
proto_version.name = prompt.name
|
102
|
+
proto_version.version = str(prompt.version)
|
103
|
+
proto_version.template = prompt.template
|
104
|
+
if prompt.commit_message:
|
105
|
+
proto_version.description = prompt.commit_message
|
106
|
+
if prompt.creation_timestamp:
|
107
|
+
proto_version.creation_timestamp = prompt.creation_timestamp
|
108
|
+
|
109
|
+
# Add version tags
|
110
|
+
if prompt.tags:
|
111
|
+
proto_version.tags.extend(mlflow_tags_to_proto_version_tags(prompt.tags))
|
112
|
+
|
113
|
+
# Add aliases
|
114
|
+
if prompt.aliases:
|
115
|
+
for alias in prompt.aliases:
|
116
|
+
alias_proto = ProtoPromptAlias()
|
117
|
+
alias_proto.alias = alias
|
118
|
+
alias_proto.version = str(prompt.version)
|
119
|
+
proto_version.aliases.append(alias_proto)
|
120
|
+
|
121
|
+
return proto_version
|
File without changes
|