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
mlflow/tracing/client.py
ADDED
@@ -0,0 +1,531 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from concurrent.futures import ThreadPoolExecutor
|
4
|
+
from contextlib import nullcontext
|
5
|
+
from typing import Optional, Sequence
|
6
|
+
|
7
|
+
import mlflow
|
8
|
+
from mlflow.entities.assessment import Assessment
|
9
|
+
from mlflow.entities.model_registry import PromptVersion
|
10
|
+
from mlflow.entities.span import NO_OP_SPAN_TRACE_ID
|
11
|
+
from mlflow.entities.trace import Trace
|
12
|
+
from mlflow.entities.trace_data import TraceData
|
13
|
+
from mlflow.entities.trace_info import TraceInfo
|
14
|
+
from mlflow.environment_variables import MLFLOW_SEARCH_TRACES_MAX_THREADS
|
15
|
+
from mlflow.exceptions import (
|
16
|
+
MlflowException,
|
17
|
+
MlflowTraceDataCorrupted,
|
18
|
+
MlflowTraceDataException,
|
19
|
+
MlflowTraceDataNotFound,
|
20
|
+
)
|
21
|
+
from mlflow.protos.databricks_pb2 import (
|
22
|
+
BAD_REQUEST,
|
23
|
+
INVALID_PARAMETER_VALUE,
|
24
|
+
RESOURCE_DOES_NOT_EXIST,
|
25
|
+
)
|
26
|
+
from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
|
27
|
+
from mlflow.store.entities.paged_list import PagedList
|
28
|
+
from mlflow.store.tracking import SEARCH_TRACES_DEFAULT_MAX_RESULTS
|
29
|
+
from mlflow.tracing.constant import TraceMetadataKey
|
30
|
+
from mlflow.tracing.trace_manager import InMemoryTraceManager
|
31
|
+
from mlflow.tracing.utils import TraceJSONEncoder, exclude_immutable_tags
|
32
|
+
from mlflow.tracing.utils.artifact_utils import get_artifact_uri_for_trace
|
33
|
+
from mlflow.tracking._tracking_service.utils import _get_store, _resolve_tracking_uri
|
34
|
+
from mlflow.utils import is_uuid
|
35
|
+
from mlflow.utils.mlflow_tags import IMMUTABLE_TAGS
|
36
|
+
from mlflow.utils.uri import add_databricks_profile_info_to_artifact_uri, is_databricks_uri
|
37
|
+
|
38
|
+
_logger = logging.getLogger(__name__)
|
39
|
+
|
40
|
+
|
41
|
+
class TracingClient:
|
42
|
+
"""
|
43
|
+
Client of an MLflow Tracking Server that creates and manages experiments and runs.
|
44
|
+
"""
|
45
|
+
|
46
|
+
def __init__(self, tracking_uri: Optional[str] = None):
|
47
|
+
"""
|
48
|
+
Args:
|
49
|
+
tracking_uri: Address of local or remote tracking server.
|
50
|
+
"""
|
51
|
+
self.tracking_uri = _resolve_tracking_uri(tracking_uri)
|
52
|
+
# NB: Fetch the tracking store (`self.store`) upon client initialization to ensure that
|
53
|
+
# the tracking URI is valid and the store can be properly resolved. We define `store` as a
|
54
|
+
# property method to ensure that the client is serializable, even if the store is not
|
55
|
+
# self.store
|
56
|
+
self.store
|
57
|
+
|
58
|
+
@property
|
59
|
+
def store(self):
|
60
|
+
return _get_store(self.tracking_uri)
|
61
|
+
|
62
|
+
def start_trace(self, trace_info: TraceInfo) -> TraceInfo:
|
63
|
+
"""
|
64
|
+
Create a new trace in the backend.
|
65
|
+
|
66
|
+
Args:
|
67
|
+
trace_info: The TraceInfo object to record in the backend.
|
68
|
+
|
69
|
+
Returns:
|
70
|
+
The returned TraceInfoV3 object from the backend.
|
71
|
+
"""
|
72
|
+
return self.store.start_trace(trace_info=trace_info)
|
73
|
+
|
74
|
+
def delete_traces(
|
75
|
+
self,
|
76
|
+
experiment_id: str,
|
77
|
+
max_timestamp_millis: Optional[int] = None,
|
78
|
+
max_traces: Optional[int] = None,
|
79
|
+
trace_ids: Optional[list[str]] = None,
|
80
|
+
) -> int:
|
81
|
+
return self.store.delete_traces(
|
82
|
+
experiment_id=experiment_id,
|
83
|
+
max_timestamp_millis=max_timestamp_millis,
|
84
|
+
max_traces=max_traces,
|
85
|
+
trace_ids=trace_ids,
|
86
|
+
)
|
87
|
+
|
88
|
+
def get_trace_info(self, trace_id: str) -> TraceInfo:
|
89
|
+
"""
|
90
|
+
Get the trace info matching the ``trace_id``.
|
91
|
+
|
92
|
+
Args:
|
93
|
+
trace_id: String id of the trace to fetch.
|
94
|
+
|
95
|
+
Returns:
|
96
|
+
TraceInfo object, of type ``mlflow.entities.trace_info.TraceInfo``.
|
97
|
+
"""
|
98
|
+
with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
|
99
|
+
if trace is not None:
|
100
|
+
return trace.info
|
101
|
+
|
102
|
+
return self.store.get_trace_info(trace_id)
|
103
|
+
|
104
|
+
def get_trace(self, trace_id: str) -> Trace:
|
105
|
+
"""
|
106
|
+
Get the trace matching the ``trace_id``.
|
107
|
+
|
108
|
+
Args:
|
109
|
+
trace_id: String id of the trace to fetch.
|
110
|
+
|
111
|
+
Returns:
|
112
|
+
The fetched Trace object, of type ``mlflow.entities.Trace``.
|
113
|
+
"""
|
114
|
+
trace_info = self.get_trace_info(trace_id)
|
115
|
+
try:
|
116
|
+
trace_data = self._download_trace_data(trace_info)
|
117
|
+
except MlflowTraceDataNotFound:
|
118
|
+
raise MlflowException(
|
119
|
+
message=(
|
120
|
+
f"Trace with ID {trace_id} cannot be loaded because it is missing span data."
|
121
|
+
" Please try creating or loading another trace."
|
122
|
+
),
|
123
|
+
error_code=BAD_REQUEST,
|
124
|
+
) from None # Ensure the original spammy exception is not included in the traceback
|
125
|
+
except MlflowTraceDataCorrupted:
|
126
|
+
raise MlflowException(
|
127
|
+
message=(
|
128
|
+
f"Trace with ID {trace_id} cannot be loaded because its span data"
|
129
|
+
" is corrupted. Please try creating or loading another trace."
|
130
|
+
),
|
131
|
+
error_code=BAD_REQUEST,
|
132
|
+
) from None # Ensure the original spammy exception is not included in the traceback
|
133
|
+
return Trace(trace_info, trace_data)
|
134
|
+
|
135
|
+
def get_online_trace_details(
|
136
|
+
self,
|
137
|
+
trace_id: str,
|
138
|
+
sql_warehouse_id: str,
|
139
|
+
source_inference_table: str,
|
140
|
+
source_databricks_request_id: str,
|
141
|
+
) -> str:
|
142
|
+
return self.store.get_online_trace_details(
|
143
|
+
trace_id=trace_id,
|
144
|
+
sql_warehouse_id=sql_warehouse_id,
|
145
|
+
source_inference_table=source_inference_table,
|
146
|
+
source_databricks_request_id=source_databricks_request_id,
|
147
|
+
)
|
148
|
+
|
149
|
+
def _search_traces(
|
150
|
+
self,
|
151
|
+
experiment_ids: list[str],
|
152
|
+
filter_string: Optional[str] = None,
|
153
|
+
max_results: int = SEARCH_TRACES_DEFAULT_MAX_RESULTS,
|
154
|
+
order_by: Optional[list[str]] = None,
|
155
|
+
page_token: Optional[str] = None,
|
156
|
+
model_id: Optional[str] = None,
|
157
|
+
sql_warehouse_id: Optional[str] = None,
|
158
|
+
):
|
159
|
+
return self.store.search_traces(
|
160
|
+
experiment_ids=experiment_ids,
|
161
|
+
filter_string=filter_string,
|
162
|
+
max_results=max_results,
|
163
|
+
order_by=order_by,
|
164
|
+
page_token=page_token,
|
165
|
+
model_id=model_id,
|
166
|
+
sql_warehouse_id=sql_warehouse_id,
|
167
|
+
)
|
168
|
+
|
169
|
+
def search_traces(
|
170
|
+
self,
|
171
|
+
experiment_ids: list[str],
|
172
|
+
filter_string: Optional[str] = None,
|
173
|
+
max_results: int = SEARCH_TRACES_DEFAULT_MAX_RESULTS,
|
174
|
+
order_by: Optional[list[str]] = None,
|
175
|
+
page_token: Optional[str] = None,
|
176
|
+
run_id: Optional[str] = None,
|
177
|
+
include_spans: bool = True,
|
178
|
+
model_id: Optional[str] = None,
|
179
|
+
sql_warehouse_id: Optional[str] = None,
|
180
|
+
) -> PagedList[Trace]:
|
181
|
+
"""
|
182
|
+
Return traces that match the given list of search expressions within the experiments.
|
183
|
+
|
184
|
+
Args:
|
185
|
+
experiment_ids: List of experiment ids to scope the search.
|
186
|
+
filter_string: A search filter string.
|
187
|
+
max_results: Maximum number of traces desired.
|
188
|
+
order_by: List of order_by clauses.
|
189
|
+
page_token: Token specifying the next page of results. It should be obtained from
|
190
|
+
a ``search_traces`` call.
|
191
|
+
run_id: A run id to scope the search. When a trace is created under an active run,
|
192
|
+
it will be associated with the run and you can filter on the run id to retrieve
|
193
|
+
the trace.
|
194
|
+
include_spans: If ``True``, include spans in the returned traces. Otherwise, only
|
195
|
+
the trace metadata is returned, e.g., trace ID, start time, end time, etc,
|
196
|
+
without any spans.
|
197
|
+
model_id: If specified, return traces associated with the model ID.
|
198
|
+
sql_warehouse_id: Only used in Databricks. The ID of the SQL warehouse to use for
|
199
|
+
searching traces in inference tables.
|
200
|
+
|
201
|
+
|
202
|
+
Returns:
|
203
|
+
A :py:class:`PagedList <mlflow.store.entities.PagedList>` of
|
204
|
+
:py:class:`Trace <mlflow.entities.Trace>` objects that satisfy the search
|
205
|
+
expressions. If the underlying tracking store supports pagination, the token for the
|
206
|
+
next page may be obtained via the ``token`` attribute of the returned object; however,
|
207
|
+
some store implementations may not support pagination and thus the returned token would
|
208
|
+
not be meaningful in such cases.
|
209
|
+
"""
|
210
|
+
if model_id is not None:
|
211
|
+
if filter_string:
|
212
|
+
raise MlflowException(
|
213
|
+
message=(
|
214
|
+
"Cannot specify both `model_id` or `filter_string` in the search_traces "
|
215
|
+
"call."
|
216
|
+
),
|
217
|
+
error_code=INVALID_PARAMETER_VALUE,
|
218
|
+
)
|
219
|
+
|
220
|
+
filter_string = (
|
221
|
+
f"request_metadata.`mlflow.modelId` = '{model_id}'"
|
222
|
+
if sql_warehouse_id is None
|
223
|
+
else None
|
224
|
+
)
|
225
|
+
|
226
|
+
is_databricks = is_databricks_uri(self.tracking_uri)
|
227
|
+
|
228
|
+
if run_id:
|
229
|
+
run = self.store.get_run(run_id)
|
230
|
+
if run.info.experiment_id not in experiment_ids:
|
231
|
+
raise MlflowException(
|
232
|
+
f"Run {run_id} belongs to experiment {run.info.experiment_id}, which is not "
|
233
|
+
f"in the list of experiment IDs provided: {experiment_ids}. Please include "
|
234
|
+
f"experiment {run.info.experiment_id} in the `experiment_ids` parameter to "
|
235
|
+
"search for traces from this run.",
|
236
|
+
error_code=INVALID_PARAMETER_VALUE,
|
237
|
+
)
|
238
|
+
|
239
|
+
additional_filter = (
|
240
|
+
f"attribute.run_id = '{run_id}'"
|
241
|
+
if is_databricks
|
242
|
+
else f"metadata.{TraceMetadataKey.SOURCE_RUN} = '{run_id}'"
|
243
|
+
)
|
244
|
+
if filter_string:
|
245
|
+
if TraceMetadataKey.SOURCE_RUN in filter_string:
|
246
|
+
raise MlflowException(
|
247
|
+
"You cannot filter by run_id when it is already part of the filter string."
|
248
|
+
f"Please remove the {TraceMetadataKey.SOURCE_RUN} filter from the filter "
|
249
|
+
"string and try again.",
|
250
|
+
error_code=INVALID_PARAMETER_VALUE,
|
251
|
+
)
|
252
|
+
filter_string += f" AND {additional_filter}"
|
253
|
+
else:
|
254
|
+
filter_string = additional_filter
|
255
|
+
|
256
|
+
is_databricks = is_databricks_uri(self.tracking_uri)
|
257
|
+
|
258
|
+
def download_trace_extra_fields(trace_info: TraceInfo) -> Optional[Trace]:
|
259
|
+
"""
|
260
|
+
Download trace data and assessments for the given trace_info and returns a Trace object.
|
261
|
+
If the download fails (e.g., the trace data is missing or corrupted), returns None.
|
262
|
+
|
263
|
+
The trace_info parameter can be either TraceInfo or TraceInfoV3 object.
|
264
|
+
"""
|
265
|
+
is_online_trace = is_uuid(trace_info.trace_id)
|
266
|
+
|
267
|
+
# For online traces in Databricks, we need to get trace data from a different endpoint
|
268
|
+
try:
|
269
|
+
if is_databricks and is_online_trace:
|
270
|
+
# For online traces, get data from the online API
|
271
|
+
trace_data = self.get_online_trace_details(
|
272
|
+
trace_id=trace_info.trace_id,
|
273
|
+
sql_warehouse_id=sql_warehouse_id,
|
274
|
+
source_inference_table=trace_info.request_metadata.get(
|
275
|
+
"mlflow.sourceTable"
|
276
|
+
),
|
277
|
+
source_databricks_request_id=trace_info.request_metadata.get(
|
278
|
+
"mlflow.databricksRequestId"
|
279
|
+
),
|
280
|
+
)
|
281
|
+
trace_data = TraceData.from_dict(json.loads(trace_data))
|
282
|
+
else:
|
283
|
+
# For offline traces, download data from artifact storage
|
284
|
+
trace_data = self._download_trace_data(trace_info)
|
285
|
+
except MlflowTraceDataException as e:
|
286
|
+
_logger.warning(
|
287
|
+
(
|
288
|
+
f"Failed to download trace data for trace {trace_info.trace_id!r} "
|
289
|
+
f"with {e.ctx}. For full traceback, set logging level to DEBUG."
|
290
|
+
),
|
291
|
+
exc_info=_logger.isEnabledFor(logging.DEBUG),
|
292
|
+
)
|
293
|
+
return None
|
294
|
+
else:
|
295
|
+
return Trace(trace_info, trace_data)
|
296
|
+
|
297
|
+
traces = []
|
298
|
+
next_max_results = max_results
|
299
|
+
next_token = page_token
|
300
|
+
|
301
|
+
max_workers = MLFLOW_SEARCH_TRACES_MAX_THREADS.get()
|
302
|
+
executor = (
|
303
|
+
ThreadPoolExecutor(max_workers=max_workers, thread_name_prefix="MlflowTracingSearch")
|
304
|
+
if include_spans
|
305
|
+
else nullcontext()
|
306
|
+
)
|
307
|
+
with executor:
|
308
|
+
while len(traces) < max_results:
|
309
|
+
trace_infos, next_token = self._search_traces(
|
310
|
+
experiment_ids=experiment_ids,
|
311
|
+
filter_string=filter_string,
|
312
|
+
max_results=next_max_results,
|
313
|
+
order_by=order_by,
|
314
|
+
page_token=next_token,
|
315
|
+
model_id=model_id,
|
316
|
+
sql_warehouse_id=sql_warehouse_id,
|
317
|
+
)
|
318
|
+
|
319
|
+
if include_spans:
|
320
|
+
traces.extend(
|
321
|
+
t for t in executor.map(download_trace_extra_fields, trace_infos) if t
|
322
|
+
)
|
323
|
+
else:
|
324
|
+
traces.extend(
|
325
|
+
Trace(trace_info, TraceData(spans=[])) for trace_info in trace_infos
|
326
|
+
)
|
327
|
+
|
328
|
+
if not next_token:
|
329
|
+
break
|
330
|
+
|
331
|
+
next_max_results = max_results - len(traces)
|
332
|
+
|
333
|
+
return PagedList(traces, next_token)
|
334
|
+
|
335
|
+
def set_trace_tags(self, trace_id: str, tags: dict[str, str]):
|
336
|
+
"""
|
337
|
+
Set tags on the trace with the given trace_id.
|
338
|
+
|
339
|
+
Args:
|
340
|
+
trace_id: The ID of the trace.
|
341
|
+
tags: A dictionary of key-value pairs.
|
342
|
+
"""
|
343
|
+
tags = exclude_immutable_tags(tags)
|
344
|
+
for k, v in tags.items():
|
345
|
+
self.set_trace_tag(trace_id, k, v)
|
346
|
+
|
347
|
+
def set_trace_tag(self, trace_id: str, key: str, value: str):
|
348
|
+
"""
|
349
|
+
Set a tag on the trace with the given trace ID.
|
350
|
+
|
351
|
+
Args:
|
352
|
+
trace_id: The ID of the trace to set the tag on.
|
353
|
+
key: The string key of the tag. Must be at most 250 characters long, otherwise
|
354
|
+
it will be truncated when stored.
|
355
|
+
value: The string value of the tag. Must be at most 250 characters long, otherwise
|
356
|
+
it will be truncated when stored.
|
357
|
+
"""
|
358
|
+
if not isinstance(value, str):
|
359
|
+
_logger.warning(
|
360
|
+
"Received non-string value for trace tag. Please note that non-string tag values"
|
361
|
+
"will automatically be stringified when the trace is logged."
|
362
|
+
)
|
363
|
+
|
364
|
+
# Trying to set the tag on the active trace first
|
365
|
+
with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
|
366
|
+
if trace:
|
367
|
+
trace.info.tags[key] = str(value)
|
368
|
+
return
|
369
|
+
|
370
|
+
if key in IMMUTABLE_TAGS:
|
371
|
+
_logger.warning(f"Tag '{key}' is immutable and cannot be set on a trace.")
|
372
|
+
else:
|
373
|
+
self.store.set_trace_tag(trace_id, key, str(value))
|
374
|
+
|
375
|
+
def delete_trace_tag(self, trace_id: str, key: str):
|
376
|
+
"""
|
377
|
+
Delete a tag on the trace with the given trace ID.
|
378
|
+
|
379
|
+
Args:
|
380
|
+
trace_id: The ID of the trace to delete the tag from.
|
381
|
+
key: The string key of the tag. Must be at most 250 characters long, otherwise
|
382
|
+
it will be truncated when stored.
|
383
|
+
"""
|
384
|
+
# Trying to delete the tag on the active trace first
|
385
|
+
with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
|
386
|
+
if trace:
|
387
|
+
if key in trace.info.tags:
|
388
|
+
trace.info.tags.pop(key)
|
389
|
+
return
|
390
|
+
else:
|
391
|
+
raise MlflowException(
|
392
|
+
f"Tag with key {key} not found in trace with ID {trace_id}.",
|
393
|
+
error_code=RESOURCE_DOES_NOT_EXIST,
|
394
|
+
)
|
395
|
+
|
396
|
+
if key in IMMUTABLE_TAGS:
|
397
|
+
_logger.warning(f"Tag '{key}' is immutable and cannot be deleted on a trace.")
|
398
|
+
else:
|
399
|
+
self.store.delete_trace_tag(trace_id, key)
|
400
|
+
|
401
|
+
def get_assessment(self, trace_id: str, assessment_id: str) -> Assessment:
|
402
|
+
"""
|
403
|
+
Get an assessment entity from the backend store.
|
404
|
+
|
405
|
+
Args:
|
406
|
+
trace_id: The ID of the trace.
|
407
|
+
assessment_id: The ID of the assessment to get.
|
408
|
+
|
409
|
+
Returns:
|
410
|
+
The Assessment object.
|
411
|
+
"""
|
412
|
+
if not is_databricks_uri(self.tracking_uri):
|
413
|
+
raise MlflowException(
|
414
|
+
"This API is currently only available for Databricks Managed MLflow. This "
|
415
|
+
"will be available in the open-source version of MLflow in a future release."
|
416
|
+
)
|
417
|
+
|
418
|
+
return self.store.get_assessment(trace_id, assessment_id)
|
419
|
+
|
420
|
+
def log_assessment(self, trace_id: str, assessment: Assessment) -> Assessment:
|
421
|
+
if not is_databricks_uri(self.tracking_uri):
|
422
|
+
raise MlflowException(
|
423
|
+
"This API is currently only available for Databricks Managed MLflow. This "
|
424
|
+
"will be available in the open-source version of MLflow in a future release."
|
425
|
+
)
|
426
|
+
|
427
|
+
assessment.trace_id = trace_id
|
428
|
+
|
429
|
+
if trace_id is None or trace_id == NO_OP_SPAN_TRACE_ID:
|
430
|
+
_logger.debug(
|
431
|
+
"Skipping assessment logging for NO_OP_SPAN_TRACE_ID. This is expected when "
|
432
|
+
"tracing is disabled."
|
433
|
+
)
|
434
|
+
return assessment
|
435
|
+
|
436
|
+
# If the trace is the active trace, add the assessment to it in-memory
|
437
|
+
if trace_id == mlflow.get_active_trace_id():
|
438
|
+
with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
|
439
|
+
if trace is None:
|
440
|
+
_logger.debug(
|
441
|
+
f"Trace {trace_id} is active but not found in the in-memory buffer. "
|
442
|
+
"Something is wrong with trace handling. Skipping assessment logging."
|
443
|
+
)
|
444
|
+
trace.info.assessments.append(assessment)
|
445
|
+
return assessment
|
446
|
+
|
447
|
+
return self.store.create_assessment(assessment)
|
448
|
+
|
449
|
+
def update_assessment(
|
450
|
+
self,
|
451
|
+
trace_id: str,
|
452
|
+
assessment_id: str,
|
453
|
+
assessment: Assessment,
|
454
|
+
):
|
455
|
+
"""
|
456
|
+
Update an existing assessment entity in the backend store.
|
457
|
+
|
458
|
+
Args:
|
459
|
+
trace_id: The ID of the trace.
|
460
|
+
assessment_id: The ID of the feedback assessment to update.
|
461
|
+
assessment: The updated assessment.
|
462
|
+
"""
|
463
|
+
if not is_databricks_uri(self.tracking_uri):
|
464
|
+
raise MlflowException(
|
465
|
+
"This API is currently only available for Databricks Managed MLflow. This "
|
466
|
+
"will be available in the open-source version of MLflow in a future release."
|
467
|
+
)
|
468
|
+
|
469
|
+
return self.store.update_assessment(
|
470
|
+
trace_id=trace_id,
|
471
|
+
assessment_id=assessment_id,
|
472
|
+
name=assessment.name,
|
473
|
+
expectation=assessment.expectation,
|
474
|
+
feedback=assessment.feedback,
|
475
|
+
rationale=assessment.rationale,
|
476
|
+
metadata=assessment.metadata,
|
477
|
+
)
|
478
|
+
|
479
|
+
def delete_assessment(self, trace_id: str, assessment_id: str):
|
480
|
+
"""
|
481
|
+
Delete an assessment associated with a trace.
|
482
|
+
|
483
|
+
Args:
|
484
|
+
trace_id: The ID of the trace.
|
485
|
+
assessment_id: The ID of the assessment to delete.
|
486
|
+
"""
|
487
|
+
if not is_databricks_uri(self.tracking_uri):
|
488
|
+
raise MlflowException(
|
489
|
+
"This API is currently only available for Databricks Managed MLflow. This "
|
490
|
+
"will be available in the open-source version of MLflow in a future release."
|
491
|
+
)
|
492
|
+
|
493
|
+
self.store.delete_assessment(trace_id=trace_id, assessment_id=assessment_id)
|
494
|
+
|
495
|
+
def _get_artifact_repo_for_trace(self, trace_info: TraceInfo):
|
496
|
+
artifact_uri = get_artifact_uri_for_trace(trace_info)
|
497
|
+
artifact_uri = add_databricks_profile_info_to_artifact_uri(artifact_uri, self.tracking_uri)
|
498
|
+
return get_artifact_repository(artifact_uri)
|
499
|
+
|
500
|
+
def _download_trace_data(self, trace_info: TraceInfo) -> TraceData:
|
501
|
+
"""
|
502
|
+
Download trace data from artifact repository.
|
503
|
+
|
504
|
+
Args:
|
505
|
+
trace_info: Either a TraceInfo or TraceInfoV3 object containing trace metadata.
|
506
|
+
|
507
|
+
Returns:
|
508
|
+
TraceData object representing the downloaded trace data.
|
509
|
+
"""
|
510
|
+
artifact_repo = self._get_artifact_repo_for_trace(trace_info)
|
511
|
+
return TraceData.from_dict(artifact_repo.download_trace_data())
|
512
|
+
|
513
|
+
def _upload_trace_data(self, trace_info: TraceInfo, trace_data: TraceData) -> None:
|
514
|
+
artifact_repo = self._get_artifact_repo_for_trace(trace_info)
|
515
|
+
trace_data_json = json.dumps(trace_data.to_dict(), cls=TraceJSONEncoder, ensure_ascii=False)
|
516
|
+
return artifact_repo.upload_trace_data(trace_data_json)
|
517
|
+
|
518
|
+
def link_prompt_versions_to_trace(
|
519
|
+
self, trace_id: str, prompts: Sequence[PromptVersion]
|
520
|
+
) -> None:
|
521
|
+
"""
|
522
|
+
Link multiple prompt versions to a trace.
|
523
|
+
|
524
|
+
Args:
|
525
|
+
trace_id: The ID of the trace to link prompts to.
|
526
|
+
prompts: List of PromptVersion objects to link to the trace.
|
527
|
+
"""
|
528
|
+
from mlflow.tracking._model_registry.utils import _get_store as _get_model_registry_store
|
529
|
+
|
530
|
+
registry_store = _get_model_registry_store()
|
531
|
+
registry_store.link_prompts_to_trace(prompt_versions=prompts, trace_id=trace_id)
|
mlflow/tracing/config.py
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
from dataclasses import dataclass, field, replace
|
2
|
+
from typing import TYPE_CHECKING, Any, Callable, Optional
|
3
|
+
|
4
|
+
from mlflow.tracing.utils.processor import validate_span_processors
|
5
|
+
from mlflow.utils.annotations import experimental
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from mlflow.entities.span import LiveSpan
|
9
|
+
|
10
|
+
|
11
|
+
@dataclass
|
12
|
+
class TracingConfig:
|
13
|
+
"""Configuration for MLflow tracing behavior."""
|
14
|
+
|
15
|
+
# TODO: Move more configuration options here, such as async logging, display, etc.
|
16
|
+
# A list of functions to process spans before export.
|
17
|
+
span_processors: list[Callable[["LiveSpan"], None]] = field(default_factory=list)
|
18
|
+
|
19
|
+
def __post_init__(self):
|
20
|
+
self.span_processors = validate_span_processors(self.span_processors)
|
21
|
+
|
22
|
+
|
23
|
+
# Global configuration instance for tracing
|
24
|
+
_MLFLOW_TRACING_CONFIG = TracingConfig()
|
25
|
+
|
26
|
+
|
27
|
+
class TracingConfigContext:
|
28
|
+
"""Context manager for temporary tracing configuration changes."""
|
29
|
+
|
30
|
+
def __init__(self, config_updates: dict[str, Any]):
|
31
|
+
self.config_updates = config_updates
|
32
|
+
# Create a shallow copy of the current config
|
33
|
+
self.previous_config = replace(_MLFLOW_TRACING_CONFIG)
|
34
|
+
|
35
|
+
for key, value in self.config_updates.items():
|
36
|
+
setattr(_MLFLOW_TRACING_CONFIG, key, value)
|
37
|
+
|
38
|
+
def __enter__(self):
|
39
|
+
return self
|
40
|
+
|
41
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
42
|
+
global _MLFLOW_TRACING_CONFIG
|
43
|
+
_MLFLOW_TRACING_CONFIG = self.previous_config
|
44
|
+
|
45
|
+
|
46
|
+
def get_config() -> TracingConfig:
|
47
|
+
"""
|
48
|
+
Get the current tracing configuration.
|
49
|
+
|
50
|
+
Returns:
|
51
|
+
The current TracingConfig instance.
|
52
|
+
"""
|
53
|
+
return _MLFLOW_TRACING_CONFIG
|
54
|
+
|
55
|
+
|
56
|
+
def reset_config():
|
57
|
+
"""
|
58
|
+
Reset the tracing configuration to defaults.
|
59
|
+
"""
|
60
|
+
global _MLFLOW_TRACING_CONFIG
|
61
|
+
_MLFLOW_TRACING_CONFIG = TracingConfig()
|
62
|
+
|
63
|
+
|
64
|
+
@experimental(version="3.2.0")
|
65
|
+
def configure(
|
66
|
+
span_processors: Optional[list[Callable[["LiveSpan"], None]]] = None,
|
67
|
+
) -> TracingConfigContext:
|
68
|
+
"""
|
69
|
+
Configure MLflow tracing. Can be used as function or context manager.
|
70
|
+
|
71
|
+
Only updates explicitly provided arguments, leaving others unchanged.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
span_processors: List of functions to process spans before export.
|
75
|
+
This is helpful for filtering/masking particular attributes from the span to
|
76
|
+
prevent sensitive data from being logged or for reducing the size of the span.
|
77
|
+
Each function must accept a single argument of type LiveSpan and should not
|
78
|
+
return any value. When multiple functions are provided, they are applied
|
79
|
+
sequentially in the order they are provided.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
TracingConfigContext: Context manager for temporary configuration changes.
|
83
|
+
When used as a function, the configuration changes persist.
|
84
|
+
When used as a context manager, changes are reverted on exit.
|
85
|
+
|
86
|
+
Examples:
|
87
|
+
|
88
|
+
.. code-block:: python
|
89
|
+
|
90
|
+
def pii_filter(span):
|
91
|
+
\"\"\"Example PII filter that masks sensitive data in span attributes.\"\"\"
|
92
|
+
# Mask sensitive inputs
|
93
|
+
if inputs := span.inputs:
|
94
|
+
for key, value in inputs.items():
|
95
|
+
if "password" in key.lower() or "token" in key.lower():
|
96
|
+
span.set_inputs({**inputs, key: "[REDACTED]"})
|
97
|
+
|
98
|
+
# Mask sensitive outputs
|
99
|
+
if outputs := span.outputs:
|
100
|
+
if isinstance(outputs, dict):
|
101
|
+
for key in outputs:
|
102
|
+
if "secret" in key.lower():
|
103
|
+
outputs[key] = "[REDACTED]"
|
104
|
+
span.set_outputs(outputs)
|
105
|
+
|
106
|
+
# Mask sensitive attributes
|
107
|
+
for attr_key in list(span.attributes.keys()):
|
108
|
+
if "api_key" in attr_key.lower():
|
109
|
+
span.set_attribute(attr_key, "[REDACTED]")
|
110
|
+
|
111
|
+
# Permanent configuration change
|
112
|
+
mlflow.tracing.configure(span_processors=[pii_filter])
|
113
|
+
|
114
|
+
# Temporary configuration change
|
115
|
+
with mlflow.tracing.configure(span_processors=[pii_filter]):
|
116
|
+
# PII filtering enabled only in this block
|
117
|
+
pass
|
118
|
+
"""
|
119
|
+
# Collect only the arguments that were explicitly provided
|
120
|
+
config_updates = {}
|
121
|
+
if span_processors is not None:
|
122
|
+
config_updates["span_processors"] = span_processors
|
123
|
+
|
124
|
+
# Return TracingConfigContext which handles both function and context manager usage
|
125
|
+
return TracingConfigContext(config_updates)
|