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,138 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Any, Optional, Sequence
|
3
|
+
|
4
|
+
from cachetools import TTLCache
|
5
|
+
from opentelemetry.sdk.trace import ReadableSpan
|
6
|
+
from opentelemetry.sdk.trace.export import SpanExporter
|
7
|
+
|
8
|
+
from mlflow.entities.model_registry import PromptVersion
|
9
|
+
from mlflow.entities.trace import Trace
|
10
|
+
from mlflow.environment_variables import (
|
11
|
+
_MLFLOW_ENABLE_TRACE_DUAL_WRITE_IN_MODEL_SERVING,
|
12
|
+
MLFLOW_TRACE_BUFFER_MAX_SIZE,
|
13
|
+
MLFLOW_TRACE_BUFFER_TTL_SECONDS,
|
14
|
+
)
|
15
|
+
from mlflow.tracing.client import TracingClient
|
16
|
+
from mlflow.tracing.export.async_export_queue import AsyncTraceExportQueue, Task
|
17
|
+
from mlflow.tracing.export.utils import try_link_prompts_to_trace
|
18
|
+
from mlflow.tracing.fluent import _set_last_active_trace_id
|
19
|
+
from mlflow.tracing.trace_manager import InMemoryTraceManager
|
20
|
+
from mlflow.tracing.utils import add_size_stats_to_trace_metadata
|
21
|
+
|
22
|
+
_logger = logging.getLogger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
def pop_trace(request_id: str) -> Optional[dict[str, Any]]:
|
26
|
+
"""
|
27
|
+
Pop the completed trace data from the buffer. This method is used in
|
28
|
+
the Databricks model serving so please be careful when modifying it.
|
29
|
+
"""
|
30
|
+
return _TRACE_BUFFER.pop(request_id, None)
|
31
|
+
|
32
|
+
|
33
|
+
# For Inference Table, we use special TTLCache to store the finished traces
|
34
|
+
# so that they can be retrieved by Databricks model serving. The values
|
35
|
+
# in the buffer are not Trace dataclass, but rather a dictionary with the schema
|
36
|
+
# that is used within Databricks model serving.
|
37
|
+
def _initialize_trace_buffer(): # Define as a function for testing purposes
|
38
|
+
return TTLCache(
|
39
|
+
maxsize=MLFLOW_TRACE_BUFFER_MAX_SIZE.get(),
|
40
|
+
ttl=MLFLOW_TRACE_BUFFER_TTL_SECONDS.get(),
|
41
|
+
)
|
42
|
+
|
43
|
+
|
44
|
+
_TRACE_BUFFER = _initialize_trace_buffer()
|
45
|
+
|
46
|
+
|
47
|
+
class InferenceTableSpanExporter(SpanExporter):
|
48
|
+
"""
|
49
|
+
An exporter implementation that logs the traces to Inference Table.
|
50
|
+
|
51
|
+
Currently the Inference Table does not use collector to receive the traces,
|
52
|
+
but rather actively fetches the trace during the prediction process. In the
|
53
|
+
future, we may consider using collector-based approach and this exporter should
|
54
|
+
send the traces instead of storing them in the buffer.
|
55
|
+
"""
|
56
|
+
|
57
|
+
def __init__(self):
|
58
|
+
self._trace_manager = InMemoryTraceManager.get_instance()
|
59
|
+
|
60
|
+
# NB: When this env var is set to true, MLflow will export traces to both inference
|
61
|
+
# table and the Databricks Tracing Server.
|
62
|
+
self._should_write_to_mlflow_backend = (
|
63
|
+
_MLFLOW_ENABLE_TRACE_DUAL_WRITE_IN_MODEL_SERVING.get()
|
64
|
+
)
|
65
|
+
if self._should_write_to_mlflow_backend:
|
66
|
+
self._client = TracingClient("databricks")
|
67
|
+
self._async_queue = AsyncTraceExportQueue()
|
68
|
+
|
69
|
+
def export(self, spans: Sequence[ReadableSpan]):
|
70
|
+
"""
|
71
|
+
Export the spans to Inference Table via the TTLCache buffer.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
spans: A sequence of OpenTelemetry ReadableSpan objects passed from
|
75
|
+
a span processor. Only root spans for each trace should be exported.
|
76
|
+
"""
|
77
|
+
for span in spans:
|
78
|
+
if span._parent is not None:
|
79
|
+
_logger.debug("Received a non-root span. Skipping export.")
|
80
|
+
continue
|
81
|
+
|
82
|
+
manager_trace = self._trace_manager.pop_trace(span.context.trace_id)
|
83
|
+
if manager_trace is None:
|
84
|
+
_logger.debug(f"Trace for span {span} not found. Skipping export.")
|
85
|
+
continue
|
86
|
+
|
87
|
+
trace = manager_trace.trace
|
88
|
+
_set_last_active_trace_id(trace.info.trace_id)
|
89
|
+
|
90
|
+
# Add the trace to the in-memory buffer so it can be retrieved by upstream
|
91
|
+
# The key is Databricks request ID.
|
92
|
+
_TRACE_BUFFER[trace.info.client_request_id] = trace.to_dict()
|
93
|
+
|
94
|
+
if self._should_write_to_mlflow_backend:
|
95
|
+
if trace.info.experiment_id is None:
|
96
|
+
# NB: The experiment ID is set based on the MLFLOW_EXPERIMENT_ID env var
|
97
|
+
# populated in the scoring server by Agent Framework. If the model is not
|
98
|
+
# deployed via agents.deploy(), the env var will not be set and the
|
99
|
+
# experiment will be empty, even if the dual write itself is enabled.
|
100
|
+
_logger.warning(
|
101
|
+
"Dual write to MLflow backend is enabled, but experiment ID is not set "
|
102
|
+
"for the trace. Skipping trace export to MLflow backend."
|
103
|
+
)
|
104
|
+
continue
|
105
|
+
|
106
|
+
try:
|
107
|
+
# Log the trace to the MLflow backend asynchronously
|
108
|
+
self._async_queue.put(
|
109
|
+
task=Task(
|
110
|
+
handler=self._log_trace_to_mlflow_backend,
|
111
|
+
args=(trace, manager_trace.prompts),
|
112
|
+
error_msg=f"Failed to log trace {trace.info.trace_id}.",
|
113
|
+
)
|
114
|
+
)
|
115
|
+
except Exception as e:
|
116
|
+
_logger.warning(
|
117
|
+
f"Failed to export trace to MLflow backend. Error: {e}",
|
118
|
+
stack_info=_logger.isEnabledFor(logging.DEBUG),
|
119
|
+
)
|
120
|
+
|
121
|
+
def _log_trace_to_mlflow_backend(self, trace: Trace, prompts: Sequence[PromptVersion]):
|
122
|
+
add_size_stats_to_trace_metadata(trace)
|
123
|
+
|
124
|
+
returned_trace_info = self._client.start_trace(trace.info)
|
125
|
+
self._client._upload_trace_data(returned_trace_info, trace.data)
|
126
|
+
|
127
|
+
# Link prompt versions to the trace. Prompt linking is not critical for trace export
|
128
|
+
# (if the prompt fails to link, the user's workflow is minorly affected), so we handle
|
129
|
+
# errors gracefully without failing the entire trace export
|
130
|
+
try_link_prompts_to_trace(
|
131
|
+
client=self._client,
|
132
|
+
trace_id=returned_trace_info.trace_id,
|
133
|
+
prompts=prompts,
|
134
|
+
synchronous=True, # Run synchronously since we're already in an async task
|
135
|
+
)
|
136
|
+
_logger.debug(
|
137
|
+
f"Finished logging trace to MLflow backend. TraceInfo: {returned_trace_info.to_dict()} "
|
138
|
+
)
|
@@ -0,0 +1,137 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Optional, Sequence
|
3
|
+
|
4
|
+
from opentelemetry.sdk.trace import ReadableSpan
|
5
|
+
from opentelemetry.sdk.trace.export import SpanExporter
|
6
|
+
|
7
|
+
from mlflow.entities.model_registry import PromptVersion
|
8
|
+
from mlflow.entities.trace import Trace
|
9
|
+
from mlflow.environment_variables import (
|
10
|
+
MLFLOW_ENABLE_ASYNC_TRACE_LOGGING,
|
11
|
+
)
|
12
|
+
from mlflow.tracing.client import TracingClient
|
13
|
+
from mlflow.tracing.constant import TraceTagKey
|
14
|
+
from mlflow.tracing.display import get_display_handler
|
15
|
+
from mlflow.tracing.export.async_export_queue import AsyncTraceExportQueue, Task
|
16
|
+
from mlflow.tracing.export.utils import try_link_prompts_to_trace
|
17
|
+
from mlflow.tracing.fluent import _EVAL_REQUEST_ID_TO_TRACE_ID, _set_last_active_trace_id
|
18
|
+
from mlflow.tracing.trace_manager import InMemoryTraceManager
|
19
|
+
from mlflow.tracing.utils import add_size_stats_to_trace_metadata, maybe_get_request_id
|
20
|
+
from mlflow.utils.databricks_utils import is_in_databricks_notebook
|
21
|
+
from mlflow.utils.uri import is_databricks_uri
|
22
|
+
|
23
|
+
_logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
|
26
|
+
class MlflowV3SpanExporter(SpanExporter):
|
27
|
+
"""
|
28
|
+
An exporter implementation that logs the traces to MLflow Tracking Server
|
29
|
+
using the V3 trace schema and API.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(self, tracking_uri: Optional[str] = None):
|
33
|
+
self._client = TracingClient(tracking_uri)
|
34
|
+
self._is_async_enabled = self._should_enable_async_logging()
|
35
|
+
if self._is_async_enabled:
|
36
|
+
self._async_queue = AsyncTraceExportQueue()
|
37
|
+
|
38
|
+
# Display handler is no-op when running outside of notebooks.
|
39
|
+
self._display_handler = get_display_handler()
|
40
|
+
|
41
|
+
def export(self, spans: Sequence[ReadableSpan]):
|
42
|
+
"""
|
43
|
+
Export the spans to the destination.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
spans: A sequence of OpenTelemetry ReadableSpan objects passed from
|
47
|
+
a span processor. Only root spans for each trace should be exported.
|
48
|
+
"""
|
49
|
+
for span in spans:
|
50
|
+
if span._parent is not None:
|
51
|
+
_logger.debug("Received a non-root span. Skipping export.")
|
52
|
+
continue
|
53
|
+
|
54
|
+
manager_trace = InMemoryTraceManager.get_instance().pop_trace(span.context.trace_id)
|
55
|
+
if manager_trace is None:
|
56
|
+
_logger.debug(f"Trace for span {span} not found. Skipping export.")
|
57
|
+
continue
|
58
|
+
|
59
|
+
trace = manager_trace.trace
|
60
|
+
_set_last_active_trace_id(trace.info.request_id)
|
61
|
+
|
62
|
+
# Store mapping from eval request ID to trace ID so that the evaluation
|
63
|
+
# harness can access to the trace using mlflow.get_trace(eval_request_id)
|
64
|
+
if eval_request_id := trace.info.tags.get(TraceTagKey.EVAL_REQUEST_ID):
|
65
|
+
_EVAL_REQUEST_ID_TO_TRACE_ID[eval_request_id] = trace.info.trace_id
|
66
|
+
|
67
|
+
if not maybe_get_request_id(is_evaluate=True):
|
68
|
+
self._display_handler.display_traces([trace])
|
69
|
+
|
70
|
+
if self._should_log_async():
|
71
|
+
self._async_queue.put(
|
72
|
+
task=Task(
|
73
|
+
handler=self._log_trace,
|
74
|
+
args=(trace, manager_trace.prompts),
|
75
|
+
error_msg="Failed to log trace to the trace server.",
|
76
|
+
)
|
77
|
+
)
|
78
|
+
else:
|
79
|
+
self._log_trace(trace, prompts=manager_trace.prompts)
|
80
|
+
|
81
|
+
def _log_trace(self, trace: Trace, prompts: Sequence[PromptVersion]):
|
82
|
+
"""
|
83
|
+
Handles exporting a trace to MLflow using the V3 API and blob storage.
|
84
|
+
Steps:
|
85
|
+
1. Create the trace in MLflow
|
86
|
+
2. Upload the trace data to blob storage using the returned trace info.
|
87
|
+
"""
|
88
|
+
try:
|
89
|
+
if trace:
|
90
|
+
add_size_stats_to_trace_metadata(trace)
|
91
|
+
returned_trace_info = self._client.start_trace(trace.info)
|
92
|
+
self._client._upload_trace_data(returned_trace_info, trace.data)
|
93
|
+
else:
|
94
|
+
_logger.warning("No trace or trace info provided, unable to export")
|
95
|
+
except Exception as e:
|
96
|
+
_logger.warning(f"Failed to send trace to MLflow backend: {e}")
|
97
|
+
|
98
|
+
try:
|
99
|
+
# Always run prompt linking asynchronously since (1) prompt linking API calls
|
100
|
+
# would otherwise add latency to the export procedure and (2) prompt linking is not
|
101
|
+
# critical for trace export (if the prompt fails to link, the user's workflow is
|
102
|
+
# minorly affected), so we don't have to await successful linking
|
103
|
+
try_link_prompts_to_trace(
|
104
|
+
client=self._client,
|
105
|
+
trace_id=trace.info.trace_id,
|
106
|
+
prompts=prompts,
|
107
|
+
synchronous=False,
|
108
|
+
)
|
109
|
+
except Exception as e:
|
110
|
+
_logger.warning(f"Failed to link prompts to trace: {e}")
|
111
|
+
|
112
|
+
def _should_enable_async_logging(self):
|
113
|
+
if (
|
114
|
+
is_in_databricks_notebook()
|
115
|
+
# NB: Not defaulting OSS backend to async logging for now to reduce blast radius.
|
116
|
+
or not is_databricks_uri(self._client.tracking_uri)
|
117
|
+
):
|
118
|
+
# NB: We don't turn on async logging in Databricks notebook by default
|
119
|
+
# until we are confident that the async logging is working on the
|
120
|
+
# offline workload on Databricks, to derisk the inclusion to the
|
121
|
+
# standard image. When it is enabled explicitly via the env var, we
|
122
|
+
# will respect that.
|
123
|
+
return (
|
124
|
+
MLFLOW_ENABLE_ASYNC_TRACE_LOGGING.get()
|
125
|
+
if MLFLOW_ENABLE_ASYNC_TRACE_LOGGING.is_set()
|
126
|
+
else False
|
127
|
+
)
|
128
|
+
|
129
|
+
return MLFLOW_ENABLE_ASYNC_TRACE_LOGGING.get()
|
130
|
+
|
131
|
+
def _should_log_async(self):
|
132
|
+
# During evaluate, the eval harness relies on the generated trace objects,
|
133
|
+
# so we should not log traces asynchronously.
|
134
|
+
if maybe_get_request_id(is_evaluate=True):
|
135
|
+
return False
|
136
|
+
|
137
|
+
return self._is_async_enabled
|
@@ -0,0 +1,70 @@
|
|
1
|
+
"""
|
2
|
+
Utility functions for prompt linking in trace exporters.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import logging
|
6
|
+
import threading
|
7
|
+
import uuid
|
8
|
+
from typing import Sequence
|
9
|
+
|
10
|
+
from mlflow.entities.model_registry import PromptVersion
|
11
|
+
from mlflow.tracing.client import TracingClient
|
12
|
+
|
13
|
+
_logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
def try_link_prompts_to_trace(
|
17
|
+
client: TracingClient,
|
18
|
+
trace_id: str,
|
19
|
+
prompts: Sequence[PromptVersion],
|
20
|
+
synchronous: bool = True,
|
21
|
+
) -> None:
|
22
|
+
"""
|
23
|
+
Attempt to link prompt versions to a trace with graceful error handling.
|
24
|
+
|
25
|
+
This function provides a reusable way to link prompts to traces with consistent
|
26
|
+
error handling across different exporters. Errors are caught and logged but do
|
27
|
+
not propagate, ensuring that prompt linking failures don't affect trace export.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
client: The TracingClient instance to use for linking.
|
31
|
+
trace_id: The ID of the trace to link prompts to.
|
32
|
+
prompts: Sequence of PromptVersion objects to link.
|
33
|
+
synchronous: If True, run the linking synchronously. If False, run in a separate thread.
|
34
|
+
"""
|
35
|
+
if not prompts:
|
36
|
+
return
|
37
|
+
|
38
|
+
if synchronous:
|
39
|
+
_link_prompts_sync(client, trace_id, prompts)
|
40
|
+
else:
|
41
|
+
threading.Thread(
|
42
|
+
target=_link_prompts_sync,
|
43
|
+
args=(client, trace_id, prompts),
|
44
|
+
name=f"link_prompts_from_exporter-{uuid.uuid4().hex[:8]}",
|
45
|
+
).start()
|
46
|
+
|
47
|
+
|
48
|
+
def _link_prompts_sync(
|
49
|
+
client: TracingClient,
|
50
|
+
trace_id: str,
|
51
|
+
prompts: Sequence[PromptVersion],
|
52
|
+
) -> None:
|
53
|
+
"""
|
54
|
+
Synchronously link prompt versions to a trace with error handling.
|
55
|
+
|
56
|
+
This is the core implementation that handles the actual API call and error logging.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
client: The TracingClient instance to use for linking.
|
60
|
+
trace_id: The ID of the trace to link prompts to.
|
61
|
+
prompts: Sequence of PromptVersion objects to link.
|
62
|
+
"""
|
63
|
+
try:
|
64
|
+
client.link_prompt_versions_to_trace(
|
65
|
+
trace_id=trace_id,
|
66
|
+
prompts=prompts,
|
67
|
+
)
|
68
|
+
_logger.debug(f"Successfully linked {len(prompts)} prompts to trace {trace_id}")
|
69
|
+
except Exception as e:
|
70
|
+
_logger.warning(f"Failed to link prompts to trace {trace_id}: {e}")
|