[Bugfix][Frontend] Support Responses text types in DeepSeek V4.1 (#56299)

Signed-off-by: CedricHuang <38417461+CedricHwong@users.noreply.github.com> Co-authored-by: OpenAI Codex <codex@openai.com>

CedricHuang committed Sep 14, 2026 at 10:43 UTC eb42686a30cddf325ffeff7b3bd5e3a7298c2c00
2 files changed +19 -1
tests/tokenizers_/test_deepseek_v41.py
+18
@@ -99,6 +99,24 @@ def test_raw_text_parts_preserve_reference_separator():
99 assert messages == original
100
101
102 +@pytest.mark.parametrize(
103 + ("role", "responses_type"),
104 + [("user", "input_text"), ("assistant", "output_text")],
105 +)
106 +def test_responses_text_parts_match_chat_text_parts(role, responses_type):
107 + responses_message = {
108 + "role": role,
109 + "content": [{"type": responses_type, "text": "hello"}],
110 + }
111 + chat_message = {
112 + "role": role,
113 + "content": [{"type": "text", "text": "hello"}],
114 + }
115 + assert render([responses_message], thinking=False) == render(
116 + [chat_message], thinking=False
117 + )
118 +
119 +
120 def test_mid_system_gets_its_own_marker_and_generation_header():
121 assert render(
122 [
vllm/tokenizers/deepseek_v41.py
+1 -1
@@ -32,7 +32,7 @@ def _normalize_messages(
32 parts = []
33 for block in content:
34 part_type = block.get("type")
35 - if part_type == "text":
35 + if part_type in ("text", "input_text", "output_text"):
36 parts.append(block.get("text", ""))
37 elif part_type in ("image_url", "input_image", "image_pil"):
38 parts.append(IMAGE_PLACEHOLDER)