From 7c18824d39fca7b30244be9b4355b2cc10962779 Mon Sep 17 00:00:00 2001 From: Lichao Chen Date: Tue, 7 Jul 2026 10:04:49 -0700 Subject: [PATCH] fix: preserve empty dict handler output --- runpod/serverless/modules/rp_job.py | 3 --- tests/test_serverless/test_modules/test_fastapi.py | 13 +++++++++++++ tests/test_serverless/test_modules/test_job.py | 11 +++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/runpod/serverless/modules/rp_job.py b/runpod/serverless/modules/rp_job.py index a45cebc6..4e9f3750 100644 --- a/runpod/serverless/modules/rp_job.py +++ b/runpod/serverless/modules/rp_job.py @@ -279,9 +279,6 @@ async def run_job(handler: Callable, job: Dict[str, Any]) -> Dict[str, Any]: else: run_result = {"output": job_output} - if run_result.get("output") == {}: - run_result.pop("output") - check_return_size(run_result) # Checks the size of the return body. except Exception as err: diff --git a/tests/test_serverless/test_modules/test_fastapi.py b/tests/test_serverless/test_modules/test_fastapi.py index 4830b9df..5bbb17fc 100644 --- a/tests/test_serverless/test_modules/test_fastapi.py +++ b/tests/test_serverless/test_modules/test_fastapi.py @@ -198,6 +198,19 @@ def test_runsync(self): "output": {"result": "success"}, } + # Empty dict outputs should be returned as valid results rather + # than raising KeyError while building the runsync response. + empty_handler = Mock(return_value={}) + empty_worker_api = rp_fastapi.WorkerAPI({"handler": empty_handler}) + empty_runsync_return = asyncio.run( + empty_worker_api._sim_runsync(default_input_object) + ) + assert empty_runsync_return == { + "id": "test-123", + "status": "COMPLETED", + "output": {}, + } + # Test with generator handler def generator_handler(job): del job diff --git a/tests/test_serverless/test_modules/test_job.py b/tests/test_serverless/test_modules/test_job.py index 96590c1e..22b14335 100644 --- a/tests/test_serverless/test_modules/test_job.py +++ b/tests/test_serverless/test_modules/test_job.py @@ -15,6 +15,17 @@ class TestJob(IsolatedAsyncioTestCase): """Tests for the get_job function.""" + async def test_run_job_preserves_empty_dict_output(self): + """Empty dict handler results are valid outputs.""" + + def handler(job): + del job + return {} + + result = await rp_job.run_job(handler, {"id": "test-job", "input": {}}) + + self.assertEqual(result, {"output": {}}) + async def test_get_job_200(self): """Tests the get_job function with a valid 200 response.""" # Mock the 200 response