Skip to content

Commit 705e88f

Browse files
sararobcopybara-github
authored andcommitted
chore: GenAI SDK client - introduce subnamespaces for types
PiperOrigin-RevId: 818740807
1 parent 9d1cd6e commit 705e88f

11 files changed

Lines changed: 2538 additions & 668 deletions

File tree

tests/unit/vertexai/genai/replays/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from google.genai import _replay_api_client
2727
from google.genai import client as google_genai_client_module
2828
from vertexai._genai import _evals_utils
29+
from vertexai._genai import _gcs_utils
2930
from vertexai._genai import prompt_optimizer
3031
import pytest
3132

@@ -240,7 +241,7 @@ def client(use_vertex, replays_prefix, http_options, request):
240241
mock_bigquery_client.return_value = mock.MagicMock()
241242

242243
with mock.patch.object(
243-
_evals_utils.GcsUtils, "read_file_contents"
244+
_gcs_utils.GcsUtils, "read_file_contents"
244245
) as mock_read_file_contents:
245246
mock_read_file_contents.side_effect = (
246247
_mock_read_file_contents_side_effect

tests/unit/vertexai/genai/test_evals.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040

4141
_evals_common = _genai.evals._evals_common
4242
_evals_utils = _genai._evals_utils
43+
_gcs_utils = _genai._gcs_utils
44+
_evals_metric_loaders = _genai._evals_metric_loaders
4345

4446
pytestmark = pytest.mark.usefixtures("google_auth_mock")
4547

@@ -74,9 +76,9 @@ def mock_eval_dependencies(mock_api_client_fixture):
7476
) as mock_bq_client, mock.patch(
7577
"vertexai._genai.evals.Evals.evaluate_instances"
7678
) as mock_evaluate_instances, mock.patch(
77-
"vertexai._genai._evals_utils.GcsUtils.upload_json_to_prefix"
79+
"vertexai._genai._gcs_utils.GcsUtils.upload_json_to_prefix"
7880
) as mock_upload_to_gcs, mock.patch(
79-
"vertexai._genai._evals_utils.LazyLoadedPrebuiltMetric._fetch_and_parse"
81+
"vertexai._genai._evals_metric_loaders.LazyLoadedPrebuiltMetric._fetch_and_parse"
8082
) as mock_fetch_prebuilt_metric:
8183

8284
def mock_evaluate_instances_side_effect(*args, **kwargs):
@@ -181,6 +183,8 @@ def setup_method(self):
181183
importlib.reload(_evals_common)
182184
importlib.reload(_evals_metric_handlers)
183185
importlib.reload(_genai.evals)
186+
importlib.reload(_evals_metric_loaders)
187+
importlib.reload(_gcs_utils)
184188

