From 85c0ef1b68ec5d5d2f7df8419d6e9c34bbfadc75 Mon Sep 17 00:00:00 2001 From: Ben Kazemi Date: Tue, 27 Jan 2026 16:15:30 -0800 Subject: [PATCH] feat: GenAI SDK client(multimodal) - Support Assess Tuning Validity for multimodal dataset. PiperOrigin-RevId: 861928934 --- .../replays/test_assess_multimodal_dataset.py | 19 +++++++ vertexai/_genai/datasets.py | 49 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/tests/unit/vertexai/genai/replays/test_assess_multimodal_dataset.py b/tests/unit/vertexai/genai/replays/test_assess_multimodal_dataset.py index 673a3b5b68..5a8d7bfdc9 100644 --- a/tests/unit/vertexai/genai/replays/test_assess_multimodal_dataset.py +++ b/tests/unit/vertexai/genai/replays/test_assess_multimodal_dataset.py @@ -66,6 +66,25 @@ def test_assess_tuning_resources(client): assert isinstance(response, types.TuningResourceUsageAssessmentResult) +def test_assess_tuning_validity(client): + response = client.datasets.assess_tuning_validity( + dataset_name=DATASET, + dataset_usage="SFT_VALIDATION", + model_name="gemini-2.5-flash-001", + template_config=types.GeminiTemplateConfig( + gemini_example=types.GeminiExample( + contents=[ + { + "role": "user", + "parts": [{"text": "What is the capital of {name}?"}], + } + ], + ), + ), + ) + assert isinstance(response, types.TuningValidationAssessmentResult) + + pytestmark = pytest_helper.setup( file=__file__, globals_for_file=globals(), diff --git a/vertexai/_genai/datasets.py b/vertexai/_genai/datasets.py index 68a5367bdf..db5ade15c9 100644 --- a/vertexai/_genai/datasets.py +++ b/vertexai/_genai/datasets.py @@ -1054,6 +1054,55 @@ def assess_tuning_resources( response["tuningResourceUsageAssessmentResult"], ) + def assess_tuning_validity( + self, + *, + dataset_name: str, + model_name: str, + dataset_usage: str, + template_config: Optional[types.GeminiTemplateConfigOrDict] = None, + config: Optional[types.AssessDatasetConfigOrDict] = None, + ) -> types.TuningValidationAssessmentResult: + if isinstance(config, dict): + config = types.AssessDatasetConfig(**config) + elif not config: + config = types.AssessDatasetConfig() + + operation = self._assess_multimodal_dataset( + name=dataset_name, + tuning_validation_assessment_config=types.TuningValidationAssessmentConfig( + model_name=model_name, + dataset_usage=dataset_usage, + ), + gemini_request_read_config=types.GeminiRequestReadConfig( + template_config=template_config, + ), + config=config, + ) + response = self._wait_for_operation( + operation=operation, + timeout_seconds=config.timeout, + ) + return _datasets_utils.create_from_response( + types.TuningValidationAssessmentResult, + response["tuningValidationAssessmentResult"], + ) + + # request = self._build_assess_data_request(template_config) + # request.tuning_validation_assessment_config = ( + # types.TuningValidationAssessmentConfig( + # model_name=model_name, + # dataset_usage=dataset_usage, + # ) + # ) + # assess_lro = self.api_client.assess_data( + # request=request, timeout=assess_request_timeout + # ) + # assessment_result = assess_lro.result(timeout=None) + # return TuningValidationAssessmentResult( + # errors=assessment_result.tuning_validation_assessment_result.errors + # ) + class AsyncDatasets(_api_module.BaseModule):