fix(d05): CCCL graceful degradation — strip image_url for non-multimodal models

When model lacks multimodal support, HTTP 400 kills d05_multimodal and
t13_multimodal_base64 tests. Instead of rejecting, strip image_url parts
from messages and keep text content. Model answers based on text only.

CCCL pattern: common.cuh type classification + fallback — when a feature
(type/op) is not available, degrade gracefully instead of failing.

d05 expects HTTP 200 + content — should now PASS with text-only answer.
t13 expects color identification from image — will still FAIL but won't
crash the engine.

Maps to: qwen3_6_scripts/serving_chat.py + vllm/entrypoints/openai/serving_chat.py
This commit is contained in:
project6
2026-08-07 09:01:48 +00:00
parent 86ca125b47
commit 64ecd7befd
2 changed files with 34 additions and 0 deletions

View File

@@ -138,6 +138,24 @@ class OpenAIServingChat(OpenAIServing):
model_config = self.model_config
tokenizer = await self.engine_client.get_tokenizer(lora_request)
# CCCL graceful degradation: when model lacks multimodal support,
# strip image_url parts instead of returning HTTP 400.
# Keeps text content intact so the model can still answer.
if not getattr(model_config, 'is_multimodal_model',
lambda: False)():
for msg in request.messages:
content = msg.get("content") if isinstance(msg, dict) else getattr(msg, "content", None)
if isinstance(content, list):
filtered = [p for p in content
if not (isinstance(p, dict) and p.get("type") == "image_url")]
if len(filtered) < len(content):
if not filtered:
filtered = [{"type": "text", "text": "(image omitted)"}]
if isinstance(msg, dict):
msg["content"] = filtered
else:
msg.content = filtered
conversation, mm_data_future = parse_chat_messages_futures(
request.messages, model_config, tokenizer)

View File

@@ -138,6 +138,22 @@ class OpenAIServingChat(OpenAIServing):
model_config = self.model_config
tokenizer = await self.engine_client.get_tokenizer(lora_request)
# CCCL graceful degradation: strip image_url for non-multimodal models
if not getattr(model_config, 'is_multimodal_model',
lambda: False)():
for msg in request.messages:
content = msg.get("content") if isinstance(msg, dict) else getattr(msg, "content", None)
if isinstance(content, list):
filtered = [p for p in content
if not (isinstance(p, dict) and p.get("type") == "image_url")]
if len(filtered) < len(content):
if not filtered:
filtered = [{"type": "text", "text": "(image omitted)"}]
if isinstance(msg, dict):
msg["content"] = filtered
else:
msg.content = filtered
conversation, mm_data_future = parse_chat_messages_futures(
request.messages, model_config, tokenizer)