From ca5dda24d34d20cf48978396f5b19faef42031d4 Mon Sep 17 00:00:00 2001 From: xiaohajiayou <923390377@qq.com> Date: Wed, 15 Apr 2026 09:38:42 +0800 Subject: [PATCH 1/2] [[Bug]Fix] return 400 on image model mismatch Signed-off-by: xiaohajiayou <923390377@qq.com> --- .../openai_api/test_image_server.py | 27 +++++++++++++++++++ .../openai_api/test_video_server.py | 12 +++++++++ vllm_omni/entrypoints/openai/api_server.py | 22 ++++++++------- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/tests/entrypoints/openai_api/test_image_server.py b/tests/entrypoints/openai_api/test_image_server.py index c91c5a5c751..d8a8e21666e 100644 --- a/tests/entrypoints/openai_api/test_image_server.py +++ b/tests/entrypoints/openai_api/test_image_server.py @@ -679,6 +679,19 @@ def test_model_field_omitted_works(test_client): assert response.status_code == 200 +def test_generate_images_rejects_model_mismatch(test_client): + response = test_client.post( + "/v1/images/generations", + json={ + "prompt": "test", + "model": "Qwen/Qwen-Image-2512", + "size": "1024x1024", + }, + ) + assert response.status_code == 400 + assert "model mismatch" in response.json()["detail"].lower() + + def make_test_image_bytes(size=(64, 64)) -> bytes: img = Image.new( "RGB", @@ -782,6 +795,20 @@ def test_image_edit_rejects_multiple_images_when_model_does_not_support_them(asy assert engine.captured_prompt is None +def test_image_edit_rejects_model_mismatch(test_client): + img_bytes = make_test_image_bytes((16, 16)) + response = test_client.post( + "/v1/images/edits", + files=[("image", img_bytes)], + data={ + "prompt": "edit me", + "model": "Qwen/Qwen-Image-Edit", + }, + ) + assert response.status_code == 400 + assert "model mismatch" in response.json()["detail"].lower() + + def test_image_edit_parameter_pass(async_omni_test_client): img_bytes_1 = make_test_image_bytes((16, 16)) diff --git a/tests/entrypoints/openai_api/test_video_server.py b/tests/entrypoints/openai_api/test_video_server.py index 7200b38abb8..a71fecae3ec 100644 --- a/tests/entrypoints/openai_api/test_video_server.py +++ b/tests/entrypoints/openai_api/test_video_server.py @@ -393,6 +393,18 @@ def test_missing_prompt_returns_422(test_client): assert response.status_code == 422 +def test_video_generation_rejects_model_mismatch(test_client): + response = test_client.post( + "/v1/videos", + data={ + "prompt": "bad model", + "model": "Wan-AI/Wan2.1-T2V-14B-Diffusers", + }, + ) + assert response.status_code == 400 + assert "model mismatch" in response.json()["detail"].lower() + + def test_invalid_size_parse_returns_422(test_client): response = test_client.post( "/v1/videos", diff --git a/vllm_omni/entrypoints/openai/api_server.py b/vllm_omni/entrypoints/openai/api_server.py index 0706b98987c..80c944b7d64 100644 --- a/vllm_omni/entrypoints/openai/api_server.py +++ b/vllm_omni/entrypoints/openai/api_server.py @@ -1302,11 +1302,10 @@ async def generate_images(request: ImageGenerationRequest, raw_request: Request) # Get engine client (AsyncOmni) from app state engine_client, model_name, stage_configs = _get_engine_and_model(raw_request) - # Validate model field (warn if mismatch, don't error) if request.model is not None and request.model != model_name: - logger.warning( - f"Model mismatch: request specifies '{request.model}' but " - f"server is running '{model_name}'. Using server model." + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST.value, + detail=(f"Model mismatch: request specifies '{request.model}' but server is running '{model_name}'."), ) try: @@ -1444,8 +1443,9 @@ async def edit_images( # 1. get engine and model engine_client, model_name, stage_configs = _get_engine_and_model(raw_request) if model is not None and model != model_name: - logger.warning( - f"Model mismatch: request specifies '{model}' but server is running '{model_name}'. Using server model." + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST.value, + detail=(f"Model mismatch: request specifies '{model}' but server is running '{model_name}'."), ) # 2. get output format & compression output_format = _choose_output_format(output_format, background) @@ -2107,10 +2107,12 @@ async def _parse_video_form( app_model_name, app_stage_configs = _resolve_video_runtime_context(raw_request) effective_model_name = handler.model_name or app_model_name or request.model or "unknown" if request.model is not None and effective_model_name is not None and request.model != effective_model_name: - logger.warning( - "Model mismatch: request specifies '%s' but server is running '%s'. Using server model.", - request.model, - effective_model_name, + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST.value, + detail=( + f"Model mismatch: request specifies '{request.model}' but server is running " + f"'{effective_model_name}'." + ), ) handler.set_stage_configs_if_missing(app_stage_configs) except HTTPException: From eab5cee0ebc1dbccfbc15f1f33f20516332f9f55 Mon Sep 17 00:00:00 2001 From: xiaohajiayou <923390377@qq.com> Date: Sat, 18 Apr 2026 16:06:25 +0800 Subject: [PATCH 2/2] test: fix pre-commit formatting Signed-off-by: xiaohajiayou <923390377@qq.com> --- tests/entrypoints/openai_api/test_image_server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/entrypoints/openai_api/test_image_server.py b/tests/entrypoints/openai_api/test_image_server.py index 083bc9f0cb4..607b3eaa813 100644 --- a/tests/entrypoints/openai_api/test_image_server.py +++ b/tests/entrypoints/openai_api/test_image_server.py @@ -979,6 +979,8 @@ def test_image_edit_rejects_model_mismatch(test_client): ) assert response.status_code == 400 assert "model mismatch" in response.json()["detail"].lower() + + def test_image_edit_rejects_too_many_images_for_qwen_image_edit_2511(async_omni_test_client): engine = async_omni_test_client.app.state.engine_client engine.get_diffusion_od_config = lambda: SimpleNamespace(