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,545 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import json
|
4
|
+
import time
|
5
|
+
from dataclasses import dataclass
|
6
|
+
from typing import Any, Optional, Union
|
7
|
+
|
8
|
+
from google.protobuf.json_format import MessageToDict, ParseDict
|
9
|
+
from google.protobuf.struct_pb2 import Value
|
10
|
+
|
11
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
12
|
+
from mlflow.entities.assessment_error import AssessmentError
|
13
|
+
from mlflow.entities.assessment_source import AssessmentSource, AssessmentSourceType
|
14
|
+
from mlflow.exceptions import MlflowException
|
15
|
+
from mlflow.protos.assessments_pb2 import Assessment as ProtoAssessment
|
16
|
+
from mlflow.protos.assessments_pb2 import Expectation as ProtoExpectation
|
17
|
+
from mlflow.protos.assessments_pb2 import Feedback as ProtoFeedback
|
18
|
+
from mlflow.utils.annotations import experimental
|
19
|
+
from mlflow.utils.exception_utils import get_stacktrace
|
20
|
+
from mlflow.utils.proto_json_utils import proto_timestamp_to_milliseconds
|
21
|
+
|
22
|
+
# Feedback value should be one of the following types:
|
23
|
+
# - float
|
24
|
+
# - int
|
25
|
+
# - str
|
26
|
+
# - bool
|
27
|
+
# - list of values of the same types as above
|
28
|
+
# - dict with string keys and values of the same types as above
|
29
|
+
PbValueType = Union[float, int, str, bool]
|
30
|
+
FeedbackValueType = Union[PbValueType, dict[str, PbValueType], list[PbValueType]]
|
31
|
+
|
32
|
+
|
33
|
+
@experimental(version="2.21.0")
|
34
|
+
@dataclass
|
35
|
+
class Assessment(_MlflowObject):
|
36
|
+
"""
|
37
|
+
Base class for assessments that can be attached to a trace.
|
38
|
+
An Assessment should be one of the following types:
|
39
|
+
|
40
|
+
- Expectations: A label that represents the expected value for a particular operation.
|
41
|
+
For example, an expected answer for a user question from a chatbot.
|
42
|
+
- Feedback: A label that represents the feedback on the quality of the operation.
|
43
|
+
Feedback can come from different sources, such as human judges, heuristic scorers,
|
44
|
+
or LLM-as-a-Judge.
|
45
|
+
"""
|
46
|
+
|
47
|
+
name: str
|
48
|
+
source: AssessmentSource
|
49
|
+
# NB: The trace ID is optional because the assessment object itself may be created
|
50
|
+
# standalone. For example, a custom metric function returns an assessment object
|
51
|
+
# without a trace ID. That said, the trace ID is required when logging the
|
52
|
+
# assessment to a trace in the backend eventually.
|
53
|
+
# https://docs.databricks.com/aws/en/generative-ai/agent-evaluation/custom-metrics#-metric-decorator
|
54
|
+
trace_id: Optional[str] = None
|
55
|
+
rationale: Optional[str] = None
|
56
|
+
metadata: Optional[dict[str, str]] = None
|
57
|
+
span_id: Optional[str] = None
|
58
|
+
create_time_ms: Optional[int] = None
|
59
|
+
last_update_time_ms: Optional[int] = None
|
60
|
+
# NB: The assessment ID should always be generated in the backend. The CreateAssessment
|
61
|
+
# backend API asks for an incomplete Assessment object without an ID and returns a
|
62
|
+
# complete one with assessment_id, so the ID is Optional in the constructor here.
|
63
|
+
assessment_id: Optional[str] = None
|
64
|
+
# Deprecated, use `error` in Feedback instead. Just kept for backward compatibility
|
65
|
+
# and will be removed in the 3.0.0 release.
|
66
|
+
error: Optional[AssessmentError] = None
|
67
|
+
# Should only be used internally. To create an assessment with an expectation or feedback,
|
68
|
+
# use the`Expectation` or `Feedback` classes instead.
|
69
|
+
expectation: Optional[ExpectationValue] = None
|
70
|
+
feedback: Optional[FeedbackValue] = None
|
71
|
+
# The ID of the assessment which this assessment overrides.
|
72
|
+
overrides: Optional[str] = None
|
73
|
+
# Whether this assessment is valid (i.e. has not been overridden).
|
74
|
+
# This should not be set by the user, it is automatically set by the backend.
|
75
|
+
valid: Optional[bool] = None
|
76
|
+
|
77
|
+
def __post_init__(self):
|
78
|
+
if (self.expectation is not None) + (self.feedback is not None) != 1:
|
79
|
+
raise MlflowException.invalid_parameter_value(
|
80
|
+
"Exactly one of `expectation` or `feedback` should be specified.",
|
81
|
+
)
|
82
|
+
|
83
|
+
# Populate the error field to the feedback object
|
84
|
+
if self.error is not None:
|
85
|
+
if self.expectation is not None:
|
86
|
+
raise MlflowException.invalid_parameter_value(
|
87
|
+
"Cannot set `error` when `expectation` is specified.",
|
88
|
+
)
|
89
|
+
if self.feedback is None:
|
90
|
+
raise MlflowException.invalid_parameter_value(
|
91
|
+
"Cannot set `error` when `feedback` is not specified.",
|
92
|
+
)
|
93
|
+
self.feedback.error = self.error
|
94
|
+
|
95
|
+
# Set timestamp if not provided
|
96
|
+
current_time = int(time.time() * 1000) # milliseconds
|
97
|
+
if self.create_time_ms is None:
|
98
|
+
self.create_time_ms = current_time
|
99
|
+
if self.last_update_time_ms is None:
|
100
|
+
self.last_update_time_ms = current_time
|
101
|
+
|
102
|
+
if not isinstance(self.source, AssessmentSource):
|
103
|
+
raise MlflowException.invalid_parameter_value(
|
104
|
+
"`source` must be an instance of `AssessmentSource`. "
|
105
|
+
f"Got {type(self.source)} instead."
|
106
|
+
)
|
107
|
+
|
108
|
+
def to_proto(self):
|
109
|
+
assessment = ProtoAssessment()
|
110
|
+
assessment.assessment_name = self.name
|
111
|
+
assessment.trace_id = self.trace_id or ""
|
112
|
+
|
113
|
+
assessment.source.CopyFrom(self.source.to_proto())
|
114
|
+
|
115
|
+
# Convert time in milliseconds to protobuf Timestamp
|
116
|
+
assessment.create_time.FromMilliseconds(self.create_time_ms)
|
117
|
+
assessment.last_update_time.FromMilliseconds(self.last_update_time_ms)
|
118
|
+
|
119
|
+
if self.span_id is not None:
|
120
|
+
assessment.span_id = self.span_id
|
121
|
+
if self.rationale is not None:
|
122
|
+
assessment.rationale = self.rationale
|
123
|
+
if self.assessment_id is not None:
|
124
|
+
assessment.assessment_id = self.assessment_id
|
125
|
+
|
126
|
+
if self.expectation is not None:
|
127
|
+
assessment.expectation.CopyFrom(self.expectation.to_proto())
|
128
|
+
elif self.feedback is not None:
|
129
|
+
assessment.feedback.CopyFrom(self.feedback.to_proto())
|
130
|
+
|
131
|
+
if self.metadata:
|
132
|
+
assessment.metadata.update(self.metadata)
|
133
|
+
if self.overrides:
|
134
|
+
assessment.overrides = self.overrides
|
135
|
+
if self.valid is not None:
|
136
|
+
assessment.valid = self.valid
|
137
|
+
|
138
|
+
return assessment
|
139
|
+
|
140
|
+
@classmethod
|
141
|
+
def from_proto(cls, proto):
|
142
|
+
if proto.WhichOneof("value") == "expectation":
|
143
|
+
return Expectation.from_proto(proto)
|
144
|
+
elif proto.WhichOneof("value") == "feedback":
|
145
|
+
return Feedback.from_proto(proto)
|
146
|
+
else:
|
147
|
+
raise MlflowException.invalid_parameter_value(
|
148
|
+
f"Unknown assessment type: {proto.WhichOneof('value')}"
|
149
|
+
)
|
150
|
+
|
151
|
+
def to_dictionary(self):
|
152
|
+
# Note that MessageToDict excludes None fields. For example, if assessment_id is None,
|
153
|
+
# it won't be included in the resulting dictionary.
|
154
|
+
return MessageToDict(self.to_proto(), preserving_proto_field_name=True)
|
155
|
+
|
156
|
+
@classmethod
|
157
|
+
def from_dictionary(cls, d: dict[str, Any]) -> "Assessment":
|
158
|
+
if d.get("expectation"):
|
159
|
+
return Expectation.from_dictionary(d)
|
160
|
+
elif d.get("feedback"):
|
161
|
+
return Feedback.from_dictionary(d)
|
162
|
+
else:
|
163
|
+
raise MlflowException.invalid_parameter_value(
|
164
|
+
f"Unknown assessment type: {d.get('assessment_name')}"
|
165
|
+
)
|
166
|
+
|
167
|
+
|
168
|
+
DEFAULT_FEEDBACK_NAME = "feedback"
|
169
|
+
|
170
|
+
|
171
|
+
@experimental(version="3.0.0")
|
172
|
+
@dataclass
|
173
|
+
class Feedback(Assessment):
|
174
|
+
"""
|
175
|
+
Represents feedback about the output of an operation. For example, if the response from a
|
176
|
+
generative AI application to a particular user query is correct, then a human or LLM judge
|
177
|
+
may provide feedback with the value ``"correct"``.
|
178
|
+
|
179
|
+
Args:
|
180
|
+
name: The name of the assessment. If not provided, the default name "feedback" is used.
|
181
|
+
value: The feedback value. This can be one of the following types:
|
182
|
+
- float
|
183
|
+
- int
|
184
|
+
- str
|
185
|
+
- bool
|
186
|
+
- list of values of the same types as above
|
187
|
+
- dict with string keys and values of the same types as above
|
188
|
+
error: An optional error associated with the feedback. This is used to indicate
|
189
|
+
that the feedback is not valid or cannot be processed. Accepts an exception
|
190
|
+
object, or an :py:class:`~mlflow.entities.Expectation` object.
|
191
|
+
rationale: The rationale / justification for the feedback.
|
192
|
+
source: The source of the assessment. If not provided, the default source is CODE.
|
193
|
+
trace_id: The ID of the trace associated with the assessment. If unset, the assessment
|
194
|
+
is not associated with any trace yet.
|
195
|
+
should be specified.
|
196
|
+
metadata: The metadata associated with the assessment.
|
197
|
+
span_id: The ID of the span associated with the assessment, if the assessment should
|
198
|
+
be associated with a particular span in the trace.
|
199
|
+
create_time_ms: The creation time of the assessment in milliseconds. If unset, the
|
200
|
+
current time is used.
|
201
|
+
last_update_time_ms: The last update time of the assessment in milliseconds.
|
202
|
+
If unset, the current time is used.
|
203
|
+
|
204
|
+
Example:
|
205
|
+
|
206
|
+
.. code-block:: python
|
207
|
+
|
208
|
+
from mlflow.entities import AssessmentSource, Feedback
|
209
|
+
|
210
|
+
feedback = Feedback(
|
211
|
+
name="correctness",
|
212
|
+
value=True,
|
213
|
+
rationale="The response is correct.",
|
214
|
+
source=AssessmentSource(
|
215
|
+
source_type="HUMAN",
|
216
|
+
source_id="john@example.com",
|
217
|
+
),
|
218
|
+
metadata={"project": "my-project"},
|
219
|
+
)
|
220
|
+
"""
|
221
|
+
|
222
|
+
def __init__(
|
223
|
+
self,
|
224
|
+
name: str = DEFAULT_FEEDBACK_NAME,
|
225
|
+
value: Optional[FeedbackValueType] = None,
|
226
|
+
error: Optional[Union[Exception, AssessmentError]] = None,
|
227
|
+
source: Optional[AssessmentSource] = None,
|
228
|
+
trace_id: Optional[str] = None,
|
229
|
+
metadata: Optional[dict[str, str]] = None,
|
230
|
+
span_id: Optional[str] = None,
|
231
|
+
create_time_ms: Optional[int] = None,
|
232
|
+
last_update_time_ms: Optional[int] = None,
|
233
|
+
rationale: Optional[str] = None,
|
234
|
+
overrides: Optional[str] = None,
|
235
|
+
valid: bool = True,
|
236
|
+
):
|
237
|
+
if value is None and error is None:
|
238
|
+
raise MlflowException.invalid_parameter_value(
|
239
|
+
"Either `value` or `error` must be provided.",
|
240
|
+
)
|
241
|
+
|
242
|
+
# Default to CODE source if not provided
|
243
|
+
if source is None:
|
244
|
+
source = AssessmentSource(source_type=AssessmentSourceType.CODE)
|
245
|
+
|
246
|
+
if isinstance(error, Exception):
|
247
|
+
error = AssessmentError(
|
248
|
+
error_message=str(error),
|
249
|
+
error_code=error.__class__.__name__,
|
250
|
+
stack_trace=get_stacktrace(error),
|
251
|
+
)
|
252
|
+
|
253
|
+
super().__init__(
|
254
|
+
name=name,
|
255
|
+
source=source,
|
256
|
+
trace_id=trace_id,
|
257
|
+
metadata=metadata,
|
258
|
+
span_id=span_id,
|
259
|
+
create_time_ms=create_time_ms,
|
260
|
+
last_update_time_ms=last_update_time_ms,
|
261
|
+
feedback=FeedbackValue(value=value, error=error),
|
262
|
+
rationale=rationale,
|
263
|
+
overrides=overrides,
|
264
|
+
valid=valid,
|
265
|
+
)
|
266
|
+
self.error = error
|
267
|
+
|
268
|
+
@property
|
269
|
+
def value(self) -> FeedbackValueType:
|
270
|
+
return self.feedback.value
|
271
|
+
|
272
|
+
@value.setter
|
273
|
+
def value(self, value: FeedbackValueType):
|
274
|
+
self.feedback.value = value
|
275
|
+
|
276
|
+
@classmethod
|
277
|
+
def from_proto(cls, proto):
|
278
|
+
# Convert ScalarMapContainer to a normal Python dict
|
279
|
+
metadata = dict(proto.metadata) if proto.metadata else None
|
280
|
+
feedback_value = FeedbackValue.from_proto(proto.feedback)
|
281
|
+
feedback = cls(
|
282
|
+
trace_id=proto.trace_id,
|
283
|
+
name=proto.assessment_name,
|
284
|
+
source=AssessmentSource.from_proto(proto.source),
|
285
|
+
create_time_ms=proto.create_time.ToMilliseconds(),
|
286
|
+
last_update_time_ms=proto.last_update_time.ToMilliseconds(),
|
287
|
+
value=feedback_value.value,
|
288
|
+
error=feedback_value.error,
|
289
|
+
rationale=proto.rationale or None,
|
290
|
+
metadata=metadata,
|
291
|
+
span_id=proto.span_id or None,
|
292
|
+
overrides=proto.overrides or None,
|
293
|
+
valid=proto.valid,
|
294
|
+
)
|
295
|
+
feedback.assessment_id = proto.assessment_id or None
|
296
|
+
return feedback
|
297
|
+
|
298
|
+
@classmethod
|
299
|
+
def from_dictionary(cls, d: dict[str, Any]) -> "Feedback":
|
300
|
+
feedback_value = d.get("feedback")
|
301
|
+
|
302
|
+
if not feedback_value:
|
303
|
+
raise MlflowException.invalid_parameter_value(
|
304
|
+
"`feedback` must exist in the dictionary."
|
305
|
+
)
|
306
|
+
|
307
|
+
feedback_value = FeedbackValue.from_dictionary(feedback_value)
|
308
|
+
|
309
|
+
feedback = cls(
|
310
|
+
trace_id=d.get("trace_id"),
|
311
|
+
name=d["assessment_name"],
|
312
|
+
source=AssessmentSource.from_dictionary(d["source"]),
|
313
|
+
create_time_ms=proto_timestamp_to_milliseconds(d["create_time"]),
|
314
|
+
last_update_time_ms=proto_timestamp_to_milliseconds(d["last_update_time"]),
|
315
|
+
value=feedback_value.value,
|
316
|
+
error=feedback_value.error,
|
317
|
+
rationale=d.get("rationale"),
|
318
|
+
metadata=d.get("metadata"),
|
319
|
+
span_id=d.get("span_id"),
|
320
|
+
overrides=d.get("overrides"),
|
321
|
+
valid=d.get("valid", True),
|
322
|
+
)
|
323
|
+
feedback.assessment_id = d.get("assessment_id") or None
|
324
|
+
return feedback
|
325
|
+
|
326
|
+
# Backward compatibility: The old assessment object had these fields at top level.
|
327
|
+
@property
|
328
|
+
def error_code(self) -> Optional[str]:
|
329
|
+
"""The error code of the error that occurred when the feedback was created."""
|
330
|
+
return self.feedback.error.error_code if self.feedback.error else None
|
331
|
+
|
332
|
+
@property
|
333
|
+
def error_message(self) -> Optional[str]:
|
334
|
+
"""The error message of the error that occurred when the feedback was created."""
|
335
|
+
return self.feedback.error.error_message if self.feedback.error else None
|
336
|
+
|
337
|
+
|
338
|
+
@experimental(version="2.21.0")
|
339
|
+
@dataclass
|
340
|
+
class Expectation(Assessment):
|
341
|
+
"""
|
342
|
+
Represents an expectation about the output of an operation, such as the expected response
|
343
|
+
that a generative AI application should provide to a particular user query.
|
344
|
+
|
345
|
+
Args:
|
346
|
+
name: The name of the assessment.
|
347
|
+
value: The expected value of the operation. This can be any JSON-serializable value.
|
348
|
+
source: The source of the assessment. If not provided, the default source is HUMAN.
|
349
|
+
trace_id: The ID of the trace associated with the assessment. If unset, the assessment
|
350
|
+
is not associated with any trace yet.
|
351
|
+
should be specified.
|
352
|
+
metadata: The metadata associated with the assessment.
|
353
|
+
span_id: The ID of the span associated with the assessment, if the assessment should
|
354
|
+
be associated with a particular span in the trace.
|
355
|
+
create_time_ms: The creation time of the assessment in milliseconds. If unset, the
|
356
|
+
current time is used.
|
357
|
+
last_update_time_ms: The last update time of the assessment in milliseconds.
|
358
|
+
If unset, the current time is used.
|
359
|
+
|
360
|
+
Example:
|
361
|
+
|
362
|
+
.. code-block:: python
|
363
|
+
|
364
|
+
from mlflow.entities import AssessmentSource, Expectation
|
365
|
+
|
366
|
+
expectation = Expectation(
|
367
|
+
name="expected_response",
|
368
|
+
value="The capital of France is Paris.",
|
369
|
+
source=AssessmentSource(
|
370
|
+
source_type=AssessmentSourceType.HUMAN,
|
371
|
+
source_id="john@example.com",
|
372
|
+
),
|
373
|
+
metadata={"project": "my-project"},
|
374
|
+
)
|
375
|
+
"""
|
376
|
+
|
377
|
+
def __init__(
|
378
|
+
self,
|
379
|
+
name: str,
|
380
|
+
value: Any,
|
381
|
+
source: Optional[AssessmentSource] = None,
|
382
|
+
trace_id: Optional[str] = None,
|
383
|
+
metadata: Optional[dict[str, str]] = None,
|
384
|
+
span_id: Optional[str] = None,
|
385
|
+
create_time_ms: Optional[int] = None,
|
386
|
+
last_update_time_ms: Optional[int] = None,
|
387
|
+
):
|
388
|
+
if source is None:
|
389
|
+
source = AssessmentSource(source_type=AssessmentSourceType.HUMAN)
|
390
|
+
|
391
|
+
if value is None:
|
392
|
+
raise MlflowException.invalid_parameter_value("The `value` field must be specified.")
|
393
|
+
|
394
|
+
super().__init__(
|
395
|
+
name=name,
|
396
|
+
source=source,
|
397
|
+
trace_id=trace_id,
|
398
|
+
metadata=metadata,
|
399
|
+
span_id=span_id,
|
400
|
+
create_time_ms=create_time_ms,
|
401
|
+
last_update_time_ms=last_update_time_ms,
|
402
|
+
expectation=ExpectationValue(value=value),
|
403
|
+
)
|
404
|
+
|
405
|
+
@property
|
406
|
+
def value(self) -> Any:
|
407
|
+
return self.expectation.value
|
408
|
+
|
409
|
+
@value.setter
|
410
|
+
def value(self, value: Any):
|
411
|
+
self.expectation.value = value
|
412
|
+
|
413
|
+
@classmethod
|
414
|
+
def from_proto(cls, proto) -> "Expectation":
|
415
|
+
# Convert ScalarMapContainer to a normal Python dict
|
416
|
+
metadata = dict(proto.metadata) if proto.metadata else None
|
417
|
+
expectation_value = ExpectationValue.from_proto(proto.expectation)
|
418
|
+
expectation = cls(
|
419
|
+
trace_id=proto.trace_id,
|
420
|
+
name=proto.assessment_name,
|
421
|
+
source=AssessmentSource.from_proto(proto.source),
|
422
|
+
create_time_ms=proto.create_time.ToMilliseconds(),
|
423
|
+
last_update_time_ms=proto.last_update_time.ToMilliseconds(),
|
424
|
+
value=expectation_value.value,
|
425
|
+
metadata=metadata,
|
426
|
+
span_id=proto.span_id or None,
|
427
|
+
)
|
428
|
+
expectation.assessment_id = proto.assessment_id or None
|
429
|
+
return expectation
|
430
|
+
|
431
|
+
@classmethod
|
432
|
+
def from_dictionary(cls, d: dict[str, Any]) -> "Expectation":
|
433
|
+
expectation_value = d.get("expectation")
|
434
|
+
|
435
|
+
if not expectation_value:
|
436
|
+
raise MlflowException.invalid_parameter_value(
|
437
|
+
"`expectation` must exist in the dictionary."
|
438
|
+
)
|
439
|
+
|
440
|
+
expectation_value = ExpectationValue.from_dictionary(expectation_value)
|
441
|
+
|
442
|
+
expectation = cls(
|
443
|
+
trace_id=d.get("trace_id"),
|
444
|
+
name=d["assessment_name"],
|
445
|
+
source=AssessmentSource.from_dictionary(d["source"]),
|
446
|
+
create_time_ms=proto_timestamp_to_milliseconds(d["create_time"]),
|
447
|
+
last_update_time_ms=proto_timestamp_to_milliseconds(d["last_update_time"]),
|
448
|
+
value=expectation_value.value,
|
449
|
+
metadata=d.get("metadata"),
|
450
|
+
span_id=d.get("span_id"),
|
451
|
+
)
|
452
|
+
expectation.assessment_id = d.get("assessment_id") or None
|
453
|
+
return expectation
|
454
|
+
|
455
|
+
|
456
|
+
_JSON_SERIALIZATION_FORMAT = "JSON_FORMAT"
|
457
|
+
|
458
|
+
|
459
|
+
@experimental(version="3.0.0")
|
460
|
+
@dataclass
|
461
|
+
class ExpectationValue(_MlflowObject):
|
462
|
+
"""Represents an expectation value."""
|
463
|
+
|
464
|
+
value: Any
|
465
|
+
|
466
|
+
def to_proto(self):
|
467
|
+
if self._need_serialization():
|
468
|
+
try:
|
469
|
+
serialized_value = json.dumps(self.value)
|
470
|
+
except Exception as e:
|
471
|
+
raise MlflowException.invalid_parameter_value(
|
472
|
+
f"Failed to serialize value {self.value} to JSON string. "
|
473
|
+
"Expectation value must be JSON-serializable."
|
474
|
+
) from e
|
475
|
+
return ProtoExpectation(
|
476
|
+
serialized_value=ProtoExpectation.SerializedValue(
|
477
|
+
serialization_format=_JSON_SERIALIZATION_FORMAT,
|
478
|
+
value=serialized_value,
|
479
|
+
)
|
480
|
+
)
|
481
|
+
|
482
|
+
return ProtoExpectation(value=ParseDict(self.value, Value()))
|
483
|
+
|
484
|
+
@classmethod
|
485
|
+
def from_proto(cls, proto) -> "Expectation":
|
486
|
+
if proto.HasField("serialized_value"):
|
487
|
+
if proto.serialized_value.serialization_format != _JSON_SERIALIZATION_FORMAT:
|
488
|
+
raise MlflowException.invalid_parameter_value(
|
489
|
+
f"Unknown serialization format: {proto.serialized_value.serialization_format}. "
|
490
|
+
"Only JSON_FORMAT is supported."
|
491
|
+
)
|
492
|
+
return cls(value=json.loads(proto.serialized_value.value))
|
493
|
+
else:
|
494
|
+
return cls(value=MessageToDict(proto.value))
|
495
|
+
|
496
|
+
def to_dictionary(self):
|
497
|
+
return MessageToDict(self.to_proto(), preserving_proto_field_name=True)
|
498
|
+
|
499
|
+
@classmethod
|
500
|
+
def from_dictionary(cls, d):
|
501
|
+
if "value" in d:
|
502
|
+
return cls(d["value"])
|
503
|
+
elif "serialized_value" in d:
|
504
|
+
return cls(value=json.loads(d["serialized_value"]["value"]))
|
505
|
+
else:
|
506
|
+
raise MlflowException.invalid_parameter_value(
|
507
|
+
"Either 'value' or 'serialized_value' must be present in the dictionary "
|
508
|
+
"representation of an Expectation."
|
509
|
+
)
|
510
|
+
|
511
|
+
def _need_serialization(self):
|
512
|
+
# Values like None, lists, dicts, should be serialized as a JSON string
|
513
|
+
return self.value is not None and not isinstance(self.value, (int, float, bool, str))
|
514
|
+
|
515
|
+
|
516
|
+
@experimental(version="2.21.0")
|
517
|
+
@dataclass
|
518
|
+
class FeedbackValue(_MlflowObject):
|
519
|
+
"""Represents a feedback value."""
|
520
|
+
|
521
|
+
value: FeedbackValueType
|
522
|
+
error: Optional[AssessmentError] = None
|
523
|
+
|
524
|
+
def to_proto(self):
|
525
|
+
return ProtoFeedback(
|
526
|
+
value=ParseDict(self.value, Value(), ignore_unknown_fields=True),
|
527
|
+
error=self.error.to_proto() if self.error else None,
|
528
|
+
)
|
529
|
+
|
530
|
+
@classmethod
|
531
|
+
def from_proto(cls, proto) -> "FeedbackValue":
|
532
|
+
return FeedbackValue(
|
533
|
+
value=MessageToDict(proto.value),
|
534
|
+
error=AssessmentError.from_proto(proto.error) if proto.HasField("error") else None,
|
535
|
+
)
|
536
|
+
|
537
|
+
def to_dictionary(self):
|
538
|
+
return MessageToDict(self.to_proto(), preserving_proto_field_name=True)
|
539
|
+
|
540
|
+
@classmethod
|
541
|
+
def from_dictionary(cls, d):
|
542
|
+
return cls(
|
543
|
+
value=d["value"],
|
544
|
+
error=AssessmentError.from_dictionary(err) if (err := d.get("error")) else None,
|
545
|
+
)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from mlflow.entities._mlflow_object import _MlflowObject
|
5
|
+
from mlflow.protos.assessments_pb2 import AssessmentError as ProtoAssessmentError
|
6
|
+
from mlflow.utils.annotations import experimental
|
7
|
+
|
8
|
+
_STACK_TRACE_TRUNCATION_PREFIX = "[Stack trace is truncated]\n...\n"
|
9
|
+
_STACK_TRACE_TRUNCATION_LENGTH = 1000
|
10
|
+
|
11
|
+
|
12
|
+
@experimental(version="2.21.0")
|
13
|
+
@dataclass
|
14
|
+
class AssessmentError(_MlflowObject):
|
15
|
+
"""
|
16
|
+
Error object representing any issues during generating the assessment.
|
17
|
+
|
18
|
+
For example, if the LLM-as-a-Judge fails to generate an feedback, you can
|
19
|
+
log an error with the error code and message as shown below:
|
20
|
+
|
21
|
+
.. code-block:: python
|
22
|
+
|
23
|
+
from mlflow.entities import AssessmentError
|
24
|
+
|
25
|
+
error = AssessmentError(
|
26
|
+
error_code="RATE_LIMIT_EXCEEDED",
|
27
|
+
error_message="Rate limit for the judge exceeded.",
|
28
|
+
stack_trace="...",
|
29
|
+
)
|
30
|
+
|
31
|
+
mlflow.log_feedback(
|
32
|
+
trace_id="1234",
|
33
|
+
name="faithfulness",
|
34
|
+
source=AssessmentSourceType.LLM_JUDGE,
|
35
|
+
error=error,
|
36
|
+
# Skip setting value when an error is present
|
37
|
+
)
|
38
|
+
|
39
|
+
Args:
|
40
|
+
error_code: The error code.
|
41
|
+
error_message: The detailed error message. Optional.
|
42
|
+
stack_trace: The stack trace of the error. Truncated to 1000 characters
|
43
|
+
before being logged to MLflow. Optional.
|
44
|
+
"""
|
45
|
+
|
46
|
+
error_code: str
|
47
|
+
error_message: Optional[str] = None
|
48
|
+
stack_trace: Optional[str] = None
|
49
|
+
|
50
|
+
def to_proto(self):
|
51
|
+
error = ProtoAssessmentError()
|
52
|
+
error.error_code = self.error_code
|
53
|
+
if self.error_message:
|
54
|
+
error.error_message = self.error_message
|
55
|
+
if self.stack_trace:
|
56
|
+
if len(self.stack_trace) > _STACK_TRACE_TRUNCATION_LENGTH:
|
57
|
+
trunc_len = _STACK_TRACE_TRUNCATION_LENGTH - len(_STACK_TRACE_TRUNCATION_PREFIX)
|
58
|
+
error.stack_trace = _STACK_TRACE_TRUNCATION_PREFIX + self.stack_trace[-trunc_len:]
|
59
|
+
else:
|
60
|
+
error.stack_trace = self.stack_trace
|
61
|
+
return error
|
62
|
+
|
63
|
+
@classmethod
|
64
|
+
def from_proto(cls, proto):
|
65
|
+
return cls(
|
66
|
+
error_code=proto.error_code,
|
67
|
+
error_message=proto.error_message or None,
|
68
|
+
stack_trace=proto.stack_trace or None,
|
69
|
+
)
|
70
|
+
|
71
|
+
def to_dictionary(self):
|
72
|
+
return {
|
73
|
+
"error_code": self.error_code,
|
74
|
+
"error_message": self.error_message,
|
75
|
+
"stack_trace": self.stack_trace,
|
76
|
+
}
|
77
|
+
|
78
|
+
@classmethod
|
79
|
+
def from_dictionary(cls, error_dict):
|
80
|
+
return cls(**error_dict)
|