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,597 @@
|
|
1
|
+
import ast
|
2
|
+
import logging
|
3
|
+
from contextvars import ContextVar
|
4
|
+
from typing import Any, Optional, Sequence, Union
|
5
|
+
from uuid import UUID
|
6
|
+
|
7
|
+
import pydantic
|
8
|
+
from langchain_core.agents import AgentAction, AgentFinish
|
9
|
+
from langchain_core.callbacks.base import BaseCallbackHandler
|
10
|
+
from langchain_core.documents import Document
|
11
|
+
from langchain_core.load.dump import dumps
|
12
|
+
from langchain_core.messages import BaseMessage
|
13
|
+
from langchain_core.outputs import (
|
14
|
+
ChatGenerationChunk,
|
15
|
+
GenerationChunk,
|
16
|
+
LLMResult,
|
17
|
+
)
|
18
|
+
from tenacity import RetryCallState
|
19
|
+
|
20
|
+
import mlflow
|
21
|
+
from mlflow.entities import Document as MlflowDocument
|
22
|
+
from mlflow.entities import LiveSpan, SpanEvent, SpanStatus, SpanStatusCode, SpanType
|
23
|
+
from mlflow.entities.span import NO_OP_SPAN_TRACE_ID
|
24
|
+
from mlflow.exceptions import MlflowException
|
25
|
+
from mlflow.langchain.utils.chat import (
|
26
|
+
convert_lc_generation_to_chat_message,
|
27
|
+
convert_lc_message_to_chat_message,
|
28
|
+
parse_token_usage,
|
29
|
+
)
|
30
|
+
from mlflow.tracing.constant import SpanAttributeKey
|
31
|
+
from mlflow.tracing.fluent import start_span_no_context
|
32
|
+
from mlflow.tracing.provider import detach_span_from_context, set_span_in_context
|
33
|
+
from mlflow.tracing.utils import (
|
34
|
+
maybe_set_prediction_context,
|
35
|
+
set_span_chat_messages,
|
36
|
+
set_span_chat_tools,
|
37
|
+
)
|
38
|
+
from mlflow.tracing.utils.token import SpanWithToken
|
39
|
+
from mlflow.types.chat import ChatMessage, ChatTool, FunctionToolDefinition
|
40
|
+
from mlflow.utils import IS_PYDANTIC_V2_OR_NEWER
|
41
|
+
from mlflow.utils.autologging_utils import ExceptionSafeAbstractClass
|
42
|
+
from mlflow.version import IS_TRACING_SDK_ONLY
|
43
|
+
|
44
|
+
if not IS_TRACING_SDK_ONLY:
|
45
|
+
from mlflow.pyfunc.context import Context
|
46
|
+
|
47
|
+
|
48
|
+
_logger = logging.getLogger(__name__)
|
49
|
+
|
50
|
+
_should_attach_span_to_context = ContextVar("should_attach_span_to_context", default=True)
|
51
|
+
|
52
|
+
|
53
|
+
class MlflowLangchainTracer(BaseCallbackHandler, metaclass=ExceptionSafeAbstractClass):
|
54
|
+
"""
|
55
|
+
Callback for auto-logging traces.
|
56
|
+
We need to inherit ExceptionSafeAbstractClass to avoid invalid new
|
57
|
+
input arguments added to original function call.
|
58
|
+
|
59
|
+
Args:
|
60
|
+
prediction_context: Optional prediction context object to be set for the
|
61
|
+
thread-local context. Occasionally this has to be passed manually because
|
62
|
+
the callback may be invoked asynchronously and Langchain doesn't correctly
|
63
|
+
propagate the thread-local context.
|
64
|
+
"""
|
65
|
+
|
66
|
+
def __init__(
|
67
|
+
self,
|
68
|
+
prediction_context: Optional["Context"] = None,
|
69
|
+
):
|
70
|
+
# NB: The tracer can handle multiple traces in parallel under multi-threading scenarios.
|
71
|
+
# DO NOT use instance variables to manage the state of single trace.
|
72
|
+
super().__init__()
|
73
|
+
# run_id: (LiveSpan, OTel token)
|
74
|
+
self._run_span_mapping: dict[str, SpanWithToken] = {}
|
75
|
+
self._prediction_context = prediction_context
|
76
|
+
|
77
|
+
def _get_span_by_run_id(self, run_id: UUID) -> Optional[LiveSpan]:
|
78
|
+
if span_with_token := self._run_span_mapping.get(str(run_id), None):
|
79
|
+
return span_with_token.span
|
80
|
+
raise MlflowException(f"Span for run_id {run_id!s} not found.")
|
81
|
+
|
82
|
+
def _serialize_invocation_params(
|
83
|
+
self, attributes: Optional[dict[str, Any]]
|
84
|
+
) -> Optional[dict[str, Any]]:
|
85
|
+
"""
|
86
|
+
Serialize the 'invocation_params' in the attributes dictionary.
|
87
|
+
If 'invocation_params' contains a key 'response_format' whose value is a subclass
|
88
|
+
of pydantic.BaseModel, replace it with its JSON schema.
|
89
|
+
"""
|
90
|
+
if not attributes:
|
91
|
+
return attributes
|
92
|
+
|
93
|
+
invocation_params = attributes.get("invocation_params")
|
94
|
+
if not isinstance(invocation_params, dict):
|
95
|
+
return attributes
|
96
|
+
|
97
|
+
response_format = invocation_params.get("response_format")
|
98
|
+
if isinstance(response_format, type) and issubclass(response_format, pydantic.BaseModel):
|
99
|
+
try:
|
100
|
+
invocation_params["response_format"] = (
|
101
|
+
response_format.model_json_schema()
|
102
|
+
if IS_PYDANTIC_V2_OR_NEWER
|
103
|
+
else response_format.schema()
|
104
|
+
)
|
105
|
+
except Exception as e:
|
106
|
+
_logger.error(
|
107
|
+
"Failed to generate JSON schema for response_format: %s", e, exc_info=True
|
108
|
+
)
|
109
|
+
return attributes
|
110
|
+
|
111
|
+
def _start_span(
|
112
|
+
self,
|
113
|
+
span_name: str,
|
114
|
+
parent_run_id: Optional[UUID],
|
115
|
+
span_type: str,
|
116
|
+
run_id: UUID,
|
117
|
+
inputs: Optional[Union[str, dict[str, Any]]] = None,
|
118
|
+
attributes: Optional[dict[str, Any]] = None,
|
119
|
+
) -> LiveSpan:
|
120
|
+
"""Start MLflow Span (or Trace if it is root component)"""
|
121
|
+
serialized_attributes = self._serialize_invocation_params(attributes)
|
122
|
+
dependencies_schemas = (
|
123
|
+
self._prediction_context.dependencies_schemas if self._prediction_context else None
|
124
|
+
)
|
125
|
+
with maybe_set_prediction_context(
|
126
|
+
self._prediction_context
|
127
|
+
): # When parent_run_id is None, this is root component so start trace
|
128
|
+
span = start_span_no_context(
|
129
|
+
name=span_name,
|
130
|
+
span_type=span_type,
|
131
|
+
parent_span=self._get_parent_span(parent_run_id),
|
132
|
+
inputs=inputs,
|
133
|
+
attributes=serialized_attributes,
|
134
|
+
tags=dependencies_schemas,
|
135
|
+
)
|
136
|
+
|
137
|
+
# Debugging purpose
|
138
|
+
if span.trace_id == NO_OP_SPAN_TRACE_ID:
|
139
|
+
_logger.debug("No Op span was created, the trace will not be recorded.")
|
140
|
+
|
141
|
+
# Attach the span to the current context to mark it "active"
|
142
|
+
token = set_span_in_context(span) if _should_attach_span_to_context.get() else None
|
143
|
+
self._run_span_mapping[str(run_id)] = SpanWithToken(span, token)
|
144
|
+
return span
|
145
|
+
|
146
|
+
def _get_parent_span(self, parent_run_id) -> Optional[LiveSpan]:
|
147
|
+
"""
|
148
|
+
Get parent span from multiple sources:
|
149
|
+
1. If there is an active span in current context, use it as parent span
|
150
|
+
2. If parent_run_id is provided, get the corresponding span from the run -> span mapping
|
151
|
+
3. If none of the above, return None
|
152
|
+
"""
|
153
|
+
if active_span := mlflow.get_current_active_span():
|
154
|
+
return active_span
|
155
|
+
elif parent_run_id:
|
156
|
+
return self._get_span_by_run_id(parent_run_id)
|
157
|
+
return None
|
158
|
+
|
159
|
+
def _end_span(
|
160
|
+
self,
|
161
|
+
run_id: UUID,
|
162
|
+
span: LiveSpan,
|
163
|
+
outputs=None,
|
164
|
+
attributes=None,
|
165
|
+
status=SpanStatus(SpanStatusCode.OK),
|
166
|
+
):
|
167
|
+
"""Close MLflow Span (or Trace if it is root component)"""
|
168
|
+
try:
|
169
|
+
with maybe_set_prediction_context(self._prediction_context):
|
170
|
+
span.end(
|
171
|
+
outputs=outputs,
|
172
|
+
attributes=attributes,
|
173
|
+
status=status,
|
174
|
+
)
|
175
|
+
finally:
|
176
|
+
# Span should be detached from the context even when the client.end_span fails
|
177
|
+
st = self._run_span_mapping.pop(str(run_id), None)
|
178
|
+
if _should_attach_span_to_context.get():
|
179
|
+
if st.token is None:
|
180
|
+
raise MlflowException(
|
181
|
+
f"Token for span {st.span} is not found. "
|
182
|
+
"Cannot detach the span from context."
|
183
|
+
)
|
184
|
+
detach_span_from_context(st.token)
|
185
|
+
|
186
|
+
def flush(self):
|
187
|
+
"""Flush the state of the tracer."""
|
188
|
+
# Ideally, all spans should be popped and ended. However, LangChain sometimes
|
189
|
+
# does not trigger the end event properly and some spans may be left open.
|
190
|
+
# To avoid leaking tracing context, we remove all spans from the mapping.
|
191
|
+
for st in self._run_span_mapping.values():
|
192
|
+
if st.token:
|
193
|
+
_logger.debug(f"Found leaked span {st.span}. Force ending it.")
|
194
|
+
detach_span_from_context(st.token)
|
195
|
+
|
196
|
+
self._run_span_mapping = {}
|
197
|
+
|
198
|
+
def _assign_span_name(self, serialized: dict[str, Any], default_name="unknown") -> str:
|
199
|
+
return serialized.get("name", serialized.get("id", [default_name])[-1])
|
200
|
+
|
201
|
+
def on_chat_model_start(
|
202
|
+
self,
|
203
|
+
serialized: dict[str, Any],
|
204
|
+
messages: list[list[BaseMessage]],
|
205
|
+
*,
|
206
|
+
run_id: UUID,
|
207
|
+
tags: Optional[list[str]] = None,
|
208
|
+
parent_run_id: Optional[UUID] = None,
|
209
|
+
metadata: Optional[dict[str, Any]] = None,
|
210
|
+
name: Optional[str] = None,
|
211
|
+
**kwargs: Any,
|
212
|
+
):
|
213
|
+
"""Run when a chat model starts running."""
|
214
|
+
|
215
|
+
if metadata:
|
216
|
+
kwargs.update({"metadata": metadata})
|
217
|
+
|
218
|
+
span = self._start_span(
|
219
|
+
span_name=name or self._assign_span_name(serialized, "chat model"),
|
220
|
+
parent_run_id=parent_run_id,
|
221
|
+
span_type=SpanType.CHAT_MODEL,
|
222
|
+
run_id=run_id,
|
223
|
+
inputs=messages,
|
224
|
+
attributes=kwargs,
|
225
|
+
)
|
226
|
+
|
227
|
+
mlflow_messages = [
|
228
|
+
convert_lc_message_to_chat_message(msg)
|
229
|
+
for message_list in messages
|
230
|
+
for msg in message_list
|
231
|
+
]
|
232
|
+
set_span_chat_messages(span, mlflow_messages)
|
233
|
+
|
234
|
+
if tools := self._extract_tool_definitions(kwargs):
|
235
|
+
set_span_chat_tools(span, tools)
|
236
|
+
|
237
|
+
def on_llm_start(
|
238
|
+
self,
|
239
|
+
serialized: dict[str, Any],
|
240
|
+
prompts: list[str],
|
241
|
+
*,
|
242
|
+
run_id: UUID,
|
243
|
+
tags: Optional[list[str]] = None,
|
244
|
+
parent_run_id: Optional[UUID] = None,
|
245
|
+
metadata: Optional[dict[str, Any]] = None,
|
246
|
+
name: Optional[str] = None,
|
247
|
+
**kwargs: Any,
|
248
|
+
) -> None:
|
249
|
+
"""Run when LLM (non-chat models) starts running."""
|
250
|
+
if metadata:
|
251
|
+
kwargs.update({"metadata": metadata})
|
252
|
+
|
253
|
+
span = self._start_span(
|
254
|
+
span_name=name or self._assign_span_name(serialized, "llm"),
|
255
|
+
parent_run_id=parent_run_id,
|
256
|
+
span_type=SpanType.LLM,
|
257
|
+
run_id=run_id,
|
258
|
+
inputs=prompts,
|
259
|
+
attributes=kwargs,
|
260
|
+
)
|
261
|
+
|
262
|
+
mlflow_messages = [ChatMessage(role="user", content=prompt) for prompt in prompts]
|
263
|
+
set_span_chat_messages(span, mlflow_messages)
|
264
|
+
|
265
|
+
if tools := self._extract_tool_definitions(kwargs):
|
266
|
+
set_span_chat_tools(span, tools)
|
267
|
+
|
268
|
+
def _extract_tool_definitions(self, kwargs: dict[str, Any]) -> list[ChatTool]:
|
269
|
+
raw_tools = kwargs.get("invocation_params", {}).get("tools", [])
|
270
|
+
tools = []
|
271
|
+
for raw_tool in raw_tools:
|
272
|
+
# First, try to parse the raw tool dictionary as OpenAI-style tool
|
273
|
+
try:
|
274
|
+
tool = ChatTool.validate_compat(raw_tool)
|
275
|
+
tools.append(tool)
|
276
|
+
except pydantic.ValidationError:
|
277
|
+
# If not OpenAI style, just try to extract the name and descriptions.
|
278
|
+
if name := raw_tool.get("name"):
|
279
|
+
tool = ChatTool(
|
280
|
+
type="function",
|
281
|
+
function=FunctionToolDefinition(
|
282
|
+
name=name, description=raw_tool.get("description")
|
283
|
+
),
|
284
|
+
)
|
285
|
+
tools.append(tool)
|
286
|
+
else:
|
287
|
+
_logger.warning(f"Failed to parse tool definition for tracing: {raw_tool}.")
|
288
|
+
|
289
|
+
return tools
|
290
|
+
|
291
|
+
def on_llm_new_token(
|
292
|
+
self,
|
293
|
+
token: str,
|
294
|
+
*,
|
295
|
+
chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None,
|
296
|
+
run_id: UUID,
|
297
|
+
parent_run_id: Optional[UUID] = None,
|
298
|
+
**kwargs: Any,
|
299
|
+
):
|
300
|
+
"""Run on new LLM token. Only available when streaming is enabled."""
|
301
|
+
llm_span = self._get_span_by_run_id(run_id)
|
302
|
+
event_kwargs = {"token": token}
|
303
|
+
if chunk:
|
304
|
+
event_kwargs["chunk"] = dumps(chunk)
|
305
|
+
llm_span.add_event(
|
306
|
+
SpanEvent(
|
307
|
+
name="new_token",
|
308
|
+
attributes=event_kwargs,
|
309
|
+
)
|
310
|
+
)
|
311
|
+
|
312
|
+
def on_retry(
|
313
|
+
self,
|
314
|
+
retry_state: RetryCallState,
|
315
|
+
*,
|
316
|
+
run_id: UUID,
|
317
|
+
**kwargs: Any,
|
318
|
+
):
|
319
|
+
"""Run on a retry event."""
|
320
|
+
span = self._get_span_by_run_id(run_id)
|
321
|
+
retry_d: dict[str, Any] = {
|
322
|
+
"slept": retry_state.idle_for,
|
323
|
+
"attempt": retry_state.attempt_number,
|
324
|
+
}
|
325
|
+
if retry_state.outcome is None:
|
326
|
+
retry_d["outcome"] = "N/A"
|
327
|
+
elif retry_state.outcome.failed:
|
328
|
+
retry_d["outcome"] = "failed"
|
329
|
+
exception = retry_state.outcome.exception()
|
330
|
+
retry_d["exception"] = str(exception)
|
331
|
+
retry_d["exception_type"] = exception.__class__.__name__
|
332
|
+
else:
|
333
|
+
retry_d["outcome"] = "success"
|
334
|
+
retry_d["result"] = str(retry_state.outcome.result())
|
335
|
+
span.add_event(
|
336
|
+
SpanEvent(
|
337
|
+
name="retry",
|
338
|
+
attributes=retry_d,
|
339
|
+
)
|
340
|
+
)
|
341
|
+
|
342
|
+
def on_llm_end(self, response: LLMResult, *, run_id: UUID, **kwargs: Any):
|
343
|
+
"""End the span for an LLM run."""
|
344
|
+
llm_span = self._get_span_by_run_id(run_id)
|
345
|
+
|
346
|
+
# Record the chat messages attribute
|
347
|
+
input_messages = llm_span.get_attribute(SpanAttributeKey.CHAT_MESSAGES) or []
|
348
|
+
# response.generations is a nested list of messages
|
349
|
+
generations = [g for gen_list in response.generations for g in gen_list]
|
350
|
+
output_messages = [convert_lc_generation_to_chat_message(g) for g in generations]
|
351
|
+
set_span_chat_messages(llm_span, input_messages + output_messages)
|
352
|
+
|
353
|
+
# Record the token usage attribute
|
354
|
+
try:
|
355
|
+
if usage := parse_token_usage(generations):
|
356
|
+
llm_span.set_attribute(SpanAttributeKey.CHAT_USAGE, usage)
|
357
|
+
except Exception as e:
|
358
|
+
_logger.debug(f"Failed to log token usage for LangChain: {e}", exc_info=True)
|
359
|
+
|
360
|
+
self._end_span(run_id, llm_span, outputs=response)
|
361
|
+
|
362
|
+
def on_llm_error(
|
363
|
+
self,
|
364
|
+
error: BaseException,
|
365
|
+
*,
|
366
|
+
run_id: UUID,
|
367
|
+
**kwargs: Any,
|
368
|
+
):
|
369
|
+
"""Handle an error for an LLM run."""
|
370
|
+
llm_span = self._get_span_by_run_id(run_id)
|
371
|
+
llm_span.add_event(SpanEvent.from_exception(error))
|
372
|
+
self._end_span(run_id, llm_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
|
373
|
+
|
374
|
+
def on_chain_start(
|
375
|
+
self,
|
376
|
+
serialized: dict[str, Any],
|
377
|
+
inputs: Union[dict[str, Any], Any],
|
378
|
+
*,
|
379
|
+
run_id: UUID,
|
380
|
+
tags: Optional[list[str]] = None,
|
381
|
+
parent_run_id: Optional[UUID] = None,
|
382
|
+
metadata: Optional[dict[str, Any]] = None,
|
383
|
+
run_type: Optional[str] = None,
|
384
|
+
name: Optional[str] = None,
|
385
|
+
**kwargs: Any,
|
386
|
+
):
|
387
|
+
"""Start span for a chain run."""
|
388
|
+
if metadata:
|
389
|
+
kwargs.update({"metadata": metadata})
|
390
|
+
# not considering streaming events for now
|
391
|
+
self._start_span(
|
392
|
+
span_name=name or self._assign_span_name(serialized, "chain"),
|
393
|
+
parent_run_id=parent_run_id,
|
394
|
+
span_type=SpanType.CHAIN,
|
395
|
+
run_id=run_id,
|
396
|
+
inputs=inputs,
|
397
|
+
attributes=kwargs,
|
398
|
+
)
|
399
|
+
|
400
|
+
def on_chain_end(
|
401
|
+
self,
|
402
|
+
outputs: dict[str, Any],
|
403
|
+
*,
|
404
|
+
run_id: UUID,
|
405
|
+
inputs: Optional[Union[dict[str, Any], Any]] = None,
|
406
|
+
**kwargs: Any,
|
407
|
+
):
|
408
|
+
"""Run when chain ends running."""
|
409
|
+
chain_span = self._get_span_by_run_id(run_id)
|
410
|
+
if inputs:
|
411
|
+
chain_span.set_inputs(inputs)
|
412
|
+
self._end_span(run_id, chain_span, outputs=outputs)
|
413
|
+
|
414
|
+
def on_chain_error(
|
415
|
+
self,
|
416
|
+
error: BaseException,
|
417
|
+
*,
|
418
|
+
inputs: Optional[Union[dict[str, Any], Any]] = None,
|
419
|
+
run_id: UUID,
|
420
|
+
**kwargs: Any,
|
421
|
+
):
|
422
|
+
"""Run when chain errors."""
|
423
|
+
chain_span = self._get_span_by_run_id(run_id)
|
424
|
+
if inputs:
|
425
|
+
chain_span.set_inputs(inputs)
|
426
|
+
chain_span.add_event(SpanEvent.from_exception(error))
|
427
|
+
self._end_span(run_id, chain_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
|
428
|
+
|
429
|
+
def on_tool_start(
|
430
|
+
self,
|
431
|
+
serialized: dict[str, Any],
|
432
|
+
input_str: str,
|
433
|
+
*,
|
434
|
+
run_id: UUID,
|
435
|
+
tags: Optional[list[str]] = None,
|
436
|
+
parent_run_id: Optional[UUID] = None,
|
437
|
+
metadata: Optional[dict[str, Any]] = None,
|
438
|
+
name: Optional[str] = None,
|
439
|
+
# We don't use inputs here because LangChain override the original inputs
|
440
|
+
# with None for some cases. In order to avoid losing the original inputs,
|
441
|
+
# we try to parse the input_str instead.
|
442
|
+
# https://github.com/langchain-ai/langchain/blob/2813e8640703b8066d8dd6c739829bb4f4aa634e/libs/core/langchain_core/tools/base.py#L636-L640
|
443
|
+
inputs: Optional[dict[str, Any]] = None,
|
444
|
+
**kwargs: Any,
|
445
|
+
):
|
446
|
+
"""Start span for a tool run."""
|
447
|
+
if metadata:
|
448
|
+
kwargs.update({"metadata": metadata})
|
449
|
+
|
450
|
+
# For function calling, input_str can be a stringified dictionary
|
451
|
+
# like "{'key': 'value'}". We try parsing it for better rendering,
|
452
|
+
# but conservatively fallback to original if it fails.
|
453
|
+
try:
|
454
|
+
inputs = ast.literal_eval(input_str)
|
455
|
+
except Exception:
|
456
|
+
inputs = input_str
|
457
|
+
|
458
|
+
self._start_span(
|
459
|
+
span_name=name or self._assign_span_name(serialized, "tool"),
|
460
|
+
parent_run_id=parent_run_id,
|
461
|
+
span_type=SpanType.TOOL,
|
462
|
+
run_id=run_id,
|
463
|
+
inputs=inputs,
|
464
|
+
attributes=kwargs,
|
465
|
+
)
|
466
|
+
|
467
|
+
def on_tool_end(self, output: Any, *, run_id: UUID, **kwargs: Any):
|
468
|
+
"""Run when tool ends running."""
|
469
|
+
tool_span = self._get_span_by_run_id(run_id)
|
470
|
+
self._end_span(run_id, tool_span, outputs=output)
|
471
|
+
|
472
|
+
def on_tool_error(
|
473
|
+
self,
|
474
|
+
error: BaseException,
|
475
|
+
*,
|
476
|
+
run_id: UUID,
|
477
|
+
**kwargs: Any,
|
478
|
+
):
|
479
|
+
"""Run when tool errors."""
|
480
|
+
tool_span = self._get_span_by_run_id(run_id)
|
481
|
+
tool_span.add_event(SpanEvent.from_exception(error))
|
482
|
+
self._end_span(run_id, tool_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
|
483
|
+
|
484
|
+
def on_retriever_start(
|
485
|
+
self,
|
486
|
+
serialized: dict[str, Any],
|
487
|
+
query: str,
|
488
|
+
*,
|
489
|
+
run_id: UUID,
|
490
|
+
parent_run_id: Optional[UUID] = None,
|
491
|
+
tags: Optional[list[str]] = None,
|
492
|
+
metadata: Optional[dict[str, Any]] = None,
|
493
|
+
name: Optional[str] = None,
|
494
|
+
**kwargs: Any,
|
495
|
+
):
|
496
|
+
"""Run when Retriever starts running."""
|
497
|
+
if metadata:
|
498
|
+
kwargs.update({"metadata": metadata})
|
499
|
+
self._start_span(
|
500
|
+
span_name=name or self._assign_span_name(serialized, "retriever"),
|
501
|
+
parent_run_id=parent_run_id,
|
502
|
+
span_type=SpanType.RETRIEVER,
|
503
|
+
run_id=run_id,
|
504
|
+
inputs=query,
|
505
|
+
attributes=kwargs,
|
506
|
+
)
|
507
|
+
|
508
|
+
def on_retriever_end(self, documents: Sequence[Document], *, run_id: UUID, **kwargs: Any):
|
509
|
+
"""Run when Retriever ends running."""
|
510
|
+
retriever_span = self._get_span_by_run_id(run_id)
|
511
|
+
try:
|
512
|
+
# attempt to convert documents to MlflowDocument
|
513
|
+
documents = [MlflowDocument.from_langchain_document(doc) for doc in documents]
|
514
|
+
except Exception as e:
|
515
|
+
_logger.debug(
|
516
|
+
f"Failed to convert LangChain Document to MLflow Document: {e}",
|
517
|
+
exc_info=True,
|
518
|
+
)
|
519
|
+
self._end_span(
|
520
|
+
run_id,
|
521
|
+
retriever_span,
|
522
|
+
outputs=documents,
|
523
|
+
)
|
524
|
+
|
525
|
+
def on_retriever_error(
|
526
|
+
self,
|
527
|
+
error: BaseException,
|
528
|
+
*,
|
529
|
+
run_id: UUID,
|
530
|
+
**kwargs: Any,
|
531
|
+
):
|
532
|
+
"""Run when Retriever errors."""
|
533
|
+
retriever_span = self._get_span_by_run_id(run_id)
|
534
|
+
retriever_span.add_event(SpanEvent.from_exception(error))
|
535
|
+
self._end_span(run_id, retriever_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
|
536
|
+
|
537
|
+
def on_agent_action(
|
538
|
+
self,
|
539
|
+
action: AgentAction,
|
540
|
+
*,
|
541
|
+
run_id: UUID,
|
542
|
+
**kwargs: Any,
|
543
|
+
) -> Any:
|
544
|
+
"""
|
545
|
+
Run on agent action.
|
546
|
+
|
547
|
+
NB: Agent action doesn't create a new LangChain Run, so instead of creating a new span,
|
548
|
+
an action will be recorded as an event of the existing span created by a parent chain.
|
549
|
+
"""
|
550
|
+
span = self._get_span_by_run_id(run_id)
|
551
|
+
span.add_event(
|
552
|
+
SpanEvent(
|
553
|
+
name="agent_action",
|
554
|
+
attributes={
|
555
|
+
"tool": action.tool,
|
556
|
+
"tool_input": dumps(action.tool_input),
|
557
|
+
"log": action.log,
|
558
|
+
},
|
559
|
+
)
|
560
|
+
)
|
561
|
+
|
562
|
+
def on_agent_finish(
|
563
|
+
self,
|
564
|
+
finish: AgentFinish,
|
565
|
+
*,
|
566
|
+
run_id: UUID,
|
567
|
+
**kwargs: Any,
|
568
|
+
) -> Any:
|
569
|
+
"""Run on agent end."""
|
570
|
+
span = self._get_span_by_run_id(run_id)
|
571
|
+
span.add_event(
|
572
|
+
SpanEvent(
|
573
|
+
name="agent_finish",
|
574
|
+
attributes={"return_values": dumps(finish.return_values), "log": finish.log},
|
575
|
+
)
|
576
|
+
)
|
577
|
+
|
578
|
+
def on_text(
|
579
|
+
self,
|
580
|
+
text: str,
|
581
|
+
*,
|
582
|
+
run_id: UUID,
|
583
|
+
parent_run_id: Optional[UUID] = None,
|
584
|
+
**kwargs: Any,
|
585
|
+
) -> Any:
|
586
|
+
"""Run on arbitrary text."""
|
587
|
+
try:
|
588
|
+
span = self._get_span_by_run_id(run_id)
|
589
|
+
except MlflowException:
|
590
|
+
_logger.warning("Span not found for text event. Skipping text event logging.")
|
591
|
+
else:
|
592
|
+
span.add_event(
|
593
|
+
SpanEvent(
|
594
|
+
"text",
|
595
|
+
attributes={"text": text},
|
596
|
+
)
|
597
|
+
)
|