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,371 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
import urllib.parse
|
4
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
5
|
+
|
6
|
+
import requests
|
7
|
+
|
8
|
+
from mlflow.exceptions import MlflowException
|
9
|
+
from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from mlflow.gateway.providers import BaseProvider
|
13
|
+
|
14
|
+
_logger = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
|
17
|
+
def get_endpoint_type(endpoint_uri: str) -> Optional[str]:
|
18
|
+
"""
|
19
|
+
Get the type of the endpoint if it is MLflow deployment
|
20
|
+
endpoint. For other endpoints e.g. OpenAI, or if the
|
21
|
+
endpoint does not specify type, return None.
|
22
|
+
"""
|
23
|
+
schema, path = _parse_model_uri(endpoint_uri)
|
24
|
+
|
25
|
+
if schema != "endpoints":
|
26
|
+
return None
|
27
|
+
|
28
|
+
from pydantic import BaseModel
|
29
|
+
|
30
|
+
from mlflow.deployments import get_deploy_client
|
31
|
+
|
32
|
+
client = get_deploy_client()
|
33
|
+
|
34
|
+
endpoint = client.get_endpoint(path)
|
35
|
+
# TODO: Standardize the return type of `get_endpoint` and remove this check
|
36
|
+
endpoint = endpoint.dict() if isinstance(endpoint, BaseModel) else endpoint
|
37
|
+
return endpoint.get("task", endpoint.get("endpoint_type"))
|
38
|
+
|
39
|
+
|
40
|
+
# TODO: improve this name
|
41
|
+
def score_model_on_payload(
|
42
|
+
model_uri,
|
43
|
+
payload,
|
44
|
+
eval_parameters=None,
|
45
|
+
extra_headers=None,
|
46
|
+
proxy_url=None,
|
47
|
+
endpoint_type=None,
|
48
|
+
):
|
49
|
+
"""Call the model identified by the given uri with the given string prompt."""
|
50
|
+
from mlflow.deployments import get_deploy_client
|
51
|
+
|
52
|
+
eval_parameters = eval_parameters or {}
|
53
|
+
extra_headers = extra_headers or {}
|
54
|
+
|
55
|
+
prefix, suffix = _parse_model_uri(model_uri)
|
56
|
+
|
57
|
+
if prefix in ["gateway", "endpoints"]:
|
58
|
+
if isinstance(payload, str) and endpoint_type is None:
|
59
|
+
client = get_deploy_client()
|
60
|
+
endpoint_type = client.get_endpoint(suffix).endpoint_type
|
61
|
+
return call_deployments_api(suffix, payload, eval_parameters, endpoint_type)
|
62
|
+
elif prefix in ("model", "runs"):
|
63
|
+
# TODO: call _load_model_or_server
|
64
|
+
raise NotImplementedError
|
65
|
+
|
66
|
+
# Import here to avoid loading gateway module at the top level
|
67
|
+
from mlflow.gateway.provider_registry import is_supported_provider
|
68
|
+
|
69
|
+
if is_supported_provider(prefix):
|
70
|
+
return _call_llm_provider_api(
|
71
|
+
prefix, suffix, payload, eval_parameters, extra_headers, proxy_url
|
72
|
+
)
|
73
|
+
|
74
|
+
raise MlflowException(
|
75
|
+
f"Unknown model uri prefix '{prefix}'",
|
76
|
+
error_code=INVALID_PARAMETER_VALUE,
|
77
|
+
)
|
78
|
+
|
79
|
+
|
80
|
+
def _parse_model_uri(model_uri):
|
81
|
+
parsed = urllib.parse.urlparse(model_uri, allow_fragments=False)
|
82
|
+
scheme = parsed.scheme
|
83
|
+
path = parsed.path
|
84
|
+
if not path.startswith("/") or len(path) <= 1:
|
85
|
+
raise MlflowException(
|
86
|
+
f"Malformed model uri '{model_uri}'", error_code=INVALID_PARAMETER_VALUE
|
87
|
+
)
|
88
|
+
path = path.lstrip("/")
|
89
|
+
return scheme, path
|
90
|
+
|
91
|
+
|
92
|
+
_PREDICT_ERROR_MSG = """\
|
93
|
+
Failed to call the deployment endpoint. Please check the deployment URL \
|
94
|
+
is set correctly and the input payload is valid.\n
|
95
|
+
- Error: {e}\n
|
96
|
+
- Deployment URI: {uri}\n
|
97
|
+
- Input payload: {payload}"""
|
98
|
+
|
99
|
+
|
100
|
+
def _is_supported_llm_provider(schema: str) -> bool:
|
101
|
+
from mlflow.gateway.provider_registry import provider_registry
|
102
|
+
|
103
|
+
return schema in provider_registry.keys()
|
104
|
+
|
105
|
+
|
106
|
+
def _call_llm_provider_api(
|
107
|
+
provider_name: str,
|
108
|
+
model: str,
|
109
|
+
input_data: str,
|
110
|
+
eval_parameters: dict[str, Any],
|
111
|
+
extra_headers: dict[str, str],
|
112
|
+
proxy_url: Optional[str] = None,
|
113
|
+
) -> str:
|
114
|
+
"""
|
115
|
+
Invoke chat endpoint of various LLM providers.
|
116
|
+
|
117
|
+
Under the hood, this function uses the MLflow Gateway to transform the input/output data
|
118
|
+
for different LLM providers.
|
119
|
+
|
120
|
+
Args:
|
121
|
+
provider_name: The provider name, e.g., "anthropic".
|
122
|
+
model: The model name, e.g., "claude-3-5-sonnet"
|
123
|
+
input_data: The input string prompt to send to the model as a chat message.
|
124
|
+
eval_parameters: The additional parameters to send to the model, e.g. temperature.
|
125
|
+
extra_headers: The additional headers to send to the provider.
|
126
|
+
proxy_url: Proxy URL to be used for the judge model. If not specified, the default
|
127
|
+
URL for the LLM provider will be used.
|
128
|
+
"""
|
129
|
+
from mlflow.gateway.config import Provider
|
130
|
+
from mlflow.gateway.schemas import chat
|
131
|
+
|
132
|
+
provider = _get_provider_instance(provider_name, model)
|
133
|
+
|
134
|
+
chat_request = chat.RequestPayload(
|
135
|
+
model=model,
|
136
|
+
messages=[
|
137
|
+
chat.RequestMessage(role="user", content=input_data),
|
138
|
+
],
|
139
|
+
**eval_parameters,
|
140
|
+
)
|
141
|
+
|
142
|
+
# Filter out keys in the payload to the specified ones + "messages".
|
143
|
+
# Does not include "model" key here because some providers do not accept it as a
|
144
|
+
# part of the payload. Whether or not to include "model" key must be determined
|
145
|
+
# by each provider implementation.
|
146
|
+
filtered_keys = {"messages", *eval_parameters.keys()}
|
147
|
+
|
148
|
+
payload = {
|
149
|
+
k: v
|
150
|
+
for k, v in chat_request.model_dump(exclude_none=True).items()
|
151
|
+
if (v is not None) and (k in filtered_keys)
|
152
|
+
}
|
153
|
+
chat_payload = provider.adapter_class.chat_to_model(payload, provider.config)
|
154
|
+
chat_payload.update(eval_parameters)
|
155
|
+
|
156
|
+
if provider_name in [Provider.AMAZON_BEDROCK, Provider.BEDROCK]:
|
157
|
+
if proxy_url or extra_headers:
|
158
|
+
_logger.warning(
|
159
|
+
"Proxy URL and extra headers are not supported for Bedrock LLMs. "
|
160
|
+
"Ignoring the provided proxy URL and extra headers.",
|
161
|
+
)
|
162
|
+
response = provider._request(chat_payload)
|
163
|
+
else:
|
164
|
+
response = _send_request(
|
165
|
+
endpoint=proxy_url or provider.get_endpoint_url("llm/v1/chat"),
|
166
|
+
headers={**provider.headers, **extra_headers},
|
167
|
+
payload=chat_payload,
|
168
|
+
)
|
169
|
+
chat_response = provider.adapter_class.model_to_chat(response, provider.config)
|
170
|
+
if len(chat_response.choices) == 0:
|
171
|
+
raise MlflowException(
|
172
|
+
"Failed to score the provided input as the judge LLM did not return "
|
173
|
+
"any chat completion results in the response."
|
174
|
+
)
|
175
|
+
content = chat_response.choices[0].message.content
|
176
|
+
|
177
|
+
# NB: Evaluation only handles text content for now.
|
178
|
+
return content[0].text if isinstance(content, list) else content
|
179
|
+
|
180
|
+
|
181
|
+
def _get_provider_instance(provider: str, model: str) -> "BaseProvider":
|
182
|
+
"""Get the provider instance for the given provider name and the model name."""
|
183
|
+
from mlflow.gateway.config import Provider, RouteConfig
|
184
|
+
|
185
|
+
def _get_route_config(config):
|
186
|
+
return RouteConfig(
|
187
|
+
name=provider,
|
188
|
+
endpoint_type="llm/v1/chat",
|
189
|
+
model={
|
190
|
+
"provider": provider,
|
191
|
+
"name": model,
|
192
|
+
"config": config.model_dump(),
|
193
|
+
},
|
194
|
+
)
|
195
|
+
|
196
|
+
# NB: Not all LLM providers in MLflow Gateway are supported here. We can add
|
197
|
+
# new ones as requested, as long as the provider support chat endpoints.
|
198
|
+
if provider == Provider.OPENAI:
|
199
|
+
from mlflow.gateway.providers.openai import OpenAIConfig, OpenAIProvider
|
200
|
+
from mlflow.openai.model import _get_api_config, _OAITokenHolder
|
201
|
+
|
202
|
+
api_config = _get_api_config()
|
203
|
+
api_token = _OAITokenHolder(api_config.api_type)
|
204
|
+
api_token.refresh()
|
205
|
+
|
206
|
+
config = OpenAIConfig(
|
207
|
+
openai_api_key=api_token.token,
|
208
|
+
openai_api_type=api_config.api_type or "openai",
|
209
|
+
openai_api_base=api_config.api_base,
|
210
|
+
openai_api_version=api_config.api_version,
|
211
|
+
openai_deployment_name=api_config.deployment_id,
|
212
|
+
openai_organization=api_config.organization,
|
213
|
+
)
|
214
|
+
return OpenAIProvider(_get_route_config(config))
|
215
|
+
|
216
|
+
elif provider == Provider.ANTHROPIC:
|
217
|
+
from mlflow.gateway.providers.anthropic import AnthropicConfig, AnthropicProvider
|
218
|
+
|
219
|
+
config = AnthropicConfig(anthropic_api_key=os.environ.get("ANTHROPIC_API_KEY"))
|
220
|
+
return AnthropicProvider(_get_route_config(config))
|
221
|
+
|
222
|
+
elif provider in [Provider.AMAZON_BEDROCK, Provider.BEDROCK]:
|
223
|
+
from mlflow.gateway.config import AWSIdAndKey, AWSRole
|
224
|
+
from mlflow.gateway.providers.bedrock import AmazonBedrockConfig, AmazonBedrockProvider
|
225
|
+
|
226
|
+
if aws_role_arn := os.environ.get("AWS_ROLE_ARN"):
|
227
|
+
aws_config = AWSRole(
|
228
|
+
aws_region=os.environ.get("AWS_REGION"),
|
229
|
+
aws_role_arn=aws_role_arn,
|
230
|
+
)
|
231
|
+
else:
|
232
|
+
aws_config = AWSIdAndKey(
|
233
|
+
aws_region=os.environ.get("AWS_REGION"),
|
234
|
+
aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID"),
|
235
|
+
aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY"),
|
236
|
+
aws_session_token=os.environ.get("AWS_SESSION_TOKEN"),
|
237
|
+
)
|
238
|
+
config = AmazonBedrockConfig(aws_config=aws_config)
|
239
|
+
return AmazonBedrockProvider(_get_route_config(config))
|
240
|
+
|
241
|
+
# # Cohere provider implementation seems to be broken and does not work with
|
242
|
+
# # their latest APIs. Uncomment once the provider implementation is fixed.
|
243
|
+
# elif provider == Provider.COHERE:
|
244
|
+
# from mlflow.gateway.providers.cohere import CohereConfig, CohereProvider
|
245
|
+
|
246
|
+
# config = CohereConfig(cohere_api_key=os.environ.get("COHERE_API_KEY"))
|
247
|
+
# return CohereProvider(_get_route_config(config))
|
248
|
+
|
249
|
+
elif provider == Provider.MISTRAL:
|
250
|
+
from mlflow.gateway.providers.mistral import MistralConfig, MistralProvider
|
251
|
+
|
252
|
+
config = MistralConfig(mistral_api_key=os.environ.get("MISTRAL_API_KEY"))
|
253
|
+
return MistralProvider(_get_route_config(config))
|
254
|
+
|
255
|
+
elif provider == Provider.TOGETHERAI:
|
256
|
+
from mlflow.gateway.providers.togetherai import TogetherAIConfig, TogetherAIProvider
|
257
|
+
|
258
|
+
config = TogetherAIConfig(togetherai_api_key=os.environ.get("TOGETHERAI_API_KEY"))
|
259
|
+
return TogetherAIProvider(_get_route_config(config))
|
260
|
+
|
261
|
+
raise MlflowException(f"Provider '{provider}' is not supported for evaluation.")
|
262
|
+
|
263
|
+
|
264
|
+
def _send_request(
|
265
|
+
endpoint: str, headers: dict[str, str], payload: dict[str, Any]
|
266
|
+
) -> dict[str, Any]:
|
267
|
+
try:
|
268
|
+
response = requests.post(
|
269
|
+
url=endpoint,
|
270
|
+
headers=headers,
|
271
|
+
json=payload,
|
272
|
+
timeout=60,
|
273
|
+
)
|
274
|
+
response.raise_for_status()
|
275
|
+
except requests.exceptions.HTTPError as e:
|
276
|
+
raise MlflowException(
|
277
|
+
f"Failed to call LLM endpoint at {endpoint}.\n- Error: {e}\n- Input payload: {payload}."
|
278
|
+
)
|
279
|
+
|
280
|
+
return response.json()
|
281
|
+
|
282
|
+
|
283
|
+
def call_deployments_api(
|
284
|
+
deployment_uri: str,
|
285
|
+
input_data: Union[str, dict[str, Any]],
|
286
|
+
eval_parameters: Optional[dict[str, Any]] = None,
|
287
|
+
endpoint_type: Optional[str] = None,
|
288
|
+
):
|
289
|
+
"""Call the deployment endpoint with the given payload and parameters.
|
290
|
+
|
291
|
+
Args:
|
292
|
+
deployment_uri: The URI of the deployment endpoint.
|
293
|
+
input_data: The input string or dictionary to send to the endpoint.
|
294
|
+
- If it is a string, MLflow tries to construct the payload based on the endpoint type.
|
295
|
+
- If it is a dictionary, MLflow directly sends it to the endpoint.
|
296
|
+
eval_parameters: The evaluation parameters to send to the endpoint.
|
297
|
+
endpoint_type: The type of the endpoint. If specified, must be 'llm/v1/completions'
|
298
|
+
or 'llm/v1/chat'. If not specified, MLflow tries to get the endpoint type
|
299
|
+
from the endpoint, and if not found, directly sends the payload to the endpoint.
|
300
|
+
|
301
|
+
Returns:
|
302
|
+
The unpacked response from the endpoint.
|
303
|
+
"""
|
304
|
+
from mlflow.deployments import get_deploy_client
|
305
|
+
|
306
|
+
client = get_deploy_client()
|
307
|
+
|
308
|
+
if isinstance(input_data, str):
|
309
|
+
payload = _construct_payload_from_str(input_data, endpoint_type)
|
310
|
+
elif isinstance(input_data, dict):
|
311
|
+
# If the input is a dictionary, we assume it is already in the correct format
|
312
|
+
payload = input_data
|
313
|
+
else:
|
314
|
+
raise MlflowException(
|
315
|
+
f"Invalid input data type {type(input_data)}. Must be a string or a dictionary.",
|
316
|
+
error_code=INVALID_PARAMETER_VALUE,
|
317
|
+
)
|
318
|
+
payload = {**payload, **(eval_parameters or {})}
|
319
|
+
|
320
|
+
try:
|
321
|
+
response = client.predict(endpoint=deployment_uri, inputs=payload)
|
322
|
+
except Exception as e:
|
323
|
+
raise MlflowException(
|
324
|
+
_PREDICT_ERROR_MSG.format(e=e, uri=deployment_uri, payload=payload)
|
325
|
+
) from e
|
326
|
+
|
327
|
+
return _parse_response(response, endpoint_type)
|
328
|
+
|
329
|
+
|
330
|
+
def _construct_payload_from_str(prompt: str, endpoint_type: str) -> dict[str, Any]:
|
331
|
+
"""
|
332
|
+
Construct the payload from the input string based on the endpoint type.
|
333
|
+
If the endpoint type is not specified or unsupported one, raise an exception.
|
334
|
+
"""
|
335
|
+
if endpoint_type == "llm/v1/completions":
|
336
|
+
return {"prompt": prompt}
|
337
|
+
elif endpoint_type == "llm/v1/chat":
|
338
|
+
return {"messages": [{"role": "user", "content": prompt}]}
|
339
|
+
else:
|
340
|
+
raise MlflowException(
|
341
|
+
f"Unsupported endpoint type: {endpoint_type}. If string input is provided, "
|
342
|
+
"the endpoint type must be 'llm/v1/completions' or 'llm/v1/chat'.",
|
343
|
+
error_code=INVALID_PARAMETER_VALUE,
|
344
|
+
)
|
345
|
+
|
346
|
+
|
347
|
+
def _parse_response(
|
348
|
+
response: dict[str, Any], endpoint_type: Optional[str]
|
349
|
+
) -> Union[Optional[str], dict[str, Any]]:
|
350
|
+
if endpoint_type == "llm/v1/completions":
|
351
|
+
return _parse_completions_response_format(response)
|
352
|
+
elif endpoint_type == "llm/v1/chat":
|
353
|
+
return _parse_chat_response_format(response)
|
354
|
+
else:
|
355
|
+
return response
|
356
|
+
|
357
|
+
|
358
|
+
def _parse_chat_response_format(response):
|
359
|
+
try:
|
360
|
+
text = response["choices"][0]["message"]["content"]
|
361
|
+
except (KeyError, IndexError, TypeError):
|
362
|
+
text = None
|
363
|
+
return text
|
364
|
+
|
365
|
+
|
366
|
+
def _parse_completions_response_format(response):
|
367
|
+
try:
|
368
|
+
text = response["choices"][0]["text"]
|
369
|
+
except (KeyError, IndexError, TypeError):
|
370
|
+
text = None
|
371
|
+
return text
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import string
|
2
|
+
from typing import Any, Union
|
3
|
+
|
4
|
+
|
5
|
+
class PromptTemplate:
|
6
|
+
"""A prompt template for a language model.
|
7
|
+
|
8
|
+
A prompt template consists of an array of strings that will be concatenated together. It accepts
|
9
|
+
a set of parameters from the user that can be used to generate a prompt for a language model.
|
10
|
+
|
11
|
+
The template can be formatted using f-strings.
|
12
|
+
|
13
|
+
Example:
|
14
|
+
|
15
|
+
.. code-block:: python
|
16
|
+
|
17
|
+
from mlflow.metrics.genai.prompt_template import PromptTemplate
|
18
|
+
|
19
|
+
# Instantiation using initializer
|
20
|
+
prompt = PromptTemplate(template_str="Say {foo} {baz}")
|
21
|
+
|
22
|
+
# Instantiation using partial_fill
|
23
|
+
prompt = PromptTemplate(template_str="Say {foo} {baz}").partial_fill(foo="bar")
|
24
|
+
|
25
|
+
# Format the prompt
|
26
|
+
prompt.format(baz="qux")
|
27
|
+
"""
|
28
|
+
|
29
|
+
def __init__(self, template_str: Union[str, list[str]]):
|
30
|
+
self.template_strs = [template_str] if isinstance(template_str, str) else template_str
|
31
|
+
|
32
|
+
@property
|
33
|
+
def variables(self):
|
34
|
+
return {
|
35
|
+
fname
|
36
|
+
for template_str in self.template_strs
|
37
|
+
for _, fname, _, _ in string.Formatter().parse(template_str)
|
38
|
+
if fname
|
39
|
+
}
|
40
|
+
|
41
|
+
def format(self, **kwargs: Any) -> str:
|
42
|
+
safe_kwargs = {k: v for k, v in kwargs.items() if v is not None}
|
43
|
+
formatted_strs = []
|
44
|
+
for template_str in self.template_strs:
|
45
|
+
extracted_variables = [
|
46
|
+
fname for _, fname, _, _ in string.Formatter().parse(template_str) if fname
|
47
|
+
]
|
48
|
+
if all(item in safe_kwargs.keys() for item in extracted_variables):
|
49
|
+
formatted_strs.append(template_str.format(**safe_kwargs))
|
50
|
+
|
51
|
+
return "".join(formatted_strs)
|
52
|
+
|
53
|
+
def partial_fill(self, **kwargs: Any) -> "PromptTemplate":
|
54
|
+
safe_kwargs = {k: v for k, v in kwargs.items() if v is not None}
|
55
|
+
new_template_strs = []
|
56
|
+
for template_str in self.template_strs:
|
57
|
+
extracted_variables = [
|
58
|
+
fname for _, fname, _, _ in string.Formatter().parse(template_str) if fname
|
59
|
+
]
|
60
|
+
safe_available_kwargs = {
|
61
|
+
k: safe_kwargs.get(k, "{" + k + "}") for k in extracted_variables
|
62
|
+
}
|
63
|
+
new_template_strs.append(template_str.format_map(safe_available_kwargs))
|
64
|
+
|
65
|
+
return PromptTemplate(template_str=new_template_strs)
|
66
|
+
|
67
|
+
def __str__(self) -> str:
|
68
|
+
return "".join(self.template_strs)
|
File without changes
|