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,144 @@
|
|
1
|
+
import json
|
2
|
+
import os
|
3
|
+
import subprocess
|
4
|
+
import tarfile
|
5
|
+
|
6
|
+
from mlflow.utils.databricks_utils import is_in_databricks_runtime
|
7
|
+
from mlflow.utils.file_utils import get_or_create_tmp_dir
|
8
|
+
|
9
|
+
_CACHE_MAP_FILE_NAME = "db_connect_artifact_cache.json"
|
10
|
+
|
11
|
+
|
12
|
+
class DBConnectArtifactCache:
|
13
|
+
"""
|
14
|
+
Manages Databricks Connect artifacts cache.
|
15
|
+
Note it doesn't support OSS Spark Connect.
|
16
|
+
|
17
|
+
This class can be used in the following environment:
|
18
|
+
- Databricks shared cluster python notebook REPL
|
19
|
+
- Databricks Serverless python notebook REPL
|
20
|
+
- Databricks connect client python REPL that connects to remote Databricks Serverless
|
21
|
+
- Databricks connect client python REPL that connects to remote Databricks shared cluster
|
22
|
+
|
23
|
+
.. code-block:: python
|
24
|
+
:caption: Example
|
25
|
+
|
26
|
+
# client side code
|
27
|
+
db_artifact_cache = DBConnectArtifactCache.get_or_create()
|
28
|
+
db_artifact_cache.add_artifact_archive("archive1", "/tmp/archive1.tar.gz")
|
29
|
+
|
30
|
+
|
31
|
+
@pandas_udf(...)
|
32
|
+
def my_udf(x):
|
33
|
+
# we can get the unpacked archive files in `archive1_unpacked_dir`
|
34
|
+
archive1_unpacked_dir = db_artifact_cache.get("archive1")
|
35
|
+
"""
|
36
|
+
|
37
|
+
_global_cache = None
|
38
|
+
|
39
|
+
@staticmethod
|
40
|
+
def get_or_create(spark):
|
41
|
+
if (
|
42
|
+
DBConnectArtifactCache._global_cache is None
|
43
|
+
or spark is not DBConnectArtifactCache._global_cache._spark
|
44
|
+
):
|
45
|
+
DBConnectArtifactCache._global_cache = DBConnectArtifactCache(spark)
|
46
|
+
cache_file = os.path.join(get_or_create_tmp_dir(), _CACHE_MAP_FILE_NAME)
|
47
|
+
if is_in_databricks_runtime() and os.path.exists(cache_file):
|
48
|
+
# In databricks runtime (shared cluster or Serverless), when you restart the
|
49
|
+
# notebook REPL by %restart_python or dbutils.library.restartPython(), the
|
50
|
+
# DBConnect session is still preserved. So in this case, we can reuse the cached
|
51
|
+
# artifact files.
|
52
|
+
# So that when adding artifact, the cache map is serialized to local disk file
|
53
|
+
# `db_connect_artifact_cache.json` and after REPL restarts,
|
54
|
+
# `DBConnectArtifactCache` restores the cache map by loading data from the file.
|
55
|
+
with open(cache_file) as f:
|
56
|
+
DBConnectArtifactCache._global_cache._cache = json.load(f)
|
57
|
+
return DBConnectArtifactCache._global_cache
|
58
|
+
|
59
|
+
def __init__(self, spark):
|
60
|
+
self._spark = spark
|
61
|
+
self._cache = {}
|
62
|
+
|
63
|
+
def __getstate__(self):
|
64
|
+
"""
|
65
|
+
The `DBConnectArtifactCache` instance is created in Databricks Connect client side,
|
66
|
+
and it will be pickled to Databricks Connect UDF sandbox
|
67
|
+
(see `get_unpacked_artifact_dir` method), but Spark Connect client object is
|
68
|
+
not pickle-able, we need to skip this field.
|
69
|
+
"""
|
70
|
+
state = self.__dict__.copy()
|
71
|
+
# Don't pickle `_spark`
|
72
|
+
del state["_spark"]
|
73
|
+
return state
|
74
|
+
|
75
|
+
def __setstate__(self, state):
|
76
|
+
self.__dict__.update(state)
|
77
|
+
self._spark = None
|
78
|
+
|
79
|
+
def has_cache_key(self, cache_key):
|
80
|
+
return cache_key in self._cache
|
81
|
+
|
82
|
+
def add_artifact_archive(self, cache_key, artifact_archive_path):
|
83
|
+
"""
|
84
|
+
Add an artifact archive file to Databricks connect cache.
|
85
|
+
The archive file must be 'tar.gz' format.
|
86
|
+
You can only call this method in Databricks Connect client side.
|
87
|
+
"""
|
88
|
+
if not artifact_archive_path.endswith(".tar.gz"):
|
89
|
+
raise RuntimeError(
|
90
|
+
"'add_artifact_archive' only supports archive file in 'tar.gz' format."
|
91
|
+
)
|
92
|
+
|
93
|
+
archive_file_name = os.path.basename(artifact_archive_path)
|
94
|
+
if cache_key not in self._cache:
|
95
|
+
self._spark.addArtifact(artifact_archive_path, archive=True)
|
96
|
+
self._cache[cache_key] = archive_file_name
|
97
|
+
|
98
|
+
if is_in_databricks_runtime():
|
99
|
+
with open(os.path.join(get_or_create_tmp_dir(), _CACHE_MAP_FILE_NAME), "w") as f:
|
100
|
+
json.dump(self._cache, f)
|
101
|
+
|
102
|
+
def get_unpacked_artifact_dir(self, cache_key):
|
103
|
+
"""
|
104
|
+
Get unpacked artifact directory path, you can only call this method
|
105
|
+
inside Databricks Connect spark UDF sandbox.
|
106
|
+
"""
|
107
|
+
if cache_key not in self._cache:
|
108
|
+
raise RuntimeError(f"The artifact '{cache_key}' does not exist.")
|
109
|
+
archive_file_name = self._cache[cache_key]
|
110
|
+
|
111
|
+
if session_id := os.environ.get("DB_SESSION_UUID"):
|
112
|
+
return (
|
113
|
+
f"/local_disk0/.ephemeral_nfs/artifacts/{session_id}/archives/{archive_file_name}"
|
114
|
+
)
|
115
|
+
|
116
|
+
# If 'DB_SESSION_UUID' environment variable does not exist, it means it is running
|
117
|
+
# in a dedicated mode Spark cluster.
|
118
|
+
return os.path.join(os.getcwd(), archive_file_name)
|
119
|
+
|
120
|
+
|
121
|
+
def archive_directory(input_dir, archive_file_path):
|
122
|
+
"""
|
123
|
+
Archive the `input_dir` directory, save the archive file to `archive_file_path`,
|
124
|
+
the generated archive file is 'tar.gz' format.
|
125
|
+
Note: all symlink files in the input directory are kept as it is in the archive file.
|
126
|
+
"""
|
127
|
+
|
128
|
+
archive_file_path = os.path.abspath(archive_file_path)
|
129
|
+
# Note: `shutil.make_archive` doesn't work because it replaces symlink files with
|
130
|
+
# the file symlink pointing to, which is not the expected behavior in our usage.
|
131
|
+
# We need to pack the python and virtualenv environment, which contains a bunch of
|
132
|
+
# symlink files.
|
133
|
+
subprocess.check_call(
|
134
|
+
["tar", "-czf", archive_file_path, *os.listdir(input_dir)],
|
135
|
+
cwd=input_dir,
|
136
|
+
)
|
137
|
+
return archive_file_path
|
138
|
+
|
139
|
+
|
140
|
+
def extract_archive_to_dir(archive_path, dest_dir):
|
141
|
+
os.makedirs(dest_dir, exist_ok=True)
|
142
|
+
with tarfile.open(archive_path, "r") as tar:
|
143
|
+
tar.extractall(path=dest_dir)
|
144
|
+
return dest_dir
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import mlflow.pyfunc.loaders.chat_agent
|
2
|
+
import mlflow.pyfunc.loaders.chat_model
|
3
|
+
import mlflow.pyfunc.loaders.code_model
|
4
|
+
from mlflow.utils.pydantic_utils import IS_PYDANTIC_V2_OR_NEWER
|
5
|
+
|
6
|
+
if IS_PYDANTIC_V2_OR_NEWER:
|
7
|
+
import mlflow.pyfunc.loaders.responses_agent # noqa: F401
|
@@ -0,0 +1,117 @@
|
|
1
|
+
from typing import Any, Generator, Optional
|
2
|
+
|
3
|
+
import pydantic
|
4
|
+
|
5
|
+
from mlflow.exceptions import MlflowException
|
6
|
+
from mlflow.models.utils import _convert_llm_ndarray_to_list
|
7
|
+
from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
|
8
|
+
from mlflow.pyfunc.model import (
|
9
|
+
_load_context_model_and_signature,
|
10
|
+
)
|
11
|
+
from mlflow.types.agent import (
|
12
|
+
ChatAgentChunk,
|
13
|
+
ChatAgentMessage,
|
14
|
+
ChatAgentResponse,
|
15
|
+
ChatContext,
|
16
|
+
)
|
17
|
+
from mlflow.types.type_hints import model_validate
|
18
|
+
from mlflow.utils.annotations import experimental
|
19
|
+
|
20
|
+
|
21
|
+
def _load_pyfunc(model_path: str, model_config: Optional[dict[str, Any]] = None):
|
22
|
+
_, chat_agent, _ = _load_context_model_and_signature(model_path, model_config)
|
23
|
+
return _ChatAgentPyfuncWrapper(chat_agent)
|
24
|
+
|
25
|
+
|
26
|
+
@experimental(version="2.20.0")
|
27
|
+
class _ChatAgentPyfuncWrapper:
|
28
|
+
"""
|
29
|
+
Wrapper class that converts dict inputs to pydantic objects accepted by :class:`~ChatAgent`.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(self, chat_agent):
|
33
|
+
"""
|
34
|
+
Args:
|
35
|
+
chat_agent: An instance of a subclass of :class:`~ChatAgent`.
|
36
|
+
"""
|
37
|
+
self.chat_agent = chat_agent
|
38
|
+
|
39
|
+
def get_raw_model(self):
|
40
|
+
"""
|
41
|
+
Returns the underlying model.
|
42
|
+
"""
|
43
|
+
return self.chat_agent
|
44
|
+
|
45
|
+
def _convert_input(
|
46
|
+
self, model_input
|
47
|
+
) -> tuple[list[ChatAgentMessage], Optional[ChatContext], Optional[dict[str, Any]]]:
|
48
|
+
import pandas
|
49
|
+
|
50
|
+
if isinstance(model_input, dict):
|
51
|
+
dict_input = model_input
|
52
|
+
elif isinstance(model_input, pandas.DataFrame):
|
53
|
+
dict_input = {
|
54
|
+
k: _convert_llm_ndarray_to_list(v[0])
|
55
|
+
for k, v in model_input.to_dict(orient="list").items()
|
56
|
+
}
|
57
|
+
else:
|
58
|
+
raise MlflowException(
|
59
|
+
"Unsupported model input type. Expected a dict or pandas.DataFrame, but got "
|
60
|
+
f"{type(model_input)} instead.",
|
61
|
+
error_code=INTERNAL_ERROR,
|
62
|
+
)
|
63
|
+
|
64
|
+
messages = [ChatAgentMessage(**message) for message in dict_input.get("messages", [])]
|
65
|
+
context = ChatContext(**dict_input["context"]) if "context" in dict_input else None
|
66
|
+
custom_inputs = dict_input.get("custom_inputs", None)
|
67
|
+
|
68
|
+
return messages, context, custom_inputs
|
69
|
+
|
70
|
+
def _response_to_dict(self, response, pydantic_class) -> dict[str, Any]:
|
71
|
+
if isinstance(response, pydantic_class):
|
72
|
+
return response.model_dump_compat(exclude_none=True)
|
73
|
+
try:
|
74
|
+
model_validate(pydantic_class, response)
|
75
|
+
except pydantic.ValidationError as e:
|
76
|
+
raise MlflowException(
|
77
|
+
message=(
|
78
|
+
f"Model returned an invalid response. Expected a {pydantic_class.__name__} "
|
79
|
+
f"object or dictionary with the same schema. Pydantic validation error: {e}"
|
80
|
+
),
|
81
|
+
error_code=INTERNAL_ERROR,
|
82
|
+
) from e
|
83
|
+
return response
|
84
|
+
|
85
|
+
def predict(self, model_input: dict[str, Any], params=None) -> dict[str, Any]:
|
86
|
+
"""
|
87
|
+
Args:
|
88
|
+
model_input: A dict with the
|
89
|
+
:py:class:`ChatAgentRequest <mlflow.types.agent.ChatAgentRequest>` schema.
|
90
|
+
params: Unused in this function, but required in the signature because
|
91
|
+
`load_model_and_predict` in `utils/_capture_modules.py` expects a params field
|
92
|
+
|
93
|
+
Returns:
|
94
|
+
A dict with the (:py:class:`ChatAgentResponse <mlflow.types.agent.ChatAgentResponse>`)
|
95
|
+
schema.
|
96
|
+
"""
|
97
|
+
messages, context, custom_inputs = self._convert_input(model_input)
|
98
|
+
response = self.chat_agent.predict(messages, context, custom_inputs)
|
99
|
+
return self._response_to_dict(response, ChatAgentResponse)
|
100
|
+
|
101
|
+
def predict_stream(
|
102
|
+
self, model_input: dict[str, Any], params=None
|
103
|
+
) -> Generator[dict[str, Any], None, None]:
|
104
|
+
"""
|
105
|
+
Args:
|
106
|
+
model_input: A dict with the
|
107
|
+
:py:class:`ChatAgentRequest <mlflow.types.agent.ChatAgentRequest>` schema.
|
108
|
+
params: Unused in this function, but required in the signature because
|
109
|
+
`load_model_and_predict` in `utils/_capture_modules.py` expects a params field
|
110
|
+
|
111
|
+
Returns:
|
112
|
+
A generator over dicts with the
|
113
|
+
(:py:class:`ChatAgentChunk <mlflow.types.agent.ChatAgentChunk>`) schema.
|
114
|
+
"""
|
115
|
+
messages, context, custom_inputs = self._convert_input(model_input)
|
116
|
+
for response in self.chat_agent.predict_stream(messages, context, custom_inputs):
|
117
|
+
yield self._response_to_dict(response, ChatAgentChunk)
|
@@ -0,0 +1,125 @@
|
|
1
|
+
import inspect
|
2
|
+
import logging
|
3
|
+
from typing import Any, Generator, Optional
|
4
|
+
|
5
|
+
from mlflow.exceptions import MlflowException
|
6
|
+
from mlflow.models.utils import _convert_llm_ndarray_to_list
|
7
|
+
from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
|
8
|
+
from mlflow.pyfunc.model import (
|
9
|
+
_load_context_model_and_signature,
|
10
|
+
)
|
11
|
+
from mlflow.types.llm import ChatCompletionChunk, ChatCompletionResponse, ChatMessage, ChatParams
|
12
|
+
|
13
|
+
_logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
def _load_pyfunc(model_path: str, model_config: Optional[dict[str, Any]] = None):
|
17
|
+
context, chat_model, signature = _load_context_model_and_signature(model_path, model_config)
|
18
|
+
return _ChatModelPyfuncWrapper(chat_model=chat_model, context=context, signature=signature)
|
19
|
+
|
20
|
+
|
21
|
+
class _ChatModelPyfuncWrapper:
|
22
|
+
"""
|
23
|
+
Wrapper class that converts dict inputs to pydantic objects accepted by :class:`~ChatModel`.
|
24
|
+
"""
|
25
|
+
|
26
|
+
def __init__(self, chat_model, context, signature):
|
27
|
+
"""
|
28
|
+
Args:
|
29
|
+
chat_model: An instance of a subclass of :class:`~ChatModel`.
|
30
|
+
context: A :class:`~PythonModelContext` instance containing artifacts that
|
31
|
+
``chat_model`` may use when performing inference.
|
32
|
+
signature: :class:`~ModelSignature` instance describing model input and output.
|
33
|
+
"""
|
34
|
+
self.chat_model = chat_model
|
35
|
+
self.context = context
|
36
|
+
self.signature = signature
|
37
|
+
|
38
|
+
def get_raw_model(self):
|
39
|
+
"""
|
40
|
+
Returns the underlying model.
|
41
|
+
"""
|
42
|
+
return self.chat_model
|
43
|
+
|
44
|
+
def _convert_input(self, model_input):
|
45
|
+
import pandas
|
46
|
+
|
47
|
+
if isinstance(model_input, dict):
|
48
|
+
dict_input = model_input
|
49
|
+
elif isinstance(model_input, pandas.DataFrame):
|
50
|
+
dict_input = {
|
51
|
+
k: _convert_llm_ndarray_to_list(v[0])
|
52
|
+
for k, v in model_input.to_dict(orient="list").items()
|
53
|
+
}
|
54
|
+
else:
|
55
|
+
raise MlflowException(
|
56
|
+
"Unsupported model input type. Expected a dict or pandas.DataFrame, "
|
57
|
+
f"but got {type(model_input)} instead.",
|
58
|
+
error_code=INTERNAL_ERROR,
|
59
|
+
)
|
60
|
+
|
61
|
+
messages = [ChatMessage.from_dict(message) for message in dict_input.pop("messages", [])]
|
62
|
+
params = ChatParams.from_dict(dict_input)
|
63
|
+
return messages, params
|
64
|
+
|
65
|
+
def predict(
|
66
|
+
self, model_input: dict[str, Any], params: Optional[dict[str, Any]] = None
|
67
|
+
) -> dict[str, Any]:
|
68
|
+
"""
|
69
|
+
Args:
|
70
|
+
model_input: Model input data in the form of a chat request.
|
71
|
+
params: Additional parameters to pass to the model for inference.
|
72
|
+
Unused in this implementation, as the params are handled
|
73
|
+
via ``self._convert_input()``.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
Model predictions in :py:class:`~ChatCompletionResponse` format.
|
77
|
+
"""
|
78
|
+
messages, params = self._convert_input(model_input)
|
79
|
+
parameters = inspect.signature(self.chat_model.predict).parameters
|
80
|
+
if "context" in parameters or len(parameters) == 3:
|
81
|
+
response = self.chat_model.predict(self.context, messages, params)
|
82
|
+
else:
|
83
|
+
response = self.chat_model.predict(messages, params)
|
84
|
+
return self._response_to_dict(response)
|
85
|
+
|
86
|
+
def _response_to_dict(self, response: ChatCompletionResponse) -> dict[str, Any]:
|
87
|
+
if not isinstance(response, ChatCompletionResponse):
|
88
|
+
raise MlflowException(
|
89
|
+
"Model returned an invalid response. Expected a ChatCompletionResponse, but "
|
90
|
+
f"got {type(response)} instead.",
|
91
|
+
error_code=INTERNAL_ERROR,
|
92
|
+
)
|
93
|
+
return response.to_dict()
|
94
|
+
|
95
|
+
def _streaming_response_to_dict(self, response: ChatCompletionChunk) -> dict[str, Any]:
|
96
|
+
if not isinstance(response, ChatCompletionChunk):
|
97
|
+
raise MlflowException(
|
98
|
+
"Model returned an invalid response. Expected a ChatCompletionChunk, but "
|
99
|
+
f"got {type(response)} instead.",
|
100
|
+
error_code=INTERNAL_ERROR,
|
101
|
+
)
|
102
|
+
return response.to_dict()
|
103
|
+
|
104
|
+
def predict_stream(
|
105
|
+
self, model_input: dict[str, Any], params: Optional[dict[str, Any]] = None
|
106
|
+
) -> Generator[dict[str, Any], None, None]:
|
107
|
+
"""
|
108
|
+
Args:
|
109
|
+
model_input: Model input data in the form of a chat request.
|
110
|
+
params: Additional parameters to pass to the model for inference.
|
111
|
+
Unused in this implementation, as the params are handled
|
112
|
+
via ``self._convert_input()``.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
Generator over model predictions in :py:class:`~ChatCompletionChunk` format.
|
116
|
+
"""
|
117
|
+
messages, params = self._convert_input(model_input)
|
118
|
+
parameters = inspect.signature(self.chat_model.predict_stream).parameters
|
119
|
+
if "context" in parameters or len(parameters) == 3:
|
120
|
+
stream = self.chat_model.predict_stream(self.context, messages, params)
|
121
|
+
else:
|
122
|
+
stream = self.chat_model.predict_stream(messages, params)
|
123
|
+
|
124
|
+
for response in stream:
|
125
|
+
yield self._streaming_response_to_dict(response)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
from typing import Any, Optional
|
2
|
+
|
3
|
+
from mlflow.pyfunc.loaders.chat_agent import _ChatAgentPyfuncWrapper
|
4
|
+
from mlflow.pyfunc.loaders.chat_model import _ChatModelPyfuncWrapper
|
5
|
+
from mlflow.pyfunc.model import (
|
6
|
+
ChatAgent,
|
7
|
+
ChatModel,
|
8
|
+
_load_context_model_and_signature,
|
9
|
+
_PythonModelPyfuncWrapper,
|
10
|
+
)
|
11
|
+
|
12
|
+
try:
|
13
|
+
from mlflow.pyfunc.model import ResponsesAgent
|
14
|
+
|
15
|
+
IS_RESPONSES_AGENT_AVAILABLE = True
|
16
|
+
except ImportError:
|
17
|
+
IS_RESPONSES_AGENT_AVAILABLE = False
|
18
|
+
|
19
|
+
|
20
|
+
def _load_pyfunc(local_path: str, model_config: Optional[dict[str, Any]] = None):
|
21
|
+
context, model, signature = _load_context_model_and_signature(local_path, model_config)
|
22
|
+
if isinstance(model, ChatModel):
|
23
|
+
return _ChatModelPyfuncWrapper(model, context, signature)
|
24
|
+
elif isinstance(model, ChatAgent):
|
25
|
+
return _ChatAgentPyfuncWrapper(model)
|
26
|
+
elif IS_RESPONSES_AGENT_AVAILABLE and isinstance(model, ResponsesAgent):
|
27
|
+
from mlflow.pyfunc.loaders.responses_agent import _ResponsesAgentPyfuncWrapper
|
28
|
+
|
29
|
+
return _ResponsesAgentPyfuncWrapper(model)
|
30
|
+
else:
|
31
|
+
return _PythonModelPyfuncWrapper(model, context, signature)
|
@@ -0,0 +1,112 @@
|
|
1
|
+
from typing import Any, Generator, Optional
|
2
|
+
|
3
|
+
import pydantic
|
4
|
+
|
5
|
+
from mlflow.exceptions import MlflowException
|
6
|
+
from mlflow.models.utils import _convert_llm_ndarray_to_list
|
7
|
+
from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
|
8
|
+
from mlflow.pyfunc.model import _load_context_model_and_signature
|
9
|
+
from mlflow.types.type_hints import model_validate
|
10
|
+
from mlflow.utils.annotations import experimental
|
11
|
+
from mlflow.utils.pydantic_utils import IS_PYDANTIC_V2_OR_NEWER
|
12
|
+
|
13
|
+
if not IS_PYDANTIC_V2_OR_NEWER:
|
14
|
+
raise ImportError(
|
15
|
+
"ResponsesAgent and its pydantic classes are not supported in pydantic v1. "
|
16
|
+
"Please upgrade to pydantic v2 or newer to use ResponsesAgent.",
|
17
|
+
)
|
18
|
+
|
19
|
+
from mlflow.types.responses import (
|
20
|
+
ResponsesAgentRequest,
|
21
|
+
ResponsesAgentResponse,
|
22
|
+
ResponsesAgentStreamEvent,
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
def _load_pyfunc(model_path: str, model_config: Optional[dict[str, Any]] = None):
|
27
|
+
_, responses_agent, _ = _load_context_model_and_signature(model_path, model_config)
|
28
|
+
return _ResponsesAgentPyfuncWrapper(responses_agent)
|
29
|
+
|
30
|
+
|
31
|
+
@experimental(version="3.0.0")
|
32
|
+
class _ResponsesAgentPyfuncWrapper:
|
33
|
+
"""
|
34
|
+
Wrapper class that converts dict inputs to pydantic objects accepted by
|
35
|
+
:class:`~ResponsesAgent`.
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(self, responses_agent):
|
39
|
+
self.responses_agent = responses_agent
|
40
|
+
|
41
|
+
def get_raw_model(self):
|
42
|
+
"""
|
43
|
+
Returns the underlying model.
|
44
|
+
"""
|
45
|
+
return self.responses_agent
|
46
|
+
|
47
|
+
def _convert_input(self, model_input) -> ResponsesAgentRequest:
|
48
|
+
import pandas
|
49
|
+
|
50
|
+
if isinstance(model_input, pandas.DataFrame):
|
51
|
+
model_input = {
|
52
|
+
k: _convert_llm_ndarray_to_list(v[0])
|
53
|
+
for k, v in model_input.to_dict(orient="list").items()
|
54
|
+
}
|
55
|
+
elif not isinstance(model_input, dict):
|
56
|
+
raise MlflowException(
|
57
|
+
"Unsupported model input type. Expected a dict or pandas.DataFrame, but got "
|
58
|
+
f"{type(model_input)} instead.",
|
59
|
+
error_code=INTERNAL_ERROR,
|
60
|
+
)
|
61
|
+
return ResponsesAgentRequest(**model_input)
|
62
|
+
|
63
|
+
def _response_to_dict(self, response, pydantic_class) -> dict[str, Any]:
|
64
|
+
if isinstance(response, pydantic_class):
|
65
|
+
return response.model_dump_compat(exclude_none=True)
|
66
|
+
try:
|
67
|
+
model_validate(pydantic_class, response)
|
68
|
+
except pydantic.ValidationError as e:
|
69
|
+
raise MlflowException(
|
70
|
+
message=(
|
71
|
+
f"Model returned an invalid response. Expected a {pydantic_class.__name__} "
|
72
|
+
f"object or dictionary with the same schema. Pydantic validation error: {e}"
|
73
|
+
),
|
74
|
+
error_code=INTERNAL_ERROR,
|
75
|
+
) from e
|
76
|
+
return response
|
77
|
+
|
78
|
+
def predict(self, model_input: dict[str, Any], params=None) -> dict[str, Any]:
|
79
|
+
"""
|
80
|
+
Args:
|
81
|
+
model_input: A dict with the
|
82
|
+
:py:class:`ResponsesRequest <mlflow.types.responses.ResponsesRequest>` schema.
|
83
|
+
params: Unused in this function, but required in the signature because
|
84
|
+
`load_model_and_predict` in `utils/_capture_modules.py` expects a params field
|
85
|
+
|
86
|
+
Returns:
|
87
|
+
A dict with the
|
88
|
+
(:py:class:`ResponsesResponse <mlflow.types.responses.ResponsesResponse>`)
|
89
|
+
schema.
|
90
|
+
"""
|
91
|
+
request = self._convert_input(model_input)
|
92
|
+
response = self.responses_agent.predict(request)
|
93
|
+
return self._response_to_dict(response, ResponsesAgentResponse)
|
94
|
+
|
95
|
+
def predict_stream(
|
96
|
+
self, model_input: dict[str, Any], params=None
|
97
|
+
) -> Generator[dict[str, Any], None, None]:
|
98
|
+
"""
|
99
|
+
Args:
|
100
|
+
model_input: A dict with the
|
101
|
+
:py:class:`ResponsesRequest <mlflow.types.responses.ResponsesRequest>` schema.
|
102
|
+
params: Unused in this function, but required in the signature because
|
103
|
+
`load_model_and_predict` in `utils/_capture_modules.py` expects a params field
|
104
|
+
|
105
|
+
Returns:
|
106
|
+
A generator over dicts with the
|
107
|
+
(:py:class:`ResponsesStreamEvent <mlflow.types.responses.ResponsesStreamEvent>`)
|
108
|
+
schema.
|
109
|
+
"""
|
110
|
+
request = self._convert_input(model_input)
|
111
|
+
for response in self.responses_agent.predict_stream(request):
|
112
|
+
yield self._response_to_dict(response, ResponsesAgentStreamEvent)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
from typing import Optional
|
4
|
+
|
5
|
+
_logger = logging.getLogger(__name__)
|
6
|
+
|
7
|
+
MLServerMLflowRuntime = "mlserver_mlflow.MLflowRuntime"
|
8
|
+
MLServerDefaultModelName = "mlflow-model"
|
9
|
+
|
10
|
+
|
11
|
+
def get_cmd(
|
12
|
+
model_uri: str,
|
13
|
+
port: Optional[int] = None,
|
14
|
+
host: Optional[str] = None,
|
15
|
+
timeout: Optional[int] = None,
|
16
|
+
nworkers: Optional[int] = None,
|
17
|
+
model_name: Optional[str] = None,
|
18
|
+
model_version: Optional[str] = None,
|
19
|
+
) -> tuple[str, dict[str, str]]:
|
20
|
+
cmd = f"mlserver start {model_uri}"
|
21
|
+
|
22
|
+
cmd_env = os.environ.copy()
|
23
|
+
|
24
|
+
if port:
|
25
|
+
cmd_env["MLSERVER_HTTP_PORT"] = str(port)
|
26
|
+
|
27
|
+
if host:
|
28
|
+
cmd_env["MLSERVER_HOST"] = host
|
29
|
+
|
30
|
+
if timeout:
|
31
|
+
_logger.warning("Timeout is not yet supported in MLServer.")
|
32
|
+
|
33
|
+
if nworkers:
|
34
|
+
cmd_env["MLSERVER_PARALLEL_WORKERS"] = str(nworkers)
|
35
|
+
|
36
|
+
# give precedence to user env var input
|
37
|
+
cmd_env["MLSERVER_MODEL_NAME"] = (
|
38
|
+
cmd_env.get("MLSERVER_MODEL_NAME") or model_name or MLServerDefaultModelName
|
39
|
+
)
|
40
|
+
if model_version and not cmd_env.get("MLSERVER_MODEL_VERSION"):
|
41
|
+
cmd_env["MLSERVER_MODEL_VERSION"] = model_version
|
42
|
+
|
43
|
+
cmd_env["MLSERVER_MODEL_IMPLEMENTATION"] = MLServerMLflowRuntime
|
44
|
+
cmd_env["MLSERVER_MODEL_URI"] = model_uri
|
45
|
+
|
46
|
+
return cmd, cmd_env
|