diff --git a/agentplatform/_genai/_evals_visualization.py b/agentplatform/_genai/_evals_visualization.py index 80f6536e2d..e313a8b66a 100644 --- a/agentplatform/_genai/_evals_visualization.py +++ b/agentplatform/_genai/_evals_visualization.py @@ -23,7 +23,7 @@ from typing import Any, Optional import pandas as pd -from pydantic import errors +import pydantic_core from . import _evals_common from . import types @@ -1469,7 +1469,7 @@ def display_evaluation_result( result_dump = eval_result_obj.model_dump( mode="json", exclude_none=True, exclude={"evaluation_dataset"} ) - except errors.PydanticSerializationError as e: + except pydantic_core.PydanticSerializationError as e: logger.error( "Serialization Error: %s\nCould not display the evaluation " "result due to a data serialization issue. Please check the " diff --git a/tests/unit/agentplatform/genai/test_evals.py b/tests/unit/agentplatform/genai/test_evals.py index 492d9cb429..d8acce2b12 100644 --- a/tests/unit/agentplatform/genai/test_evals.py +++ b/tests/unit/agentplatform/genai/test_evals.py @@ -45,11 +45,15 @@ types as agentplatform_genai_types, ) from agentplatform._genai.types import common as common_types +from vertexai._genai import ( + _evals_visualization as vertexai_evals_visualization, +) from google.genai import client from google.genai import errors as genai_errors from google.genai import types as genai_types import pandas as pd import pydantic +import pydantic_core import pytest _TEST_PROJECT = "test-project" @@ -824,10 +828,6 @@ def test_get_comparison_html(self): assert "DOMPurify" in html def test_get_comparison_html_shows_na_for_missing_summary_scores(self): - from vertexai._genai import ( - _evals_visualization as vertexai_evals_visualization, - ) - for viz in (_evals_visualization, vertexai_evals_visualization): html = viz.get_comparison_html("{}") assert "m.mean_score != null ? m.mean_score.toFixed(4) : 'N/A'" in html @@ -2448,6 +2448,31 @@ def test_display_evaluation_result_with_non_ascii_character(self, mock_is_ipytho del sys.modules["IPython"] del sys.modules["IPython.display"] + @pytest.mark.parametrize( + "visualization_module", + [_evals_visualization, vertexai_evals_visualization], + ids=["agent_platform", "vertexai"], + ) + @mock.patch.dict(sys.modules, {"IPython": mock.MagicMock()}) + def test_display_evaluation_result_logs_serialization_error( + self, visualization_module + ): + eval_result = mock.Mock() + eval_result.model_dump.side_effect = pydantic_core.PydanticSerializationError( + "bad value" + ) + + with ( + mock.patch.object( + visualization_module, "_is_ipython_env", return_value=True + ), + mock.patch.object(visualization_module, "logger") as mock_logger, + ): + visualization_module.display_evaluation_result(eval_result) + + mock_logger.error.assert_called_once() + assert "Serialization Error" in mock_logger.error.call_args[0][0] + class TestEvalsRunInference: """Unit tests for the Evals run_inference method.""" diff --git a/vertexai/_genai/_evals_visualization.py b/vertexai/_genai/_evals_visualization.py index bedc57bb6c..07252afb87 100644 --- a/vertexai/_genai/_evals_visualization.py +++ b/vertexai/_genai/_evals_visualization.py @@ -23,7 +23,7 @@ from typing import Any, Optional import pandas as pd -from pydantic import errors +import pydantic_core from . import types @@ -1425,7 +1425,7 @@ def display_evaluation_result( result_dump = eval_result_obj.model_dump( mode="json", exclude_none=True, exclude={"evaluation_dataset"} ) - except errors.PydanticSerializationError as e: + except pydantic_core.PydanticSerializationError as e: logger.error( "Serialization Error: %s\nCould not display the evaluation " "result due to a data serialization issue. Please check the "