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,201 @@
|
|
1
|
+
"""
|
2
|
+
THE 'mlflow.evaluation` MODULE IS LEGACY AND WILL BE REMOVED SOON. PLEASE DO NOT USE THESE CLASSES
|
3
|
+
IN NEW CODE. INSTEAD, USE `mlflow/entities/assessment.py` FOR ASSESSMENT CLASSES.
|
4
|
+
"""
|
5
|
+
|
6
|
+
import pandas as pd
|
7
|
+
|
8
|
+
from mlflow.evaluation.evaluation import EvaluationEntity as EvaluationEntity
|
9
|
+
from mlflow.utils.annotations import deprecated
|
10
|
+
|
11
|
+
|
12
|
+
@deprecated(since="3.0.0")
|
13
|
+
def evaluations_to_dataframes(
|
14
|
+
evaluations: list[EvaluationEntity],
|
15
|
+
) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]:
|
16
|
+
"""
|
17
|
+
Converts a list of Evaluation entities to four separate DataFrames: one for main evaluation
|
18
|
+
data (excluding assessments and metrics), one for metrics, one for assessments, and one for
|
19
|
+
tags.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
evaluations (List[Evaluation]): List of Evaluation entities.
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]: A tuple of four DataFrames
|
26
|
+
containing evaluation data, metrics data, assessments data, and tags data.
|
27
|
+
"""
|
28
|
+
evaluations_data = []
|
29
|
+
metrics_data = []
|
30
|
+
assessments_data = []
|
31
|
+
tags_data = []
|
32
|
+
|
33
|
+
for evaluation in evaluations:
|
34
|
+
eval_dict = evaluation.to_dictionary()
|
35
|
+
|
36
|
+
# Extract assessment and metrics
|
37
|
+
assessments_list = eval_dict.pop("assessments", [])
|
38
|
+
metrics_list = eval_dict.pop("metrics", [])
|
39
|
+
tags_list = eval_dict.pop("tags", [])
|
40
|
+
|
41
|
+
evaluations_data.append(eval_dict)
|
42
|
+
|
43
|
+
for metric_dict in metrics_list:
|
44
|
+
metric_dict["evaluation_id"] = eval_dict["evaluation_id"]
|
45
|
+
# Remove 'step' key if it exists, since it is not valid for evaluation metrics
|
46
|
+
metric_dict.pop("step", None)
|
47
|
+
metrics_data.append(metric_dict)
|
48
|
+
|
49
|
+
for assess_dict in assessments_list:
|
50
|
+
assess_dict["evaluation_id"] = eval_dict["evaluation_id"]
|
51
|
+
assessments_data.append(assess_dict)
|
52
|
+
|
53
|
+
for tag_dict in tags_list:
|
54
|
+
tag_dict["evaluation_id"] = eval_dict["evaluation_id"]
|
55
|
+
tags_data.append(tag_dict)
|
56
|
+
|
57
|
+
evaluations_df = (
|
58
|
+
_apply_schema_to_dataframe(
|
59
|
+
pd.DataFrame(evaluations_data), _get_evaluations_dataframe_schema()
|
60
|
+
)
|
61
|
+
if evaluations_data
|
62
|
+
else _get_empty_evaluations_dataframe()
|
63
|
+
)
|
64
|
+
metrics_df = (
|
65
|
+
_apply_schema_to_dataframe(pd.DataFrame(metrics_data), _get_metrics_dataframe_schema())
|
66
|
+
if metrics_data
|
67
|
+
else _get_empty_metrics_dataframe()
|
68
|
+
)
|
69
|
+
assessments_df = (
|
70
|
+
_apply_schema_to_dataframe(
|
71
|
+
pd.DataFrame(assessments_data), _get_assessments_dataframe_schema()
|
72
|
+
)
|
73
|
+
if assessments_data
|
74
|
+
else _get_empty_assessments_dataframe()
|
75
|
+
)
|
76
|
+
tags_df = (
|
77
|
+
_apply_schema_to_dataframe(pd.DataFrame(tags_data), _get_tags_dataframe_schema())
|
78
|
+
if tags_data
|
79
|
+
else _get_empty_tags_dataframe()
|
80
|
+
)
|
81
|
+
|
82
|
+
return evaluations_df, metrics_df, assessments_df, tags_df
|
83
|
+
|
84
|
+
|
85
|
+
def _get_evaluations_dataframe_schema() -> dict[str, str]:
|
86
|
+
"""
|
87
|
+
Returns the pandas schema for the evaluation DataFrame.
|
88
|
+
"""
|
89
|
+
return {
|
90
|
+
"evaluation_id": "string",
|
91
|
+
"run_id": "string",
|
92
|
+
"inputs_id": "string",
|
93
|
+
"inputs": "object",
|
94
|
+
"outputs": "object",
|
95
|
+
"request_id": "object",
|
96
|
+
"targets": "object",
|
97
|
+
"error_code": "object",
|
98
|
+
"error_message": "object",
|
99
|
+
}
|
100
|
+
|
101
|
+
|
102
|
+
def _get_empty_evaluations_dataframe() -> pd.DataFrame:
|
103
|
+
"""
|
104
|
+
Creates an empty DataFrame with columns for evaluation data.
|
105
|
+
"""
|
106
|
+
schema = _get_evaluations_dataframe_schema()
|
107
|
+
df = pd.DataFrame(columns=schema.keys())
|
108
|
+
return _apply_schema_to_dataframe(df, schema)
|
109
|
+
|
110
|
+
|
111
|
+
def _get_assessments_dataframe_schema() -> dict[str, str]:
|
112
|
+
"""
|
113
|
+
Returns the pandas schema for the assessments DataFrame.
|
114
|
+
"""
|
115
|
+
return {
|
116
|
+
"evaluation_id": "string",
|
117
|
+
"name": "string",
|
118
|
+
"source": "object",
|
119
|
+
"timestamp": "int64",
|
120
|
+
"boolean_value": "object",
|
121
|
+
"numeric_value": "object",
|
122
|
+
"string_value": "object",
|
123
|
+
"rationale": "object",
|
124
|
+
"metadata": "object",
|
125
|
+
"error_code": "object",
|
126
|
+
"error_message": "object",
|
127
|
+
"span_id": "object",
|
128
|
+
}
|
129
|
+
|
130
|
+
|
131
|
+
def _get_empty_assessments_dataframe() -> pd.DataFrame:
|
132
|
+
"""
|
133
|
+
Creates an empty DataFrame with columns for evaluation assessments data.
|
134
|
+
"""
|
135
|
+
schema = _get_assessments_dataframe_schema()
|
136
|
+
df = pd.DataFrame(columns=schema.keys())
|
137
|
+
return _apply_schema_to_dataframe(df, schema)
|
138
|
+
|
139
|
+
|
140
|
+
def _get_metrics_dataframe_schema() -> dict[str, str]:
|
141
|
+
"""
|
142
|
+
Returns the pandas schema for the metrics DataFrame.
|
143
|
+
"""
|
144
|
+
return {
|
145
|
+
"evaluation_id": "string",
|
146
|
+
"key": "string",
|
147
|
+
"value": "float64",
|
148
|
+
"timestamp": "int64",
|
149
|
+
"model_id": "string",
|
150
|
+
"dataset_name": "string",
|
151
|
+
"dataset_digest": "string",
|
152
|
+
"run_id": "string",
|
153
|
+
}
|
154
|
+
|
155
|
+
|
156
|
+
def _get_empty_metrics_dataframe() -> pd.DataFrame:
|
157
|
+
"""
|
158
|
+
Creates an empty DataFrame with columns for evaluation metric data.
|
159
|
+
"""
|
160
|
+
schema = _get_metrics_dataframe_schema()
|
161
|
+
df = pd.DataFrame(columns=schema.keys())
|
162
|
+
return _apply_schema_to_dataframe(df, schema)
|
163
|
+
|
164
|
+
|
165
|
+
def _get_tags_dataframe_schema() -> dict[str, str]:
|
166
|
+
"""
|
167
|
+
Returns the pandas schema for the tags DataFrame.
|
168
|
+
"""
|
169
|
+
return {
|
170
|
+
"evaluation_id": "string",
|
171
|
+
"key": "string",
|
172
|
+
"value": "string",
|
173
|
+
}
|
174
|
+
|
175
|
+
|
176
|
+
def _get_empty_tags_dataframe() -> pd.DataFrame:
|
177
|
+
"""
|
178
|
+
Creates an empty DataFrame with columns for evaluation tags data.
|
179
|
+
"""
|
180
|
+
schema = _get_tags_dataframe_schema()
|
181
|
+
df = pd.DataFrame(columns=schema.keys())
|
182
|
+
return _apply_schema_to_dataframe(df, schema)
|
183
|
+
|
184
|
+
|
185
|
+
def _apply_schema_to_dataframe(df: pd.DataFrame, schema: dict[str, str]) -> pd.DataFrame:
|
186
|
+
"""
|
187
|
+
Applies a schema to a DataFrame.
|
188
|
+
|
189
|
+
Args:
|
190
|
+
df (pd.DataFrame): DataFrame to apply the schema to.
|
191
|
+
schema (Dict[str, Any]): Schema to apply.
|
192
|
+
|
193
|
+
Returns:
|
194
|
+
pd.DataFrame: DataFrame with schema applied.
|
195
|
+
"""
|
196
|
+
for column in df.columns:
|
197
|
+
df[column] = df[column].astype(schema[column])
|
198
|
+
# By default, null values are represented as `pd.NA` in pandas when reading a dataframe from
|
199
|
+
# JSON. However, MLflow entities use `None` to represent null values. Accordingly, we convert
|
200
|
+
# instances of pd.NA to None so that DataFrame rows can be parsed as MLflow entities
|
201
|
+
return df.replace(pd.NA, None)
|
mlflow/exceptions.py
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from typing import Optional
|
4
|
+
|
5
|
+
from mlflow.protos.databricks_pb2 import (
|
6
|
+
ABORTED,
|
7
|
+
ALREADY_EXISTS,
|
8
|
+
BAD_REQUEST,
|
9
|
+
CANCELLED,
|
10
|
+
CUSTOMER_UNAUTHORIZED,
|
11
|
+
DATA_LOSS,
|
12
|
+
DEADLINE_EXCEEDED,
|
13
|
+
ENDPOINT_NOT_FOUND,
|
14
|
+
INTERNAL_ERROR,
|
15
|
+
INVALID_PARAMETER_VALUE,
|
16
|
+
INVALID_STATE,
|
17
|
+
NOT_FOUND,
|
18
|
+
NOT_IMPLEMENTED,
|
19
|
+
PERMISSION_DENIED,
|
20
|
+
REQUEST_LIMIT_EXCEEDED,
|
21
|
+
RESOURCE_ALREADY_EXISTS,
|
22
|
+
RESOURCE_CONFLICT,
|
23
|
+
RESOURCE_DOES_NOT_EXIST,
|
24
|
+
RESOURCE_EXHAUSTED,
|
25
|
+
TEMPORARILY_UNAVAILABLE,
|
26
|
+
UNAUTHENTICATED,
|
27
|
+
ErrorCode,
|
28
|
+
)
|
29
|
+
|
30
|
+
ERROR_CODE_TO_HTTP_STATUS = {
|
31
|
+
ErrorCode.Name(INTERNAL_ERROR): 500,
|
32
|
+
ErrorCode.Name(INVALID_STATE): 500,
|
33
|
+
ErrorCode.Name(DATA_LOSS): 500,
|
34
|
+
ErrorCode.Name(NOT_IMPLEMENTED): 501,
|
35
|
+
ErrorCode.Name(TEMPORARILY_UNAVAILABLE): 503,
|
36
|
+
ErrorCode.Name(DEADLINE_EXCEEDED): 504,
|
37
|
+
ErrorCode.Name(REQUEST_LIMIT_EXCEEDED): 429,
|
38
|
+
ErrorCode.Name(CANCELLED): 499,
|
39
|
+
ErrorCode.Name(RESOURCE_EXHAUSTED): 429,
|
40
|
+
ErrorCode.Name(ABORTED): 409,
|
41
|
+
ErrorCode.Name(RESOURCE_CONFLICT): 409,
|
42
|
+
ErrorCode.Name(ALREADY_EXISTS): 409,
|
43
|
+
ErrorCode.Name(NOT_FOUND): 404,
|
44
|
+
ErrorCode.Name(ENDPOINT_NOT_FOUND): 404,
|
45
|
+
ErrorCode.Name(RESOURCE_DOES_NOT_EXIST): 404,
|
46
|
+
ErrorCode.Name(PERMISSION_DENIED): 403,
|
47
|
+
ErrorCode.Name(CUSTOMER_UNAUTHORIZED): 401,
|
48
|
+
ErrorCode.Name(UNAUTHENTICATED): 401,
|
49
|
+
ErrorCode.Name(BAD_REQUEST): 400,
|
50
|
+
ErrorCode.Name(RESOURCE_ALREADY_EXISTS): 400,
|
51
|
+
ErrorCode.Name(INVALID_PARAMETER_VALUE): 400,
|
52
|
+
}
|
53
|
+
|
54
|
+
HTTP_STATUS_TO_ERROR_CODE = {v: k for k, v in ERROR_CODE_TO_HTTP_STATUS.items()}
|
55
|
+
HTTP_STATUS_TO_ERROR_CODE[400] = ErrorCode.Name(BAD_REQUEST)
|
56
|
+
HTTP_STATUS_TO_ERROR_CODE[404] = ErrorCode.Name(ENDPOINT_NOT_FOUND)
|
57
|
+
HTTP_STATUS_TO_ERROR_CODE[500] = ErrorCode.Name(INTERNAL_ERROR)
|
58
|
+
|
59
|
+
_logger = logging.getLogger(__name__)
|
60
|
+
|
61
|
+
|
62
|
+
def get_error_code(http_status):
|
63
|
+
return ErrorCode.Value(
|
64
|
+
HTTP_STATUS_TO_ERROR_CODE.get(http_status, ErrorCode.Name(INTERNAL_ERROR))
|
65
|
+
)
|
66
|
+
|
67
|
+
|
68
|
+
class MlflowException(Exception):
|
69
|
+
"""
|
70
|
+
Generic exception thrown to surface failure information about external-facing operations.
|
71
|
+
The error message associated with this exception may be exposed to clients in HTTP responses
|
72
|
+
for debugging purposes. If the error text is sensitive, raise a generic `Exception` object
|
73
|
+
instead.
|
74
|
+
"""
|
75
|
+
|
76
|
+
def __init__(self, message, error_code=INTERNAL_ERROR, **kwargs):
|
77
|
+
"""
|
78
|
+
Args:
|
79
|
+
message: The message or exception describing the error that occurred. This will be
|
80
|
+
included in the exception's serialized JSON representation.
|
81
|
+
error_code: An appropriate error code for the error that occurred; it will be
|
82
|
+
included in the exception's serialized JSON representation. This should
|
83
|
+
be one of the codes listed in the `mlflow.protos.databricks_pb2` proto.
|
84
|
+
kwargs: Additional key-value pairs to include in the serialized JSON representation
|
85
|
+
of the MlflowException.
|
86
|
+
"""
|
87
|
+
try:
|
88
|
+
self.error_code = ErrorCode.Name(error_code)
|
89
|
+
except (ValueError, TypeError):
|
90
|
+
self.error_code = ErrorCode.Name(INTERNAL_ERROR)
|
91
|
+
message = str(message)
|
92
|
+
self.message = message
|
93
|
+
self.json_kwargs = kwargs
|
94
|
+
super().__init__(message)
|
95
|
+
|
96
|
+
def serialize_as_json(self):
|
97
|
+
exception_dict = {"error_code": self.error_code, "message": self.message}
|
98
|
+
exception_dict.update(self.json_kwargs)
|
99
|
+
return json.dumps(exception_dict)
|
100
|
+
|
101
|
+
def get_http_status_code(self):
|
102
|
+
return ERROR_CODE_TO_HTTP_STATUS.get(self.error_code, 500)
|
103
|
+
|
104
|
+
@classmethod
|
105
|
+
def invalid_parameter_value(cls, message, **kwargs):
|
106
|
+
"""Constructs an `MlflowException` object with the `INVALID_PARAMETER_VALUE` error code.
|
107
|
+
|
108
|
+
Args:
|
109
|
+
message: The message describing the error that occurred. This will be included in the
|
110
|
+
exception's serialized JSON representation.
|
111
|
+
kwargs: Additional key-value pairs to include in the serialized JSON representation
|
112
|
+
of the MlflowException.
|
113
|
+
"""
|
114
|
+
return cls(message, error_code=INVALID_PARAMETER_VALUE, **kwargs)
|
115
|
+
|
116
|
+
|
117
|
+
class RestException(MlflowException):
|
118
|
+
"""Exception thrown on non 200-level responses from the REST API"""
|
119
|
+
|
120
|
+
def __init__(self, json):
|
121
|
+
self.json = json
|
122
|
+
|
123
|
+
error_code = json.get("error_code", ErrorCode.Name(INTERNAL_ERROR))
|
124
|
+
message = "{}: {}".format(
|
125
|
+
error_code,
|
126
|
+
json["message"] if "message" in json else "Response: " + str(json),
|
127
|
+
)
|
128
|
+
|
129
|
+
try:
|
130
|
+
super().__init__(message, error_code=ErrorCode.Value(error_code))
|
131
|
+
except ValueError:
|
132
|
+
try:
|
133
|
+
# The `error_code` can be an http error code, in which case we convert it to the
|
134
|
+
# corresponding `ErrorCode`.
|
135
|
+
error_code = HTTP_STATUS_TO_ERROR_CODE[int(error_code)]
|
136
|
+
super().__init__(message, error_code=ErrorCode.Value(error_code))
|
137
|
+
except ValueError or KeyError:
|
138
|
+
_logger.warning(
|
139
|
+
f"Received error code not recognized by MLflow: {error_code}, this may "
|
140
|
+
"indicate your request encountered an error before reaching MLflow server, "
|
141
|
+
"e.g., within a proxy server or authentication / authorization service."
|
142
|
+
)
|
143
|
+
super().__init__(message)
|
144
|
+
|
145
|
+
def __reduce__(self):
|
146
|
+
"""
|
147
|
+
Overriding `__reduce__` to make `RestException` instance pickle-able.
|
148
|
+
"""
|
149
|
+
return RestException, (self.json,)
|
150
|
+
|
151
|
+
|
152
|
+
class ExecutionException(MlflowException):
|
153
|
+
"""Exception thrown when executing a project fails"""
|
154
|
+
|
155
|
+
|
156
|
+
class MissingConfigException(MlflowException):
|
157
|
+
"""Exception thrown when expected configuration file/directory not found"""
|
158
|
+
|
159
|
+
|
160
|
+
class InvalidUrlException(MlflowException):
|
161
|
+
"""Exception thrown when a http request fails to send due to an invalid URL"""
|
162
|
+
|
163
|
+
|
164
|
+
class _UnsupportedMultipartUploadException(MlflowException):
|
165
|
+
"""Exception thrown when multipart upload is unsupported by an artifact repository"""
|
166
|
+
|
167
|
+
MESSAGE = "Multipart upload is not supported for the current artifact repository"
|
168
|
+
|
169
|
+
def __init__(self):
|
170
|
+
super().__init__(self.MESSAGE, error_code=NOT_IMPLEMENTED)
|
171
|
+
|
172
|
+
|
173
|
+
class MlflowTracingException(MlflowException):
|
174
|
+
"""
|
175
|
+
Exception thrown from tracing logic
|
176
|
+
|
177
|
+
Tracing logic should not block the main execution flow in general, hence this exception
|
178
|
+
is used to distinguish tracing related errors and handle them properly.
|
179
|
+
"""
|
180
|
+
|
181
|
+
def __init__(self, message, error_code=INTERNAL_ERROR):
|
182
|
+
super().__init__(message, error_code=error_code)
|
183
|
+
|
184
|
+
|
185
|
+
class MlflowTraceDataException(MlflowTracingException):
|
186
|
+
"""Exception thrown for trace data related error"""
|
187
|
+
|
188
|
+
def __init__(
|
189
|
+
self, error_code: str, request_id: Optional[str] = None, artifact_path: Optional[str] = None
|
190
|
+
):
|
191
|
+
if request_id:
|
192
|
+
self.ctx = f"request_id={request_id}"
|
193
|
+
elif artifact_path:
|
194
|
+
self.ctx = f"path={artifact_path}"
|
195
|
+
|
196
|
+
if error_code == NOT_FOUND:
|
197
|
+
super().__init__(f"Trace data not found for {self.ctx}", error_code=error_code)
|
198
|
+
elif error_code == INVALID_STATE:
|
199
|
+
super().__init__(f"Trace data is corrupted for {self.ctx}", error_code=error_code)
|
200
|
+
|
201
|
+
|
202
|
+
class MlflowTraceDataNotFound(MlflowTraceDataException):
|
203
|
+
"""Exception thrown when trace data is not found"""
|
204
|
+
|
205
|
+
def __init__(self, request_id: Optional[str] = None, artifact_path: Optional[str] = None):
|
206
|
+
super().__init__(NOT_FOUND, request_id, artifact_path)
|
207
|
+
|
208
|
+
|
209
|
+
class MlflowTraceDataCorrupted(MlflowTraceDataException):
|
210
|
+
"""Exception thrown when trace data is corrupted"""
|
211
|
+
|
212
|
+
def __init__(self, request_id: Optional[str] = None, artifact_path: Optional[str] = None):
|
213
|
+
super().__init__(INVALID_STATE, request_id, artifact_path)
|
mlflow/experiments.py
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
import click
|
4
|
+
|
5
|
+
import mlflow
|
6
|
+
from mlflow.entities import ViewType
|
7
|
+
from mlflow.tracking import _get_store, fluent
|
8
|
+
from mlflow.utils.data_utils import is_uri
|
9
|
+
from mlflow.utils.string_utils import _create_table
|
10
|
+
|
11
|
+
EXPERIMENT_ID = click.option("--experiment-id", "-x", type=click.STRING, required=True)
|
12
|
+
|
13
|
+
|
14
|
+
@click.group("experiments")
|
15
|
+
def commands():
|
16
|
+
"""
|
17
|
+
Manage experiments. To manage experiments associated with a tracking server, set the
|
18
|
+
MLFLOW_TRACKING_URI environment variable to the URL of the desired server.
|
19
|
+
"""
|
20
|
+
|
21
|
+
|
22
|
+
@commands.command()
|
23
|
+
@click.option("--experiment-name", "-n", type=click.STRING, required=True)
|
24
|
+
@click.option(
|
25
|
+
"--artifact-location",
|
26
|
+
"-l",
|
27
|
+
help="Base location for runs to store artifact results. Artifacts will be stored "
|
28
|
+
"at $artifact_location/$run_id/artifacts. See "
|
29
|
+
"https://mlflow.org/docs/latest/tracking.html#where-runs-are-recorded for "
|
30
|
+
"more info on the properties of artifact location. "
|
31
|
+
"If no location is provided, the tracking server will pick a default.",
|
32
|
+
)
|
33
|
+
def create(experiment_name, artifact_location):
|
34
|
+
"""
|
35
|
+
Create an experiment.
|
36
|
+
|
37
|
+
All artifacts generated by runs related to this experiment will be stored under artifact
|
38
|
+
location, organized under specific run_id sub-directories.
|
39
|
+
|
40
|
+
Implementation of experiment and metadata store is dependent on backend storage. ``FileStore``
|
41
|
+
creates a folder for each experiment ID and stores metadata in ``meta.yaml``. Runs are stored
|
42
|
+
as subfolders.
|
43
|
+
"""
|
44
|
+
store = _get_store()
|
45
|
+
exp_id = store.create_experiment(experiment_name, artifact_location)
|
46
|
+
click.echo(f"Created experiment '{experiment_name}' with id {exp_id}")
|
47
|
+
|
48
|
+
|
49
|
+
@commands.command("search")
|
50
|
+
@click.option(
|
51
|
+
"--view",
|
52
|
+
"-v",
|
53
|
+
default="active_only",
|
54
|
+
help="Select view type for experiments. Valid view types are "
|
55
|
+
"'active_only' (default), 'deleted_only', and 'all'.",
|
56
|
+
)
|
57
|
+
def search_experiments(view):
|
58
|
+
"""
|
59
|
+
Search for experiments in the configured tracking server.
|
60
|
+
"""
|
61
|
+
view_type = ViewType.from_string(view) if view else ViewType.ACTIVE_ONLY
|
62
|
+
experiments = mlflow.search_experiments(view_type=view_type)
|
63
|
+
table = [
|
64
|
+
[
|
65
|
+
exp.experiment_id,
|
66
|
+
exp.name,
|
67
|
+
exp.artifact_location
|
68
|
+
if is_uri(exp.artifact_location)
|
69
|
+
else os.path.abspath(exp.artifact_location),
|
70
|
+
]
|
71
|
+
for exp in experiments
|
72
|
+
]
|
73
|
+
click.echo(_create_table(sorted(table), headers=["Experiment Id", "Name", "Artifact Location"]))
|
74
|
+
|
75
|
+
|
76
|
+
@commands.command("delete")
|
77
|
+
@EXPERIMENT_ID
|
78
|
+
def delete_experiment(experiment_id):
|
79
|
+
"""
|
80
|
+
Mark an active experiment for deletion. This also applies to experiment's metadata, runs and
|
81
|
+
associated data, and artifacts if they are store in default location. Use ``list`` command to
|
82
|
+
view artifact location. Command will throw an error if experiment is not found or already
|
83
|
+
marked for deletion.
|
84
|
+
|
85
|
+
Experiments marked for deletion can be restored using ``restore`` command, unless they are
|
86
|
+
permanently deleted.
|
87
|
+
|
88
|
+
Specific implementation of deletion is dependent on backend stores. ``FileStore`` moves
|
89
|
+
experiments marked for deletion under a ``.trash`` folder under the main folder used to
|
90
|
+
instantiate ``FileStore``. Experiments marked for deletion can be permanently deleted by
|
91
|
+
clearing the ``.trash`` folder. It is recommended to use a ``cron`` job or an alternate
|
92
|
+
workflow mechanism to clear ``.trash`` folder.
|
93
|
+
"""
|
94
|
+
store = _get_store()
|
95
|
+
store.delete_experiment(experiment_id)
|
96
|
+
click.echo(f"Experiment with ID {experiment_id} has been deleted.")
|
97
|
+
|
98
|
+
|
99
|
+
@commands.command("restore")
|
100
|
+
@EXPERIMENT_ID
|
101
|
+
def restore_experiment(experiment_id):
|
102
|
+
"""
|
103
|
+
Restore a deleted experiment. This also applies to experiment's metadata, runs and associated
|
104
|
+
data. The command throws an error if the experiment is already active, cannot be found, or
|
105
|
+
permanently deleted.
|
106
|
+
"""
|
107
|
+
store = _get_store()
|
108
|
+
store.restore_experiment(experiment_id)
|
109
|
+
click.echo(f"Experiment with id {experiment_id} has been restored.")
|
110
|
+
|
111
|
+
|
112
|
+
@commands.command("rename")
|
113
|
+
@EXPERIMENT_ID
|
114
|
+
@click.option("--new-name", type=click.STRING, required=True)
|
115
|
+
def rename_experiment(experiment_id, new_name):
|
116
|
+
"""
|
117
|
+
Renames an active experiment.
|
118
|
+
Returns an error if the experiment is inactive.
|
119
|
+
"""
|
120
|
+
store = _get_store()
|
121
|
+
store.rename_experiment(experiment_id, new_name)
|
122
|
+
click.echo(f"Experiment with id {experiment_id} has been renamed to '{new_name}'.")
|
123
|
+
|
124
|
+
|
125
|
+
@commands.command("csv")
|
126
|
+
@EXPERIMENT_ID
|
127
|
+
@click.option("--filename", "-o", type=click.STRING)
|
128
|
+
def generate_csv_with_runs(experiment_id, filename):
|
129
|
+
# type: (str, str) -> None
|
130
|
+
"""
|
131
|
+
Generate CSV with all runs for an experiment
|
132
|
+
"""
|
133
|
+
runs = fluent.search_runs(experiment_ids=experiment_id)
|
134
|
+
if filename:
|
135
|
+
runs.to_csv(filename, index=False)
|
136
|
+
click.echo(
|
137
|
+
f"Experiment with ID {experiment_id} has been exported as a CSV to file: {filename}."
|
138
|
+
)
|
139
|
+
else:
|
140
|
+
click.echo(runs.to_csv(index=False))
|
@@ -0,0 +1,81 @@
|
|
1
|
+
"""
|
2
|
+
The ``mlflow.gemini`` module provides an API for tracing the interaction with Gemini models.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from mlflow.gemini.autolog import (
|
6
|
+
patched_class_call,
|
7
|
+
patched_module_call,
|
8
|
+
)
|
9
|
+
from mlflow.utils.annotations import experimental
|
10
|
+
from mlflow.utils.autologging_utils import autologging_integration, safe_patch
|
11
|
+
|
12
|
+
FLAVOR_NAME = "gemini"
|
13
|
+
|
14
|
+
|
15
|
+
@experimental(version="2.19.0")
|
16
|
+
@autologging_integration(FLAVOR_NAME)
|
17
|
+
def autolog(
|
18
|
+
log_traces: bool = True,
|
19
|
+
disable: bool = False,
|
20
|
+
silent: bool = False,
|
21
|
+
):
|
22
|
+
"""
|
23
|
+
Enables (or disables) and configures autologging from Gemini to MLflow.
|
24
|
+
Currently, both legacy SDK google-generativeai and new SDK google-genai are supported.
|
25
|
+
Only synchronous calls are supported. Asynchronous APIs and streaming are not recorded.
|
26
|
+
|
27
|
+
Args:
|
28
|
+
log_traces: If ``True``, traces are logged for Gemini models.
|
29
|
+
If ``False``, no traces are collected during inference. Default to ``True``.
|
30
|
+
disable: If ``True``, disables the Gemini autologging. Default to ``False``.
|
31
|
+
silent: If ``True``, suppress all event logs and warnings from MLflow during Gemini
|
32
|
+
autologging. If ``False``, show all events and warnings.
|
33
|
+
"""
|
34
|
+
try:
|
35
|
+
from google import generativeai
|
36
|
+
|
37
|
+
for method in ["generate_content", "count_tokens"]:
|
38
|
+
safe_patch(
|
39
|
+
FLAVOR_NAME,
|
40
|
+
generativeai.GenerativeModel,
|
41
|
+
method,
|
42
|
+
patched_class_call,
|
43
|
+
)
|
44
|
+
|
45
|
+
safe_patch(
|
46
|
+
FLAVOR_NAME,
|
47
|
+
generativeai.ChatSession,
|
48
|
+
"send_message",
|
49
|
+
patched_class_call,
|
50
|
+
)
|
51
|
+
|
52
|
+
safe_patch(
|
53
|
+
FLAVOR_NAME,
|
54
|
+
generativeai,
|
55
|
+
"embed_content",
|
56
|
+
patched_module_call,
|
57
|
+
)
|
58
|
+
except ImportError:
|
59
|
+
pass
|
60
|
+
|
61
|
+
try:
|
62
|
+
from google import genai
|
63
|
+
|
64
|
+
# Since the genai SDK calls "_generate_content" iteratively within "generate_content",
|
65
|
+
# we need to patch both "generate_content" and "_generate_content".
|
66
|
+
for method in ["generate_content", "_generate_content", "count_tokens", "embed_content"]:
|
67
|
+
safe_patch(
|
68
|
+
FLAVOR_NAME,
|
69
|
+
genai.models.Models,
|
70
|
+
method,
|
71
|
+
patched_class_call,
|
72
|
+
)
|
73
|
+
|
74
|
+
safe_patch(
|
75
|
+
FLAVOR_NAME,
|
76
|
+
genai.chats.Chat,
|
77
|
+
"send_message",
|
78
|
+
patched_class_call,
|
79
|
+
)
|
80
|
+
except ImportError:
|
81
|
+
pass
|