From a7acc971ca41bd4816e77662b135fb76387a5190 Mon Sep 17 00:00:00 2001 From: A Vertex SDK engineer Date: Thu, 23 Apr 2026 17:53:36 -0700 Subject: [PATCH] feat: Add filter and order_by support to list_evaluation_metrics PiperOrigin-RevId: 904723882 --- .../genai/replays/test_evaluation_metric.py | 12 +++ vertexai/_genai/evals.py | 89 ++++++++++++++++++- vertexai/_genai/types/common.py | 32 +++++++ 3 files changed, 130 insertions(+), 3 deletions(-) diff --git a/tests/unit/vertexai/genai/replays/test_evaluation_metric.py b/tests/unit/vertexai/genai/replays/test_evaluation_metric.py index 24ac8e181c..b456c184ca 100644 --- a/tests/unit/vertexai/genai/replays/test_evaluation_metric.py +++ b/tests/unit/vertexai/genai/replays/test_evaluation_metric.py @@ -57,6 +57,18 @@ def test_list_evaluation_metrics(client): assert len(response.evaluation_metrics) >= 0 +def test_list_evaluation_metrics_with_filter(client): + client._api_client._http_options.api_version = "v1beta1" + response = client.evals.list_evaluation_metrics( + filter='display_name="tone-check-v1"', + order_by="create_time desc", + ) + assert isinstance(response, types.ListEvaluationMetricsResponse) + assert len(response.evaluation_metrics) >= 1 + for metric in response.evaluation_metrics: + assert metric.display_name == "tone-check-v1" + + # The setup function registers the module and method for the recorder pytestmark = pytest_helper.setup( file=__file__, diff --git a/vertexai/_genai/evals.py b/vertexai/_genai/evals.py index 53833b6a67..ff7af8e7f5 100644 --- a/vertexai/_genai/evals.py +++ b/vertexai/_genai/evals.py @@ -746,13 +746,40 @@ def _GetEvaluationSetParameters_to_vertex( return to_object +def _ListEvaluationMetricsConfig_to_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + + if getv(from_object, ["page_size"]) is not None: + setv(parent_object, ["_query", "pageSize"], getv(from_object, ["page_size"])) + + if getv(from_object, ["page_token"]) is not None: + setv(parent_object, ["_query", "pageToken"], getv(from_object, ["page_token"])) + + if getv(from_object, ["filter"]) is not None: + setv(parent_object, ["_query", "filter"], getv(from_object, ["filter"])) + + if getv(from_object, ["order_by"]) is not None: + setv(parent_object, ["_query", "orderBy"], getv(from_object, ["order_by"])) + + return to_object + + def _ListEvaluationMetricsParameters_to_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, ) -> dict[str, Any]: to_object: dict[str, Any] = {} if getv(from_object, ["config"]) is not None: - setv(to_object, ["config"], getv(from_object, ["config"])) + setv( + to_object, + ["config"], + _ListEvaluationMetricsConfig_to_vertex( + getv(from_object, ["config"]), to_object + ), + ) return to_object @@ -2990,9 +3017,37 @@ def get_evaluation_metric( def list_evaluation_metrics( self, *, + filter: Optional[str] = None, + order_by: Optional[str] = None, config: Optional[types.ListEvaluationMetricsConfigOrDict] = None, ) -> types.ListEvaluationMetricsResponse: - """Lists EvaluationMetrics.""" + """Lists EvaluationMetrics. + + Args: + filter: An expression for filtering the results of the request. For + field names both snake_case and camelCase are supported. For more + information about filter syntax, see + `AIP-160 `_. + Example: ``'display_name="my_metric"'``. + order_by: A comma-separated list of fields to order by, sorted in + ascending order by default. Use ``desc`` after a field name for + descending. Example: ``"create_time desc"``. + config: Optional configuration for the list operation, including + pagination (``page_size``, ``page_token``), ``filter``, and + ``order_by``. Top-level ``filter`` and ``order_by`` arguments + take precedence over values set in ``config``. + + Returns: + The list evaluation metrics response. + """ + if config is None: + config = types.ListEvaluationMetricsConfig() + if isinstance(config, dict): + config = types.ListEvaluationMetricsConfig.model_validate(config) + if filter is not None: + config.filter = filter + if order_by is not None: + config.order_by = order_by return self._list_evaluation_metrics( config=config, ) @@ -4729,9 +4784,37 @@ async def get_evaluation_metric( async def list_evaluation_metrics( self, *, + filter: Optional[str] = None, + order_by: Optional[str] = None, config: Optional[types.ListEvaluationMetricsConfigOrDict] = None, ) -> types.ListEvaluationMetricsResponse: - """Lists EvaluationMetrics.""" + """Lists EvaluationMetrics. + + Args: + filter: An expression for filtering the results of the request. For + field names both snake_case and camelCase are supported. For more + information about filter syntax, see + `AIP-160 `_. + Example: ``'display_name="my_metric"'``. + order_by: A comma-separated list of fields to order by, sorted in + ascending order by default. Use ``desc`` after a field name for + descending. Example: ``"create_time desc"``. + config: Optional configuration for the list operation, including + pagination (``page_size``, ``page_token``), ``filter``, and + ``order_by``. Top-level ``filter`` and ``order_by`` arguments + take precedence over values set in ``config``. + + Returns: + The list evaluation metrics response. + """ + if config is None: + config = types.ListEvaluationMetricsConfig() + if isinstance(config, dict): + config = types.ListEvaluationMetricsConfig.model_validate(config) + if filter is not None: + config.filter = filter + if order_by is not None: + config.order_by = order_by return await self._list_evaluation_metrics( config=config, ) diff --git a/vertexai/_genai/types/common.py b/vertexai/_genai/types/common.py index f3cae0631e..126eeec663 100644 --- a/vertexai/_genai/types/common.py +++ b/vertexai/_genai/types/common.py @@ -5476,6 +5476,21 @@ class ListEvaluationMetricsConfig(_common.BaseModel): http_options: Optional[genai_types.HttpOptions] = Field( default=None, description="""Used to override HTTP request options.""" ) + page_size: Optional[int] = Field(default=None, description="""""") + page_token: Optional[str] = Field(default=None, description="""""") + filter: Optional[str] = Field( + default=None, + description="""An expression for filtering the results of the request. + For field names both snake_case and camelCase are supported. + For more information about filter syntax, see + `AIP-160 `_.""", + ) + order_by: Optional[str] = Field( + default=None, + description="""A comma-separated list of fields to order by, sorted in ascending + order by default. Use ``desc`` after a field name for descending. + Example: ``"create_time desc"``.""", + ) class ListEvaluationMetricsConfigDict(TypedDict, total=False): @@ -5484,6 +5499,23 @@ class ListEvaluationMetricsConfigDict(TypedDict, total=False): http_options: Optional[genai_types.HttpOptionsDict] """Used to override HTTP request options.""" + page_size: Optional[int] + """""" + + page_token: Optional[str] + """""" + + filter: Optional[str] + """An expression for filtering the results of the request. + For field names both snake_case and camelCase are supported. + For more information about filter syntax, see + `AIP-160 `_.""" + + order_by: Optional[str] + """A comma-separated list of fields to order by, sorted in ascending + order by default. Use ``desc`` after a field name for descending. + Example: ``"create_time desc"``.""" + ListEvaluationMetricsConfigOrDict = Union[ ListEvaluationMetricsConfig, ListEvaluationMetricsConfigDict