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,492 @@
|
|
1
|
+
import functools
|
2
|
+
import inspect
|
3
|
+
import logging
|
4
|
+
from dataclasses import asdict, dataclass
|
5
|
+
from typing import Any, Callable, Literal, Optional, Union
|
6
|
+
|
7
|
+
from pydantic import BaseModel, PrivateAttr
|
8
|
+
|
9
|
+
import mlflow
|
10
|
+
from mlflow.entities import Assessment, Feedback
|
11
|
+
from mlflow.entities.assessment import DEFAULT_FEEDBACK_NAME
|
12
|
+
from mlflow.entities.trace import Trace
|
13
|
+
from mlflow.exceptions import MlflowException
|
14
|
+
from mlflow.utils.annotations import experimental
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
# Serialization version for tracking changes to the serialization format
|
19
|
+
_SERIALIZATION_VERSION = 1
|
20
|
+
|
21
|
+
|
22
|
+
@dataclass
|
23
|
+
class SerializedScorer:
|
24
|
+
"""
|
25
|
+
Dataclass defining the serialization schema for Scorer objects.
|
26
|
+
"""
|
27
|
+
|
28
|
+
# Core scorer fields
|
29
|
+
name: str
|
30
|
+
aggregations: Optional[list[str]] = None
|
31
|
+
|
32
|
+
# Version metadata
|
33
|
+
mlflow_version: str = mlflow.__version__
|
34
|
+
serialization_version: int = _SERIALIZATION_VERSION
|
35
|
+
|
36
|
+
# Builtin scorer fields (for scorers from mlflow.genai.scorers.builtin_scorers)
|
37
|
+
builtin_scorer_class: Optional[str] = None
|
38
|
+
builtin_scorer_pydantic_data: Optional[dict[str, Any]] = None
|
39
|
+
|
40
|
+
# Decorator scorer fields (for @scorer decorated functions)
|
41
|
+
call_source: Optional[str] = None
|
42
|
+
call_signature: Optional[str] = None
|
43
|
+
original_func_name: Optional[str] = None
|
44
|
+
|
45
|
+
|
46
|
+
@experimental(version="3.0.0")
|
47
|
+
class Scorer(BaseModel):
|
48
|
+
name: str
|
49
|
+
aggregations: Optional[list[str]] = None
|
50
|
+
|
51
|
+
def model_dump(self, **kwargs) -> dict[str, Any]:
|
52
|
+
"""Override model_dump to include source code."""
|
53
|
+
# Create serialized scorer with core fields
|
54
|
+
serialized = SerializedScorer(
|
55
|
+
name=self.name,
|
56
|
+
aggregations=self.aggregations,
|
57
|
+
mlflow_version=mlflow.__version__,
|
58
|
+
serialization_version=_SERIALIZATION_VERSION,
|
59
|
+
)
|
60
|
+
|
61
|
+
# Check if this is a decorator scorer
|
62
|
+
if hasattr(self, "_original_func") and self._original_func:
|
63
|
+
# Decorator scorer - extract and store source code
|
64
|
+
source_info = self._extract_source_code_info()
|
65
|
+
serialized.call_source = source_info.get("call_source")
|
66
|
+
serialized.call_signature = source_info.get("call_signature")
|
67
|
+
serialized.original_func_name = source_info.get("original_func_name")
|
68
|
+
else:
|
69
|
+
# BuiltInScorer overrides `model_dump`, so this is neither a builtin scorer nor a
|
70
|
+
# decorator scorer
|
71
|
+
raise MlflowException.invalid_parameter_value(
|
72
|
+
f"Unsupported scorer type: {self.__class__.__name__}. "
|
73
|
+
f"Scorer serialization only supports:\n"
|
74
|
+
f"1. Builtin scorers (from mlflow.genai.scorers.builtin_scorers)\n"
|
75
|
+
f"2. Decorator-created scorers (using @scorer decorator)\n"
|
76
|
+
f"Direct subclassing of Scorer is not supported for serialization. "
|
77
|
+
f"Please use the @scorer decorator instead."
|
78
|
+
)
|
79
|
+
|
80
|
+
return asdict(serialized)
|
81
|
+
|
82
|
+
def _extract_source_code_info(self) -> dict[str, Optional[str]]:
|
83
|
+
"""Extract source code information for the original decorated function."""
|
84
|
+
from mlflow.genai.scorers.scorer_utils import extract_function_body
|
85
|
+
|
86
|
+
result = {"call_source": None, "call_signature": None, "original_func_name": None}
|
87
|
+
|
88
|
+
# Extract original function source
|
89
|
+
call_body, _ = extract_function_body(self._original_func)
|
90
|
+
result["call_source"] = call_body
|
91
|
+
result["original_func_name"] = self._original_func.__name__
|
92
|
+
|
93
|
+
# Store the signature of the original function
|
94
|
+
result["call_signature"] = str(inspect.signature(self._original_func))
|
95
|
+
|
96
|
+
return result
|
97
|
+
|
98
|
+
@classmethod
|
99
|
+
def model_validate(cls, obj: Any) -> "Scorer":
|
100
|
+
"""Override model_validate to reconstruct scorer from source code."""
|
101
|
+
if not isinstance(obj, dict):
|
102
|
+
raise MlflowException.invalid_parameter_value(
|
103
|
+
f"Invalid scorer data: expected a dictionary, got {type(obj).__name__}. "
|
104
|
+
f"Scorer data must be a dictionary containing serialized scorer information."
|
105
|
+
)
|
106
|
+
|
107
|
+
# Parse the serialized data using our dataclass
|
108
|
+
try:
|
109
|
+
serialized = SerializedScorer(**obj)
|
110
|
+
except Exception as e:
|
111
|
+
raise MlflowException.invalid_parameter_value(
|
112
|
+
f"Failed to parse serialized scorer data: {e}"
|
113
|
+
)
|
114
|
+
|
115
|
+
# Log version information for debugging
|
116
|
+
if serialized.mlflow_version:
|
117
|
+
_logger.debug(
|
118
|
+
f"Deserializing scorer created with MLflow version: {serialized.mlflow_version}"
|
119
|
+
)
|
120
|
+
if serialized.serialization_version:
|
121
|
+
_logger.debug(f"Scorer serialization version: {serialized.serialization_version}")
|
122
|
+
|
123
|
+
if serialized.builtin_scorer_class:
|
124
|
+
# Import here to avoid circular imports
|
125
|
+
from mlflow.genai.scorers.builtin_scorers import BuiltInScorer
|
126
|
+
|
127
|
+
return BuiltInScorer.model_validate(obj)
|
128
|
+
|
129
|
+
# Handle decorator scorers
|
130
|
+
elif serialized.call_source and serialized.call_signature and serialized.original_func_name:
|
131
|
+
return cls._reconstruct_decorator_scorer(serialized)
|
132
|
+
|
133
|
+
# Invalid serialized data
|
134
|
+
else:
|
135
|
+
raise MlflowException.invalid_parameter_value(
|
136
|
+
f"Failed to load scorer '{serialized.name}'. The scorer is serialized in an "
|
137
|
+
f"unknown format that cannot be deserialized. Please make sure you are using "
|
138
|
+
f"a compatible MLflow version or recreate the scorer. "
|
139
|
+
f"Scorer was created with MLflow version: "
|
140
|
+
f"{serialized.mlflow_version or 'unknown'}, "
|
141
|
+
f"serialization version: {serialized.serialization_version or 'unknown'}, "
|
142
|
+
f"current MLflow version: {mlflow.__version__}."
|
143
|
+
)
|
144
|
+
|
145
|
+
@classmethod
|
146
|
+
def _reconstruct_decorator_scorer(cls, serialized: SerializedScorer) -> "Scorer":
|
147
|
+
"""Reconstruct a decorator scorer from serialized data."""
|
148
|
+
from mlflow.genai.scorers.scorer_utils import recreate_function
|
149
|
+
|
150
|
+
# Recreate the original function from source code
|
151
|
+
recreated_func = recreate_function(
|
152
|
+
serialized.call_source, serialized.call_signature, serialized.original_func_name
|
153
|
+
)
|
154
|
+
|
155
|
+
if not recreated_func:
|
156
|
+
raise MlflowException.invalid_parameter_value(
|
157
|
+
f"Failed to recreate function from source code. "
|
158
|
+
f"Scorer was created with MLflow version: "
|
159
|
+
f"{serialized.mlflow_version or 'unknown'}, "
|
160
|
+
f"serialization version: {serialized.serialization_version or 'unknown'}. "
|
161
|
+
f"Current MLflow version: {mlflow.__version__}"
|
162
|
+
)
|
163
|
+
|
164
|
+
# Apply the scorer decorator to recreate the scorer
|
165
|
+
# Rather than serializing and deserializing the `run` method of `Scorer`, we recreate the
|
166
|
+
# Scorer using the original function and the `@scorer` decorator. This should be safe so
|
167
|
+
# long as `@scorer` is a stable API.
|
168
|
+
return scorer(recreated_func, name=serialized.name, aggregations=serialized.aggregations)
|
169
|
+
|
170
|
+
def run(self, *, inputs=None, outputs=None, expectations=None, trace=None):
|
171
|
+
from mlflow.evaluation import Assessment as LegacyAssessment
|
172
|
+
|
173
|
+
merged = {
|
174
|
+
"inputs": inputs,
|
175
|
+
"outputs": outputs,
|
176
|
+
"expectations": expectations,
|
177
|
+
"trace": trace,
|
178
|
+
}
|
179
|
+
# Filter to only the parameters the function actually expects
|
180
|
+
sig = inspect.signature(self.__call__)
|
181
|
+
filtered = {k: v for k, v in merged.items() if k in sig.parameters}
|
182
|
+
result = self(**filtered)
|
183
|
+
if not (
|
184
|
+
# TODO: Replace 'Assessment' with 'Feedback' once we migrate from the agent eval harness
|
185
|
+
isinstance(result, (int, float, bool, str, Assessment, LegacyAssessment))
|
186
|
+
or (
|
187
|
+
isinstance(result, list)
|
188
|
+
and all(isinstance(item, (Assessment, LegacyAssessment)) for item in result)
|
189
|
+
)
|
190
|
+
# Allow None to represent an empty assessment from the scorer.
|
191
|
+
or result is None
|
192
|
+
):
|
193
|
+
if isinstance(result, list) and len(result) > 0:
|
194
|
+
result_type = "list[" + type(result[0]).__name__ + "]"
|
195
|
+
else:
|
196
|
+
result_type = type(result).__name__
|
197
|
+
raise MlflowException.invalid_parameter_value(
|
198
|
+
f"{self.name} must return one of int, float, bool, str, "
|
199
|
+
f"Feedback, or list[Feedback]. Got {result_type}"
|
200
|
+
)
|
201
|
+
|
202
|
+
if isinstance(result, Feedback) and result.name == DEFAULT_FEEDBACK_NAME:
|
203
|
+
# NB: Overwrite the returned feedback name to the scorer name. This is important
|
204
|
+
# so we show a consistent name for the feedback regardless of whether the scorer
|
205
|
+
# succeeds or fails. For example, let's say we have a scorer like this:
|
206
|
+
#
|
207
|
+
# @scorer
|
208
|
+
# def my_scorer():
|
209
|
+
# # do something
|
210
|
+
# ...
|
211
|
+
# return Feedback(value=True)
|
212
|
+
#
|
213
|
+
# If the scorer succeeds, the returned feedback name will be default "feedback".
|
214
|
+
# However, if the scorer fails, it doesn't return a Feedback object, and we
|
215
|
+
# only know the scorer name. To unify this behavior, we overwrite the feedback
|
216
|
+
# name to the scorer name in the happy path.
|
217
|
+
# This will not apply when the scorer returns a list of Feedback objects.
|
218
|
+
# or users explicitly specify the feedback name via Feedback constructor.
|
219
|
+
result.name = self.name
|
220
|
+
|
221
|
+
return result
|
222
|
+
|
223
|
+
def __call__(
|
224
|
+
self,
|
225
|
+
*,
|
226
|
+
inputs: Any = None,
|
227
|
+
outputs: Any = None,
|
228
|
+
expectations: Optional[dict[str, Any]] = None,
|
229
|
+
trace: Optional[Trace] = None,
|
230
|
+
) -> Union[int, float, bool, str, Feedback, list[Feedback]]:
|
231
|
+
"""
|
232
|
+
Implement the custom scorer's logic here.
|
233
|
+
|
234
|
+
|
235
|
+
The scorer will be called for each row in the input evaluation dataset.
|
236
|
+
|
237
|
+
Your scorer doesn't need to have all the parameters defined in the base
|
238
|
+
signature. You can define a custom scorer with only the parameters you need.
|
239
|
+
See the parameter details below for what values are passed for each parameter.
|
240
|
+
|
241
|
+
.. list-table::
|
242
|
+
:widths: 20 20 20
|
243
|
+
:header-rows: 1
|
244
|
+
|
245
|
+
* - Parameter
|
246
|
+
- Description
|
247
|
+
- Source
|
248
|
+
|
249
|
+
* - ``inputs``
|
250
|
+
- A single input to the target model/app.
|
251
|
+
- Derived from either dataset or trace.
|
252
|
+
|
253
|
+
* When the dataset contains ``inputs`` column, the value will be
|
254
|
+
passed as is.
|
255
|
+
* When traces are provided as evaluation dataset, this will be derived
|
256
|
+
from the ``inputs`` field of the trace (i.e. inputs captured as the
|
257
|
+
root span of the trace).
|
258
|
+
|
259
|
+
* - ``outputs``
|
260
|
+
- A single output from the target model/app.
|
261
|
+
- Derived from either dataset, trace, or output of ``predict_fn``.
|
262
|
+
|
263
|
+
* When the dataset contains ``outputs`` column, the value will be
|
264
|
+
passed as is.
|
265
|
+
* When ``predict_fn`` is provided, MLflow will make a prediction using the
|
266
|
+
``inputs`` and the ``predict_fn``, and pass the result as the ``outputs``.
|
267
|
+
* When traces are provided as evaluation dataset, this will be derived
|
268
|
+
from the ``response`` field of the trace (i.e. outputs captured as the
|
269
|
+
root span of the trace).
|
270
|
+
|
271
|
+
* - ``expectations``
|
272
|
+
- Ground truth or any expectation for each prediction, e.g. expected retrieved docs.
|
273
|
+
- Derived from either dataset or trace.
|
274
|
+
|
275
|
+
* When the dataset contains ``expectations`` column, the value will be
|
276
|
+
passed as is.
|
277
|
+
* When traces are provided as evaluation dataset, this will be a dictionary
|
278
|
+
that contains a set of assessments in the format of
|
279
|
+
[assessment name]: [assessment value].
|
280
|
+
|
281
|
+
* - ``trace``
|
282
|
+
- A trace object corresponding to the prediction for the row.
|
283
|
+
- Specified as a ``trace`` column in the dataset, or generated during the prediction.
|
284
|
+
|
285
|
+
Example:
|
286
|
+
|
287
|
+
.. code-block:: python
|
288
|
+
|
289
|
+
class NotEmpty(BaseScorer):
|
290
|
+
name = "not_empty"
|
291
|
+
|
292
|
+
def __call__(self, *, outputs) -> bool:
|
293
|
+
return outputs != ""
|
294
|
+
|
295
|
+
|
296
|
+
class ExactMatch(BaseScorer):
|
297
|
+
name = "exact_match"
|
298
|
+
|
299
|
+
def __call__(self, *, outputs, expectations) -> bool:
|
300
|
+
return outputs == expectations["expected_response"]
|
301
|
+
|
302
|
+
|
303
|
+
class NumToolCalls(BaseScorer):
|
304
|
+
name = "num_tool_calls"
|
305
|
+
|
306
|
+
def __call__(self, *, trace) -> int:
|
307
|
+
spans = trace.search_spans(name="tool_call")
|
308
|
+
return len(spans)
|
309
|
+
|
310
|
+
|
311
|
+
# Use the scorer in an evaluation
|
312
|
+
mlflow.genai.evaluate(
|
313
|
+
data=data,
|
314
|
+
scorers=[NotEmpty(), ExactMatch(), NumToolCalls()],
|
315
|
+
)
|
316
|
+
"""
|
317
|
+
raise NotImplementedError("Implementation of __call__ is required for Scorer class")
|
318
|
+
|
319
|
+
|
320
|
+
@experimental(version="3.0.0")
|
321
|
+
def scorer(
|
322
|
+
func=None,
|
323
|
+
*,
|
324
|
+
name: Optional[str] = None,
|
325
|
+
aggregations: Optional[
|
326
|
+
list[
|
327
|
+
Union[
|
328
|
+
Literal["min", "max", "mean", "median", "variance", "p90", "p99"],
|
329
|
+
Callable[[list[Union[int, float]]], Union[int, float]],
|
330
|
+
]
|
331
|
+
]
|
332
|
+
] = None,
|
333
|
+
):
|
334
|
+
"""
|
335
|
+
A decorator to define a custom scorer that can be used in ``mlflow.genai.evaluate()``.
|
336
|
+
|
337
|
+
The scorer function should take in a **subset** of the following parameters:
|
338
|
+
|
339
|
+
.. list-table::
|
340
|
+
:widths: 20 20 20
|
341
|
+
:header-rows: 1
|
342
|
+
|
343
|
+
* - Parameter
|
344
|
+
- Description
|
345
|
+
- Source
|
346
|
+
|
347
|
+
* - ``inputs``
|
348
|
+
- A single input to the target model/app.
|
349
|
+
- Derived from either dataset or trace.
|
350
|
+
|
351
|
+
* When the dataset contains ``inputs`` column, the value will be passed as is.
|
352
|
+
* When traces are provided as evaluation dataset, this will be derived
|
353
|
+
from the ``inputs`` field of the trace (i.e. inputs captured as the
|
354
|
+
root span of the trace).
|
355
|
+
|
356
|
+
* - ``outputs``
|
357
|
+
- A single output from the target model/app.
|
358
|
+
- Derived from either dataset, trace, or output of ``predict_fn``.
|
359
|
+
|
360
|
+
* When the dataset contains ``outputs`` column, the value will be passed as is.
|
361
|
+
* When ``predict_fn`` is provided, MLflow will make a prediction using the
|
362
|
+
``inputs`` and the ``predict_fn`` and pass the result as the ``outputs``.
|
363
|
+
* When traces are provided as evaluation dataset, this will be derived
|
364
|
+
from the ``response`` field of the trace (i.e. outputs captured as the
|
365
|
+
root span of the trace).
|
366
|
+
|
367
|
+
* - ``expectations``
|
368
|
+
- Ground truth or any expectation for each prediction e.g., expected retrieved docs.
|
369
|
+
- Derived from either dataset or trace.
|
370
|
+
|
371
|
+
* When the dataset contains ``expectations`` column, the value will be passed as is.
|
372
|
+
* When traces are provided as evaluation dataset, this will be a dictionary
|
373
|
+
that contains a set of assessments in the format of
|
374
|
+
[assessment name]: [assessment value].
|
375
|
+
|
376
|
+
* - ``trace``
|
377
|
+
- A trace object corresponding to the prediction for the row.
|
378
|
+
- Specified as a ``trace`` column in the dataset, or generated during the prediction.
|
379
|
+
|
380
|
+
The scorer function should return one of the following:
|
381
|
+
|
382
|
+
* A boolean value
|
383
|
+
* An integer value
|
384
|
+
* A float value
|
385
|
+
* A string value
|
386
|
+
* A single :class:`~mlflow.entities.Feedback` object
|
387
|
+
* A list of :class:`~mlflow.entities.Feedback` objects
|
388
|
+
|
389
|
+
.. note::
|
390
|
+
|
391
|
+
The metric name will be determined by the scorer function's name or a custom name
|
392
|
+
specified in the `name` parameter for the scorer.
|
393
|
+
|
394
|
+
Example:
|
395
|
+
|
396
|
+
.. code-block:: python
|
397
|
+
|
398
|
+
import json
|
399
|
+
from mlflow.genai.scorers import scorer
|
400
|
+
from mlflow.entities import AssessmentSource, Feedback
|
401
|
+
|
402
|
+
|
403
|
+
# Basic scorers that returns primitive values
|
404
|
+
@scorer
|
405
|
+
def not_empty(outputs) -> bool:
|
406
|
+
return outputs != ""
|
407
|
+
|
408
|
+
|
409
|
+
@scorer
|
410
|
+
def exact_match(outputs, expectations) -> bool:
|
411
|
+
return outputs == expectations["expected_response"]
|
412
|
+
|
413
|
+
|
414
|
+
@scorer
|
415
|
+
def num_tool_calls(trace) -> int:
|
416
|
+
spans = trace.search_spans(name="tool_call")
|
417
|
+
return len(spans)
|
418
|
+
|
419
|
+
|
420
|
+
# Use `Feedback` object to return additional information about the scorer's
|
421
|
+
# result, such as a rationale for the score.
|
422
|
+
@scorer
|
423
|
+
def harmfulness(outputs) -> Feedback:
|
424
|
+
import openai
|
425
|
+
|
426
|
+
prompt = f'''
|
427
|
+
Judge if the following text is harmful or not.
|
428
|
+
|
429
|
+
Text:
|
430
|
+
{outputs}
|
431
|
+
|
432
|
+
Return the answer in a JSON object with the following format:
|
433
|
+
{{
|
434
|
+
"harmful": true
|
435
|
+
"reason": "The text contains harmful content"
|
436
|
+
}}
|
437
|
+
|
438
|
+
Do not output any other characters than the json object.
|
439
|
+
'''
|
440
|
+
response = openai.OpenAI().chat.completions.create(
|
441
|
+
model="o4-mini",
|
442
|
+
messages=[{"role": "user", "content": prompt}],
|
443
|
+
)
|
444
|
+
payload = json.loads(response.choices[0].message.content)
|
445
|
+
return Feedback(
|
446
|
+
value=payload["harmful"],
|
447
|
+
rationale=payload["reason"],
|
448
|
+
source=AssessmentSource(
|
449
|
+
source_type="LLM_JUDGE",
|
450
|
+
source_id="openai:/o4-mini",
|
451
|
+
),
|
452
|
+
)
|
453
|
+
|
454
|
+
|
455
|
+
# Use the scorer in an evaluation
|
456
|
+
mlflow.genai.evaluate(
|
457
|
+
data=data,
|
458
|
+
scorers=[not_empty, exact_match, num_tool_calls, harmfulness],
|
459
|
+
)
|
460
|
+
"""
|
461
|
+
|
462
|
+
if func is None:
|
463
|
+
return functools.partial(scorer, name=name, aggregations=aggregations)
|
464
|
+
|
465
|
+
class CustomScorer(Scorer):
|
466
|
+
# Store reference to the original function
|
467
|
+
_original_func: Optional[Callable[..., Any]] = PrivateAttr(default=None)
|
468
|
+
|
469
|
+
def __init__(self, **data):
|
470
|
+
super().__init__(**data)
|
471
|
+
# Set the original function reference
|
472
|
+
# Use object.__setattr__ to bypass Pydantic's attribute handling for private attributes
|
473
|
+
# during model initialization, as direct assignment (self._original_func = func) may be
|
474
|
+
# ignored or fail in this context
|
475
|
+
object.__setattr__(self, "_original_func", func)
|
476
|
+
|
477
|
+
def __call__(self, *args, **kwargs):
|
478
|
+
return func(*args, **kwargs)
|
479
|
+
|
480
|
+
# Update the __call__ method's signature to match the original function
|
481
|
+
# but add 'self' as the first parameter. This is required for MLflow to
|
482
|
+
# pass the correct set of parameters to the scorer.
|
483
|
+
signature = inspect.signature(func)
|
484
|
+
params = list(signature.parameters.values())
|
485
|
+
new_params = [inspect.Parameter("self", inspect.Parameter.POSITIONAL_OR_KEYWORD)] + params
|
486
|
+
new_signature = signature.replace(parameters=new_params)
|
487
|
+
CustomScorer.__call__.__signature__ = new_signature
|
488
|
+
|
489
|
+
return CustomScorer(
|
490
|
+
name=name or func.__name__,
|
491
|
+
aggregations=aggregations,
|
492
|
+
)
|