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,55 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
from functools import lru_cache
|
4
|
+
|
5
|
+
from mlflow.tracking.context.git_context import GitRunContext
|
6
|
+
from mlflow.tracking.context.registry import resolve_tags
|
7
|
+
from mlflow.utils.databricks_utils import is_in_databricks_notebook
|
8
|
+
from mlflow.utils.git_utils import get_git_branch, get_git_commit, get_git_repo_url
|
9
|
+
from mlflow.utils.mlflow_tags import (
|
10
|
+
MLFLOW_GIT_BRANCH,
|
11
|
+
MLFLOW_GIT_COMMIT,
|
12
|
+
MLFLOW_GIT_REPO_URL,
|
13
|
+
TRACE_RESOLVE_TAGS_ALLOWLIST,
|
14
|
+
)
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
@lru_cache(maxsize=1)
|
20
|
+
def resolve_env_metadata():
|
21
|
+
"""
|
22
|
+
Resolve common environment metadata to be saved in the trace info. These should not
|
23
|
+
# change over time, so we resolve them only once. These will be stored in trace
|
24
|
+
# metadata rather than tags, because they are immutable.
|
25
|
+
"""
|
26
|
+
# GitRunContext does not property work in notebook because _get_main_file()
|
27
|
+
# points to the kernel launcher file, not the actual notebook file.
|
28
|
+
metadata = resolve_tags(ignore=[GitRunContext])
|
29
|
+
if not is_in_databricks_notebook():
|
30
|
+
# Get Git metadata for the script or notebook. If the notebook is in a
|
31
|
+
# Databricks managed Git repo, DatabricksRepoRunContext the metadata
|
32
|
+
# so we don't need to run this logic.
|
33
|
+
metadata.update(_resolve_git_metadata())
|
34
|
+
|
35
|
+
return {key: value for key, value in metadata.items() if key in TRACE_RESOLVE_TAGS_ALLOWLIST}
|
36
|
+
|
37
|
+
|
38
|
+
def _resolve_git_metadata():
|
39
|
+
try:
|
40
|
+
import git # noqa: F401
|
41
|
+
except ImportError:
|
42
|
+
_logger.debug("Git python package is not installed. Skipping git metadata resolution.")
|
43
|
+
return {}
|
44
|
+
|
45
|
+
try:
|
46
|
+
repo = os.getcwd()
|
47
|
+
return {
|
48
|
+
MLFLOW_GIT_COMMIT: get_git_commit(repo) or "",
|
49
|
+
MLFLOW_GIT_REPO_URL: get_git_repo_url(repo) or "",
|
50
|
+
MLFLOW_GIT_BRANCH: get_git_branch(repo) or "",
|
51
|
+
}
|
52
|
+
except Exception:
|
53
|
+
_logger.debug("Failed to resolve git metadata", exc_info=True)
|
54
|
+
|
55
|
+
return {}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import functools
|
2
|
+
|
3
|
+
from mlflow.exceptions import MlflowTracingException
|
4
|
+
|
5
|
+
|
6
|
+
def raise_as_trace_exception(f):
|
7
|
+
"""
|
8
|
+
A decorator to make sure that the decorated function only raises MlflowTracingException.
|
9
|
+
|
10
|
+
Any exceptions are caught and translated to MlflowTracingException before exiting the function.
|
11
|
+
This is helpful for upstream functions to handle tracing related exceptions properly.
|
12
|
+
"""
|
13
|
+
|
14
|
+
@functools.wraps(f)
|
15
|
+
def wrapper(*args, **kwargs):
|
16
|
+
try:
|
17
|
+
return f(*args, **kwargs)
|
18
|
+
except Exception as e:
|
19
|
+
raise MlflowTracingException(e) from e
|
20
|
+
|
21
|
+
return wrapper
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Customized from https://github.com/open-telemetry/opentelemetry-python/blob/754fc36a408dd45e86d4a0f820f84e692f14b4c1/opentelemetry-api/src/opentelemetry/util/_once.py
|
2
|
+
from threading import Lock
|
3
|
+
from typing import Callable
|
4
|
+
|
5
|
+
|
6
|
+
class Once:
|
7
|
+
"""Execute a function exactly once and block all callers until the function returns"""
|
8
|
+
|
9
|
+
def __init__(self) -> None:
|
10
|
+
self.__lock = Lock()
|
11
|
+
self.__done = False
|
12
|
+
|
13
|
+
@property
|
14
|
+
def done(self):
|
15
|
+
with self.__lock:
|
16
|
+
return self.__done
|
17
|
+
|
18
|
+
@done.setter
|
19
|
+
def done(self, value):
|
20
|
+
with self.__lock:
|
21
|
+
self.__done = value
|
22
|
+
|
23
|
+
def do_once(self, func: Callable[[], None]):
|
24
|
+
"""
|
25
|
+
Execute ``func`` if it hasn't been executed or return.
|
26
|
+
Will block until ``func`` has been called by one thread.
|
27
|
+
"""
|
28
|
+
if self.__done:
|
29
|
+
return
|
30
|
+
|
31
|
+
with self.__lock:
|
32
|
+
if not self.__done:
|
33
|
+
func()
|
34
|
+
self.__done = True
|
35
|
+
return
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import os
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from opentelemetry.sdk.trace.export import SpanExporter
|
5
|
+
|
6
|
+
from mlflow.exceptions import MlflowException
|
7
|
+
from mlflow.protos.databricks_pb2 import RESOURCE_DOES_NOT_EXIST
|
8
|
+
|
9
|
+
|
10
|
+
def should_use_otlp_exporter() -> bool:
|
11
|
+
return _get_otlp_endpoint() is not None
|
12
|
+
|
13
|
+
|
14
|
+
def get_otlp_exporter() -> SpanExporter:
|
15
|
+
"""
|
16
|
+
Get the OTLP exporter based on the configured protocol.
|
17
|
+
"""
|
18
|
+
endpoint = _get_otlp_endpoint()
|
19
|
+
protocol = _get_otlp_protocol()
|
20
|
+
if protocol == "grpc":
|
21
|
+
try:
|
22
|
+
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
|
23
|
+
except ImportError:
|
24
|
+
raise MlflowException(
|
25
|
+
"gRPC OTLP exporter is not available. Please install the required dependency by "
|
26
|
+
"running `pip install opentelemetry-exporter-otlp-proto-grpc`.",
|
27
|
+
error_code=RESOURCE_DOES_NOT_EXIST,
|
28
|
+
)
|
29
|
+
|
30
|
+
return OTLPSpanExporter(endpoint=endpoint)
|
31
|
+
elif protocol == "http/protobuf":
|
32
|
+
try:
|
33
|
+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
34
|
+
except ImportError as e:
|
35
|
+
raise MlflowException(
|
36
|
+
"HTTP OTLP exporter is not available. Please install the required dependency by "
|
37
|
+
"running `pip install opentelemetry-exporter-otlp-proto-http`.",
|
38
|
+
error_code=RESOURCE_DOES_NOT_EXIST,
|
39
|
+
) from e
|
40
|
+
|
41
|
+
return OTLPSpanExporter(endpoint=endpoint)
|
42
|
+
else:
|
43
|
+
raise MlflowException.invalid_parameter_value(
|
44
|
+
f"Unsupported OTLP protocol '{protocol}' is configured. Please set "
|
45
|
+
"the protocol to either 'grpc' or 'http/protobuf'."
|
46
|
+
)
|
47
|
+
|
48
|
+
|
49
|
+
def _get_otlp_endpoint() -> Optional[str]:
|
50
|
+
"""
|
51
|
+
Get the OTLP endpoint from the environment variables.
|
52
|
+
Ref: https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/#endpoint-configuration
|
53
|
+
"""
|
54
|
+
# Use `or` instead of default value to do lazy eval
|
55
|
+
return os.environ.get("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT") or os.environ.get(
|
56
|
+
"OTEL_EXPORTER_OTLP_ENDPOINT"
|
57
|
+
)
|
58
|
+
|
59
|
+
|
60
|
+
def _get_otlp_protocol() -> str:
|
61
|
+
return os.environ.get("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL") or os.environ.get(
|
62
|
+
"OTEL_EXPORTER_OTLP_PROTOCOL", "grpc"
|
63
|
+
)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from mlflow.exceptions import MlflowException
|
4
|
+
|
5
|
+
_logger = logging.getLogger(__name__)
|
6
|
+
|
7
|
+
|
8
|
+
def apply_span_processors(span):
|
9
|
+
"""Apply configured span processors sequentially to the span."""
|
10
|
+
from mlflow.tracing.config import get_config
|
11
|
+
|
12
|
+
config = get_config()
|
13
|
+
if not config.span_processors:
|
14
|
+
return
|
15
|
+
|
16
|
+
non_null_return_processors = []
|
17
|
+
for processor in config.span_processors:
|
18
|
+
try:
|
19
|
+
result = processor(span)
|
20
|
+
if result is not None:
|
21
|
+
non_null_return_processors.append(processor.__name__)
|
22
|
+
except Exception as e:
|
23
|
+
_logger.warning(
|
24
|
+
f"Span processor {processor.__name__} failed: {e}",
|
25
|
+
exc_info=_logger.isEnabledFor(logging.DEBUG),
|
26
|
+
)
|
27
|
+
|
28
|
+
if non_null_return_processors:
|
29
|
+
_logger.warning(
|
30
|
+
f"Span processors {non_null_return_processors} returned a non-null value, "
|
31
|
+
"but it will be ignored. Span processors should not return a value."
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
def validate_span_processors(span_processors):
|
36
|
+
"""Validate that the span processor is a valid function."""
|
37
|
+
span_processors = span_processors or []
|
38
|
+
|
39
|
+
for span_processor in span_processors:
|
40
|
+
if not callable(span_processor):
|
41
|
+
raise MlflowException.invalid_parameter_value(
|
42
|
+
"Span processor must be a callable function."
|
43
|
+
)
|
44
|
+
|
45
|
+
# Skip validation for builtin functions and partial functions that don't have __code__
|
46
|
+
if not hasattr(span_processor, "__code__"):
|
47
|
+
continue
|
48
|
+
|
49
|
+
if span_processor.__code__.co_argcount != 1:
|
50
|
+
raise MlflowException.invalid_parameter_value(
|
51
|
+
"Span processor must take exactly one argument that accepts a LiveSpan object."
|
52
|
+
)
|
53
|
+
|
54
|
+
return span_processors
|
@@ -0,0 +1,292 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections import defaultdict
|
4
|
+
from typing import TYPE_CHECKING, Any, Literal, NamedTuple, Optional, Union
|
5
|
+
|
6
|
+
from mlflow.exceptions import MlflowException
|
7
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
8
|
+
|
9
|
+
SPANS_COLUMN_NAME = "spans"
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
import pandas
|
13
|
+
|
14
|
+
import mlflow.entities
|
15
|
+
from mlflow.entities import Trace
|
16
|
+
|
17
|
+
|
18
|
+
def traces_to_df(traces: list[Trace]) -> "pandas.DataFrame":
|
19
|
+
"""
|
20
|
+
Convert a list of MLflow Traces to a pandas DataFrame with one column called "traces"
|
21
|
+
containing string representations of each Trace.
|
22
|
+
"""
|
23
|
+
import pandas as pd
|
24
|
+
|
25
|
+
from mlflow.entities.trace import Trace # import here to avoid circular import
|
26
|
+
|
27
|
+
rows = [trace.to_pandas_dataframe_row() for trace in traces]
|
28
|
+
return pd.DataFrame.from_records(data=rows, columns=Trace.pandas_dataframe_columns())
|
29
|
+
|
30
|
+
|
31
|
+
def extract_span_inputs_outputs(
|
32
|
+
traces: Union[list["mlflow.entities.Trace"], "pandas.DataFrame"],
|
33
|
+
fields: list[str],
|
34
|
+
col_name: Optional[str] = None,
|
35
|
+
) -> "pandas.DataFrame":
|
36
|
+
"""
|
37
|
+
Extracts the specified input and output fields from the spans contained in the specified traces.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
traces: A list of :py:class:`mlflow.entities.Trace` or a pandas DataFrame containing traces.
|
41
|
+
fields: A list of field strings of the form 'span_name.[inputs|outputs]' or
|
42
|
+
'span_name.[inputs|outputs].field_name'.
|
43
|
+
col_name: The name of the column in the traces DataFrame containing the spans. If `traces`
|
44
|
+
is a list of MLflow Traces, this argument should not be provided.
|
45
|
+
"""
|
46
|
+
try:
|
47
|
+
import pandas as pd
|
48
|
+
except ImportError as e:
|
49
|
+
raise MlflowException(
|
50
|
+
message=(
|
51
|
+
"The `pandas` library is not installed. Please install `pandas` to use the"
|
52
|
+
f"`mlflow.tracing.extract` function. Error: {e}"
|
53
|
+
),
|
54
|
+
)
|
55
|
+
|
56
|
+
parsed_fields = _parse_fields(fields)
|
57
|
+
|
58
|
+
if isinstance(traces, list):
|
59
|
+
if col_name is not None:
|
60
|
+
raise MlflowException(
|
61
|
+
message=(
|
62
|
+
"If `traces` is a list of MLflow Traces, `col_name` should not be provided."
|
63
|
+
),
|
64
|
+
error_code=INVALID_PARAMETER_VALUE,
|
65
|
+
)
|
66
|
+
traces = traces_to_df(traces)
|
67
|
+
col_name = SPANS_COLUMN_NAME
|
68
|
+
|
69
|
+
if isinstance(traces, pd.DataFrame):
|
70
|
+
return _extract_from_traces_pandas_df(df=traces, col_name=col_name, fields=parsed_fields)
|
71
|
+
|
72
|
+
raise MlflowException(
|
73
|
+
message=(
|
74
|
+
"`traces` must be a list of MLflow Traces or a pandas DataFrame. Got: {type(traces)}"
|
75
|
+
),
|
76
|
+
error_code=INVALID_PARAMETER_VALUE,
|
77
|
+
)
|
78
|
+
|
79
|
+
|
80
|
+
class _PeekableIterator:
|
81
|
+
"""
|
82
|
+
Wraps an iterator and allows peeking at the next element without consuming it.
|
83
|
+
"""
|
84
|
+
|
85
|
+
def __init__(self, it):
|
86
|
+
self.it = iter(it)
|
87
|
+
self._next = None
|
88
|
+
|
89
|
+
def __iter__(self):
|
90
|
+
return self
|
91
|
+
|
92
|
+
def __next__(self):
|
93
|
+
if self._next is not None:
|
94
|
+
next_value = self._next
|
95
|
+
self._next = None
|
96
|
+
return next_value
|
97
|
+
return next(self.it)
|
98
|
+
|
99
|
+
def peek(self):
|
100
|
+
if self._next is None:
|
101
|
+
try:
|
102
|
+
self._next = next(self.it)
|
103
|
+
except StopIteration:
|
104
|
+
return None
|
105
|
+
return self._next
|
106
|
+
|
107
|
+
|
108
|
+
class _ParsedField(NamedTuple):
|
109
|
+
"""
|
110
|
+
Represents a parsed field from a string of the form 'span_name.[inputs|outputs]' or
|
111
|
+
'span_name.[inputs|outputs].field_name'.
|
112
|
+
"""
|
113
|
+
|
114
|
+
span_name: str
|
115
|
+
field_type: Literal["inputs", "outputs"]
|
116
|
+
field_name: Optional[str]
|
117
|
+
|
118
|
+
def __str__(self) -> str:
|
119
|
+
return (
|
120
|
+
f"{self.span_name}.{self.field_type}.{self.field_name}"
|
121
|
+
if self.field_name is not None
|
122
|
+
else f"{self.span_name}.{self.field_type}"
|
123
|
+
)
|
124
|
+
|
125
|
+
|
126
|
+
_BACKTICK = "`"
|
127
|
+
|
128
|
+
|
129
|
+
class _FieldParser:
|
130
|
+
def __init__(self, field: str) -> None:
|
131
|
+
self.field = field
|
132
|
+
self.chars = _PeekableIterator(field)
|
133
|
+
|
134
|
+
def peek(self) -> str:
|
135
|
+
return self.chars.peek()
|
136
|
+
|
137
|
+
def next(self) -> str:
|
138
|
+
return next(self.chars)
|
139
|
+
|
140
|
+
def has_next(self) -> bool:
|
141
|
+
return self.peek() is not None
|
142
|
+
|
143
|
+
def consume_until_char_or_end(self, stop_char: Optional[str] = None) -> str:
|
144
|
+
"""
|
145
|
+
Consume characters until the specified character is encountered or the end of the
|
146
|
+
string. If char is None, consume until the end of the string.
|
147
|
+
"""
|
148
|
+
consumed = ""
|
149
|
+
while (c := self.peek()) and c != stop_char:
|
150
|
+
consumed += self.next()
|
151
|
+
return consumed
|
152
|
+
|
153
|
+
def _parse_span_name(self) -> str:
|
154
|
+
if self.peek() == _BACKTICK:
|
155
|
+
self.next()
|
156
|
+
span_name = self.consume_until_char_or_end(_BACKTICK)
|
157
|
+
if self.peek() != _BACKTICK:
|
158
|
+
raise MlflowException.invalid_parameter_value(
|
159
|
+
f"Expected closing backtick: {self.field!r}"
|
160
|
+
)
|
161
|
+
self.next()
|
162
|
+
else:
|
163
|
+
span_name = self.consume_until_char_or_end(".")
|
164
|
+
|
165
|
+
if self.peek() != ".":
|
166
|
+
raise MlflowException.invalid_parameter_value(
|
167
|
+
f"Expected dot after span name: {self.field!r}"
|
168
|
+
)
|
169
|
+
self.next()
|
170
|
+
return span_name
|
171
|
+
|
172
|
+
def _parse_field_type(self) -> str:
|
173
|
+
field_type = self.consume_until_char_or_end(".")
|
174
|
+
if field_type not in ("inputs", "outputs"):
|
175
|
+
raise MlflowException.invalid_parameter_value(
|
176
|
+
f"Invalid field type: {field_type!r}. Expected 'inputs' or 'outputs'."
|
177
|
+
)
|
178
|
+
|
179
|
+
if self.has_next():
|
180
|
+
self.next() # Consume the dot
|
181
|
+
return field_type
|
182
|
+
|
183
|
+
def _parse_field_name(self) -> str:
|
184
|
+
if self.peek() == _BACKTICK:
|
185
|
+
self.next()
|
186
|
+
field_name = self.consume_until_char_or_end(_BACKTICK)
|
187
|
+
if self.peek() != _BACKTICK:
|
188
|
+
raise MlflowException.invalid_parameter_value(
|
189
|
+
f"Expected closing backtick: {self.field!r}"
|
190
|
+
)
|
191
|
+
self.next()
|
192
|
+
|
193
|
+
# There should be no more characters after the closing backtick
|
194
|
+
if self.has_next():
|
195
|
+
raise MlflowException.invalid_parameter_value(
|
196
|
+
f"Unexpected characters after closing backtick: {self.field!r}"
|
197
|
+
)
|
198
|
+
|
199
|
+
else:
|
200
|
+
field_name = self.consume_until_char_or_end()
|
201
|
+
|
202
|
+
return field_name
|
203
|
+
|
204
|
+
def parse(self) -> _ParsedField:
|
205
|
+
span_name = self._parse_span_name()
|
206
|
+
field_type = self._parse_field_type()
|
207
|
+
field_name = self._parse_field_name() if self.has_next() else None
|
208
|
+
return _ParsedField(span_name=span_name, field_type=field_type, field_name=field_name)
|
209
|
+
|
210
|
+
|
211
|
+
def _parse_fields(fields: list[str]) -> list[_ParsedField]:
|
212
|
+
"""
|
213
|
+
Parses the specified field strings of the form 'span_name.[inputs|outputs]' or
|
214
|
+
'span_name.[inputs|outputs].field_name' into _ParsedField objects.
|
215
|
+
"""
|
216
|
+
return [_FieldParser(field).parse() for field in fields]
|
217
|
+
|
218
|
+
|
219
|
+
def _extract_from_traces_pandas_df(
|
220
|
+
df: "pandas.DataFrame", col_name: str, fields: list[_ParsedField]
|
221
|
+
) -> "pandas.DataFrame":
|
222
|
+
"""
|
223
|
+
Extracts the specified fields from the spans contained in the specified column of the
|
224
|
+
specified traces DataFrame.
|
225
|
+
"""
|
226
|
+
|
227
|
+
from mlflow.entities import Span
|
228
|
+
|
229
|
+
if col_name not in df.columns:
|
230
|
+
raise MlflowException(
|
231
|
+
message=(
|
232
|
+
f"Column '{col_name}' not found in traces DataFrame."
|
233
|
+
f" Available columns: {df.columns}"
|
234
|
+
),
|
235
|
+
error_code=INVALID_PARAMETER_VALUE,
|
236
|
+
)
|
237
|
+
|
238
|
+
new_columns: dict[str, list[Any]] = defaultdict(list)
|
239
|
+
for _, row in df.iterrows():
|
240
|
+
spans_dict: dict[str, list[Span]] = defaultdict(list)
|
241
|
+
for span in _extract_spans_from_row(row[col_name]):
|
242
|
+
spans_dict[span.name].append(span)
|
243
|
+
|
244
|
+
for field in fields:
|
245
|
+
matching_spans = spans_dict.get(field.span_name, [])
|
246
|
+
matching_value = _find_matching_value(field, matching_spans)
|
247
|
+
new_columns[str(field)].append(matching_value)
|
248
|
+
|
249
|
+
df_with_new_fields = df.copy()
|
250
|
+
for field in fields:
|
251
|
+
df_with_new_fields[str(field)] = new_columns[str(field)]
|
252
|
+
|
253
|
+
return df_with_new_fields
|
254
|
+
|
255
|
+
|
256
|
+
def _find_matching_value(field: _ParsedField, spans: list["mlflow.entities.Span"]) -> Optional[Any]:
|
257
|
+
"""
|
258
|
+
Find the value of the field in the list of spans. If the field is not found, return None.
|
259
|
+
"""
|
260
|
+
for span in spans:
|
261
|
+
span_inputs_or_outputs = getattr(span, field.field_type)
|
262
|
+
if (
|
263
|
+
isinstance(span_inputs_or_outputs, dict)
|
264
|
+
and field.field_name is not None
|
265
|
+
and field.field_name in span_inputs_or_outputs
|
266
|
+
):
|
267
|
+
return span_inputs_or_outputs.get(field.field_name)
|
268
|
+
elif field.field_name is None:
|
269
|
+
return span_inputs_or_outputs
|
270
|
+
|
271
|
+
|
272
|
+
def _extract_spans_from_row(
|
273
|
+
row_content: Optional[list[dict[str, Any]]],
|
274
|
+
) -> list["mlflow.entities.Span"]:
|
275
|
+
"""
|
276
|
+
Parses and extracts MLflow Spans from the row content of a traces pandas DataFrame.
|
277
|
+
"""
|
278
|
+
from mlflow.entities import Span
|
279
|
+
|
280
|
+
if row_content is None:
|
281
|
+
return []
|
282
|
+
|
283
|
+
try:
|
284
|
+
return [Span.from_dict(span_dict) for span_dict in row_content]
|
285
|
+
except Exception as e:
|
286
|
+
raise MlflowException(
|
287
|
+
message=(
|
288
|
+
f"Failed to extract spans from traces DataFrame row content: {row_content}."
|
289
|
+
f" Error: {e}"
|
290
|
+
),
|
291
|
+
error_code=INVALID_PARAMETER_VALUE,
|
292
|
+
) from e
|