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,316 @@
|
|
1
|
+
"""
|
2
|
+
Plugin Registry for Genesis-Flow
|
3
|
+
|
4
|
+
Central registry for tracking discovered and registered plugins.
|
5
|
+
Provides thread-safe registration, lookup, and management of plugin classes.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import logging
|
9
|
+
import threading
|
10
|
+
from typing import Dict, List, Optional, Type, Set
|
11
|
+
|
12
|
+
from mlflow.plugins.base import BasePlugin, PluginType
|
13
|
+
|
14
|
+
logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
class PluginRegistry:
|
17
|
+
"""
|
18
|
+
Thread-safe registry for plugin classes.
|
19
|
+
|
20
|
+
Maintains a central catalog of all discovered plugin classes,
|
21
|
+
their types, and metadata.
|
22
|
+
"""
|
23
|
+
|
24
|
+
def __init__(self):
|
25
|
+
self._plugins: Dict[str, Type[BasePlugin]] = {}
|
26
|
+
self._plugins_by_type: Dict[PluginType, Set[str]] = {}
|
27
|
+
self._lock = threading.RLock()
|
28
|
+
|
29
|
+
# Initialize type sets
|
30
|
+
for plugin_type in PluginType:
|
31
|
+
self._plugins_by_type[plugin_type] = set()
|
32
|
+
|
33
|
+
def register_plugin_class(self, name: str, plugin_class: Type[BasePlugin]) -> bool:
|
34
|
+
"""
|
35
|
+
Register a plugin class.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
name: Plugin name
|
39
|
+
plugin_class: Plugin class
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
True if registered successfully, False otherwise
|
43
|
+
"""
|
44
|
+
with self._lock:
|
45
|
+
try:
|
46
|
+
# Validate plugin class
|
47
|
+
if not self._validate_plugin_class(plugin_class):
|
48
|
+
logger.error(f"Invalid plugin class for {name}")
|
49
|
+
return False
|
50
|
+
|
51
|
+
# Check for conflicts
|
52
|
+
if name in self._plugins:
|
53
|
+
existing_class = self._plugins[name]
|
54
|
+
if existing_class != plugin_class:
|
55
|
+
logger.warning(f"Plugin {name} already registered with different class")
|
56
|
+
# Allow override but log it
|
57
|
+
else:
|
58
|
+
logger.debug(f"Plugin {name} already registered with same class")
|
59
|
+
return True
|
60
|
+
|
61
|
+
# Register the plugin
|
62
|
+
self._plugins[name] = plugin_class
|
63
|
+
|
64
|
+
# Add to type index
|
65
|
+
plugin_type = self._get_plugin_type(plugin_class)
|
66
|
+
if plugin_type:
|
67
|
+
self._plugins_by_type[plugin_type].add(name)
|
68
|
+
|
69
|
+
logger.debug(f"Registered plugin: {name}")
|
70
|
+
return True
|
71
|
+
|
72
|
+
except Exception as e:
|
73
|
+
logger.error(f"Error registering plugin {name}: {e}")
|
74
|
+
return False
|
75
|
+
|
76
|
+
def unregister_plugin(self, name: str) -> bool:
|
77
|
+
"""
|
78
|
+
Unregister a plugin class.
|
79
|
+
|
80
|
+
Args:
|
81
|
+
name: Plugin name
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
True if unregistered successfully, False otherwise
|
85
|
+
"""
|
86
|
+
with self._lock:
|
87
|
+
try:
|
88
|
+
if name not in self._plugins:
|
89
|
+
logger.warning(f"Plugin {name} not registered")
|
90
|
+
return True # Already unregistered
|
91
|
+
|
92
|
+
plugin_class = self._plugins[name]
|
93
|
+
|
94
|
+
# Remove from main registry
|
95
|
+
del self._plugins[name]
|
96
|
+
|
97
|
+
# Remove from type index
|
98
|
+
plugin_type = self._get_plugin_type(plugin_class)
|
99
|
+
if plugin_type and name in self._plugins_by_type[plugin_type]:
|
100
|
+
self._plugins_by_type[plugin_type].remove(name)
|
101
|
+
|
102
|
+
logger.debug(f"Unregistered plugin: {name}")
|
103
|
+
return True
|
104
|
+
|
105
|
+
except Exception as e:
|
106
|
+
logger.error(f"Error unregistering plugin {name}: {e}")
|
107
|
+
return False
|
108
|
+
|
109
|
+
def get_plugin_class(self, name: str) -> Optional[Type[BasePlugin]]:
|
110
|
+
"""
|
111
|
+
Get a plugin class by name.
|
112
|
+
|
113
|
+
Args:
|
114
|
+
name: Plugin name
|
115
|
+
|
116
|
+
Returns:
|
117
|
+
Plugin class or None if not found
|
118
|
+
"""
|
119
|
+
with self._lock:
|
120
|
+
return self._plugins.get(name)
|
121
|
+
|
122
|
+
def is_plugin_registered(self, name: str) -> bool:
|
123
|
+
"""
|
124
|
+
Check if a plugin is registered.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
name: Plugin name
|
128
|
+
|
129
|
+
Returns:
|
130
|
+
True if registered, False otherwise
|
131
|
+
"""
|
132
|
+
with self._lock:
|
133
|
+
return name in self._plugins
|
134
|
+
|
135
|
+
def list_plugins(self, plugin_type: Optional[PluginType] = None) -> List[str]:
|
136
|
+
"""
|
137
|
+
List registered plugin names.
|
138
|
+
|
139
|
+
Args:
|
140
|
+
plugin_type: Optional filter by plugin type
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
List of plugin names
|
144
|
+
"""
|
145
|
+
with self._lock:
|
146
|
+
if plugin_type:
|
147
|
+
return list(self._plugins_by_type.get(plugin_type, set()))
|
148
|
+
else:
|
149
|
+
return list(self._plugins.keys())
|
150
|
+
|
151
|
+
def get_plugins_by_type(self, plugin_type: PluginType) -> Dict[str, Type[BasePlugin]]:
|
152
|
+
"""
|
153
|
+
Get all plugins of a specific type.
|
154
|
+
|
155
|
+
Args:
|
156
|
+
plugin_type: Plugin type
|
157
|
+
|
158
|
+
Returns:
|
159
|
+
Dict mapping plugin names to classes
|
160
|
+
"""
|
161
|
+
with self._lock:
|
162
|
+
result = {}
|
163
|
+
plugin_names = self._plugins_by_type.get(plugin_type, set())
|
164
|
+
for name in plugin_names:
|
165
|
+
if name in self._plugins:
|
166
|
+
result[name] = self._plugins[name]
|
167
|
+
return result
|
168
|
+
|
169
|
+
def get_plugin_types(self) -> Dict[str, PluginType]:
|
170
|
+
"""
|
171
|
+
Get plugin types for all registered plugins.
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
Dict mapping plugin names to types
|
175
|
+
"""
|
176
|
+
with self._lock:
|
177
|
+
result = {}
|
178
|
+
for name, plugin_class in self._plugins.items():
|
179
|
+
plugin_type = self._get_plugin_type(plugin_class)
|
180
|
+
if plugin_type:
|
181
|
+
result[name] = plugin_type
|
182
|
+
return result
|
183
|
+
|
184
|
+
def clear(self):
|
185
|
+
"""Clear all registered plugins."""
|
186
|
+
with self._lock:
|
187
|
+
self._plugins.clear()
|
188
|
+
for plugin_type in PluginType:
|
189
|
+
self._plugins_by_type[plugin_type].clear()
|
190
|
+
logger.info("Plugin registry cleared")
|
191
|
+
|
192
|
+
def get_stats(self) -> Dict[str, int]:
|
193
|
+
"""
|
194
|
+
Get registry statistics.
|
195
|
+
|
196
|
+
Returns:
|
197
|
+
Statistics dictionary
|
198
|
+
"""
|
199
|
+
with self._lock:
|
200
|
+
stats = {
|
201
|
+
"total": len(self._plugins),
|
202
|
+
}
|
203
|
+
|
204
|
+
# Count by type
|
205
|
+
for plugin_type in PluginType:
|
206
|
+
count = len(self._plugins_by_type[plugin_type])
|
207
|
+
stats[plugin_type.value] = count
|
208
|
+
|
209
|
+
return stats
|
210
|
+
|
211
|
+
def _validate_plugin_class(self, plugin_class: Type) -> bool:
|
212
|
+
"""
|
213
|
+
Validate a plugin class.
|
214
|
+
|
215
|
+
Args:
|
216
|
+
plugin_class: Class to validate
|
217
|
+
|
218
|
+
Returns:
|
219
|
+
True if valid, False otherwise
|
220
|
+
"""
|
221
|
+
try:
|
222
|
+
# Must be a class
|
223
|
+
if not isinstance(plugin_class, type):
|
224
|
+
return False
|
225
|
+
|
226
|
+
# Must be a subclass of BasePlugin
|
227
|
+
if not issubclass(plugin_class, BasePlugin):
|
228
|
+
return False
|
229
|
+
|
230
|
+
# Must not be BasePlugin itself
|
231
|
+
if plugin_class == BasePlugin:
|
232
|
+
return False
|
233
|
+
|
234
|
+
# Must have required methods
|
235
|
+
required_methods = ['load', 'enable', 'disable', 'unload']
|
236
|
+
for method in required_methods:
|
237
|
+
if not hasattr(plugin_class, method):
|
238
|
+
return False
|
239
|
+
|
240
|
+
return True
|
241
|
+
|
242
|
+
except Exception as e:
|
243
|
+
logger.error(f"Error validating plugin class: {e}")
|
244
|
+
return False
|
245
|
+
|
246
|
+
def _get_plugin_type(self, plugin_class: Type[BasePlugin]) -> Optional[PluginType]:
|
247
|
+
"""
|
248
|
+
Determine the type of a plugin class.
|
249
|
+
|
250
|
+
Args:
|
251
|
+
plugin_class: Plugin class
|
252
|
+
|
253
|
+
Returns:
|
254
|
+
Plugin type or None if cannot determine
|
255
|
+
"""
|
256
|
+
try:
|
257
|
+
# Try to get from class metadata
|
258
|
+
if hasattr(plugin_class, 'get_default_metadata'):
|
259
|
+
metadata = plugin_class.get_default_metadata()
|
260
|
+
return metadata.plugin_type
|
261
|
+
|
262
|
+
# Try to infer from class hierarchy
|
263
|
+
from mlflow.plugins.base import (
|
264
|
+
FrameworkPlugin, LoggingPlugin, ModelRegistryPlugin,
|
265
|
+
DeploymentPlugin, ArtifactPlugin
|
266
|
+
)
|
267
|
+
|
268
|
+
if issubclass(plugin_class, FrameworkPlugin):
|
269
|
+
return PluginType.FRAMEWORK
|
270
|
+
elif issubclass(plugin_class, LoggingPlugin):
|
271
|
+
return PluginType.LOGGING
|
272
|
+
elif issubclass(plugin_class, ModelRegistryPlugin):
|
273
|
+
return PluginType.MODEL_REGISTRY
|
274
|
+
elif issubclass(plugin_class, DeploymentPlugin):
|
275
|
+
return PluginType.DEPLOYMENT
|
276
|
+
elif issubclass(plugin_class, ArtifactPlugin):
|
277
|
+
return PluginType.ARTIFACT
|
278
|
+
else:
|
279
|
+
return PluginType.CUSTOM
|
280
|
+
|
281
|
+
except Exception as e:
|
282
|
+
logger.error(f"Error determining plugin type for {plugin_class}: {e}")
|
283
|
+
return PluginType.CUSTOM
|
284
|
+
|
285
|
+
def export_registry(self) -> Dict[str, Dict]:
|
286
|
+
"""
|
287
|
+
Export registry contents for serialization.
|
288
|
+
|
289
|
+
Returns:
|
290
|
+
Serializable registry data
|
291
|
+
"""
|
292
|
+
with self._lock:
|
293
|
+
result = {}
|
294
|
+
for name, plugin_class in self._plugins.items():
|
295
|
+
result[name] = {
|
296
|
+
"class_name": plugin_class.__name__,
|
297
|
+
"module": plugin_class.__module__,
|
298
|
+
"type": self._get_plugin_type(plugin_class).value if self._get_plugin_type(plugin_class) else None,
|
299
|
+
}
|
300
|
+
return result
|
301
|
+
|
302
|
+
def find_plugins_by_pattern(self, pattern: str) -> List[str]:
|
303
|
+
"""
|
304
|
+
Find plugins matching a name pattern.
|
305
|
+
|
306
|
+
Args:
|
307
|
+
pattern: Pattern to match (supports * wildcard)
|
308
|
+
|
309
|
+
Returns:
|
310
|
+
List of matching plugin names
|
311
|
+
"""
|
312
|
+
import fnmatch
|
313
|
+
|
314
|
+
with self._lock:
|
315
|
+
return [name for name in self._plugins.keys()
|
316
|
+
if fnmatch.fnmatch(name, pattern)]
|
@@ -0,0 +1,329 @@
|
|
1
|
+
"""
|
2
|
+
Framework Plugin Template for Genesis-Flow
|
3
|
+
|
4
|
+
This template provides a starting point for creating new ML framework plugins.
|
5
|
+
Copy this file and customize it for your specific framework.
|
6
|
+
|
7
|
+
Example: Creating a TensorFlow plugin
|
8
|
+
1. Copy this file to tensorflow_plugin.py
|
9
|
+
2. Replace "MyFramework" with "TensorFlow"
|
10
|
+
3. Update metadata with TensorFlow-specific information
|
11
|
+
4. Implement TensorFlow-specific methods
|
12
|
+
5. Register in entry points or built-in plugins
|
13
|
+
"""
|
14
|
+
|
15
|
+
import logging
|
16
|
+
from typing import Dict, Callable
|
17
|
+
|
18
|
+
from mlflow.plugins.base import FrameworkPlugin, PluginMetadata, PluginType
|
19
|
+
|
20
|
+
logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
class MyFrameworkPlugin(FrameworkPlugin):
|
23
|
+
"""
|
24
|
+
Framework plugin template for Genesis-Flow.
|
25
|
+
|
26
|
+
Replace "MyFramework" with your framework name throughout this file.
|
27
|
+
"""
|
28
|
+
|
29
|
+
@classmethod
|
30
|
+
def get_default_metadata(cls) -> PluginMetadata:
|
31
|
+
"""
|
32
|
+
Get default metadata for the framework plugin.
|
33
|
+
|
34
|
+
Customize all fields below for your framework.
|
35
|
+
"""
|
36
|
+
return PluginMetadata(
|
37
|
+
name="myframework", # Change to your framework name (lowercase)
|
38
|
+
version="1.0.0", # Your plugin version
|
39
|
+
description="My Framework integration for Genesis-Flow", # Framework description
|
40
|
+
author="Your Name or Organization", # Plugin author
|
41
|
+
plugin_type=PluginType.FRAMEWORK, # Keep as FRAMEWORK
|
42
|
+
dependencies=["myframework"], # Required Python packages
|
43
|
+
optional_dependencies=[ # Optional packages that enhance functionality
|
44
|
+
"numpy",
|
45
|
+
"scipy",
|
46
|
+
# Add framework-specific optional dependencies
|
47
|
+
],
|
48
|
+
min_genesis_flow_version="1.0.0", # Minimum Genesis-Flow version
|
49
|
+
max_genesis_flow_version=None, # Maximum version (None for no limit)
|
50
|
+
homepage="https://myframework.org", # Framework homepage
|
51
|
+
documentation="https://docs.myframework.org/mlflow", # MLflow integration docs
|
52
|
+
license="Apache 2.0", # Framework license
|
53
|
+
tags=[ # Descriptive tags
|
54
|
+
"machine-learning",
|
55
|
+
"myframework",
|
56
|
+
# Add framework-specific tags like "deep-learning", "nlp", etc.
|
57
|
+
],
|
58
|
+
)
|
59
|
+
|
60
|
+
def get_module_path(self) -> str:
|
61
|
+
"""
|
62
|
+
Get the module path for framework integration.
|
63
|
+
|
64
|
+
This should match the MLflow integration module for your framework.
|
65
|
+
Example: "mlflow.tensorflow" for TensorFlow
|
66
|
+
"""
|
67
|
+
return "mlflow.myframework" # Change to your framework module
|
68
|
+
|
69
|
+
def get_autolog_functions(self) -> Dict[str, Callable]:
|
70
|
+
"""
|
71
|
+
Get autologging functions provided by this framework.
|
72
|
+
|
73
|
+
Returns dictionary mapping function names to callables.
|
74
|
+
"""
|
75
|
+
try:
|
76
|
+
# Import your framework's MLflow integration
|
77
|
+
from mlflow.myframework import autolog
|
78
|
+
|
79
|
+
return {
|
80
|
+
"autolog": autolog,
|
81
|
+
# Add other autolog-related functions if available
|
82
|
+
}
|
83
|
+
|
84
|
+
except ImportError:
|
85
|
+
logger.warning("MyFramework autolog not available")
|
86
|
+
return {}
|
87
|
+
|
88
|
+
def get_save_functions(self) -> Dict[str, Callable]:
|
89
|
+
"""
|
90
|
+
Get model saving functions provided by this framework.
|
91
|
+
|
92
|
+
Returns dictionary mapping function names to callables.
|
93
|
+
"""
|
94
|
+
try:
|
95
|
+
# Import your framework's MLflow integration
|
96
|
+
from mlflow.myframework import log_model, save_model
|
97
|
+
|
98
|
+
return {
|
99
|
+
"log_model": log_model,
|
100
|
+
"save_model": save_model,
|
101
|
+
# Add other save-related functions if available
|
102
|
+
}
|
103
|
+
|
104
|
+
except ImportError:
|
105
|
+
logger.warning("MyFramework save functions not available")
|
106
|
+
return {}
|
107
|
+
|
108
|
+
def get_load_functions(self) -> Dict[str, Callable]:
|
109
|
+
"""
|
110
|
+
Get model loading functions provided by this framework.
|
111
|
+
|
112
|
+
Returns dictionary mapping function names to callables.
|
113
|
+
"""
|
114
|
+
try:
|
115
|
+
# Import your framework's MLflow integration
|
116
|
+
from mlflow.myframework import load_model
|
117
|
+
|
118
|
+
return {
|
119
|
+
"load_model": load_model,
|
120
|
+
# Add other load-related functions if available
|
121
|
+
}
|
122
|
+
|
123
|
+
except ImportError:
|
124
|
+
logger.warning("MyFramework load functions not available")
|
125
|
+
return {}
|
126
|
+
|
127
|
+
def enable(self) -> bool:
|
128
|
+
"""
|
129
|
+
Enable the framework plugin with enhanced functionality.
|
130
|
+
|
131
|
+
Add framework-specific setup and configuration here.
|
132
|
+
"""
|
133
|
+
try:
|
134
|
+
# Call parent enable method
|
135
|
+
if not super().enable():
|
136
|
+
return False
|
137
|
+
|
138
|
+
# Add framework-specific setup
|
139
|
+
self._setup_framework_environment()
|
140
|
+
|
141
|
+
self._logger.info("MyFramework plugin enabled with full functionality")
|
142
|
+
return True
|
143
|
+
|
144
|
+
except Exception as e:
|
145
|
+
self._logger.error(f"Failed to enable MyFramework plugin: {e}")
|
146
|
+
return False
|
147
|
+
|
148
|
+
def _setup_framework_environment(self):
|
149
|
+
"""
|
150
|
+
Setup framework-specific environment and configurations.
|
151
|
+
|
152
|
+
Customize this method for your framework's initialization needs.
|
153
|
+
"""
|
154
|
+
try:
|
155
|
+
# Import your framework
|
156
|
+
import myframework # Replace with your framework import
|
157
|
+
|
158
|
+
# Log framework version and capabilities
|
159
|
+
self._logger.info(f"MyFramework version: {myframework.__version__}")
|
160
|
+
|
161
|
+
# Check for GPU availability if relevant
|
162
|
+
if hasattr(myframework, 'is_gpu_available'):
|
163
|
+
gpu_available = myframework.is_gpu_available()
|
164
|
+
self._logger.info(f"GPU available: {gpu_available}")
|
165
|
+
|
166
|
+
# Setup hooks for automatic logging
|
167
|
+
self.register_hook("model_save", self._on_model_save)
|
168
|
+
self.register_hook("model_load", self._on_model_load)
|
169
|
+
self.register_hook("training_start", self._on_training_start)
|
170
|
+
self.register_hook("training_end", self._on_training_end)
|
171
|
+
|
172
|
+
# Framework-specific configuration
|
173
|
+
self._configure_framework_settings()
|
174
|
+
|
175
|
+
except Exception as e:
|
176
|
+
self._logger.warning(f"MyFramework environment setup warning: {e}")
|
177
|
+
|
178
|
+
def _configure_framework_settings(self):
|
179
|
+
"""Configure framework-specific settings for optimal MLflow integration."""
|
180
|
+
try:
|
181
|
+
# Add framework-specific configuration here
|
182
|
+
# Example: Setting logging levels, performance options, etc.
|
183
|
+
pass
|
184
|
+
|
185
|
+
except Exception as e:
|
186
|
+
self._logger.warning(f"MyFramework configuration warning: {e}")
|
187
|
+
|
188
|
+
def _on_model_save(self, model, *args, **kwargs):
|
189
|
+
"""
|
190
|
+
Hook called when a model is saved.
|
191
|
+
|
192
|
+
Customize this to add framework-specific model save processing.
|
193
|
+
"""
|
194
|
+
try:
|
195
|
+
# Check if it's your framework's model type
|
196
|
+
import myframework
|
197
|
+
|
198
|
+
if isinstance(model, myframework.BaseModel): # Replace with your model base class
|
199
|
+
self._logger.debug("MyFramework model save detected")
|
200
|
+
|
201
|
+
# Add custom processing here
|
202
|
+
# Example: Log model architecture, parameters, etc.
|
203
|
+
self._log_model_metadata(model)
|
204
|
+
|
205
|
+
except Exception as e:
|
206
|
+
self._logger.warning(f"MyFramework model save hook error: {e}")
|
207
|
+
|
208
|
+
def _on_model_load(self, model_path, *args, **kwargs):
|
209
|
+
"""
|
210
|
+
Hook called when a model is loaded.
|
211
|
+
|
212
|
+
Customize this to add framework-specific model load processing.
|
213
|
+
"""
|
214
|
+
try:
|
215
|
+
self._logger.debug(f"MyFramework model load detected: {model_path}")
|
216
|
+
|
217
|
+
# Add custom processing here
|
218
|
+
# Example: Validate model, setup runtime environment, etc.
|
219
|
+
|
220
|
+
except Exception as e:
|
221
|
+
self._logger.warning(f"MyFramework model load hook error: {e}")
|
222
|
+
|
223
|
+
def _on_training_start(self, *args, **kwargs):
|
224
|
+
"""Hook called when training starts."""
|
225
|
+
try:
|
226
|
+
self._logger.debug("MyFramework training start detected")
|
227
|
+
|
228
|
+
# Add custom processing here
|
229
|
+
# Example: Setup training monitoring, resource tracking, etc.
|
230
|
+
|
231
|
+
except Exception as e:
|
232
|
+
self._logger.warning(f"MyFramework training start hook error: {e}")
|
233
|
+
|
234
|
+
def _on_training_end(self, *args, **kwargs):
|
235
|
+
"""Hook called when training ends."""
|
236
|
+
try:
|
237
|
+
self._logger.debug("MyFramework training end detected")
|
238
|
+
|
239
|
+
# Add custom processing here
|
240
|
+
# Example: Log final metrics, cleanup resources, etc.
|
241
|
+
|
242
|
+
except Exception as e:
|
243
|
+
self._logger.warning(f"MyFramework training end hook error: {e}")
|
244
|
+
|
245
|
+
def _log_model_metadata(self, model):
|
246
|
+
"""Log additional metadata about the model."""
|
247
|
+
try:
|
248
|
+
# Example: Log model-specific information
|
249
|
+
# This is where you'd add framework-specific metadata logging
|
250
|
+
pass
|
251
|
+
|
252
|
+
except Exception as e:
|
253
|
+
self._logger.warning(f"MyFramework model metadata logging error: {e}")
|
254
|
+
|
255
|
+
def check_dependencies(self) -> bool:
|
256
|
+
"""
|
257
|
+
Enhanced dependency checking for the framework.
|
258
|
+
|
259
|
+
Customize this to add framework-specific dependency validation.
|
260
|
+
"""
|
261
|
+
# Check basic dependencies first
|
262
|
+
if not super().check_dependencies():
|
263
|
+
return False
|
264
|
+
|
265
|
+
try:
|
266
|
+
# Import and validate your framework
|
267
|
+
import myframework # Replace with your framework import
|
268
|
+
|
269
|
+
# Check minimum framework version
|
270
|
+
from packaging.version import Version
|
271
|
+
min_version = "1.0.0" # Set your minimum version requirement
|
272
|
+
|
273
|
+
if Version(myframework.__version__) < Version(min_version):
|
274
|
+
self._logger.error(f"MyFramework {min_version}+ required, found {myframework.__version__}")
|
275
|
+
return False
|
276
|
+
|
277
|
+
# Add framework-specific validation
|
278
|
+
if not self._validate_framework_environment():
|
279
|
+
return False
|
280
|
+
|
281
|
+
self._logger.debug(f"MyFramework {myframework.__version__} dependency satisfied")
|
282
|
+
return True
|
283
|
+
|
284
|
+
except ImportError:
|
285
|
+
self._logger.error("MyFramework not installed")
|
286
|
+
return False
|
287
|
+
except Exception as e:
|
288
|
+
self._logger.error(f"MyFramework dependency check failed: {e}")
|
289
|
+
return False
|
290
|
+
|
291
|
+
def _validate_framework_environment(self) -> bool:
|
292
|
+
"""
|
293
|
+
Validate framework-specific environment requirements.
|
294
|
+
|
295
|
+
Add custom validation logic here.
|
296
|
+
"""
|
297
|
+
try:
|
298
|
+
# Add framework-specific validation
|
299
|
+
# Example: Check for required system libraries, GPU drivers, etc.
|
300
|
+
|
301
|
+
# Example validation:
|
302
|
+
# import myframework
|
303
|
+
# if not myframework.is_properly_configured():
|
304
|
+
# self._logger.error("MyFramework is not properly configured")
|
305
|
+
# return False
|
306
|
+
|
307
|
+
return True
|
308
|
+
|
309
|
+
except Exception as e:
|
310
|
+
self._logger.error(f"MyFramework environment validation failed: {e}")
|
311
|
+
return False
|
312
|
+
|
313
|
+
# Example usage and registration:
|
314
|
+
|
315
|
+
# 1. To use this plugin directly:
|
316
|
+
# metadata = MyFrameworkPlugin.get_default_metadata()
|
317
|
+
# plugin = MyFrameworkPlugin(metadata)
|
318
|
+
# plugin.enable()
|
319
|
+
|
320
|
+
# 2. To register in built-in plugins, add to mlflow/plugins/builtin/__init__.py:
|
321
|
+
# from mlflow.plugins.builtin.myframework_plugin import MyFrameworkPlugin
|
322
|
+
# BUILTIN_PLUGINS["myframework"] = MyFrameworkPlugin
|
323
|
+
|
324
|
+
# 3. To register via entry points, add to setup.py:
|
325
|
+
# entry_points={
|
326
|
+
# "genesis_flow.frameworks": [
|
327
|
+
# "myframework = mypackage.myframework_plugin:MyFrameworkPlugin",
|
328
|
+
# ],
|
329
|
+
# }
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# A special tag in RegisteredModel to indicate that it is a prompt
|
2
|
+
import re
|
3
|
+
|
4
|
+
IS_PROMPT_TAG_KEY = "mlflow.prompt.is_prompt"
|
5
|
+
# A special tag in ModelVersion to store the prompt text
|
6
|
+
PROMPT_TEXT_TAG_KEY = "mlflow.prompt.text"
|
7
|
+
|
8
|
+
LINKED_PROMPTS_TAG_KEY = "mlflow.linkedPrompts"
|
9
|
+
|
10
|
+
# A special tag to store associated run IDs for prompts
|
11
|
+
PROMPT_ASSOCIATED_RUN_IDS_TAG_KEY = "mlflow.prompt.associatedRunIds"
|
12
|
+
|
13
|
+
PROMPT_TEMPLATE_VARIABLE_PATTERN = re.compile(
|
14
|
+
r"\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*)\s*\}\}"
|
15
|
+
)
|
16
|
+
|
17
|
+
PROMPT_TEXT_DISPLAY_LIMIT = 30
|
18
|
+
|
19
|
+
# Alphanumeric, underscore, hyphen, and dot are allowed in prompt name
|
20
|
+
PROMPT_NAME_RULE = re.compile(r"^[a-zA-Z0-9_.-]+$")
|