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,96 @@
|
|
1
|
+
import json
|
2
|
+
import sys
|
3
|
+
import time
|
4
|
+
import traceback
|
5
|
+
from dataclasses import dataclass, field
|
6
|
+
from datetime import datetime
|
7
|
+
|
8
|
+
from google.protobuf.json_format import ParseDict
|
9
|
+
from google.protobuf.struct_pb2 import Value
|
10
|
+
from opentelemetry.util.types import AttributeValue
|
11
|
+
|
12
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
13
|
+
from mlflow.protos.databricks_trace_server_pb2 import Span as ProtoSpan
|
14
|
+
|
15
|
+
|
16
|
+
@dataclass
|
17
|
+
class SpanEvent(_MlflowObject):
|
18
|
+
"""
|
19
|
+
An event that records a specific occurrences or moments in time
|
20
|
+
during a span, such as an exception being thrown. Compatible with OpenTelemetry.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
name: Name of the event.
|
24
|
+
timestamp: The exact time the event occurred, measured in nanoseconds.
|
25
|
+
If not provided, the current time will be used.
|
26
|
+
attributes: A collection of key-value pairs representing detailed
|
27
|
+
attributes of the event, such as the exception stack trace.
|
28
|
+
Attributes value must be one of ``[str, int, float, bool, bytes]``
|
29
|
+
or a sequence of these types.
|
30
|
+
"""
|
31
|
+
|
32
|
+
name: str
|
33
|
+
# Use current time if not provided. We need to use default factory otherwise
|
34
|
+
# the default value will be fixed to the build time of the class.
|
35
|
+
timestamp: int = field(default_factory=lambda: int(time.time() * 1e6))
|
36
|
+
attributes: dict[str, AttributeValue] = field(default_factory=dict)
|
37
|
+
|
38
|
+
@classmethod
|
39
|
+
def from_exception(cls, exception: Exception):
|
40
|
+
"Create a span event from an exception."
|
41
|
+
|
42
|
+
stack_trace = cls._get_stacktrace(exception)
|
43
|
+
return cls(
|
44
|
+
name="exception",
|
45
|
+
attributes={
|
46
|
+
"exception.message": str(exception),
|
47
|
+
"exception.type": exception.__class__.__name__,
|
48
|
+
"exception.stacktrace": stack_trace,
|
49
|
+
},
|
50
|
+
)
|
51
|
+
|
52
|
+
@staticmethod
|
53
|
+
def _get_stacktrace(error: BaseException) -> str:
|
54
|
+
"""Get the stacktrace of the parent error."""
|
55
|
+
msg = repr(error)
|
56
|
+
try:
|
57
|
+
if sys.version_info < (3, 10):
|
58
|
+
tb = traceback.format_exception(error.__class__, error, error.__traceback__)
|
59
|
+
else:
|
60
|
+
tb = traceback.format_exception(error)
|
61
|
+
return "".join(tb).strip()
|
62
|
+
except Exception:
|
63
|
+
return msg
|
64
|
+
|
65
|
+
def json(self):
|
66
|
+
return {
|
67
|
+
"name": self.name,
|
68
|
+
"timestamp": self.timestamp,
|
69
|
+
"attributes": json.dumps(self.attributes, cls=CustomEncoder)
|
70
|
+
if self.attributes
|
71
|
+
else None,
|
72
|
+
}
|
73
|
+
|
74
|
+
def to_proto(self):
|
75
|
+
"""Convert into OTLP compatible proto object to sent to the Databricks Trace Server."""
|
76
|
+
return ProtoSpan.Event(
|
77
|
+
name=self.name,
|
78
|
+
time_unix_nano=self.timestamp,
|
79
|
+
attributes={k: ParseDict(v, Value()) for k, v in self.attributes.items()},
|
80
|
+
)
|
81
|
+
|
82
|
+
|
83
|
+
class CustomEncoder(json.JSONEncoder):
|
84
|
+
"""
|
85
|
+
Custom encoder to handle json serialization.
|
86
|
+
"""
|
87
|
+
|
88
|
+
def default(self, o):
|
89
|
+
try:
|
90
|
+
return super().default(o)
|
91
|
+
except TypeError:
|
92
|
+
# convert datetime to string format by default
|
93
|
+
if isinstance(o, datetime):
|
94
|
+
return o.isoformat()
|
95
|
+
# convert object direct to string to avoid error in serialization
|
96
|
+
return str(o)
|
@@ -0,0 +1,102 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from dataclasses import dataclass
|
4
|
+
from enum import Enum
|
5
|
+
|
6
|
+
from opentelemetry import trace as trace_api
|
7
|
+
|
8
|
+
from mlflow.exceptions import MlflowException
|
9
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
10
|
+
|
11
|
+
|
12
|
+
class SpanStatusCode(str, Enum):
|
13
|
+
"""Enum for status code of a span"""
|
14
|
+
|
15
|
+
# Uses the same set of status codes as OpenTelemetry
|
16
|
+
UNSET = "UNSET"
|
17
|
+
OK = "OK"
|
18
|
+
ERROR = "ERROR"
|
19
|
+
|
20
|
+
@staticmethod
|
21
|
+
def from_proto_status_code(status_code: str) -> SpanStatusCode:
|
22
|
+
"""
|
23
|
+
Convert a string status code to the corresponding SpanStatusCode enum value.
|
24
|
+
"""
|
25
|
+
from mlflow.protos.databricks_trace_server_pb2 import Span as ProtoSpan
|
26
|
+
|
27
|
+
proto_code = ProtoSpan.Status.StatusCode
|
28
|
+
status_code_mapping = {
|
29
|
+
proto_code.Name(proto_code.STATUS_CODE_UNSET): SpanStatusCode.UNSET,
|
30
|
+
proto_code.Name(proto_code.STATUS_CODE_OK): SpanStatusCode.OK,
|
31
|
+
proto_code.Name(proto_code.STATUS_CODE_ERROR): SpanStatusCode.ERROR,
|
32
|
+
}
|
33
|
+
try:
|
34
|
+
return status_code_mapping[status_code]
|
35
|
+
except KeyError:
|
36
|
+
raise MlflowException(
|
37
|
+
f"Invalid status code: {status_code}. "
|
38
|
+
f"Valid values are: {', '.join(status_code_mapping.keys())}",
|
39
|
+
error_code=INVALID_PARAMETER_VALUE,
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
@dataclass
|
44
|
+
class SpanStatus:
|
45
|
+
"""
|
46
|
+
Status of the span or the trace.
|
47
|
+
|
48
|
+
Args:
|
49
|
+
status_code: The status code of the span or the trace. This must be one of the
|
50
|
+
values of the :py:class:`mlflow.entities.SpanStatusCode` enum or a string
|
51
|
+
representation of it like "OK", "ERROR".
|
52
|
+
description: Description of the status. This should be only set when the status
|
53
|
+
is ERROR, otherwise it will be ignored.
|
54
|
+
"""
|
55
|
+
|
56
|
+
status_code: SpanStatusCode
|
57
|
+
description: str = ""
|
58
|
+
|
59
|
+
def __post_init__(self):
|
60
|
+
"""
|
61
|
+
If user provides a string status code, validate it and convert to
|
62
|
+
the corresponding enum value.
|
63
|
+
"""
|
64
|
+
if isinstance(self.status_code, str):
|
65
|
+
try:
|
66
|
+
self.status_code = SpanStatusCode(self.status_code)
|
67
|
+
except ValueError:
|
68
|
+
raise MlflowException(
|
69
|
+
f"{self.status_code} is not a valid SpanStatusCode value. "
|
70
|
+
f"Please use one of {[status_code.value for status_code in SpanStatusCode]}",
|
71
|
+
error_code=INVALID_PARAMETER_VALUE,
|
72
|
+
)
|
73
|
+
|
74
|
+
def to_otel_status(self) -> trace_api.Status:
|
75
|
+
"""
|
76
|
+
Convert :py:class:`mlflow.entities.SpanStatus` object to OpenTelemetry status object.
|
77
|
+
|
78
|
+
:meta private:
|
79
|
+
"""
|
80
|
+
try:
|
81
|
+
status_code = getattr(trace_api.StatusCode, self.status_code.name)
|
82
|
+
except AttributeError:
|
83
|
+
raise MlflowException(
|
84
|
+
f"Invalid status code: {self.status_code}", error_code=INVALID_PARAMETER_VALUE
|
85
|
+
)
|
86
|
+
return trace_api.Status(status_code, self.description)
|
87
|
+
|
88
|
+
@classmethod
|
89
|
+
def from_otel_status(cls, otel_status: trace_api.Status) -> SpanStatus:
|
90
|
+
"""
|
91
|
+
Convert OpenTelemetry status object to our status object.
|
92
|
+
|
93
|
+
:meta private:
|
94
|
+
"""
|
95
|
+
try:
|
96
|
+
status_code = SpanStatusCode(otel_status.status_code.name)
|
97
|
+
except ValueError:
|
98
|
+
raise MlflowException(
|
99
|
+
f"Got invalid status code from OpenTelemetry: {otel_status.status_code}",
|
100
|
+
error_code=INVALID_PARAMETER_VALUE,
|
101
|
+
)
|
102
|
+
return cls(status_code, otel_status.description or "")
|
mlflow/entities/trace.py
ADDED
@@ -0,0 +1,317 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import json
|
4
|
+
import logging
|
5
|
+
import re
|
6
|
+
from dataclasses import dataclass
|
7
|
+
from typing import TYPE_CHECKING, Any, Literal, Optional, Union
|
8
|
+
|
9
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
10
|
+
from mlflow.entities.span import Span, SpanType
|
11
|
+
from mlflow.entities.trace_data import TraceData
|
12
|
+
from mlflow.entities.trace_info import TraceInfo
|
13
|
+
from mlflow.entities.trace_info_v2 import TraceInfoV2
|
14
|
+
from mlflow.exceptions import MlflowException
|
15
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
16
|
+
from mlflow.protos.service_pb2 import Trace as ProtoTrace
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from mlflow.entities.assessment import Assessment
|
20
|
+
|
21
|
+
_logger = logging.getLogger(__name__)
|
22
|
+
|
23
|
+
|
24
|
+
@dataclass
|
25
|
+
class Trace(_MlflowObject):
|
26
|
+
"""A trace object.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
info: A lightweight object that contains the metadata of a trace.
|
30
|
+
data: A container object that holds the spans data of a trace.
|
31
|
+
"""
|
32
|
+
|
33
|
+
info: TraceInfo
|
34
|
+
data: TraceData
|
35
|
+
|
36
|
+
def __post_init__(self):
|
37
|
+
if isinstance(self.info, TraceInfoV2):
|
38
|
+
self.info = self.info.to_v3(request=self.data.request, response=self.data.response)
|
39
|
+
|
40
|
+
def __repr__(self) -> str:
|
41
|
+
return f"Trace(trace_id={self.info.trace_id})"
|
42
|
+
|
43
|
+
def to_dict(self) -> dict[str, Any]:
|
44
|
+
return {"info": self.info.to_dict(), "data": self.data.to_dict()}
|
45
|
+
|
46
|
+
def to_json(self, pretty=False) -> str:
|
47
|
+
from mlflow.tracing.utils import TraceJSONEncoder
|
48
|
+
|
49
|
+
return json.dumps(self.to_dict(), cls=TraceJSONEncoder, indent=2 if pretty else None)
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
def from_dict(cls, trace_dict: dict[str, Any]) -> Trace:
|
53
|
+
info = trace_dict.get("info")
|
54
|
+
data = trace_dict.get("data")
|
55
|
+
if info is None or data is None:
|
56
|
+
raise MlflowException(
|
57
|
+
"Unable to parse Trace from dictionary. Expected keys: 'info' and 'data'. "
|
58
|
+
f"Received keys: {list(trace_dict.keys())}",
|
59
|
+
error_code=INVALID_PARAMETER_VALUE,
|
60
|
+
)
|
61
|
+
|
62
|
+
return cls(
|
63
|
+
info=TraceInfo.from_dict(info),
|
64
|
+
data=TraceData.from_dict(data),
|
65
|
+
)
|
66
|
+
|
67
|
+
@classmethod
|
68
|
+
def from_json(cls, trace_json: str) -> Trace:
|
69
|
+
try:
|
70
|
+
trace_dict = json.loads(trace_json)
|
71
|
+
except json.JSONDecodeError as e:
|
72
|
+
raise MlflowException(
|
73
|
+
f"Unable to parse trace JSON: {trace_json}. Error: {e}",
|
74
|
+
error_code=INVALID_PARAMETER_VALUE,
|
75
|
+
)
|
76
|
+
return cls.from_dict(trace_dict)
|
77
|
+
|
78
|
+
def _serialize_for_mimebundle(self):
|
79
|
+
# databricks notebooks will use the request ID to
|
80
|
+
# fetch the trace from the backend. including the
|
81
|
+
# full JSON can cause notebooks to exceed size limits
|
82
|
+
return json.dumps(self.info.request_id)
|
83
|
+
|
84
|
+
def _repr_mimebundle_(self, include=None, exclude=None):
|
85
|
+
"""
|
86
|
+
This method is used to trigger custom display logic in IPython notebooks.
|
87
|
+
See https://ipython.readthedocs.io/en/stable/config/integrating.html#MyObject
|
88
|
+
for more details.
|
89
|
+
|
90
|
+
At the moment, the only supported MIME type is "application/databricks.mlflow.trace",
|
91
|
+
which contains a JSON representation of the Trace object. This object is deserialized
|
92
|
+
in Databricks notebooks to display the Trace object in a nicer UI.
|
93
|
+
"""
|
94
|
+
from mlflow.tracing.display import (
|
95
|
+
get_display_handler,
|
96
|
+
get_notebook_iframe_html,
|
97
|
+
is_using_tracking_server,
|
98
|
+
)
|
99
|
+
from mlflow.utils.databricks_utils import is_in_databricks_runtime
|
100
|
+
|
101
|
+
bundle = {"text/plain": repr(self)}
|
102
|
+
|
103
|
+
if not get_display_handler().disabled:
|
104
|
+
if is_in_databricks_runtime():
|
105
|
+
bundle["application/databricks.mlflow.trace"] = self._serialize_for_mimebundle()
|
106
|
+
elif is_using_tracking_server():
|
107
|
+
bundle["text/html"] = get_notebook_iframe_html([self])
|
108
|
+
|
109
|
+
return bundle
|
110
|
+
|
111
|
+
def to_pandas_dataframe_row(self) -> dict[str, Any]:
|
112
|
+
return {
|
113
|
+
"trace_id": self.info.trace_id,
|
114
|
+
"trace": self.to_json(), # json string to be compatible with Spark DataFrame
|
115
|
+
"client_request_id": self.info.client_request_id,
|
116
|
+
"state": self.info.state,
|
117
|
+
"request_time": self.info.request_time,
|
118
|
+
"execution_duration": self.info.execution_duration,
|
119
|
+
"request": self._deserialize_json_attr(self.data.request),
|
120
|
+
"response": self._deserialize_json_attr(self.data.response),
|
121
|
+
"trace_metadata": self.info.trace_metadata,
|
122
|
+
"tags": self.info.tags,
|
123
|
+
"spans": [span.to_dict() for span in self.data.spans],
|
124
|
+
"assessments": [assessment.to_dictionary() for assessment in self.info.assessments],
|
125
|
+
}
|
126
|
+
|
127
|
+
def _deserialize_json_attr(self, value: str):
|
128
|
+
try:
|
129
|
+
return json.loads(value)
|
130
|
+
except Exception:
|
131
|
+
_logger.debug(f"Failed to deserialize JSON attribute: {value}", exc_info=True)
|
132
|
+
return value
|
133
|
+
|
134
|
+
def search_spans(
|
135
|
+
self,
|
136
|
+
span_type: Optional[SpanType] = None,
|
137
|
+
name: Optional[Union[str, re.Pattern]] = None,
|
138
|
+
span_id: Optional[str] = None,
|
139
|
+
) -> list[Span]:
|
140
|
+
"""
|
141
|
+
Search for spans that match the given criteria within the trace.
|
142
|
+
|
143
|
+
Args:
|
144
|
+
span_type: The type of the span to search for.
|
145
|
+
name: The name of the span to search for. This can be a string or a regular expression.
|
146
|
+
span_id: The ID of the span to search for.
|
147
|
+
|
148
|
+
Returns:
|
149
|
+
A list of spans that match the given criteria.
|
150
|
+
If there is no match, an empty list is returned.
|
151
|
+
|
152
|
+
.. code-block:: python
|
153
|
+
|
154
|
+
import mlflow
|
155
|
+
import re
|
156
|
+
from mlflow.entities import SpanType
|
157
|
+
|
158
|
+
|
159
|
+
@mlflow.trace(span_type=SpanType.CHAIN)
|
160
|
+
def run(x: int) -> int:
|
161
|
+
x = add_one(x)
|
162
|
+
x = add_two(x)
|
163
|
+
x = multiply_by_two(x)
|
164
|
+
return x
|
165
|
+
|
166
|
+
|
167
|
+
@mlflow.trace(span_type=SpanType.TOOL)
|
168
|
+
def add_one(x: int) -> int:
|
169
|
+
return x + 1
|
170
|
+
|
171
|
+
|
172
|
+
@mlflow.trace(span_type=SpanType.TOOL)
|
173
|
+
def add_two(x: int) -> int:
|
174
|
+
return x + 2
|
175
|
+
|
176
|
+
|
177
|
+
@mlflow.trace(span_type=SpanType.TOOL)
|
178
|
+
def multiply_by_two(x: int) -> int:
|
179
|
+
return x * 2
|
180
|
+
|
181
|
+
|
182
|
+
# Run the function and get the trace
|
183
|
+
y = run(2)
|
184
|
+
trace_id = mlflow.get_last_active_trace_id()
|
185
|
+
trace = mlflow.get_trace(trace_id)
|
186
|
+
|
187
|
+
# 1. Search spans by name (exact match)
|
188
|
+
spans = trace.search_spans(name="add_one")
|
189
|
+
print(spans)
|
190
|
+
# Output: [Span(name='add_one', ...)]
|
191
|
+
|
192
|
+
# 2. Search spans by name (regular expression)
|
193
|
+
pattern = re.compile(r"add.*")
|
194
|
+
spans = trace.search_spans(name=pattern)
|
195
|
+
print(spans)
|
196
|
+
# Output: [Span(name='add_one', ...), Span(name='add_two', ...)]
|
197
|
+
|
198
|
+
# 3. Search spans by type
|
199
|
+
spans = trace.search_spans(span_type=SpanType.LLM)
|
200
|
+
print(spans)
|
201
|
+
# Output: [Span(name='run', ...)]
|
202
|
+
|
203
|
+
# 4. Search spans by name and type
|
204
|
+
spans = trace.search_spans(name="add_one", span_type=SpanType.TOOL)
|
205
|
+
print(spans)
|
206
|
+
# Output: [Span(name='add_one', ...)]
|
207
|
+
"""
|
208
|
+
|
209
|
+
def _match_name(span: Span) -> bool:
|
210
|
+
if isinstance(name, str):
|
211
|
+
return span.name == name
|
212
|
+
elif isinstance(name, re.Pattern):
|
213
|
+
return name.search(span.name) is not None
|
214
|
+
elif name is None:
|
215
|
+
return True
|
216
|
+
else:
|
217
|
+
raise MlflowException(
|
218
|
+
f"Invalid type for 'name'. Expected str or re.Pattern. Got: {type(name)}",
|
219
|
+
error_code=INVALID_PARAMETER_VALUE,
|
220
|
+
)
|
221
|
+
|
222
|
+
def _match_type(span: Span) -> bool:
|
223
|
+
if isinstance(span_type, str):
|
224
|
+
return span.span_type == span_type
|
225
|
+
elif span_type is None:
|
226
|
+
return True
|
227
|
+
else:
|
228
|
+
raise MlflowException(
|
229
|
+
"Invalid type for 'span_type'. Expected str or mlflow.entities.SpanType. "
|
230
|
+
f"Got: {type(span_type)}",
|
231
|
+
error_code=INVALID_PARAMETER_VALUE,
|
232
|
+
)
|
233
|
+
|
234
|
+
def _match_id(span: Span) -> bool:
|
235
|
+
if span_id is None:
|
236
|
+
return True
|
237
|
+
else:
|
238
|
+
return span.span_id == span_id
|
239
|
+
|
240
|
+
return [
|
241
|
+
span
|
242
|
+
for span in self.data.spans
|
243
|
+
if _match_name(span) and _match_type(span) and _match_id(span)
|
244
|
+
]
|
245
|
+
|
246
|
+
def search_assessments(
|
247
|
+
self,
|
248
|
+
name: Optional[str] = None,
|
249
|
+
*,
|
250
|
+
span_id: Optional[str] = None,
|
251
|
+
all: bool = False,
|
252
|
+
type: Optional[Literal["expectation", "feedback"]] = None,
|
253
|
+
) -> list["Assessment"]:
|
254
|
+
"""
|
255
|
+
Get assessments for a given name / span ID. By default, this only returns assessments
|
256
|
+
that are valid (i.e. have not been overridden by another assessment). To return all
|
257
|
+
assessments, specify `all=True`.
|
258
|
+
|
259
|
+
Args:
|
260
|
+
name: The name of the assessment to get. If not provided, this will match
|
261
|
+
all assessment names.
|
262
|
+
span_id: The span ID to get assessments for.
|
263
|
+
If not provided, this will match all spans.
|
264
|
+
all: If True, return all assessments regardless of validity.
|
265
|
+
type: The type of assessment to get (one of "feedback" or "expectation").
|
266
|
+
If not provided, this will match all assessment types.
|
267
|
+
|
268
|
+
Returns:
|
269
|
+
A list of assessments that meet the given conditions.
|
270
|
+
"""
|
271
|
+
|
272
|
+
def validate_type(assessment: Assessment) -> bool:
|
273
|
+
from mlflow.entities.assessment import Expectation, Feedback
|
274
|
+
|
275
|
+
if type == "expectation":
|
276
|
+
return isinstance(assessment, Expectation)
|
277
|
+
elif type == "feedback":
|
278
|
+
return isinstance(assessment, Feedback)
|
279
|
+
|
280
|
+
return True
|
281
|
+
|
282
|
+
return [
|
283
|
+
assessment
|
284
|
+
for assessment in self.info.assessments
|
285
|
+
if (name is None or assessment.name == name)
|
286
|
+
and (span_id is None or assessment.span_id == span_id)
|
287
|
+
# valid defaults to true, so Nones are valid
|
288
|
+
and (all or assessment.valid in (True, None))
|
289
|
+
and (type is None or validate_type(assessment))
|
290
|
+
]
|
291
|
+
|
292
|
+
@staticmethod
|
293
|
+
def pandas_dataframe_columns() -> list[str]:
|
294
|
+
return [
|
295
|
+
"trace_id",
|
296
|
+
"trace",
|
297
|
+
"client_request_id",
|
298
|
+
"state",
|
299
|
+
"request_time",
|
300
|
+
"execution_duration",
|
301
|
+
"request",
|
302
|
+
"response",
|
303
|
+
"trace_metadata",
|
304
|
+
"tags",
|
305
|
+
"spans",
|
306
|
+
"assessments",
|
307
|
+
]
|
308
|
+
|
309
|
+
def to_proto(self):
|
310
|
+
"""
|
311
|
+
Convert into a proto object to sent to the MLflow backend.
|
312
|
+
|
313
|
+
NB: The Trace definition in MLflow backend doesn't include the `data` field,
|
314
|
+
but rather only contains TraceInfoV3.
|
315
|
+
"""
|
316
|
+
|
317
|
+
return ProtoTrace(trace_info=self.info.to_proto())
|
@@ -0,0 +1,71 @@
|
|
1
|
+
from dataclasses import dataclass, field
|
2
|
+
from typing import Any, Optional
|
3
|
+
|
4
|
+
from mlflow.entities import Span
|
5
|
+
from mlflow.tracing.constant import SpanAttributeKey
|
6
|
+
|
7
|
+
|
8
|
+
@dataclass
|
9
|
+
class TraceData:
|
10
|
+
"""A container object that holds the spans data of a trace.
|
11
|
+
|
12
|
+
Args:
|
13
|
+
spans: List of spans that are part of the trace.
|
14
|
+
"""
|
15
|
+
|
16
|
+
spans: list[Span] = field(default_factory=list)
|
17
|
+
|
18
|
+
# NB: Custom constructor to allow passing additional kwargs for backward compatibility for
|
19
|
+
# DBX agent evaluator. Once they migrates to trace V3 schema, we can remove this.
|
20
|
+
def __init__(self, spans: Optional[list[Span]] = None, **kwargs):
|
21
|
+
self.spans = spans or []
|
22
|
+
|
23
|
+
@classmethod
|
24
|
+
def from_dict(cls, d):
|
25
|
+
if not isinstance(d, dict):
|
26
|
+
raise TypeError(f"TraceData.from_dict() expects a dictionary. Got: {type(d).__name__}")
|
27
|
+
return cls(spans=[Span.from_dict(span) for span in d.get("spans", [])])
|
28
|
+
|
29
|
+
def to_dict(self) -> dict[str, Any]:
|
30
|
+
return {"spans": [span.to_dict() for span in self.spans]}
|
31
|
+
|
32
|
+
@property
|
33
|
+
def intermediate_outputs(self) -> Optional[dict[str, Any]]:
|
34
|
+
"""
|
35
|
+
Returns intermediate outputs produced by the model or agent while handling the request.
|
36
|
+
There are mainly two flows to return intermediate outputs:
|
37
|
+
1. When a trace is generate by the `mlflow.log_trace` API,
|
38
|
+
return `intermediate_outputs` attribute of the span.
|
39
|
+
2. When a trace is created normally with a tree of spans,
|
40
|
+
aggregate the outputs of non-root spans.
|
41
|
+
"""
|
42
|
+
root_span = self._get_root_span()
|
43
|
+
if root_span and root_span.get_attribute(SpanAttributeKey.INTERMEDIATE_OUTPUTS):
|
44
|
+
return root_span.get_attribute(SpanAttributeKey.INTERMEDIATE_OUTPUTS)
|
45
|
+
|
46
|
+
if len(self.spans) > 1:
|
47
|
+
return {
|
48
|
+
span.name: span.outputs
|
49
|
+
for span in self.spans
|
50
|
+
if span.parent_id and span.outputs is not None
|
51
|
+
}
|
52
|
+
|
53
|
+
def _get_root_span(self) -> Optional[Span]:
|
54
|
+
for span in self.spans:
|
55
|
+
if span.parent_id is None:
|
56
|
+
return span
|
57
|
+
|
58
|
+
# `request` and `response` are preserved for backward compatibility with v2
|
59
|
+
@property
|
60
|
+
def request(self) -> Optional[str]:
|
61
|
+
if span := self._get_root_span():
|
62
|
+
# Accessing the OTel span directly get serialized value directly.
|
63
|
+
return span._span.attributes.get(SpanAttributeKey.INPUTS)
|
64
|
+
return None
|
65
|
+
|
66
|
+
@property
|
67
|
+
def response(self) -> Optional[str]:
|
68
|
+
if span := self._get_root_span():
|
69
|
+
# Accessing the OTel span directly get serialized value directly.
|
70
|
+
return span._span.attributes.get(SpanAttributeKey.OUTPUTS)
|
71
|
+
return None
|