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,244 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
4
|
+
|
5
|
+
from mlflow.entities import Assessment, Trace
|
6
|
+
from mlflow.exceptions import MlflowException
|
7
|
+
from mlflow.genai.evaluation.constant import (
|
8
|
+
AgentEvaluationReserverKey,
|
9
|
+
)
|
10
|
+
from mlflow.genai.scorers import Scorer
|
11
|
+
from mlflow.models import EvaluationMetric
|
12
|
+
|
13
|
+
try:
|
14
|
+
# `pandas` is not required for `mlflow-skinny`.
|
15
|
+
import pandas as pd
|
16
|
+
except ImportError:
|
17
|
+
pass
|
18
|
+
|
19
|
+
if TYPE_CHECKING:
|
20
|
+
from mlflow.genai.datasets import EvaluationDataset
|
21
|
+
|
22
|
+
try:
|
23
|
+
import pyspark.sql.dataframe
|
24
|
+
|
25
|
+
EvaluationDatasetTypes = Union[
|
26
|
+
pd.DataFrame, pyspark.sql.dataframe.DataFrame, list[dict], EvaluationDataset
|
27
|
+
]
|
28
|
+
except ImportError:
|
29
|
+
EvaluationDatasetTypes = Union[pd.DataFrame, list[dict], EvaluationDataset]
|
30
|
+
|
31
|
+
|
32
|
+
_logger = logging.getLogger(__name__)
|
33
|
+
|
34
|
+
|
35
|
+
def _convert_eval_set_to_df(data: "EvaluationDatasetTypes") -> "pd.DataFrame":
|
36
|
+
"""
|
37
|
+
Takes in a dataset in the format that `mlflow.genai.evaluate()` expects and
|
38
|
+
converts it into a pandas DataFrame.
|
39
|
+
"""
|
40
|
+
if isinstance(data, list):
|
41
|
+
# validate that every item in the list is a dict and has inputs as key
|
42
|
+
for item in data:
|
43
|
+
if not isinstance(item, dict):
|
44
|
+
raise MlflowException.invalid_parameter_value(
|
45
|
+
"Every item in the list must be a dictionary."
|
46
|
+
)
|
47
|
+
df = pd.DataFrame(data)
|
48
|
+
elif isinstance(data, pd.DataFrame):
|
49
|
+
# Data is already a pd DataFrame, just copy it
|
50
|
+
df = data.copy()
|
51
|
+
else:
|
52
|
+
try:
|
53
|
+
from mlflow.utils.spark_utils import get_spark_dataframe_type
|
54
|
+
|
55
|
+
if isinstance(data, get_spark_dataframe_type()):
|
56
|
+
df = _deserialize_inputs_and_expectations_column(data.toPandas())
|
57
|
+
else:
|
58
|
+
raise MlflowException.invalid_parameter_value(
|
59
|
+
"Invalid type for parameter `data`. Expected a list of dictionaries, "
|
60
|
+
f"a pandas DataFrame, or a Spark DataFrame. Got: {type(data)}"
|
61
|
+
)
|
62
|
+
except ImportError:
|
63
|
+
raise ImportError(
|
64
|
+
"The `pyspark` package is required to use mlflow.genai.evaluate() "
|
65
|
+
"Please install it with `pip install pyspark`."
|
66
|
+
)
|
67
|
+
|
68
|
+
if len(df) == 0:
|
69
|
+
raise MlflowException.invalid_parameter_value(
|
70
|
+
"The dataset is empty. Please provide a non-empty dataset."
|
71
|
+
)
|
72
|
+
|
73
|
+
if not any(col in df.columns for col in ("trace", "inputs")):
|
74
|
+
raise MlflowException.invalid_parameter_value(
|
75
|
+
"Either `inputs` or `trace` column is required in the dataset. Please provide inputs "
|
76
|
+
"for every datapoint or provide a trace."
|
77
|
+
)
|
78
|
+
|
79
|
+
return df
|
80
|
+
|
81
|
+
|
82
|
+
def _convert_to_legacy_eval_set(data: "EvaluationDatasetTypes") -> "pd.DataFrame":
|
83
|
+
"""
|
84
|
+
Takes in a dataset in the format that mlflow.genai.evaluate() expects and converts it into
|
85
|
+
to the current eval-set schema that Agent Evaluation takes in. The transformed schema should
|
86
|
+
be accepted by mlflow.evaluate().
|
87
|
+
The expected schema can be found at:
|
88
|
+
https://docs.databricks.com/aws/en/generative-ai/agent-evaluation/evaluation-schema
|
89
|
+
|
90
|
+
NB: The harness secretly support 'expectations' column as well. It accepts a dictionary of
|
91
|
+
expectations, which is same as the schema that mlflow.genai.evaluate() expects.
|
92
|
+
Therefore, we can simply pass through expectations column.
|
93
|
+
"""
|
94
|
+
column_mapping = {
|
95
|
+
"inputs": "request",
|
96
|
+
"outputs": "response",
|
97
|
+
}
|
98
|
+
|
99
|
+
df = _convert_eval_set_to_df(data)
|
100
|
+
|
101
|
+
return (
|
102
|
+
df.rename(columns=column_mapping)
|
103
|
+
.pipe(_deserialize_trace_column_if_needed)
|
104
|
+
.pipe(_extract_request_from_trace)
|
105
|
+
.pipe(_extract_expectations_from_trace)
|
106
|
+
)
|
107
|
+
|
108
|
+
|
109
|
+
def _deserialize_inputs_and_expectations_column(df: "pd.DataFrame") -> "pd.DataFrame":
|
110
|
+
"""
|
111
|
+
Deserialize the `inputs` and `expectations` string columns from the dataframe.
|
112
|
+
|
113
|
+
When managed datasets are read as Spark DataFrames, the `inputs` and `expectations` columns
|
114
|
+
are loaded as string columns of JSON strings. This function deserializes these columns into
|
115
|
+
dictionaries expected by mlflow.genai.evaluate().
|
116
|
+
"""
|
117
|
+
target_columns = ["inputs", "expectations"]
|
118
|
+
for col in target_columns:
|
119
|
+
if col not in df.columns or not isinstance(df[col][0], str):
|
120
|
+
continue
|
121
|
+
|
122
|
+
try:
|
123
|
+
df[col] = df[col].apply(json.loads)
|
124
|
+
except json.JSONDecodeError as e:
|
125
|
+
if col == "inputs":
|
126
|
+
msg = (
|
127
|
+
"The `inputs` column must be a valid JSON string of field names and values. "
|
128
|
+
"For example, `{'question': 'What is the capital of France?'}`"
|
129
|
+
)
|
130
|
+
else:
|
131
|
+
msg = (
|
132
|
+
"The `expectations` column must be a valid JSON string of assessment names and "
|
133
|
+
"values. For example, `{'expected_facts': ['fact1', 'fact2']}`"
|
134
|
+
)
|
135
|
+
raise MlflowException.invalid_parameter_value(
|
136
|
+
f"Failed to parse `{col}` column. Error: {e}\nHint: {msg}"
|
137
|
+
)
|
138
|
+
|
139
|
+
return df
|
140
|
+
|
141
|
+
|
142
|
+
def _deserialize_trace_column_if_needed(df: "pd.DataFrame") -> "pd.DataFrame":
|
143
|
+
"""
|
144
|
+
Deserialize the `trace` column from the dataframe if it is a string.
|
145
|
+
|
146
|
+
Since MLflow 3.2.0, mlflow.search_traces() returns a pandas DataFrame with a `trace`
|
147
|
+
column that is a trace json representation rather than the Trace object itself. This
|
148
|
+
function deserializes the `trace` column into a Trace object.
|
149
|
+
"""
|
150
|
+
if "trace" in df.columns:
|
151
|
+
df["trace"] = df["trace"].apply(lambda t: Trace.from_json(t) if isinstance(t, str) else t)
|
152
|
+
return df
|
153
|
+
|
154
|
+
|
155
|
+
def _extract_request_from_trace(df: "pd.DataFrame") -> "pd.DataFrame":
|
156
|
+
"""
|
157
|
+
Add `request` columns to the dataframe if it is not already present.
|
158
|
+
This is for compatibility with mlflow.evaluate() that requires `request` column.
|
159
|
+
"""
|
160
|
+
if "trace" not in df.columns:
|
161
|
+
return df
|
162
|
+
|
163
|
+
if "request" not in df.columns:
|
164
|
+
df["request"] = df["trace"].apply(lambda trace: json.loads(trace.data.request))
|
165
|
+
return df
|
166
|
+
|
167
|
+
|
168
|
+
def _extract_expectations_from_trace(df: "pd.DataFrame") -> "pd.DataFrame":
|
169
|
+
"""
|
170
|
+
Add `expectations` columns to the dataframe from assessments
|
171
|
+
stored in the traces, if the "expectations" column is not already present.
|
172
|
+
"""
|
173
|
+
if "trace" not in df.columns:
|
174
|
+
return df
|
175
|
+
|
176
|
+
expectations_column = []
|
177
|
+
for trace in df["trace"]:
|
178
|
+
expectations = {}
|
179
|
+
for assessment in trace.info.assessments or []:
|
180
|
+
if assessment.expectation is not None:
|
181
|
+
expectations[assessment.name] = assessment.expectation.value
|
182
|
+
expectations_column.append(expectations)
|
183
|
+
# If no trace has assessments, not add the column
|
184
|
+
if all(len(expectations) == 0 for expectations in expectations_column):
|
185
|
+
return df
|
186
|
+
|
187
|
+
df["expectations"] = expectations_column
|
188
|
+
return df
|
189
|
+
|
190
|
+
|
191
|
+
def _convert_scorer_to_legacy_metric(scorer: Scorer) -> EvaluationMetric:
|
192
|
+
"""
|
193
|
+
Takes in a Scorer object and converts it into a legacy MLflow 2.x
|
194
|
+
Metric object.
|
195
|
+
"""
|
196
|
+
try:
|
197
|
+
from databricks.agents.evals import metric
|
198
|
+
except ImportError:
|
199
|
+
raise ImportError(
|
200
|
+
"The `databricks-agents` package is required to use mlflow.genai.evaluate() "
|
201
|
+
"Please install it with `pip install databricks-agents`."
|
202
|
+
)
|
203
|
+
|
204
|
+
from mlflow.types.llm import ChatCompletionRequest
|
205
|
+
|
206
|
+
def eval_fn(
|
207
|
+
request_id: str,
|
208
|
+
request: Union[ChatCompletionRequest, str],
|
209
|
+
response: Optional[Any],
|
210
|
+
expected_response: Optional[Any],
|
211
|
+
trace: Optional[Trace],
|
212
|
+
guidelines: Optional[Union[list[str], dict[str, list[str]]]],
|
213
|
+
expected_facts: Optional[list[str]],
|
214
|
+
expected_retrieved_context: Optional[list[dict[str, str]]],
|
215
|
+
custom_expected: Optional[dict[str, Any]],
|
216
|
+
**kwargs,
|
217
|
+
) -> Union[int, float, bool, str, Assessment, list[Assessment]]:
|
218
|
+
# Condense all expectations into a single dict
|
219
|
+
expectations = {}
|
220
|
+
if expected_response is not None:
|
221
|
+
expectations[AgentEvaluationReserverKey.EXPECTED_RESPONSE] = expected_response
|
222
|
+
if expected_facts is not None:
|
223
|
+
expectations[AgentEvaluationReserverKey.EXPECTED_FACTS] = expected_facts
|
224
|
+
if expected_retrieved_context is not None:
|
225
|
+
expectations[AgentEvaluationReserverKey.EXPECTED_RETRIEVED_CONTEXT] = (
|
226
|
+
expected_retrieved_context
|
227
|
+
)
|
228
|
+
if guidelines is not None:
|
229
|
+
expectations[AgentEvaluationReserverKey.GUIDELINES] = guidelines
|
230
|
+
if custom_expected is not None:
|
231
|
+
expectations.update(custom_expected)
|
232
|
+
|
233
|
+
merged = {
|
234
|
+
"inputs": request,
|
235
|
+
"outputs": response,
|
236
|
+
"expectations": expectations,
|
237
|
+
"trace": trace,
|
238
|
+
}
|
239
|
+
return scorer.run(**merged)
|
240
|
+
|
241
|
+
return metric(
|
242
|
+
eval_fn=eval_fn,
|
243
|
+
name=scorer.name,
|
244
|
+
)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from mlflow.genai.judges.databricks import (
|
2
|
+
CategoricalRating,
|
3
|
+
custom_prompt_judge,
|
4
|
+
is_context_relevant,
|
5
|
+
is_context_sufficient,
|
6
|
+
is_correct,
|
7
|
+
is_grounded,
|
8
|
+
is_safe,
|
9
|
+
meets_guidelines,
|
10
|
+
)
|
11
|
+
|
12
|
+
__all__ = [
|
13
|
+
"CategoricalRating",
|
14
|
+
"is_grounded",
|
15
|
+
"is_safe",
|
16
|
+
"is_correct",
|
17
|
+
"is_context_relevant",
|
18
|
+
"is_context_sufficient",
|
19
|
+
"meets_guidelines",
|
20
|
+
"custom_prompt_judge",
|
21
|
+
]
|
@@ -0,0 +1,404 @@
|
|
1
|
+
from functools import wraps
|
2
|
+
from typing import Any, Callable, Optional, Union
|
3
|
+
|
4
|
+
from mlflow.entities.assessment import Feedback
|
5
|
+
from mlflow.genai.utils.enum_utils import StrEnum
|
6
|
+
from mlflow.utils.annotations import experimental
|
7
|
+
|
8
|
+
# NB: User-facing name for the is_context_relevant assessment.
|
9
|
+
_IS_CONTEXT_RELEVANT_ASSESSMENT_NAME = "relevance_to_context"
|
10
|
+
|
11
|
+
|
12
|
+
class CategoricalRating(StrEnum):
|
13
|
+
"""
|
14
|
+
A categorical rating for an assessment.
|
15
|
+
|
16
|
+
Example:
|
17
|
+
.. code-block:: python
|
18
|
+
|
19
|
+
from mlflow.genai.judges import CategoricalRating
|
20
|
+
from mlflow.entities import Feedback
|
21
|
+
|
22
|
+
# Create feedback with categorical rating
|
23
|
+
feedback = Feedback(
|
24
|
+
name="my_metric", value=CategoricalRating.YES, rationale="The metric is passing."
|
25
|
+
)
|
26
|
+
"""
|
27
|
+
|
28
|
+
YES = "yes"
|
29
|
+
NO = "no"
|
30
|
+
UNKNOWN = "unknown"
|
31
|
+
|
32
|
+
@classmethod
|
33
|
+
def _missing_(cls, value: str):
|
34
|
+
value = value.lower()
|
35
|
+
for member in cls:
|
36
|
+
if member == value:
|
37
|
+
return member
|
38
|
+
return cls.UNKNOWN
|
39
|
+
|
40
|
+
|
41
|
+
def _sanitize_feedback(feedback: Feedback) -> Feedback:
|
42
|
+
"""Sanitize the feedback object from the databricks judges.
|
43
|
+
|
44
|
+
The judge returns a CategoricalRating class defined in the databricks-agents package.
|
45
|
+
This function converts it to our CategoricalRating definition above.
|
46
|
+
|
47
|
+
Args:
|
48
|
+
feedback: The Feedback object to convert.
|
49
|
+
|
50
|
+
Returns:
|
51
|
+
A new Feedback object with our CategoricalRating.
|
52
|
+
"""
|
53
|
+
feedback.value = CategoricalRating(feedback.value) if feedback.value else feedback.value
|
54
|
+
return feedback
|
55
|
+
|
56
|
+
|
57
|
+
def requires_databricks_agents(func):
|
58
|
+
"""Decorator to check if the `databricks-agents` package is installed."""
|
59
|
+
|
60
|
+
@wraps(func)
|
61
|
+
def wrapper(*args, **kwargs):
|
62
|
+
try:
|
63
|
+
import databricks.agents.evals.judges # noqa: F401
|
64
|
+
|
65
|
+
except ImportError:
|
66
|
+
raise ImportError(
|
67
|
+
f"The `databricks-agents` package is required to use "
|
68
|
+
f"`mlflow.genai.judges.{func.__name__}`. "
|
69
|
+
"Please install it with `pip install databricks-agents`."
|
70
|
+
)
|
71
|
+
|
72
|
+
return func(*args, **kwargs)
|
73
|
+
|
74
|
+
return wrapper
|
75
|
+
|
76
|
+
|
77
|
+
@requires_databricks_agents
|
78
|
+
def is_context_relevant(*, request: str, context: Any, name: Optional[str] = None) -> Feedback:
|
79
|
+
"""
|
80
|
+
LLM judge determines whether the given context is relevant to the input request.
|
81
|
+
|
82
|
+
Args:
|
83
|
+
request: Input to the application to evaluate, user's question or query.
|
84
|
+
context: Context to evaluate the relevance to the request.
|
85
|
+
Supports any JSON-serializable object.
|
86
|
+
name: Optional name for overriding the default name of the returned feedback.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no" value
|
90
|
+
indicating whether the context is relevant to the request.
|
91
|
+
|
92
|
+
Example:
|
93
|
+
|
94
|
+
The following example shows how to evaluate whether a document retrieved by a
|
95
|
+
retriever is relevant to the user's question.
|
96
|
+
|
97
|
+
.. code-block:: python
|
98
|
+
|
99
|
+
from mlflow.genai.judges import is_context_relevant
|
100
|
+
|
101
|
+
feedback = is_context_relevant(
|
102
|
+
request="What is the capital of France?",
|
103
|
+
context="Paris is the capital of France.",
|
104
|
+
)
|
105
|
+
print(feedback.value) # "yes"
|
106
|
+
|
107
|
+
feedback = is_context_relevant(
|
108
|
+
request="What is the capital of France?",
|
109
|
+
context="Paris is known for its Eiffel Tower.",
|
110
|
+
)
|
111
|
+
print(feedback.value) # "no"
|
112
|
+
|
113
|
+
"""
|
114
|
+
from databricks.agents.evals.judges import relevance_to_query
|
115
|
+
|
116
|
+
return _sanitize_feedback(
|
117
|
+
relevance_to_query(
|
118
|
+
request=request,
|
119
|
+
response=str(context),
|
120
|
+
# NB: User-facing name for the is_context_relevant assessment. This is required since
|
121
|
+
# the existing databricks judge is called `relevance_to_query`
|
122
|
+
assessment_name=name or _IS_CONTEXT_RELEVANT_ASSESSMENT_NAME,
|
123
|
+
)
|
124
|
+
)
|
125
|
+
|
126
|
+
|
127
|
+
@requires_databricks_agents
|
128
|
+
def is_context_sufficient(
|
129
|
+
*,
|
130
|
+
request: str,
|
131
|
+
context: Any,
|
132
|
+
expected_facts: list[str],
|
133
|
+
expected_response: Optional[str] = None,
|
134
|
+
name: Optional[str] = None,
|
135
|
+
) -> Feedback:
|
136
|
+
"""
|
137
|
+
LLM judge determines whether the given context is sufficient to answer the input request.
|
138
|
+
|
139
|
+
Args:
|
140
|
+
request: Input to the application to evaluate, user's question or query.
|
141
|
+
context: Context to evaluate the sufficiency of. Supports any JSON-serializable object.
|
142
|
+
expected_facts: A list of expected facts that should be present in the context.
|
143
|
+
expected_response: The expected response from the application. Optional.
|
144
|
+
name: Optional name for overriding the default name of the returned feedback.
|
145
|
+
|
146
|
+
Returns:
|
147
|
+
A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
|
148
|
+
value indicating whether the context is sufficient to answer the request.
|
149
|
+
|
150
|
+
Example:
|
151
|
+
|
152
|
+
The following example shows how to evaluate whether the documents returned by a
|
153
|
+
retriever gives sufficient context to answer the user's question.
|
154
|
+
|
155
|
+
.. code-block:: python
|
156
|
+
|
157
|
+
from mlflow.genai.judges import is_context_sufficient
|
158
|
+
|
159
|
+
feedback = is_context_sufficient(
|
160
|
+
request="What is the capital of France?",
|
161
|
+
context=[
|
162
|
+
{"content": "Paris is the capital of France."},
|
163
|
+
{"content": "Paris is known for its Eiffel Tower."},
|
164
|
+
],
|
165
|
+
expected_facts=["Paris is the capital of France."],
|
166
|
+
)
|
167
|
+
print(feedback.value) # "yes"
|
168
|
+
"""
|
169
|
+
from databricks.agents.evals.judges import context_sufficiency
|
170
|
+
|
171
|
+
return _sanitize_feedback(
|
172
|
+
context_sufficiency(
|
173
|
+
request=request,
|
174
|
+
retrieved_context=context,
|
175
|
+
expected_facts=expected_facts,
|
176
|
+
expected_response=expected_response,
|
177
|
+
assessment_name=name,
|
178
|
+
)
|
179
|
+
)
|
180
|
+
|
181
|
+
|
182
|
+
@requires_databricks_agents
|
183
|
+
def is_correct(
|
184
|
+
*,
|
185
|
+
request: str,
|
186
|
+
response: str,
|
187
|
+
expected_facts: list[str],
|
188
|
+
expected_response: Optional[str] = None,
|
189
|
+
name: Optional[str] = None,
|
190
|
+
) -> Feedback:
|
191
|
+
"""
|
192
|
+
LLM judge determines whether the given response is correct for the input request.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
request: Input to the application to evaluate, user's question or query.
|
196
|
+
response: The response from the application to evaluate.
|
197
|
+
expected_facts: A list of expected facts that should be present in the response.
|
198
|
+
expected_response: The expected response from the application. Optional.
|
199
|
+
name: Optional name for overriding the default name of the returned feedback.
|
200
|
+
|
201
|
+
Returns:
|
202
|
+
A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
|
203
|
+
value indicating whether the response is correct for the request.
|
204
|
+
"""
|
205
|
+
from databricks.agents.evals.judges import correctness
|
206
|
+
|
207
|
+
return _sanitize_feedback(
|
208
|
+
correctness(
|
209
|
+
request=request,
|
210
|
+
response=response,
|
211
|
+
expected_facts=expected_facts,
|
212
|
+
expected_response=expected_response,
|
213
|
+
assessment_name=name,
|
214
|
+
)
|
215
|
+
)
|
216
|
+
|
217
|
+
|
218
|
+
@requires_databricks_agents
|
219
|
+
def is_grounded(
|
220
|
+
*, request: str, response: str, context: Any, name: Optional[str] = None
|
221
|
+
) -> Feedback:
|
222
|
+
"""
|
223
|
+
LLM judge determines whether the given response is grounded in the given context.
|
224
|
+
|
225
|
+
Args:
|
226
|
+
request: Input to the application to evaluate, user's question or query.
|
227
|
+
response: The response from the application to evaluate.
|
228
|
+
context: Context to evaluate the response against. Supports any JSON-serializable object.
|
229
|
+
name: Optional name for overriding the default name of the returned feedback.
|
230
|
+
|
231
|
+
Returns:
|
232
|
+
A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
|
233
|
+
value indicating whether the response is grounded in the context.
|
234
|
+
|
235
|
+
Example:
|
236
|
+
|
237
|
+
The following example shows how to evaluate whether the response is grounded in
|
238
|
+
the context.
|
239
|
+
|
240
|
+
.. code-block:: python
|
241
|
+
|
242
|
+
from mlflow.genai.judges import is_grounded
|
243
|
+
|
244
|
+
feedback = is_grounded(
|
245
|
+
request="What is the capital of France?",
|
246
|
+
response="Paris",
|
247
|
+
context=[
|
248
|
+
{"content": "Paris is the capital of France."},
|
249
|
+
{"content": "Paris is known for its Eiffel Tower."},
|
250
|
+
],
|
251
|
+
)
|
252
|
+
print(feedback.value) # "yes"
|
253
|
+
"""
|
254
|
+
from databricks.agents.evals.judges import groundedness
|
255
|
+
|
256
|
+
return _sanitize_feedback(
|
257
|
+
groundedness(
|
258
|
+
request=request,
|
259
|
+
response=response,
|
260
|
+
retrieved_context=context,
|
261
|
+
assessment_name=name,
|
262
|
+
)
|
263
|
+
)
|
264
|
+
|
265
|
+
|
266
|
+
@requires_databricks_agents
|
267
|
+
def is_safe(*, content: str, name: Optional[str] = None) -> Feedback:
|
268
|
+
"""
|
269
|
+
LLM judge determines whether the given response is safe.
|
270
|
+
|
271
|
+
Args:
|
272
|
+
content: Text content to evaluate for safety.
|
273
|
+
name: Optional name for overriding the default name of the returned feedback.
|
274
|
+
|
275
|
+
Returns:
|
276
|
+
A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
|
277
|
+
value indicating whether the response is safe.
|
278
|
+
|
279
|
+
Example:
|
280
|
+
|
281
|
+
.. code-block:: python
|
282
|
+
|
283
|
+
from mlflow.genai.judges import is_safe
|
284
|
+
|
285
|
+
feedback = is_safe(content="I am a happy person.")
|
286
|
+
print(feedback.value) # "yes"
|
287
|
+
"""
|
288
|
+
from databricks.agents.evals.judges import safety
|
289
|
+
|
290
|
+
return _sanitize_feedback(safety(response=content, assessment_name=name))
|
291
|
+
|
292
|
+
|
293
|
+
@requires_databricks_agents
|
294
|
+
def meets_guidelines(
|
295
|
+
*,
|
296
|
+
guidelines: Union[str, list[str]],
|
297
|
+
context: dict[str, Any],
|
298
|
+
name: Optional[str] = None,
|
299
|
+
) -> Feedback:
|
300
|
+
"""
|
301
|
+
LLM judge determines whether the given response meets the given guideline(s).
|
302
|
+
|
303
|
+
Args:
|
304
|
+
guidelines: A single guideline or a list of guidelines.
|
305
|
+
context: Mapping of context to be evaluated against the guidelines. For example,
|
306
|
+
pass {"response": "<response text>"} to evaluate whether the response meets
|
307
|
+
the given guidelines.
|
308
|
+
name: Optional name for overriding the default name of the returned feedback.
|
309
|
+
|
310
|
+
Returns:
|
311
|
+
A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
|
312
|
+
value indicating whether the response meets the guideline(s).
|
313
|
+
|
314
|
+
Example:
|
315
|
+
|
316
|
+
The following example shows how to evaluate whether the response meets the given
|
317
|
+
guideline(s).
|
318
|
+
|
319
|
+
.. code-block:: python
|
320
|
+
|
321
|
+
from mlflow.genai.judges import meets_guidelines
|
322
|
+
|
323
|
+
feedback = meets_guidelines(
|
324
|
+
guidelines="Be polite and respectful.",
|
325
|
+
context={"response": "Hello, how are you?"},
|
326
|
+
)
|
327
|
+
print(feedback.value) # "yes"
|
328
|
+
|
329
|
+
feedback = meets_guidelines(
|
330
|
+
guidelines=["Be polite and respectful.", "Must be in English."],
|
331
|
+
context={"response": "Hola, ¿cómo estás?"},
|
332
|
+
)
|
333
|
+
print(feedback.value) # "no"
|
334
|
+
"""
|
335
|
+
from databricks.agents.evals.judges import guideline_adherence
|
336
|
+
|
337
|
+
# Ensure guidelines is a list, as the underlying databricks judge only accepts lists
|
338
|
+
if isinstance(guidelines, str):
|
339
|
+
guidelines = [guidelines]
|
340
|
+
|
341
|
+
return _sanitize_feedback(
|
342
|
+
guideline_adherence(
|
343
|
+
guidelines=guidelines,
|
344
|
+
guidelines_context=context,
|
345
|
+
assessment_name=name,
|
346
|
+
)
|
347
|
+
)
|
348
|
+
|
349
|
+
|
350
|
+
@experimental(version="3.0.0")
|
351
|
+
@requires_databricks_agents
|
352
|
+
def custom_prompt_judge(
|
353
|
+
*,
|
354
|
+
name: str,
|
355
|
+
prompt_template: str,
|
356
|
+
numeric_values: Optional[dict[str, Union[int, float]]] = None,
|
357
|
+
) -> Callable[..., Feedback]:
|
358
|
+
"""
|
359
|
+
Create a custom prompt judge that evaluates inputs using a template.
|
360
|
+
|
361
|
+
Example prompt template:
|
362
|
+
|
363
|
+
.. code-block::
|
364
|
+
|
365
|
+
You will look at the response and determine the formality of the response.
|
366
|
+
|
367
|
+
<request>{{request}}</request>
|
368
|
+
<response>{{response}}</response>
|
369
|
+
|
370
|
+
You must choose one of the following categories.
|
371
|
+
|
372
|
+
[[formal]]: The response is very formal.
|
373
|
+
[[semi_formal]]: The response is somewhat formal. The response is somewhat formal if the
|
374
|
+
response mentions friendship, etc.
|
375
|
+
[[not_formal]]: The response is not formal.
|
376
|
+
|
377
|
+
Variable names in the template should be enclosed in double curly
|
378
|
+
braces, e.g., `{{request}}`, `{{response}}`. They should be alphanumeric and can include
|
379
|
+
underscores, but should not contain spaces or special characters.
|
380
|
+
|
381
|
+
It is required for the prompt template to request choices as outputs, with each choice
|
382
|
+
enclosed in square brackets. Choice names should be alphanumeric and can include
|
383
|
+
underscores and spaces.
|
384
|
+
|
385
|
+
Args:
|
386
|
+
name: Name of the judge, used as the name of returned
|
387
|
+
:py:class`mlflow.entities.Feedback~` object.
|
388
|
+
prompt_template: Template string with {{var_name}} placeholders for variable substitution.
|
389
|
+
Should be prompted with choices as outputs.
|
390
|
+
numeric_values: Optional mapping from categorical values to numeric scores.
|
391
|
+
Useful if you want to create a custom judge that returns continuous valued outputs.
|
392
|
+
Defaults to None.
|
393
|
+
|
394
|
+
Returns:
|
395
|
+
A callable that takes keyword arguments mapping to the template variables
|
396
|
+
and returns an mlflow :py:class`mlflow.entities.Feedback~`.
|
397
|
+
"""
|
398
|
+
from databricks.agents.evals.judges import custom_prompt_judge
|
399
|
+
|
400
|
+
return custom_prompt_judge(
|
401
|
+
name=name,
|
402
|
+
prompt_template=prompt_template,
|
403
|
+
numeric_values=numeric_values,
|
404
|
+
)
|