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,673 @@
|
|
1
|
+
import base64
|
2
|
+
import json
|
3
|
+
import logging
|
4
|
+
import random
|
5
|
+
import time
|
6
|
+
import warnings
|
7
|
+
from functools import lru_cache
|
8
|
+
from typing import Any, Callable
|
9
|
+
|
10
|
+
import requests
|
11
|
+
|
12
|
+
from mlflow.environment_variables import (
|
13
|
+
_MLFLOW_HTTP_REQUEST_MAX_BACKOFF_FACTOR_LIMIT,
|
14
|
+
_MLFLOW_HTTP_REQUEST_MAX_RETRIES_LIMIT,
|
15
|
+
MLFLOW_DATABRICKS_ENDPOINT_HTTP_RETRY_TIMEOUT,
|
16
|
+
MLFLOW_ENABLE_DB_SDK,
|
17
|
+
MLFLOW_HTTP_REQUEST_BACKOFF_FACTOR,
|
18
|
+
MLFLOW_HTTP_REQUEST_BACKOFF_JITTER,
|
19
|
+
MLFLOW_HTTP_REQUEST_MAX_RETRIES,
|
20
|
+
MLFLOW_HTTP_REQUEST_TIMEOUT,
|
21
|
+
MLFLOW_HTTP_RESPECT_RETRY_AFTER_HEADER,
|
22
|
+
)
|
23
|
+
from mlflow.exceptions import (
|
24
|
+
CUSTOMER_UNAUTHORIZED,
|
25
|
+
ERROR_CODE_TO_HTTP_STATUS,
|
26
|
+
INVALID_PARAMETER_VALUE,
|
27
|
+
InvalidUrlException,
|
28
|
+
MlflowException,
|
29
|
+
RestException,
|
30
|
+
get_error_code,
|
31
|
+
)
|
32
|
+
from mlflow.protos import databricks_pb2
|
33
|
+
from mlflow.protos.databricks_pb2 import ENDPOINT_NOT_FOUND, ErrorCode
|
34
|
+
from mlflow.utils.proto_json_utils import parse_dict
|
35
|
+
from mlflow.utils.request_utils import (
|
36
|
+
_TRANSIENT_FAILURE_RESPONSE_CODES,
|
37
|
+
_get_http_response_with_retries,
|
38
|
+
augmented_raise_for_status, # noqa: F401
|
39
|
+
cloud_storage_http_request, # noqa: F401
|
40
|
+
)
|
41
|
+
from mlflow.utils.string_utils import strip_suffix
|
42
|
+
|
43
|
+
_logger = logging.getLogger(__name__)
|
44
|
+
|
45
|
+
RESOURCE_NON_EXISTENT = "RESOURCE_DOES_NOT_EXIST"
|
46
|
+
_REST_API_PATH_PREFIX = "/api/2.0"
|
47
|
+
_UC_OSS_REST_API_PATH_PREFIX = "/api/2.1"
|
48
|
+
_TRACE_REST_API_PATH_PREFIX = f"{_REST_API_PATH_PREFIX}/mlflow/traces"
|
49
|
+
_V3_REST_API_PATH_PREFIX = "/api/3.0"
|
50
|
+
_V3_TRACE_REST_API_PATH_PREFIX = f"{_V3_REST_API_PATH_PREFIX}/mlflow/traces"
|
51
|
+
_ARMERIA_OK = "200 OK"
|
52
|
+
_DATABRICKS_SDK_RETRY_AFTER_SECS_DEPRECATION_WARNING = (
|
53
|
+
"The 'retry_after_secs' parameter of DatabricksError is deprecated"
|
54
|
+
)
|
55
|
+
|
56
|
+
|
57
|
+
def http_request(
|
58
|
+
host_creds,
|
59
|
+
endpoint,
|
60
|
+
method,
|
61
|
+
max_retries=None,
|
62
|
+
backoff_factor=None,
|
63
|
+
backoff_jitter=None,
|
64
|
+
extra_headers=None,
|
65
|
+
retry_codes=_TRANSIENT_FAILURE_RESPONSE_CODES,
|
66
|
+
timeout=None,
|
67
|
+
raise_on_status=True,
|
68
|
+
respect_retry_after_header=None,
|
69
|
+
retry_timeout_seconds=None,
|
70
|
+
**kwargs,
|
71
|
+
):
|
72
|
+
"""Makes an HTTP request with the specified method to the specified hostname/endpoint. Transient
|
73
|
+
errors such as Rate-limited (429), service unavailable (503) and internal error (500) are
|
74
|
+
retried with an exponential back off with backoff_factor * (1, 2, 4, ... seconds).
|
75
|
+
The function parses the API response (assumed to be JSON) into a Python object and returns it.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
host_creds: A :py:class:`mlflow.rest_utils.MlflowHostCreds` object containing
|
79
|
+
hostname and optional authentication.
|
80
|
+
endpoint: A string for service endpoint, e.g. "/path/to/object".
|
81
|
+
method: A string indicating the method to use, e.g. "GET", "POST", "PUT".
|
82
|
+
max_retries: Maximum number of retries before throwing an exception.
|
83
|
+
backoff_factor: A time factor for exponential backoff. e.g. value 5 means the HTTP
|
84
|
+
request will be retried with interval 5, 10, 20... seconds. A value of 0 turns off the
|
85
|
+
exponential backoff.
|
86
|
+
backoff_jitter: A random jitter to add to the backoff interval.
|
87
|
+
extra_headers: A dict of HTTP header name-value pairs to be included in the request.
|
88
|
+
retry_codes: A list of HTTP response error codes that qualifies for retry.
|
89
|
+
timeout: Wait for timeout seconds for response from remote server for connect and
|
90
|
+
read request.
|
91
|
+
raise_on_status: Whether to raise an exception, or return a response, if status falls
|
92
|
+
in retry_codes range and retries have been exhausted.
|
93
|
+
respect_retry_after_header: Whether to respect Retry-After header on status codes defined
|
94
|
+
as Retry.RETRY_AFTER_STATUS_CODES or not.
|
95
|
+
retry_timeout_seconds: Timeout for retires. Only effective when using Databricks SDK.
|
96
|
+
kwargs: Additional keyword arguments to pass to `requests.Session.request()`
|
97
|
+
|
98
|
+
Returns:
|
99
|
+
requests.Response object.
|
100
|
+
"""
|
101
|
+
cleaned_hostname = strip_suffix(host_creds.host, "/")
|
102
|
+
url = f"{cleaned_hostname}{endpoint}"
|
103
|
+
|
104
|
+
# Set defaults for retry parameters from environment variables if not specified
|
105
|
+
max_retries = MLFLOW_HTTP_REQUEST_MAX_RETRIES.get() if max_retries is None else max_retries
|
106
|
+
backoff_factor = (
|
107
|
+
MLFLOW_HTTP_REQUEST_BACKOFF_FACTOR.get() if backoff_factor is None else backoff_factor
|
108
|
+
)
|
109
|
+
backoff_jitter = (
|
110
|
+
MLFLOW_HTTP_REQUEST_BACKOFF_JITTER.get() if backoff_jitter is None else backoff_jitter
|
111
|
+
)
|
112
|
+
|
113
|
+
if host_creds.use_databricks_sdk:
|
114
|
+
from databricks.sdk.errors import DatabricksError
|
115
|
+
|
116
|
+
ws_client = get_workspace_client(
|
117
|
+
host_creds.use_secret_scope_token,
|
118
|
+
host_creds.host,
|
119
|
+
host_creds.token,
|
120
|
+
host_creds.databricks_auth_profile,
|
121
|
+
retry_timeout_seconds=retry_timeout_seconds,
|
122
|
+
)
|
123
|
+
|
124
|
+
def make_sdk_call():
|
125
|
+
# Databricks SDK `APIClient.do` API is for making request using
|
126
|
+
# HTTP
|
127
|
+
# https://github.com/databricks/databricks-sdk-py/blob/a714146d9c155dd1e3567475be78623f72028ee0/databricks/sdk/core.py#L134
|
128
|
+
# suppress the warning due to https://github.com/databricks/databricks-sdk-py/issues/963
|
129
|
+
with warnings.catch_warnings():
|
130
|
+
warnings.filterwarnings(
|
131
|
+
"ignore", message=f".*{_DATABRICKS_SDK_RETRY_AFTER_SECS_DEPRECATION_WARNING}.*"
|
132
|
+
)
|
133
|
+
raw_response = ws_client.api_client.do(
|
134
|
+
method=method,
|
135
|
+
path=endpoint,
|
136
|
+
headers=extra_headers,
|
137
|
+
raw=True,
|
138
|
+
query=kwargs.get("params"),
|
139
|
+
body=kwargs.get("json"),
|
140
|
+
files=kwargs.get("files"),
|
141
|
+
data=kwargs.get("data"),
|
142
|
+
)
|
143
|
+
return raw_response["contents"]._response
|
144
|
+
|
145
|
+
try:
|
146
|
+
# We retry the SDK call with exponential backoff because the Databricks SDK default
|
147
|
+
# retry behavior does not handle all transient errors that we want to retry, and it
|
148
|
+
# does not support a customizable retry policy based on HTTP response status codes.
|
149
|
+
# Note that, in uncommon cases (due to the limited set if HTTP status codes and
|
150
|
+
# response strings that Databricks SDK retries on), the SDK may retry internally,
|
151
|
+
# and MLflow may retry on top of that, leading to more retries than specified by
|
152
|
+
# `max_retries`. This is acceptable, given the enforcement of an overall request
|
153
|
+
# timeout via `retry_timeout_seconds`.
|
154
|
+
#
|
155
|
+
# TODO: Update transient error handling defaults in Databricks SDK to match standard
|
156
|
+
# practices (e.g. retrying on 429, 500, 503, etc.), support custom retries in Databricks
|
157
|
+
# SDK, and remove this custom retry wrapper from MLflow
|
158
|
+
return _retry_databricks_sdk_call_with_exponential_backoff(
|
159
|
+
call_func=make_sdk_call,
|
160
|
+
retry_codes=retry_codes,
|
161
|
+
retry_timeout_seconds=(
|
162
|
+
retry_timeout_seconds
|
163
|
+
if retry_timeout_seconds is not None
|
164
|
+
else MLFLOW_DATABRICKS_ENDPOINT_HTTP_RETRY_TIMEOUT.get()
|
165
|
+
),
|
166
|
+
backoff_factor=backoff_factor,
|
167
|
+
backoff_jitter=backoff_jitter,
|
168
|
+
max_retries=max_retries,
|
169
|
+
)
|
170
|
+
except DatabricksError as e:
|
171
|
+
response = requests.Response()
|
172
|
+
response.url = url
|
173
|
+
response.status_code = ERROR_CODE_TO_HTTP_STATUS.get(e.error_code, 500)
|
174
|
+
response.reason = str(e)
|
175
|
+
response.encoding = "UTF-8"
|
176
|
+
response._content = json.dumps(
|
177
|
+
{
|
178
|
+
"error_code": e.error_code,
|
179
|
+
"message": str(e),
|
180
|
+
}
|
181
|
+
).encode("UTF-8")
|
182
|
+
return response
|
183
|
+
|
184
|
+
_validate_max_retries(max_retries)
|
185
|
+
_validate_backoff_factor(backoff_factor)
|
186
|
+
respect_retry_after_header = (
|
187
|
+
MLFLOW_HTTP_RESPECT_RETRY_AFTER_HEADER.get()
|
188
|
+
if respect_retry_after_header is None
|
189
|
+
else respect_retry_after_header
|
190
|
+
)
|
191
|
+
|
192
|
+
timeout = MLFLOW_HTTP_REQUEST_TIMEOUT.get() if timeout is None else timeout
|
193
|
+
auth_str = None
|
194
|
+
if host_creds.username and host_creds.password:
|
195
|
+
basic_auth_str = f"{host_creds.username}:{host_creds.password}".encode()
|
196
|
+
auth_str = "Basic " + base64.standard_b64encode(basic_auth_str).decode("utf-8")
|
197
|
+
elif host_creds.token:
|
198
|
+
auth_str = f"Bearer {host_creds.token}"
|
199
|
+
elif host_creds.client_secret:
|
200
|
+
raise MlflowException(
|
201
|
+
"To use OAuth authentication, set environmental variable "
|
202
|
+
f"'{MLFLOW_ENABLE_DB_SDK.name}' to true",
|
203
|
+
error_code=CUSTOMER_UNAUTHORIZED,
|
204
|
+
)
|
205
|
+
|
206
|
+
from mlflow.tracking.request_header.registry import resolve_request_headers
|
207
|
+
|
208
|
+
headers = dict(**resolve_request_headers())
|
209
|
+
if extra_headers:
|
210
|
+
headers = dict(**headers, **extra_headers)
|
211
|
+
|
212
|
+
if auth_str:
|
213
|
+
headers["Authorization"] = auth_str
|
214
|
+
|
215
|
+
if host_creds.client_cert_path is not None:
|
216
|
+
kwargs["cert"] = host_creds.client_cert_path
|
217
|
+
|
218
|
+
if host_creds.aws_sigv4:
|
219
|
+
# will overwrite the Authorization header
|
220
|
+
from requests_auth_aws_sigv4 import AWSSigV4
|
221
|
+
|
222
|
+
kwargs["auth"] = AWSSigV4("execute-api")
|
223
|
+
elif host_creds.auth:
|
224
|
+
from mlflow.tracking.request_auth.registry import fetch_auth
|
225
|
+
|
226
|
+
kwargs["auth"] = fetch_auth(host_creds.auth)
|
227
|
+
|
228
|
+
try:
|
229
|
+
return _get_http_response_with_retries(
|
230
|
+
method,
|
231
|
+
url,
|
232
|
+
max_retries,
|
233
|
+
backoff_factor,
|
234
|
+
backoff_jitter,
|
235
|
+
retry_codes,
|
236
|
+
raise_on_status,
|
237
|
+
headers=headers,
|
238
|
+
verify=host_creds.verify,
|
239
|
+
timeout=timeout,
|
240
|
+
respect_retry_after_header=respect_retry_after_header,
|
241
|
+
**kwargs,
|
242
|
+
)
|
243
|
+
except requests.exceptions.Timeout as to:
|
244
|
+
raise MlflowException(
|
245
|
+
f"API request to {url} failed with timeout exception {to}."
|
246
|
+
" To increase the timeout, set the environment variable "
|
247
|
+
f"{MLFLOW_HTTP_REQUEST_TIMEOUT!s} to a larger value."
|
248
|
+
) from to
|
249
|
+
except requests.exceptions.InvalidURL as iu:
|
250
|
+
raise InvalidUrlException(f"Invalid url: {url}") from iu
|
251
|
+
except Exception as e:
|
252
|
+
raise MlflowException(f"API request to {url} failed with exception {e}")
|
253
|
+
|
254
|
+
|
255
|
+
@lru_cache(maxsize=5)
|
256
|
+
def get_workspace_client(
|
257
|
+
use_secret_scope_token,
|
258
|
+
host,
|
259
|
+
token,
|
260
|
+
databricks_auth_profile,
|
261
|
+
retry_timeout_seconds=None,
|
262
|
+
):
|
263
|
+
from databricks.sdk import WorkspaceClient
|
264
|
+
from databricks.sdk.config import Config
|
265
|
+
|
266
|
+
if use_secret_scope_token:
|
267
|
+
kwargs = {"host": host, "token": token}
|
268
|
+
else:
|
269
|
+
kwargs = {"profile": databricks_auth_profile}
|
270
|
+
config = Config(
|
271
|
+
**kwargs,
|
272
|
+
retry_timeout_seconds=retry_timeout_seconds
|
273
|
+
or MLFLOW_DATABRICKS_ENDPOINT_HTTP_RETRY_TIMEOUT.get(),
|
274
|
+
)
|
275
|
+
# Note: If we use `config` param, all SDK configurations must be set in `config` object.
|
276
|
+
return WorkspaceClient(config=config)
|
277
|
+
|
278
|
+
|
279
|
+
def _can_parse_as_json_object(string):
|
280
|
+
try:
|
281
|
+
return isinstance(json.loads(string), dict)
|
282
|
+
except Exception:
|
283
|
+
return False
|
284
|
+
|
285
|
+
|
286
|
+
def http_request_safe(host_creds, endpoint, method, **kwargs):
|
287
|
+
"""
|
288
|
+
Wrapper around ``http_request`` that also verifies that the request succeeds with code 200.
|
289
|
+
"""
|
290
|
+
response = http_request(host_creds=host_creds, endpoint=endpoint, method=method, **kwargs)
|
291
|
+
return verify_rest_response(response, endpoint)
|
292
|
+
|
293
|
+
|
294
|
+
def verify_rest_response(response, endpoint):
|
295
|
+
"""Verify the return code and format, raise exception if the request was not successful."""
|
296
|
+
# Handle Armeria-specific response case where response text is "200 OK"
|
297
|
+
if response.status_code == 200 and response.text.strip() == _ARMERIA_OK:
|
298
|
+
response._content = b"{}" # Update response content to be an empty JSON dictionary
|
299
|
+
return response
|
300
|
+
|
301
|
+
# Handle non-200 status codes
|
302
|
+
if response.status_code != 200:
|
303
|
+
if _can_parse_as_json_object(response.text):
|
304
|
+
raise RestException(json.loads(response.text))
|
305
|
+
else:
|
306
|
+
base_msg = (
|
307
|
+
f"API request to endpoint {endpoint} "
|
308
|
+
f"failed with error code {response.status_code} != 200"
|
309
|
+
)
|
310
|
+
raise MlflowException(
|
311
|
+
f"{base_msg}. Response body: '{response.text}'",
|
312
|
+
error_code=get_error_code(response.status_code),
|
313
|
+
)
|
314
|
+
|
315
|
+
# Skip validation for endpoints (e.g. DBFS file-download API) which may return a non-JSON
|
316
|
+
# response
|
317
|
+
if endpoint.startswith(_REST_API_PATH_PREFIX) and not _can_parse_as_json_object(response.text):
|
318
|
+
base_msg = (
|
319
|
+
"API request to endpoint was successful but the response body was not "
|
320
|
+
"in a valid JSON format"
|
321
|
+
)
|
322
|
+
raise MlflowException(f"{base_msg}. Response body: '{response.text}'")
|
323
|
+
|
324
|
+
return response
|
325
|
+
|
326
|
+
|
327
|
+
def _validate_max_retries(max_retries):
|
328
|
+
max_retry_limit = _MLFLOW_HTTP_REQUEST_MAX_RETRIES_LIMIT.get()
|
329
|
+
|
330
|
+
if max_retry_limit < 0:
|
331
|
+
raise MlflowException(
|
332
|
+
message=f"The current maximum retry limit is invalid ({max_retry_limit}). "
|
333
|
+
"Cannot be negative.",
|
334
|
+
error_code=INVALID_PARAMETER_VALUE,
|
335
|
+
)
|
336
|
+
if max_retries >= max_retry_limit:
|
337
|
+
raise MlflowException(
|
338
|
+
message=f"The configured max_retries value ({max_retries}) is "
|
339
|
+
f"in excess of the maximum allowable retries ({max_retry_limit})",
|
340
|
+
error_code=INVALID_PARAMETER_VALUE,
|
341
|
+
)
|
342
|
+
|
343
|
+
if max_retries < 0:
|
344
|
+
raise MlflowException(
|
345
|
+
message=f"The max_retries value must be either 0 a positive integer. Got {max_retries}",
|
346
|
+
error_code=INVALID_PARAMETER_VALUE,
|
347
|
+
)
|
348
|
+
|
349
|
+
|
350
|
+
def _validate_backoff_factor(backoff_factor):
|
351
|
+
max_backoff_factor_limit = _MLFLOW_HTTP_REQUEST_MAX_BACKOFF_FACTOR_LIMIT.get()
|
352
|
+
|
353
|
+
if max_backoff_factor_limit < 0:
|
354
|
+
raise MlflowException(
|
355
|
+
message="The current maximum backoff factor limit is invalid "
|
356
|
+
f"({max_backoff_factor_limit}). Cannot be negative.",
|
357
|
+
error_code=INVALID_PARAMETER_VALUE,
|
358
|
+
)
|
359
|
+
|
360
|
+
if backoff_factor >= max_backoff_factor_limit:
|
361
|
+
raise MlflowException(
|
362
|
+
message=f"The configured backoff_factor value ({backoff_factor}) is in excess "
|
363
|
+
"of the maximum allowable backoff_factor limit "
|
364
|
+
f"({max_backoff_factor_limit})",
|
365
|
+
error_code=INVALID_PARAMETER_VALUE,
|
366
|
+
)
|
367
|
+
|
368
|
+
if backoff_factor < 0:
|
369
|
+
raise MlflowException(
|
370
|
+
message="The backoff_factor value must be either 0 a positive integer. "
|
371
|
+
f"Got {backoff_factor}",
|
372
|
+
error_code=INVALID_PARAMETER_VALUE,
|
373
|
+
)
|
374
|
+
|
375
|
+
|
376
|
+
def _time_sleep(seconds: float) -> None:
|
377
|
+
"""
|
378
|
+
This function is specifically mocked in `test_rest_utils.py` to test the backoff logic in
|
379
|
+
isolation. We avoid wrapping `time.sleep` globally to prevent interfering with unrelated sleep
|
380
|
+
calls elsewhere in the codebase or in third-party libraries.
|
381
|
+
"""
|
382
|
+
time.sleep(seconds)
|
383
|
+
|
384
|
+
|
385
|
+
def _retry_databricks_sdk_call_with_exponential_backoff(
|
386
|
+
*,
|
387
|
+
call_func: Callable[..., Any],
|
388
|
+
retry_codes: list[int],
|
389
|
+
retry_timeout_seconds: int,
|
390
|
+
backoff_factor: int,
|
391
|
+
backoff_jitter: float,
|
392
|
+
max_retries: int,
|
393
|
+
):
|
394
|
+
"""
|
395
|
+
Retry a Databricks SDK call with exponential backoff until timeout or max retries reached.
|
396
|
+
|
397
|
+
Args:
|
398
|
+
call_func: Function to call that may raise DatabricksError
|
399
|
+
retry_codes: Set of HTTP status codes that should trigger retries
|
400
|
+
retry_timeout_seconds: Maximum time to spend retrying in seconds
|
401
|
+
backoff_factor: Factor for exponential backoff
|
402
|
+
backoff_jitter: Random jitter to add to backoff
|
403
|
+
max_retries: Maximum number of retry attempts
|
404
|
+
|
405
|
+
Returns:
|
406
|
+
The result of call_func() on success
|
407
|
+
|
408
|
+
Raises:
|
409
|
+
DatabricksError: If all retries are exhausted or non-retryable error occurs
|
410
|
+
"""
|
411
|
+
from databricks.sdk.errors import DatabricksError
|
412
|
+
|
413
|
+
start_time = time.time()
|
414
|
+
attempt = 0
|
415
|
+
|
416
|
+
while attempt <= max_retries:
|
417
|
+
try:
|
418
|
+
return call_func()
|
419
|
+
except DatabricksError as e:
|
420
|
+
# Get HTTP status code from the error
|
421
|
+
status_code = ERROR_CODE_TO_HTTP_STATUS.get(e.error_code, 500)
|
422
|
+
|
423
|
+
# Check if this is a retryable error
|
424
|
+
if status_code not in retry_codes:
|
425
|
+
raise
|
426
|
+
|
427
|
+
# Check if we've exceeded max retries
|
428
|
+
if attempt >= max_retries:
|
429
|
+
_logger.warning(f"Max retries ({max_retries}) exceeded: {e}")
|
430
|
+
raise
|
431
|
+
|
432
|
+
# Calculate backoff time with exponential backoff and jitter
|
433
|
+
# NB: Ideally, we'd use urllib3.Retry to compute the jitter, check whether we've
|
434
|
+
# exceed max retries, etc. However, urllib3.Retry in urllib3 version 1.x, which MLflow
|
435
|
+
# maintains compatibility with, doesn't support retries with jitter
|
436
|
+
if attempt <= 0:
|
437
|
+
backoff_time = 0 # No backoff on first retry attempt
|
438
|
+
else:
|
439
|
+
backoff_time = backoff_factor * (2**attempt)
|
440
|
+
if backoff_jitter > 0:
|
441
|
+
backoff_time += random.random() * backoff_jitter
|
442
|
+
|
443
|
+
# Check if we've exceeded or would exceed timeout
|
444
|
+
elapsed_time = time.time() - start_time
|
445
|
+
if elapsed_time + backoff_time >= retry_timeout_seconds:
|
446
|
+
_logger.warning(f"Retry timeout ({retry_timeout_seconds}s) exceeded: {e}")
|
447
|
+
raise
|
448
|
+
|
449
|
+
_logger.debug(
|
450
|
+
f"Databricks SDK call failed with retryable error (status {status_code}): {e}. "
|
451
|
+
f"Retrying in {backoff_time:.2f} seconds (attempt {attempt + 1})"
|
452
|
+
)
|
453
|
+
|
454
|
+
_time_sleep(backoff_time)
|
455
|
+
attempt += 1
|
456
|
+
|
457
|
+
|
458
|
+
def _get_path(path_prefix, endpoint_path):
|
459
|
+
return f"{path_prefix}{endpoint_path}"
|
460
|
+
|
461
|
+
|
462
|
+
def extract_api_info_for_service(service, path_prefix):
|
463
|
+
"""Return a dictionary mapping each API method to a tuple (path, HTTP method)"""
|
464
|
+
service_methods = service.DESCRIPTOR.methods
|
465
|
+
res = {}
|
466
|
+
for service_method in service_methods:
|
467
|
+
endpoints = service_method.GetOptions().Extensions[databricks_pb2.rpc].endpoints
|
468
|
+
endpoint = endpoints[0]
|
469
|
+
endpoint_path = _get_path(path_prefix, endpoint.path)
|
470
|
+
res[service().GetRequestClass(service_method)] = (endpoint_path, endpoint.method)
|
471
|
+
return res
|
472
|
+
|
473
|
+
|
474
|
+
def extract_all_api_info_for_service(service, path_prefix):
|
475
|
+
"""Return a dictionary mapping each API method to a list of tuples [(path, HTTP method)]"""
|
476
|
+
service_methods = service.DESCRIPTOR.methods
|
477
|
+
res = {}
|
478
|
+
for service_method in service_methods:
|
479
|
+
endpoints = service_method.GetOptions().Extensions[databricks_pb2.rpc].endpoints
|
480
|
+
res[service().GetRequestClass(service_method)] = [
|
481
|
+
(_get_path(path_prefix, endpoint.path), endpoint.method) for endpoint in endpoints
|
482
|
+
]
|
483
|
+
return res
|
484
|
+
|
485
|
+
|
486
|
+
def get_single_trace_endpoint(request_id, use_v3=True):
|
487
|
+
"""
|
488
|
+
Get the endpoint for a single trace.
|
489
|
+
For Databricks tracking URIs, use the V3 API.
|
490
|
+
For all other tracking URIs, use the V2 API.
|
491
|
+
|
492
|
+
Args:
|
493
|
+
request_id: The trace ID.
|
494
|
+
use_v3: Whether to use the V3 API. If True, use the V3 API. If False, use the V2 API.
|
495
|
+
"""
|
496
|
+
if use_v3:
|
497
|
+
return f"{_V3_TRACE_REST_API_PATH_PREFIX}/{request_id}"
|
498
|
+
return f"{_TRACE_REST_API_PATH_PREFIX}/{request_id}"
|
499
|
+
|
500
|
+
|
501
|
+
def get_logged_model_endpoint(model_id: str) -> str:
|
502
|
+
return f"{_REST_API_PATH_PREFIX}/mlflow/logged-models/{model_id}"
|
503
|
+
|
504
|
+
|
505
|
+
def get_single_assessment_endpoint(trace_id: str, assessment_id: str) -> str:
|
506
|
+
"""
|
507
|
+
Get the endpoint for a single assessment.
|
508
|
+
|
509
|
+
Args:
|
510
|
+
trace_id: The trace ID.
|
511
|
+
assessment_id: The assessment ID.
|
512
|
+
"""
|
513
|
+
return f"{_V3_TRACE_REST_API_PATH_PREFIX}/{trace_id}/assessments/{assessment_id}"
|
514
|
+
|
515
|
+
|
516
|
+
def get_trace_tag_endpoint(trace_id):
|
517
|
+
"""Get the endpoint for trace tags. Always use v2 endpoint."""
|
518
|
+
return f"{_REST_API_PATH_PREFIX}/mlflow/traces/{trace_id}/tags"
|
519
|
+
|
520
|
+
|
521
|
+
def call_endpoint(
|
522
|
+
host_creds,
|
523
|
+
endpoint,
|
524
|
+
method,
|
525
|
+
json_body,
|
526
|
+
response_proto,
|
527
|
+
extra_headers=None,
|
528
|
+
retry_timeout_seconds=None,
|
529
|
+
):
|
530
|
+
# Convert json string to json dictionary, to pass to requests
|
531
|
+
if json_body is not None:
|
532
|
+
json_body = json.loads(json_body)
|
533
|
+
call_kwargs = {
|
534
|
+
"host_creds": host_creds,
|
535
|
+
"endpoint": endpoint,
|
536
|
+
"method": method,
|
537
|
+
}
|
538
|
+
if extra_headers is not None:
|
539
|
+
call_kwargs["extra_headers"] = extra_headers
|
540
|
+
if retry_timeout_seconds is not None:
|
541
|
+
call_kwargs["retry_timeout_seconds"] = retry_timeout_seconds
|
542
|
+
if method == "GET":
|
543
|
+
call_kwargs["params"] = json_body
|
544
|
+
response = http_request(**call_kwargs)
|
545
|
+
else:
|
546
|
+
call_kwargs["json"] = json_body
|
547
|
+
response = http_request(**call_kwargs)
|
548
|
+
|
549
|
+
response = verify_rest_response(response, endpoint)
|
550
|
+
response_to_parse = response.text
|
551
|
+
try:
|
552
|
+
js_dict = json.loads(response_to_parse)
|
553
|
+
except json.JSONDecodeError:
|
554
|
+
if len(response_to_parse) > 50:
|
555
|
+
response_to_parse = response_to_parse[:50] + "..."
|
556
|
+
_logger.warning(f"Response is not a valid JSON object: {response_to_parse}")
|
557
|
+
raise
|
558
|
+
|
559
|
+
parse_dict(js_dict=js_dict, message=response_proto)
|
560
|
+
return response_proto
|
561
|
+
|
562
|
+
|
563
|
+
def call_endpoints(host_creds, endpoints, json_body, response_proto, extra_headers=None):
|
564
|
+
# The order that the endpoints are called in is defined by the order
|
565
|
+
# specified in ModelRegistryService in model_registry.proto
|
566
|
+
for i, (endpoint, method) in enumerate(endpoints):
|
567
|
+
try:
|
568
|
+
return call_endpoint(
|
569
|
+
host_creds, endpoint, method, json_body, response_proto, extra_headers
|
570
|
+
)
|
571
|
+
except RestException as e:
|
572
|
+
if e.error_code != ErrorCode.Name(ENDPOINT_NOT_FOUND) or i == len(endpoints) - 1:
|
573
|
+
raise e
|
574
|
+
|
575
|
+
|
576
|
+
class MlflowHostCreds:
|
577
|
+
"""
|
578
|
+
Provides a hostname and optional authentication for talking to an MLflow tracking server.
|
579
|
+
|
580
|
+
Args:
|
581
|
+
host: Hostname (e.g., http://localhost:5000) to MLflow server. Required.
|
582
|
+
username: Username to use with Basic authentication when talking to server.
|
583
|
+
If this is specified, password must also be specified.
|
584
|
+
password: Password to use with Basic authentication when talking to server.
|
585
|
+
If this is specified, username must also be specified.
|
586
|
+
token: Token to use with Bearer authentication when talking to server.
|
587
|
+
If provided, user/password authentication will be ignored.
|
588
|
+
aws_sigv4: If true, we will create a signature V4 to be added for any outgoing request.
|
589
|
+
Keys for signing the request can be passed via ENV variables,
|
590
|
+
or will be fetched via boto3 session.
|
591
|
+
auth: If set, the auth will be added for any outgoing request.
|
592
|
+
Keys for signing the request can be passed via ENV variables,
|
593
|
+
ignore_tls_verification: If true, we will not verify the server's hostname or TLS
|
594
|
+
certificate. This is useful for certain testing situations, but should never be
|
595
|
+
true in production.
|
596
|
+
If this is set to true ``server_cert_path`` must not be set.
|
597
|
+
client_cert_path: Path to ssl client cert file (.pem).
|
598
|
+
Sets the cert param of the ``requests.request``
|
599
|
+
function (see https://requests.readthedocs.io/en/master/api/).
|
600
|
+
server_cert_path: Path to a CA bundle to use.
|
601
|
+
Sets the verify param of the ``requests.request``
|
602
|
+
function (see https://requests.readthedocs.io/en/master/api/).
|
603
|
+
If this is set ``ignore_tls_verification`` must be false.
|
604
|
+
use_databricks_sdk: A boolean value represent whether using Databricks SDK for
|
605
|
+
authentication.
|
606
|
+
databricks_auth_profile: The name of the profile used by Databricks SDK for
|
607
|
+
authentication.
|
608
|
+
client_id: The client ID used by Databricks OAuth
|
609
|
+
client_secret: The client secret used by Databricks OAuth
|
610
|
+
"""
|
611
|
+
|
612
|
+
def __init__(
|
613
|
+
self,
|
614
|
+
host,
|
615
|
+
username=None,
|
616
|
+
password=None,
|
617
|
+
token=None,
|
618
|
+
aws_sigv4=False,
|
619
|
+
auth=None,
|
620
|
+
ignore_tls_verification=False,
|
621
|
+
client_cert_path=None,
|
622
|
+
server_cert_path=None,
|
623
|
+
use_databricks_sdk=False,
|
624
|
+
databricks_auth_profile=None,
|
625
|
+
client_id=None,
|
626
|
+
client_secret=None,
|
627
|
+
use_secret_scope_token=False,
|
628
|
+
):
|
629
|
+
if not host:
|
630
|
+
raise MlflowException(
|
631
|
+
message="host is a required parameter for MlflowHostCreds",
|
632
|
+
error_code=INVALID_PARAMETER_VALUE,
|
633
|
+
)
|
634
|
+
if ignore_tls_verification and (server_cert_path is not None):
|
635
|
+
raise MlflowException(
|
636
|
+
message=(
|
637
|
+
"When 'ignore_tls_verification' is true then 'server_cert_path' "
|
638
|
+
"must not be set! This error may have occurred because the "
|
639
|
+
"'MLFLOW_TRACKING_INSECURE_TLS' and 'MLFLOW_TRACKING_SERVER_CERT_PATH' "
|
640
|
+
"environment variables are both set - only one of these environment "
|
641
|
+
"variables may be set."
|
642
|
+
),
|
643
|
+
error_code=INVALID_PARAMETER_VALUE,
|
644
|
+
)
|
645
|
+
self.host = host
|
646
|
+
self.username = username
|
647
|
+
self.password = password
|
648
|
+
self.token = token
|
649
|
+
self.aws_sigv4 = aws_sigv4
|
650
|
+
self.auth = auth
|
651
|
+
self.ignore_tls_verification = ignore_tls_verification
|
652
|
+
self.client_cert_path = client_cert_path
|
653
|
+
self.server_cert_path = server_cert_path
|
654
|
+
self.use_databricks_sdk = use_databricks_sdk
|
655
|
+
self.databricks_auth_profile = databricks_auth_profile
|
656
|
+
self.client_id = client_id
|
657
|
+
self.client_secret = client_secret
|
658
|
+
self.use_secret_scope_token = use_secret_scope_token
|
659
|
+
|
660
|
+
def __eq__(self, other):
|
661
|
+
if isinstance(other, self.__class__):
|
662
|
+
return self.__dict__ == other.__dict__
|
663
|
+
return NotImplemented
|
664
|
+
|
665
|
+
@property
|
666
|
+
def verify(self):
|
667
|
+
if self.use_databricks_sdk:
|
668
|
+
# Let databricks-sdk set HTTP request `verify` param.
|
669
|
+
return None
|
670
|
+
if self.server_cert_path is None:
|
671
|
+
return not self.ignore_tls_verification
|
672
|
+
else:
|
673
|
+
return self.server_cert_path
|