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,527 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import os
|
4
|
+
import re
|
5
|
+
import warnings
|
6
|
+
from pathlib import Path
|
7
|
+
from typing import TYPE_CHECKING, Union
|
8
|
+
|
9
|
+
import cloudpickle
|
10
|
+
import yaml
|
11
|
+
|
12
|
+
from mlflow.exceptions import MlflowException
|
13
|
+
from mlflow.langchain.utils.logging import (
|
14
|
+
_BASE_LOAD_KEY,
|
15
|
+
_CONFIG_LOAD_KEY,
|
16
|
+
_MODEL_DATA_FOLDER_NAME,
|
17
|
+
_MODEL_DATA_KEY,
|
18
|
+
_MODEL_DATA_PKL_FILE_NAME,
|
19
|
+
_MODEL_DATA_YAML_FILE_NAME,
|
20
|
+
_MODEL_LOAD_KEY,
|
21
|
+
_MODEL_TYPE_KEY,
|
22
|
+
_PICKLE_LOAD_KEY,
|
23
|
+
_RUNNABLE_LOAD_KEY,
|
24
|
+
_load_base_lcs,
|
25
|
+
_load_from_json,
|
26
|
+
_load_from_pickle,
|
27
|
+
_load_from_yaml,
|
28
|
+
_patch_loader,
|
29
|
+
_save_base_lcs,
|
30
|
+
_validate_and_prepare_lc_model_or_path,
|
31
|
+
base_lc_types,
|
32
|
+
custom_type_to_loader_dict,
|
33
|
+
get_unsupported_model_message,
|
34
|
+
lc_runnable_assign_types,
|
35
|
+
lc_runnable_binding_types,
|
36
|
+
lc_runnable_branch_types,
|
37
|
+
lc_runnable_with_steps_types,
|
38
|
+
lc_runnables_types,
|
39
|
+
patch_langchain_type_to_cls_dict,
|
40
|
+
picklable_runnable_types,
|
41
|
+
)
|
42
|
+
|
43
|
+
if TYPE_CHECKING:
|
44
|
+
from langchain.schema.runnable import Runnable
|
45
|
+
|
46
|
+
_STEPS_FOLDER_NAME = "steps"
|
47
|
+
_RUNNABLE_STEPS_FILE_NAME = "steps.yaml"
|
48
|
+
_BRANCHES_FOLDER_NAME = "branches"
|
49
|
+
_MAPPER_FOLDER_NAME = "mapper"
|
50
|
+
_RUNNABLE_BRANCHES_FILE_NAME = "branches.yaml"
|
51
|
+
_DEFAULT_BRANCH_NAME = "default"
|
52
|
+
_RUNNABLE_BINDING_CONF_FILE_NAME = "binding_conf.yaml"
|
53
|
+
|
54
|
+
|
55
|
+
@patch_langchain_type_to_cls_dict
|
56
|
+
def _load_model_from_config(path, model_config):
|
57
|
+
from langchain.chains.loading import type_to_loader_dict as chains_type_to_loader_dict
|
58
|
+
from langchain.llms import get_type_to_cls_dict as llms_get_type_to_cls_dict
|
59
|
+
|
60
|
+
try:
|
61
|
+
from langchain.prompts.loading import type_to_loader_dict as prompts_types
|
62
|
+
except ImportError:
|
63
|
+
prompts_types = {"prompt", "few_shot_prompt"}
|
64
|
+
|
65
|
+
config_path = os.path.join(path, model_config.get(_MODEL_DATA_KEY, _MODEL_DATA_YAML_FILE_NAME))
|
66
|
+
# Load runnables from config file
|
67
|
+
if config_path.endswith(".yaml"):
|
68
|
+
config = _load_from_yaml(config_path)
|
69
|
+
elif config_path.endswith(".json"):
|
70
|
+
config = _load_from_json(config_path)
|
71
|
+
else:
|
72
|
+
raise MlflowException(
|
73
|
+
f"Cannot load runnable without a config file. Got path {config_path}."
|
74
|
+
)
|
75
|
+
_type = config.get("_type")
|
76
|
+
if _type in chains_type_to_loader_dict:
|
77
|
+
from langchain.chains.loading import load_chain
|
78
|
+
|
79
|
+
return _patch_loader(load_chain)(config_path)
|
80
|
+
elif _type in prompts_types:
|
81
|
+
from langchain.prompts.loading import load_prompt
|
82
|
+
|
83
|
+
return load_prompt(config_path)
|
84
|
+
elif _type in llms_get_type_to_cls_dict():
|
85
|
+
from langchain_community.llms.loading import load_llm
|
86
|
+
|
87
|
+
return _patch_loader(load_llm)(config_path)
|
88
|
+
elif _type in custom_type_to_loader_dict():
|
89
|
+
return custom_type_to_loader_dict()[_type](config)
|
90
|
+
raise MlflowException(f"Unsupported type {_type} for loading.")
|
91
|
+
|
92
|
+
|
93
|
+
def _load_model_from_path(path: str, model_config=None):
|
94
|
+
model_load_fn = model_config.get(_MODEL_LOAD_KEY)
|
95
|
+
if model_load_fn == _RUNNABLE_LOAD_KEY:
|
96
|
+
return _load_runnables(path, model_config)
|
97
|
+
if model_load_fn == _BASE_LOAD_KEY:
|
98
|
+
return _load_base_lcs(path, model_config)
|
99
|
+
if model_load_fn == _CONFIG_LOAD_KEY:
|
100
|
+
return _load_model_from_config(path, model_config)
|
101
|
+
if model_load_fn == _PICKLE_LOAD_KEY:
|
102
|
+
return _load_from_pickle(os.path.join(path, model_config.get(_MODEL_DATA_KEY)))
|
103
|
+
raise MlflowException(f"Unsupported model load key {model_load_fn}")
|
104
|
+
|
105
|
+
|
106
|
+
def _validate_path(file_path: Union[str, Path]):
|
107
|
+
load_path = Path(file_path)
|
108
|
+
if not load_path.exists() or not load_path.is_dir():
|
109
|
+
raise MlflowException(
|
110
|
+
f"Path {load_path} must be an existing directory in order to load model."
|
111
|
+
)
|
112
|
+
return load_path
|
113
|
+
|
114
|
+
|
115
|
+
def _load_runnable_with_steps(file_path: Union[Path, str], model_type: str):
|
116
|
+
"""Load the model
|
117
|
+
|
118
|
+
Args:
|
119
|
+
file_path: Path to file to load the model from.
|
120
|
+
model_type: Type of the model to load.
|
121
|
+
"""
|
122
|
+
from langchain.schema.runnable import RunnableParallel, RunnableSequence
|
123
|
+
|
124
|
+
load_path = _validate_path(file_path)
|
125
|
+
|
126
|
+
steps_conf_file = load_path / _RUNNABLE_STEPS_FILE_NAME
|
127
|
+
if not steps_conf_file.exists():
|
128
|
+
raise MlflowException(
|
129
|
+
f"File {steps_conf_file} must exist in order to load runnable with steps."
|
130
|
+
)
|
131
|
+
steps_conf = _load_from_yaml(steps_conf_file)
|
132
|
+
steps_path = load_path / _STEPS_FOLDER_NAME
|
133
|
+
_validate_path(steps_path)
|
134
|
+
|
135
|
+
steps = {}
|
136
|
+
# ignore hidden files
|
137
|
+
for step in (f for f in os.listdir(steps_path) if not f.startswith(".")):
|
138
|
+
config = steps_conf.get(step)
|
139
|
+
# load model from the folder of the step
|
140
|
+
runnable = _load_model_from_path(os.path.join(steps_path, step), config)
|
141
|
+
steps[step] = runnable
|
142
|
+
|
143
|
+
if model_type == RunnableSequence.__name__:
|
144
|
+
steps = [value for _, value in sorted(steps.items(), key=lambda item: int(item[0]))]
|
145
|
+
return runnable_sequence_from_steps(steps)
|
146
|
+
if model_type == RunnableParallel.__name__:
|
147
|
+
return RunnableParallel(steps)
|
148
|
+
|
149
|
+
|
150
|
+
def runnable_sequence_from_steps(steps):
|
151
|
+
"""Construct a RunnableSequence from steps.
|
152
|
+
|
153
|
+
Args:
|
154
|
+
steps: List of steps to construct the RunnableSequence from.
|
155
|
+
"""
|
156
|
+
from langchain.schema.runnable import RunnableSequence
|
157
|
+
|
158
|
+
if len(steps) < 2:
|
159
|
+
raise ValueError(f"RunnableSequence must have at least 2 steps, got {len(steps)}.")
|
160
|
+
|
161
|
+
first, *middle, last = steps
|
162
|
+
return RunnableSequence(first=first, middle=middle, last=last)
|
163
|
+
|
164
|
+
|
165
|
+
def _load_runnable_branch(file_path: Union[Path, str]):
|
166
|
+
"""Load the model
|
167
|
+
|
168
|
+
Args:
|
169
|
+
file_path: Path to file to load the model from.
|
170
|
+
"""
|
171
|
+
from langchain.schema.runnable import RunnableBranch
|
172
|
+
|
173
|
+
load_path = _validate_path(file_path)
|
174
|
+
|
175
|
+
branches_conf_file = load_path / _RUNNABLE_BRANCHES_FILE_NAME
|
176
|
+
if not branches_conf_file.exists():
|
177
|
+
raise MlflowException(
|
178
|
+
f"File {branches_conf_file} must exist in order to load runnable with steps."
|
179
|
+
)
|
180
|
+
branches_conf = _load_from_yaml(branches_conf_file)
|
181
|
+
branches_path = load_path / _BRANCHES_FOLDER_NAME
|
182
|
+
_validate_path(branches_path)
|
183
|
+
|
184
|
+
branches = []
|
185
|
+
for branch in os.listdir(branches_path):
|
186
|
+
# load model from the folder of the branch
|
187
|
+
if branch == _DEFAULT_BRANCH_NAME:
|
188
|
+
default_branch_path = branches_path / _DEFAULT_BRANCH_NAME
|
189
|
+
default = _load_model_from_path(
|
190
|
+
default_branch_path, branches_conf.get(_DEFAULT_BRANCH_NAME)
|
191
|
+
)
|
192
|
+
else:
|
193
|
+
branch_tuple = []
|
194
|
+
for i in range(2):
|
195
|
+
config = branches_conf.get(f"{branch}-{i}")
|
196
|
+
runnable = _load_model_from_path(
|
197
|
+
os.path.join(branches_path, branch, str(i)), config
|
198
|
+
)
|
199
|
+
branch_tuple.append(runnable)
|
200
|
+
branches.append(tuple(branch_tuple))
|
201
|
+
|
202
|
+
# default branch must be the last branch
|
203
|
+
branches.append(default)
|
204
|
+
|
205
|
+
return RunnableBranch(*branches)
|
206
|
+
|
207
|
+
|
208
|
+
def _load_runnable_assign(file_path: Union[Path, str]):
|
209
|
+
"""Load the model
|
210
|
+
|
211
|
+
Args:
|
212
|
+
file_path: Path to file to load the model from.
|
213
|
+
"""
|
214
|
+
from langchain.schema.runnable.passthrough import RunnableAssign
|
215
|
+
|
216
|
+
load_path = _validate_path(file_path)
|
217
|
+
|
218
|
+
mapper_file = load_path / _MAPPER_FOLDER_NAME
|
219
|
+
_validate_path(mapper_file)
|
220
|
+
mapper = _load_runnable_with_steps(mapper_file, "RunnableParallel")
|
221
|
+
return RunnableAssign(mapper)
|
222
|
+
|
223
|
+
|
224
|
+
def _load_runnable_binding(file_path: Union[Path, str]):
|
225
|
+
"""
|
226
|
+
Load runnable binding model from the path
|
227
|
+
"""
|
228
|
+
from langchain.schema.runnable import RunnableBinding
|
229
|
+
|
230
|
+
load_path = _validate_path(file_path)
|
231
|
+
|
232
|
+
model_conf = _load_from_yaml(load_path / _RUNNABLE_BINDING_CONF_FILE_NAME)
|
233
|
+
for field, value in model_conf.items():
|
234
|
+
if _is_json_primitive(value):
|
235
|
+
model_conf[field] = value
|
236
|
+
# value is dictionary
|
237
|
+
else:
|
238
|
+
model_conf[field] = _load_model_from_path(load_path, value)
|
239
|
+
return RunnableBinding(**model_conf)
|
240
|
+
|
241
|
+
|
242
|
+
def _save_internal_runnables(runnable, path, loader_fn, persist_dir):
|
243
|
+
conf = {}
|
244
|
+
if isinstance(runnable, lc_runnables_types()):
|
245
|
+
conf[_MODEL_TYPE_KEY] = runnable.__class__.__name__
|
246
|
+
conf.update(_save_runnables(runnable, path, loader_fn, persist_dir))
|
247
|
+
elif isinstance(runnable, base_lc_types()):
|
248
|
+
lc_model = _validate_and_prepare_lc_model_or_path(runnable, loader_fn)
|
249
|
+
conf[_MODEL_TYPE_KEY] = lc_model.__class__.__name__
|
250
|
+
conf.update(_save_base_lcs(lc_model, path, loader_fn, persist_dir))
|
251
|
+
else:
|
252
|
+
conf = {
|
253
|
+
_MODEL_TYPE_KEY: runnable.__class__.__name__,
|
254
|
+
_MODEL_DATA_KEY: _MODEL_DATA_YAML_FILE_NAME,
|
255
|
+
_MODEL_LOAD_KEY: _CONFIG_LOAD_KEY,
|
256
|
+
}
|
257
|
+
model_path = path / _MODEL_DATA_YAML_FILE_NAME
|
258
|
+
|
259
|
+
_warning_if_imported_from_lc_partner_pkg(runnable)
|
260
|
+
|
261
|
+
# Save some simple runnables that langchain natively supports.
|
262
|
+
if hasattr(runnable, "save"):
|
263
|
+
runnable.save(model_path)
|
264
|
+
elif hasattr(runnable, "dict"):
|
265
|
+
runnable_dict = runnable.dict()
|
266
|
+
with open(model_path, "w") as f:
|
267
|
+
yaml.dump(runnable_dict, f, default_flow_style=False)
|
268
|
+
# if the model cannot be loaded back, then `dict` is not enough for saving.
|
269
|
+
_load_model_from_config(path, conf)
|
270
|
+
else:
|
271
|
+
raise Exception("Cannot save runnable without `save` or `dict` methods.")
|
272
|
+
return conf
|
273
|
+
|
274
|
+
|
275
|
+
_LC_PARTNER_MODULE_PATTERN = re.compile(
|
276
|
+
r"langchain_(?!core|community|experimental|cli|text-splitters)([a-z0-9-]+)$"
|
277
|
+
)
|
278
|
+
|
279
|
+
|
280
|
+
def _warning_if_imported_from_lc_partner_pkg(runnable):
|
281
|
+
"""
|
282
|
+
Issues a warning if the model contains LangChain partner packages in its requirements.
|
283
|
+
|
284
|
+
Popular integrations like OpenAI have been migrated from the central langchain-community
|
285
|
+
package to their own partner packages (e.g. langchain-openai). However, the class loading
|
286
|
+
mechanism in MLflow does not handle partner packages and always loads the community version.
|
287
|
+
This can lead to unexpected behavior because the community version is no longer maintained.
|
288
|
+
"""
|
289
|
+
module = runnable.__module__
|
290
|
+
root_module = module.split(".")[0]
|
291
|
+
if m := _LC_PARTNER_MODULE_PATTERN.match(root_module):
|
292
|
+
warnings.warn(
|
293
|
+
"Your model contains a class imported from the LangChain partner package "
|
294
|
+
f"`langchain-{m.group(1)}`. When loading the model back, MLflow will use the "
|
295
|
+
"community version of the classes instead of the partner packages, which may "
|
296
|
+
"lead to unexpected behavior. To ensure that the model is loaded correctly, "
|
297
|
+
"it is recommended to save the model with the 'model-from-code' method "
|
298
|
+
"instead: https://mlflow.org/docs/latest/models.html#models-from-code"
|
299
|
+
)
|
300
|
+
|
301
|
+
|
302
|
+
def _save_runnable_with_steps(model, file_path: Union[Path, str], loader_fn=None, persist_dir=None): # noqa: D417
|
303
|
+
"""Save the model with steps. Currently it supports saving RunnableSequence and
|
304
|
+
RunnableParallel.
|
305
|
+
|
306
|
+
If saving a RunnableSequence, steps is a list of Runnable objects. We save each step to the
|
307
|
+
subfolder named by the step index.
|
308
|
+
e.g. - model
|
309
|
+
- steps
|
310
|
+
- 0
|
311
|
+
- model.yaml
|
312
|
+
- 1
|
313
|
+
- model.pkl
|
314
|
+
- steps.yaml
|
315
|
+
If saving a RunnableParallel, steps is a dictionary of key-Runnable pairs. We save each step to
|
316
|
+
the subfolder named by the key.
|
317
|
+
e.g. - model
|
318
|
+
- steps
|
319
|
+
- context
|
320
|
+
- model.yaml
|
321
|
+
- question
|
322
|
+
- model.pkl
|
323
|
+
- steps.yaml
|
324
|
+
|
325
|
+
We save steps.yaml file to the model folder. It contains each step's model's configuration.
|
326
|
+
|
327
|
+
Args:
|
328
|
+
model: Runnable to be saved.
|
329
|
+
file_path: Path to file to save the model to.
|
330
|
+
"""
|
331
|
+
# Convert file to Path object.
|
332
|
+
save_path = Path(file_path)
|
333
|
+
save_path.mkdir(parents=True, exist_ok=True)
|
334
|
+
|
335
|
+
# Save steps into a folder
|
336
|
+
steps_path = save_path / _STEPS_FOLDER_NAME
|
337
|
+
steps_path.mkdir()
|
338
|
+
|
339
|
+
steps = get_runnable_steps(model)
|
340
|
+
if isinstance(steps, list):
|
341
|
+
generator = enumerate(steps)
|
342
|
+
elif isinstance(steps, dict):
|
343
|
+
generator = steps.items()
|
344
|
+
else:
|
345
|
+
raise MlflowException(
|
346
|
+
f"Runnable {model} steps attribute must be either a list or a dictionary. "
|
347
|
+
f"Got {type(steps).__name__}."
|
348
|
+
)
|
349
|
+
unsaved_runnables = {}
|
350
|
+
steps_conf = {}
|
351
|
+
for key, runnable in generator:
|
352
|
+
step = str(key)
|
353
|
+
# Save each step into a subfolder named by step
|
354
|
+
save_runnable_path = steps_path / step
|
355
|
+
save_runnable_path.mkdir()
|
356
|
+
try:
|
357
|
+
steps_conf[step] = _save_internal_runnables(
|
358
|
+
runnable, save_runnable_path, loader_fn, persist_dir
|
359
|
+
)
|
360
|
+
except Exception as e:
|
361
|
+
unsaved_runnables[step] = f"{runnable.get_name()} -- {e}"
|
362
|
+
|
363
|
+
if unsaved_runnables:
|
364
|
+
raise MlflowException(f"Failed to save runnable sequence: {unsaved_runnables}.")
|
365
|
+
|
366
|
+
# save steps configs
|
367
|
+
with save_path.joinpath(_RUNNABLE_STEPS_FILE_NAME).open("w") as f:
|
368
|
+
yaml.dump(steps_conf, f, default_flow_style=False)
|
369
|
+
|
370
|
+
|
371
|
+
def _save_runnable_branch(model, file_path, loader_fn, persist_dir):
|
372
|
+
"""
|
373
|
+
Save runnable branch in to path.
|
374
|
+
"""
|
375
|
+
save_path = Path(file_path)
|
376
|
+
save_path.mkdir(parents=True, exist_ok=True)
|
377
|
+
# save branches into a folder
|
378
|
+
branches_path = save_path / _BRANCHES_FOLDER_NAME
|
379
|
+
branches_path.mkdir()
|
380
|
+
|
381
|
+
unsaved_runnables = {}
|
382
|
+
branches_conf = {}
|
383
|
+
for index, branch_tuple in enumerate(model.branches):
|
384
|
+
# Save each branch into a subfolder named by index
|
385
|
+
# and save condition and runnable into subfolder
|
386
|
+
for i, runnable in enumerate(branch_tuple):
|
387
|
+
save_runnable_path = branches_path / str(index) / str(i)
|
388
|
+
save_runnable_path.mkdir(parents=True)
|
389
|
+
branches_conf[f"{index}-{i}"] = {}
|
390
|
+
|
391
|
+
try:
|
392
|
+
branches_conf[f"{index}-{i}"] = _save_internal_runnables(
|
393
|
+
runnable, save_runnable_path, loader_fn, persist_dir
|
394
|
+
)
|
395
|
+
except Exception as e:
|
396
|
+
unsaved_runnables[f"{index}-{i}"] = f"{runnable.get_name()} -- {e}"
|
397
|
+
|
398
|
+
# save default branch
|
399
|
+
default_branch_path = branches_path / _DEFAULT_BRANCH_NAME
|
400
|
+
default_branch_path.mkdir()
|
401
|
+
try:
|
402
|
+
branches_conf[_DEFAULT_BRANCH_NAME] = _save_internal_runnables(
|
403
|
+
model.default, default_branch_path, loader_fn, persist_dir
|
404
|
+
)
|
405
|
+
except Exception as e:
|
406
|
+
unsaved_runnables[_DEFAULT_BRANCH_NAME] = f"{model.default.get_name()} -- {e}"
|
407
|
+
if unsaved_runnables:
|
408
|
+
raise MlflowException(f"Failed to save runnable branch: {unsaved_runnables}.")
|
409
|
+
|
410
|
+
# save branches configs
|
411
|
+
with save_path.joinpath(_RUNNABLE_BRANCHES_FILE_NAME).open("w") as f:
|
412
|
+
yaml.dump(branches_conf, f, default_flow_style=False)
|
413
|
+
|
414
|
+
|
415
|
+
def _save_runnable_assign(model, file_path, loader_fn=None, persist_dir=None):
|
416
|
+
from langchain.schema.runnable import RunnableParallel
|
417
|
+
|
418
|
+
save_path = Path(file_path)
|
419
|
+
save_path.mkdir(parents=True, exist_ok=True)
|
420
|
+
# save mapper into a folder
|
421
|
+
mapper_path = save_path / _MAPPER_FOLDER_NAME
|
422
|
+
mapper_path.mkdir()
|
423
|
+
|
424
|
+
if not isinstance(model.mapper, RunnableParallel):
|
425
|
+
raise MlflowException(
|
426
|
+
f"Failed to save model {model} with type {model.__class__.__name__}. "
|
427
|
+
"RunnableAssign's mapper must be a RunnableParallel."
|
428
|
+
)
|
429
|
+
_save_runnable_with_steps(model.mapper, mapper_path, loader_fn, persist_dir)
|
430
|
+
|
431
|
+
|
432
|
+
def _is_json_primitive(value):
|
433
|
+
return (
|
434
|
+
value is None
|
435
|
+
or isinstance(value, (str, int, float, bool))
|
436
|
+
or (isinstance(value, list) and all(_is_json_primitive(v) for v in value))
|
437
|
+
)
|
438
|
+
|
439
|
+
|
440
|
+
def _save_runnable_binding(model, file_path, loader_fn=None, persist_dir=None):
|
441
|
+
save_path = Path(file_path)
|
442
|
+
save_path.mkdir(parents=True, exist_ok=True)
|
443
|
+
model_config = {}
|
444
|
+
|
445
|
+
# runnableBinding bound is the real runnable to be invoked
|
446
|
+
model_config["bound"] = _save_internal_runnables(model.bound, save_path, loader_fn, persist_dir)
|
447
|
+
|
448
|
+
# save other fields
|
449
|
+
for field, value in model.dict().items():
|
450
|
+
if _is_json_primitive(value):
|
451
|
+
model_config[field] = value
|
452
|
+
elif field != "bound":
|
453
|
+
model_config[field] = {
|
454
|
+
_MODEL_LOAD_KEY: _PICKLE_LOAD_KEY,
|
455
|
+
_MODEL_DATA_KEY: f"{field}.pkl",
|
456
|
+
}
|
457
|
+
_pickle_object(value, os.path.join(save_path, f"{field}.pkl"))
|
458
|
+
|
459
|
+
# save fields configs
|
460
|
+
with save_path.joinpath(_RUNNABLE_BINDING_CONF_FILE_NAME).open("w") as f:
|
461
|
+
yaml.dump(model_config, f, default_flow_style=False)
|
462
|
+
|
463
|
+
|
464
|
+
def _pickle_object(model, path: str):
|
465
|
+
if not path.endswith(".pkl"):
|
466
|
+
raise ValueError(f"File path must end with .pkl, got {path}.")
|
467
|
+
with open(path, "wb") as f:
|
468
|
+
cloudpickle.dump(model, f)
|
469
|
+
|
470
|
+
|
471
|
+
def _save_runnables(model, path, loader_fn=None, persist_dir=None):
|
472
|
+
model_data_kwargs = {
|
473
|
+
_MODEL_LOAD_KEY: _RUNNABLE_LOAD_KEY,
|
474
|
+
_MODEL_TYPE_KEY: model.__class__.__name__,
|
475
|
+
}
|
476
|
+
if isinstance(model, lc_runnable_with_steps_types()):
|
477
|
+
model_data_path = _MODEL_DATA_FOLDER_NAME
|
478
|
+
_save_runnable_with_steps(
|
479
|
+
model, os.path.join(path, model_data_path), loader_fn, persist_dir
|
480
|
+
)
|
481
|
+
elif isinstance(model, picklable_runnable_types()):
|
482
|
+
model_data_path = _MODEL_DATA_PKL_FILE_NAME
|
483
|
+
_pickle_object(model, os.path.join(path, model_data_path))
|
484
|
+
elif isinstance(model, lc_runnable_branch_types()):
|
485
|
+
model_data_path = _MODEL_DATA_FOLDER_NAME
|
486
|
+
_save_runnable_branch(model, os.path.join(path, model_data_path), loader_fn, persist_dir)
|
487
|
+
elif isinstance(model, lc_runnable_assign_types()):
|
488
|
+
model_data_path = _MODEL_DATA_FOLDER_NAME
|
489
|
+
_save_runnable_assign(model, os.path.join(path, model_data_path), loader_fn, persist_dir)
|
490
|
+
elif isinstance(model, lc_runnable_binding_types()):
|
491
|
+
model_data_path = _MODEL_DATA_FOLDER_NAME
|
492
|
+
_save_runnable_binding(model, os.path.join(path, model_data_path), loader_fn, persist_dir)
|
493
|
+
else:
|
494
|
+
raise MlflowException.invalid_parameter_value(
|
495
|
+
get_unsupported_model_message(type(model).__name__)
|
496
|
+
)
|
497
|
+
model_data_kwargs[_MODEL_DATA_KEY] = model_data_path
|
498
|
+
return model_data_kwargs
|
499
|
+
|
500
|
+
|
501
|
+
def _load_runnables(path, conf):
|
502
|
+
model_type = conf.get(_MODEL_TYPE_KEY)
|
503
|
+
model_data = conf.get(_MODEL_DATA_KEY, _MODEL_DATA_YAML_FILE_NAME)
|
504
|
+
if model_type in (x.__name__ for x in lc_runnable_with_steps_types()):
|
505
|
+
return _load_runnable_with_steps(os.path.join(path, model_data), model_type)
|
506
|
+
if (
|
507
|
+
model_type in (x.__name__ for x in picklable_runnable_types())
|
508
|
+
or model_data == _MODEL_DATA_PKL_FILE_NAME
|
509
|
+
):
|
510
|
+
return _load_from_pickle(os.path.join(path, model_data))
|
511
|
+
if model_type in (x.__name__ for x in lc_runnable_branch_types()):
|
512
|
+
return _load_runnable_branch(os.path.join(path, model_data))
|
513
|
+
if model_type in (x.__name__ for x in lc_runnable_assign_types()):
|
514
|
+
return _load_runnable_assign(os.path.join(path, model_data))
|
515
|
+
if model_type in (x.__name__ for x in lc_runnable_binding_types()):
|
516
|
+
return _load_runnable_binding(os.path.join(path, model_data))
|
517
|
+
raise MlflowException.invalid_parameter_value(get_unsupported_model_message(model_type))
|
518
|
+
|
519
|
+
|
520
|
+
def get_runnable_steps(model: Runnable):
|
521
|
+
try:
|
522
|
+
return model.steps
|
523
|
+
except AttributeError:
|
524
|
+
# RunnableParallel stores steps as `steps__` attribute since version 0.16.0, while it was
|
525
|
+
# stored as `steps` attribute before that and other runnables like RunnableSequence still
|
526
|
+
# has `steps` property.
|
527
|
+
return model.steps__
|