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,444 @@
|
|
1
|
+
import importlib
|
2
|
+
import inspect
|
3
|
+
import logging
|
4
|
+
import warnings
|
5
|
+
from typing import Any, Generator, Optional
|
6
|
+
|
7
|
+
from packaging import version
|
8
|
+
|
9
|
+
from mlflow.models.resources import (
|
10
|
+
DatabricksFunction,
|
11
|
+
DatabricksServingEndpoint,
|
12
|
+
DatabricksSQLWarehouse,
|
13
|
+
DatabricksVectorSearchIndex,
|
14
|
+
Resource,
|
15
|
+
)
|
16
|
+
|
17
|
+
_logger = logging.getLogger(__name__)
|
18
|
+
|
19
|
+
|
20
|
+
def _get_embedding_model_endpoint_names(index):
|
21
|
+
embedding_model_endpoint_names = []
|
22
|
+
desc = index.describe()
|
23
|
+
delta_sync_index_spec = desc.get("delta_sync_index_spec", {})
|
24
|
+
embedding_source_columns = delta_sync_index_spec.get("embedding_source_columns", [])
|
25
|
+
for column in embedding_source_columns:
|
26
|
+
embedding_model_endpoint_name = column.get("embedding_model_endpoint_name", None)
|
27
|
+
if embedding_model_endpoint_name:
|
28
|
+
embedding_model_endpoint_names.append(embedding_model_endpoint_name)
|
29
|
+
return embedding_model_endpoint_names
|
30
|
+
|
31
|
+
|
32
|
+
def _get_vectorstore_from_retriever(retriever) -> Generator[Resource, None, None]:
|
33
|
+
vectorstore = getattr(retriever, "vectorstore", None)
|
34
|
+
if _isinstance_with_multiple_modules(
|
35
|
+
vectorstore,
|
36
|
+
"DatabricksVectorSearch",
|
37
|
+
[
|
38
|
+
"databricks_langchain",
|
39
|
+
"langchain_databricks",
|
40
|
+
"langchain_community.vectorstores",
|
41
|
+
"langchain.vectorstores",
|
42
|
+
],
|
43
|
+
):
|
44
|
+
index = vectorstore.index
|
45
|
+
yield DatabricksVectorSearchIndex(index_name=index.name)
|
46
|
+
for embedding_endpoint in _get_embedding_model_endpoint_names(index):
|
47
|
+
yield DatabricksServingEndpoint(endpoint_name=embedding_endpoint)
|
48
|
+
|
49
|
+
embeddings = getattr(vectorstore, "embeddings", None)
|
50
|
+
if _isinstance_with_multiple_modules(
|
51
|
+
embeddings,
|
52
|
+
"DatabricksEmbeddings",
|
53
|
+
[
|
54
|
+
"databricks_langchain",
|
55
|
+
"langchain_databricks",
|
56
|
+
"langchain_community.embeddings",
|
57
|
+
"langchain.embeddings",
|
58
|
+
],
|
59
|
+
):
|
60
|
+
yield DatabricksServingEndpoint(endpoint_name=embeddings.endpoint)
|
61
|
+
|
62
|
+
|
63
|
+
def _is_langchain_community_uc_function_toolkit(obj):
|
64
|
+
try:
|
65
|
+
from langchain_community.tools.databricks import UCFunctionToolkit
|
66
|
+
except Exception:
|
67
|
+
return False
|
68
|
+
|
69
|
+
return isinstance(obj, UCFunctionToolkit)
|
70
|
+
|
71
|
+
|
72
|
+
def _is_unitycatalog_tool(obj):
|
73
|
+
try:
|
74
|
+
from unitycatalog.ai.langchain.toolkit import UnityCatalogTool
|
75
|
+
except Exception:
|
76
|
+
return False
|
77
|
+
|
78
|
+
return isinstance(obj, UnityCatalogTool)
|
79
|
+
|
80
|
+
|
81
|
+
def _extract_databricks_dependencies_from_tools(tools) -> Generator[Resource, None, None]:
|
82
|
+
if isinstance(tools, list):
|
83
|
+
warehouse_ids = set()
|
84
|
+
for tool in tools:
|
85
|
+
if _isinstance_with_multiple_modules(
|
86
|
+
tool, "BaseTool", ["langchain_core.tools", "langchain_community.tools"]
|
87
|
+
):
|
88
|
+
# Handle Retriever tools
|
89
|
+
if hasattr(tool.func, "keywords") and "retriever" in tool.func.keywords:
|
90
|
+
retriever = tool.func.keywords.get("retriever")
|
91
|
+
yield from _get_vectorstore_from_retriever(retriever)
|
92
|
+
elif _is_unitycatalog_tool(tool):
|
93
|
+
if warehouse_id := tool.client_config.get("warehouse_id"):
|
94
|
+
warehouse_ids.add(warehouse_id)
|
95
|
+
yield DatabricksFunction(function_name=tool.uc_function_name)
|
96
|
+
else:
|
97
|
+
# Tools here are a part of the BaseTool and have no attribute of a
|
98
|
+
# WarehouseID Extract the global variables of the function defined
|
99
|
+
# in the tool to get the UCFunctionToolkit Constants
|
100
|
+
nonlocal_vars = inspect.getclosurevars(tool.func).nonlocals
|
101
|
+
if "self" in nonlocal_vars and _is_langchain_community_uc_function_toolkit(
|
102
|
+
nonlocal_vars.get("self")
|
103
|
+
):
|
104
|
+
uc_function_toolkit = nonlocal_vars.get("self")
|
105
|
+
# As we are iterating through each tool, adding a warehouse id everytime
|
106
|
+
# is a duplicative resource. Use a set to dedup warehouse ids and add
|
107
|
+
# them in the end
|
108
|
+
warehouse_ids.add(uc_function_toolkit.warehouse_id)
|
109
|
+
|
110
|
+
# In langchain the names of the tools are modified to have underscores:
|
111
|
+
# main.catalog.test_func -> main_catalog_test_func
|
112
|
+
# The original name of the tool is stored as the key in the tools
|
113
|
+
# dictionary. This code finds the correct tool and extract the key
|
114
|
+
langchain_tool_name = tool.name
|
115
|
+
filtered_tool_names = [
|
116
|
+
tool_name
|
117
|
+
for tool_name, uc_tool in uc_function_toolkit.tools.items()
|
118
|
+
if uc_tool.name == langchain_tool_name
|
119
|
+
]
|
120
|
+
# This should always have the length 1
|
121
|
+
for tool_name in filtered_tool_names:
|
122
|
+
yield DatabricksFunction(function_name=tool_name)
|
123
|
+
# Add the deduped warehouse ids
|
124
|
+
for warehouse_id in warehouse_ids:
|
125
|
+
yield DatabricksSQLWarehouse(warehouse_id=warehouse_id)
|
126
|
+
|
127
|
+
|
128
|
+
def _extract_databricks_dependencies_from_retriever(retriever) -> Generator[Resource, None, None]:
|
129
|
+
# ContextualCompressionRetriever uses attribute "base_retriever"
|
130
|
+
if hasattr(retriever, "base_retriever"):
|
131
|
+
retriever = getattr(retriever, "base_retriever", None)
|
132
|
+
|
133
|
+
# Most other retrievers use attribute "retriever"
|
134
|
+
if hasattr(retriever, "retriever"):
|
135
|
+
retriever = getattr(retriever, "retriever", None)
|
136
|
+
|
137
|
+
# EnsembleRetriever uses attribute "retrievers" for multiple retrievers
|
138
|
+
if hasattr(retriever, "retrievers"):
|
139
|
+
retriever = getattr(retriever, "retrievers", None)
|
140
|
+
|
141
|
+
# If there are multiple retrievers, we iterate over them to get dependencies from each of them
|
142
|
+
if isinstance(retriever, list):
|
143
|
+
for single_retriever in retriever:
|
144
|
+
yield from _get_vectorstore_from_retriever(single_retriever)
|
145
|
+
else:
|
146
|
+
yield from _get_vectorstore_from_retriever(retriever)
|
147
|
+
|
148
|
+
|
149
|
+
def _extract_databricks_dependencies_from_llm(llm) -> Generator[Resource, None, None]:
|
150
|
+
if _isinstance_with_multiple_modules(
|
151
|
+
llm, "Databricks", ["langchain.llms", "langchain_community.llms"]
|
152
|
+
):
|
153
|
+
yield DatabricksServingEndpoint(endpoint_name=llm.endpoint_name)
|
154
|
+
|
155
|
+
|
156
|
+
def _extract_databricks_dependencies_from_chat_model(chat_model) -> Generator[Resource, None, None]:
|
157
|
+
if _isinstance_with_multiple_modules(
|
158
|
+
chat_model,
|
159
|
+
"ChatDatabricks",
|
160
|
+
[
|
161
|
+
"databricks_langchain",
|
162
|
+
"langchain_databricks",
|
163
|
+
"langchain.chat_models",
|
164
|
+
"langchain_community.chat_models",
|
165
|
+
],
|
166
|
+
):
|
167
|
+
yield DatabricksServingEndpoint(endpoint_name=chat_model.endpoint)
|
168
|
+
|
169
|
+
|
170
|
+
def _extract_databricks_dependencies_from_tool_nodes(tool_node) -> Generator[Resource, None, None]:
|
171
|
+
try:
|
172
|
+
try:
|
173
|
+
# LangGraph >= 0.3
|
174
|
+
from langgraph.prebuilt import ToolNode
|
175
|
+
except ImportError:
|
176
|
+
# LangGraph < 0.3
|
177
|
+
from langgraph.prebuilt.tool_node import ToolNode
|
178
|
+
|
179
|
+
if isinstance(tool_node, ToolNode):
|
180
|
+
yield from _extract_databricks_dependencies_from_tools(
|
181
|
+
list(tool_node.tools_by_name.values())
|
182
|
+
)
|
183
|
+
except ImportError:
|
184
|
+
pass
|
185
|
+
|
186
|
+
|
187
|
+
def _isinstance_with_multiple_modules(
|
188
|
+
object: Any, class_name: str, from_modules: list[str]
|
189
|
+
) -> bool:
|
190
|
+
"""
|
191
|
+
Databricks components are defined in different modules in LangChain e.g.
|
192
|
+
langchain, langchain_community, databricks_langchain due to historical migrations.
|
193
|
+
To keep backward compatibility, we need to check if the object is an instance of the
|
194
|
+
class defined in any of those different modules.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
object: The object to check
|
198
|
+
class_name: The name of the class to check
|
199
|
+
from_modules: The list of modules to import the class from.
|
200
|
+
"""
|
201
|
+
# Suppress LangChainDeprecationWarning for old imports
|
202
|
+
with warnings.catch_warnings():
|
203
|
+
warnings.simplefilter("ignore", DeprecationWarning)
|
204
|
+
|
205
|
+
for module_path in from_modules:
|
206
|
+
try:
|
207
|
+
module = importlib.import_module(module_path)
|
208
|
+
cls = getattr(module, class_name)
|
209
|
+
|
210
|
+
if cls is not None and isinstance(object, cls):
|
211
|
+
return True
|
212
|
+
except (ImportError, AttributeError):
|
213
|
+
pass
|
214
|
+
|
215
|
+
return False
|
216
|
+
|
217
|
+
|
218
|
+
_LEGACY_MODEL_ATTR_SET = {
|
219
|
+
"llm", # LLMChain
|
220
|
+
"retriever", # RetrievalQA
|
221
|
+
"llm_chain", # StuffDocumentsChain, MapRerankDocumentsChain, MapReduceDocumentsChain
|
222
|
+
"question_generator", # BaseConversationalRetrievalChain
|
223
|
+
"initial_llm_chain", # RefineDocumentsChain
|
224
|
+
"refine_llm_chain", # RefineDocumentsChain
|
225
|
+
"combine_documents_chain", # RetrievalQA, ReduceDocumentsChain
|
226
|
+
"combine_docs_chain", # BaseConversationalRetrievalChain
|
227
|
+
"collapse_documents_chain", # ReduceDocumentsChain,
|
228
|
+
"agent", # Agent,
|
229
|
+
"tools", # Tools
|
230
|
+
}
|
231
|
+
|
232
|
+
|
233
|
+
def _extract_dependency_list_from_lc_model(lc_model) -> Generator[Resource, None, None]:
|
234
|
+
"""
|
235
|
+
This function contains the logic to examine a non-Runnable component of a langchain model.
|
236
|
+
The logic here does not cover all legacy chains. If you need to support a custom chain,
|
237
|
+
you need to monkey patch this function.
|
238
|
+
"""
|
239
|
+
if lc_model is None:
|
240
|
+
return
|
241
|
+
|
242
|
+
# leaf node
|
243
|
+
yield from _extract_databricks_dependencies_from_chat_model(lc_model)
|
244
|
+
yield from _extract_databricks_dependencies_from_retriever(lc_model)
|
245
|
+
yield from _extract_databricks_dependencies_from_llm(lc_model)
|
246
|
+
yield from _extract_databricks_dependencies_from_tools(lc_model)
|
247
|
+
yield from _extract_databricks_dependencies_from_tool_nodes(lc_model)
|
248
|
+
|
249
|
+
# recursively inspect legacy chain
|
250
|
+
for attr_name in _LEGACY_MODEL_ATTR_SET:
|
251
|
+
yield from _extract_dependency_list_from_lc_model(getattr(lc_model, attr_name, None))
|
252
|
+
|
253
|
+
|
254
|
+
def _traverse_runnable(
|
255
|
+
lc_model,
|
256
|
+
visited: Optional[set[int]] = None,
|
257
|
+
) -> Generator[Resource, None, None]:
|
258
|
+
"""
|
259
|
+
This function contains the logic to traverse a langchain_core.runnables.RunnableSerializable
|
260
|
+
object. It first inspects the current object using _extract_dependency_list_from_lc_model
|
261
|
+
and then, if the current object is a Runnable, it recursively inspects its children returned
|
262
|
+
by lc_model.get_graph().nodes.values().
|
263
|
+
This function supports arbitrary LCEL chain.
|
264
|
+
"""
|
265
|
+
import pydantic
|
266
|
+
from langchain_core.runnables import Runnable, RunnableLambda
|
267
|
+
|
268
|
+
visited = visited or set()
|
269
|
+
current_object_id = id(lc_model)
|
270
|
+
if current_object_id in visited:
|
271
|
+
return
|
272
|
+
|
273
|
+
# Visit the current object
|
274
|
+
visited.add(current_object_id)
|
275
|
+
yield from _extract_dependency_list_from_lc_model(lc_model)
|
276
|
+
|
277
|
+
if isinstance(lc_model, Runnable):
|
278
|
+
# Visit the returned graph
|
279
|
+
if isinstance(lc_model, RunnableLambda) and version.parse(
|
280
|
+
pydantic.version.VERSION
|
281
|
+
) >= version.parse("2.0"):
|
282
|
+
nodes = _get_nodes_from_runnable_lambda(lc_model)
|
283
|
+
else:
|
284
|
+
nodes = _get_nodes_from_runnable_callable(lc_model)
|
285
|
+
# If no nodes are found continue with the default behaviour
|
286
|
+
if len(nodes) == 0:
|
287
|
+
nodes = lc_model.get_graph().nodes.values()
|
288
|
+
|
289
|
+
for node in nodes:
|
290
|
+
yield from _traverse_runnable(node.data, visited)
|
291
|
+
else:
|
292
|
+
# No-op for non-runnable, if any
|
293
|
+
pass
|
294
|
+
|
295
|
+
|
296
|
+
def _get_deps_from_closures(lc_model):
|
297
|
+
"""
|
298
|
+
In some cases, the dependency extraction of Runnable Lambda fails because the call
|
299
|
+
`inspect.getsource(func)` can fail. This causes deps of RunnableLambda to be empty.
|
300
|
+
Therefore this method adds an additional way of getting dependencies through
|
301
|
+
closure variables.
|
302
|
+
|
303
|
+
TODO: Remove when issue gets resolved: https://github.com/langchain-ai/langchain/issues/27970
|
304
|
+
"""
|
305
|
+
if not hasattr(lc_model, "func"):
|
306
|
+
return []
|
307
|
+
|
308
|
+
try:
|
309
|
+
from langchain_core.runnables import Runnable
|
310
|
+
|
311
|
+
closure = inspect.getclosurevars(lc_model.func)
|
312
|
+
candidates = {**closure.globals, **closure.nonlocals}
|
313
|
+
deps = []
|
314
|
+
|
315
|
+
# This code is taken from Langchain deps here: https://github.com/langchain-ai/langchain/blob/14f182795312f01985344576b5199681683641e1/libs/core/langchain_core/runnables/base.py#L4481
|
316
|
+
for _, v in candidates.items():
|
317
|
+
if isinstance(v, Runnable):
|
318
|
+
deps.append(v)
|
319
|
+
elif isinstance(getattr(v, "__self__", None), Runnable):
|
320
|
+
deps.append(v.__self__)
|
321
|
+
|
322
|
+
return deps
|
323
|
+
except Exception:
|
324
|
+
return []
|
325
|
+
|
326
|
+
|
327
|
+
def _get_nodes_from_runnable_lambda(lc_model):
|
328
|
+
"""
|
329
|
+
This is a workaround for the LangGraph issue: https://github.com/langchain-ai/langgraph/issues/1856
|
330
|
+
|
331
|
+
For RunnableLambda, we calling lc_model.get_graph() to get the nodes, which inspect
|
332
|
+
the input and output schema using wrapped function's type annotation. However, the
|
333
|
+
prebuilt graph (e.g. create_react_agent) from LangGraph uses typing.TypeDict annotation,
|
334
|
+
which is not supported by Pydantic V2 on Python < 3.12. If we try to inspect such
|
335
|
+
function, it will raise the following error:
|
336
|
+
|
337
|
+
pydantic.errors.PydanticUserError: Please use `typing_extensions.TypedDict`
|
338
|
+
instead of`typing.TypedDict` on Python < 3.12. For further information visit
|
339
|
+
https://errors.pydantic.dev/2.9/u/typed-dict-version
|
340
|
+
|
341
|
+
Therefore, we cannot use get_graph() for RunnableLambda until LangGraph fixes this issue.
|
342
|
+
Luckily, we are not interested in the input/output nodes for extracting databricks
|
343
|
+
dependencies. We only care about lc_models.deps, which contains the components that
|
344
|
+
the RunnableLambda depends on. Therefore, this function extracts the necessary parts
|
345
|
+
from the original get_graph() function, dropping the input/output related logic.
|
346
|
+
https://github.com/langchain-ai/langchain/blob/2ea5f60cc5747a334550273a5dba1b70b11414c1/libs/core/langchain_core/runnables/base.py#L4493C1-L4512C46
|
347
|
+
"""
|
348
|
+
|
349
|
+
if deps := lc_model.deps or _get_deps_from_closures(lc_model):
|
350
|
+
nodes = []
|
351
|
+
for dep in deps:
|
352
|
+
dep_graph = dep.get_graph()
|
353
|
+
dep_graph.trim_first_node()
|
354
|
+
dep_graph.trim_last_node()
|
355
|
+
nodes.extend(dep_graph.nodes.values())
|
356
|
+
else:
|
357
|
+
nodes = lc_model.get_graph().nodes.values()
|
358
|
+
return nodes
|
359
|
+
|
360
|
+
|
361
|
+
def _get_nodes_from_runnable_callable(lc_model):
|
362
|
+
"""
|
363
|
+
RunnableLambda has a `deps` property which goes through the function and extracts a
|
364
|
+
ny dependencies. RunnableCallable does not have this property so we cannot derive all
|
365
|
+
the dependencies from the function. This helper method also looks into the function of the
|
366
|
+
callable to retrieve these dependencies.
|
367
|
+
|
368
|
+
The code here is from: https://github.com/langchain-ai/langchain/blob/12fea5b868edd12b0d576e7f8bfc922d0167eeab/libs/core/langchain_core/runnables/base.py#L4467
|
369
|
+
"""
|
370
|
+
|
371
|
+
# If Runnable Callable is not importable or if the lc_model is not an instance
|
372
|
+
# of RunnableCallable return early
|
373
|
+
try:
|
374
|
+
from langchain_core.runnables import Runnable
|
375
|
+
from langchain_core.runnables.utils import get_function_nonlocals
|
376
|
+
from langgraph.utils.runnable import RunnableCallable
|
377
|
+
|
378
|
+
if not isinstance(lc_model, RunnableCallable):
|
379
|
+
return []
|
380
|
+
except ImportError:
|
381
|
+
return []
|
382
|
+
|
383
|
+
if hasattr(lc_model, "func"):
|
384
|
+
objects = get_function_nonlocals(lc_model.func)
|
385
|
+
elif hasattr(lc_model, "afunc"):
|
386
|
+
objects = get_function_nonlocals(lc_model.afunc)
|
387
|
+
else:
|
388
|
+
objects = []
|
389
|
+
|
390
|
+
deps = []
|
391
|
+
for obj in objects:
|
392
|
+
if isinstance(obj, Runnable):
|
393
|
+
deps.append(obj)
|
394
|
+
elif isinstance(getattr(obj, "__self__", None), Runnable):
|
395
|
+
deps.append(obj.__self__)
|
396
|
+
|
397
|
+
nodes = []
|
398
|
+
for dep in deps:
|
399
|
+
dep_graph = dep.get_graph()
|
400
|
+
dep_graph.trim_first_node()
|
401
|
+
dep_graph.trim_last_node()
|
402
|
+
nodes.extend(dep_graph.nodes.values())
|
403
|
+
return nodes
|
404
|
+
|
405
|
+
|
406
|
+
def _detect_databricks_dependencies(lc_model, log_errors_as_warnings=True) -> list[Resource]:
|
407
|
+
"""
|
408
|
+
Detects the databricks dependencies of a langchain model and returns a list of
|
409
|
+
detected endpoint names and index names.
|
410
|
+
|
411
|
+
lc_model can be an arbitrary `chain that is built with LCEL <https://python.langchain.com/docs/modules/chains#lcel-chains>`_,
|
412
|
+
which is a langchain_core.runnables.RunnableSerializable.
|
413
|
+
`Legacy chains <https://python.langchain.com/docs/modules/chains#legacy-chains>`_ have limited
|
414
|
+
support. Only RetrievalQA, StuffDocumentsChain, ReduceDocumentsChain, RefineDocumentsChain,
|
415
|
+
MapRerankDocumentsChain, MapReduceDocumentsChain, BaseConversationalRetrievalChain are
|
416
|
+
supported. If you need to support a custom chain, you need to monkey patch
|
417
|
+
the function mlflow.langchain.databricks_dependencies._extract_dependency_list_from_lc_model().
|
418
|
+
|
419
|
+
For an LCEL chain, all the langchain_core.runnables.RunnableSerializable nodes will be
|
420
|
+
traversed.
|
421
|
+
|
422
|
+
If a retriever is found, it will be used to extract the databricks vector search and embeddings
|
423
|
+
dependencies.
|
424
|
+
If an llm is found, it will be used to extract the databricks llm dependencies.
|
425
|
+
If a chat_model is found, it will be used to extract the databricks chat dependencies.
|
426
|
+
"""
|
427
|
+
try:
|
428
|
+
dependency_list = list(_traverse_runnable(lc_model))
|
429
|
+
# Filter out duplicate dependencies so same dependencies are not added multiple times
|
430
|
+
# We can't use set here as the object is not hashable so we need to filter it out manually.
|
431
|
+
unique_dependencies = []
|
432
|
+
for dependency in dependency_list:
|
433
|
+
if dependency not in unique_dependencies:
|
434
|
+
unique_dependencies.append(dependency)
|
435
|
+
return unique_dependencies
|
436
|
+
except Exception:
|
437
|
+
if log_errors_as_warnings:
|
438
|
+
_logger.warning(
|
439
|
+
"Unable to detect Databricks dependencies. "
|
440
|
+
"Set logging level to DEBUG to see the full traceback."
|
441
|
+
)
|
442
|
+
_logger.debug("", exc_info=True)
|
443
|
+
return []
|
444
|
+
raise
|