@@ -5913,12 +5913,16 @@ def my_plain_tool(query: str) -> str:
59135913
59145914 assert len (agent_info .agents ["mock_agent" ].tools ) == 2
59155915 # First tool: ADK tool with _get_declaration
5916- adk_declarations = agent_info .agents ["mock_agent" ].tools [0 ].function_declarations
5916+ adk_declarations = (
5917+ agent_info .agents ["mock_agent" ].tools [0 ].function_declarations
5918+ )
59175919 assert len (adk_declarations ) == 1
59185920 assert adk_declarations [0 ] is mock_adk_declaration
59195921 mock_adk_tool ._get_declaration .assert_called_once ()
59205922 # Second tool: plain callable converted to FunctionDeclaration
5921- plain_declarations = agent_info .agents ["mock_agent" ].tools [1 ].function_declarations
5923+ plain_declarations = (
5924+ agent_info .agents ["mock_agent" ].tools [1 ].function_declarations
5925+ )
59225926 assert len (plain_declarations ) == 1
59235927 assert isinstance (plain_declarations [0 ], genai_types .FunctionDeclaration )
59245928 assert plain_declarations [0 ].name == "my_plain_tool"
@@ -8335,7 +8339,7 @@ def custom_agg_fn_error(
83358339 with mock .patch (
83368340 "agentplatform._genai._evals_metric_handlers.LLMMetricHandler.get_metric_result"
83378341 ) as mock_llm_process :
8338- # fmt: on
8342+ # fmt: on
83398343 mock_llm_process .side_effect = [
83408344 agentplatform_genai_types .EvalCaseMetricResult (
83418345 metric_name = "error_fallback_quality" , score = 0.9
@@ -8381,7 +8385,7 @@ def custom_agg_fn_invalid_type(
83818385 with mock .patch (
83828386 "agentplatform._genai._evals_metric_handlers.LLMMetricHandler.get_metric_result"
83838387 ) as mock_llm_process :
8384- # fmt: on
8388+ # fmt: on
83858389 mock_llm_process .return_value = (
83868390 agentplatform_genai_types .EvalCaseMetricResult (
83878391 metric_name = "invalid_type_fallback" , score = 0.8
@@ -8415,7 +8419,7 @@ def test_execute_evaluation_lazy_loaded_prebuilt_metric_instance(
84158419 with mock .patch (
84168420 "agentplatform._genai.evals.Evals._evaluate_instances"
84178421 ) as mock_evaluate_instances_unified :
8418- # fmt: on
8422+ # fmt: on
84198423 mock_evaluate_instances_unified .return_value = (
84208424 agentplatform_genai_types .EvaluateInstancesResponse (
84218425 metric_results = [
@@ -8461,7 +8465,7 @@ def test_execute_evaluation_prebuilt_metric_via_loader(
84618465 with mock .patch (
84628466 "agentplatform._genai.evals.Evals._evaluate_instances"
84638467 ) as mock_evaluate_instances_unified :
8464- # fmt: on
8468+ # fmt: on
84658469 mock_evaluate_instances_unified .return_value = (
84668470 agentplatform_genai_types .EvaluateInstancesResponse (
84678471 metric_results = [
@@ -9839,3 +9843,149 @@ async def test_create_evaluation_run_async_passes_allow_cross_region_model(self)
98399843 request_body .get ("evaluationConfig" , {}).get ("allowCrossRegionModel" )
98409844 is True
98419845 )
9846+
9847+
9848+ _TEST_INTERACTION = (
9849+ "projects/test-project/locations/us-central1/interactions/test-interaction"
9850+ )
9851+ _TEST_GEMINI_AGENT = "projects/test-project/locations/us-central1/agents/test-agent"
9852+ _TEST_AGENT_ENGINE = "projects/test-project/locations/us-central1/reasoningEngines/123"
9853+
9854+
9855+ class TestIsGeminiAgentResource :
9856+ """Tests for the _is_gemini_agent_resource helper."""
9857+
9858+ def test_gemini_agent_resource_is_detected (self ):
9859+ assert _evals_common ._is_gemini_agent_resource (_TEST_GEMINI_AGENT ) is True
9860+
9861+ def test_agent_engine_resource_is_not_gemini (self ):
9862+ assert _evals_common ._is_gemini_agent_resource (_TEST_AGENT_ENGINE ) is False
9863+
9864+ def test_non_resource_string_is_not_gemini (self ):
9865+ assert _evals_common ._is_gemini_agent_resource ("test-agent" ) is False
9866+
9867+
9868+ class TestEvaluateInstancesInteractionsDataSource :
9869+ """CUJ1: BYO interaction id evaluated via evaluate_instances."""
9870+
9871+ def setup_method (self , method ):
9872+ self .mock_api_client = mock .MagicMock ()
9873+ self .mock_api_client .vertexai = True
9874+ self .mock_response = mock .MagicMock ()
9875+ self .mock_response .body = json .dumps ({})
9876+ self .mock_api_client .request .return_value = self .mock_response
9877+
9878+ def test_evaluate_instances_sends_interactions_data_source (self ):
9879+ evals_module = evals .Evals (api_client_ = self .mock_api_client )
9880+
9881+ instance = agentplatform_genai_types .EvaluationInstance (
9882+ interactions_data_source = agentplatform_genai_types .InteractionsDataSource (
9883+ interaction = _TEST_INTERACTION ,
9884+ gemini_agent_config = agentplatform_genai_types .GeminiAgentConfig (
9885+ gemini_agent = _TEST_GEMINI_AGENT ,
9886+ ),
9887+ )
9888+ )
9889+ metric_config = agentplatform_genai_types ._EvaluateInstancesRequestParameters (
9890+ metrics = [
9891+ agentplatform_genai_types .Metric (name = "multi_turn_task_success_v1" )
9892+ ],
9893+ instance = instance ,
9894+ )
9895+
9896+ evals_module .evaluate_instances (metric_config = metric_config )
9897+
9898+ self .mock_api_client .request .assert_called_once ()
9899+ call_args = self .mock_api_client .request .call_args
9900+ path = call_args [0 ][1 ]
9901+ request_body = call_args [0 ][2 ]
9902+ assert path .endswith (":evaluateInstances" )
9903+ data_source = request_body ["instance" ]["interactionsDataSource" ]
9904+ assert data_source ["interaction" ] == _TEST_INTERACTION
9905+ assert data_source ["gemini_agent_config" ]["gemini_agent" ] == _TEST_GEMINI_AGENT
9906+
9907+
9908+ class TestCreateEvaluationRunGeminiAgent :
9909+ """CUJ2: scrape a Gemini agent via create_evaluation_run."""
9910+
9911+ def setup_method (self , method ):
9912+ self .mock_api_client = mock .MagicMock ()
9913+ self .mock_api_client .vertexai = True
9914+ self .mock_response = mock .MagicMock ()
9915+ self .mock_response .body = json .dumps (
9916+ {
9917+ "name" : "projects/123/locations/us-central1/evaluationRuns/456" ,
9918+ "displayName" : "test_run" ,
9919+ "state" : "PENDING" ,
9920+ }
9921+ )
9922+ self .mock_api_client .request .return_value = self .mock_response
9923+
9924+ def _get_create_run_body (self ):
9925+ for call_args in self .mock_api_client .request .call_args_list :
9926+ method , path = call_args [0 ][0 ], call_args [0 ][1 ]
9927+ if method == "post" and path == "evaluationRuns" :
9928+ return call_args [0 ][2 ]
9929+ raise AssertionError ("evaluationRuns create call was not made" )
9930+
9931+ def _agent_run_config (self , request_body ):
9932+ inference_configs = request_body ["inferenceConfigs" ]
9933+ candidate = next (iter (inference_configs .values ()))
9934+ return candidate ["agentRunConfig" ]
9935+
9936+ def test_create_evaluation_run_builds_gemini_agent_config (self ):
9937+ evals_module = evals .Evals (api_client_ = self .mock_api_client )
9938+
9939+ evals_module .create_evaluation_run (
9940+ dataset = agentplatform_genai_types .EvaluationRunDataSource (
9941+ evaluation_set = "projects/123/locations/us-central1/evaluationSets/789"
9942+ ),
9943+ metrics = [
9944+ agentplatform_genai_types .EvaluationRunMetric (
9945+ metric = "multi_turn_task_success_v1" ,
9946+ metric_config = agentplatform_genai_types .UnifiedMetric (
9947+ predefined_metric_spec = genai_types .PredefinedMetricSpec (
9948+ metric_spec_name = "multi_turn_task_success_v1" ,
9949+ )
9950+ ),
9951+ )
9952+ ],
9953+ dest = "gs://test-bucket/output" ,
9954+ agent_info = agentplatform_genai_types .evals .AgentInfo (name = "gemini-agent" ),
9955+ agent = _TEST_GEMINI_AGENT ,
9956+ )
9957+
9958+ request_body = self ._get_create_run_body ()
9959+ agent_run_config = self ._agent_run_config (request_body )
9960+ assert (
9961+ agent_run_config ["gemini_agent_config" ]["gemini_agent" ]
9962+ == _TEST_GEMINI_AGENT
9963+ )
9964+ assert "agent_engine" not in agent_run_config
9965+
9966+ def test_create_evaluation_run_agent_engine_does_not_set_gemini (self ):
9967+ evals_module = evals .Evals (api_client_ = self .mock_api_client )
9968+
9969+ evals_module .create_evaluation_run (
9970+ dataset = agentplatform_genai_types .EvaluationRunDataSource (
9971+ evaluation_set = "projects/123/locations/us-central1/evaluationSets/789"
9972+ ),
9973+ metrics = [
9974+ agentplatform_genai_types .EvaluationRunMetric (
9975+ metric = "multi_turn_task_success_v1" ,
9976+ metric_config = agentplatform_genai_types .UnifiedMetric (
9977+ predefined_metric_spec = genai_types .PredefinedMetricSpec (
9978+ metric_spec_name = "multi_turn_task_success_v1" ,
9979+ )
9980+ ),
9981+ )
9982+ ],
9983+ dest = "gs://test-bucket/output" ,
9984+ agent_info = agentplatform_genai_types .evals .AgentInfo (name = "ae-agent" ),
9985+ agent = _TEST_AGENT_ENGINE ,
9986+ )
9987+
9988+ request_body = self ._get_create_run_body ()
9989+ agent_run_config = self ._agent_run_config (request_body )
9990+ assert "gemini_agent_config" not in agent_run_config
9991+ assert agent_run_config ["agent_engine" ] == _TEST_AGENT_ENGINE
0 commit comments