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,764 @@
|
|
1
|
+
"""
|
2
|
+
Internal package providing a Python CRUD interface to MLflow models and versions.
|
3
|
+
This is a lower level API than the :py:mod:`mlflow.tracking.fluent` module, and is
|
4
|
+
exposed in the :py:mod:`mlflow.tracking` module.
|
5
|
+
"""
|
6
|
+
|
7
|
+
import logging
|
8
|
+
from typing import Optional, Union
|
9
|
+
|
10
|
+
from mlflow.entities.model_registry import (
|
11
|
+
ModelVersionTag,
|
12
|
+
Prompt,
|
13
|
+
PromptVersion,
|
14
|
+
RegisteredModelTag,
|
15
|
+
)
|
16
|
+
from mlflow.entities.model_registry.prompt import Prompt
|
17
|
+
from mlflow.exceptions import MlflowException
|
18
|
+
from mlflow.prompt.registry_utils import (
|
19
|
+
add_prompt_filter_string,
|
20
|
+
is_prompt_supported_registry,
|
21
|
+
)
|
22
|
+
from mlflow.store.entities.paged_list import PagedList
|
23
|
+
from mlflow.store.model_registry import (
|
24
|
+
SEARCH_MODEL_VERSION_MAX_RESULTS_DEFAULT,
|
25
|
+
SEARCH_REGISTERED_MODEL_MAX_RESULTS_DEFAULT,
|
26
|
+
)
|
27
|
+
from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS, utils
|
28
|
+
from mlflow.utils.arguments_utils import _get_arg_names
|
29
|
+
|
30
|
+
_logger = logging.getLogger(__name__)
|
31
|
+
|
32
|
+
|
33
|
+
class ModelRegistryClient:
|
34
|
+
"""
|
35
|
+
Client of an MLflow Model Registry Server that creates and manages registered
|
36
|
+
models and model versions.
|
37
|
+
"""
|
38
|
+
|
39
|
+
def __init__(self, registry_uri, tracking_uri):
|
40
|
+
"""
|
41
|
+
Args:
|
42
|
+
registry_uri: Address of local or remote model registry server.
|
43
|
+
tracking_uri: Address of local or remote tracking server.
|
44
|
+
"""
|
45
|
+
self.registry_uri = registry_uri
|
46
|
+
self.tracking_uri = tracking_uri
|
47
|
+
# NB: Fetch the tracking store (`self.store`) upon client initialization to ensure that
|
48
|
+
# the tracking URI is valid and the store can be properly resolved. We define `store` as a
|
49
|
+
# property method to ensure that the client is serializable, even if the store is not
|
50
|
+
self.store
|
51
|
+
|
52
|
+
@property
|
53
|
+
def store(self):
|
54
|
+
return utils._get_store(self.registry_uri, self.tracking_uri)
|
55
|
+
|
56
|
+
# Registered Model Methods
|
57
|
+
|
58
|
+
def create_registered_model(self, name, tags=None, description=None, deployment_job_id=None):
|
59
|
+
"""Create a new registered model in backend store.
|
60
|
+
|
61
|
+
Args:
|
62
|
+
name: Name of the new model. This is expected to be unique in the backend store.
|
63
|
+
tags: A dictionary of key-value pairs that are converted into
|
64
|
+
:py:class:`mlflow.entities.model_registry.RegisteredModelTag` objects.
|
65
|
+
description: Description of the model.
|
66
|
+
deployment_job_id: Optional deployment job ID.
|
67
|
+
|
68
|
+
Returns:
|
69
|
+
A single object of :py:class:`mlflow.entities.model_registry.RegisteredModel`
|
70
|
+
created by backend.
|
71
|
+
|
72
|
+
"""
|
73
|
+
# TODO: Do we want to validate the name is legit here - non-empty without "/" and ":" ?
|
74
|
+
# Those are constraints applicable to any backend, given the model URI format.
|
75
|
+
tags = tags if tags else {}
|
76
|
+
tags = [RegisteredModelTag(key, str(value)) for key, value in tags.items()]
|
77
|
+
return self.store.create_registered_model(name, tags, description, deployment_job_id)
|
78
|
+
|
79
|
+
def update_registered_model(self, name, description, deployment_job_id=None):
|
80
|
+
"""Updates description for RegisteredModel entity.
|
81
|
+
|
82
|
+
Backend raises exception if a registered model with given name does not exist.
|
83
|
+
|
84
|
+
Args:
|
85
|
+
name: Name of the registered model to update.
|
86
|
+
description: New description.
|
87
|
+
deployment_job_id: Optional deployment job ID.
|
88
|
+
|
89
|
+
Returns:
|
90
|
+
A single updated :py:class:`mlflow.entities.model_registry.RegisteredModel` object.
|
91
|
+
|
92
|
+
"""
|
93
|
+
return self.store.update_registered_model(
|
94
|
+
name=name, description=description, deployment_job_id=deployment_job_id
|
95
|
+
)
|
96
|
+
|
97
|
+
def rename_registered_model(self, name, new_name):
|
98
|
+
"""Update registered model name.
|
99
|
+
|
100
|
+
Args:
|
101
|
+
name: Name of the registered model to update.
|
102
|
+
new_name: New proposed name for the registered model.
|
103
|
+
|
104
|
+
Returns:
|
105
|
+
A single updated :py:class:`mlflow.entities.model_registry.RegisteredModel` object.
|
106
|
+
|
107
|
+
"""
|
108
|
+
if new_name.strip() == "":
|
109
|
+
raise MlflowException("The name must not be an empty string.")
|
110
|
+
return self.store.rename_registered_model(name=name, new_name=new_name)
|
111
|
+
|
112
|
+
def delete_registered_model(self, name):
|
113
|
+
"""Delete registered model.
|
114
|
+
Backend raises exception if a registered model with given name does not exist.
|
115
|
+
|
116
|
+
Args:
|
117
|
+
name: Name of the registered model to delete.
|
118
|
+
"""
|
119
|
+
self.store.delete_registered_model(name)
|
120
|
+
|
121
|
+
def search_registered_models(
|
122
|
+
self,
|
123
|
+
filter_string=None,
|
124
|
+
max_results=SEARCH_REGISTERED_MODEL_MAX_RESULTS_DEFAULT,
|
125
|
+
order_by=None,
|
126
|
+
page_token=None,
|
127
|
+
):
|
128
|
+
"""Search for registered models in backend that satisfy the filter criteria.
|
129
|
+
|
130
|
+
Args:
|
131
|
+
filter_string: Filter query string, defaults to searching all registered models.
|
132
|
+
max_results: Maximum number of registered models desired.
|
133
|
+
order_by: List of column names with ASC|DESC annotation, to be used for ordering
|
134
|
+
matching search results.
|
135
|
+
page_token: Token specifying the next page of results. It should be obtained from
|
136
|
+
a ``search_registered_models`` call.
|
137
|
+
|
138
|
+
Returns:
|
139
|
+
A PagedList of :py:class:`mlflow.entities.model_registry.RegisteredModel` objects
|
140
|
+
that satisfy the search expressions. The pagination token for the next page can be
|
141
|
+
obtained via the ``token`` attribute of the object.
|
142
|
+
|
143
|
+
"""
|
144
|
+
if is_prompt_supported_registry(self.registry_uri):
|
145
|
+
# Adjust filter string to include or exclude prompts
|
146
|
+
filter_string = add_prompt_filter_string(filter_string, False)
|
147
|
+
|
148
|
+
return self.store.search_registered_models(filter_string, max_results, order_by, page_token)
|
149
|
+
|
150
|
+
def get_registered_model(self, name):
|
151
|
+
"""
|
152
|
+
Args:
|
153
|
+
name: Name of the registered model to get.
|
154
|
+
|
155
|
+
Returns:
|
156
|
+
A single :py:class:`mlflow.entities.model_registry.RegisteredModel` object.
|
157
|
+
"""
|
158
|
+
return self.store.get_registered_model(name)
|
159
|
+
|
160
|
+
def get_latest_versions(self, name, stages=None):
|
161
|
+
"""Latest version models for each requests stage. If no ``stages`` provided, returns the
|
162
|
+
latest version for each stage.
|
163
|
+
|
164
|
+
Args:
|
165
|
+
name: Name of the registered model from which to get the latest versions.
|
166
|
+
stages: List of desired stages. If input list is None, return latest versions for
|
167
|
+
'Staging' and 'Production' stages.
|
168
|
+
|
169
|
+
Returns:
|
170
|
+
List of :py:class:`mlflow.entities.model_registry.ModelVersion` objects.
|
171
|
+
|
172
|
+
"""
|
173
|
+
return self.store.get_latest_versions(name, stages)
|
174
|
+
|
175
|
+
def set_registered_model_tag(self, name, key, value):
|
176
|
+
"""Set a tag for the registered model.
|
177
|
+
|
178
|
+
Args:
|
179
|
+
name: Registered model name.
|
180
|
+
key: Tag key to log.
|
181
|
+
value: Tag value log.
|
182
|
+
|
183
|
+
Returns:
|
184
|
+
None
|
185
|
+
"""
|
186
|
+
self.store.set_registered_model_tag(name, RegisteredModelTag(key, str(value)))
|
187
|
+
|
188
|
+
def delete_registered_model_tag(self, name, key):
|
189
|
+
"""Delete a tag associated with the registered model.
|
190
|
+
|
191
|
+
Args:
|
192
|
+
name: Registered model name.
|
193
|
+
key: Registered model tag key.
|
194
|
+
|
195
|
+
Returns:
|
196
|
+
None
|
197
|
+
"""
|
198
|
+
self.store.delete_registered_model_tag(name, key)
|
199
|
+
|
200
|
+
# Model Version Methods
|
201
|
+
|
202
|
+
def create_model_version(
|
203
|
+
self,
|
204
|
+
name,
|
205
|
+
source,
|
206
|
+
run_id=None,
|
207
|
+
tags=None,
|
208
|
+
run_link=None,
|
209
|
+
description=None,
|
210
|
+
await_creation_for=DEFAULT_AWAIT_MAX_SLEEP_SECONDS,
|
211
|
+
local_model_path=None,
|
212
|
+
model_id: Optional[str] = None,
|
213
|
+
):
|
214
|
+
"""Create a new model version from given source.
|
215
|
+
|
216
|
+
Args:
|
217
|
+
name: Name of the containing registered model.
|
218
|
+
source: URI indicating the location of the model artifacts.
|
219
|
+
run_id: Run ID from MLflow tracking server that generated the model.
|
220
|
+
tags: A dictionary of key-value pairs that are converted into
|
221
|
+
:py:class:`mlflow.entities.model_registry.ModelVersionTag` objects.
|
222
|
+
run_link: Link to the run from an MLflow tracking server that generated this model.
|
223
|
+
description: Description of the version.
|
224
|
+
await_creation_for: Number of seconds to wait for the model version to finish being
|
225
|
+
created and is in ``READY`` status. By default, the function
|
226
|
+
waits for five minutes. Specify 0 or None to skip waiting.
|
227
|
+
local_model_path: Local path to the MLflow model, if it's already accessible on the
|
228
|
+
local filesystem. Can be used by AbstractStores that upload model version files
|
229
|
+
to the model registry to avoid a redundant download from the source location when
|
230
|
+
logging and registering a model via a single
|
231
|
+
mlflow.<flavor>.log_model(..., registered_model_name) call.
|
232
|
+
model_id: The ID of the model (from an Experiment) that is being promoted to a
|
233
|
+
registered model version, if applicable.
|
234
|
+
|
235
|
+
Returns:
|
236
|
+
Single :py:class:`mlflow.entities.model_registry.ModelVersion` object created by
|
237
|
+
backend.
|
238
|
+
|
239
|
+
"""
|
240
|
+
tags = tags if tags else {}
|
241
|
+
tags = [ModelVersionTag(key, str(value)) for key, value in tags.items()]
|
242
|
+
arg_names = _get_arg_names(self.store.create_model_version)
|
243
|
+
if "local_model_path" in arg_names:
|
244
|
+
mv = self.store.create_model_version(
|
245
|
+
name,
|
246
|
+
source,
|
247
|
+
run_id,
|
248
|
+
tags,
|
249
|
+
run_link,
|
250
|
+
description,
|
251
|
+
local_model_path=local_model_path,
|
252
|
+
model_id=model_id,
|
253
|
+
)
|
254
|
+
else:
|
255
|
+
# Fall back to calling create_model_version without
|
256
|
+
# local_model_path since old model registry store implementations may not
|
257
|
+
# support the local_model_path argument.
|
258
|
+
mv = self.store.create_model_version(
|
259
|
+
name, source, run_id, tags, run_link, description, model_id=model_id
|
260
|
+
)
|
261
|
+
if await_creation_for and await_creation_for > 0:
|
262
|
+
self.store._await_model_version_creation(mv, await_creation_for)
|
263
|
+
return mv
|
264
|
+
|
265
|
+
def copy_model_version(self, src_mv, dst_name):
|
266
|
+
"""Copy a model version from one registered model to another as a new model version.
|
267
|
+
|
268
|
+
Args:
|
269
|
+
src_mv: A :py:class:`mlflow.entities.model_registry.ModelVersion` object representing
|
270
|
+
the source model version.
|
271
|
+
dst_name: The name of the registered model to copy the model version to. If a
|
272
|
+
registered model with this name does not exist, it will be created.
|
273
|
+
|
274
|
+
Returns:
|
275
|
+
Single :py:class:`mlflow.entities.model_registry.ModelVersion` object representing
|
276
|
+
the cloned model version.
|
277
|
+
|
278
|
+
"""
|
279
|
+
return self.store.copy_model_version(src_mv=src_mv, dst_name=dst_name)
|
280
|
+
|
281
|
+
def update_model_version(self, name, version, description):
|
282
|
+
"""Update metadata associated with a model version in backend.
|
283
|
+
|
284
|
+
Args:
|
285
|
+
name: Name of the containing registered model.
|
286
|
+
version: Version number of the model version.
|
287
|
+
description: New description.
|
288
|
+
"""
|
289
|
+
return self.store.update_model_version(name=name, version=version, description=description)
|
290
|
+
|
291
|
+
def transition_model_version_stage(self, name, version, stage, archive_existing_versions=False):
|
292
|
+
"""Update model version stage.
|
293
|
+
|
294
|
+
Args:
|
295
|
+
name: Registered model name.
|
296
|
+
version: Registered model version.
|
297
|
+
stage: New desired stage for this model version.
|
298
|
+
archive_existing_versions: If this flag is set to ``True``, all existing model
|
299
|
+
versions in the stage will be automatically moved to the "archived" stage. Only
|
300
|
+
valid when ``stage`` is ``"staging"`` or ``"production"`` otherwise an error will be
|
301
|
+
raised.
|
302
|
+
|
303
|
+
Returns:
|
304
|
+
A single :py:class:`mlflow.entities.model_registry.ModelVersion` object.
|
305
|
+
|
306
|
+
"""
|
307
|
+
if stage.strip() == "":
|
308
|
+
raise MlflowException("The stage must not be an empty string.")
|
309
|
+
return self.store.transition_model_version_stage(
|
310
|
+
name=name,
|
311
|
+
version=version,
|
312
|
+
stage=stage,
|
313
|
+
archive_existing_versions=archive_existing_versions,
|
314
|
+
)
|
315
|
+
|
316
|
+
def get_model_version(self, name, version):
|
317
|
+
"""
|
318
|
+
Args:
|
319
|
+
name: Name of the containing registered model.
|
320
|
+
version: Version number of the model version.
|
321
|
+
|
322
|
+
Returns:
|
323
|
+
A single :py:class:`mlflow.entities.model_registry.ModelVersion` object.
|
324
|
+
"""
|
325
|
+
return self.store.get_model_version(name, version)
|
326
|
+
|
327
|
+
def delete_model_version(self, name, version):
|
328
|
+
"""Delete model version in backend.
|
329
|
+
|
330
|
+
Args:
|
331
|
+
name: Name of the containing registered model.
|
332
|
+
version: Version number of the model version.
|
333
|
+
|
334
|
+
"""
|
335
|
+
self.store.delete_model_version(name, version)
|
336
|
+
|
337
|
+
def get_model_version_download_uri(self, name, version):
|
338
|
+
"""Get the download location in Model Registry for this model version.
|
339
|
+
|
340
|
+
Args:
|
341
|
+
name: Name of the containing registered model.
|
342
|
+
version: Version number of the model version.
|
343
|
+
|
344
|
+
Returns:
|
345
|
+
A single URI location that allows reads for downloading.
|
346
|
+
|
347
|
+
"""
|
348
|
+
return self.store.get_model_version_download_uri(name, version)
|
349
|
+
|
350
|
+
def search_model_versions(
|
351
|
+
self,
|
352
|
+
filter_string=None,
|
353
|
+
max_results=SEARCH_MODEL_VERSION_MAX_RESULTS_DEFAULT,
|
354
|
+
order_by=None,
|
355
|
+
page_token=None,
|
356
|
+
):
|
357
|
+
"""Search for model versions in backend that satisfy the filter criteria.
|
358
|
+
|
359
|
+
.. warning:
|
360
|
+
|
361
|
+
The model version search results may not have aliases populated for performance reasons.
|
362
|
+
|
363
|
+
Args:
|
364
|
+
filter_string: A filter string expression. Currently supports a single filter
|
365
|
+
condition either name of model like ``name = 'model_name'`` or
|
366
|
+
``run_id = '...'``.
|
367
|
+
max_results: Maximum number of model versions desired.
|
368
|
+
order_by: List of column names with ASC|DESC annotation, to be used for ordering
|
369
|
+
matching search results.
|
370
|
+
page_token: Token specifying the next page of results. It should be obtained from
|
371
|
+
a ``search_model_versions`` call.
|
372
|
+
|
373
|
+
Returns:
|
374
|
+
A PagedList of :py:class:`mlflow.entities.model_registry.ModelVersion`
|
375
|
+
objects that satisfy the search expressions. The pagination token for the next
|
376
|
+
page can be obtained via the ``token`` attribute of the object.
|
377
|
+
|
378
|
+
"""
|
379
|
+
return self.store.search_model_versions(filter_string, max_results, order_by, page_token)
|
380
|
+
|
381
|
+
def get_model_version_stages(self, name, version):
|
382
|
+
"""
|
383
|
+
Returns:
|
384
|
+
A list of valid stages.
|
385
|
+
"""
|
386
|
+
return self.store.get_model_version_stages(name, version)
|
387
|
+
|
388
|
+
def set_model_version_tag(self, name, version, key, value):
|
389
|
+
"""Set a tag for the model version.
|
390
|
+
|
391
|
+
Args:
|
392
|
+
name: Registered model name.
|
393
|
+
version: Registered model version.
|
394
|
+
key: Tag key to log.
|
395
|
+
value: Tag value to log.
|
396
|
+
|
397
|
+
Returns:
|
398
|
+
None
|
399
|
+
"""
|
400
|
+
self.store.set_model_version_tag(name, version, ModelVersionTag(key, str(value)))
|
401
|
+
|
402
|
+
def delete_model_version_tag(self, name, version, key):
|
403
|
+
"""Delete a tag associated with the model version.
|
404
|
+
|
405
|
+
Args:
|
406
|
+
name: Registered model name.
|
407
|
+
version: Registered model version.
|
408
|
+
key: Tag key.
|
409
|
+
|
410
|
+
Returns:
|
411
|
+
None
|
412
|
+
"""
|
413
|
+
self.store.delete_model_version_tag(name, version, key)
|
414
|
+
|
415
|
+
def set_registered_model_alias(self, name, alias, version):
|
416
|
+
"""Set a registered model alias pointing to a model version.
|
417
|
+
|
418
|
+
Args:
|
419
|
+
name: Registered model name.
|
420
|
+
alias: Name of the alias.
|
421
|
+
version: Registered model version number.
|
422
|
+
|
423
|
+
Returns:
|
424
|
+
None
|
425
|
+
"""
|
426
|
+
self.store.set_registered_model_alias(name, alias, version)
|
427
|
+
|
428
|
+
def delete_registered_model_alias(self, name, alias):
|
429
|
+
"""Delete an alias associated with a registered model.
|
430
|
+
|
431
|
+
Args:
|
432
|
+
name: Registered model name.
|
433
|
+
alias: Name of the alias.
|
434
|
+
|
435
|
+
Returns:
|
436
|
+
None
|
437
|
+
"""
|
438
|
+
self.store.delete_registered_model_alias(name, alias)
|
439
|
+
|
440
|
+
def get_model_version_by_alias(self, name, alias):
|
441
|
+
"""Get the model version instance by name and alias.
|
442
|
+
|
443
|
+
Args:
|
444
|
+
name: Registered model name.
|
445
|
+
alias: Name of the alias.
|
446
|
+
|
447
|
+
Returns:
|
448
|
+
A single :py:class:`mlflow.entities.model_registry.ModelVersion` object.
|
449
|
+
|
450
|
+
"""
|
451
|
+
return self.store.get_model_version_by_alias(name, alias)
|
452
|
+
|
453
|
+
def create_prompt(
|
454
|
+
self,
|
455
|
+
name: str,
|
456
|
+
description: Optional[str] = None,
|
457
|
+
tags: Optional[dict[str, str]] = None,
|
458
|
+
) -> Prompt:
|
459
|
+
"""
|
460
|
+
Create a new prompt in the registry.
|
461
|
+
|
462
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
463
|
+
when used with Unity Catalog registries.
|
464
|
+
|
465
|
+
Args:
|
466
|
+
name: Name of the prompt.
|
467
|
+
description: Optional description of the prompt.
|
468
|
+
tags: Optional dictionary of prompt tags.
|
469
|
+
|
470
|
+
Returns:
|
471
|
+
A PromptInfo object for Unity Catalog stores.
|
472
|
+
"""
|
473
|
+
return self.store.create_prompt(name, description, tags)
|
474
|
+
|
475
|
+
def get_prompt(self, name: str) -> Optional[Prompt]:
|
476
|
+
"""
|
477
|
+
Get prompt metadata by name.
|
478
|
+
|
479
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
480
|
+
when used with Unity Catalog registries.
|
481
|
+
|
482
|
+
Args:
|
483
|
+
name: Registered prompt name.
|
484
|
+
|
485
|
+
Returns:
|
486
|
+
A Prompt object with prompt metadata, or None if not found.
|
487
|
+
"""
|
488
|
+
return self.store.get_prompt(name)
|
489
|
+
|
490
|
+
def search_prompts(
|
491
|
+
self,
|
492
|
+
filter_string: Optional[str] = None,
|
493
|
+
max_results: Optional[int] = None,
|
494
|
+
order_by: Optional[list[str]] = None,
|
495
|
+
page_token: Optional[str] = None,
|
496
|
+
) -> PagedList[Prompt]:
|
497
|
+
"""
|
498
|
+
Search for prompts in the registry.
|
499
|
+
|
500
|
+
This method delegates directly to the store, providing Unity Catalog support
|
501
|
+
when used with Unity Catalog registries.
|
502
|
+
|
503
|
+
Args:
|
504
|
+
filter_string: Filter query string. For Unity Catalog registries, must include
|
505
|
+
catalog and schema: "catalog = 'catalog_name' AND schema = 'schema_name'".
|
506
|
+
For traditional registries, standard filter expressions are supported.
|
507
|
+
max_results: Maximum number of prompts to return.
|
508
|
+
order_by: List of column names with ASC|DESC annotation.
|
509
|
+
page_token: Token specifying the next page of results.
|
510
|
+
|
511
|
+
Returns:
|
512
|
+
A PagedList of Prompt objects.
|
513
|
+
"""
|
514
|
+
return self.store.search_prompts(
|
515
|
+
filter_string=filter_string,
|
516
|
+
max_results=max_results,
|
517
|
+
order_by=order_by,
|
518
|
+
page_token=page_token,
|
519
|
+
)
|
520
|
+
|
521
|
+
def delete_prompt(self, name: str) -> None:
|
522
|
+
"""
|
523
|
+
Delete a prompt from the registry.
|
524
|
+
|
525
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
526
|
+
when used with Unity Catalog registries.
|
527
|
+
|
528
|
+
Args:
|
529
|
+
name: Name of the prompt to delete.
|
530
|
+
|
531
|
+
Returns:
|
532
|
+
None
|
533
|
+
"""
|
534
|
+
self.store.delete_prompt(name)
|
535
|
+
|
536
|
+
def create_prompt_version(
|
537
|
+
self,
|
538
|
+
name: str,
|
539
|
+
template: str,
|
540
|
+
description: Optional[str] = None,
|
541
|
+
tags: Optional[dict[str, str]] = None,
|
542
|
+
) -> PromptVersion:
|
543
|
+
"""
|
544
|
+
Create a new version of an existing prompt.
|
545
|
+
|
546
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
547
|
+
when used with Unity Catalog registries.
|
548
|
+
|
549
|
+
Args:
|
550
|
+
name: Name of the prompt.
|
551
|
+
template: The prompt template text for this version.
|
552
|
+
description: Optional description of this version.
|
553
|
+
tags: Optional dictionary of version tags.
|
554
|
+
|
555
|
+
Returns:
|
556
|
+
A PromptVersion object representing the new version.
|
557
|
+
"""
|
558
|
+
return self.store.create_prompt_version(name, template, description, tags)
|
559
|
+
|
560
|
+
def get_prompt_version(self, name: str, version: str) -> PromptVersion:
|
561
|
+
"""
|
562
|
+
Get a specific version of a prompt.
|
563
|
+
|
564
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
565
|
+
when used with Unity Catalog registries.
|
566
|
+
|
567
|
+
Args:
|
568
|
+
name: Name of the prompt.
|
569
|
+
version: Version number of the prompt.
|
570
|
+
|
571
|
+
Returns:
|
572
|
+
A PromptVersion object.
|
573
|
+
"""
|
574
|
+
return self.store.get_prompt_version(name, version)
|
575
|
+
|
576
|
+
def delete_prompt_version(self, name: str, version: str) -> None:
|
577
|
+
"""
|
578
|
+
Delete a specific version of a prompt.
|
579
|
+
|
580
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
581
|
+
when used with Unity Catalog registries.
|
582
|
+
|
583
|
+
Args:
|
584
|
+
name: Name of the prompt.
|
585
|
+
version: Version number to delete.
|
586
|
+
|
587
|
+
Returns:
|
588
|
+
None
|
589
|
+
"""
|
590
|
+
self.store.delete_prompt_version(name, version)
|
591
|
+
|
592
|
+
def set_prompt_tag(self, name: str, key: str, value: str) -> None:
|
593
|
+
"""
|
594
|
+
Set a tag on a prompt.
|
595
|
+
|
596
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
597
|
+
when used with Unity Catalog registries.
|
598
|
+
|
599
|
+
Args:
|
600
|
+
name: Name of the prompt.
|
601
|
+
key: Tag key.
|
602
|
+
value: Tag value.
|
603
|
+
|
604
|
+
Returns:
|
605
|
+
None
|
606
|
+
"""
|
607
|
+
self.store.set_prompt_tag(name, key, value)
|
608
|
+
|
609
|
+
def delete_prompt_tag(self, name: str, key: str) -> None:
|
610
|
+
"""
|
611
|
+
Delete a tag from a prompt.
|
612
|
+
|
613
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
614
|
+
when used with Unity Catalog registries.
|
615
|
+
|
616
|
+
Args:
|
617
|
+
name: Name of the prompt.
|
618
|
+
key: Tag key to delete.
|
619
|
+
|
620
|
+
Returns:
|
621
|
+
None
|
622
|
+
"""
|
623
|
+
self.store.delete_prompt_tag(name, key)
|
624
|
+
|
625
|
+
def get_prompt_version_by_alias(self, name: str, alias: str) -> PromptVersion:
|
626
|
+
"""
|
627
|
+
Get a prompt version by alias.
|
628
|
+
|
629
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
630
|
+
when used with Unity Catalog registries.
|
631
|
+
|
632
|
+
Args:
|
633
|
+
name: Name of the prompt.
|
634
|
+
alias: Alias to look up.
|
635
|
+
|
636
|
+
Returns:
|
637
|
+
A PromptVersion object.
|
638
|
+
"""
|
639
|
+
return self.store.get_prompt_version_by_alias(name, alias)
|
640
|
+
|
641
|
+
def set_prompt_alias(self, name: str, alias: str, version: str) -> None:
|
642
|
+
"""
|
643
|
+
Set an alias for a prompt version.
|
644
|
+
|
645
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
646
|
+
when used with Unity Catalog registries.
|
647
|
+
|
648
|
+
Args:
|
649
|
+
name: Name of the prompt.
|
650
|
+
alias: Alias to set.
|
651
|
+
version: Version to alias.
|
652
|
+
|
653
|
+
Returns:
|
654
|
+
None
|
655
|
+
"""
|
656
|
+
self.store.set_prompt_alias(name, alias, version)
|
657
|
+
|
658
|
+
def delete_prompt_alias(self, name: str, alias: str) -> None:
|
659
|
+
"""
|
660
|
+
Delete a prompt alias.
|
661
|
+
|
662
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
663
|
+
when used with Unity Catalog registries.
|
664
|
+
|
665
|
+
Args:
|
666
|
+
name: Name of the prompt.
|
667
|
+
alias: Alias to delete.
|
668
|
+
|
669
|
+
Returns:
|
670
|
+
None
|
671
|
+
"""
|
672
|
+
self.store.delete_prompt_alias(name, alias)
|
673
|
+
|
674
|
+
def search_prompt_versions(
|
675
|
+
self, name: str, max_results: Optional[int] = None, page_token: Optional[str] = None
|
676
|
+
):
|
677
|
+
"""
|
678
|
+
Search prompt versions for a given prompt name.
|
679
|
+
|
680
|
+
This method delegates directly to the store. Only supported in Unity Catalog registries.
|
681
|
+
|
682
|
+
Args:
|
683
|
+
name: Name of the prompt to search versions for.
|
684
|
+
max_results: Maximum number of versions to return.
|
685
|
+
page_token: Token for pagination.
|
686
|
+
|
687
|
+
Returns:
|
688
|
+
SearchPromptVersionsResponse containing the list of versions.
|
689
|
+
|
690
|
+
Raises:
|
691
|
+
MlflowException: If used with non-Unity Catalog registries.
|
692
|
+
"""
|
693
|
+
return self.store.search_prompt_versions(name, max_results, page_token)
|
694
|
+
|
695
|
+
def link_prompt_version_to_model(
|
696
|
+
self, name: str, version: Union[int, str], model_id: str
|
697
|
+
) -> None:
|
698
|
+
"""
|
699
|
+
Link a prompt version to a model.
|
700
|
+
|
701
|
+
Args:
|
702
|
+
name: The name of the prompt.
|
703
|
+
version: The version of the prompt.
|
704
|
+
model_id: The ID of the model to link the prompt version to.
|
705
|
+
"""
|
706
|
+
return self.store.link_prompt_version_to_model(name, str(version), model_id)
|
707
|
+
|
708
|
+
def link_prompt_version_to_run(self, name: str, version: Union[int, str], run_id: str) -> None:
|
709
|
+
"""
|
710
|
+
Link a prompt version to a run.
|
711
|
+
|
712
|
+
Args:
|
713
|
+
name: The name of the prompt.
|
714
|
+
version: The version of the prompt.
|
715
|
+
run_id: The ID of the run to link the prompt version to.
|
716
|
+
"""
|
717
|
+
return self.store.link_prompt_version_to_run(name, str(version), run_id)
|
718
|
+
|
719
|
+
def link_prompt_versions_to_trace(
|
720
|
+
self, prompt_versions: list[PromptVersion], trace_id: str
|
721
|
+
) -> None:
|
722
|
+
"""
|
723
|
+
Link multiple prompt versions to a trace.
|
724
|
+
|
725
|
+
Args:
|
726
|
+
prompt_versions: List of PromptVersion objects to link.
|
727
|
+
trace_id: Trace ID to link the prompt versions to.
|
728
|
+
"""
|
729
|
+
return self.store.link_prompts_to_trace(prompt_versions=prompt_versions, trace_id=trace_id)
|
730
|
+
|
731
|
+
def set_prompt_version_tag(self, name: str, version: str, key: str, value: str) -> None:
|
732
|
+
"""
|
733
|
+
Set a tag on a prompt version.
|
734
|
+
|
735
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
736
|
+
when used with Unity Catalog registries.
|
737
|
+
|
738
|
+
Args:
|
739
|
+
name: Name of the prompt.
|
740
|
+
version: Version number of the prompt.
|
741
|
+
key: Tag key.
|
742
|
+
value: Tag value.
|
743
|
+
|
744
|
+
Returns:
|
745
|
+
None
|
746
|
+
"""
|
747
|
+
self.store.set_prompt_version_tag(name, version, key, value)
|
748
|
+
|
749
|
+
def delete_prompt_version_tag(self, name: str, version: str, key: str) -> None:
|
750
|
+
"""
|
751
|
+
Delete a tag from a prompt version.
|
752
|
+
|
753
|
+
This method delegates directly to the store, providing full Unity Catalog support
|
754
|
+
when used with Unity Catalog registries.
|
755
|
+
|
756
|
+
Args:
|
757
|
+
name: Name of the prompt.
|
758
|
+
version: Version number of the prompt.
|
759
|
+
key: Tag key to delete.
|
760
|
+
|
761
|
+
Returns:
|
762
|
+
None
|
763
|
+
"""
|
764
|
+
self.store.delete_prompt_version_tag(name, version, key)
|