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,197 @@
|
|
1
|
+
import os
|
2
|
+
import re
|
3
|
+
|
4
|
+
import yaml
|
5
|
+
|
6
|
+
from mlflow.exceptions import MlflowException
|
7
|
+
from mlflow.version import VERSION as __version__
|
8
|
+
|
9
|
+
|
10
|
+
class _PromptlabModel:
|
11
|
+
import pandas as pd
|
12
|
+
|
13
|
+
def __init__(self, prompt_template, prompt_parameters, model_parameters, model_route):
|
14
|
+
self.prompt_parameters = prompt_parameters
|
15
|
+
self.model_parameters = model_parameters
|
16
|
+
self.model_route = model_route
|
17
|
+
self.prompt_template = prompt_template
|
18
|
+
|
19
|
+
def predict(self, inputs: pd.DataFrame) -> list[str]:
|
20
|
+
from mlflow.deployments import MlflowDeploymentClient, get_deploy_client
|
21
|
+
|
22
|
+
client = MlflowDeploymentClient(get_deploy_client())
|
23
|
+
|
24
|
+
results = []
|
25
|
+
for idx in inputs.index:
|
26
|
+
prompt_parameters_as_dict = {
|
27
|
+
param.key: inputs[param.key][idx] for param in self.prompt_parameters
|
28
|
+
}
|
29
|
+
|
30
|
+
# copy replacement logic from PromptEngineering.utils.ts for consistency
|
31
|
+
prompt = self.prompt_template
|
32
|
+
for key, value in prompt_parameters_as_dict.items():
|
33
|
+
prompt = re.sub(r"\{\{\s*" + key + r"\s*\}\}", value, prompt)
|
34
|
+
|
35
|
+
model_parameters_as_dict = {param.key: param.value for param in self.model_parameters}
|
36
|
+
query_data = self._construct_query_data(prompt)
|
37
|
+
|
38
|
+
response = client.predict(
|
39
|
+
endpoint=self.model_route, inputs={**query_data, **model_parameters_as_dict}
|
40
|
+
)
|
41
|
+
results.append(self._parse_gateway_response(response))
|
42
|
+
|
43
|
+
return results
|
44
|
+
|
45
|
+
def _construct_query_data(self, prompt):
|
46
|
+
from mlflow.deployments import MlflowDeploymentClient, get_deploy_client
|
47
|
+
|
48
|
+
client = MlflowDeploymentClient(get_deploy_client())
|
49
|
+
route_type = client.get_endpoint(self.model_route).endpoint_type
|
50
|
+
|
51
|
+
if route_type == "llm/v1/completions":
|
52
|
+
return {"prompt": prompt}
|
53
|
+
elif route_type == "llm/v1/chat":
|
54
|
+
return {"messages": [{"content": prompt, "role": "user"}]}
|
55
|
+
else:
|
56
|
+
raise MlflowException(
|
57
|
+
"Error when constructing gateway query: "
|
58
|
+
f"Unsupported route type for _PromptlabModel: {route_type}"
|
59
|
+
)
|
60
|
+
|
61
|
+
def _parse_gateway_response(self, response):
|
62
|
+
from mlflow.deployments import MlflowDeploymentClient, get_deploy_client
|
63
|
+
|
64
|
+
client = MlflowDeploymentClient(get_deploy_client())
|
65
|
+
route_type = client.get_endpoint(self.model_route).endpoint_type
|
66
|
+
|
67
|
+
if route_type == "llm/v1/completions":
|
68
|
+
return response["choices"][0]["text"]
|
69
|
+
elif route_type == "llm/v1/chat":
|
70
|
+
return response["choices"][0]["message"]["content"]
|
71
|
+
else:
|
72
|
+
raise MlflowException(
|
73
|
+
"Error when parsing gateway response: "
|
74
|
+
f"Unsupported route type for _PromptlabModel: {route_type}"
|
75
|
+
)
|
76
|
+
|
77
|
+
|
78
|
+
def _load_pyfunc(path):
|
79
|
+
from mlflow import pyfunc
|
80
|
+
from mlflow.entities.param import Param
|
81
|
+
from mlflow.utils.model_utils import (
|
82
|
+
_get_flavor_configuration,
|
83
|
+
)
|
84
|
+
|
85
|
+
pyfunc_flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=pyfunc.FLAVOR_NAME)
|
86
|
+
parameters_path = os.path.join(path, pyfunc_flavor_conf["parameters_path"])
|
87
|
+
with open(parameters_path) as f:
|
88
|
+
parameters = yaml.safe_load(f)
|
89
|
+
|
90
|
+
prompt_parameters_as_params = [
|
91
|
+
Param(key=key, value=value) for key, value in parameters["prompt_parameters"].items()
|
92
|
+
]
|
93
|
+
model_parameters_as_params = [
|
94
|
+
Param(key=key, value=value) for key, value in parameters["model_parameters"].items()
|
95
|
+
]
|
96
|
+
|
97
|
+
return _PromptlabModel(
|
98
|
+
prompt_template=parameters["prompt_template"],
|
99
|
+
prompt_parameters=prompt_parameters_as_params,
|
100
|
+
model_parameters=model_parameters_as_params,
|
101
|
+
model_route=parameters["model_route"],
|
102
|
+
)
|
103
|
+
|
104
|
+
|
105
|
+
def save_model(
|
106
|
+
path,
|
107
|
+
conda_env=None,
|
108
|
+
code_paths=None,
|
109
|
+
mlflow_model=None,
|
110
|
+
signature=None,
|
111
|
+
input_example=None,
|
112
|
+
pip_requirements=None,
|
113
|
+
prompt_template=None,
|
114
|
+
prompt_parameters=None,
|
115
|
+
model_parameters=None,
|
116
|
+
model_route=None,
|
117
|
+
):
|
118
|
+
from mlflow import pyfunc
|
119
|
+
from mlflow.models import Model
|
120
|
+
from mlflow.models.model import MLMODEL_FILE_NAME, Model
|
121
|
+
from mlflow.models.utils import _save_example
|
122
|
+
from mlflow.utils.environment import (
|
123
|
+
_CONDA_ENV_FILE_NAME,
|
124
|
+
_CONSTRAINTS_FILE_NAME,
|
125
|
+
_PYTHON_ENV_FILE_NAME,
|
126
|
+
_REQUIREMENTS_FILE_NAME,
|
127
|
+
_process_conda_env,
|
128
|
+
_process_pip_requirements,
|
129
|
+
_PythonEnv,
|
130
|
+
_validate_env_arguments,
|
131
|
+
infer_pip_requirements,
|
132
|
+
)
|
133
|
+
from mlflow.utils.file_utils import write_to
|
134
|
+
from mlflow.utils.model_utils import (
|
135
|
+
_validate_and_copy_code_paths,
|
136
|
+
_validate_and_prepare_target_save_path,
|
137
|
+
)
|
138
|
+
|
139
|
+
_validate_env_arguments(conda_env, pip_requirements, None)
|
140
|
+
|
141
|
+
_validate_and_prepare_target_save_path(path)
|
142
|
+
code_dir_subpath = _validate_and_copy_code_paths(code_paths, path)
|
143
|
+
|
144
|
+
if mlflow_model is None:
|
145
|
+
mlflow_model = Model()
|
146
|
+
if signature is not None:
|
147
|
+
mlflow_model.signature = signature
|
148
|
+
if input_example is not None:
|
149
|
+
_save_example(mlflow_model, input_example, path)
|
150
|
+
|
151
|
+
parameters_sub_path = "parameters.yaml"
|
152
|
+
parameters_path = os.path.join(path, parameters_sub_path)
|
153
|
+
# dump prompt_template, prompt_parameters, model_parameters, model_route to parameters_path
|
154
|
+
|
155
|
+
parameters = {
|
156
|
+
"prompt_template": prompt_template,
|
157
|
+
"prompt_parameters": {param.key: param.value for param in prompt_parameters},
|
158
|
+
"model_parameters": {param.key: param.value for param in model_parameters},
|
159
|
+
"model_route": model_route,
|
160
|
+
}
|
161
|
+
with open(parameters_path, "w") as f:
|
162
|
+
yaml.safe_dump(parameters, stream=f, default_flow_style=False)
|
163
|
+
|
164
|
+
pyfunc.add_to_model(
|
165
|
+
mlflow_model,
|
166
|
+
loader_module="mlflow.prompt.promptlab_model",
|
167
|
+
parameters_path=parameters_sub_path,
|
168
|
+
conda_env=_CONDA_ENV_FILE_NAME,
|
169
|
+
python_env=_PYTHON_ENV_FILE_NAME,
|
170
|
+
code=code_dir_subpath,
|
171
|
+
)
|
172
|
+
|
173
|
+
mlflow_model.save(os.path.join(path, MLMODEL_FILE_NAME))
|
174
|
+
|
175
|
+
if conda_env is None:
|
176
|
+
if pip_requirements is None:
|
177
|
+
inferred_reqs = infer_pip_requirements(
|
178
|
+
path, "mlflow._promptlab", [f"mlflow[gateway]=={__version__}"]
|
179
|
+
)
|
180
|
+
default_reqs = sorted(inferred_reqs)
|
181
|
+
else:
|
182
|
+
default_reqs = None
|
183
|
+
conda_env, pip_requirements, pip_constraints = _process_pip_requirements(
|
184
|
+
default_reqs, pip_requirements, None
|
185
|
+
)
|
186
|
+
else:
|
187
|
+
conda_env, pip_requirements, pip_constraints = _process_conda_env(conda_env)
|
188
|
+
|
189
|
+
with open(os.path.join(path, _CONDA_ENV_FILE_NAME), "w") as f:
|
190
|
+
yaml.safe_dump(conda_env, stream=f, default_flow_style=False)
|
191
|
+
|
192
|
+
if pip_constraints:
|
193
|
+
write_to(os.path.join(path, _CONSTRAINTS_FILE_NAME), "\n".join(pip_constraints))
|
194
|
+
|
195
|
+
write_to(os.path.join(path, _REQUIREMENTS_FILE_NAME), "\n".join(pip_requirements))
|
196
|
+
|
197
|
+
_PythonEnv.current().to_yaml(os.path.join(path, _PYTHON_ENV_FILE_NAME))
|
@@ -0,0 +1,248 @@
|
|
1
|
+
import functools
|
2
|
+
import re
|
3
|
+
from textwrap import dedent
|
4
|
+
from typing import Any, Optional, Union
|
5
|
+
|
6
|
+
import mlflow
|
7
|
+
from mlflow.entities.model_registry.model_version import ModelVersion
|
8
|
+
from mlflow.entities.model_registry.prompt_version import PromptVersion
|
9
|
+
from mlflow.entities.model_registry.registered_model_tag import RegisteredModelTag
|
10
|
+
from mlflow.exceptions import MlflowException
|
11
|
+
from mlflow.prompt.constants import IS_PROMPT_TAG_KEY, PROMPT_NAME_RULE, PROMPT_TEXT_TAG_KEY
|
12
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE, RESOURCE_ALREADY_EXISTS
|
13
|
+
|
14
|
+
|
15
|
+
def model_version_to_prompt_version(
|
16
|
+
model_version: ModelVersion, prompt_tags: Optional[dict[str, str]] = None
|
17
|
+
) -> PromptVersion:
|
18
|
+
"""
|
19
|
+
Create a PromptVersion object from a ModelVersion object.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
model_version: The ModelVersion object to convert to a PromptVersion.
|
23
|
+
prompt_tags: The prompt-level tags. Optional.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
PromptVersion: The converted PromptVersion object.
|
27
|
+
"""
|
28
|
+
if IS_PROMPT_TAG_KEY not in model_version.tags:
|
29
|
+
raise MlflowException.invalid_parameter_value(
|
30
|
+
f"Name `{model_version.name}` is registered as a model, not a prompt. MLflow "
|
31
|
+
"does not allow registering a prompt with the same name as an existing model.",
|
32
|
+
)
|
33
|
+
|
34
|
+
if PROMPT_TEXT_TAG_KEY not in model_version.tags:
|
35
|
+
raise MlflowException.invalid_parameter_value(
|
36
|
+
f"Prompt `{model_version.name}` does not contain a prompt text"
|
37
|
+
)
|
38
|
+
|
39
|
+
return PromptVersion(
|
40
|
+
name=model_version.name,
|
41
|
+
version=int(model_version.version),
|
42
|
+
template=model_version.tags[PROMPT_TEXT_TAG_KEY],
|
43
|
+
commit_message=model_version.description,
|
44
|
+
creation_timestamp=model_version.creation_timestamp,
|
45
|
+
tags=model_version.tags,
|
46
|
+
aliases=model_version.aliases,
|
47
|
+
last_updated_timestamp=model_version.last_updated_timestamp,
|
48
|
+
user_id=model_version.user_id,
|
49
|
+
)
|
50
|
+
|
51
|
+
|
52
|
+
def add_prompt_filter_string(
|
53
|
+
filter_string: Optional[str], is_prompt: bool = False
|
54
|
+
) -> Optional[str]:
|
55
|
+
"""
|
56
|
+
Additional filter string to include/exclude prompts from the result.
|
57
|
+
By default, exclude prompts from the result.
|
58
|
+
"""
|
59
|
+
if IS_PROMPT_TAG_KEY not in (filter_string or ""):
|
60
|
+
prompt_filter_query = (
|
61
|
+
f"tag.`{IS_PROMPT_TAG_KEY}` = 'true'"
|
62
|
+
if is_prompt
|
63
|
+
else f"tag.`{IS_PROMPT_TAG_KEY}` != 'true'"
|
64
|
+
)
|
65
|
+
if filter_string:
|
66
|
+
filter_string = f"{filter_string} AND {prompt_filter_query}"
|
67
|
+
else:
|
68
|
+
filter_string = prompt_filter_query
|
69
|
+
return filter_string
|
70
|
+
|
71
|
+
|
72
|
+
def has_prompt_tag(tags: Optional[Union[list[RegisteredModelTag], dict[str, str]]]) -> bool:
|
73
|
+
"""Check if the given tags contain the prompt tag."""
|
74
|
+
if isinstance(tags, dict):
|
75
|
+
return IS_PROMPT_TAG_KEY in tags if tags else False
|
76
|
+
if not tags:
|
77
|
+
return
|
78
|
+
return any(tag.key == IS_PROMPT_TAG_KEY for tag in tags)
|
79
|
+
|
80
|
+
|
81
|
+
def is_prompt_supported_registry(registry_uri: Optional[str] = None) -> bool:
|
82
|
+
"""
|
83
|
+
Check if the current registry supports prompts.
|
84
|
+
|
85
|
+
Prompts registration is supported in:
|
86
|
+
- OSS MLflow Tracking Server (always)
|
87
|
+
- Unity Catalog
|
88
|
+
- Not supported in legacy Databricks workspace registry or Unity Catalog OSS
|
89
|
+
"""
|
90
|
+
registry_uri = registry_uri or mlflow.get_registry_uri()
|
91
|
+
|
92
|
+
# Legacy Databricks workspace registry doesn't support prompts
|
93
|
+
if registry_uri.startswith("databricks") and not registry_uri.startswith("databricks-uc"):
|
94
|
+
return False
|
95
|
+
|
96
|
+
# Unity Catalog OSS doesn't support prompts
|
97
|
+
if registry_uri.startswith("uc:"):
|
98
|
+
return False
|
99
|
+
|
100
|
+
# UC registries support prompts automatically
|
101
|
+
if registry_uri.startswith("databricks-uc"):
|
102
|
+
return True
|
103
|
+
|
104
|
+
# OSS MLflow registry always supports prompts
|
105
|
+
return True
|
106
|
+
|
107
|
+
|
108
|
+
def require_prompt_registry(func):
|
109
|
+
"""Ensure that the current registry supports prompts."""
|
110
|
+
|
111
|
+
@functools.wraps(func)
|
112
|
+
def wrapper(*args, **kwargs):
|
113
|
+
if args and isinstance(args[0], mlflow.MlflowClient):
|
114
|
+
registry_uri = args[0]._registry_uri
|
115
|
+
else:
|
116
|
+
registry_uri = mlflow.get_registry_uri()
|
117
|
+
|
118
|
+
if not is_prompt_supported_registry(registry_uri):
|
119
|
+
raise MlflowException(
|
120
|
+
f"The '{func.__name__}' API is not supported with the current registry. "
|
121
|
+
"Prompts are supported in OSS MLflow and Unity Catalog, but not in the "
|
122
|
+
"legacy Databricks workspace registry.",
|
123
|
+
)
|
124
|
+
return func(*args, **kwargs)
|
125
|
+
|
126
|
+
# Add note about prompt support to the docstring
|
127
|
+
func.__doc__ = dedent(f"""\
|
128
|
+
{func.__doc__}
|
129
|
+
|
130
|
+
.. note::
|
131
|
+
|
132
|
+
This API is supported in OSS MLflow Model Registry and Unity Catalog. It is
|
133
|
+
not supported in the legacy Databricks workspace model registry.
|
134
|
+
""")
|
135
|
+
return wrapper
|
136
|
+
|
137
|
+
|
138
|
+
def translate_prompt_exception(func):
|
139
|
+
"""
|
140
|
+
Translate MlflowException message related to RegisteredModel / ModelVersion into
|
141
|
+
prompt-specific message.
|
142
|
+
"""
|
143
|
+
MODEL_PATTERN = re.compile(r"(registered model|model version)", re.IGNORECASE)
|
144
|
+
|
145
|
+
@functools.wraps(func)
|
146
|
+
def wrapper(*args, **kwargs):
|
147
|
+
try:
|
148
|
+
return func(*args, **kwargs)
|
149
|
+
except MlflowException as e:
|
150
|
+
original_message = e.message
|
151
|
+
# Preserve the case of the first letter
|
152
|
+
new_message = MODEL_PATTERN.sub(
|
153
|
+
lambda m: "Prompt" if m.group(0)[0].isupper() else "prompt", e.message
|
154
|
+
)
|
155
|
+
|
156
|
+
if new_message != original_message:
|
157
|
+
raise MlflowException(new_message) from e
|
158
|
+
else:
|
159
|
+
raise e
|
160
|
+
|
161
|
+
return wrapper
|
162
|
+
|
163
|
+
|
164
|
+
def validate_prompt_name(name: Any):
|
165
|
+
"""Validate the prompt name against the prompt specific rule"""
|
166
|
+
if not isinstance(name, str) or not name:
|
167
|
+
raise MlflowException.invalid_parameter_value(
|
168
|
+
"Prompt name must be a non-empty string.",
|
169
|
+
)
|
170
|
+
|
171
|
+
if PROMPT_NAME_RULE.match(name) is None:
|
172
|
+
raise MlflowException.invalid_parameter_value(
|
173
|
+
"Prompt name can only contain alphanumeric characters, hyphens, underscores, and dots.",
|
174
|
+
)
|
175
|
+
|
176
|
+
|
177
|
+
def handle_resource_already_exist_error(
|
178
|
+
name: str,
|
179
|
+
is_existing_entity_prompt: bool,
|
180
|
+
is_new_entity_prompt: bool,
|
181
|
+
):
|
182
|
+
"""
|
183
|
+
Show a more specific error message for name conflict in Model Registry.
|
184
|
+
|
185
|
+
1. When creating a model with the same name as an existing model, say "model already exists".
|
186
|
+
2. When creating a prompt with the same name as an existing prompt, say "prompt already exists".
|
187
|
+
3. Otherwise, explain that a prompt and a model cannot have the same name.
|
188
|
+
"""
|
189
|
+
old_entity = "Prompt" if is_existing_entity_prompt else "Registered Model"
|
190
|
+
new_entity = "Prompt" if is_new_entity_prompt else "Registered Model"
|
191
|
+
|
192
|
+
if old_entity != new_entity:
|
193
|
+
raise MlflowException(
|
194
|
+
f"Tried to create a {new_entity.lower()} with name {name!r}, but the name is "
|
195
|
+
f"already taken by a {old_entity.lower()}. MLflow does not allow creating a "
|
196
|
+
"model and a prompt with the same name.",
|
197
|
+
RESOURCE_ALREADY_EXISTS,
|
198
|
+
)
|
199
|
+
|
200
|
+
raise MlflowException(
|
201
|
+
f"{new_entity} (name={name}) already exists.",
|
202
|
+
RESOURCE_ALREADY_EXISTS,
|
203
|
+
)
|
204
|
+
|
205
|
+
|
206
|
+
def parse_prompt_name_or_uri(
|
207
|
+
name_or_uri: str, version: Optional[Union[str, int]] = None
|
208
|
+
) -> tuple[str, Optional[Union[str, int]]]:
|
209
|
+
"""
|
210
|
+
Parse prompt name or URI into (name, version) tuple.
|
211
|
+
|
212
|
+
Handles two cases:
|
213
|
+
1. URI format: "prompts:/name/version" or "prompts:/name@alias"
|
214
|
+
- Returns (name, parsed_version)
|
215
|
+
- Raises error if version parameter is also provided
|
216
|
+
2. Name format: "my_prompt"
|
217
|
+
- Returns (name, version)
|
218
|
+
- Raises error if version parameter is not provided
|
219
|
+
|
220
|
+
Args:
|
221
|
+
name_or_uri: The name of the prompt, or the URI in the format "prompts:/name/version".
|
222
|
+
version: The version of the prompt (required when using name, not allowed when using URI).
|
223
|
+
|
224
|
+
Returns:
|
225
|
+
Tuple of (name, version) where version can be a string, int, or None
|
226
|
+
|
227
|
+
Raises:
|
228
|
+
MlflowException: If validation fails
|
229
|
+
"""
|
230
|
+
if name_or_uri.startswith("prompts:/"):
|
231
|
+
if version is not None:
|
232
|
+
raise MlflowException(
|
233
|
+
"The `version` argument should not be specified when loading a prompt by URI.",
|
234
|
+
INVALID_PARAMETER_VALUE,
|
235
|
+
)
|
236
|
+
# Parse URI to extract name and version
|
237
|
+
# This assumes the parse_prompt_uri method exists, but we'll handle that separately
|
238
|
+
# For now, we'll do basic parsing and let the caller handle the URI parsing
|
239
|
+
return name_or_uri, None
|
240
|
+
else:
|
241
|
+
if version is None:
|
242
|
+
raise MlflowException(
|
243
|
+
"Version must be specified when loading a prompt by name. "
|
244
|
+
"Use a prompt URI (e.g., 'prompts:/name/version') or provide the version "
|
245
|
+
"parameter.",
|
246
|
+
INVALID_PARAMETER_VALUE,
|
247
|
+
)
|
248
|
+
return name_or_uri, version
|