From 96f447188741814f572590effec5f37da75db204 Mon Sep 17 00:00:00 2001 From: jordanchendev Date: Wed, 3 Jun 2026 23:40:52 +0800 Subject: [PATCH] fix(code_executors): send correct field names for sandbox input files AgentEngineSandboxCodeExecutor was sending 'contents' and 'mimeType' when the Agent Engine Sandbox API expects 'content' and 'mime_type'. This caused input files to be silently unreadable inside the sandbox, producing errors such as pandas.errors.EmptyDataError. Fixes #3690 --- .../agent_engine_sandbox_code_executor.py | 4 +- ...test_agent_engine_sandbox_code_executor.py | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py b/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py index c9215d3c86..7bdbf3664d 100644 --- a/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py +++ b/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py @@ -180,8 +180,8 @@ def execute_code( input_data['files'] = [ { 'name': f.name, - 'contents': f.content, - 'mimeType': f.mime_type, + 'content': f.content, + 'mime_type': f.mime_type, } for f in code_execution_input.input_files ] diff --git a/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py b/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py index 32897941dd..c72021643e 100644 --- a/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py +++ b/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py @@ -20,6 +20,7 @@ from google.adk.agents.invocation_context import InvocationContext from google.adk.code_executors.agent_engine_sandbox_code_executor import AgentEngineSandboxCodeExecutor from google.adk.code_executors.code_execution_utils import CodeExecutionInput +from google.adk.code_executors.code_execution_utils import File from google.adk.sessions.session import Session import pytest @@ -320,6 +321,54 @@ def test_execute_code_creates_sandbox_if_missing( input_data={"code": 'print("hello world")'}, ) + @patch("vertexai.Client") + def test_execute_code_sends_correct_field_names_for_input_files( + self, + mock_vertexai_client, + mock_invocation_context, + ): + """Input files are sent with 'content' and 'mime_type' keys (not 'contents'/'mimeType').""" + mock_api_client = MagicMock() + mock_vertexai_client.return_value = mock_api_client + + mock_response = MagicMock() + mock_json_output = MagicMock() + mock_json_output.mime_type = "application/json" + mock_json_output.data = json.dumps({"msg_out": "", "msg_err": ""}).encode( + "utf-8" + ) + mock_json_output.metadata = None + mock_response.outputs = [mock_json_output] + mock_api_client.agent_engines.sandboxes.execute_code.return_value = ( + mock_response + ) + + executor = AgentEngineSandboxCodeExecutor( + sandbox_resource_name="projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789" + ) + code_input = CodeExecutionInput( + code="import pandas as pd; df = pd.read_csv('data.csv')", + input_files=[ + File( + name="data.csv", content=b"col1,col2\n1,2", mime_type="text/csv" + ) + ], + ) + + executor.execute_code(mock_invocation_context, code_input) + + mock_api_client.agent_engines.sandboxes.execute_code.assert_called_once_with( + name="projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789", + input_data={ + "code": "import pandas as pd; df = pd.read_csv('data.csv')", + "files": [{ + "name": "data.csv", + "content": b"col1,col2\n1,2", + "mime_type": "text/csv", + }], + }, + ) + def test_init_with_agent_engine_resource_name(self): """Tests init when only agent_engine_resource_name is provided.""" agent_engine_name = (