@@ -3144,6 +3144,94 @@ def test_run_inference_with_agent_engine_with_response_column_raises_error(
31443144 "'intermediate_events' or 'response' columns"
31453145 ) in str (excinfo .value )
31463146
3147+ @mock .patch .object (_evals_utils , "EvalDatasetLoader" )
3148+ @mock .patch ("vertexai._genai._evals_common.vertexai.Client" )
3149+ def test_run_inference_with_agent_engine_falls_back_to_managed_sessions_api (
3150+ self ,
3151+ mock_vertexai_client ,
3152+ mock_eval_dataset_loader ,
3153+ ):
3154+ """Tests that run_inference falls back to the managed Sessions API
3155+ when the agent engine does not have create_session registered."""
3156+ mock_df = pd .DataFrame (
3157+ {
3158+ "prompt" : ["agent prompt" ],
3159+ "session_inputs" : [
3160+ {
3161+ "user_id" : "123" ,
3162+ "state" : {"a" : "1" },
3163+ }
3164+ ],
3165+ }
3166+ )
3167+ mock_eval_dataset_loader .return_value .load .return_value = mock_df .to_dict (
3168+ orient = "records"
3169+ )
3170+
3171+ # Create a mock agent engine WITHOUT create_session (simulates agents
3172+ # deployed via Console, gcloud, or source code deployment).
3173+ mock_agent_engine = mock .Mock (
3174+ spec = ["api_client" , "api_resource" , "stream_query" ],
3175+ )
3176+ mock_agent_engine .api_resource .name = (
3177+ "projects/test-project/locations/us-central1/reasoningEngines/123"
3178+ )
3179+
3180+ # Mock the managed Sessions API to return a session.
3181+ mock_session_operation = mock .Mock ()
3182+ mock_session_operation .response .name = (
3183+ "projects/test-project/locations/us-central1"
3184+ "/reasoningEngines/123/sessions/managed-session-1"
3185+ )
3186+ mock_agent_engine .api_client .sessions .create .return_value = (
3187+ mock_session_operation
3188+ )
3189+
3190+ stream_query_return_value = [
3191+ {
3192+ "id" : "1" ,
3193+ "content" : {"parts" : [{"text" : "intermediate1" }]},
3194+ "timestamp" : 123 ,
3195+ "author" : "model" ,
3196+ },
3197+ {
3198+ "id" : "2" ,
3199+ "content" : {"parts" : [{"text" : "agent response" }]},
3200+ "timestamp" : 124 ,
3201+ "author" : "model" ,
3202+ },
3203+ ]
3204+ mock_agent_engine .stream_query .return_value = iter (stream_query_return_value )
3205+ mock_vertexai_client .return_value .agent_engines .get .return_value = (
3206+ mock_agent_engine
3207+ )
3208+
3209+ inference_result = self .client .evals .run_inference (
3210+ agent = "projects/test-project/locations/us-central1/reasoningEngines/123" ,
3211+ src = mock_df ,
3212+ )
3213+
3214+ # Verify the managed Sessions API was called as fallback.
3215+ mock_agent_engine .api_client .sessions .create .assert_called_once_with (
3216+ name = "projects/test-project/locations/us-central1/reasoningEngines/123" ,
3217+ user_id = "123" ,
3218+ config = vertexai_genai_types .CreateAgentEngineSessionConfig (
3219+ session_state = {"a" : "1" },
3220+ ),
3221+ )
3222+
3223+ # Verify stream_query was called with the session ID extracted from
3224+ # the managed session's resource name.
3225+ mock_agent_engine .stream_query .assert_called_once_with (
3226+ user_id = "123" ,
3227+ session_id = "managed-session-1" ,
3228+ message = "agent prompt" ,
3229+ )
3230+
3231+ # Verify the inference results are correct.
3232+ assert inference_result .eval_dataset_df ["response" ].iloc [0 ] == "agent response"
3233+ assert inference_result .candidate_name == "agent_engine_0"
3234+
31473235 @mock .patch .object (_evals_utils , "EvalDatasetLoader" )
31483236 @mock .patch ("vertexai._genai._evals_common.InMemorySessionService" ) # fmt: skip
31493237 @mock .patch ("vertexai._genai._evals_common.Runner" )
0 commit comments