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,662 @@
|
|
1
|
+
"""
|
2
|
+
Utilities for validating user inputs such as metric names and parameter names.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import json
|
6
|
+
import logging
|
7
|
+
import numbers
|
8
|
+
import posixpath
|
9
|
+
import re
|
10
|
+
from typing import Optional
|
11
|
+
|
12
|
+
from mlflow.entities import Dataset, DatasetInput, InputTag, Param, RunTag
|
13
|
+
from mlflow.entities.model_registry.prompt_version import PROMPT_TEXT_TAG_KEY
|
14
|
+
from mlflow.environment_variables import (
|
15
|
+
MLFLOW_ARTIFACT_LOCATION_MAX_LENGTH,
|
16
|
+
MLFLOW_TRUNCATE_LONG_VALUES,
|
17
|
+
)
|
18
|
+
from mlflow.exceptions import MlflowException
|
19
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
20
|
+
from mlflow.utils.os import is_windows
|
21
|
+
from mlflow.utils.string_utils import is_string_type
|
22
|
+
|
23
|
+
_logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
# Regex for valid run IDs: must be an alphanumeric string of length 1 to 256.
|
26
|
+
_RUN_ID_REGEX = re.compile(r"^[a-zA-Z0-9][\w\-]{0,255}$")
|
27
|
+
|
28
|
+
# Regex: starting with an alphanumeric, optionally followed by up to 63 characters
|
29
|
+
# including alphanumerics, underscores, or dashes.
|
30
|
+
_EXPERIMENT_ID_REGEX = re.compile(r"^[a-zA-Z0-9][\w\-]{0,63}$")
|
31
|
+
|
32
|
+
# Regex for valid registered model alias names: may only contain alphanumerics,
|
33
|
+
# underscores, and dashes.
|
34
|
+
_REGISTERED_MODEL_ALIAS_REGEX = re.compile(r"^[\w\-]*$")
|
35
|
+
|
36
|
+
# Regex for valid registered model alias to prevent conflict with version aliases.
|
37
|
+
_REGISTERED_MODEL_ALIAS_VERSION_REGEX = re.compile(r"^[vV]\d+$")
|
38
|
+
|
39
|
+
_BAD_ALIAS_CHARACTERS_MESSAGE = (
|
40
|
+
"Names may only contain alphanumerics, underscores (_), and dashes (-)."
|
41
|
+
)
|
42
|
+
|
43
|
+
_MISSING_KEY_NAME_MESSAGE = "A key name must be provided."
|
44
|
+
|
45
|
+
MAX_PARAMS_TAGS_PER_BATCH = 100
|
46
|
+
MAX_METRICS_PER_BATCH = 1000
|
47
|
+
MAX_DATASETS_PER_BATCH = 1000
|
48
|
+
MAX_ENTITIES_PER_BATCH = 1000
|
49
|
+
MAX_BATCH_LOG_REQUEST_SIZE = int(1e6)
|
50
|
+
MAX_PARAM_VAL_LENGTH = 6000
|
51
|
+
MAX_TAG_VAL_LENGTH = 8000
|
52
|
+
MAX_EXPERIMENT_NAME_LENGTH = 500
|
53
|
+
MAX_EXPERIMENT_TAG_KEY_LENGTH = 250
|
54
|
+
MAX_EXPERIMENT_TAG_VAL_LENGTH = 5000
|
55
|
+
MAX_ENTITY_KEY_LENGTH = 250
|
56
|
+
MAX_MODEL_REGISTRY_TAG_KEY_LENGTH = 250
|
57
|
+
MAX_MODEL_REGISTRY_TAG_VALUE_LENGTH = 100_000
|
58
|
+
MAX_EXPERIMENTS_LISTED_PER_PAGE = 50000
|
59
|
+
MAX_DATASET_NAME_SIZE = 500
|
60
|
+
MAX_DATASET_DIGEST_SIZE = 36
|
61
|
+
# 1MB -1, the db limit for MEDIUMTEXT column is 16MB, but
|
62
|
+
# we restrict to 1MB because user might log lots of datasets
|
63
|
+
# to a single run, 16MB increases burden on db
|
64
|
+
MAX_DATASET_SCHEMA_SIZE = 1048575
|
65
|
+
MAX_DATASET_SOURCE_SIZE = 65535 # 64KB -1 (the db limit for TEXT column)
|
66
|
+
MAX_DATASET_PROFILE_SIZE = 16777215 # 16MB -1 (the db limit for MEDIUMTEXT column)
|
67
|
+
MAX_INPUT_TAG_KEY_SIZE = 255
|
68
|
+
MAX_INPUT_TAG_VALUE_SIZE = 500
|
69
|
+
MAX_REGISTERED_MODEL_ALIAS_LENGTH = 255
|
70
|
+
MAX_TRACE_TAG_KEY_LENGTH = 250
|
71
|
+
MAX_TRACE_TAG_VAL_LENGTH = 8000
|
72
|
+
|
73
|
+
PARAM_VALIDATION_MSG = """
|
74
|
+
|
75
|
+
The cause of this error is typically due to repeated calls
|
76
|
+
to an individual run_id event logging.
|
77
|
+
|
78
|
+
Incorrect Example:
|
79
|
+
---------------------------------------
|
80
|
+
with mlflow.start_run():
|
81
|
+
mlflow.log_param("depth", 3)
|
82
|
+
mlflow.log_param("depth", 5)
|
83
|
+
---------------------------------------
|
84
|
+
|
85
|
+
Which will throw an MlflowException for overwriting a
|
86
|
+
logged parameter.
|
87
|
+
|
88
|
+
Correct Example:
|
89
|
+
---------------------------------------
|
90
|
+
with mlflow.start_run():
|
91
|
+
with mlflow.start_run(nested=True):
|
92
|
+
mlflow.log_param("depth", 3)
|
93
|
+
with mlflow.start_run(nested=True):
|
94
|
+
mlflow.log_param("depth", 5)
|
95
|
+
---------------------------------------
|
96
|
+
|
97
|
+
Which will create a new nested run for each individual
|
98
|
+
model and prevent parameter key collisions within the
|
99
|
+
tracking store."""
|
100
|
+
|
101
|
+
|
102
|
+
def invalid_value(path, value, message=None):
|
103
|
+
"""
|
104
|
+
Compose a standardized error message for invalid parameter values.
|
105
|
+
"""
|
106
|
+
formattedValue = json.dumps(value, sort_keys=True, separators=(",", ":"))
|
107
|
+
|
108
|
+
if message:
|
109
|
+
return f"Invalid value {formattedValue} for parameter '{path}' supplied: {message}"
|
110
|
+
else:
|
111
|
+
return f"Invalid value {formattedValue} for parameter '{path}' supplied."
|
112
|
+
|
113
|
+
|
114
|
+
def missing_value(path):
|
115
|
+
return f"Missing value for required parameter '{path}'."
|
116
|
+
|
117
|
+
|
118
|
+
def not_integer_value(path, value):
|
119
|
+
return f"Parameter '{path}' must be an integer, got '{value}'."
|
120
|
+
|
121
|
+
|
122
|
+
def exceeds_maximum_length(path, limit):
|
123
|
+
return f"'{path}' exceeds the maximum length of {limit} characters"
|
124
|
+
|
125
|
+
|
126
|
+
def append_to_json_path(currentPath, value):
|
127
|
+
if not currentPath:
|
128
|
+
return value
|
129
|
+
|
130
|
+
if value.startswith("["):
|
131
|
+
return f"{currentPath}{value}"
|
132
|
+
|
133
|
+
return f"{currentPath}.{value}"
|
134
|
+
|
135
|
+
|
136
|
+
def bad_path_message(name):
|
137
|
+
return (
|
138
|
+
"Names may be treated as files in certain cases, and must not resolve to other names"
|
139
|
+
f" when treated as such. This name would resolve to {posixpath.normpath(name)!r}"
|
140
|
+
)
|
141
|
+
|
142
|
+
|
143
|
+
def validate_param_and_metric_name(name):
|
144
|
+
# In windows system valid param and metric names: may only contain slashes, alphanumerics,
|
145
|
+
# underscores, periods, dashes, and spaces.
|
146
|
+
if is_windows():
|
147
|
+
return re.match(r"^[/\w.\- ]*$", name)
|
148
|
+
|
149
|
+
# For other system valid param and metric names: may only contain slashes, alphanumerics,
|
150
|
+
# underscores, periods, dashes, colons, and spaces.
|
151
|
+
return re.match(r"^[/\w.\- :]*$", name)
|
152
|
+
|
153
|
+
|
154
|
+
def bad_character_message():
|
155
|
+
# Valid param and metric names may only contain slashes, alphanumerics, underscores,
|
156
|
+
# periods, dashes, colons, and spaces. For windows param and metric names can not contain colon
|
157
|
+
msg = (
|
158
|
+
"Names may only contain alphanumerics, underscores (_), dashes (-), periods (.),"
|
159
|
+
" spaces ( ){} and slashes (/)."
|
160
|
+
)
|
161
|
+
return msg.format("") if is_windows() else msg.format(", colon(:)")
|
162
|
+
|
163
|
+
|
164
|
+
def path_not_unique(name):
|
165
|
+
norm = posixpath.normpath(name)
|
166
|
+
return norm != name or norm == "." or norm.startswith("..") or norm.startswith("/")
|
167
|
+
|
168
|
+
|
169
|
+
def _validate_metric_name(name, path="name"):
|
170
|
+
"""Check that `name` is a valid metric name and raise an exception if it isn't."""
|
171
|
+
if name is None:
|
172
|
+
raise MlflowException(
|
173
|
+
invalid_value(path, name, f"Metric name cannot be None. {_MISSING_KEY_NAME_MESSAGE}"),
|
174
|
+
error_code=INVALID_PARAMETER_VALUE,
|
175
|
+
)
|
176
|
+
if not validate_param_and_metric_name(name):
|
177
|
+
raise MlflowException(
|
178
|
+
invalid_value(path, name, bad_character_message()),
|
179
|
+
INVALID_PARAMETER_VALUE,
|
180
|
+
)
|
181
|
+
if path_not_unique(name):
|
182
|
+
raise MlflowException(
|
183
|
+
invalid_value(path, name, bad_path_message(name)),
|
184
|
+
INVALID_PARAMETER_VALUE,
|
185
|
+
)
|
186
|
+
|
187
|
+
|
188
|
+
def _is_numeric(value):
|
189
|
+
"""
|
190
|
+
Returns True if the passed-in value is numeric.
|
191
|
+
"""
|
192
|
+
# Note that `isinstance(bool_value, numbers.Number)` returns `True` because `bool` is a
|
193
|
+
# subclass of `int`.
|
194
|
+
return not isinstance(value, bool) and isinstance(value, numbers.Number)
|
195
|
+
|
196
|
+
|
197
|
+
def _validate_metric(key, value, timestamp, step, path=""):
|
198
|
+
"""
|
199
|
+
Check that a metric with the specified key, value, timestamp, and step is valid and raise an
|
200
|
+
exception if it isn't.
|
201
|
+
"""
|
202
|
+
_validate_metric_name(key, append_to_json_path(path, "name"))
|
203
|
+
|
204
|
+
# If invocated via log_metric, no prior validation of the presence of the value was done.
|
205
|
+
if value is None:
|
206
|
+
raise MlflowException(
|
207
|
+
missing_value(append_to_json_path(path, "value")),
|
208
|
+
INVALID_PARAMETER_VALUE,
|
209
|
+
)
|
210
|
+
|
211
|
+
# value must be a Number
|
212
|
+
# since bool is an instance of Number check for bool additionally
|
213
|
+
if not _is_numeric(value):
|
214
|
+
raise MlflowException(
|
215
|
+
invalid_value(
|
216
|
+
append_to_json_path(path, "value"),
|
217
|
+
value,
|
218
|
+
f"(timestamp={timestamp}). "
|
219
|
+
f"Please specify value as a valid double (64-bit floating point)",
|
220
|
+
),
|
221
|
+
INVALID_PARAMETER_VALUE,
|
222
|
+
)
|
223
|
+
|
224
|
+
if not isinstance(timestamp, numbers.Number) or timestamp < 0:
|
225
|
+
raise MlflowException(
|
226
|
+
invalid_value(
|
227
|
+
append_to_json_path(path, "timestamp"),
|
228
|
+
timestamp,
|
229
|
+
f"metric '{key}' (value={value}). "
|
230
|
+
f"Timestamp must be a nonnegative long (64-bit integer) ",
|
231
|
+
),
|
232
|
+
INVALID_PARAMETER_VALUE,
|
233
|
+
)
|
234
|
+
|
235
|
+
if not isinstance(step, numbers.Number):
|
236
|
+
raise MlflowException(
|
237
|
+
invalid_value(
|
238
|
+
append_to_json_path(path, "step"),
|
239
|
+
step,
|
240
|
+
f"metric '{key}' (value={value}). Step must be a valid long (64-bit integer).",
|
241
|
+
),
|
242
|
+
INVALID_PARAMETER_VALUE,
|
243
|
+
)
|
244
|
+
|
245
|
+
_validate_length_limit("Metric name", MAX_ENTITY_KEY_LENGTH, key)
|
246
|
+
|
247
|
+
|
248
|
+
def _validate_param(key, value, path=""):
|
249
|
+
"""
|
250
|
+
Check that a param with the specified key & value is valid and raise an exception if it
|
251
|
+
isn't.
|
252
|
+
"""
|
253
|
+
_validate_param_name(key, append_to_json_path(path, "key"))
|
254
|
+
return Param(
|
255
|
+
_validate_length_limit("Param key", MAX_ENTITY_KEY_LENGTH, key),
|
256
|
+
_validate_length_limit("Param value", MAX_PARAM_VAL_LENGTH, value, truncate=True),
|
257
|
+
)
|
258
|
+
|
259
|
+
|
260
|
+
def _validate_tag(key, value, path=""):
|
261
|
+
"""
|
262
|
+
Check that a tag with the specified key & value is valid and raise an exception if it isn't.
|
263
|
+
"""
|
264
|
+
_validate_tag_name(key, append_to_json_path(path, "key"))
|
265
|
+
return RunTag(
|
266
|
+
_validate_length_limit(append_to_json_path(path, "key"), MAX_ENTITY_KEY_LENGTH, key),
|
267
|
+
_validate_length_limit(
|
268
|
+
append_to_json_path(path, "value"), MAX_TAG_VAL_LENGTH, value, truncate=True
|
269
|
+
),
|
270
|
+
)
|
271
|
+
|
272
|
+
|
273
|
+
def _validate_experiment_tag(key, value):
|
274
|
+
"""
|
275
|
+
Check that a tag with the specified key & value is valid and raise an exception if it isn't.
|
276
|
+
"""
|
277
|
+
_validate_tag_name(key)
|
278
|
+
_validate_length_limit("key", MAX_EXPERIMENT_TAG_KEY_LENGTH, key)
|
279
|
+
_validate_length_limit("value", MAX_EXPERIMENT_TAG_VAL_LENGTH, value)
|
280
|
+
|
281
|
+
|
282
|
+
def _validate_registered_model_tag(key, value):
|
283
|
+
"""
|
284
|
+
Check that a tag with the specified key & value is valid and raise an exception if it isn't.
|
285
|
+
"""
|
286
|
+
_validate_tag_name(key)
|
287
|
+
_validate_length_limit("key", MAX_MODEL_REGISTRY_TAG_KEY_LENGTH, key)
|
288
|
+
_validate_length_limit("value", MAX_MODEL_REGISTRY_TAG_VALUE_LENGTH, value)
|
289
|
+
|
290
|
+
|
291
|
+
def _validate_model_version_tag(key, value):
|
292
|
+
"""
|
293
|
+
Check that a tag with the specified key & value is valid and raise an exception if it isn't.
|
294
|
+
"""
|
295
|
+
_validate_tag_name(key)
|
296
|
+
_validate_tag_value(value)
|
297
|
+
_validate_length_limit("key", MAX_MODEL_REGISTRY_TAG_KEY_LENGTH, key)
|
298
|
+
|
299
|
+
# Check prompt text tag particularly for showing friendly error message
|
300
|
+
if key == PROMPT_TEXT_TAG_KEY and len(value) > MAX_MODEL_REGISTRY_TAG_VALUE_LENGTH:
|
301
|
+
raise MlflowException.invalid_parameter_value(
|
302
|
+
f"Prompt text exceeds max length of {MAX_MODEL_REGISTRY_TAG_VALUE_LENGTH} characters.",
|
303
|
+
)
|
304
|
+
|
305
|
+
_validate_length_limit("value", MAX_MODEL_REGISTRY_TAG_VALUE_LENGTH, value)
|
306
|
+
|
307
|
+
|
308
|
+
def _validate_param_keys_unique(params):
|
309
|
+
"""Ensures that duplicate param keys are not present in the `log_batch()` params argument"""
|
310
|
+
unique_keys = []
|
311
|
+
dupe_keys = []
|
312
|
+
for param in params:
|
313
|
+
if param.key not in unique_keys:
|
314
|
+
unique_keys.append(param.key)
|
315
|
+
else:
|
316
|
+
dupe_keys.append(param.key)
|
317
|
+
|
318
|
+
if dupe_keys:
|
319
|
+
raise MlflowException(
|
320
|
+
f"Duplicate parameter keys have been submitted: {dupe_keys}. Please ensure "
|
321
|
+
"the request contains only one param value per param key.",
|
322
|
+
INVALID_PARAMETER_VALUE,
|
323
|
+
)
|
324
|
+
|
325
|
+
|
326
|
+
def _validate_param_name(name, path="key"):
|
327
|
+
"""Check that `name` is a valid parameter name and raise an exception if it isn't."""
|
328
|
+
if name is None:
|
329
|
+
raise MlflowException(
|
330
|
+
invalid_value(path, "", _MISSING_KEY_NAME_MESSAGE),
|
331
|
+
error_code=INVALID_PARAMETER_VALUE,
|
332
|
+
)
|
333
|
+
if not validate_param_and_metric_name(name):
|
334
|
+
raise MlflowException(
|
335
|
+
invalid_value(path, name, bad_character_message()),
|
336
|
+
INVALID_PARAMETER_VALUE,
|
337
|
+
)
|
338
|
+
if path_not_unique(name):
|
339
|
+
raise MlflowException(
|
340
|
+
invalid_value(path, name, bad_path_message(name)),
|
341
|
+
INVALID_PARAMETER_VALUE,
|
342
|
+
)
|
343
|
+
|
344
|
+
|
345
|
+
def _validate_tag_name(name, path="key"):
|
346
|
+
"""Check that `name` is a valid tag name and raise an exception if it isn't."""
|
347
|
+
# Reuse param & metric check.
|
348
|
+
if name is None:
|
349
|
+
raise MlflowException(
|
350
|
+
missing_value(path),
|
351
|
+
error_code=INVALID_PARAMETER_VALUE,
|
352
|
+
)
|
353
|
+
if not validate_param_and_metric_name(name):
|
354
|
+
raise MlflowException(
|
355
|
+
invalid_value(path, name, bad_character_message()),
|
356
|
+
INVALID_PARAMETER_VALUE,
|
357
|
+
)
|
358
|
+
if path_not_unique(name):
|
359
|
+
raise MlflowException(
|
360
|
+
invalid_value(path, name, bad_path_message(name)),
|
361
|
+
INVALID_PARAMETER_VALUE,
|
362
|
+
)
|
363
|
+
|
364
|
+
|
365
|
+
def _validate_length_limit(entity_name, limit, value, *, truncate=False):
|
366
|
+
if value is None:
|
367
|
+
return None
|
368
|
+
|
369
|
+
if len(value) <= limit:
|
370
|
+
return value
|
371
|
+
|
372
|
+
if truncate and MLFLOW_TRUNCATE_LONG_VALUES.get():
|
373
|
+
_logger.warning(
|
374
|
+
f"{entity_name} '{value[:100]}...' ({len(value)} characters) is truncated to "
|
375
|
+
f"{limit} characters to meet the length limit."
|
376
|
+
)
|
377
|
+
return value[:limit]
|
378
|
+
|
379
|
+
raise MlflowException(
|
380
|
+
exceeds_maximum_length(entity_name, limit),
|
381
|
+
error_code=INVALID_PARAMETER_VALUE,
|
382
|
+
)
|
383
|
+
|
384
|
+
|
385
|
+
def _validate_run_id(run_id, path="run_id"):
|
386
|
+
"""Check that `run_id` is a valid run ID and raise an exception if it isn't."""
|
387
|
+
if _RUN_ID_REGEX.match(run_id) is None:
|
388
|
+
raise MlflowException(invalid_value(path, run_id), error_code=INVALID_PARAMETER_VALUE)
|
389
|
+
|
390
|
+
|
391
|
+
def _validate_experiment_id(exp_id):
|
392
|
+
"""Check that `experiment_id`is a valid string or None, raise an exception if it isn't."""
|
393
|
+
if exp_id is not None and _EXPERIMENT_ID_REGEX.match(exp_id) is None:
|
394
|
+
raise MlflowException(
|
395
|
+
f"Invalid experiment ID: '{exp_id}'", error_code=INVALID_PARAMETER_VALUE
|
396
|
+
)
|
397
|
+
|
398
|
+
|
399
|
+
def _validate_batch_limit(entity_name, limit, length):
|
400
|
+
if length > limit:
|
401
|
+
error_msg = (
|
402
|
+
f"A batch logging request can contain at most {limit} {entity_name}. "
|
403
|
+
f"Got {length} {entity_name}. Please split up {entity_name} across multiple"
|
404
|
+
" requests and try again."
|
405
|
+
)
|
406
|
+
raise MlflowException(error_msg, error_code=INVALID_PARAMETER_VALUE)
|
407
|
+
|
408
|
+
|
409
|
+
def _validate_batch_log_limits(metrics, params, tags):
|
410
|
+
"""Validate that the provided batched logging arguments are within expected limits."""
|
411
|
+
_validate_batch_limit(entity_name="metrics", limit=MAX_METRICS_PER_BATCH, length=len(metrics))
|
412
|
+
_validate_batch_limit(entity_name="params", limit=MAX_PARAMS_TAGS_PER_BATCH, length=len(params))
|
413
|
+
_validate_batch_limit(entity_name="tags", limit=MAX_PARAMS_TAGS_PER_BATCH, length=len(tags))
|
414
|
+
total_length = len(metrics) + len(params) + len(tags)
|
415
|
+
_validate_batch_limit(
|
416
|
+
entity_name="metrics, params, and tags",
|
417
|
+
limit=MAX_ENTITIES_PER_BATCH,
|
418
|
+
length=total_length,
|
419
|
+
)
|
420
|
+
|
421
|
+
|
422
|
+
def _validate_batch_log_data(metrics, params, tags):
|
423
|
+
for index, metric in enumerate(metrics):
|
424
|
+
path = f"metrics[{index}]"
|
425
|
+
_validate_metric(metric.key, metric.value, metric.timestamp, metric.step, path=path)
|
426
|
+
return (
|
427
|
+
metrics,
|
428
|
+
[_validate_param(p.key, p.value, path=f"params[{idx}]") for (idx, p) in enumerate(params)],
|
429
|
+
[_validate_tag(t.key, t.value, path=f"tags[{idx}]") for (idx, t) in enumerate(tags)],
|
430
|
+
)
|
431
|
+
|
432
|
+
|
433
|
+
def _validate_batch_log_api_req(json_req):
|
434
|
+
if len(json_req) > MAX_BATCH_LOG_REQUEST_SIZE:
|
435
|
+
error_msg = (
|
436
|
+
"Batched logging API requests must be at most {limit} bytes, got a "
|
437
|
+
"request of size {size}."
|
438
|
+
).format(limit=MAX_BATCH_LOG_REQUEST_SIZE, size=len(json_req))
|
439
|
+
raise MlflowException(error_msg, error_code=INVALID_PARAMETER_VALUE)
|
440
|
+
|
441
|
+
|
442
|
+
def _validate_experiment_name(experiment_name):
|
443
|
+
"""Check that `experiment_name` is a valid string and raise an exception if it isn't."""
|
444
|
+
if experiment_name == "" or experiment_name is None:
|
445
|
+
raise MlflowException(
|
446
|
+
f"Invalid experiment name: '{experiment_name}'",
|
447
|
+
error_code=INVALID_PARAMETER_VALUE,
|
448
|
+
)
|
449
|
+
|
450
|
+
if not is_string_type(experiment_name):
|
451
|
+
raise MlflowException(
|
452
|
+
f"Invalid experiment name: {experiment_name}. Expects a string.",
|
453
|
+
error_code=INVALID_PARAMETER_VALUE,
|
454
|
+
)
|
455
|
+
|
456
|
+
if len(experiment_name) > MAX_EXPERIMENT_NAME_LENGTH:
|
457
|
+
raise MlflowException.invalid_parameter_value(
|
458
|
+
exceeds_maximum_length("name", MAX_EXPERIMENT_NAME_LENGTH)
|
459
|
+
)
|
460
|
+
|
461
|
+
|
462
|
+
def _validate_experiment_id_type(experiment_id):
|
463
|
+
"""
|
464
|
+
Check that a user-provided experiment_id is either a string, int, or None and raise an
|
465
|
+
exception if it isn't.
|
466
|
+
"""
|
467
|
+
if experiment_id is not None and not isinstance(experiment_id, (str, int)):
|
468
|
+
raise MlflowException(
|
469
|
+
f"Invalid experiment id: {experiment_id} of type {type(experiment_id)}. "
|
470
|
+
"Must be one of str, int, or None.",
|
471
|
+
error_code=INVALID_PARAMETER_VALUE,
|
472
|
+
)
|
473
|
+
|
474
|
+
|
475
|
+
def _validate_model_name(model_name):
|
476
|
+
if model_name is None or model_name == "":
|
477
|
+
raise MlflowException(missing_value("name"), error_code=INVALID_PARAMETER_VALUE)
|
478
|
+
|
479
|
+
|
480
|
+
def _validate_model_renaming(model_new_name):
|
481
|
+
if model_new_name is None or model_new_name == "":
|
482
|
+
raise MlflowException(missing_value("new_name"), error_code=INVALID_PARAMETER_VALUE)
|
483
|
+
|
484
|
+
|
485
|
+
def _validate_model_version(model_version):
|
486
|
+
try:
|
487
|
+
model_version = int(model_version)
|
488
|
+
except ValueError:
|
489
|
+
raise MlflowException(
|
490
|
+
not_integer_value("version", model_version), error_code=INVALID_PARAMETER_VALUE
|
491
|
+
)
|
492
|
+
|
493
|
+
|
494
|
+
def _validate_model_alias_name(model_alias_name):
|
495
|
+
if model_alias_name is None or model_alias_name == "":
|
496
|
+
raise MlflowException(
|
497
|
+
"Registered model alias name cannot be empty.", INVALID_PARAMETER_VALUE
|
498
|
+
)
|
499
|
+
if not _REGISTERED_MODEL_ALIAS_REGEX.match(model_alias_name):
|
500
|
+
raise MlflowException(
|
501
|
+
f"Invalid alias name: '{model_alias_name}'. {_BAD_ALIAS_CHARACTERS_MESSAGE}",
|
502
|
+
INVALID_PARAMETER_VALUE,
|
503
|
+
)
|
504
|
+
_validate_length_limit(
|
505
|
+
"Registered model alias name",
|
506
|
+
MAX_REGISTERED_MODEL_ALIAS_LENGTH,
|
507
|
+
model_alias_name,
|
508
|
+
)
|
509
|
+
if model_alias_name.lower() == "latest":
|
510
|
+
raise MlflowException(
|
511
|
+
"'latest' alias name (case insensitive) is reserved.",
|
512
|
+
INVALID_PARAMETER_VALUE,
|
513
|
+
)
|
514
|
+
if _REGISTERED_MODEL_ALIAS_VERSION_REGEX.match(model_alias_name):
|
515
|
+
raise MlflowException(
|
516
|
+
f"Version alias name '{model_alias_name}' is reserved.",
|
517
|
+
INVALID_PARAMETER_VALUE,
|
518
|
+
)
|
519
|
+
|
520
|
+
|
521
|
+
def _validate_experiment_artifact_location(artifact_location):
|
522
|
+
if artifact_location is not None and artifact_location.startswith("runs:"):
|
523
|
+
raise MlflowException(
|
524
|
+
f"Artifact location cannot be a runs:/ URI. Given: '{artifact_location}'",
|
525
|
+
error_code=INVALID_PARAMETER_VALUE,
|
526
|
+
)
|
527
|
+
|
528
|
+
|
529
|
+
def _validate_db_type_string(db_type):
|
530
|
+
"""validates db_type parsed from DB URI is supported"""
|
531
|
+
from mlflow.store.db.db_types import DATABASE_ENGINES
|
532
|
+
|
533
|
+
if db_type not in DATABASE_ENGINES:
|
534
|
+
error_msg = (
|
535
|
+
f"Invalid database engine: '{db_type}'. "
|
536
|
+
f"Supported database engines are {', '.join(DATABASE_ENGINES)}"
|
537
|
+
)
|
538
|
+
raise MlflowException(error_msg, INVALID_PARAMETER_VALUE)
|
539
|
+
|
540
|
+
|
541
|
+
def _validate_model_version_or_stage_exists(version, stage):
|
542
|
+
if version and stage:
|
543
|
+
raise MlflowException("version and stage cannot be set together", INVALID_PARAMETER_VALUE)
|
544
|
+
|
545
|
+
if not (version or stage):
|
546
|
+
raise MlflowException("version or stage must be set", INVALID_PARAMETER_VALUE)
|
547
|
+
|
548
|
+
|
549
|
+
def _validate_tag_value(value):
|
550
|
+
if value is None:
|
551
|
+
raise MlflowException("Tag value cannot be None", INVALID_PARAMETER_VALUE)
|
552
|
+
|
553
|
+
|
554
|
+
def _validate_dataset_inputs(dataset_inputs: list[DatasetInput]):
|
555
|
+
for dataset_input in dataset_inputs:
|
556
|
+
_validate_dataset(dataset_input.dataset)
|
557
|
+
_validate_input_tags(dataset_input.tags)
|
558
|
+
|
559
|
+
|
560
|
+
def _validate_dataset(dataset: Dataset):
|
561
|
+
if dataset is None:
|
562
|
+
raise MlflowException("Dataset cannot be None", INVALID_PARAMETER_VALUE)
|
563
|
+
if dataset.name is None:
|
564
|
+
raise MlflowException("Dataset name cannot be None", INVALID_PARAMETER_VALUE)
|
565
|
+
if dataset.digest is None:
|
566
|
+
raise MlflowException("Dataset digest cannot be None", INVALID_PARAMETER_VALUE)
|
567
|
+
if dataset.source_type is None:
|
568
|
+
raise MlflowException("Dataset source_type cannot be None", INVALID_PARAMETER_VALUE)
|
569
|
+
if dataset.source is None:
|
570
|
+
raise MlflowException("Dataset source cannot be None", INVALID_PARAMETER_VALUE)
|
571
|
+
if len(dataset.name) > MAX_DATASET_NAME_SIZE:
|
572
|
+
raise MlflowException(
|
573
|
+
exceeds_maximum_length("name", MAX_DATASET_NAME_SIZE),
|
574
|
+
INVALID_PARAMETER_VALUE,
|
575
|
+
)
|
576
|
+
if len(dataset.digest) > MAX_DATASET_DIGEST_SIZE:
|
577
|
+
raise MlflowException(
|
578
|
+
exceeds_maximum_length("digest", MAX_DATASET_DIGEST_SIZE),
|
579
|
+
INVALID_PARAMETER_VALUE,
|
580
|
+
)
|
581
|
+
if len(dataset.source) > MAX_DATASET_SOURCE_SIZE:
|
582
|
+
raise MlflowException(
|
583
|
+
exceeds_maximum_length("source", MAX_DATASET_SOURCE_SIZE),
|
584
|
+
INVALID_PARAMETER_VALUE,
|
585
|
+
)
|
586
|
+
if dataset.schema is not None and len(dataset.schema) > MAX_DATASET_SCHEMA_SIZE:
|
587
|
+
raise MlflowException(
|
588
|
+
exceeds_maximum_length("schema", MAX_DATASET_SCHEMA_SIZE),
|
589
|
+
INVALID_PARAMETER_VALUE,
|
590
|
+
)
|
591
|
+
if dataset.profile is not None and len(dataset.profile) > MAX_DATASET_PROFILE_SIZE:
|
592
|
+
raise MlflowException(
|
593
|
+
exceeds_maximum_length("profile", MAX_DATASET_PROFILE_SIZE),
|
594
|
+
INVALID_PARAMETER_VALUE,
|
595
|
+
)
|
596
|
+
|
597
|
+
|
598
|
+
def _validate_input_tags(input_tags: list[InputTag]):
|
599
|
+
for input_tag in input_tags:
|
600
|
+
_validate_input_tag(input_tag)
|
601
|
+
|
602
|
+
|
603
|
+
def _validate_input_tag(input_tag: InputTag):
|
604
|
+
if input_tag is None:
|
605
|
+
raise MlflowException("InputTag cannot be None", INVALID_PARAMETER_VALUE)
|
606
|
+
if input_tag.key is None:
|
607
|
+
raise MlflowException("InputTag key cannot be None", INVALID_PARAMETER_VALUE)
|
608
|
+
if input_tag.value is None:
|
609
|
+
raise MlflowException("InputTag value cannot be None", INVALID_PARAMETER_VALUE)
|
610
|
+
if len(input_tag.key) > MAX_INPUT_TAG_KEY_SIZE:
|
611
|
+
raise MlflowException(
|
612
|
+
exceeds_maximum_length("key", MAX_INPUT_TAG_KEY_SIZE),
|
613
|
+
INVALID_PARAMETER_VALUE,
|
614
|
+
)
|
615
|
+
if len(input_tag.value) > MAX_INPUT_TAG_VALUE_SIZE:
|
616
|
+
raise MlflowException(
|
617
|
+
exceeds_maximum_length("value", MAX_INPUT_TAG_VALUE_SIZE),
|
618
|
+
INVALID_PARAMETER_VALUE,
|
619
|
+
)
|
620
|
+
|
621
|
+
|
622
|
+
def _validate_username(username):
|
623
|
+
if username is None or username == "":
|
624
|
+
raise MlflowException("Username cannot be empty.", INVALID_PARAMETER_VALUE)
|
625
|
+
|
626
|
+
|
627
|
+
def _validate_password(password) -> None:
|
628
|
+
if password is None or len(password) < 12:
|
629
|
+
raise MlflowException.invalid_parameter_value(
|
630
|
+
"Password must be a string longer than 12 characters."
|
631
|
+
)
|
632
|
+
|
633
|
+
|
634
|
+
def _validate_trace_tag(key, value):
|
635
|
+
_validate_tag_name(key)
|
636
|
+
key = _validate_length_limit("key", MAX_TRACE_TAG_KEY_LENGTH, key)
|
637
|
+
value = _validate_length_limit("value", MAX_TRACE_TAG_VAL_LENGTH, value, truncate=True)
|
638
|
+
return key, value
|
639
|
+
|
640
|
+
|
641
|
+
def _validate_experiment_artifact_location_length(artifact_location: str):
|
642
|
+
max_length = MLFLOW_ARTIFACT_LOCATION_MAX_LENGTH.get()
|
643
|
+
if len(artifact_location) > max_length:
|
644
|
+
raise MlflowException(
|
645
|
+
"Invalid artifact path length. The length of the artifact path cannot be "
|
646
|
+
f"greater than {max_length} characters. To configure this limit, please set the "
|
647
|
+
"MLFLOW_ARTIFACT_LOCATION_MAX_LENGTH environment variable.",
|
648
|
+
INVALID_PARAMETER_VALUE,
|
649
|
+
)
|
650
|
+
|
651
|
+
|
652
|
+
def _validate_logged_model_name(name: Optional[str]) -> None:
|
653
|
+
if name is None:
|
654
|
+
return
|
655
|
+
|
656
|
+
bad_chars = ("/", ":", ".", "%", '"', "'")
|
657
|
+
if not name or any(c in name for c in bad_chars):
|
658
|
+
raise MlflowException(
|
659
|
+
f"Invalid model name ({name!r}) provided. Model name must be a non-empty string "
|
660
|
+
f"and cannot contain the following characters: {bad_chars}",
|
661
|
+
INVALID_PARAMETER_VALUE,
|
662
|
+
)
|