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,561 @@
|
|
1
|
+
import inspect
|
2
|
+
import json
|
3
|
+
import logging
|
4
|
+
from functools import singledispatchmethod
|
5
|
+
from typing import Any, Generator, Optional, Union
|
6
|
+
|
7
|
+
import llama_index.core
|
8
|
+
import pydantic
|
9
|
+
from llama_index.core.base.agent.types import BaseAgent, BaseAgentWorker, TaskStepOutput
|
10
|
+
from llama_index.core.base.base_retriever import BaseRetriever
|
11
|
+
from llama_index.core.base.embeddings.base import BaseEmbedding
|
12
|
+
from llama_index.core.base.llms.base import BaseLLM
|
13
|
+
from llama_index.core.base.llms.types import ChatResponse, CompletionResponse
|
14
|
+
from llama_index.core.base.response.schema import AsyncStreamingResponse, StreamingResponse
|
15
|
+
from llama_index.core.chat_engine.types import StreamingAgentChatResponse
|
16
|
+
from llama_index.core.instrumentation.event_handlers import BaseEventHandler
|
17
|
+
from llama_index.core.instrumentation.events import BaseEvent
|
18
|
+
from llama_index.core.instrumentation.events.agent import AgentToolCallEvent
|
19
|
+
from llama_index.core.instrumentation.events.embedding import EmbeddingStartEvent
|
20
|
+
from llama_index.core.instrumentation.events.exception import ExceptionEvent
|
21
|
+
from llama_index.core.instrumentation.events.llm import (
|
22
|
+
LLMChatEndEvent,
|
23
|
+
LLMChatStartEvent,
|
24
|
+
LLMCompletionEndEvent,
|
25
|
+
LLMCompletionStartEvent,
|
26
|
+
LLMPredictStartEvent,
|
27
|
+
)
|
28
|
+
from llama_index.core.instrumentation.events.rerank import ReRankStartEvent
|
29
|
+
from llama_index.core.instrumentation.span.base import BaseSpan
|
30
|
+
from llama_index.core.instrumentation.span_handlers import BaseSpanHandler
|
31
|
+
from llama_index.core.multi_modal_llms import MultiModalLLM
|
32
|
+
from llama_index.core.schema import NodeWithScore
|
33
|
+
from llama_index.core.tools import BaseTool
|
34
|
+
from packaging.version import Version
|
35
|
+
|
36
|
+
import mlflow
|
37
|
+
from mlflow.entities import LiveSpan, SpanEvent, SpanType
|
38
|
+
from mlflow.entities.document import Document
|
39
|
+
from mlflow.entities.span_status import SpanStatusCode
|
40
|
+
from mlflow.llama_index.chat import get_chat_messages_from_event
|
41
|
+
from mlflow.tracing.constant import SpanAttributeKey, TokenUsageKey
|
42
|
+
from mlflow.tracing.fluent import start_span_no_context
|
43
|
+
from mlflow.tracing.provider import detach_span_from_context, set_span_in_context
|
44
|
+
from mlflow.tracing.utils import set_span_chat_messages, set_span_chat_tools
|
45
|
+
from mlflow.utils.pydantic_utils import model_dump_compat
|
46
|
+
|
47
|
+
_logger = logging.getLogger(__name__)
|
48
|
+
|
49
|
+
|
50
|
+
def _get_llama_index_version() -> Version:
|
51
|
+
return Version(llama_index.core.__version__)
|
52
|
+
|
53
|
+
|
54
|
+
def set_llama_index_tracer():
|
55
|
+
"""
|
56
|
+
Set the MlflowSpanHandler and MlflowEventHandler to the global dispatcher.
|
57
|
+
If the handlers are already set, skip setting.
|
58
|
+
"""
|
59
|
+
from llama_index.core.instrumentation import get_dispatcher
|
60
|
+
|
61
|
+
dsp = get_dispatcher()
|
62
|
+
span_handler = None
|
63
|
+
for handler in dsp.span_handlers:
|
64
|
+
if isinstance(handler, MlflowSpanHandler):
|
65
|
+
_logger.debug("MlflowSpanHandler is already set to the dispatcher. Skip setting.")
|
66
|
+
span_handler = handler
|
67
|
+
break
|
68
|
+
else:
|
69
|
+
span_handler = MlflowSpanHandler()
|
70
|
+
dsp.add_span_handler(span_handler)
|
71
|
+
|
72
|
+
for handler in dsp.event_handlers:
|
73
|
+
if isinstance(handler, MlflowEventHandler):
|
74
|
+
_logger.debug("MlflowEventHandler is already set to the dispatcher. Skip setting.")
|
75
|
+
break
|
76
|
+
else:
|
77
|
+
dsp.add_event_handler(MlflowEventHandler(span_handler))
|
78
|
+
|
79
|
+
|
80
|
+
def remove_llama_index_tracer():
|
81
|
+
"""
|
82
|
+
Remove the MlflowSpanHandler and MlflowEventHandler from the global dispatcher.
|
83
|
+
"""
|
84
|
+
from llama_index.core.instrumentation import get_dispatcher
|
85
|
+
|
86
|
+
dsp = get_dispatcher()
|
87
|
+
dsp.span_handlers = [h for h in dsp.span_handlers if h.class_name() != "MlflowSpanHandler"]
|
88
|
+
dsp.event_handlers = [h for h in dsp.event_handlers if h.class_name() != "MlflowEventHandler"]
|
89
|
+
|
90
|
+
|
91
|
+
class _LlamaSpan(BaseSpan, extra="allow"):
|
92
|
+
_mlflow_span: LiveSpan = pydantic.PrivateAttr()
|
93
|
+
|
94
|
+
def __init__(self, id_: str, parent_id: Optional[str], mlflow_span: LiveSpan):
|
95
|
+
super().__init__(id_=id_, parent_id=parent_id)
|
96
|
+
self._mlflow_span = mlflow_span
|
97
|
+
|
98
|
+
|
99
|
+
def _end_span(span: LiveSpan, status=SpanStatusCode.OK, outputs=None, token=None):
|
100
|
+
"""An utility function to end the span or trace."""
|
101
|
+
if isinstance(outputs, (StreamingResponse, AsyncStreamingResponse, StreamingAgentChatResponse)):
|
102
|
+
_logger.warning(
|
103
|
+
"Trying to record streaming response to the MLflow trace. This may consume "
|
104
|
+
"the generator and result in an empty response."
|
105
|
+
)
|
106
|
+
|
107
|
+
# for retriever spans, convert the outputs to Document objects
|
108
|
+
# so they can be rendered in a more user-friendly way in the UI
|
109
|
+
if (
|
110
|
+
span.span_type == SpanType.RETRIEVER
|
111
|
+
and isinstance(outputs, list)
|
112
|
+
and all(isinstance(item, NodeWithScore) for item in outputs)
|
113
|
+
):
|
114
|
+
try:
|
115
|
+
outputs = [Document.from_llama_index_node_with_score(node) for node in outputs]
|
116
|
+
except Exception as e:
|
117
|
+
_logger.debug(
|
118
|
+
f"Failed to convert NodeWithScore to Document objects: {e}", exc_info=True
|
119
|
+
)
|
120
|
+
|
121
|
+
if outputs is None:
|
122
|
+
outputs = span.outputs
|
123
|
+
|
124
|
+
try:
|
125
|
+
span.end(status=status, outputs=outputs)
|
126
|
+
finally:
|
127
|
+
# We should detach span even when end_span / end_trace API call fails
|
128
|
+
if token:
|
129
|
+
detach_span_from_context(token)
|
130
|
+
|
131
|
+
|
132
|
+
class MlflowSpanHandler(BaseSpanHandler[_LlamaSpan], extra="allow"):
|
133
|
+
def __init__(self):
|
134
|
+
super().__init__()
|
135
|
+
self._span_id_to_token = {}
|
136
|
+
self._stream_resolver = StreamResolver()
|
137
|
+
self._pending_spans: dict[str, _LlamaSpan] = {}
|
138
|
+
|
139
|
+
@classmethod
|
140
|
+
def class_name(cls) -> str:
|
141
|
+
return "MlflowSpanHandler"
|
142
|
+
|
143
|
+
def get_span_for_event(self, event: BaseEvent) -> LiveSpan:
|
144
|
+
llama_span = self.open_spans.get(event.span_id) or self._pending_spans.get(event.span_id)
|
145
|
+
return llama_span._mlflow_span if llama_span else None
|
146
|
+
|
147
|
+
def new_span(
|
148
|
+
self,
|
149
|
+
id_: str,
|
150
|
+
bound_args: inspect.BoundArguments,
|
151
|
+
instance: Optional[Any] = None,
|
152
|
+
parent_span_id: Optional[str] = None,
|
153
|
+
**kwargs: Any,
|
154
|
+
) -> _LlamaSpan:
|
155
|
+
with self.lock:
|
156
|
+
parent = self.open_spans.get(parent_span_id) if parent_span_id else None
|
157
|
+
|
158
|
+
parent_span = parent._mlflow_span if parent else mlflow.get_current_active_span()
|
159
|
+
|
160
|
+
try:
|
161
|
+
input_args = bound_args.arguments
|
162
|
+
attributes = self._get_instance_attributes(instance)
|
163
|
+
span_type = self._get_span_type(instance) or SpanType.UNKNOWN
|
164
|
+
span = start_span_no_context(
|
165
|
+
name=id_.partition("-")[0],
|
166
|
+
parent_span=parent_span,
|
167
|
+
span_type=span_type,
|
168
|
+
inputs=input_args,
|
169
|
+
attributes=attributes,
|
170
|
+
)
|
171
|
+
|
172
|
+
token = set_span_in_context(span)
|
173
|
+
self._span_id_to_token[span.span_id] = token
|
174
|
+
|
175
|
+
# NB: The tool definition is passed to LLM via kwargs, but it is not set
|
176
|
+
# to the LLM/Chat start event. Therefore, we need to handle it here.
|
177
|
+
tools = input_args.get("kwargs", {}).get("tools")
|
178
|
+
if tools and span_type in [SpanType.LLM, SpanType.CHAT_MODEL]:
|
179
|
+
try:
|
180
|
+
set_span_chat_tools(span, tools)
|
181
|
+
except Exception as e:
|
182
|
+
_logger.debug(f"Failed to set tools for {span}: {e}")
|
183
|
+
|
184
|
+
return _LlamaSpan(id_=id_, parent_id=parent_span_id, mlflow_span=span)
|
185
|
+
except BaseException as e:
|
186
|
+
_logger.debug(f"Failed to create a new span: {e}", exc_info=True)
|
187
|
+
|
188
|
+
def prepare_to_exit_span(
|
189
|
+
self,
|
190
|
+
id_: str,
|
191
|
+
result: Optional[Any] = None,
|
192
|
+
**kwargs: Any,
|
193
|
+
) -> _LlamaSpan:
|
194
|
+
try:
|
195
|
+
with self.lock:
|
196
|
+
llama_span = self.open_spans.get(id_)
|
197
|
+
if not llama_span:
|
198
|
+
return
|
199
|
+
|
200
|
+
span = llama_span._mlflow_span
|
201
|
+
token = self._span_id_to_token.pop(span.span_id, None)
|
202
|
+
|
203
|
+
if self._stream_resolver.is_streaming_result(result):
|
204
|
+
# If the result is a generator, we keep the span in progress for streaming
|
205
|
+
# and end it when the generator is exhausted.
|
206
|
+
is_pended = self._stream_resolver.register_stream_span(span, result)
|
207
|
+
if is_pended:
|
208
|
+
self._pending_spans[id_] = llama_span
|
209
|
+
# We still need to detach the span from the context, otherwise it will
|
210
|
+
# be considered as "active"
|
211
|
+
detach_span_from_context(token)
|
212
|
+
else:
|
213
|
+
# If the span is not pended successfully, end it immediately
|
214
|
+
_end_span(span=span, outputs=result, token=token)
|
215
|
+
else:
|
216
|
+
_end_span(span=span, outputs=result, token=token)
|
217
|
+
return llama_span
|
218
|
+
except BaseException as e:
|
219
|
+
_logger.debug(f"Failed to end a span: {e}", exc_info=True)
|
220
|
+
|
221
|
+
def resolve_pending_stream_span(self, span: LiveSpan, event: Any):
|
222
|
+
"""End the pending streaming span(s)"""
|
223
|
+
self._stream_resolver.resolve(span, event)
|
224
|
+
self._pending_spans.pop(event.span_id, None)
|
225
|
+
|
226
|
+
def prepare_to_drop_span(self, id_: str, err: Optional[Exception], **kwargs) -> _LlamaSpan:
|
227
|
+
"""Logic for handling errors during the model execution."""
|
228
|
+
with self.lock:
|
229
|
+
llama_span = self.open_spans.get(id_)
|
230
|
+
span = llama_span._mlflow_span
|
231
|
+
token = self._span_id_to_token.pop(span.span_id, None)
|
232
|
+
|
233
|
+
if _get_llama_index_version() >= Version("0.10.59"):
|
234
|
+
# LlamaIndex determines if a workflow is terminated or not by propagating an special
|
235
|
+
# exception WorkflowDone. We should treat this exception as a successful termination.
|
236
|
+
from llama_index.core.workflow.errors import WorkflowDone
|
237
|
+
|
238
|
+
if err and isinstance(err, WorkflowDone):
|
239
|
+
return _end_span(span=span, status=SpanStatusCode.OK, token=token)
|
240
|
+
|
241
|
+
span.add_event(SpanEvent.from_exception(err))
|
242
|
+
_end_span(span=span, status="ERROR", token=token)
|
243
|
+
return llama_span
|
244
|
+
|
245
|
+
def _get_span_type(self, instance: Any) -> SpanType:
|
246
|
+
"""
|
247
|
+
Map LlamaIndex instance type to MLflow span type. Some span type cannot be determined
|
248
|
+
by instance type alone, rather need event info e.g. ChatModel, ReRanker
|
249
|
+
"""
|
250
|
+
if isinstance(instance, (BaseLLM, MultiModalLLM)):
|
251
|
+
return SpanType.LLM
|
252
|
+
elif isinstance(instance, BaseRetriever):
|
253
|
+
return SpanType.RETRIEVER
|
254
|
+
elif isinstance(instance, (BaseAgent, BaseAgentWorker)):
|
255
|
+
return SpanType.AGENT
|
256
|
+
elif isinstance(instance, BaseEmbedding):
|
257
|
+
return SpanType.EMBEDDING
|
258
|
+
elif isinstance(instance, BaseTool):
|
259
|
+
return SpanType.TOOL
|
260
|
+
else:
|
261
|
+
return SpanType.CHAIN
|
262
|
+
|
263
|
+
@singledispatchmethod
|
264
|
+
def _get_instance_attributes(self, instance: Any) -> dict[str, Any]:
|
265
|
+
"""
|
266
|
+
Extract span attributes from LlamaIndex objects.
|
267
|
+
|
268
|
+
NB: There are some overlap between attributes extracted from instance metadata and the
|
269
|
+
events. For example, model name for an LLM is available in both. However, events might
|
270
|
+
not always be triggered (e.g. 3P llm integration doesn't implement the event logic),
|
271
|
+
so the instance metadata serves as a fallback source of information.
|
272
|
+
"""
|
273
|
+
|
274
|
+
# TODO: Union type hint doesn't work with singledispatchmethod, so we have to define
|
275
|
+
# two separate methods for BaseLLM and MultiModalLLM. Once we upgrade to Python 3.10,
|
276
|
+
# we can use `BaseLLM | MultiModelLLM` type hint and it works with singledispatchmethod.
|
277
|
+
@_get_instance_attributes.register
|
278
|
+
def _(self, instance: BaseLLM):
|
279
|
+
return self._get_llm_attributes(instance)
|
280
|
+
|
281
|
+
@_get_instance_attributes.register
|
282
|
+
def _(self, instance: MultiModalLLM):
|
283
|
+
return self._get_llm_attributes(instance)
|
284
|
+
|
285
|
+
def _get_llm_attributes(self, instance) -> dict[str, Any]:
|
286
|
+
attr = {}
|
287
|
+
if metadata := instance.metadata:
|
288
|
+
attr["model_name"] = metadata.model_name
|
289
|
+
if params_str := metadata.json(exclude_unset=True):
|
290
|
+
attr["invocation_params"] = json.loads(params_str)
|
291
|
+
return attr
|
292
|
+
|
293
|
+
@_get_instance_attributes.register
|
294
|
+
def _(self, instance: BaseEmbedding):
|
295
|
+
return {
|
296
|
+
"model_name": instance.model_name,
|
297
|
+
"embed_batch_size": instance.embed_batch_size,
|
298
|
+
}
|
299
|
+
|
300
|
+
@_get_instance_attributes.register
|
301
|
+
def _(self, instance: BaseTool):
|
302
|
+
metadata = instance.metadata
|
303
|
+
attributes = {"description": metadata.description}
|
304
|
+
try:
|
305
|
+
attributes["name"] = metadata.name
|
306
|
+
except ValueError:
|
307
|
+
# ToolMetadata.get_name() raises ValueError if name is None
|
308
|
+
pass
|
309
|
+
try:
|
310
|
+
attributes["parameters"] = json.loads(metadata.fn_schema_str)
|
311
|
+
except ValueError:
|
312
|
+
# ToolMetadata.get_fn_schema_str() raises ValueError if fn_schema is None
|
313
|
+
pass
|
314
|
+
return attributes
|
315
|
+
|
316
|
+
|
317
|
+
class MlflowEventHandler(BaseEventHandler, extra="allow"):
|
318
|
+
"""
|
319
|
+
Event handler processes various events that are triggered during execution.
|
320
|
+
|
321
|
+
Events are used as supplemental source for recording additional metadata to the span,
|
322
|
+
such as model name, parameters to the span, because they are not available in the inputs
|
323
|
+
and outputs in SpanHandler.
|
324
|
+
"""
|
325
|
+
|
326
|
+
_span_handler: MlflowSpanHandler
|
327
|
+
|
328
|
+
@classmethod
|
329
|
+
def class_name(cls) -> str:
|
330
|
+
return "MlflowEventHandler"
|
331
|
+
|
332
|
+
def __init__(self, _span_handler):
|
333
|
+
super().__init__()
|
334
|
+
self._span_handler = _span_handler
|
335
|
+
|
336
|
+
def handle(self, event: BaseEvent) -> Any:
|
337
|
+
try:
|
338
|
+
if span := self._span_handler.get_span_for_event(event):
|
339
|
+
self._handle_event(event, span)
|
340
|
+
except Exception as e:
|
341
|
+
_logger.debug(f"Failed to handle event: {e}", exc_info=True)
|
342
|
+
|
343
|
+
@singledispatchmethod
|
344
|
+
def _handle_event(self, event: BaseEvent, span: LiveSpan):
|
345
|
+
# Pass through the events we are not interested in
|
346
|
+
pass
|
347
|
+
|
348
|
+
@_handle_event.register
|
349
|
+
def _(self, event: AgentToolCallEvent, span: LiveSpan):
|
350
|
+
span.set_attribute("name", event.tool.name)
|
351
|
+
span.set_attribute("description", event.tool.description)
|
352
|
+
span.set_attribute("parameters", event.tool.get_parameters_dict())
|
353
|
+
|
354
|
+
@_handle_event.register
|
355
|
+
def _(self, event: EmbeddingStartEvent, span: LiveSpan):
|
356
|
+
span.set_attribute("model_dict", event.model_dict)
|
357
|
+
|
358
|
+
@_handle_event.register
|
359
|
+
def _(self, event: LLMPredictStartEvent, span: LiveSpan):
|
360
|
+
"""
|
361
|
+
An event triggered when LLM's predict() is called.
|
362
|
+
|
363
|
+
In LlamaIndex, predict() is a gateway method that dispatch the request to
|
364
|
+
either chat() or completion() method depending on the model type, as well
|
365
|
+
as crafting prompt from the template.
|
366
|
+
"""
|
367
|
+
template = event.template
|
368
|
+
template_args = {
|
369
|
+
**template.kwargs,
|
370
|
+
**(event.template_args if event.template_args else {}),
|
371
|
+
}
|
372
|
+
span.set_attributes(
|
373
|
+
{
|
374
|
+
"prmopt_template": template.get_template(),
|
375
|
+
"template_arguments": {var: template_args.get(var) for var in template_args},
|
376
|
+
}
|
377
|
+
)
|
378
|
+
|
379
|
+
@_handle_event.register
|
380
|
+
def _(self, event: LLMCompletionStartEvent, span: LiveSpan):
|
381
|
+
span.set_attribute("prompt", event.prompt)
|
382
|
+
span.set_attribute("model_dict", event.model_dict)
|
383
|
+
self._extract_and_set_chat_messages(span, event)
|
384
|
+
|
385
|
+
@_handle_event.register
|
386
|
+
def _(self, event: LLMCompletionEndEvent, span: LiveSpan):
|
387
|
+
span.set_attribute("usage", self._extract_token_usage(event.response))
|
388
|
+
token_counts = self._parse_usage(span)
|
389
|
+
span.set_attribute(SpanAttributeKey.CHAT_USAGE, token_counts)
|
390
|
+
self._extract_and_set_chat_messages(span, event)
|
391
|
+
self._span_handler.resolve_pending_stream_span(span, event)
|
392
|
+
|
393
|
+
@_handle_event.register
|
394
|
+
def _(self, event: LLMChatStartEvent, span: LiveSpan):
|
395
|
+
span.set_attribute(SpanAttributeKey.SPAN_TYPE, SpanType.CHAT_MODEL)
|
396
|
+
span.set_attribute("model_dict", event.model_dict)
|
397
|
+
self._extract_and_set_chat_messages(span, event)
|
398
|
+
|
399
|
+
@_handle_event.register
|
400
|
+
def _(self, event: LLMChatEndEvent, span: LiveSpan):
|
401
|
+
span.set_attribute("usage", self._extract_token_usage(event.response))
|
402
|
+
token_counts = self._parse_usage(span)
|
403
|
+
span.set_attribute(SpanAttributeKey.CHAT_USAGE, token_counts)
|
404
|
+
self._extract_and_set_chat_messages(span, event)
|
405
|
+
self._span_handler.resolve_pending_stream_span(span, event)
|
406
|
+
|
407
|
+
@_handle_event.register
|
408
|
+
def _(self, event: ReRankStartEvent, span: LiveSpan):
|
409
|
+
span.set_attribute(SpanAttributeKey.SPAN_TYPE, SpanType.RERANKER)
|
410
|
+
span.set_attributes(
|
411
|
+
{
|
412
|
+
"model_name": event.model_name,
|
413
|
+
"top_n": event.top_n,
|
414
|
+
}
|
415
|
+
)
|
416
|
+
|
417
|
+
@_handle_event.register
|
418
|
+
def _(self, event: ExceptionEvent, span: LiveSpan):
|
419
|
+
"""
|
420
|
+
Handle an exception event for stream spans.
|
421
|
+
|
422
|
+
For non-stream spans, exception is processed by the prepare_to_drop_span() handler of
|
423
|
+
the span handler. However, for stream spans, the exception may raised during the
|
424
|
+
streaming after it exit. Therefore, we need to resolve the span here.
|
425
|
+
"""
|
426
|
+
self._span_handler.resolve_pending_stream_span(span, event)
|
427
|
+
|
428
|
+
def _extract_token_usage(
|
429
|
+
self, response: Union[ChatResponse, CompletionResponse]
|
430
|
+
) -> dict[str, int]:
|
431
|
+
if raw := response.raw:
|
432
|
+
# The raw response can be a Pydantic model or a dictionary
|
433
|
+
if isinstance(raw, pydantic.BaseModel):
|
434
|
+
raw = model_dump_compat(raw)
|
435
|
+
|
436
|
+
if usage := raw.get("usage"):
|
437
|
+
return usage
|
438
|
+
|
439
|
+
# If the usage is not found in the raw response, look for token counts
|
440
|
+
# in additional_kwargs of the completion payload
|
441
|
+
usage = {}
|
442
|
+
if additional_kwargs := getattr(response, "additional_kwargs", None):
|
443
|
+
for k in ["prompt_tokens", "completion_tokens", "total_tokens"]:
|
444
|
+
if (v := additional_kwargs.get(k)) is not None:
|
445
|
+
usage[k] = v
|
446
|
+
return usage
|
447
|
+
|
448
|
+
def _parse_usage(self, span: LiveSpan):
|
449
|
+
try:
|
450
|
+
usage = span.get_attribute("usage")
|
451
|
+
return {
|
452
|
+
TokenUsageKey.INPUT_TOKENS: usage["prompt_tokens"],
|
453
|
+
TokenUsageKey.OUTPUT_TOKENS: usage["completion_tokens"],
|
454
|
+
TokenUsageKey.TOTAL_TOKENS: usage.get(
|
455
|
+
"total_tokens", usage["prompt_tokens"] + usage["completion_tokens"]
|
456
|
+
),
|
457
|
+
}
|
458
|
+
except Exception as e:
|
459
|
+
_logger.debug(f"Failed to set TokenUsage to the span: {e}", exc_info=True)
|
460
|
+
|
461
|
+
def _extract_and_set_chat_messages(self, span: LiveSpan, event: BaseEvent):
|
462
|
+
try:
|
463
|
+
messages = get_chat_messages_from_event(event)
|
464
|
+
set_span_chat_messages(span, messages, append=True)
|
465
|
+
except Exception as e:
|
466
|
+
_logger.debug(f"Failed to set chat messages to the span: {e}", exc_info=True)
|
467
|
+
|
468
|
+
|
469
|
+
_StreamEndEvent = Union[LLMChatEndEvent, LLMCompletionEndEvent, ExceptionEvent]
|
470
|
+
|
471
|
+
|
472
|
+
class StreamResolver:
|
473
|
+
"""
|
474
|
+
A class is responsible for closing the pending streaming spans that are waiting
|
475
|
+
for the stream to be exhausted. Once the associated stream is exhausted, this
|
476
|
+
class will resolve the span, as well as recursively resolve the parent spans
|
477
|
+
that returns the same (or derived) stream.
|
478
|
+
"""
|
479
|
+
|
480
|
+
def __init__(self):
|
481
|
+
self._span_id_to_span_and_gen: dict[str, tuple[LiveSpan, Generator]] = {}
|
482
|
+
|
483
|
+
def is_streaming_result(self, result: Any) -> bool:
|
484
|
+
return (
|
485
|
+
inspect.isgenerator(result) # noqa: SIM101
|
486
|
+
or isinstance(result, (StreamingResponse, AsyncStreamingResponse))
|
487
|
+
or isinstance(result, StreamingAgentChatResponse)
|
488
|
+
or (isinstance(result, TaskStepOutput) and self.is_streaming_result(result.output))
|
489
|
+
)
|
490
|
+
|
491
|
+
def register_stream_span(self, span: LiveSpan, result: Any) -> bool:
|
492
|
+
"""
|
493
|
+
Register the pending streaming span with the associated generator.
|
494
|
+
|
495
|
+
Args:
|
496
|
+
span: The span that has a streaming output.
|
497
|
+
result: The streaming result that is being processed.
|
498
|
+
|
499
|
+
Returns:
|
500
|
+
True if the span is registered successfully, False otherwise.
|
501
|
+
"""
|
502
|
+
if inspect.isgenerator(result):
|
503
|
+
stream = result
|
504
|
+
elif isinstance(result, (StreamingResponse, AsyncStreamingResponse)):
|
505
|
+
stream = result.response_gen
|
506
|
+
elif isinstance(result, StreamingAgentChatResponse):
|
507
|
+
stream = result.chat_stream
|
508
|
+
elif isinstance(result, TaskStepOutput):
|
509
|
+
stream = result.output.chat_stream
|
510
|
+
else:
|
511
|
+
raise ValueError(f"Unsupported streaming response type: {type(result)}")
|
512
|
+
|
513
|
+
if inspect.getgeneratorstate(stream) == inspect.GEN_CLOSED:
|
514
|
+
# Not registering the span because the generator is already exhausted.
|
515
|
+
# It's counter-intuitive that the generator is closed before the response
|
516
|
+
# is returned, but it can happen because some agents run streaming request
|
517
|
+
# in a separate thread. In this case, the generator can be closed before
|
518
|
+
# the response is returned in the main thread.
|
519
|
+
return False
|
520
|
+
|
521
|
+
self._span_id_to_span_and_gen[span.span_id] = (span, stream)
|
522
|
+
return True
|
523
|
+
|
524
|
+
def resolve(self, span: LiveSpan, event: _StreamEndEvent):
|
525
|
+
"""
|
526
|
+
Finish the streaming span and recursively resolve the parent spans that
|
527
|
+
returns the same (or derived) stream.
|
528
|
+
"""
|
529
|
+
_, stream = self._span_id_to_span_and_gen.pop(span.span_id, (None, None))
|
530
|
+
if not stream:
|
531
|
+
return
|
532
|
+
|
533
|
+
if isinstance(event, (LLMChatEndEvent, LLMCompletionEndEvent)):
|
534
|
+
outputs = event.response
|
535
|
+
status = SpanStatusCode.OK
|
536
|
+
elif isinstance(event, ExceptionEvent):
|
537
|
+
outputs = None
|
538
|
+
status = SpanStatusCode.ERROR
|
539
|
+
span.add_event(SpanEvent.from_exception(event.exception))
|
540
|
+
else:
|
541
|
+
raise ValueError(f"Unsupported event type to resolve streaming: {type(event)}")
|
542
|
+
|
543
|
+
_end_span(span=span, status=status, outputs=outputs)
|
544
|
+
|
545
|
+
# Extract the complete text from the event.
|
546
|
+
if isinstance(outputs, ChatResponse):
|
547
|
+
output_text = outputs.message.content
|
548
|
+
elif isinstance(outputs, CompletionResponse):
|
549
|
+
output_text = outputs.response.text
|
550
|
+
else:
|
551
|
+
output_text = None
|
552
|
+
|
553
|
+
# Recursively resolve the parent spans that are also waiting for the same token
|
554
|
+
# stream to be exhausted.
|
555
|
+
while span.parent_id in self._span_id_to_span_and_gen:
|
556
|
+
if span_and_stream := self._span_id_to_span_and_gen.pop(span.parent_id, None):
|
557
|
+
span, stream = span_and_stream
|
558
|
+
# We reuse the same output text for parent spans. This may not be 100% correct
|
559
|
+
# as token stream can be modified by callers. However, it is technically
|
560
|
+
# challenging to track the modified stream across multiple spans.
|
561
|
+
_end_span(span=span, status=status, outputs=output_text)
|