185189
vertexai.init(
186190
project=_TEST_PROJECT,
@@ -189,7 +193,7 @@ def setup_method(self):
189193
self.client = vertexai.Client(project=_TEST_PROJECT, location=_TEST_LOCATION)
190194

191195
@mock.patch.object(_evals_common, "Models")
192-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
196+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
193197
def test_inference_with_string_model_success(
194198
self, mock_eval_dataset_loader, mock_models
195199
):
@@ -232,7 +236,7 @@ def test_inference_with_string_model_success(
232236
assert inference_result.candidate_name == "gemini-pro"
233237
assert inference_result.gcs_source is None
234238

235-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
239+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
236240
def test_inference_with_callable_model_sets_candidate_name(
237241
self, mock_eval_dataset_loader
238242
):
@@ -251,7 +255,7 @@ def my_model_fn(contents):
251255
assert inference_result.candidate_name == "my_model_fn"
252256
assert inference_result.gcs_source is None
253257

254-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
258+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
255259
def test_inference_with_lambda_model_candidate_name_is_none(
256260
self, mock_eval_dataset_loader
257261
):
@@ -273,7 +277,7 @@ def test_inference_with_lambda_model_candidate_name_is_none(
273277
)
274278
assert inference_result.gcs_source is None
275279

276-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
280+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
277281
def test_inference_with_callable_model_success(self, mock_eval_dataset_loader):
278282
mock_df = pd.DataFrame({"prompt": ["test prompt"]})
279283
mock_eval_dataset_loader.return_value.load.return_value = mock_df.to_dict(
@@ -301,7 +305,7 @@ def mock_model_fn(contents):
301305
assert inference_result.gcs_source is None
302306

303307
@mock.patch.object(_evals_common, "Models")
304-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
308+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
305309
def test_inference_with_prompt_template(
306310
self, mock_eval_dataset_loader, mock_models
307311
):
@@ -348,8 +352,8 @@ def test_inference_with_prompt_template(
348352
assert inference_result.gcs_source is None
349353

350354
@mock.patch.object(_evals_common, "Models")
351-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
352-
@mock.patch.object(_evals_utils, "GcsUtils")
355+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
356+
@mock.patch.object(_gcs_utils, "GcsUtils")
353357
def test_inference_with_gcs_destination(
354358
self, mock_gcs_utils, mock_eval_dataset_loader, mock_models
355359
):
@@ -402,7 +406,7 @@ def test_inference_with_gcs_destination(
402406
)
403407

404408
@mock.patch.object(_evals_common, "Models")
405-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
409+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
406410
@mock.patch("pandas.DataFrame.to_json")
407411
@mock.patch("os.makedirs")
408412
def test_inference_with_local_destination(
@@ -454,7 +458,7 @@ def test_inference_with_local_destination(
454458
assert inference_result.gcs_source is None
455459

456460
@mock.patch.object(_evals_common, "Models")
457-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
461+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
458462
def test_inference_from_request_column_save_to_local_dir(
459463
self, mock_eval_dataset_loader, mock_models
460464
):
@@ -688,7 +692,7 @@ def test_inference_from_local_csv_file(self, mock_models):
688692
assert inference_result.gcs_source is None
689693

690694
@mock.patch.object(_evals_common, "Models")
691-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
695+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
692696
def test_inference_with_row_level_config_overrides(
693697
self, mock_eval_dataset_loader, mock_models
694698
):
@@ -873,7 +877,7 @@ def mock_generate_content_logic(*args, **kwargs):
873877
assert inference_result.gcs_source is None
874878

875879
@mock.patch.object(_evals_common, "Models")
876-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
880+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
877881
def test_inference_with_multimodal_content(
878882
self, mock_eval_dataset_loader, mock_models
879883
):
@@ -1107,7 +1111,7 @@ def test_run_inference_with_litellm_import_error(self, mock_api_client_fixture):
11071111
@mock.patch.object(_evals_common, "_is_gemini_model")
11081112
@mock.patch.object(_evals_common, "_is_litellm_model")
11091113
@mock.patch.object(_evals_common, "_is_litellm_vertex_maas_model")
1110-
@mock.patch.object(_evals_utils, "EvalDatasetLoader")
1114+
@mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader")
11111115
def test_run_inference_with_litellm_parsing(
11121116
self,
11131117
mock_eval_dataset_loader,
@@ -3641,7 +3645,7 @@ def test_execute_evaluation_with_openai_schema(
36413645
name="test_metric", prompt_template="Evaluate: {response}"
36423646
)
36433647

3644-
with mock.patch.object(_evals_utils, "EvalDatasetLoader") as mock_loader_class:
3648+
with mock.patch.object(_evals_metric_loaders, "EvalDatasetLoader") as mock_loader_class:
36453649
mock_loader_instance = mock_loader_class.return_value
36463650
mock_loader_instance.load.return_value = mock_openai_raw_data
36473651

@@ -3894,7 +3898,7 @@ def test_execute_evaluation_lazy_loaded_prebuilt_metric_instance(
38943898
eval_dataset_df=dataset_df
38953899
)
38963900

3897-
lazy_metric_instance = _evals_utils.LazyLoadedPrebuiltMetric(
3901+
lazy_metric_instance = _evals_metric_loaders.LazyLoadedPrebuiltMetric(
38983902
name="fluency", version="v1"
38993903
)
39003904

@@ -4094,7 +4098,7 @@ def test_execute_evaluation_adds_creation_timestamp(
40944098
class TestEvaluationDataset:
40954099
"""Contains set of tests for the EvaluationDataset class methods."""
40964100

4097-
@mock.patch.object(_evals_utils, "GcsUtils")
4101+
@mock.patch.object(_gcs_utils, "GcsUtils")
40984102
def test_load_from_observability_eval_cases(self, mock_gcs_utils):
40994103
"""Tests that load_from_observability_eval_cases reads data from GCS."""
41004104

@@ -4146,7 +4150,7 @@ def read_file_contents_side_effect(src: str) -> str:
41464150
),
41474151
)
41484152

4149-
@mock.patch.object(_evals_utils, "GcsUtils")
4153+
@mock.patch.object(_gcs_utils, "GcsUtils")
41504154
def test_load_from_observability_eval_cases_no_system_instruction(
41514155
self, mock_gcs_utils
41524156
):
@@ -4198,7 +4202,7 @@ def read_file_contents_side_effect(src: str) -> str:
41984202
),
41994203
)
42004204

4201-
@mock.patch.object(_evals_utils, "GcsUtils")
4205+
@mock.patch.object(_gcs_utils, "GcsUtils")
42024206
def test_load_from_observability_eval_cases_multiple_cases(self, mock_gcs_utils):
42034207
"""Test load_from_observability_eval_cases can handle multiple cases."""
42044208

vertexai/_genai/_evals_common.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
from . import _evals_data_converters
3434
from . import _evals_metric_handlers
3535
from . import _evals_utils
36+
from . import _evals_metric_loaders
37+
from . import _gcs_utils
3638
from . import evals
3739
from . import types
3840

@@ -627,7 +629,7 @@ def _load_dataframe(
627629
"""Loads and prepares the prompt dataset for inference."""
628630
logger.info("Loading prompt dataset from: %s", src)
629631
try:
630-
loader = _evals_utils.EvalDatasetLoader(api_client=api_client)
632+
loader = _evals_metric_loaders.EvalDatasetLoader(api_client=api_client)
631633
dataset_list_of_dicts = loader.load(src)
632634
if not dataset_list_of_dicts:
633635
raise ValueError("Prompt dataset 'prompt_dataset' must not be empty.")
@@ -753,7 +755,7 @@ def _get_dataset_source(
753755
def _resolve_dataset_inputs(
754756
dataset: list[types.EvaluationDataset],
755757
dataset_schema: Optional[Literal["GEMINI", "FLATTEN", "OPENAI"]],
756-
loader: "_evals_utils.EvalDatasetLoader",
758+
loader: "_evals_metric_loaders.EvalDatasetLoader",
757759
) -> tuple[types.EvaluationDataset, int]:
758760
"""Loads and processes single or multiple datasets for evaluation.
759761
@@ -830,7 +832,7 @@ def _resolve_metrics(
830832
"""Resolves a list of metric instances, loading RubricMetric if necessary."""
831833
resolved_metrics_list = []
832834
for metric_instance in metrics:
833-
if isinstance(metric_instance, _evals_utils.LazyLoadedPrebuiltMetric):
835+
if isinstance(metric_instance, _evals_metric_loaders.LazyLoadedPrebuiltMetric):
834836
try:
835837
resolved_metrics_list.append(
836838
metric_instance.resolve(api_client=api_client)
@@ -923,7 +925,7 @@ def _execute_evaluation(
923925
else:
924926
deduped_candidate_names.append(name)
925927

926-
loader = _evals_utils.EvalDatasetLoader(api_client=api_client)
928+
loader = _evals_metric_loaders.EvalDatasetLoader(api_client=api_client)
927929
processed_eval_dataset, num_response_candidates = _resolve_dataset_inputs(
928930
dataset=dataset_list, dataset_schema=dataset_schema, loader=loader
929931
)
@@ -983,7 +985,7 @@ def _convert_gcs_to_evaluation_item_result(
983985
) -> types.EvaluationItemResult:
984986
"""Converts a json file to an EvaluationItemResult."""
985987
logger.info("Loading evaluation item result from GCS: %s", gcs_uri)
986-
gcs_utils = _evals_utils.GcsUtils(api_client=api_client)
988+
gcs_utils = _gcs_utils.GcsUtils(api_client=api_client)
987989
try:
988990
eval_item_data = json.loads(gcs_utils.read_file_contents(gcs_uri))
989991
return types.EvaluationItemResult(**eval_item_data)
@@ -1000,7 +1002,7 @@ def _convert_gcs_to_evaluation_item_request(
10001002
) -> types.EvaluationItemRequest:
10011003
"""Converts a json file to an EvaluationItemRequest."""
10021004
logger.info("Loading evaluation item request from GCS: %s", gcs_uri)
1003-
gcs_utils = _evals_utils.GcsUtils(api_client=api_client)
1005+
gcs_utils = _gcs_utils.GcsUtils(api_client=api_client)
10041006
try:
10051007
eval_item_data = json.loads(gcs_utils.read_file_contents(gcs_uri))
10061008
return types.EvaluationItemRequest(**eval_item_data)

0 commit comments

Comments
 (0)