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,220 @@
|
|
1
|
+
import json
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any, Optional
|
4
|
+
|
5
|
+
from google.protobuf.duration_pb2 import Duration
|
6
|
+
from google.protobuf.json_format import MessageToDict
|
7
|
+
from google.protobuf.timestamp_pb2 import Timestamp
|
8
|
+
|
9
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
10
|
+
from mlflow.entities.assessment import Assessment
|
11
|
+
from mlflow.entities.trace_location import TraceLocation
|
12
|
+
from mlflow.entities.trace_state import TraceState
|
13
|
+
from mlflow.entities.trace_status import TraceStatus
|
14
|
+
from mlflow.protos.service_pb2 import TraceInfoV3 as ProtoTraceInfoV3
|
15
|
+
from mlflow.tracing.constant import TRACE_SCHEMA_VERSION, TRACE_SCHEMA_VERSION_KEY, TraceMetadataKey
|
16
|
+
|
17
|
+
|
18
|
+
@dataclass
|
19
|
+
class TraceInfo(_MlflowObject):
|
20
|
+
"""Metadata about a trace, such as its ID, location, timestamp, etc.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
trace_id: The primary identifier for the trace.
|
24
|
+
trace_location: The location where the trace is stored, represented as
|
25
|
+
a :py:class:`~mlflow.entities.TraceLocation` object. MLflow currently
|
26
|
+
support MLflow Experiment or Databricks Inference Table as a trace location.
|
27
|
+
request_time: Start time of the trace, in milliseconds.
|
28
|
+
state: State of the trace, represented as a :py:class:`~mlflow.entities.TraceState`
|
29
|
+
enum. Can be one of [`OK`, `ERROR`, `IN_PROGRESS`, `STATE_UNSPECIFIED`].
|
30
|
+
request_preview: Request to the model/agent, equivalent to the input of the root,
|
31
|
+
span but JSON-encoded and can be truncated.
|
32
|
+
response_preview: Response from the model/agent, equivalent to the output of the
|
33
|
+
root span but JSON-encoded and can be truncated.
|
34
|
+
client_request_id: Client supplied request ID associated with the trace. This
|
35
|
+
could be used to identify the trace/request from an external system that
|
36
|
+
produced the trace, e.g., a session ID in a web application.
|
37
|
+
execution_duration: Duration of the trace, in milliseconds.
|
38
|
+
trace_metadata: Key-value pairs associated with the trace. They are designed
|
39
|
+
for immutable values like run ID associated with the trace.
|
40
|
+
tags: Tags associated with the trace. They are designed for mutable values,
|
41
|
+
that can be updated after the trace is created via MLflow UI or API.
|
42
|
+
assessments: List of assessments associated with the trace.
|
43
|
+
"""
|
44
|
+
|
45
|
+
trace_id: str
|
46
|
+
trace_location: TraceLocation
|
47
|
+
request_time: int
|
48
|
+
state: TraceState
|
49
|
+
request_preview: Optional[str] = None
|
50
|
+
response_preview: Optional[str] = None
|
51
|
+
client_request_id: Optional[str] = None
|
52
|
+
execution_duration: Optional[int] = None
|
53
|
+
trace_metadata: dict[str, str] = field(default_factory=dict)
|
54
|
+
tags: dict[str, str] = field(default_factory=dict)
|
55
|
+
assessments: list[Assessment] = field(default_factory=list)
|
56
|
+
|
57
|
+
def __post_init__(self):
|
58
|
+
# NB: MLflow automatically converts trace metadata and spans to V3 format, even if the
|
59
|
+
# trace was originally created in V2 format with an earlier version of MLflow. Accordingly,
|
60
|
+
# we also update the `TRACE_SCHEMA_VERSION_KEY` in the trace metadata to V3 for consistency
|
61
|
+
self.trace_metadata[TRACE_SCHEMA_VERSION_KEY] = str(TRACE_SCHEMA_VERSION)
|
62
|
+
|
63
|
+
def to_dict(self) -> dict[str, Any]:
|
64
|
+
"""Convert the TraceInfoV3 object to a dictionary."""
|
65
|
+
res = MessageToDict(self.to_proto(), preserving_proto_field_name=True)
|
66
|
+
if self.execution_duration is not None:
|
67
|
+
res.pop("execution_duration", None)
|
68
|
+
res["execution_duration_ms"] = self.execution_duration
|
69
|
+
return res
|
70
|
+
|
71
|
+
@classmethod
|
72
|
+
def from_dict(cls, d: dict[str, Any]) -> "TraceInfo":
|
73
|
+
"""Create a TraceInfoV3 object from a dictionary."""
|
74
|
+
if "request_id" in d:
|
75
|
+
from mlflow.entities.trace_info_v2 import TraceInfoV2
|
76
|
+
|
77
|
+
return TraceInfoV2.from_dict(d).to_v3()
|
78
|
+
|
79
|
+
d = d.copy()
|
80
|
+
if assessments := d.get("assessments"):
|
81
|
+
d["assessments"] = [Assessment.from_dictionary(a) for a in assessments]
|
82
|
+
|
83
|
+
if trace_location := d.get("trace_location"):
|
84
|
+
d["trace_location"] = TraceLocation.from_dict(trace_location)
|
85
|
+
|
86
|
+
if state := d.get("state"):
|
87
|
+
d["state"] = TraceState(state)
|
88
|
+
|
89
|
+
if request_time := d.get("request_time"):
|
90
|
+
timestamp = Timestamp()
|
91
|
+
timestamp.FromJsonString(request_time)
|
92
|
+
d["request_time"] = timestamp.ToMilliseconds()
|
93
|
+
|
94
|
+
if (execution_duration := d.pop("execution_duration_ms", None)) is not None:
|
95
|
+
d["execution_duration"] = execution_duration
|
96
|
+
|
97
|
+
return cls(**d)
|
98
|
+
|
99
|
+
def to_proto(self):
|
100
|
+
from mlflow.entities.trace_info_v2 import _truncate_request_metadata, _truncate_tags
|
101
|
+
|
102
|
+
request_time = Timestamp()
|
103
|
+
request_time.FromMilliseconds(self.request_time)
|
104
|
+
execution_duration = None
|
105
|
+
if self.execution_duration is not None:
|
106
|
+
execution_duration = Duration()
|
107
|
+
execution_duration.FromMilliseconds(self.execution_duration)
|
108
|
+
|
109
|
+
return ProtoTraceInfoV3(
|
110
|
+
trace_id=self.trace_id,
|
111
|
+
client_request_id=self.client_request_id,
|
112
|
+
trace_location=self.trace_location.to_proto(),
|
113
|
+
request_preview=self.request_preview,
|
114
|
+
response_preview=self.response_preview,
|
115
|
+
request_time=request_time,
|
116
|
+
execution_duration=execution_duration,
|
117
|
+
state=self.state.to_proto(),
|
118
|
+
trace_metadata=_truncate_request_metadata(self.trace_metadata),
|
119
|
+
tags=_truncate_tags(self.tags),
|
120
|
+
assessments=[a.to_proto() for a in self.assessments],
|
121
|
+
)
|
122
|
+
|
123
|
+
@classmethod
|
124
|
+
def from_proto(cls, proto) -> "TraceInfo":
|
125
|
+
if "request_id" in proto.DESCRIPTOR.fields_by_name:
|
126
|
+
from mlflow.entities.trace_info_v2 import TraceInfoV2
|
127
|
+
|
128
|
+
return TraceInfoV2.from_proto(proto).to_v3()
|
129
|
+
|
130
|
+
return cls(
|
131
|
+
trace_id=proto.trace_id,
|
132
|
+
client_request_id=(
|
133
|
+
proto.client_request_id if proto.HasField("client_request_id") else None
|
134
|
+
),
|
135
|
+
trace_location=TraceLocation.from_proto(proto.trace_location),
|
136
|
+
request_preview=proto.request_preview,
|
137
|
+
response_preview=proto.response_preview,
|
138
|
+
request_time=proto.request_time.ToMilliseconds(),
|
139
|
+
execution_duration=(
|
140
|
+
proto.execution_duration.ToMilliseconds()
|
141
|
+
if proto.HasField("execution_duration")
|
142
|
+
else None
|
143
|
+
),
|
144
|
+
state=TraceState.from_proto(proto.state),
|
145
|
+
trace_metadata=dict(proto.trace_metadata),
|
146
|
+
tags=dict(proto.tags),
|
147
|
+
assessments=[Assessment.from_proto(a) for a in proto.assessments],
|
148
|
+
)
|
149
|
+
|
150
|
+
# Aliases for backward compatibility with V2 format
|
151
|
+
@property
|
152
|
+
def request_id(self) -> str:
|
153
|
+
"""Deprecated. Use `trace_id` instead."""
|
154
|
+
return self.trace_id
|
155
|
+
|
156
|
+
@property
|
157
|
+
def experiment_id(self) -> Optional[str]:
|
158
|
+
"""
|
159
|
+
An MLflow experiment ID associated with the trace, if the trace is stored
|
160
|
+
in MLflow tracking server. Otherwise, None.
|
161
|
+
"""
|
162
|
+
return (
|
163
|
+
self.trace_location.mlflow_experiment
|
164
|
+
and self.trace_location.mlflow_experiment.experiment_id
|
165
|
+
)
|
166
|
+
|
167
|
+
@experiment_id.setter
|
168
|
+
def experiment_id(self, value: Optional[str]) -> None:
|
169
|
+
self.trace_location.mlflow_experiment.experiment_id = value
|
170
|
+
|
171
|
+
@property
|
172
|
+
def request_metadata(self) -> dict[str, str]:
|
173
|
+
"""Deprecated. Use `trace_metadata` instead."""
|
174
|
+
return self.trace_metadata
|
175
|
+
|
176
|
+
@property
|
177
|
+
def timestamp_ms(self) -> int:
|
178
|
+
return self.request_time
|
179
|
+
|
180
|
+
@timestamp_ms.setter
|
181
|
+
def timestamp_ms(self, value: int) -> None:
|
182
|
+
self.request_time = value
|
183
|
+
|
184
|
+
@property
|
185
|
+
def execution_time_ms(self) -> Optional[int]:
|
186
|
+
return self.execution_duration
|
187
|
+
|
188
|
+
@execution_time_ms.setter
|
189
|
+
def execution_time_ms(self, value: Optional[int]) -> None:
|
190
|
+
self.execution_duration = value
|
191
|
+
|
192
|
+
@property
|
193
|
+
def status(self) -> TraceStatus:
|
194
|
+
"""Deprecated. Use `state` instead."""
|
195
|
+
return TraceStatus.from_state(self.state)
|
196
|
+
|
197
|
+
@status.setter
|
198
|
+
def status(self, value: TraceStatus) -> None:
|
199
|
+
self.state = value.to_state()
|
200
|
+
|
201
|
+
@property
|
202
|
+
def token_usage(self) -> Optional[dict[str, int]]:
|
203
|
+
"""
|
204
|
+
Returns the aggregated token usage for the trace.
|
205
|
+
|
206
|
+
Returns:
|
207
|
+
A dictionary containing the aggregated LLM token usage for the trace.
|
208
|
+
- "input_tokens": The total number of input tokens.
|
209
|
+
- "output_tokens": The total number of output tokens.
|
210
|
+
- "total_tokens": Sum of input and output tokens.
|
211
|
+
|
212
|
+
.. note::
|
213
|
+
|
214
|
+
The token usage tracking is not supported for all LLM providers.
|
215
|
+
Refer to the MLflow Tracing documentation for which providers
|
216
|
+
support token usage tracking.
|
217
|
+
"""
|
218
|
+
if usage_json := self.trace_metadata.get(TraceMetadataKey.TOKEN_USAGE):
|
219
|
+
return json.loads(usage_json)
|
220
|
+
return None
|
@@ -0,0 +1,162 @@
|
|
1
|
+
from dataclasses import asdict, dataclass, field
|
2
|
+
from typing import Any, Optional
|
3
|
+
|
4
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
5
|
+
from mlflow.entities.assessment import Assessment
|
6
|
+
from mlflow.entities.trace_info import TraceInfo
|
7
|
+
from mlflow.entities.trace_location import TraceLocation
|
8
|
+
from mlflow.entities.trace_status import TraceStatus
|
9
|
+
from mlflow.protos.service_pb2 import TraceInfo as ProtoTraceInfo
|
10
|
+
from mlflow.protos.service_pb2 import TraceRequestMetadata as ProtoTraceRequestMetadata
|
11
|
+
from mlflow.protos.service_pb2 import TraceTag as ProtoTraceTag
|
12
|
+
from mlflow.tracing.constant import TRACE_SCHEMA_VERSION_KEY
|
13
|
+
|
14
|
+
|
15
|
+
def _truncate_request_metadata(d: dict[str, Any]) -> dict[str, str]:
|
16
|
+
from mlflow.tracing.constant import MAX_CHARS_IN_TRACE_INFO_METADATA
|
17
|
+
|
18
|
+
return {
|
19
|
+
k[:MAX_CHARS_IN_TRACE_INFO_METADATA]: str(v)[:MAX_CHARS_IN_TRACE_INFO_METADATA]
|
20
|
+
for k, v in d.items()
|
21
|
+
}
|
22
|
+
|
23
|
+
|
24
|
+
def _truncate_tags(d: dict[str, Any]) -> dict[str, str]:
|
25
|
+
from mlflow.tracing.constant import (
|
26
|
+
MAX_CHARS_IN_TRACE_INFO_TAGS_KEY,
|
27
|
+
MAX_CHARS_IN_TRACE_INFO_TAGS_VALUE,
|
28
|
+
)
|
29
|
+
|
30
|
+
return {
|
31
|
+
k[:MAX_CHARS_IN_TRACE_INFO_TAGS_KEY]: str(v)[:MAX_CHARS_IN_TRACE_INFO_TAGS_VALUE]
|
32
|
+
for k, v in d.items()
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
@dataclass
|
37
|
+
class TraceInfoV2(_MlflowObject):
|
38
|
+
"""Metadata about a trace.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
request_id: id of the trace.
|
42
|
+
experiment_id: id of the experiment.
|
43
|
+
timestamp_ms: start time of the trace, in milliseconds.
|
44
|
+
execution_time_ms: duration of the trace, in milliseconds.
|
45
|
+
status: status of the trace.
|
46
|
+
request_metadata: Key-value pairs associated with the trace. Request metadata are designed
|
47
|
+
for immutable values like run ID associated with the trace.
|
48
|
+
tags: Tags associated with the trace. Tags are designed for mutable values like trace name,
|
49
|
+
that can be updated by the users after the trace is created, unlike request_metadata.
|
50
|
+
"""
|
51
|
+
|
52
|
+
request_id: str
|
53
|
+
experiment_id: str
|
54
|
+
timestamp_ms: int
|
55
|
+
execution_time_ms: Optional[int]
|
56
|
+
status: TraceStatus
|
57
|
+
request_metadata: dict[str, str] = field(default_factory=dict)
|
58
|
+
tags: dict[str, str] = field(default_factory=dict)
|
59
|
+
assessments: list[Assessment] = field(default_factory=list)
|
60
|
+
|
61
|
+
def __post_init__(self):
|
62
|
+
self.request_metadata[TRACE_SCHEMA_VERSION_KEY] = "2"
|
63
|
+
|
64
|
+
def __eq__(self, other):
|
65
|
+
if type(other) is type(self):
|
66
|
+
return self.__dict__ == other.__dict__
|
67
|
+
return False
|
68
|
+
|
69
|
+
@property
|
70
|
+
def trace_id(self) -> str:
|
71
|
+
"""Returns the trace ID of the trace info."""
|
72
|
+
return self.request_id
|
73
|
+
|
74
|
+
def to_proto(self):
|
75
|
+
proto = ProtoTraceInfo()
|
76
|
+
proto.request_id = self.request_id
|
77
|
+
proto.experiment_id = self.experiment_id
|
78
|
+
proto.timestamp_ms = self.timestamp_ms
|
79
|
+
# NB: Proto setter does not support nullable fields (even with 'optional' keyword),
|
80
|
+
# so we substitute None with 0 for execution_time_ms. This should be not too confusing
|
81
|
+
# as we only put None when starting a trace i.e. the execution time is actually 0.
|
82
|
+
proto.execution_time_ms = self.execution_time_ms or 0
|
83
|
+
proto.status = self.status.to_proto()
|
84
|
+
|
85
|
+
request_metadata = []
|
86
|
+
for key, value in _truncate_request_metadata(self.request_metadata).items():
|
87
|
+
attr = ProtoTraceRequestMetadata()
|
88
|
+
attr.key = key
|
89
|
+
attr.value = value
|
90
|
+
request_metadata.append(attr)
|
91
|
+
proto.request_metadata.extend(request_metadata)
|
92
|
+
|
93
|
+
tags = []
|
94
|
+
for key, value in _truncate_tags(self.tags).items():
|
95
|
+
tag = ProtoTraceTag()
|
96
|
+
tag.key = key
|
97
|
+
tag.value = str(value)
|
98
|
+
tags.append(tag)
|
99
|
+
|
100
|
+
proto.tags.extend(tags)
|
101
|
+
return proto
|
102
|
+
|
103
|
+
@classmethod
|
104
|
+
def from_proto(cls, proto, assessments=None):
|
105
|
+
return cls(
|
106
|
+
request_id=proto.request_id,
|
107
|
+
experiment_id=proto.experiment_id,
|
108
|
+
timestamp_ms=proto.timestamp_ms,
|
109
|
+
execution_time_ms=proto.execution_time_ms,
|
110
|
+
status=TraceStatus.from_proto(proto.status),
|
111
|
+
request_metadata={attr.key: attr.value for attr in proto.request_metadata},
|
112
|
+
tags={tag.key: tag.value for tag in proto.tags},
|
113
|
+
assessments=assessments or [],
|
114
|
+
)
|
115
|
+
|
116
|
+
def to_dict(self):
|
117
|
+
"""
|
118
|
+
Convert trace info to a dictionary for persistence.
|
119
|
+
Update status field to the string value for serialization.
|
120
|
+
"""
|
121
|
+
trace_info_dict = asdict(self)
|
122
|
+
trace_info_dict["status"] = self.status.value
|
123
|
+
# Client request ID field is only added for internal use, and should not be
|
124
|
+
# serialized for V2 TraceInfo.
|
125
|
+
trace_info_dict.pop("client_request_id", None)
|
126
|
+
return trace_info_dict
|
127
|
+
|
128
|
+
@classmethod
|
129
|
+
def from_dict(cls, trace_info_dict):
|
130
|
+
"""
|
131
|
+
Convert trace info dictionary to TraceInfo object.
|
132
|
+
"""
|
133
|
+
if "status" not in trace_info_dict:
|
134
|
+
raise ValueError("status is required in trace info dictionary.")
|
135
|
+
trace_info_dict["status"] = TraceStatus(trace_info_dict["status"])
|
136
|
+
return cls(**trace_info_dict)
|
137
|
+
|
138
|
+
def to_v3(self, request: Optional[str] = None, response: Optional[str] = None) -> TraceInfo:
|
139
|
+
return TraceInfo(
|
140
|
+
trace_id=self.request_id,
|
141
|
+
trace_location=TraceLocation.from_experiment_id(self.experiment_id),
|
142
|
+
request_preview=request,
|
143
|
+
response_preview=response,
|
144
|
+
request_time=self.timestamp_ms,
|
145
|
+
execution_duration=self.execution_time_ms,
|
146
|
+
state=self.status.to_state(),
|
147
|
+
trace_metadata=self.request_metadata.copy(),
|
148
|
+
tags=self.tags,
|
149
|
+
assessments=self.assessments,
|
150
|
+
)
|
151
|
+
|
152
|
+
@classmethod
|
153
|
+
def from_v3(cls, trace_info: TraceInfo) -> "TraceInfoV2":
|
154
|
+
return cls(
|
155
|
+
request_id=trace_info.trace_id,
|
156
|
+
experiment_id=trace_info.experiment_id,
|
157
|
+
timestamp_ms=trace_info.request_time,
|
158
|
+
execution_time_ms=trace_info.execution_duration,
|
159
|
+
status=TraceStatus.from_state(trace_info.state),
|
160
|
+
request_metadata=trace_info.trace_metadata.copy(),
|
161
|
+
tags=trace_info.tags,
|
162
|
+
)
|
@@ -0,0 +1,173 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
from enum import Enum
|
3
|
+
from typing import Any, Optional
|
4
|
+
|
5
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
6
|
+
from mlflow.exceptions import MlflowException
|
7
|
+
from mlflow.protos import service_pb2 as pb
|
8
|
+
|
9
|
+
|
10
|
+
@dataclass
|
11
|
+
class MlflowExperimentLocation(_MlflowObject):
|
12
|
+
"""
|
13
|
+
Represents the location of an MLflow experiment.
|
14
|
+
|
15
|
+
Args:
|
16
|
+
experiment_id: The ID of the MLflow experiment where the trace is stored.
|
17
|
+
"""
|
18
|
+
|
19
|
+
experiment_id: str
|
20
|
+
|
21
|
+
def to_proto(self):
|
22
|
+
return pb.TraceLocation.MlflowExperimentLocation(experiment_id=self.experiment_id)
|
23
|
+
|
24
|
+
@classmethod
|
25
|
+
def from_proto(cls, proto) -> "MlflowExperimentLocation":
|
26
|
+
return cls(experiment_id=proto.experiment_id)
|
27
|
+
|
28
|
+
def to_dict(self) -> dict[str, Any]:
|
29
|
+
return {"experiment_id": self.experiment_id}
|
30
|
+
|
31
|
+
@classmethod
|
32
|
+
def from_dict(cls, d: dict[str, Any]) -> "MlflowExperimentLocation":
|
33
|
+
return cls(experiment_id=d["experiment_id"])
|
34
|
+
|
35
|
+
|
36
|
+
@dataclass
|
37
|
+
class InferenceTableLocation(_MlflowObject):
|
38
|
+
"""
|
39
|
+
Represents the location of a Databricks inference table.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
full_table_name: The fully qualified name of the inference table where
|
43
|
+
the trace is stored, in the format of `<catalog>.<schema>.<table>`.
|
44
|
+
"""
|
45
|
+
|
46
|
+
full_table_name: str
|
47
|
+
|
48
|
+
def to_proto(self):
|
49
|
+
return pb.TraceLocation.InferenceTableLocation(full_table_name=self.full_table_name)
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
def from_proto(cls, proto) -> "InferenceTableLocation":
|
53
|
+
return cls(full_table_name=proto.full_table_name)
|
54
|
+
|
55
|
+
def to_dict(self) -> dict[str, Any]:
|
56
|
+
return {"full_table_name": self.full_table_name}
|
57
|
+
|
58
|
+
@classmethod
|
59
|
+
def from_dict(cls, d: dict[str, Any]) -> "InferenceTableLocation":
|
60
|
+
return cls(full_table_name=d["full_table_name"])
|
61
|
+
|
62
|
+
|
63
|
+
class TraceLocationType(str, Enum):
|
64
|
+
TRACE_LOCATION_TYPE_UNSPECIFIED = "TRACE_LOCATION_TYPE_UNSPECIFIED"
|
65
|
+
MLFLOW_EXPERIMENT = "MLFLOW_EXPERIMENT"
|
66
|
+
INFERENCE_TABLE = "INFERENCE_TABLE"
|
67
|
+
|
68
|
+
def to_proto(self):
|
69
|
+
return pb.TraceLocation.TraceLocationType.Value(self)
|
70
|
+
|
71
|
+
@classmethod
|
72
|
+
def from_proto(cls, proto: int) -> "TraceLocationType":
|
73
|
+
return TraceLocationType(pb.TraceLocation.TraceLocationType.Name(proto))
|
74
|
+
|
75
|
+
@classmethod
|
76
|
+
def from_dict(cls, d: dict[str, Any]) -> "TraceLocationType":
|
77
|
+
return cls(d["type"])
|
78
|
+
|
79
|
+
|
80
|
+
@dataclass
|
81
|
+
class TraceLocation(_MlflowObject):
|
82
|
+
"""
|
83
|
+
Represents the location where the trace is stored.
|
84
|
+
|
85
|
+
Currently, MLflow supports two types of trace locations:
|
86
|
+
|
87
|
+
- MLflow experiment: The trace is stored in an MLflow experiment.
|
88
|
+
- Inference table: The trace is stored in a Databricks inference table.
|
89
|
+
|
90
|
+
Args:
|
91
|
+
type: The type of the trace location, should be one of the
|
92
|
+
:py:class:`TraceLocationType` enum values.
|
93
|
+
mlflow_experiment: The MLflow experiment location. Set this when the
|
94
|
+
location type is MLflow experiment.
|
95
|
+
inference_table: The inference table location. Set this when the
|
96
|
+
location type is Databricks Inference table.
|
97
|
+
"""
|
98
|
+
|
99
|
+
type: TraceLocationType
|
100
|
+
mlflow_experiment: Optional[MlflowExperimentLocation] = None
|
101
|
+
inference_table: Optional[InferenceTableLocation] = None
|
102
|
+
|
103
|
+
def __post_init__(self) -> None:
|
104
|
+
if self.mlflow_experiment is not None and self.inference_table is not None:
|
105
|
+
raise MlflowException.invalid_parameter_value(
|
106
|
+
"Only one of mlflow_experiment or inference_table can be provided."
|
107
|
+
)
|
108
|
+
|
109
|
+
if (self.mlflow_experiment and self.type != TraceLocationType.MLFLOW_EXPERIMENT) or (
|
110
|
+
self.inference_table and self.type != TraceLocationType.INFERENCE_TABLE
|
111
|
+
):
|
112
|
+
raise MlflowException.invalid_parameter_value(
|
113
|
+
f"Trace location type {type} does not match the provided location "
|
114
|
+
f"{self.mlflow_experiment or self.inference_table}."
|
115
|
+
)
|
116
|
+
|
117
|
+
def to_dict(self) -> dict[str, Any]:
|
118
|
+
d = {"type": self.type.value}
|
119
|
+
if self.mlflow_experiment:
|
120
|
+
d["mlflow_experiment"] = self.mlflow_experiment.to_dict()
|
121
|
+
elif self.inference_table:
|
122
|
+
d["inference_table"] = self.inference_table.to_dict()
|
123
|
+
return d
|
124
|
+
|
125
|
+
@classmethod
|
126
|
+
def from_dict(cls, d: dict[str, Any]) -> "TraceLocation":
|
127
|
+
return cls(
|
128
|
+
type=TraceLocationType(d["type"]),
|
129
|
+
mlflow_experiment=(
|
130
|
+
MlflowExperimentLocation.from_dict(v) if (v := d.get("mlflow_experiment")) else None
|
131
|
+
),
|
132
|
+
inference_table=(
|
133
|
+
InferenceTableLocation.from_dict(v) if (v := d.get("inference_table")) else None
|
134
|
+
),
|
135
|
+
)
|
136
|
+
|
137
|
+
def to_proto(self):
|
138
|
+
if self.mlflow_experiment:
|
139
|
+
return pb.TraceLocation(
|
140
|
+
type=self.type.to_proto(),
|
141
|
+
mlflow_experiment=self.mlflow_experiment.to_proto(),
|
142
|
+
)
|
143
|
+
elif self.inference_table:
|
144
|
+
return pb.TraceLocation(
|
145
|
+
type=self.type.to_proto(),
|
146
|
+
inference_table=self.inference_table.to_proto(),
|
147
|
+
)
|
148
|
+
|
149
|
+
else:
|
150
|
+
return pb.TraceLocation(type=self.type.to_proto())
|
151
|
+
|
152
|
+
@classmethod
|
153
|
+
def from_proto(cls, proto) -> "TraceLocation":
|
154
|
+
type_ = TraceLocationType.from_proto(proto.type)
|
155
|
+
if proto.WhichOneof("identifier") == "mlflow_experiment":
|
156
|
+
return cls(
|
157
|
+
type=type_,
|
158
|
+
mlflow_experiment=MlflowExperimentLocation.from_proto(proto.mlflow_experiment),
|
159
|
+
)
|
160
|
+
elif proto.WhichOneof("identifier") == "inference_table":
|
161
|
+
return cls(
|
162
|
+
type=type_,
|
163
|
+
inference_table=InferenceTableLocation.from_proto(proto.inference_table),
|
164
|
+
)
|
165
|
+
else:
|
166
|
+
return cls(type=type_)
|
167
|
+
|
168
|
+
@classmethod
|
169
|
+
def from_experiment_id(cls, experiment_id: str) -> "TraceLocation":
|
170
|
+
return cls(
|
171
|
+
type=TraceLocationType.MLFLOW_EXPERIMENT,
|
172
|
+
mlflow_experiment=MlflowExperimentLocation(experiment_id=experiment_id),
|
173
|
+
)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
from enum import Enum
|
2
|
+
|
3
|
+
from opentelemetry import trace as trace_api
|
4
|
+
|
5
|
+
from mlflow.protos import service_pb2 as pb
|
6
|
+
|
7
|
+
|
8
|
+
class TraceState(str, Enum):
|
9
|
+
"""Enum representing the state of a trace.
|
10
|
+
|
11
|
+
- ``STATE_UNSPECIFIED``: Unspecified trace state.
|
12
|
+
- ``OK``: Trace successfully completed.
|
13
|
+
- ``ERROR``: Trace encountered an error.
|
14
|
+
- ``IN_PROGRESS``: Trace is currently in progress.
|
15
|
+
"""
|
16
|
+
|
17
|
+
STATE_UNSPECIFIED = "STATE_UNSPECIFIED"
|
18
|
+
OK = "OK"
|
19
|
+
ERROR = "ERROR"
|
20
|
+
IN_PROGRESS = "IN_PROGRESS"
|
21
|
+
|
22
|
+
def to_proto(self):
|
23
|
+
return pb.TraceInfoV3.State.Value(self)
|
24
|
+
|
25
|
+
@classmethod
|
26
|
+
def from_proto(cls, proto: int) -> "TraceState":
|
27
|
+
return TraceState(pb.TraceInfoV3.State.Name(proto))
|
28
|
+
|
29
|
+
@staticmethod
|
30
|
+
def from_otel_status(otel_status: trace_api.Status):
|
31
|
+
"""Convert OpenTelemetry status code to MLflow TraceState."""
|
32
|
+
return _OTEL_STATUS_CODE_TO_MLFLOW[otel_status.status_code]
|
33
|
+
|
34
|
+
|
35
|
+
_OTEL_STATUS_CODE_TO_MLFLOW = {
|
36
|
+
trace_api.StatusCode.OK: TraceState.OK,
|
37
|
+
trace_api.StatusCode.ERROR: TraceState.ERROR,
|
38
|
+
trace_api.StatusCode.UNSET: TraceState.STATE_UNSPECIFIED,
|
39
|
+
}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
from enum import Enum
|
2
|
+
|
3
|
+
from opentelemetry import trace as trace_api
|
4
|
+
|
5
|
+
from mlflow.entities.trace_state import TraceState
|
6
|
+
from mlflow.protos.service_pb2 import TraceStatus as ProtoTraceStatus
|
7
|
+
from mlflow.utils.annotations import deprecated
|
8
|
+
|
9
|
+
|
10
|
+
@deprecated(alternative="mlflow.entities.trace_state.TraceState")
|
11
|
+
class TraceStatus(str, Enum):
|
12
|
+
"""Enum for status of an :py:class:`mlflow.entities.TraceInfo`."""
|
13
|
+
|
14
|
+
UNSPECIFIED = "TRACE_STATUS_UNSPECIFIED"
|
15
|
+
OK = "OK"
|
16
|
+
ERROR = "ERROR"
|
17
|
+
IN_PROGRESS = "IN_PROGRESS"
|
18
|
+
|
19
|
+
def to_state(self) -> TraceState:
|
20
|
+
if self == TraceStatus.UNSPECIFIED:
|
21
|
+
return TraceState.STATE_UNSPECIFIED
|
22
|
+
elif self == TraceStatus.OK:
|
23
|
+
return TraceState.OK
|
24
|
+
elif self == TraceStatus.ERROR:
|
25
|
+
return TraceState.ERROR
|
26
|
+
elif self == TraceStatus.IN_PROGRESS:
|
27
|
+
return TraceState.IN_PROGRESS
|
28
|
+
raise ValueError(f"Unknown TraceStatus: {self}")
|
29
|
+
|
30
|
+
@classmethod
|
31
|
+
def from_state(cls, state: TraceState) -> "TraceStatus":
|
32
|
+
if state == TraceState.STATE_UNSPECIFIED:
|
33
|
+
return cls.UNSPECIFIED
|
34
|
+
elif state == TraceState.OK:
|
35
|
+
return cls.OK
|
36
|
+
elif state == TraceState.ERROR:
|
37
|
+
return cls.ERROR
|
38
|
+
elif state == TraceState.IN_PROGRESS:
|
39
|
+
return cls.IN_PROGRESS
|
40
|
+
raise ValueError(f"Unknown TraceState: {state}")
|
41
|
+
|
42
|
+
def to_proto(self):
|
43
|
+
return ProtoTraceStatus.Value(self)
|
44
|
+
|
45
|
+
@staticmethod
|
46
|
+
def from_proto(proto_status):
|
47
|
+
return TraceStatus(ProtoTraceStatus.Name(proto_status))
|
48
|
+
|
49
|
+
@staticmethod
|
50
|
+
def from_otel_status(otel_status: trace_api.Status):
|
51
|
+
return _OTEL_STATUS_CODE_TO_MLFLOW[otel_status.status_code]
|
52
|
+
|
53
|
+
@classmethod
|
54
|
+
def pending_statuses(cls):
|
55
|
+
"""Traces in pending statuses can be updated to any statuses."""
|
56
|
+
return {cls.IN_PROGRESS}
|
57
|
+
|
58
|
+
@classmethod
|
59
|
+
def end_statuses(cls):
|
60
|
+
"""Traces in end statuses cannot be updated to any statuses."""
|
61
|
+
return {cls.UNSPECIFIED, cls.OK, cls.ERROR}
|
62
|
+
|
63
|
+
|
64
|
+
_OTEL_STATUS_CODE_TO_MLFLOW = {
|
65
|
+
trace_api.StatusCode.OK: TraceStatus.OK,
|
66
|
+
trace_api.StatusCode.ERROR: TraceStatus.ERROR,
|
67
|
+
trace_api.StatusCode.UNSET: TraceStatus.UNSPECIFIED,
|
68
|
+
}
|