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,110 @@
|
|
1
|
+
# A generic, single database configuration.
|
2
|
+
|
3
|
+
[alembic]
|
4
|
+
# path to migration scripts
|
5
|
+
script_location = .
|
6
|
+
|
7
|
+
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
|
8
|
+
# Uncomment the line below if you want the files to be prepended with date and time
|
9
|
+
# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
|
10
|
+
# for all available tokens
|
11
|
+
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
|
12
|
+
|
13
|
+
# sys.path path, will be prepended to sys.path if present.
|
14
|
+
# defaults to the current working directory.
|
15
|
+
prepend_sys_path = .
|
16
|
+
|
17
|
+
# timezone to use when rendering the date within the migration file
|
18
|
+
# as well as the filename.
|
19
|
+
# If specified, requires the python-dateutil library that can be
|
20
|
+
# installed by adding `alembic[tz]` to the pip requirements
|
21
|
+
# string value is passed to dateutil.tz.gettz()
|
22
|
+
# leave blank for localtime
|
23
|
+
# timezone =
|
24
|
+
|
25
|
+
# max length of characters to apply to the
|
26
|
+
# "slug" field
|
27
|
+
# truncate_slug_length = 40
|
28
|
+
|
29
|
+
# set to 'true' to run the environment during
|
30
|
+
# the 'revision' command, regardless of autogenerate
|
31
|
+
# revision_environment = false
|
32
|
+
|
33
|
+
# set to 'true' to allow .pyc and .pyo files without
|
34
|
+
# a source .py file to be detected as revisions in the
|
35
|
+
# versions/ directory
|
36
|
+
# sourceless = false
|
37
|
+
|
38
|
+
# version location specification; This defaults
|
39
|
+
# to migration/versions. When using multiple version
|
40
|
+
# directories, initial revisions must be specified with --version-path.
|
41
|
+
# The path separator used here should be the separator specified by "version_path_separator" below.
|
42
|
+
# version_locations = %(here)s/bar:%(here)s/bat:migration/versions
|
43
|
+
|
44
|
+
# version path separator; As mentioned above, this is the character used to split
|
45
|
+
# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
|
46
|
+
# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
|
47
|
+
# Valid values for version_path_separator are:
|
48
|
+
#
|
49
|
+
# version_path_separator = :
|
50
|
+
# version_path_separator = ;
|
51
|
+
# version_path_separator = space
|
52
|
+
version_path_separator = os # Use os.pathsep. Default configuration used for new projects.
|
53
|
+
|
54
|
+
# set to 'true' to search source files recursively
|
55
|
+
# in each "version_locations" directory
|
56
|
+
# new in Alembic version 1.10
|
57
|
+
# recursive_version_locations = false
|
58
|
+
|
59
|
+
# the output encoding used when revision files
|
60
|
+
# are written from script.py.mako
|
61
|
+
# output_encoding = utf-8
|
62
|
+
|
63
|
+
sqlalchemy.url =
|
64
|
+
|
65
|
+
|
66
|
+
[post_write_hooks]
|
67
|
+
# post_write_hooks defines scripts or Python functions that are run
|
68
|
+
# on newly generated revision scripts. See the documentation for further
|
69
|
+
# detail and examples
|
70
|
+
|
71
|
+
# format using "black" - use the console_scripts runner, against the "black" entrypoint
|
72
|
+
# hooks = black
|
73
|
+
# black.type = console_scripts
|
74
|
+
# black.entrypoint = black
|
75
|
+
# black.options = -l 79 REVISION_SCRIPT_FILENAME
|
76
|
+
|
77
|
+
# Logging configuration
|
78
|
+
[loggers]
|
79
|
+
keys = root,sqlalchemy,alembic
|
80
|
+
|
81
|
+
[handlers]
|
82
|
+
keys = console
|
83
|
+
|
84
|
+
[formatters]
|
85
|
+
keys = generic
|
86
|
+
|
87
|
+
[logger_root]
|
88
|
+
level = WARN
|
89
|
+
handlers = console
|
90
|
+
qualname =
|
91
|
+
|
92
|
+
[logger_sqlalchemy]
|
93
|
+
level = WARN
|
94
|
+
handlers =
|
95
|
+
qualname = sqlalchemy.engine
|
96
|
+
|
97
|
+
[logger_alembic]
|
98
|
+
level = INFO
|
99
|
+
handlers =
|
100
|
+
qualname = alembic
|
101
|
+
|
102
|
+
[handler_console]
|
103
|
+
class = StreamHandler
|
104
|
+
args = (sys.stderr,)
|
105
|
+
level = NOTSET
|
106
|
+
formatter = generic
|
107
|
+
|
108
|
+
[formatter_generic]
|
109
|
+
format = %(levelname)-5.5s [%(name)s] %(message)s
|
110
|
+
datefmt = %H:%M:%S
|
@@ -0,0 +1,76 @@
|
|
1
|
+
from logging.config import fileConfig
|
2
|
+
|
3
|
+
from alembic import context
|
4
|
+
from sqlalchemy import engine_from_config, pool
|
5
|
+
|
6
|
+
from mlflow.server.auth.db.models import Base
|
7
|
+
|
8
|
+
# this is the Alembic Config object, which provides
|
9
|
+
# access to the values within the .ini file in use.
|
10
|
+
config = context.config
|
11
|
+
|
12
|
+
# Interpret the config file for Python logging.
|
13
|
+
# This line sets up loggers basically.
|
14
|
+
if config.config_file_name is not None:
|
15
|
+
fileConfig(config.config_file_name)
|
16
|
+
|
17
|
+
# add your model's MetaData object here
|
18
|
+
# for 'autogenerate' support
|
19
|
+
# from myapp import mymodel
|
20
|
+
# target_metadata = mymodel.Base.metadata
|
21
|
+
target_metadata = Base.metadata
|
22
|
+
|
23
|
+
# other values from the config, defined by the needs of env.py,
|
24
|
+
# can be acquired:
|
25
|
+
# my_important_option = config.get_main_option("my_important_option")
|
26
|
+
# ... etc.
|
27
|
+
|
28
|
+
|
29
|
+
def run_migrations_offline() -> None:
|
30
|
+
"""Run migrations in 'offline' mode.
|
31
|
+
|
32
|
+
This configures the context with just a URL
|
33
|
+
and not an Engine, though an Engine is acceptable
|
34
|
+
here as well. By skipping the Engine creation
|
35
|
+
we don't even need a DBAPI to be available.
|
36
|
+
|
37
|
+
Calls to context.execute() here emit the given string to the
|
38
|
+
script output.
|
39
|
+
|
40
|
+
"""
|
41
|
+
url = config.get_main_option("sqlalchemy.url")
|
42
|
+
context.configure(
|
43
|
+
url=url,
|
44
|
+
target_metadata=target_metadata,
|
45
|
+
literal_binds=True,
|
46
|
+
dialect_opts={"paramstyle": "named"},
|
47
|
+
)
|
48
|
+
|
49
|
+
with context.begin_transaction():
|
50
|
+
context.run_migrations()
|
51
|
+
|
52
|
+
|
53
|
+
def run_migrations_online() -> None:
|
54
|
+
"""Run migrations in 'online' mode.
|
55
|
+
|
56
|
+
In this scenario we need to create an Engine
|
57
|
+
and associate a connection with the context.
|
58
|
+
|
59
|
+
"""
|
60
|
+
connectable = engine_from_config(
|
61
|
+
config.get_section(config.config_ini_section, {}),
|
62
|
+
prefix="sqlalchemy.",
|
63
|
+
poolclass=pool.NullPool,
|
64
|
+
)
|
65
|
+
|
66
|
+
with connectable.connect() as connection:
|
67
|
+
context.configure(connection=connection, target_metadata=target_metadata)
|
68
|
+
|
69
|
+
with context.begin_transaction():
|
70
|
+
context.run_migrations()
|
71
|
+
|
72
|
+
|
73
|
+
if context.is_offline_mode():
|
74
|
+
run_migrations_offline()
|
75
|
+
else:
|
76
|
+
run_migrations_online()
|
@@ -0,0 +1,51 @@
|
|
1
|
+
"""initial_migration
|
2
|
+
|
3
|
+
Revision ID: 8606fa83a998
|
4
|
+
Revises:
|
5
|
+
Create Date: 2023-07-07 23:30:50.921970
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
import sqlalchemy as sa
|
10
|
+
from alembic import op
|
11
|
+
|
12
|
+
# revision identifiers, used by Alembic.
|
13
|
+
revision = "8606fa83a998"
|
14
|
+
down_revision = None
|
15
|
+
branch_labels = None
|
16
|
+
depends_on = None
|
17
|
+
|
18
|
+
|
19
|
+
def upgrade() -> None:
|
20
|
+
op.create_table(
|
21
|
+
"users",
|
22
|
+
sa.Column("id", sa.Integer(), nullable=False, primary_key=True),
|
23
|
+
sa.Column("username", sa.String(length=255), nullable=True),
|
24
|
+
sa.Column("password_hash", sa.String(length=255), nullable=True),
|
25
|
+
sa.Column("is_admin", sa.Boolean(), nullable=True),
|
26
|
+
sa.UniqueConstraint("username"),
|
27
|
+
)
|
28
|
+
op.create_table(
|
29
|
+
"experiment_permissions",
|
30
|
+
sa.Column("id", sa.Integer(), nullable=False, primary_key=True),
|
31
|
+
sa.Column("experiment_id", sa.String(length=255), nullable=False),
|
32
|
+
sa.Column("user_id", sa.Integer(), nullable=False),
|
33
|
+
sa.Column("permission", sa.String(length=255), nullable=True),
|
34
|
+
sa.ForeignKeyConstraint(["user_id"], ["users.id"], name="fk_user_id"),
|
35
|
+
sa.UniqueConstraint("experiment_id", "user_id", name="unique_experiment_user"),
|
36
|
+
)
|
37
|
+
op.create_table(
|
38
|
+
"registered_model_permissions",
|
39
|
+
sa.Column("id", sa.Integer(), nullable=False, primary_key=True),
|
40
|
+
sa.Column("name", sa.String(length=255), nullable=False),
|
41
|
+
sa.Column("user_id", sa.Integer(), nullable=False),
|
42
|
+
sa.Column("permission", sa.String(length=255), nullable=True),
|
43
|
+
sa.ForeignKeyConstraint(["user_id"], ["users.id"], name="fk_user_id"),
|
44
|
+
sa.UniqueConstraint("name", "user_id", name="unique_name_user"),
|
45
|
+
)
|
46
|
+
|
47
|
+
|
48
|
+
def downgrade() -> None:
|
49
|
+
op.drop_table("registered_model_permissions")
|
50
|
+
op.drop_table("experiment_permissions")
|
51
|
+
op.drop_table("users")
|
File without changes
|
@@ -0,0 +1,67 @@
|
|
1
|
+
from sqlalchemy import (
|
2
|
+
Boolean,
|
3
|
+
Column,
|
4
|
+
ForeignKey,
|
5
|
+
Integer,
|
6
|
+
String,
|
7
|
+
UniqueConstraint,
|
8
|
+
)
|
9
|
+
from sqlalchemy.orm import declarative_base, relationship
|
10
|
+
|
11
|
+
from mlflow.server.auth.entities import ExperimentPermission, RegisteredModelPermission, User
|
12
|
+
|
13
|
+
Base = declarative_base()
|
14
|
+
|
15
|
+
|
16
|
+
class SqlUser(Base):
|
17
|
+
__tablename__ = "users"
|
18
|
+
id = Column(Integer(), primary_key=True)
|
19
|
+
username = Column(String(255), unique=True)
|
20
|
+
password_hash = Column(String(255))
|
21
|
+
is_admin = Column(Boolean, default=False)
|
22
|
+
experiment_permissions = relationship("SqlExperimentPermission", backref="users")
|
23
|
+
registered_model_permissions = relationship("SqlRegisteredModelPermission", backref="users")
|
24
|
+
|
25
|
+
def to_mlflow_entity(self):
|
26
|
+
return User(
|
27
|
+
id_=self.id,
|
28
|
+
username=self.username,
|
29
|
+
password_hash=self.password_hash,
|
30
|
+
is_admin=self.is_admin,
|
31
|
+
experiment_permissions=[p.to_mlflow_entity() for p in self.experiment_permissions],
|
32
|
+
registered_model_permissions=[
|
33
|
+
p.to_mlflow_entity() for p in self.registered_model_permissions
|
34
|
+
],
|
35
|
+
)
|
36
|
+
|
37
|
+
|
38
|
+
class SqlExperimentPermission(Base):
|
39
|
+
__tablename__ = "experiment_permissions"
|
40
|
+
id = Column(Integer(), primary_key=True)
|
41
|
+
experiment_id = Column(String(255), nullable=False)
|
42
|
+
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
43
|
+
permission = Column(String(255))
|
44
|
+
__table_args__ = (UniqueConstraint("experiment_id", "user_id", name="unique_experiment_user"),)
|
45
|
+
|
46
|
+
def to_mlflow_entity(self):
|
47
|
+
return ExperimentPermission(
|
48
|
+
experiment_id=self.experiment_id,
|
49
|
+
user_id=self.user_id,
|
50
|
+
permission=self.permission,
|
51
|
+
)
|
52
|
+
|
53
|
+
|
54
|
+
class SqlRegisteredModelPermission(Base):
|
55
|
+
__tablename__ = "registered_model_permissions"
|
56
|
+
id = Column(Integer(), primary_key=True)
|
57
|
+
name = Column(String(255), nullable=False)
|
58
|
+
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
59
|
+
permission = Column(String(255))
|
60
|
+
__table_args__ = (UniqueConstraint("name", "user_id", name="unique_name_user"),)
|
61
|
+
|
62
|
+
def to_mlflow_entity(self):
|
63
|
+
return RegisteredModelPermission(
|
64
|
+
name=self.name,
|
65
|
+
user_id=self.user_id,
|
66
|
+
permission=self.permission,
|
67
|
+
)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
from alembic.command import upgrade
|
4
|
+
from alembic.config import Config
|
5
|
+
from alembic.migration import MigrationContext
|
6
|
+
from alembic.script import ScriptDirectory
|
7
|
+
from sqlalchemy.engine.base import Engine
|
8
|
+
|
9
|
+
|
10
|
+
def _get_alembic_dir() -> str:
|
11
|
+
return Path(__file__).parent / "migrations"
|
12
|
+
|
13
|
+
|
14
|
+
def _get_alembic_config(url: str) -> Config:
|
15
|
+
alembic_dir = _get_alembic_dir()
|
16
|
+
alembic_ini_path = alembic_dir / "alembic.ini"
|
17
|
+
alembic_cfg = Config(alembic_ini_path)
|
18
|
+
alembic_cfg.set_main_option("script_location", str(alembic_dir))
|
19
|
+
url = url.replace("%", "%%") # Same as here: https://github.com/mlflow/mlflow/issues/1487
|
20
|
+
alembic_cfg.set_main_option("sqlalchemy.url", url)
|
21
|
+
return alembic_cfg
|
22
|
+
|
23
|
+
|
24
|
+
def migrate(engine: Engine, revision: str) -> None:
|
25
|
+
alembic_cfg = _get_alembic_config(engine.url.render_as_string(hide_password=False))
|
26
|
+
with engine.begin() as conn:
|
27
|
+
alembic_cfg.attributes["connection"] = conn
|
28
|
+
upgrade(alembic_cfg, revision)
|
29
|
+
|
30
|
+
|
31
|
+
def migrate_if_needed(engine: Engine, revision: str) -> None:
|
32
|
+
alembic_cfg = _get_alembic_config(engine.url.render_as_string(hide_password=False))
|
33
|
+
script_dir = ScriptDirectory.from_config(alembic_cfg)
|
34
|
+
with engine.begin() as conn:
|
35
|
+
context = MigrationContext.configure(conn)
|
36
|
+
if context.get_current_revision() != script_dir.get_current_head():
|
37
|
+
upgrade(alembic_cfg, revision)
|
@@ -0,0 +1,165 @@
|
|
1
|
+
class User:
|
2
|
+
def __init__(
|
3
|
+
self,
|
4
|
+
id_,
|
5
|
+
username,
|
6
|
+
password_hash,
|
7
|
+
is_admin,
|
8
|
+
experiment_permissions=None,
|
9
|
+
registered_model_permissions=None,
|
10
|
+
):
|
11
|
+
self._id = id_
|
12
|
+
self._username = username
|
13
|
+
self._password_hash = password_hash
|
14
|
+
self._is_admin = is_admin
|
15
|
+
self._experiment_permissions = experiment_permissions
|
16
|
+
self._registered_model_permissions = registered_model_permissions
|
17
|
+
|
18
|
+
@property
|
19
|
+
def id(self):
|
20
|
+
return self._id
|
21
|
+
|
22
|
+
@property
|
23
|
+
def username(self):
|
24
|
+
return self._username
|
25
|
+
|
26
|
+
@property
|
27
|
+
def password_hash(self):
|
28
|
+
return self._password_hash
|
29
|
+
|
30
|
+
@property
|
31
|
+
def is_admin(self):
|
32
|
+
return self._is_admin
|
33
|
+
|
34
|
+
@is_admin.setter
|
35
|
+
def is_admin(self, is_admin):
|
36
|
+
self._is_admin = is_admin
|
37
|
+
|
38
|
+
@property
|
39
|
+
def experiment_permissions(self):
|
40
|
+
return self._experiment_permissions
|
41
|
+
|
42
|
+
@experiment_permissions.setter
|
43
|
+
def experiment_permissions(self, experiment_permissions):
|
44
|
+
self._experiment_permissions = experiment_permissions
|
45
|
+
|
46
|
+
@property
|
47
|
+
def registered_model_permissions(self):
|
48
|
+
return self._registered_model_permissions
|
49
|
+
|
50
|
+
@registered_model_permissions.setter
|
51
|
+
def registered_model_permissions(self, registered_model_permissions):
|
52
|
+
self._registered_model_permissions = registered_model_permissions
|
53
|
+
|
54
|
+
def to_json(self):
|
55
|
+
return {
|
56
|
+
"id": self.id,
|
57
|
+
"username": self.username,
|
58
|
+
"is_admin": self.is_admin,
|
59
|
+
"experiment_permissions": [p.to_json() for p in self.experiment_permissions],
|
60
|
+
"registered_model_permissions": [
|
61
|
+
p.to_json() for p in self.registered_model_permissions
|
62
|
+
],
|
63
|
+
}
|
64
|
+
|
65
|
+
@classmethod
|
66
|
+
def from_json(cls, dictionary):
|
67
|
+
return cls(
|
68
|
+
id_=dictionary["id"],
|
69
|
+
username=dictionary["username"],
|
70
|
+
password_hash="REDACTED",
|
71
|
+
is_admin=dictionary["is_admin"],
|
72
|
+
experiment_permissions=[
|
73
|
+
ExperimentPermission.from_json(p) for p in dictionary["experiment_permissions"]
|
74
|
+
],
|
75
|
+
registered_model_permissions=[
|
76
|
+
RegisteredModelPermission.from_json(p)
|
77
|
+
for p in dictionary["registered_model_permissions"]
|
78
|
+
],
|
79
|
+
)
|
80
|
+
|
81
|
+
|
82
|
+
class ExperimentPermission:
|
83
|
+
def __init__(
|
84
|
+
self,
|
85
|
+
experiment_id,
|
86
|
+
user_id,
|
87
|
+
permission,
|
88
|
+
):
|
89
|
+
self._experiment_id = experiment_id
|
90
|
+
self._user_id = user_id
|
91
|
+
self._permission = permission
|
92
|
+
|
93
|
+
@property
|
94
|
+
def experiment_id(self):
|
95
|
+
return self._experiment_id
|
96
|
+
|
97
|
+
@property
|
98
|
+
def user_id(self):
|
99
|
+
return self._user_id
|
100
|
+
|
101
|
+
@property
|
102
|
+
def permission(self):
|
103
|
+
return self._permission
|
104
|
+
|
105
|
+
@permission.setter
|
106
|
+
def permission(self, permission):
|
107
|
+
self._permission = permission
|
108
|
+
|
109
|
+
def to_json(self):
|
110
|
+
return {
|
111
|
+
"experiment_id": self.experiment_id,
|
112
|
+
"user_id": self.user_id,
|
113
|
+
"permission": self.permission,
|
114
|
+
}
|
115
|
+
|
116
|
+
@classmethod
|
117
|
+
def from_json(cls, dictionary):
|
118
|
+
return cls(
|
119
|
+
experiment_id=dictionary["experiment_id"],
|
120
|
+
user_id=dictionary["user_id"],
|
121
|
+
permission=dictionary["permission"],
|
122
|
+
)
|
123
|
+
|
124
|
+
|
125
|
+
class RegisteredModelPermission:
|
126
|
+
def __init__(
|
127
|
+
self,
|
128
|
+
name,
|
129
|
+
user_id,
|
130
|
+
permission,
|
131
|
+
):
|
132
|
+
self._name = name
|
133
|
+
self._user_id = user_id
|
134
|
+
self._permission = permission
|
135
|
+
|
136
|
+
@property
|
137
|
+
def name(self):
|
138
|
+
return self._name
|
139
|
+
|
140
|
+
@property
|
141
|
+
def user_id(self):
|
142
|
+
return self._user_id
|
143
|
+
|
144
|
+
@property
|
145
|
+
def permission(self):
|
146
|
+
return self._permission
|
147
|
+
|
148
|
+
@permission.setter
|
149
|
+
def permission(self, permission):
|
150
|
+
self._permission = permission
|
151
|
+
|
152
|
+
def to_json(self):
|
153
|
+
return {
|
154
|
+
"name": self.name,
|
155
|
+
"user_id": self.user_id,
|
156
|
+
"permission": self.permission,
|
157
|
+
}
|
158
|
+
|
159
|
+
@classmethod
|
160
|
+
def from_json(cls, dictionary):
|
161
|
+
return cls(
|
162
|
+
name=dictionary["name"],
|
163
|
+
user_id=dictionary["user_id"],
|
164
|
+
permission=dictionary["permission"],
|
165
|
+
)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# ruff: noqa: E501
|
2
|
+
MLFLOW_LOGO = """
|
3
|
+
<svg width="109" height="40" viewBox="0 0 109 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
4
|
+
<path d="M0 31.0316V15.5024H3.54258V17.4699C4.43636 15.8756 6.38278 15.045 8.13589 15.045C10.178 15.045 11.9636 15.9713 12.7943 17.7895C14.0096 15.7474 15.8278 15.045 17.8373 15.045C20.6469 15.045 23.3263 16.8325 23.3263 20.9493V31.0316H19.7531V21.5541C19.7531 19.7359 18.8268 18.3636 16.7522 18.3636C14.8057 18.3636 13.5292 19.8947 13.5292 21.8086V31.0297H9.89282V21.5541C9.89282 19.7684 8.99522 18.3732 6.88995 18.3732C4.91292 18.3732 3.66699 19.8412 3.66699 21.8182V31.0392Z" fill="#333333"/>
|
5
|
+
<path d="M27.8546 31.0316V7.92917H31.5579V31.0316Z" fill="#333333"/>
|
6
|
+
<path d="M30.0708 39.4871C30.9033 39.7187 31.6517 39.8699 33.2402 39.8699C36.1933 39.8699 39.6765 38.2048 40.5933 33.5311L44.3789 14.7923H50.0076L50.6947 11.6746H45.0086L45.7741 7.95023C46.3598 5.05837 47.9598 3.59234 50.5282 3.59234C51.1962 3.59234 51.0086 3.64975 51.6038 3.76267L52.4268 0.570327C51.6344 0.333006 50.9244 0.191379 49.378 0.191379C47.7454 0.166831 46.1514 0.688934 44.8497 1.67463C43.4086 2.78851 42.4574 4.42487 42.023 6.53779L40.9569 11.6746H35.9234L35.5119 14.7943H40.3349L36.8593 32.1206C36.4765 34.0861 35.3588 36.4364 32.1512 36.4364C31.4239 36.4364 31.688 36.3809 31.0297 36.2737Z" fill="#0194E2"/>
|
7
|
+
<path d="M53.3416 30.9053H49.6402L54.7139 7.59616H58.4153Z" fill="#0194E2"/>
|
8
|
+
<path d="M71.8067 16.4766C68.5762 14.2161 64.1778 14.6606 61.4649 17.5216C58.7519 20.3826 58.5416 24.7984 60.9703 27.9043L63.3952 26.1244C62.1915 24.6312 61.9471 22.5815 62.7658 20.8471C63.5845 19.1127 65.3224 17.9987 67.2402 17.979V19.8737Z" fill="#43C9ED"/>
|
9
|
+
<path d="M62.6179 29.4717C65.8484 31.7322 70.2468 31.2877 72.9597 28.4267C75.6727 25.5657 75.883 21.1499 73.4543 18.044L71.0294 19.8239C72.2331 21.3171 72.4775 23.3668 71.6588 25.1012C70.8401 26.8356 69.1022 27.9496 67.1844 27.9693V26.0746Z" fill="#0194E2"/>
|
10
|
+
<path d="M78.0919 15.4928H82.1359L82.9588 26.1053L88.7177 15.4928L92.5569 15.5483L94.0651 26.1053L99.1387 15.4928L102.84 15.5483L95.1617 31.0412H91.4603L89.6765 19.9349L83.7818 31.0412H79.9426Z" fill="#0194E2"/>
|
11
|
+
<path d="M105.072 15.7684H104.306V15.5024H106.151V15.7741H105.386V18.0172H105.072Z" fill="#0194E2"/>
|
12
|
+
<path d="M106.614 15.5024H106.997L107.479 16.8421C107.541 17.0143 107.598 17.1904 107.657 17.3665H107.675C107.734 17.1904 107.788 17.0143 107.847 16.8421L108.325 15.5024H108.708V18.0172H108.41V16.6297C108.41 16.4096 108.434 16.1072 108.45 15.8832H108.434L108.243 16.4574L107.768 17.7608H107.56L107.079 16.4593L106.888 15.8852H106.873C106.89 16.1091 106.915 16.4115 106.915 16.6316V18.0191H106.624Z" fill="#0194E2"/>
|
13
|
+
</svg>
|
14
|
+
"""
|
@@ -0,0 +1,65 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
|
3
|
+
from mlflow import MlflowException
|
4
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
5
|
+
|
6
|
+
|
7
|
+
@dataclass
|
8
|
+
class Permission:
|
9
|
+
name: str
|
10
|
+
can_read: bool
|
11
|
+
can_update: bool
|
12
|
+
can_delete: bool
|
13
|
+
can_manage: bool
|
14
|
+
|
15
|
+
|
16
|
+
READ = Permission(
|
17
|
+
name="READ",
|
18
|
+
can_read=True,
|
19
|
+
can_update=False,
|
20
|
+
can_delete=False,
|
21
|
+
can_manage=False,
|
22
|
+
)
|
23
|
+
|
24
|
+
EDIT = Permission(
|
25
|
+
name="EDIT",
|
26
|
+
can_read=True,
|
27
|
+
can_update=True,
|
28
|
+
can_delete=False,
|
29
|
+
can_manage=False,
|
30
|
+
)
|
31
|
+
|
32
|
+
MANAGE = Permission(
|
33
|
+
name="MANAGE",
|
34
|
+
can_read=True,
|
35
|
+
can_update=True,
|
36
|
+
can_delete=True,
|
37
|
+
can_manage=True,
|
38
|
+
)
|
39
|
+
|
40
|
+
NO_PERMISSIONS = Permission(
|
41
|
+
name="NO_PERMISSIONS",
|
42
|
+
can_read=False,
|
43
|
+
can_update=False,
|
44
|
+
can_delete=False,
|
45
|
+
can_manage=False,
|
46
|
+
)
|
47
|
+
|
48
|
+
ALL_PERMISSIONS = {
|
49
|
+
READ.name: READ,
|
50
|
+
EDIT.name: EDIT,
|
51
|
+
MANAGE.name: MANAGE,
|
52
|
+
NO_PERMISSIONS.name: NO_PERMISSIONS,
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
def get_permission(permission: str) -> Permission:
|
57
|
+
return ALL_PERMISSIONS[permission]
|
58
|
+
|
59
|
+
|
60
|
+
def _validate_permission(permission: str):
|
61
|
+
if permission not in ALL_PERMISSIONS:
|
62
|
+
raise MlflowException(
|
63
|
+
f"Invalid permission '{permission}'. Valid permissions are: {tuple(ALL_PERMISSIONS)}",
|
64
|
+
INVALID_PARAMETER_VALUE,
|
65
|
+
)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from mlflow.server.handlers import _get_rest_path
|
2
|
+
|
3
|
+
HOME = "/"
|
4
|
+
SIGNUP = "/signup"
|
5
|
+
CREATE_USER = _get_rest_path("/mlflow/users/create")
|
6
|
+
CREATE_USER_UI = _get_rest_path("/mlflow/users/create-ui")
|
7
|
+
GET_USER = _get_rest_path("/mlflow/users/get")
|
8
|
+
UPDATE_USER_PASSWORD = _get_rest_path("/mlflow/users/update-password")
|
9
|
+
UPDATE_USER_ADMIN = _get_rest_path("/mlflow/users/update-admin")
|
10
|
+
DELETE_USER = _get_rest_path("/mlflow/users/delete")
|
11
|
+
CREATE_EXPERIMENT_PERMISSION = _get_rest_path("/mlflow/experiments/permissions/create")
|
12
|
+
GET_EXPERIMENT_PERMISSION = _get_rest_path("/mlflow/experiments/permissions/get")
|
13
|
+
UPDATE_EXPERIMENT_PERMISSION = _get_rest_path("/mlflow/experiments/permissions/update")
|
14
|
+
DELETE_EXPERIMENT_PERMISSION = _get_rest_path("/mlflow/experiments/permissions/delete")
|
15
|
+
CREATE_REGISTERED_MODEL_PERMISSION = _get_rest_path("/mlflow/registered-models/permissions/create")
|
16
|
+
GET_REGISTERED_MODEL_PERMISSION = _get_rest_path("/mlflow/registered-models/permissions/get")
|
17
|
+
UPDATE_REGISTERED_MODEL_PERMISSION = _get_rest_path("/mlflow/registered-models/permissions/update")
|
18
|
+
DELETE_REGISTERED_MODEL_PERMISSION = _get_rest_path("/mlflow/registered-models/permissions/delete")
|