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,268 @@
|
|
1
|
+
"""
|
2
|
+
APIs for interacting with artifacts in MLflow
|
3
|
+
"""
|
4
|
+
|
5
|
+
import json
|
6
|
+
import pathlib
|
7
|
+
import posixpath
|
8
|
+
import tempfile
|
9
|
+
from typing import Any, Optional
|
10
|
+
|
11
|
+
from mlflow.entities.file_info import FileInfo
|
12
|
+
from mlflow.exceptions import MlflowException
|
13
|
+
from mlflow.protos.databricks_pb2 import BAD_REQUEST, INVALID_PARAMETER_VALUE
|
14
|
+
from mlflow.tracking import _get_store
|
15
|
+
from mlflow.tracking.artifact_utils import (
|
16
|
+
_download_artifact_from_uri,
|
17
|
+
_get_root_uri_and_artifact_path,
|
18
|
+
add_databricks_profile_info_to_artifact_uri,
|
19
|
+
get_artifact_repository,
|
20
|
+
)
|
21
|
+
|
22
|
+
|
23
|
+
def download_artifacts(
|
24
|
+
artifact_uri: Optional[str] = None,
|
25
|
+
run_id: Optional[str] = None,
|
26
|
+
artifact_path: Optional[str] = None,
|
27
|
+
dst_path: Optional[str] = None,
|
28
|
+
tracking_uri: Optional[str] = None,
|
29
|
+
) -> str:
|
30
|
+
"""Download an artifact file or directory to a local directory.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
artifact_uri: URI pointing to the artifacts. Supported formats include:
|
34
|
+
|
35
|
+
* ``runs:/<run_id>/<artifact_path>``
|
36
|
+
Example: ``runs:/500cf58bee2b40a4a82861cc31a617b1/my_model.pkl``
|
37
|
+
|
38
|
+
* ``models:/<model_name>/<stage>``
|
39
|
+
Example: ``models:/my_model/Production``
|
40
|
+
|
41
|
+
* ``models:/<model_name>/<version>/path/to/model``
|
42
|
+
Example: ``models:/my_model/2/path/to/model``
|
43
|
+
|
44
|
+
* ``models:/<model_name>@<alias>/path/to/model``
|
45
|
+
Example: ``models:/my_model@staging/path/to/model``
|
46
|
+
|
47
|
+
* Cloud storage URIs: ``s3://<bucket>/<path>`` or ``gs://<bucket>/<path>``
|
48
|
+
|
49
|
+
* Tracking server artifact URIs: ``http://<host>/mlartifacts`` or
|
50
|
+
``mlflow-artifacts://<host>/mlartifacts``
|
51
|
+
|
52
|
+
Exactly one of ``artifact_uri`` or ``run_id`` must be specified.
|
53
|
+
run_id: ID of the MLflow Run containing the artifacts. Exactly one of ``run_id`` or
|
54
|
+
``artifact_uri`` must be specified.
|
55
|
+
artifact_path: (For use with ``run_id``) If specified, a path relative to the MLflow
|
56
|
+
Run's root directory containing the artifacts to download.
|
57
|
+
dst_path: Path of the local filesystem destination directory to which to download the
|
58
|
+
specified artifacts. If the directory does not exist, it is created. If
|
59
|
+
unspecified, the artifacts are downloaded to a new uniquely-named directory on
|
60
|
+
the local filesystem, unless the artifacts already exist on the local
|
61
|
+
filesystem, in which case their local path is returned directly.
|
62
|
+
tracking_uri: The tracking URI to be used when downloading artifacts.
|
63
|
+
|
64
|
+
Returns:
|
65
|
+
The location of the artifact file or directory on the local filesystem.
|
66
|
+
"""
|
67
|
+
if (run_id, artifact_uri).count(None) != 1:
|
68
|
+
raise MlflowException(
|
69
|
+
message="Exactly one of `run_id` or `artifact_uri` must be specified",
|
70
|
+
error_code=INVALID_PARAMETER_VALUE,
|
71
|
+
)
|
72
|
+
elif artifact_uri is not None and artifact_path is not None:
|
73
|
+
raise MlflowException(
|
74
|
+
message="`artifact_path` cannot be specified if `artifact_uri` is specified",
|
75
|
+
error_code=INVALID_PARAMETER_VALUE,
|
76
|
+
)
|
77
|
+
|
78
|
+
if dst_path is not None:
|
79
|
+
pathlib.Path(dst_path).mkdir(exist_ok=True, parents=True)
|
80
|
+
|
81
|
+
if artifact_uri is not None:
|
82
|
+
return _download_artifact_from_uri(
|
83
|
+
artifact_uri, output_path=dst_path, tracking_uri=tracking_uri
|
84
|
+
)
|
85
|
+
|
86
|
+
# Use `runs:/<run_id>/<artifact_path>` to download both run and model (if exists) artifacts
|
87
|
+
if run_id and artifact_path:
|
88
|
+
return _download_artifact_from_uri(
|
89
|
+
f"runs:/{posixpath.join(run_id, artifact_path)}",
|
90
|
+
output_path=dst_path,
|
91
|
+
tracking_uri=tracking_uri,
|
92
|
+
)
|
93
|
+
|
94
|
+
artifact_path = artifact_path if artifact_path is not None else ""
|
95
|
+
|
96
|
+
store = _get_store(store_uri=tracking_uri)
|
97
|
+
artifact_uri = store.get_run(run_id).info.artifact_uri
|
98
|
+
artifact_repo = get_artifact_repository(
|
99
|
+
add_databricks_profile_info_to_artifact_uri(artifact_uri, tracking_uri),
|
100
|
+
tracking_uri=tracking_uri,
|
101
|
+
)
|
102
|
+
return artifact_repo.download_artifacts(artifact_path, dst_path=dst_path)
|
103
|
+
|
104
|
+
|
105
|
+
def list_artifacts(
|
106
|
+
artifact_uri: Optional[str] = None,
|
107
|
+
run_id: Optional[str] = None,
|
108
|
+
artifact_path: Optional[str] = None,
|
109
|
+
tracking_uri: Optional[str] = None,
|
110
|
+
) -> list[FileInfo]:
|
111
|
+
"""List artifacts at the specified URI.
|
112
|
+
|
113
|
+
Args:
|
114
|
+
artifact_uri: URI pointing to the artifacts, such as
|
115
|
+
``"runs:/500cf58bee2b40a4a82861cc31a617b1/my_model.pkl"``,
|
116
|
+
``"models:/my_model/Production"``, or ``"s3://my_bucket/my/file.txt"``.
|
117
|
+
Exactly one of ``artifact_uri`` or ``run_id`` must be specified.
|
118
|
+
run_id: ID of the MLflow Run containing the artifacts. Exactly one of ``run_id`` or
|
119
|
+
``artifact_uri`` must be specified.
|
120
|
+
artifact_path: (For use with ``run_id``) If specified, a path relative to the MLflow
|
121
|
+
Run's root directory containing the artifacts to list.
|
122
|
+
tracking_uri: The tracking URI to be used when list artifacts.
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
List of artifacts as FileInfo listed directly under path.
|
126
|
+
"""
|
127
|
+
if (run_id, artifact_uri).count(None) != 1:
|
128
|
+
raise MlflowException.invalid_parameter_value(
|
129
|
+
message="Exactly one of `run_id` or `artifact_uri` must be specified",
|
130
|
+
)
|
131
|
+
elif artifact_uri is not None and artifact_path is not None:
|
132
|
+
raise MlflowException.invalid_parameter_value(
|
133
|
+
message="`artifact_path` cannot be specified if `artifact_uri` is specified",
|
134
|
+
)
|
135
|
+
|
136
|
+
if artifact_uri is not None:
|
137
|
+
root_uri, artifact_path = _get_root_uri_and_artifact_path(artifact_uri)
|
138
|
+
return get_artifact_repository(
|
139
|
+
artifact_uri=root_uri, tracking_uri=tracking_uri
|
140
|
+
).list_artifacts(artifact_path)
|
141
|
+
|
142
|
+
# Use `runs:/<run_id>/<artifact_path>` to list both run and model (if exists) artifacts
|
143
|
+
if run_id and artifact_path:
|
144
|
+
return get_artifact_repository(
|
145
|
+
artifact_uri=f"runs:/{run_id}", tracking_uri=tracking_uri
|
146
|
+
).list_artifacts(artifact_path)
|
147
|
+
|
148
|
+
store = _get_store(store_uri=tracking_uri)
|
149
|
+
artifact_uri = store.get_run(run_id).info.artifact_uri
|
150
|
+
artifact_repo = get_artifact_repository(
|
151
|
+
add_databricks_profile_info_to_artifact_uri(artifact_uri, tracking_uri),
|
152
|
+
tracking_uri=tracking_uri,
|
153
|
+
)
|
154
|
+
return artifact_repo.list_artifacts(artifact_path)
|
155
|
+
|
156
|
+
|
157
|
+
def load_text(artifact_uri: str) -> str:
|
158
|
+
"""Loads the artifact contents as a string.
|
159
|
+
|
160
|
+
Args:
|
161
|
+
artifact_uri: Artifact location.
|
162
|
+
|
163
|
+
Returns:
|
164
|
+
The contents of the artifact as a string.
|
165
|
+
|
166
|
+
.. code-block:: python
|
167
|
+
:caption: Example
|
168
|
+
|
169
|
+
import mlflow
|
170
|
+
|
171
|
+
with mlflow.start_run() as run:
|
172
|
+
artifact_uri = run.info.artifact_uri
|
173
|
+
mlflow.log_text("This is a sentence", "file.txt")
|
174
|
+
file_content = mlflow.artifacts.load_text(artifact_uri + "/file.txt")
|
175
|
+
print(file_content)
|
176
|
+
|
177
|
+
.. code-block:: text
|
178
|
+
:caption: Output
|
179
|
+
|
180
|
+
This is a sentence
|
181
|
+
"""
|
182
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
183
|
+
local_artifact = download_artifacts(artifact_uri, dst_path=tmpdir)
|
184
|
+
with open(local_artifact) as local_artifact_fd:
|
185
|
+
try:
|
186
|
+
return str(local_artifact_fd.read())
|
187
|
+
except Exception:
|
188
|
+
raise MlflowException("Unable to form a str object from file content", BAD_REQUEST)
|
189
|
+
|
190
|
+
|
191
|
+
def load_dict(artifact_uri: str) -> dict[str, Any]:
|
192
|
+
"""Loads the artifact contents as a dictionary.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
artifact_uri: artifact location.
|
196
|
+
|
197
|
+
Returns:
|
198
|
+
A dictionary.
|
199
|
+
|
200
|
+
.. code-block:: python
|
201
|
+
:caption: Example
|
202
|
+
|
203
|
+
import mlflow
|
204
|
+
|
205
|
+
with mlflow.start_run() as run:
|
206
|
+
artifact_uri = run.info.artifact_uri
|
207
|
+
mlflow.log_dict({"mlflow-version": "0.28", "n_cores": "10"}, "config.json")
|
208
|
+
config_json = mlflow.artifacts.load_dict(artifact_uri + "/config.json")
|
209
|
+
print(config_json)
|
210
|
+
|
211
|
+
.. code-block:: text
|
212
|
+
:caption: Output
|
213
|
+
|
214
|
+
{'mlflow-version': '0.28', 'n_cores': '10'}
|
215
|
+
"""
|
216
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
217
|
+
local_artifact = download_artifacts(artifact_uri, dst_path=tmpdir)
|
218
|
+
with open(local_artifact) as local_artifact_fd:
|
219
|
+
try:
|
220
|
+
return json.load(local_artifact_fd)
|
221
|
+
except json.JSONDecodeError:
|
222
|
+
raise MlflowException("Unable to form a JSON object from file content", BAD_REQUEST)
|
223
|
+
|
224
|
+
|
225
|
+
def load_image(artifact_uri: str):
|
226
|
+
"""Loads artifact contents as a ``PIL.Image.Image`` object
|
227
|
+
|
228
|
+
Args:
|
229
|
+
artifact_uri: Artifact location.
|
230
|
+
|
231
|
+
Returns:
|
232
|
+
A PIL.Image object.
|
233
|
+
|
234
|
+
.. code-block:: python
|
235
|
+
:caption: Example
|
236
|
+
|
237
|
+
import mlflow
|
238
|
+
from PIL import Image
|
239
|
+
|
240
|
+
with mlflow.start_run() as run:
|
241
|
+
image = Image.new("RGB", (100, 100))
|
242
|
+
artifact_uri = run.info.artifact_uri
|
243
|
+
mlflow.log_image(image, "image.png")
|
244
|
+
image = mlflow.artifacts.load_image(artifact_uri + "/image.png")
|
245
|
+
print(image)
|
246
|
+
|
247
|
+
.. code-block:: text
|
248
|
+
:caption: Output
|
249
|
+
|
250
|
+
<PIL.PngImagePlugin.PngImageFile image mode=RGB size=100x100 at 0x11D2FA3D0>
|
251
|
+
"""
|
252
|
+
try:
|
253
|
+
from PIL import Image
|
254
|
+
except ImportError as exc:
|
255
|
+
raise ImportError(
|
256
|
+
"`load_image` requires Pillow. Please install it via: pip install Pillow"
|
257
|
+
) from exc
|
258
|
+
|
259
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
260
|
+
local_artifact = download_artifacts(artifact_uri, dst_path=tmpdir)
|
261
|
+
try:
|
262
|
+
image_obj = Image.open(local_artifact)
|
263
|
+
image_obj.load()
|
264
|
+
return image_obj
|
265
|
+
except Exception:
|
266
|
+
raise MlflowException(
|
267
|
+
"Unable to form a PIL Image object from file content", BAD_REQUEST
|
268
|
+
)
|
@@ -0,0 +1,144 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Any, Optional
|
3
|
+
|
4
|
+
from pydantic import BaseModel
|
5
|
+
|
6
|
+
import mlflow
|
7
|
+
from mlflow.autogen.chat import (
|
8
|
+
convert_assistant_message_to_chat_message,
|
9
|
+
log_chat_messages,
|
10
|
+
log_tools,
|
11
|
+
)
|
12
|
+
from mlflow.entities import SpanType
|
13
|
+
from mlflow.tracing.constant import SpanAttributeKey, TokenUsageKey
|
14
|
+
from mlflow.tracing.utils import construct_full_inputs, set_span_chat_messages
|
15
|
+
from mlflow.utils.annotations import experimental
|
16
|
+
from mlflow.utils.autologging_utils import (
|
17
|
+
autologging_integration,
|
18
|
+
get_autologging_config,
|
19
|
+
safe_patch,
|
20
|
+
)
|
21
|
+
|
22
|
+
_logger = logging.getLogger(__name__)
|
23
|
+
FLAVOR_NAME = "autogen"
|
24
|
+
|
25
|
+
|
26
|
+
@experimental(version="2.16.0")
|
27
|
+
@autologging_integration(FLAVOR_NAME)
|
28
|
+
def autolog(
|
29
|
+
log_traces: bool = True,
|
30
|
+
disable: bool = False,
|
31
|
+
silent: bool = False,
|
32
|
+
):
|
33
|
+
"""
|
34
|
+
Enables (or disables) and configures autologging for AutoGen flavor.
|
35
|
+
Due to its patch design, this method needs to be called after importing AutoGen classes.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
log_traces: If ``True``, traces are logged for AutoGen models.
|
39
|
+
If ``False``, no traces are collected during inference. Default to ``True``.
|
40
|
+
disable: If ``True``, disables the AutoGen autologging. Default to ``False``.
|
41
|
+
silent: If ``True``, suppress all event logs and warnings from MLflow during AutoGen
|
42
|
+
autologging. If ``False``, show all events and warnings.
|
43
|
+
|
44
|
+
Example:
|
45
|
+
|
46
|
+
.. code-block:: python
|
47
|
+
:caption: Example
|
48
|
+
|
49
|
+
import mlflow
|
50
|
+
from autogen_agentchat.agents import AssistantAgent
|
51
|
+
from autogen_ext.models.openai import OpenAIChatCompletionClient
|
52
|
+
|
53
|
+
mlflow.autogen.autolog()
|
54
|
+
agent = AssistantAgent("assistant", OpenAIChatCompletionClient(model="gpt-4o-mini"))
|
55
|
+
result = await agent.run(task="Say 'Hello World!'")
|
56
|
+
print(result)
|
57
|
+
"""
|
58
|
+
from autogen_agentchat.agents import BaseChatAgent
|
59
|
+
from autogen_core.models import ChatCompletionClient
|
60
|
+
|
61
|
+
async def patched_completion(original, self, *args, **kwargs):
|
62
|
+
if not get_autologging_config(FLAVOR_NAME, "log_traces"):
|
63
|
+
return await original(self, *args, **kwargs)
|
64
|
+
else:
|
65
|
+
with mlflow.start_span(original.__name__, span_type=SpanType.LLM) as span:
|
66
|
+
inputs = construct_full_inputs(original, self, *args, **kwargs)
|
67
|
+
span.set_inputs(
|
68
|
+
{key: _convert_value_to_dict(value) for key, value in inputs.items()}
|
69
|
+
)
|
70
|
+
|
71
|
+
if tools := inputs.get("tools"):
|
72
|
+
log_tools(span, tools)
|
73
|
+
|
74
|
+
if messages := inputs.get("messages"):
|
75
|
+
log_chat_messages(span, messages)
|
76
|
+
|
77
|
+
outputs = await original(self, *args, **kwargs)
|
78
|
+
|
79
|
+
if content := getattr(outputs, "content", None):
|
80
|
+
if chat_message := convert_assistant_message_to_chat_message(content):
|
81
|
+
set_span_chat_messages(span, [chat_message], append=True)
|
82
|
+
|
83
|
+
if usage := _parse_usage(outputs):
|
84
|
+
span.set_attribute(SpanAttributeKey.CHAT_USAGE, usage)
|
85
|
+
|
86
|
+
span.set_outputs(_convert_value_to_dict(outputs))
|
87
|
+
|
88
|
+
return outputs
|
89
|
+
|
90
|
+
async def patched_agent(original, self, *args, **kwargs):
|
91
|
+
if not get_autologging_config(FLAVOR_NAME, "log_traces"):
|
92
|
+
return await original(self, *args, **kwargs)
|
93
|
+
else:
|
94
|
+
with mlflow.start_span(original.__name__, span_type=SpanType.AGENT) as span:
|
95
|
+
inputs = construct_full_inputs(original, self, *args, **kwargs)
|
96
|
+
span.set_inputs(
|
97
|
+
{key: _convert_value_to_dict(value) for key, value in inputs.items()}
|
98
|
+
)
|
99
|
+
|
100
|
+
if tools := getattr(self, "_tools", None):
|
101
|
+
log_tools(span, tools)
|
102
|
+
|
103
|
+
outputs = await original(self, *args, **kwargs)
|
104
|
+
|
105
|
+
span.set_outputs(_convert_value_to_dict(outputs))
|
106
|
+
|
107
|
+
return outputs
|
108
|
+
|
109
|
+
for cls in BaseChatAgent.__subclasses__():
|
110
|
+
safe_patch(FLAVOR_NAME, cls, "run", patched_agent)
|
111
|
+
safe_patch(FLAVOR_NAME, cls, "on_messages", patched_agent)
|
112
|
+
|
113
|
+
for cls in _get_all_subclasses(ChatCompletionClient):
|
114
|
+
safe_patch(FLAVOR_NAME, cls, "create", patched_completion)
|
115
|
+
|
116
|
+
|
117
|
+
def _convert_value_to_dict(value):
|
118
|
+
# BaseChatMessage does not contain content and type attributes
|
119
|
+
return value.model_dump(serialize_as_any=True) if isinstance(value, BaseModel) else value
|
120
|
+
|
121
|
+
|
122
|
+
def _get_all_subclasses(cls):
|
123
|
+
"""Get all subclasses recursively"""
|
124
|
+
all_subclasses = []
|
125
|
+
|
126
|
+
for subclass in cls.__subclasses__():
|
127
|
+
all_subclasses.append(subclass)
|
128
|
+
all_subclasses.extend(_get_all_subclasses(subclass))
|
129
|
+
|
130
|
+
return all_subclasses
|
131
|
+
|
132
|
+
|
133
|
+
def _parse_usage(output: Any) -> Optional[dict[str, int]]:
|
134
|
+
try:
|
135
|
+
usage = getattr(output, "usage", None)
|
136
|
+
if usage:
|
137
|
+
return {
|
138
|
+
TokenUsageKey.INPUT_TOKENS: usage.prompt_tokens,
|
139
|
+
TokenUsageKey.OUTPUT_TOKENS: usage.completion_tokens,
|
140
|
+
TokenUsageKey.TOTAL_TOKENS: usage.prompt_tokens + usage.completion_tokens,
|
141
|
+
}
|
142
|
+
except Exception as e:
|
143
|
+
_logger.debug(f"Failed to parse token usage from output: {e}")
|
144
|
+
return None
|
mlflow/autogen/chat.py
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import TYPE_CHECKING, Optional, Union
|
3
|
+
|
4
|
+
from opentelemetry.sdk.trace import Span
|
5
|
+
|
6
|
+
from mlflow.tracing.utils import set_span_chat_messages, set_span_chat_tools
|
7
|
+
from mlflow.types.chat import (
|
8
|
+
ChatMessage,
|
9
|
+
ChatTool,
|
10
|
+
Function,
|
11
|
+
TextContentPart,
|
12
|
+
ToolCall,
|
13
|
+
)
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from autogen_core import FunctionCall
|
17
|
+
from autogen_core.models import LLMMessage
|
18
|
+
from autogen_core.tools import BaseTool, ToolSchema
|
19
|
+
|
20
|
+
_logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
|
23
|
+
def log_tools(span: Span, tools: list[Union["BaseTool", "ToolSchema"]]):
|
24
|
+
"""
|
25
|
+
Log Autogen tool definitions into the passed in span.
|
26
|
+
|
27
|
+
Ref: https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/components/tools.html
|
28
|
+
|
29
|
+
Args:
|
30
|
+
span: The span to log the tools into.
|
31
|
+
tools: A list of Autogen BaseTool.
|
32
|
+
"""
|
33
|
+
from autogen_core.tools import BaseTool
|
34
|
+
|
35
|
+
try:
|
36
|
+
tools = [
|
37
|
+
ChatTool(
|
38
|
+
type="function",
|
39
|
+
function=tool.schema if isinstance(tool, BaseTool) else tool,
|
40
|
+
)
|
41
|
+
for tool in tools
|
42
|
+
]
|
43
|
+
set_span_chat_tools(span, tools)
|
44
|
+
except Exception:
|
45
|
+
_logger.debug(f"Failed to log tools to Span {span}.", exc_info=True)
|
46
|
+
|
47
|
+
|
48
|
+
def convert_assistant_message_to_chat_message(
|
49
|
+
content: Union[str, list["FunctionCall"]],
|
50
|
+
) -> Optional[ChatMessage]:
|
51
|
+
"""
|
52
|
+
Convert an Autogen assistant message to a ChatMessage.
|
53
|
+
The content of assistant message is a str or a list of tool calls.
|
54
|
+
|
55
|
+
Args:
|
56
|
+
content: The Autogen assistant message content to convert.
|
57
|
+
|
58
|
+
Returns:
|
59
|
+
A ChatMessage object
|
60
|
+
"""
|
61
|
+
from autogen_core import FunctionCall
|
62
|
+
|
63
|
+
if isinstance(content, str):
|
64
|
+
return ChatMessage(role="assistant", content=content)
|
65
|
+
elif isinstance(content, list) and all(isinstance(f, FunctionCall) for f in content):
|
66
|
+
return ChatMessage(
|
67
|
+
role="assistant",
|
68
|
+
tool_calls=[
|
69
|
+
ToolCall(
|
70
|
+
id=f.id, type="function", function=Function(name=f.name, arguments=f.arguments)
|
71
|
+
)
|
72
|
+
for f in content
|
73
|
+
],
|
74
|
+
)
|
75
|
+
else:
|
76
|
+
_logger.debug(f"Unsupported message type: {type(content)}. Skipping conversion.")
|
77
|
+
|
78
|
+
|
79
|
+
def log_chat_messages(span: Span, messages: list["LLMMessage"]):
|
80
|
+
"""
|
81
|
+
Log Autogen chat messages into the passed in span.
|
82
|
+
|
83
|
+
Args:
|
84
|
+
span: The span to log the tools into.
|
85
|
+
messages: A list of Autogen chat messages.
|
86
|
+
"""
|
87
|
+
from autogen_core.models import (
|
88
|
+
AssistantMessage,
|
89
|
+
FunctionExecutionResultMessage,
|
90
|
+
SystemMessage,
|
91
|
+
UserMessage,
|
92
|
+
)
|
93
|
+
|
94
|
+
chat_messages = []
|
95
|
+
for message in messages:
|
96
|
+
if isinstance(message, SystemMessage):
|
97
|
+
chat_messages.append(
|
98
|
+
ChatMessage(
|
99
|
+
role="system",
|
100
|
+
content=message.content,
|
101
|
+
)
|
102
|
+
)
|
103
|
+
elif isinstance(message, UserMessage):
|
104
|
+
content = message.content
|
105
|
+
if isinstance(content, list):
|
106
|
+
parts = []
|
107
|
+
for part in content:
|
108
|
+
if isinstance(part, str):
|
109
|
+
parts.append(
|
110
|
+
TextContentPart(
|
111
|
+
type="text",
|
112
|
+
text=part,
|
113
|
+
)
|
114
|
+
)
|
115
|
+
else:
|
116
|
+
# The content type of UserMessage is text or image
|
117
|
+
parts.append(part.to_openai_format())
|
118
|
+
content = parts
|
119
|
+
chat_messages.append(
|
120
|
+
ChatMessage(
|
121
|
+
role="user",
|
122
|
+
content=content,
|
123
|
+
)
|
124
|
+
)
|
125
|
+
elif isinstance(message, AssistantMessage):
|
126
|
+
content = message.content
|
127
|
+
if chat_message := convert_assistant_message_to_chat_message(content):
|
128
|
+
chat_messages.append(chat_message)
|
129
|
+
elif isinstance(message, FunctionExecutionResultMessage):
|
130
|
+
chat_messages.append(
|
131
|
+
ChatMessage(
|
132
|
+
role="user",
|
133
|
+
content=message.model_dump(),
|
134
|
+
)
|
135
|
+
)
|
136
|
+
else:
|
137
|
+
_logger.debug(f"Unsupported message type: {type(message)}. Skipping logging.")
|
138
|
+
|
139
|
+
try:
|
140
|
+
set_span_chat_messages(span, chat_messages)
|
141
|
+
except Exception:
|
142
|
+
_logger.debug(f"Failed to log chat messages to Span {span}.", exc_info=True)
|
mlflow/azure/__init__.py
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
"""Azure authentication support for MLflow."""
|
2
|
+
|
3
|
+
from mlflow.azure.config import AzureAuthConfig, AuthMethod
|
4
|
+
from mlflow.azure.auth_handler import AzureAuthHandler
|
5
|
+
from mlflow.azure.connection_factory import ConnectionFactory
|
6
|
+
from mlflow.azure.stores import create_store, get_azure_tracking_store, test_azure_connection
|
7
|
+
from mlflow.azure.exceptions import (
|
8
|
+
AzureAuthError,
|
9
|
+
TokenAcquisitionError,
|
10
|
+
ConnectionError,
|
11
|
+
ConfigurationError,
|
12
|
+
)
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"AzureAuthConfig",
|
16
|
+
"AuthMethod",
|
17
|
+
"AzureAuthHandler",
|
18
|
+
"ConnectionFactory",
|
19
|
+
"create_store",
|
20
|
+
"get_azure_tracking_store",
|
21
|
+
"test_azure_connection",
|
22
|
+
"AzureAuthError",
|
23
|
+
"TokenAcquisitionError",
|
24
|
+
"ConnectionError",
|
25
|
+
"ConfigurationError",
|
26
|
+
]
|