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,465 @@
|
|
1
|
+
"""
|
2
|
+
Plugin Manager for Genesis-Flow
|
3
|
+
|
4
|
+
Central management system for all plugins including loading, enabling,
|
5
|
+
disabling, and lifecycle management.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import logging
|
9
|
+
import threading
|
10
|
+
from typing import Dict, List, Optional, Any, Type
|
11
|
+
from contextlib import contextmanager
|
12
|
+
|
13
|
+
from mlflow.plugins.base import BasePlugin, PluginState, PluginType
|
14
|
+
from mlflow.plugins.discovery import PluginDiscovery, discover_plugins
|
15
|
+
from mlflow.plugins.registry import PluginRegistry
|
16
|
+
from mlflow.version import VERSION as GENESIS_FLOW_VERSION
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
class PluginManager:
|
21
|
+
"""
|
22
|
+
Central plugin management system for Genesis-Flow.
|
23
|
+
|
24
|
+
Handles plugin discovery, loading, enabling/disabling, and lifecycle management.
|
25
|
+
Thread-safe operations with proper error handling and state management.
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self):
|
29
|
+
self._registry = PluginRegistry()
|
30
|
+
self._discovery = PluginDiscovery()
|
31
|
+
self._instances: Dict[str, BasePlugin] = {}
|
32
|
+
self._lock = threading.RLock()
|
33
|
+
self._initialized = False
|
34
|
+
|
35
|
+
def initialize(self, auto_discover: bool = True, auto_enable_builtin: bool = True):
|
36
|
+
"""
|
37
|
+
Initialize the plugin manager.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
auto_discover: Whether to automatically discover all plugins
|
41
|
+
auto_enable_builtin: Whether to automatically enable built-in plugins
|
42
|
+
"""
|
43
|
+
with self._lock:
|
44
|
+
if self._initialized:
|
45
|
+
return
|
46
|
+
|
47
|
+
try:
|
48
|
+
logger.info("Initializing Genesis-Flow plugin manager")
|
49
|
+
|
50
|
+
if auto_discover:
|
51
|
+
self._discover_plugins()
|
52
|
+
|
53
|
+
if auto_enable_builtin:
|
54
|
+
self._enable_builtin_plugins()
|
55
|
+
|
56
|
+
self._initialized = True
|
57
|
+
logger.info(f"Plugin manager initialized with {len(self._instances)} plugins")
|
58
|
+
|
59
|
+
except Exception as e:
|
60
|
+
logger.error(f"Failed to initialize plugin manager: {e}")
|
61
|
+
raise
|
62
|
+
|
63
|
+
def _discover_plugins(self):
|
64
|
+
"""Discover all available plugins."""
|
65
|
+
discovered = self._discovery.discover_all_plugins()
|
66
|
+
|
67
|
+
for name, plugin_class in discovered.items():
|
68
|
+
try:
|
69
|
+
self._registry.register_plugin_class(name, plugin_class)
|
70
|
+
logger.debug(f"Registered plugin class: {name}")
|
71
|
+
except Exception as e:
|
72
|
+
logger.error(f"Failed to register plugin {name}: {e}")
|
73
|
+
|
74
|
+
def _enable_builtin_plugins(self):
|
75
|
+
"""Enable all built-in plugins that are compatible."""
|
76
|
+
builtin_plugins = self._discovery.discover_builtin_plugins()
|
77
|
+
|
78
|
+
for name, plugin_class in builtin_plugins.items():
|
79
|
+
try:
|
80
|
+
if self._is_plugin_compatible(name):
|
81
|
+
self.enable_plugin(name)
|
82
|
+
logger.debug(f"Auto-enabled built-in plugin: {name}")
|
83
|
+
else:
|
84
|
+
logger.warning(f"Built-in plugin {name} is not compatible")
|
85
|
+
except Exception as e:
|
86
|
+
logger.error(f"Failed to auto-enable built-in plugin {name}: {e}")
|
87
|
+
|
88
|
+
def list_plugins(self, plugin_type: Optional[PluginType] = None,
|
89
|
+
state: Optional[PluginState] = None) -> List[Dict[str, Any]]:
|
90
|
+
"""
|
91
|
+
List all plugins with optional filtering.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
plugin_type: Filter by plugin type
|
95
|
+
state: Filter by plugin state
|
96
|
+
|
97
|
+
Returns:
|
98
|
+
List of plugin information dictionaries
|
99
|
+
"""
|
100
|
+
with self._lock:
|
101
|
+
plugins = []
|
102
|
+
|
103
|
+
# Include registered but not instantiated plugins
|
104
|
+
for name in self._registry.list_plugins():
|
105
|
+
plugin_info = self._get_plugin_info(name)
|
106
|
+
if plugin_info:
|
107
|
+
# Apply filters
|
108
|
+
if plugin_type and plugin_info.get('type') != plugin_type.value:
|
109
|
+
continue
|
110
|
+
if state and plugin_info.get('state') != state.value:
|
111
|
+
continue
|
112
|
+
|
113
|
+
plugins.append(plugin_info)
|
114
|
+
|
115
|
+
return plugins
|
116
|
+
|
117
|
+
def get_plugin(self, name: str) -> Optional[BasePlugin]:
|
118
|
+
"""
|
119
|
+
Get a plugin instance by name.
|
120
|
+
|
121
|
+
Args:
|
122
|
+
name: Plugin name
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
Plugin instance or None if not found/enabled
|
126
|
+
"""
|
127
|
+
with self._lock:
|
128
|
+
return self._instances.get(name)
|
129
|
+
|
130
|
+
def enable_plugin(self, name: str) -> bool:
|
131
|
+
"""
|
132
|
+
Enable a plugin by name.
|
133
|
+
|
134
|
+
Args:
|
135
|
+
name: Plugin name
|
136
|
+
|
137
|
+
Returns:
|
138
|
+
True if successfully enabled, False otherwise
|
139
|
+
"""
|
140
|
+
with self._lock:
|
141
|
+
try:
|
142
|
+
# Check if already enabled
|
143
|
+
if name in self._instances:
|
144
|
+
instance = self._instances[name]
|
145
|
+
if instance.state == PluginState.ENABLED:
|
146
|
+
logger.debug(f"Plugin {name} already enabled")
|
147
|
+
return True
|
148
|
+
|
149
|
+
# Get plugin class from registry
|
150
|
+
plugin_class = self._registry.get_plugin_class(name)
|
151
|
+
if not plugin_class:
|
152
|
+
logger.error(f"Plugin {name} not found in registry")
|
153
|
+
return False
|
154
|
+
|
155
|
+
# Create instance if not exists
|
156
|
+
if name not in self._instances:
|
157
|
+
try:
|
158
|
+
# Get metadata for the plugin
|
159
|
+
metadata = self._get_plugin_metadata(name, plugin_class)
|
160
|
+
instance = plugin_class(metadata)
|
161
|
+
self._instances[name] = instance
|
162
|
+
except Exception as e:
|
163
|
+
logger.error(f"Failed to create instance of plugin {name}: {e}")
|
164
|
+
return False
|
165
|
+
|
166
|
+
instance = self._instances[name]
|
167
|
+
|
168
|
+
# Check compatibility
|
169
|
+
if not instance.is_compatible(GENESIS_FLOW_VERSION):
|
170
|
+
logger.error(f"Plugin {name} is not compatible with Genesis-Flow {GENESIS_FLOW_VERSION}")
|
171
|
+
return False
|
172
|
+
|
173
|
+
# Check dependencies
|
174
|
+
if not instance.check_dependencies():
|
175
|
+
logger.error(f"Plugin {name} dependencies not satisfied")
|
176
|
+
return False
|
177
|
+
|
178
|
+
# Load if not loaded
|
179
|
+
if instance.state == PluginState.DISCOVERED:
|
180
|
+
if not instance.load():
|
181
|
+
logger.error(f"Failed to load plugin {name}")
|
182
|
+
return False
|
183
|
+
|
184
|
+
# Enable the plugin
|
185
|
+
if instance.enable():
|
186
|
+
logger.info(f"Plugin {name} enabled successfully")
|
187
|
+
return True
|
188
|
+
else:
|
189
|
+
logger.error(f"Failed to enable plugin {name}")
|
190
|
+
return False
|
191
|
+
|
192
|
+
except Exception as e:
|
193
|
+
logger.error(f"Error enabling plugin {name}: {e}")
|
194
|
+
return False
|
195
|
+
|
196
|
+
def disable_plugin(self, name: str) -> bool:
|
197
|
+
"""
|
198
|
+
Disable a plugin by name.
|
199
|
+
|
200
|
+
Args:
|
201
|
+
name: Plugin name
|
202
|
+
|
203
|
+
Returns:
|
204
|
+
True if successfully disabled, False otherwise
|
205
|
+
"""
|
206
|
+
with self._lock:
|
207
|
+
try:
|
208
|
+
if name not in self._instances:
|
209
|
+
logger.warning(f"Plugin {name} not found or not enabled")
|
210
|
+
return True # Already disabled
|
211
|
+
|
212
|
+
instance = self._instances[name]
|
213
|
+
|
214
|
+
if instance.disable():
|
215
|
+
logger.info(f"Plugin {name} disabled successfully")
|
216
|
+
return True
|
217
|
+
else:
|
218
|
+
logger.error(f"Failed to disable plugin {name}")
|
219
|
+
return False
|
220
|
+
|
221
|
+
except Exception as e:
|
222
|
+
logger.error(f"Error disabling plugin {name}: {e}")
|
223
|
+
return False
|
224
|
+
|
225
|
+
def unload_plugin(self, name: str) -> bool:
|
226
|
+
"""
|
227
|
+
Unload a plugin by name.
|
228
|
+
|
229
|
+
Args:
|
230
|
+
name: Plugin name
|
231
|
+
|
232
|
+
Returns:
|
233
|
+
True if successfully unloaded, False otherwise
|
234
|
+
"""
|
235
|
+
with self._lock:
|
236
|
+
try:
|
237
|
+
if name not in self._instances:
|
238
|
+
logger.warning(f"Plugin {name} not found")
|
239
|
+
return True # Already unloaded
|
240
|
+
|
241
|
+
instance = self._instances[name]
|
242
|
+
|
243
|
+
if instance.unload():
|
244
|
+
del self._instances[name]
|
245
|
+
logger.info(f"Plugin {name} unloaded successfully")
|
246
|
+
return True
|
247
|
+
else:
|
248
|
+
logger.error(f"Failed to unload plugin {name}")
|
249
|
+
return False
|
250
|
+
|
251
|
+
except Exception as e:
|
252
|
+
logger.error(f"Error unloading plugin {name}: {e}")
|
253
|
+
return False
|
254
|
+
|
255
|
+
def reload_plugin(self, name: str) -> bool:
|
256
|
+
"""
|
257
|
+
Reload a plugin by name.
|
258
|
+
|
259
|
+
Args:
|
260
|
+
name: Plugin name
|
261
|
+
|
262
|
+
Returns:
|
263
|
+
True if successfully reloaded, False otherwise
|
264
|
+
"""
|
265
|
+
with self._lock:
|
266
|
+
try:
|
267
|
+
# Unload first
|
268
|
+
if name in self._instances:
|
269
|
+
if not self.unload_plugin(name):
|
270
|
+
return False
|
271
|
+
|
272
|
+
# Re-enable
|
273
|
+
return self.enable_plugin(name)
|
274
|
+
|
275
|
+
except Exception as e:
|
276
|
+
logger.error(f"Error reloading plugin {name}: {e}")
|
277
|
+
return False
|
278
|
+
|
279
|
+
def is_plugin_enabled(self, name: str) -> bool:
|
280
|
+
"""
|
281
|
+
Check if a plugin is enabled.
|
282
|
+
|
283
|
+
Args:
|
284
|
+
name: Plugin name
|
285
|
+
|
286
|
+
Returns:
|
287
|
+
True if enabled, False otherwise
|
288
|
+
"""
|
289
|
+
with self._lock:
|
290
|
+
if name in self._instances:
|
291
|
+
return self._instances[name].state == PluginState.ENABLED
|
292
|
+
return False
|
293
|
+
|
294
|
+
def is_plugin_available(self, name: str) -> bool:
|
295
|
+
"""
|
296
|
+
Check if a plugin is available (registered).
|
297
|
+
|
298
|
+
Args:
|
299
|
+
name: Plugin name
|
300
|
+
|
301
|
+
Returns:
|
302
|
+
True if available, False otherwise
|
303
|
+
"""
|
304
|
+
return self._registry.is_plugin_registered(name)
|
305
|
+
|
306
|
+
def _is_plugin_compatible(self, name: str) -> bool:
|
307
|
+
"""Check if a plugin is compatible with current environment."""
|
308
|
+
try:
|
309
|
+
plugin_class = self._registry.get_plugin_class(name)
|
310
|
+
if not plugin_class:
|
311
|
+
return False
|
312
|
+
|
313
|
+
# Create temporary instance to check compatibility
|
314
|
+
metadata = self._get_plugin_metadata(name, plugin_class)
|
315
|
+
temp_instance = plugin_class(metadata)
|
316
|
+
|
317
|
+
return (temp_instance.is_compatible(GENESIS_FLOW_VERSION) and
|
318
|
+
temp_instance.check_dependencies())
|
319
|
+
|
320
|
+
except Exception as e:
|
321
|
+
logger.error(f"Error checking compatibility for plugin {name}: {e}")
|
322
|
+
return False
|
323
|
+
|
324
|
+
def _get_plugin_metadata(self, name: str, plugin_class: Type[BasePlugin]):
|
325
|
+
"""Get or create metadata for a plugin."""
|
326
|
+
try:
|
327
|
+
# Try to get metadata from plugin class
|
328
|
+
if hasattr(plugin_class, 'get_default_metadata'):
|
329
|
+
return plugin_class.get_default_metadata()
|
330
|
+
|
331
|
+
# Create basic metadata
|
332
|
+
from mlflow.plugins.base import PluginMetadata, PluginType
|
333
|
+
return PluginMetadata(
|
334
|
+
name=name,
|
335
|
+
version="1.0.0",
|
336
|
+
description=f"Plugin {name}",
|
337
|
+
author="Genesis-Flow",
|
338
|
+
plugin_type=PluginType.CUSTOM,
|
339
|
+
dependencies=[],
|
340
|
+
optional_dependencies=[],
|
341
|
+
min_genesis_flow_version="1.0.0",
|
342
|
+
)
|
343
|
+
|
344
|
+
except Exception as e:
|
345
|
+
logger.error(f"Error getting metadata for plugin {name}: {e}")
|
346
|
+
raise
|
347
|
+
|
348
|
+
def _get_plugin_info(self, name: str) -> Optional[Dict[str, Any]]:
|
349
|
+
"""Get information about a plugin."""
|
350
|
+
try:
|
351
|
+
if name in self._instances:
|
352
|
+
return self._instances[name].get_info()
|
353
|
+
|
354
|
+
# Get info from plugin class
|
355
|
+
plugin_class = self._registry.get_plugin_class(name)
|
356
|
+
if plugin_class:
|
357
|
+
try:
|
358
|
+
metadata = self._get_plugin_metadata(name, plugin_class)
|
359
|
+
return {
|
360
|
+
"name": metadata.name,
|
361
|
+
"version": metadata.version,
|
362
|
+
"description": metadata.description,
|
363
|
+
"author": metadata.author,
|
364
|
+
"type": metadata.plugin_type.value,
|
365
|
+
"state": PluginState.DISCOVERED.value,
|
366
|
+
"dependencies": metadata.dependencies,
|
367
|
+
"optional_dependencies": metadata.optional_dependencies,
|
368
|
+
"tags": metadata.tags,
|
369
|
+
}
|
370
|
+
except Exception:
|
371
|
+
return {
|
372
|
+
"name": name,
|
373
|
+
"class": plugin_class.__name__,
|
374
|
+
"state": PluginState.DISCOVERED.value,
|
375
|
+
}
|
376
|
+
|
377
|
+
return None
|
378
|
+
|
379
|
+
except Exception as e:
|
380
|
+
logger.error(f"Error getting info for plugin {name}: {e}")
|
381
|
+
return None
|
382
|
+
|
383
|
+
@contextmanager
|
384
|
+
def plugin_context(self, name: str):
|
385
|
+
"""
|
386
|
+
Context manager for temporarily enabling a plugin.
|
387
|
+
|
388
|
+
Args:
|
389
|
+
name: Plugin name
|
390
|
+
"""
|
391
|
+
was_enabled = self.is_plugin_enabled(name)
|
392
|
+
|
393
|
+
try:
|
394
|
+
if not was_enabled:
|
395
|
+
if not self.enable_plugin(name):
|
396
|
+
raise RuntimeError(f"Failed to enable plugin {name}")
|
397
|
+
|
398
|
+
yield self.get_plugin(name)
|
399
|
+
|
400
|
+
finally:
|
401
|
+
if not was_enabled and self.is_plugin_enabled(name):
|
402
|
+
self.disable_plugin(name)
|
403
|
+
|
404
|
+
def get_plugins_by_type(self, plugin_type: PluginType) -> List[BasePlugin]:
|
405
|
+
"""
|
406
|
+
Get all enabled plugins of a specific type.
|
407
|
+
|
408
|
+
Args:
|
409
|
+
plugin_type: Type of plugins to get
|
410
|
+
|
411
|
+
Returns:
|
412
|
+
List of enabled plugin instances
|
413
|
+
"""
|
414
|
+
with self._lock:
|
415
|
+
plugins = []
|
416
|
+
for instance in self._instances.values():
|
417
|
+
if (instance.state == PluginState.ENABLED and
|
418
|
+
instance.metadata.plugin_type == plugin_type):
|
419
|
+
plugins.append(instance)
|
420
|
+
return plugins
|
421
|
+
|
422
|
+
def get_stats(self) -> Dict[str, Any]:
|
423
|
+
"""
|
424
|
+
Get plugin manager statistics.
|
425
|
+
|
426
|
+
Returns:
|
427
|
+
Statistics dictionary
|
428
|
+
"""
|
429
|
+
with self._lock:
|
430
|
+
stats = {
|
431
|
+
"total_registered": len(self._registry.list_plugins()),
|
432
|
+
"total_instances": len(self._instances),
|
433
|
+
"enabled": sum(1 for p in self._instances.values()
|
434
|
+
if p.state == PluginState.ENABLED),
|
435
|
+
"disabled": sum(1 for p in self._instances.values()
|
436
|
+
if p.state == PluginState.DISABLED),
|
437
|
+
"failed": sum(1 for p in self._instances.values()
|
438
|
+
if p.state == PluginState.FAILED),
|
439
|
+
"by_type": {},
|
440
|
+
}
|
441
|
+
|
442
|
+
# Count by type
|
443
|
+
for instance in self._instances.values():
|
444
|
+
plugin_type = instance.metadata.plugin_type.value
|
445
|
+
if plugin_type not in stats["by_type"]:
|
446
|
+
stats["by_type"][plugin_type] = 0
|
447
|
+
stats["by_type"][plugin_type] += 1
|
448
|
+
|
449
|
+
return stats
|
450
|
+
|
451
|
+
def shutdown(self):
|
452
|
+
"""Shutdown the plugin manager and unload all plugins."""
|
453
|
+
with self._lock:
|
454
|
+
logger.info("Shutting down plugin manager")
|
455
|
+
|
456
|
+
# Unload all plugins
|
457
|
+
for name in list(self._instances.keys()):
|
458
|
+
try:
|
459
|
+
self.unload_plugin(name)
|
460
|
+
except Exception as e:
|
461
|
+
logger.error(f"Error unloading plugin {name} during shutdown: {e}")
|
462
|
+
|
463
|
+
self._instances.clear()
|
464
|
+
self._initialized = False
|
465
|
+
logger.info("Plugin manager shutdown complete")
|