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
mlflow/gemini/autolog.py
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
import inspect
|
2
|
+
import logging
|
3
|
+
|
4
|
+
import mlflow
|
5
|
+
import mlflow.gemini
|
6
|
+
from mlflow.entities import SpanType
|
7
|
+
from mlflow.gemini.chat import (
|
8
|
+
convert_gemini_func_to_mlflow_chat_tool,
|
9
|
+
parse_gemini_content_to_mlflow_chat_messages,
|
10
|
+
)
|
11
|
+
from mlflow.tracing.utils import set_span_chat_messages, set_span_chat_tools
|
12
|
+
from mlflow.types.chat import ChatMessage
|
13
|
+
from mlflow.utils.autologging_utils.config import AutoLoggingConfig
|
14
|
+
|
15
|
+
try:
|
16
|
+
# This is for supporting the previous Google GenAI SDK
|
17
|
+
# https://github.com/google-gemini/generative-ai-python
|
18
|
+
from google import generativeai
|
19
|
+
|
20
|
+
has_generativeai = True
|
21
|
+
except ImportError:
|
22
|
+
has_generativeai = False
|
23
|
+
|
24
|
+
try:
|
25
|
+
from google import genai
|
26
|
+
|
27
|
+
has_genai = True
|
28
|
+
except ImportError:
|
29
|
+
has_genai = False
|
30
|
+
|
31
|
+
_logger = logging.getLogger(__name__)
|
32
|
+
|
33
|
+
|
34
|
+
def patched_class_call(original, self, *args, **kwargs):
|
35
|
+
"""
|
36
|
+
This method is used for patching class methods of gemini SDKs.
|
37
|
+
This patch creates a span and set input and output of the original method to the span.
|
38
|
+
"""
|
39
|
+
config = AutoLoggingConfig.init(flavor_name=mlflow.gemini.FLAVOR_NAME)
|
40
|
+
|
41
|
+
if config.log_traces:
|
42
|
+
with mlflow.start_span(
|
43
|
+
name=f"{self.__class__.__name__}.{original.__name__}",
|
44
|
+
span_type=_get_span_type(original.__name__),
|
45
|
+
) as span:
|
46
|
+
inputs = _construct_full_inputs(original, self, *args, **kwargs)
|
47
|
+
span.set_inputs(inputs)
|
48
|
+
if has_generativeai and isinstance(self, generativeai.GenerativeModel):
|
49
|
+
_log_generativeai_tool_definition(self, span)
|
50
|
+
if has_genai and isinstance(self, (genai.models.Models, genai.chats.Chat)):
|
51
|
+
_log_genai_tool_definition(self, inputs, span)
|
52
|
+
|
53
|
+
result = original(self, *args, **kwargs)
|
54
|
+
|
55
|
+
if (
|
56
|
+
has_generativeai and isinstance(result, generativeai.types.GenerateContentResponse)
|
57
|
+
) or (has_genai and isinstance(result, genai.types.GenerateContentResponse)):
|
58
|
+
try:
|
59
|
+
content = _get_keys(inputs, ["contents", "content", "message"])
|
60
|
+
messages = parse_gemini_content_to_mlflow_chat_messages(content)
|
61
|
+
messages += _parse_outputs(result)
|
62
|
+
if messages:
|
63
|
+
set_span_chat_messages(span=span, messages=messages)
|
64
|
+
except Exception as e:
|
65
|
+
_logger.warning(
|
66
|
+
f"An exception occurred on logging chat attributes for {span}. Error: {e}"
|
67
|
+
)
|
68
|
+
|
69
|
+
# need to convert the response of generate_content for better visualization
|
70
|
+
outputs = result.to_dict() if hasattr(result, "to_dict") else result
|
71
|
+
span.set_outputs(outputs)
|
72
|
+
|
73
|
+
return result
|
74
|
+
|
75
|
+
|
76
|
+
def patched_module_call(original, *args, **kwargs):
|
77
|
+
"""
|
78
|
+
This method is used for patching standalone functions of the google.generativeai module.
|
79
|
+
This patch creates a span and set input and output of the original function to the span.
|
80
|
+
"""
|
81
|
+
config = AutoLoggingConfig.init(flavor_name=mlflow.gemini.FLAVOR_NAME)
|
82
|
+
|
83
|
+
if config.log_traces:
|
84
|
+
with mlflow.start_span(
|
85
|
+
name=f"{original.__name__}",
|
86
|
+
span_type=_get_span_type(original.__name__),
|
87
|
+
) as span:
|
88
|
+
inputs = _construct_full_inputs(original, *args, **kwargs)
|
89
|
+
span.set_inputs(inputs)
|
90
|
+
result = original(*args, **kwargs)
|
91
|
+
# need to convert the response of generate_content for better visualization
|
92
|
+
outputs = result.to_dict() if hasattr(result, "to_dict") else result
|
93
|
+
span.set_outputs(outputs)
|
94
|
+
|
95
|
+
return result
|
96
|
+
|
97
|
+
|
98
|
+
def _get_keys(dic, keys):
|
99
|
+
for key in keys:
|
100
|
+
if key in dic:
|
101
|
+
return dic[key]
|
102
|
+
|
103
|
+
return None
|
104
|
+
|
105
|
+
|
106
|
+
def _parse_outputs(outputs) -> list[ChatMessage]:
|
107
|
+
"""
|
108
|
+
This method extract chat messages from genai.types.generation_types.GenerateContentResponse
|
109
|
+
"""
|
110
|
+
# content always exist on output
|
111
|
+
# https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/generative_service.proto#L490
|
112
|
+
return sum(
|
113
|
+
[
|
114
|
+
parse_gemini_content_to_mlflow_chat_messages(candidate.content)
|
115
|
+
for candidate in outputs.candidates
|
116
|
+
],
|
117
|
+
[],
|
118
|
+
)
|
119
|
+
|
120
|
+
|
121
|
+
def _log_generativeai_tool_definition(model, span):
|
122
|
+
"""
|
123
|
+
This method extract tool definition from generativeai tool type.
|
124
|
+
"""
|
125
|
+
# when tools are not passed
|
126
|
+
if not getattr(model, "_tools", None):
|
127
|
+
return
|
128
|
+
|
129
|
+
try:
|
130
|
+
set_span_chat_tools(
|
131
|
+
span,
|
132
|
+
[
|
133
|
+
convert_gemini_func_to_mlflow_chat_tool(func)
|
134
|
+
for func in model._tools.to_proto()[0].function_declarations
|
135
|
+
],
|
136
|
+
)
|
137
|
+
except Exception as e:
|
138
|
+
_logger.warning(f"Failed to set tool definitions for {span}. Error: {e}")
|
139
|
+
|
140
|
+
|
141
|
+
def _log_genai_tool_definition(model, inputs, span):
|
142
|
+
"""
|
143
|
+
This method extract tool definition from genai tool type.
|
144
|
+
"""
|
145
|
+
config = inputs.get("config")
|
146
|
+
tools = getattr(config, "tools", None)
|
147
|
+
if not tools:
|
148
|
+
return
|
149
|
+
# Here, we use an internal function of gemini library to convert callable to Tool schema to
|
150
|
+
# avoid having the same logic on mlflow side and there is no public attribute for Tool schema.
|
151
|
+
# https://github.com/googleapis/python-genai/blob/01b15e32d3823a58d25534bb6eea93f30bf82219/google/genai/_transformers.py#L662
|
152
|
+
tools = genai._transformers.t_tools(model._api_client, tools)
|
153
|
+
|
154
|
+
try:
|
155
|
+
set_span_chat_tools(
|
156
|
+
span,
|
157
|
+
[
|
158
|
+
convert_gemini_func_to_mlflow_chat_tool(function_declaration)
|
159
|
+
for tool in tools
|
160
|
+
for function_declaration in tool.function_declarations
|
161
|
+
],
|
162
|
+
)
|
163
|
+
except Exception as e:
|
164
|
+
_logger.warning(f"Failed to set tool definitions for {span}. Error: {e}")
|
165
|
+
|
166
|
+
|
167
|
+
def _get_span_type(task_name: str) -> str:
|
168
|
+
span_type_mapping = {
|
169
|
+
"generate_content": SpanType.LLM,
|
170
|
+
"_generate_content": SpanType.LLM,
|
171
|
+
"send_message": SpanType.CHAT_MODEL,
|
172
|
+
"count_tokens": SpanType.LLM,
|
173
|
+
"embed_content": SpanType.EMBEDDING,
|
174
|
+
}
|
175
|
+
return span_type_mapping.get(task_name, SpanType.UNKNOWN)
|
176
|
+
|
177
|
+
|
178
|
+
def _construct_full_inputs(func, *args, **kwargs):
|
179
|
+
signature = inspect.signature(func)
|
180
|
+
# this method does not create copy. So values should not be mutated directly
|
181
|
+
arguments = signature.bind_partial(*args, **kwargs).arguments
|
182
|
+
|
183
|
+
if "self" in arguments:
|
184
|
+
arguments.pop("self")
|
185
|
+
|
186
|
+
return arguments
|
mlflow/gemini/chat.py
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from typing import TYPE_CHECKING, Optional, Union
|
4
|
+
|
5
|
+
from mlflow.types.chat import (
|
6
|
+
ChatMessage,
|
7
|
+
ChatTool,
|
8
|
+
Function,
|
9
|
+
FunctionParams,
|
10
|
+
FunctionToolDefinition,
|
11
|
+
ImageContentPart,
|
12
|
+
ImageUrl,
|
13
|
+
ParamProperty,
|
14
|
+
TextContentPart,
|
15
|
+
ToolCall,
|
16
|
+
)
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from google import genai
|
20
|
+
|
21
|
+
_logger = logging.getLogger(__name__)
|
22
|
+
|
23
|
+
|
24
|
+
def convert_gemini_func_to_mlflow_chat_tool(
|
25
|
+
function_def: "genai.types.FunctionDeclaration",
|
26
|
+
) -> ChatTool:
|
27
|
+
"""
|
28
|
+
Convert Gemini function definition into MLflow's standard format (OpenAI compatible).
|
29
|
+
Ref: https://ai.google.dev/gemini-api/docs/function-calling
|
30
|
+
|
31
|
+
Args:
|
32
|
+
function_def: A genai.types.FunctionDeclaration or genai.protos.FunctionDeclaration object
|
33
|
+
representing a function definition.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
ChatTool: MLflow's standard tool definition object.
|
37
|
+
"""
|
38
|
+
return ChatTool(
|
39
|
+
type="function",
|
40
|
+
function=FunctionToolDefinition(
|
41
|
+
name=function_def.name,
|
42
|
+
description=function_def.description,
|
43
|
+
parameters=_convert_gemini_function_param_to_mlflow_function_param(
|
44
|
+
function_def.parameters
|
45
|
+
),
|
46
|
+
),
|
47
|
+
)
|
48
|
+
|
49
|
+
|
50
|
+
def convert_gemini_func_call_to_mlflow_tool_call(
|
51
|
+
func_call: "genai.types.FunctionCall",
|
52
|
+
) -> ToolCall:
|
53
|
+
"""
|
54
|
+
Convert Gemini function call into MLflow's standard format (OpenAI compatible).
|
55
|
+
Ref: https://ai.google.dev/gemini-api/docs/function-calling
|
56
|
+
|
57
|
+
Args:
|
58
|
+
func_call: A genai.types.FunctionCall or genai.protos.FunctionCall object
|
59
|
+
representing a single func call.
|
60
|
+
|
61
|
+
Returns:
|
62
|
+
ToolCall: MLflow's standard tool call object.
|
63
|
+
"""
|
64
|
+
# original args object is not json serializable
|
65
|
+
args = func_call.args or {}
|
66
|
+
|
67
|
+
return ToolCall(
|
68
|
+
# Gemini does not have func call id
|
69
|
+
id=func_call.name,
|
70
|
+
type="function",
|
71
|
+
function=Function(name=func_call.name, arguments=json.dumps(dict(args))),
|
72
|
+
)
|
73
|
+
|
74
|
+
|
75
|
+
def parse_gemini_content_to_mlflow_chat_messages(
|
76
|
+
content: "genai.types.ContentsType",
|
77
|
+
) -> list[ChatMessage]:
|
78
|
+
"""
|
79
|
+
Convert a gemini content to chat messages.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
content: A genai.types.ContentsType object representing the model content.
|
83
|
+
|
84
|
+
Returns:
|
85
|
+
list[ChatMessage]: A list of MLflow's standard chat messages.
|
86
|
+
"""
|
87
|
+
if isinstance(content, str):
|
88
|
+
# Assume str content is used only for user input
|
89
|
+
return [
|
90
|
+
ChatMessage(
|
91
|
+
role="user",
|
92
|
+
content=content,
|
93
|
+
)
|
94
|
+
]
|
95
|
+
elif isinstance(content, list):
|
96
|
+
# either list of user inputs or multi-turn conversation
|
97
|
+
if not content:
|
98
|
+
return []
|
99
|
+
# when chat history is passed, parse content recursively
|
100
|
+
if hasattr(content[0], "parts"):
|
101
|
+
return sum(
|
102
|
+
[
|
103
|
+
parse_gemini_content_to_mlflow_chat_messages(content_block)
|
104
|
+
for content_block in content
|
105
|
+
],
|
106
|
+
[],
|
107
|
+
)
|
108
|
+
|
109
|
+
# when multiple contents are passed by user
|
110
|
+
return [_construct_chat_message(content, "user")]
|
111
|
+
elif hasattr(content, "parts"):
|
112
|
+
# eigher genai.types.Content or ContentDict
|
113
|
+
|
114
|
+
# This could be unset for single turn conversation even if this is content proto
|
115
|
+
# https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/content.proto#L64
|
116
|
+
role = getattr(content, "role", "model") or "model"
|
117
|
+
# we normalize role and use assistant
|
118
|
+
if role == "model":
|
119
|
+
role = "assistant"
|
120
|
+
|
121
|
+
return [_construct_chat_message(content.parts, role)]
|
122
|
+
else:
|
123
|
+
_logger.debug(f"Received an unsupported content type: {content.__class__}")
|
124
|
+
return []
|
125
|
+
|
126
|
+
|
127
|
+
def _construct_chat_message(parts: list["genai.types.PartType"], role: str) -> ChatMessage:
|
128
|
+
tool_calls = []
|
129
|
+
content_parts = []
|
130
|
+
for content_part in parts:
|
131
|
+
part = _parse_content_part(content_part)
|
132
|
+
if isinstance(part, (TextContentPart, ImageContentPart)):
|
133
|
+
content_parts.append(part)
|
134
|
+
elif isinstance(part, ToolCall):
|
135
|
+
tool_calls.append(part)
|
136
|
+
chat_message = ChatMessage(
|
137
|
+
role=role,
|
138
|
+
content=content_parts or None,
|
139
|
+
)
|
140
|
+
|
141
|
+
if tool_calls:
|
142
|
+
chat_message.tool_calls = tool_calls
|
143
|
+
|
144
|
+
return chat_message
|
145
|
+
|
146
|
+
|
147
|
+
def _parse_content_part(part: "genai.types.PartType") -> Optional[Union[TextContentPart, ToolCall]]:
|
148
|
+
"""
|
149
|
+
Convert Gemini part type into MLflow's standard format (OpenAI compatible).
|
150
|
+
Ref: https://ai.google.dev/gemini-api/docs/function-calling
|
151
|
+
|
152
|
+
Args:
|
153
|
+
part: A genai.types.PartType object representing a part of content.
|
154
|
+
|
155
|
+
Returns:
|
156
|
+
Optional[Union[TextContentPart, ToolCall]]: MLflow's standard content part.
|
157
|
+
"""
|
158
|
+
# The schema of the Part proto is available at https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/content.proto#L76
|
159
|
+
if function_call := getattr(part, "function_call", None):
|
160
|
+
# FunctionCall part: https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/content.proto#L316
|
161
|
+
return convert_gemini_func_call_to_mlflow_tool_call(function_call)
|
162
|
+
elif function_response := getattr(part, "function_response", None):
|
163
|
+
# FunctionResponse part: https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/content.proto#L332
|
164
|
+
if hasattr(function_response, "json"):
|
165
|
+
# genai
|
166
|
+
return TextContentPart(text=function_response.json(), type="text")
|
167
|
+
# generativeai
|
168
|
+
return TextContentPart(
|
169
|
+
text=str(type(function_response).to_dict(function_response)), type="text"
|
170
|
+
)
|
171
|
+
elif blob := getattr(part, "inline_data", None):
|
172
|
+
# Blob part: https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/content.proto#L109C9-L109C13
|
173
|
+
return ImageContentPart(
|
174
|
+
image_url=ImageUrl(
|
175
|
+
url=f"data:{blob.mime_type};base64,{blob.data}",
|
176
|
+
detail="auto",
|
177
|
+
),
|
178
|
+
type="image_url",
|
179
|
+
)
|
180
|
+
elif file := getattr(part, "file_data", None):
|
181
|
+
# FileData part: https://github.com/googleapis/googleapis/blob/9e966149c59f47f6305d66c98e2a9e7d9c26a2eb/google/ai/generativelanguage/v1beta/content.proto#L124
|
182
|
+
return ImageContentPart(
|
183
|
+
image_url=ImageUrl(
|
184
|
+
url=file.file_uri,
|
185
|
+
detail="auto",
|
186
|
+
),
|
187
|
+
type="image_url",
|
188
|
+
)
|
189
|
+
elif hasattr(part, "mime_type"):
|
190
|
+
# Blob part or FileData part
|
191
|
+
url = (
|
192
|
+
part.file_uri
|
193
|
+
if hasattr(part, "file_uri")
|
194
|
+
else f"data:{part.mime_type};base64,{part.data}"
|
195
|
+
)
|
196
|
+
return ImageContentPart(
|
197
|
+
image_url=ImageUrl(url=url, detail="auto"),
|
198
|
+
type="image_url",
|
199
|
+
)
|
200
|
+
elif isinstance(part, dict):
|
201
|
+
if "mime_type" in part:
|
202
|
+
# genai.types.BlobDict
|
203
|
+
return ImageContentPart(
|
204
|
+
image_url=ImageUrl(
|
205
|
+
url=f"data:{part['mime_type']};base64,{part['data']}", detail="auto"
|
206
|
+
),
|
207
|
+
type="image_url",
|
208
|
+
)
|
209
|
+
elif "text" in part:
|
210
|
+
return TextContentPart(text=part["text"], type="text")
|
211
|
+
elif text := getattr(part, "text", None):
|
212
|
+
# Text part
|
213
|
+
return TextContentPart(text=text, type="text")
|
214
|
+
elif isinstance(part, str):
|
215
|
+
return TextContentPart(text=part, type="text")
|
216
|
+
# TODO: Gemini supports more types. Consider including unsupported types (e.g. PIL image)
|
217
|
+
_logger.debug(f"Received an unsupported content block type: {part.__class__}")
|
218
|
+
|
219
|
+
|
220
|
+
def _convert_gemini_param_property_to_mlflow_param_property(param_property) -> ParamProperty:
|
221
|
+
"""
|
222
|
+
Convert Gemini parameter property definition into MLflow's standard format (OpenAI compatible).
|
223
|
+
Ref: https://ai.google.dev/gemini-api/docs/function-calling
|
224
|
+
|
225
|
+
Args:
|
226
|
+
param_property: A genai.types.Schema or genai.protos.Schema object
|
227
|
+
representing a parameter property.
|
228
|
+
|
229
|
+
Returns:
|
230
|
+
ParamProperty: MLflow's standard param property object.
|
231
|
+
"""
|
232
|
+
type_name = param_property.type
|
233
|
+
type_name = type_name.name.lower() if hasattr(type_name, "name") else type_name.lower()
|
234
|
+
return ParamProperty(
|
235
|
+
description=param_property.description,
|
236
|
+
enum=param_property.enum,
|
237
|
+
type=type_name,
|
238
|
+
)
|
239
|
+
|
240
|
+
|
241
|
+
def _convert_gemini_function_param_to_mlflow_function_param(
|
242
|
+
function_params: "genai.types.Schema",
|
243
|
+
) -> FunctionParams:
|
244
|
+
"""
|
245
|
+
Convert Gemini function parameter definition into MLflow's standard format (OpenAI compatible).
|
246
|
+
Ref: https://ai.google.dev/gemini-api/docs/function-calling
|
247
|
+
|
248
|
+
Args:
|
249
|
+
function_params: A genai.types.Schema or genai.protos.Schema object
|
250
|
+
representing function parameters.
|
251
|
+
|
252
|
+
Returns:
|
253
|
+
FunctionParams: MLflow's standard function parameter object.
|
254
|
+
"""
|
255
|
+
return FunctionParams(
|
256
|
+
properties={
|
257
|
+
k: _convert_gemini_param_property_to_mlflow_param_property(v)
|
258
|
+
for k, v in function_params.properties.items()
|
259
|
+
},
|
260
|
+
required=function_params.required,
|
261
|
+
)
|
mlflow/genai/__init__.py
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
from mlflow.genai import (
|
2
|
+
judges,
|
3
|
+
scorers,
|
4
|
+
)
|
5
|
+
from mlflow.genai.datasets import (
|
6
|
+
create_dataset,
|
7
|
+
delete_dataset,
|
8
|
+
get_dataset,
|
9
|
+
)
|
10
|
+
from mlflow.genai.evaluation import evaluate, to_predict_fn
|
11
|
+
from mlflow.genai.labeling import (
|
12
|
+
Agent,
|
13
|
+
LabelingSession,
|
14
|
+
ReviewApp,
|
15
|
+
create_labeling_session,
|
16
|
+
delete_labeling_session,
|
17
|
+
get_labeling_session,
|
18
|
+
get_labeling_sessions,
|
19
|
+
get_review_app,
|
20
|
+
)
|
21
|
+
from mlflow.genai.optimize import optimize_prompt
|
22
|
+
from mlflow.genai.prompts import (
|
23
|
+
delete_prompt_alias,
|
24
|
+
load_prompt,
|
25
|
+
register_prompt,
|
26
|
+
search_prompts,
|
27
|
+
set_prompt_alias,
|
28
|
+
)
|
29
|
+
from mlflow.genai.scheduled_scorers import (
|
30
|
+
ScorerScheduleConfig,
|
31
|
+
add_scheduled_scorer,
|
32
|
+
delete_scheduled_scorer,
|
33
|
+
get_scheduled_scorer,
|
34
|
+
list_scheduled_scorers,
|
35
|
+
set_scheduled_scorers,
|
36
|
+
update_scheduled_scorer,
|
37
|
+
)
|
38
|
+
from mlflow.genai.scorers import Scorer, scorer
|
39
|
+
|
40
|
+
__all__ = [
|
41
|
+
"evaluate",
|
42
|
+
"to_predict_fn",
|
43
|
+
"Scorer",
|
44
|
+
"scorer",
|
45
|
+
"judges",
|
46
|
+
"scorers",
|
47
|
+
"create_dataset",
|
48
|
+
"delete_dataset",
|
49
|
+
"get_dataset",
|
50
|
+
"load_prompt",
|
51
|
+
"register_prompt",
|
52
|
+
"search_prompts",
|
53
|
+
"delete_prompt_alias",
|
54
|
+
"set_prompt_alias",
|
55
|
+
"optimize_prompt",
|
56
|
+
"ScorerScheduleConfig",
|
57
|
+
"add_scheduled_scorer",
|
58
|
+
"update_scheduled_scorer",
|
59
|
+
"delete_scheduled_scorer",
|
60
|
+
"get_scheduled_scorer",
|
61
|
+
"list_scheduled_scorers",
|
62
|
+
"set_scheduled_scorers",
|
63
|
+
"Agent",
|
64
|
+
"LabelingSession",
|
65
|
+
"ReviewApp",
|
66
|
+
"get_review_app",
|
67
|
+
"create_labeling_session",
|
68
|
+
"get_labeling_sessions",
|
69
|
+
"get_labeling_session",
|
70
|
+
"delete_labeling_session",
|
71
|
+
]
|
@@ -0,0 +1,67 @@
|
|
1
|
+
"""
|
2
|
+
Databricks Agent Datasets Python SDK. For more details see Databricks Agent Evaluation:
|
3
|
+
<https://docs.databricks.com/en/generative-ai/agent-evaluation/index.html>
|
4
|
+
|
5
|
+
The API docs can be found here:
|
6
|
+
<https://api-docs.databricks.com/python/databricks-agents/latest/databricks_agent_eval.html#datasets>
|
7
|
+
"""
|
8
|
+
|
9
|
+
from typing import Optional, Union
|
10
|
+
|
11
|
+
from mlflow.genai.datasets.evaluation_dataset import EvaluationDataset
|
12
|
+
|
13
|
+
_ERROR_MSG = (
|
14
|
+
"The `databricks-agents` package is required to use `mlflow.genai.datasets`. "
|
15
|
+
"Please install it with `pip install databricks-agents`."
|
16
|
+
)
|
17
|
+
|
18
|
+
|
19
|
+
def create_dataset(
|
20
|
+
uc_table_name: str, experiment_id: Optional[Union[str, list[str]]] = None
|
21
|
+
) -> "EvaluationDataset":
|
22
|
+
"""Create a dataset with the given name and associate it with the given experiment.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
uc_table_name: The UC table name of the dataset.
|
26
|
+
experiment_id: The ID of the experiment to associate the dataset with. If not provided,
|
27
|
+
the current experiment is inferred from the environment.
|
28
|
+
"""
|
29
|
+
try:
|
30
|
+
from databricks.agents.datasets import create_dataset
|
31
|
+
except ImportError as e:
|
32
|
+
raise ImportError(_ERROR_MSG) from e
|
33
|
+
return EvaluationDataset(create_dataset(uc_table_name, experiment_id))
|
34
|
+
|
35
|
+
|
36
|
+
def delete_dataset(uc_table_name: str) -> None:
|
37
|
+
"""Delete the dataset with the given name.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
uc_table_name: The UC table name of the dataset.
|
41
|
+
"""
|
42
|
+
try:
|
43
|
+
from databricks.agents.datasets import delete_dataset
|
44
|
+
except ImportError:
|
45
|
+
raise ImportError(_ERROR_MSG) from None
|
46
|
+
return delete_dataset(uc_table_name)
|
47
|
+
|
48
|
+
|
49
|
+
def get_dataset(uc_table_name: str) -> "EvaluationDataset":
|
50
|
+
"""Get the dataset with the given name.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
uc_table_name: The UC table name of the dataset.
|
54
|
+
"""
|
55
|
+
try:
|
56
|
+
from databricks.agents.datasets import get_dataset
|
57
|
+
except ImportError as e:
|
58
|
+
raise ImportError(_ERROR_MSG) from e
|
59
|
+
return EvaluationDataset(get_dataset(uc_table_name))
|
60
|
+
|
61
|
+
|
62
|
+
__all__ = [
|
63
|
+
"create_dataset",
|
64
|
+
"delete_dataset",
|
65
|
+
"get_dataset",
|
66
|
+
"EvaluationDataset",
|
67
|
+
]
|