@@ -575,6 +575,80 @@ def _is_gemini_agent_resource(agent: str) -> bool:
575575 )
576576
577577
578+ def _get_resolved_location (api_client : Any ) -> Optional [str ]:
579+ """Returns the location configured on the API client."""
580+ return getattr (api_client , "location" , None )
581+
582+
583+ def _normalize_interaction_resource (
584+ interaction : str , agent : str , location : Optional [str ]
585+ ) -> str :
586+ """Normalizes an interaction id into a full resource name.
587+
588+ A bare interaction id is expanded to
589+ `projects/{project}/locations/{location}/interactions/{id}` using the
590+ project and location parsed from the agent resource name. Fully-qualified
591+ interaction resource names are returned unchanged.
592+ """
593+ if interaction .startswith ("projects/" ):
594+ return interaction
595+ parts = agent .split ("/" )
596+ project = parts [1 ]
597+ agent_location = parts [3 ] if len (parts ) > 3 else (location or "global" )
598+ return f"projects/{ project } /locations/{ agent_location } /interactions/{ interaction } "
599+
600+
601+ def _build_interaction_id_dataset (
602+ loaded_data : list [dict [str , Any ]],
603+ agent : Optional [str ],
604+ location : Optional [str ],
605+ ) -> Optional [types .EvaluationDataset ]:
606+ """Builds an EvaluationDataset from rows that carry an `interaction_id`.
607+
608+ When the dataset contains an `interaction_id` column, each row is turned
609+ into an EvalCase whose `interactions_data_source` references the interaction
610+ and the Gemini agent. The backend resolves the interaction trace and agent
611+ config; no client-side prompt/response is required. Returns None if the
612+ data does not contain interaction ids.
613+ """
614+ if not loaded_data or not any (
615+ _evals_constant .INTERACTION_ID in row for row in loaded_data
616+ ):
617+ return None
618+
619+ if not agent :
620+ raise ValueError (
621+ "An `agent` resource name is required when the dataset contains an"
622+ " `interaction_id` column, so the backend can resolve the Agent"
623+ " config for each interaction."
624+ )
625+ if not _is_gemini_agent_resource (agent ):
626+ raise ValueError (
627+ "`agent` must be a Gemini Agents API resource name of the form"
628+ " projects/{project}/locations/{location}/agents/{agent} when"
629+ " evaluating interaction ids. Got: %s" % agent
630+ )
631+
632+ gemini_agent_config = types .GeminiAgentConfig (gemini_agent = agent )
633+ eval_cases = []
634+ for i , row in enumerate (loaded_data ):
635+ interaction = row .get (_evals_constant .INTERACTION_ID )
636+ if not interaction :
637+ raise ValueError ("Missing `interaction_id` value for row %d." % i )
638+ eval_cases .append (
639+ types .EvalCase (
640+ eval_case_id = "eval_case_%s" % i ,
641+ interactions_data_source = types .InteractionsDataSource (
642+ interaction = _normalize_interaction_resource (
643+ str (interaction ), agent , location
644+ ),
645+ gemini_agent_config = gemini_agent_config ,
646+ ),
647+ )
648+ )
649+ return types .EvaluationDataset (eval_cases = eval_cases )
650+
651+
578652def _add_evaluation_run_labels (
579653 labels : Optional [dict [str , str ]] = None ,
580654 agent : Optional [str ] = None ,
@@ -1591,6 +1665,8 @@ def _resolve_dataset_inputs(
15911665 dataset_schema : Optional [Literal ["GEMINI" , "FLATTEN" , "OPENAI" ]],
15921666 loader : "_evals_utils.EvalDatasetLoader" ,
15931667 agent_info : Optional [types .evals .AgentInfo ] = None ,
1668+ agent : Optional [str ] = None ,
1669+ api_client : Any = None ,
15941670) -> tuple [types .EvaluationDataset , int ]:
15951671 """Loads and processes single or multiple datasets for evaluation.
15961672
@@ -1640,6 +1716,13 @@ def _resolve_dataset_inputs(
16401716 ds_source_for_loader = _get_dataset_source (ds_item )
16411717 current_loaded_data = loader .load (ds_source_for_loader )
16421718
1719+ interaction_dataset = _build_interaction_id_dataset (
1720+ current_loaded_data , agent , _get_resolved_location (api_client )
1721+ )
1722+ if interaction_dataset is not None :
1723+ parsed_evaluation_datasets .append (interaction_dataset )
1724+ continue
1725+
16431726 if dataset_schema :
16441727 current_schema = _evals_data_converters .EvalDatasetSchema (dataset_schema )
16451728 else :
@@ -1797,6 +1880,7 @@ def _execute_evaluation( # type: ignore[no-untyped-def]
17971880 api_client : Any ,
17981881 dataset : Union [types .EvaluationDataset , list [types .EvaluationDataset ]],
17991882 metrics : list [types .Metric ],
1883+ agent : Optional [str ] = None ,
18001884 dataset_schema : Optional [Literal ["GEMINI" , "FLATTEN" , "OPENAI" ]] = None ,
18011885 dest : Optional [str ] = None ,
18021886 location : Optional [str ] = None ,
@@ -1877,6 +1961,8 @@ def _execute_evaluation( # type: ignore[no-untyped-def]
18771961 dataset_schema = dataset_schema ,
18781962 loader = loader ,
18791963 agent_info = validated_agent_info ,
1964+ agent = agent ,
1965+ api_client = api_client ,
18801966 )
18811967
18821968 resolved_metrics = _resolve_metrics (metrics , api_client )
0 commit comments