From 4d952e7b8119fc5bdf75dbc52682f309496f4800 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Thu, 25 Jun 2026 07:34:19 -0400 Subject: [PATCH] fix(vllm_model): handle explicit null metadata in preprocessing Signed-off-by: Rod Boev --- responses_api_models/vllm_model/app.py | 3 +++ .../vllm_model/tests/test_app.py | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/responses_api_models/vllm_model/app.py b/responses_api_models/vllm_model/app.py index 3e96dae44d..e6e86e1634 100644 --- a/responses_api_models/vllm_model/app.py +++ b/responses_api_models/vllm_model/app.py @@ -301,6 +301,9 @@ def _preprocess_chat_completion_create_params(self, request: Request, body_dict: chat_template_kwargs = deepcopy(self.config.chat_template_kwargs) metadata = body_dict.get("metadata", dict()) + if metadata is None: + metadata = {} + body_dict["metadata"] = metadata # Merge global config chat_template_kwargs with per-request overrides in metadata (e.g. per-sample reasoning on/off) metadata_chat_template_kwargs_str = metadata.get("chat_template_kwargs", "{}") diff --git a/responses_api_models/vllm_model/tests/test_app.py b/responses_api_models/vllm_model/tests/test_app.py index b32ecd8c0e..6cc8b76325 100644 --- a/responses_api_models/vllm_model/tests/test_app.py +++ b/responses_api_models/vllm_model/tests/test_app.py @@ -3306,6 +3306,30 @@ async def mock_create_chat_completion(**kwargs): assert captured_kwargs["min_tokens"] == 20 assert captured_kwargs["new_param"] == "value" + def test_metadata_none_normalizes_to_empty_dict(self) -> None: + config = VLLMModelConfig( + host="0.0.0.0", + port=8081, + base_url="http://api.openai.com/v1", + api_key="dummy_key", # pragma: allowlist secret + model="dummy-model", + entrypoint="", + name="", + return_token_id_information=False, + uses_reasoning_parser=False, + ) + model = VLLMModel(config=config, server_client=MagicMock(spec=ServerClient)) + + body = { + "model": "dummy-model", + "messages": [{"role": "user", "content": "hello"}], + "metadata": None, + } + result = model._preprocess_chat_completion_create_params(MagicMock(), body) + + assert result["messages"][0]["content"] == "hello" + assert result["metadata"] == {} + # ────────────────────────────────────────────────────────────────────────────── # Audio sidechannel splice (metadata.audio_data → user-message content block)