1414#
1515
1616"""Transformers module for Vertex addons."""
17+ import re
1718from typing import Any
1819
1920from google .genai ._common import get_value_by_path as getv
2021
2122from . import _evals_constant
2223from . import types
2324
25+ _METRIC_RES_NAME_RE = r"^projects/[^/]+/locations/[^/]+/evaluationMetrics/[^/]+$"
26+
2427
2528def t_metrics (
2629 metrics : list ["types.MetricSubclass" ],
@@ -38,10 +41,9 @@ def t_metrics(
3841
3942 for metric in metrics :
4043 metric_payload_item : dict [str , Any ] = {}
41- if hasattr (metric , "metric_resource_name" ) and metric .metric_resource_name :
42- metric_payload_item ["metric_resource_name" ] = metric .metric_resource_name
4344
44- metric_name = getv (metric , ["name" ]).lower ()
45+ metric_id = getv (metric , ["metric" ]) or getv (metric , ["name" ])
46+ metric_name = metric_id .lower () if metric_id else None
4547
4648 if set_default_aggregation_metrics :
4749 metric_payload_item ["aggregation_metrics" ] = [
@@ -53,11 +55,13 @@ def t_metrics(
5355 metric_payload_item ["exact_match_spec" ] = {}
5456 elif metric_name == "bleu" :
5557 metric_payload_item ["bleu_spec" ] = {}
56- elif metric_name .startswith ("rouge" ):
58+ elif metric_name and metric_name .startswith ("rouge" ):
5759 rouge_type = metric_name .replace ("_" , "" )
5860 metric_payload_item ["rouge_spec" ] = {"rouge_type" : rouge_type }
5961 # API Pre-defined metrics
60- elif metric_name in _evals_constant .SUPPORTED_PREDEFINED_METRICS :
62+ elif (
63+ metric_name and metric_name in _evals_constant .SUPPORTED_PREDEFINED_METRICS
64+ ):
6165 metric_payload_item ["predefined_metric_spec" ] = {
6266 "metric_spec_name" : metric_name ,
6367 "metric_spec_parameters" : metric .metric_spec_parameters ,
@@ -81,12 +85,38 @@ def t_metrics(
8185 "return_raw_output" : return_raw_output
8286 }
8387 metric_payload_item ["pointwise_metric_spec" ] = pointwise_spec
84- elif "metric_resource_name" in metric_payload_item :
85- # Valid case: Metric is identified by resource name; no inline spec required.
88+ elif getattr ( metric , "metric_resource_name" , None ) is not None :
89+ # Safe pass
8690 pass
8791 else :
8892 raise ValueError (
8993 f"Unsupported metric type or invalid metric name: { metric_name } "
9094 )
9195 metrics_payload .append (metric_payload_item )
9296 return metrics_payload
97+
98+
99+ def t_metric_sources (metrics : list [Any ]) -> list [dict [str , Any ]]:
100+ """Prepares the MetricSource payload."""
101+ sources_payload = []
102+ for metric in metrics :
103+ resource_name = getattr (metric , "metric_resource_name" , None )
104+ if (
105+ not resource_name
106+ and isinstance (metric , str )
107+ and re .match (_METRIC_RES_NAME_RE , metric )
108+ ):
109+ resource_name = metric
110+
111+ if resource_name :
112+ sources_payload .append ({"metric_resource_name" : resource_name })
113+ else :
114+ if hasattr (metric , "metric" ) and not isinstance (metric , str ):
115+ metric = metric .metric
116+
117+ if not hasattr (metric , "name" ):
118+ metric = types .Metric (name = str (metric ))
119+
120+ metric_payload = t_metrics ([metric ])[0 ]
121+ sources_payload .append ({"metric" : metric_payload })
122+ return sources_payload
0 commit comments