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,250 @@
|
|
1
|
+
import atexit
|
2
|
+
import logging
|
3
|
+
import threading
|
4
|
+
import time
|
5
|
+
from collections import OrderedDict
|
6
|
+
|
7
|
+
from cachetools import Cache, TTLCache
|
8
|
+
|
9
|
+
from mlflow.entities.span_event import SpanEvent
|
10
|
+
from mlflow.entities.span_status import SpanStatusCode
|
11
|
+
from mlflow.environment_variables import (
|
12
|
+
MLFLOW_TRACE_BUFFER_MAX_SIZE,
|
13
|
+
MLFLOW_TRACE_BUFFER_TTL_SECONDS,
|
14
|
+
MLFLOW_TRACE_TIMEOUT_CHECK_INTERVAL_SECONDS,
|
15
|
+
MLFLOW_TRACE_TIMEOUT_SECONDS,
|
16
|
+
)
|
17
|
+
from mlflow.exceptions import MlflowTracingException
|
18
|
+
|
19
|
+
_logger = logging.getLogger(__name__)
|
20
|
+
|
21
|
+
_TRACE_EXPIRATION_MSG = (
|
22
|
+
"Trace {request_id} is timed out after {ttl} seconds. The operation may be stuck or "
|
23
|
+
"taking too long to complete. To increase the timeout, set the environment variable "
|
24
|
+
"MLFLOW_TRACE_TIMEOUT_SECONDS to a larger value."
|
25
|
+
)
|
26
|
+
|
27
|
+
|
28
|
+
def get_trace_cache_with_timeout() -> Cache:
|
29
|
+
"""
|
30
|
+
Return a cache object that stores traces in-memory while they are in-progress.
|
31
|
+
|
32
|
+
If the timeout is specified, this returns a customized cache that logs the
|
33
|
+
expired traces to the backend. Otherwise, this returns a regular cache.
|
34
|
+
"""
|
35
|
+
|
36
|
+
if timeout := MLFLOW_TRACE_TIMEOUT_SECONDS.get():
|
37
|
+
return MlflowTraceTimeoutCache(
|
38
|
+
timeout=timeout,
|
39
|
+
maxsize=MLFLOW_TRACE_BUFFER_MAX_SIZE.get(),
|
40
|
+
)
|
41
|
+
|
42
|
+
# NB: Ideally we should return the vanilla Cache object only with maxsize.
|
43
|
+
# But we used TTLCache before introducing the timeout feature (that does not
|
44
|
+
# monitor timeout periodically nor log the expired traces). To keep the
|
45
|
+
# backward compatibility, we return TTLCache.
|
46
|
+
return TTLCache(
|
47
|
+
ttl=MLFLOW_TRACE_BUFFER_TTL_SECONDS.get(),
|
48
|
+
maxsize=MLFLOW_TRACE_BUFFER_MAX_SIZE.get(),
|
49
|
+
)
|
50
|
+
|
51
|
+
|
52
|
+
class _TimedCache(Cache):
|
53
|
+
"""
|
54
|
+
This code is ported from cachetools library to avoid depending on the private class.
|
55
|
+
https://github.com/tkem/cachetools/blob/d44c98407030d2e91cbe82c3997be042d9c2f0de/src/cachetools/__init__.py#L376
|
56
|
+
"""
|
57
|
+
|
58
|
+
class _Timer:
|
59
|
+
def __init__(self, timer):
|
60
|
+
self.__timer = timer
|
61
|
+
self.__nesting = 0
|
62
|
+
|
63
|
+
def __call__(self):
|
64
|
+
if self.__nesting == 0:
|
65
|
+
return self.__timer()
|
66
|
+
else:
|
67
|
+
return self.__time
|
68
|
+
|
69
|
+
def __enter__(self):
|
70
|
+
if self.__nesting == 0:
|
71
|
+
self.__time = time = self.__timer()
|
72
|
+
else:
|
73
|
+
time = self.__time
|
74
|
+
self.__nesting += 1
|
75
|
+
return time
|
76
|
+
|
77
|
+
def __exit__(self, *exc):
|
78
|
+
self.__nesting -= 1
|
79
|
+
|
80
|
+
def __reduce__(self):
|
81
|
+
return _TimedCache._Timer, (self.__timer,)
|
82
|
+
|
83
|
+
def __getattr__(self, name):
|
84
|
+
return getattr(self.__timer, name)
|
85
|
+
|
86
|
+
def __init__(self, maxsize, timer=time.monotonic, getsizeof=None):
|
87
|
+
Cache.__init__(self, maxsize, getsizeof)
|
88
|
+
self.__timer = _TimedCache._Timer(timer)
|
89
|
+
|
90
|
+
def __repr__(self, cache_repr=Cache.__repr__):
|
91
|
+
with self.__timer as time:
|
92
|
+
self.expire(time)
|
93
|
+
return cache_repr(self)
|
94
|
+
|
95
|
+
def __len__(self, cache_len=Cache.__len__):
|
96
|
+
with self.__timer as time:
|
97
|
+
self.expire(time)
|
98
|
+
return cache_len(self)
|
99
|
+
|
100
|
+
@property
|
101
|
+
def currsize(self):
|
102
|
+
with self.__timer as time:
|
103
|
+
self.expire(time)
|
104
|
+
return super().currsize
|
105
|
+
|
106
|
+
@property
|
107
|
+
def timer(self):
|
108
|
+
"""The timer function used by the cache."""
|
109
|
+
return self.__timer
|
110
|
+
|
111
|
+
def clear(self):
|
112
|
+
with self.__timer as time:
|
113
|
+
self.expire(time)
|
114
|
+
Cache.clear(self)
|
115
|
+
|
116
|
+
def get(self, *args, **kwargs):
|
117
|
+
with self.__timer:
|
118
|
+
return Cache.get(self, *args, **kwargs)
|
119
|
+
|
120
|
+
def pop(self, *args, **kwargs):
|
121
|
+
with self.__timer:
|
122
|
+
return Cache.pop(self, *args, **kwargs)
|
123
|
+
|
124
|
+
def setdefault(self, *args, **kwargs):
|
125
|
+
with self.__timer:
|
126
|
+
return Cache.setdefault(self, *args, **kwargs)
|
127
|
+
|
128
|
+
|
129
|
+
class MlflowTraceTimeoutCache(_TimedCache):
|
130
|
+
"""
|
131
|
+
A different implementation of cachetools.TTLCache that logs the expired traces to the backend.
|
132
|
+
|
133
|
+
NB: Do not use this class outside a singleton context. This class is not thread-safe.
|
134
|
+
"""
|
135
|
+
|
136
|
+
def __init__(self, timeout: int, maxsize: int):
|
137
|
+
super().__init__(maxsize=maxsize)
|
138
|
+
self._timeout = timeout
|
139
|
+
|
140
|
+
# Set up the linked list ordered by expiration time
|
141
|
+
self._root = TTLCache._Link()
|
142
|
+
self._root.prev = self._root
|
143
|
+
self._root.next = self._root
|
144
|
+
self._links = OrderedDict()
|
145
|
+
|
146
|
+
self._start_expire_check_loop()
|
147
|
+
|
148
|
+
@property
|
149
|
+
def timeout(self) -> int:
|
150
|
+
# Timeout should not be changed after the cache is created
|
151
|
+
# because the linked list will not be updated accordingly.
|
152
|
+
return self._timeout
|
153
|
+
|
154
|
+
def __setitem__(self, key, value, cache_setitem=Cache.__setitem__):
|
155
|
+
"""Set the item in the cache, and also in the linked list if it is a new key"""
|
156
|
+
with self.timer as time:
|
157
|
+
cache_setitem(self, key, value)
|
158
|
+
|
159
|
+
if key not in self._links:
|
160
|
+
# Add the new item to the tail of the linked list
|
161
|
+
# Inspired by https://github.com/tkem/cachetools/blob/d44c98407030d2e91cbe82c3997be042d9c2f0de/src/cachetools/__init__.py#L432
|
162
|
+
tail = self._root.prev
|
163
|
+
link = TTLCache._Link(key)
|
164
|
+
link.expires = time + self._timeout
|
165
|
+
link.next = self._root
|
166
|
+
link.prev = tail
|
167
|
+
tail.next = link
|
168
|
+
self._root.prev = link
|
169
|
+
self._links[key] = link
|
170
|
+
|
171
|
+
def __delitem__(self, key, cache_delitem=Cache.__delitem__):
|
172
|
+
"""Delete the item from the cache and the linked list."""
|
173
|
+
cache_delitem(self, key)
|
174
|
+
link = self._links.pop(key)
|
175
|
+
link.unlink()
|
176
|
+
|
177
|
+
def _start_expire_check_loop(self):
|
178
|
+
# Close the daemon thread when the main thread exits
|
179
|
+
atexit.register(self.clear)
|
180
|
+
|
181
|
+
self._expire_checker_thread = threading.Thread(
|
182
|
+
target=self._expire_check_loop, daemon=True, name="TTLCacheExpireLoop"
|
183
|
+
)
|
184
|
+
self._expire_checker_stop_event = threading.Event()
|
185
|
+
self._expire_checker_thread.start()
|
186
|
+
|
187
|
+
def _expire_check_loop(self):
|
188
|
+
while not self._expire_checker_stop_event.is_set():
|
189
|
+
try:
|
190
|
+
self.expire()
|
191
|
+
except Exception as e:
|
192
|
+
_logger.debug(f"Failed to expire traces: {e}")
|
193
|
+
# If an error is raised from the expiration method, stop running the loop.
|
194
|
+
# Otherwise, the expire task might get heavier and heavier due to the
|
195
|
+
# increasing number of expired items.
|
196
|
+
break
|
197
|
+
|
198
|
+
time.sleep(MLFLOW_TRACE_TIMEOUT_CHECK_INTERVAL_SECONDS.get())
|
199
|
+
|
200
|
+
def expire(self, time=None):
|
201
|
+
"""
|
202
|
+
Trigger the expiration of traces that have exceeded the timeout.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
time: Unused. Only for compatibility with the parent class.
|
206
|
+
"""
|
207
|
+
expired = self._get_expired_traces()
|
208
|
+
|
209
|
+
# End the expired traces and set the status to ERROR in background thread
|
210
|
+
for request_id in expired:
|
211
|
+
trace = self[request_id]
|
212
|
+
if root_span := trace.get_root_span():
|
213
|
+
try:
|
214
|
+
root_span.set_status(SpanStatusCode.ERROR)
|
215
|
+
msg = _TRACE_EXPIRATION_MSG.format(request_id=request_id, ttl=self._timeout)
|
216
|
+
exception_event = SpanEvent.from_exception(MlflowTracingException(msg))
|
217
|
+
root_span.add_event(exception_event)
|
218
|
+
root_span.end() # Calling end() triggers span export
|
219
|
+
_logger.info(msg + " You can find the aborted trace in the MLflow UI.")
|
220
|
+
except Exception as e:
|
221
|
+
_logger.debug(f"Failed to export an expired trace {request_id}: {e}")
|
222
|
+
|
223
|
+
# NB: root_span.end() should pop the trace from the cache. But we need to
|
224
|
+
# double-check it because it may not happens due to some errors.
|
225
|
+
if request_id in self:
|
226
|
+
del self[request_id]
|
227
|
+
|
228
|
+
def _get_expired_traces(self) -> list[str]:
|
229
|
+
"""
|
230
|
+
Find all expired traces and return their request IDs.
|
231
|
+
|
232
|
+
The linked list is ordered by expiration time, so we can traverse the list from the head
|
233
|
+
and return early whenever we find a trace that has not expired yet.
|
234
|
+
"""
|
235
|
+
time = self.timer()
|
236
|
+
curr = self._root.next
|
237
|
+
|
238
|
+
if curr.expires and time < curr.expires:
|
239
|
+
return []
|
240
|
+
|
241
|
+
expired = []
|
242
|
+
while curr is not self._root and not (time < curr.expires):
|
243
|
+
expired.append(curr.key)
|
244
|
+
curr = curr.next
|
245
|
+
return expired
|
246
|
+
|
247
|
+
def clear(self):
|
248
|
+
super().clear()
|
249
|
+
self._expire_checker_stop_event.set()
|
250
|
+
self._expire_checker_thread.join()
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import contextvars
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Optional
|
4
|
+
|
5
|
+
from mlflow.entities import LiveSpan
|
6
|
+
|
7
|
+
|
8
|
+
@dataclass
|
9
|
+
class SpanWithToken:
|
10
|
+
"""
|
11
|
+
A utility container to hold an MLflow span and its corresponding OpenTelemetry token.
|
12
|
+
|
13
|
+
The token is a special object that is generated when setting a span as active within
|
14
|
+
the Open Telemetry span context. This token is required when inactivate the span i.e.
|
15
|
+
detaching the span from the context.
|
16
|
+
"""
|
17
|
+
|
18
|
+
span: LiveSpan
|
19
|
+
token: Optional[contextvars.Token] = None
|
@@ -0,0 +1,124 @@
|
|
1
|
+
import json
|
2
|
+
from functools import lru_cache
|
3
|
+
from typing import Any, Optional
|
4
|
+
|
5
|
+
from mlflow.entities.trace_data import TraceData
|
6
|
+
from mlflow.entities.trace_info import TraceInfo
|
7
|
+
from mlflow.tracing.constant import (
|
8
|
+
TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_DBX,
|
9
|
+
TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_OSS,
|
10
|
+
)
|
11
|
+
from mlflow.tracking._tracking_service.utils import get_tracking_uri
|
12
|
+
from mlflow.utils.uri import is_databricks_uri
|
13
|
+
|
14
|
+
|
15
|
+
def set_request_response_preview(trace_info: TraceInfo, trace_data: TraceData) -> None:
|
16
|
+
"""
|
17
|
+
Set the request and response previews for the trace info.
|
18
|
+
"""
|
19
|
+
# If request/response preview is already set by users via `mlflow.update_current_trace`,
|
20
|
+
# we don't override it with the truncated version.
|
21
|
+
if trace_info.request_preview is None:
|
22
|
+
trace_info.request_preview = _get_truncated_preview(trace_data.request, role="user")
|
23
|
+
if trace_info.response_preview is None:
|
24
|
+
trace_info.response_preview = _get_truncated_preview(trace_data.response, role="assistant")
|
25
|
+
|
26
|
+
|
27
|
+
def _get_truncated_preview(request_or_response: Optional[str], role: str) -> str:
|
28
|
+
"""
|
29
|
+
Truncate the request preview to fit the max length.
|
30
|
+
"""
|
31
|
+
if request_or_response is None:
|
32
|
+
return ""
|
33
|
+
|
34
|
+
max_length = _get_max_length()
|
35
|
+
|
36
|
+
if len(request_or_response) <= max_length:
|
37
|
+
return request_or_response
|
38
|
+
|
39
|
+
content = None
|
40
|
+
|
41
|
+
# Parse JSON serialized request/response
|
42
|
+
try:
|
43
|
+
obj = json.loads(request_or_response)
|
44
|
+
except json.JSONDecodeError:
|
45
|
+
obj = None
|
46
|
+
|
47
|
+
if messages := _try_extract_messages(obj):
|
48
|
+
msg = _get_last_message(messages, role=role)
|
49
|
+
content = _get_text_content_from_message(msg)
|
50
|
+
|
51
|
+
content = content or request_or_response
|
52
|
+
|
53
|
+
if len(content) <= max_length:
|
54
|
+
return content
|
55
|
+
|
56
|
+
return content[: max_length - 3] + "..."
|
57
|
+
|
58
|
+
|
59
|
+
@lru_cache(maxsize=1)
|
60
|
+
def _get_max_length() -> int:
|
61
|
+
tracking_uri = get_tracking_uri()
|
62
|
+
return (
|
63
|
+
TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_DBX
|
64
|
+
if is_databricks_uri(tracking_uri)
|
65
|
+
else TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_OSS
|
66
|
+
)
|
67
|
+
|
68
|
+
|
69
|
+
def _try_extract_messages(obj: dict[str, Any]) -> Optional[list[dict[str, Any]]]:
|
70
|
+
if not isinstance(obj, dict):
|
71
|
+
return None
|
72
|
+
|
73
|
+
# Check if the object contains messages with OpenAI ChatCompletion format
|
74
|
+
if messages := obj.get("messages"):
|
75
|
+
return [item for item in messages if _is_message(item)]
|
76
|
+
|
77
|
+
# Check if the object contains a message in OpenAI ChatCompletion response format (choices)
|
78
|
+
if (choices := obj.get("choices")) and len(choices) > 0:
|
79
|
+
return [choices[0].get("message")]
|
80
|
+
|
81
|
+
# Check if the object contains a message in OpenAI Responses API request format
|
82
|
+
if (input := obj.get("input")) and isinstance(input, list):
|
83
|
+
return [item for item in input if _is_message(item)]
|
84
|
+
|
85
|
+
# Check if the object contains a message in OpenAI Responses API response format
|
86
|
+
if (output := obj.get("output")) and isinstance(output, list):
|
87
|
+
return [item for item in output if _is_message(item)]
|
88
|
+
|
89
|
+
# Handle ResponsesAgent input, which contains OpenAI Responses request in 'request' key
|
90
|
+
if "request" in obj:
|
91
|
+
return _try_extract_messages(obj["request"])
|
92
|
+
|
93
|
+
return None
|
94
|
+
|
95
|
+
|
96
|
+
def _is_message(item: Any) -> bool:
|
97
|
+
if not isinstance(item, dict):
|
98
|
+
return False
|
99
|
+
return "role" in item and "content" in item
|
100
|
+
|
101
|
+
|
102
|
+
def _get_last_message(messages: list[dict[str, Any]], role: str) -> Optional[dict[str, Any]]:
|
103
|
+
"""
|
104
|
+
Return last message with the given role.
|
105
|
+
If the messages don't include a message with the given role, return the last one.
|
106
|
+
"""
|
107
|
+
for message in reversed(messages):
|
108
|
+
if message.get("role") == role:
|
109
|
+
return message
|
110
|
+
return messages[-1]
|
111
|
+
|
112
|
+
|
113
|
+
def _get_text_content_from_message(message: dict[str, Any]) -> str:
|
114
|
+
content = message.get("content")
|
115
|
+
if isinstance(content, list):
|
116
|
+
# content is a list of content parts
|
117
|
+
for part in content:
|
118
|
+
if isinstance(part, str):
|
119
|
+
return part
|
120
|
+
elif isinstance(part, dict) and part.get("type") in ["text", "output_text"]:
|
121
|
+
return part.get("text")
|
122
|
+
elif isinstance(content, str):
|
123
|
+
return content
|
124
|
+
return ""
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import functools
|
2
|
+
import importlib
|
3
|
+
import logging
|
4
|
+
import warnings
|
5
|
+
from typing import Optional
|
6
|
+
|
7
|
+
_logger = logging.getLogger(__name__)
|
8
|
+
|
9
|
+
|
10
|
+
class LogDemotionFilter(logging.Filter):
|
11
|
+
def __init__(self, module: str, message: str):
|
12
|
+
super().__init__()
|
13
|
+
self.module = module
|
14
|
+
self.message = message
|
15
|
+
|
16
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
17
|
+
if record.name == self.module and self.message in record.getMessage():
|
18
|
+
record.levelno = logging.DEBUG # Change the log level to DEBUG
|
19
|
+
record.levelname = "DEBUG"
|
20
|
+
|
21
|
+
# Check the log level for the logger is debug or not
|
22
|
+
logger = logging.getLogger(self.module)
|
23
|
+
return logger.isEnabledFor(logging.DEBUG)
|
24
|
+
return True
|
25
|
+
|
26
|
+
def __eq__(self, other):
|
27
|
+
if isinstance(other, LogDemotionFilter):
|
28
|
+
return self.module == other.module and self.message == other.message
|
29
|
+
return False
|
30
|
+
|
31
|
+
|
32
|
+
def suppress_warning(module: str, message: str):
|
33
|
+
"""
|
34
|
+
Convert the "Failed to detach context" log raised by the OpenTelemetry logger to DEBUG
|
35
|
+
level so that it does not show up in the user's console.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
module: The module name of the logger that raises the warning.
|
39
|
+
message: The (part of) message in the log that needs to be demoted to DEBUG level
|
40
|
+
"""
|
41
|
+
try:
|
42
|
+
logger = getattr(importlib.import_module(module), "logger", None)
|
43
|
+
log_filter = LogDemotionFilter(module, message)
|
44
|
+
if logger and not any(f == log_filter for f in logger.filters):
|
45
|
+
logger.addFilter(log_filter)
|
46
|
+
except Exception as e:
|
47
|
+
_logger.debug(f"Failed to suppress the warning for {module}", exc_info=e)
|
48
|
+
raise
|
49
|
+
|
50
|
+
|
51
|
+
def request_id_backward_compatible(func):
|
52
|
+
"""
|
53
|
+
A decorator to support backward compatibility for the `request_id` parameter,
|
54
|
+
which is deprecated and replaced by the `trace_id` parameter in tracing APIs.
|
55
|
+
|
56
|
+
This decorator will adds `request_id` to the function signature and issue
|
57
|
+
a deprecation warning if `request_id` is used with non-null value.
|
58
|
+
"""
|
59
|
+
|
60
|
+
@functools.wraps(func)
|
61
|
+
def wrapper(*args, request_id: Optional[str] = None, **kwargs):
|
62
|
+
if request_id is not None:
|
63
|
+
warnings.warn(
|
64
|
+
f"The request_id parameter is deprecated from the {func.__name__} API "
|
65
|
+
"and will be removed in a future version. Please use the `trace_id` "
|
66
|
+
"parameter instead.",
|
67
|
+
category=DeprecationWarning,
|
68
|
+
stacklevel=2,
|
69
|
+
)
|
70
|
+
|
71
|
+
if kwargs.get("trace_id") is None:
|
72
|
+
kwargs["trace_id"] = request_id
|
73
|
+
|
74
|
+
return func(*args, **kwargs)
|
75
|
+
|
76
|
+
return wrapper
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"""
|
2
|
+
The ``mlflow.tracking`` module provides a Python CRUD interface to MLflow experiments
|
3
|
+
and runs. This is a lower level API that directly translates to MLflow
|
4
|
+
`REST API <../rest-api.html>`_ calls.
|
5
|
+
For a higher level API for managing an "active run", use the :py:mod:`mlflow` module.
|
6
|
+
"""
|
7
|
+
|
8
|
+
# Minimum APIs required for core tracing functionality of mlflow-tracing package.
|
9
|
+
from mlflow.tracking._tracking_service.utils import (
|
10
|
+
_get_artifact_repo,
|
11
|
+
_get_store,
|
12
|
+
get_tracking_uri,
|
13
|
+
is_tracking_uri_set,
|
14
|
+
set_tracking_uri,
|
15
|
+
)
|
16
|
+
from mlflow.version import IS_TRACING_SDK_ONLY
|
17
|
+
|
18
|
+
__all__ = [
|
19
|
+
"get_tracking_uri",
|
20
|
+
"set_tracking_uri",
|
21
|
+
"is_tracking_uri_set",
|
22
|
+
"_get_artifact_repo",
|
23
|
+
"_get_store",
|
24
|
+
]
|
25
|
+
|
26
|
+
# Importing the following APIs only if mlflow or mlflow-skinny is installed.
|
27
|
+
if not IS_TRACING_SDK_ONLY:
|
28
|
+
from mlflow.tracking._model_registry.utils import (
|
29
|
+
get_registry_uri,
|
30
|
+
set_registry_uri,
|
31
|
+
)
|
32
|
+
from mlflow.tracking._tracking_service.utils import _get_artifact_repo
|
33
|
+
from mlflow.tracking.client import MlflowClient
|
34
|
+
|
35
|
+
__all__ += [
|
36
|
+
"get_registry_uri",
|
37
|
+
"set_registry_uri",
|
38
|
+
"MlflowClient",
|
39
|
+
]
|
@@ -0,0 +1 @@
|
|
1
|
+
DEFAULT_AWAIT_MAX_SLEEP_SECONDS = 5 * 60
|