mudler / mudler/vllm.cpp

A PNG or http(s) image is HTTP 500 on the Qwen3-VL and dots3-note chat seams, not 400

Open
#3,026 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C++
Stars
423
Forks
53
Avg merge
20h 26m
Merged PRs (30d)
310

Description

Row: -

A PNG, a JPEG, or an http(s) image URL sent to a Qwen3-VL or dots3-note server comes back as HTTP 500, not 400.

oai::DefaultImageCodec refuses container formats by design — the PNG/JPEG→RGB decode is a named residual, and refusing is the correct behaviour under AGENTS.md §"Shared seams". The defect is the STATUS, not the refusal. A request the server cannot serve because of the request's own content is a client error; a 500 tells the caller to retry and tells an operator to go looking for a crash that did not happen.

Where it comes from:

  • src/vllm/entrypoints/openai/mm_chat_qwen3vl.cpp:64 and :76 throw a bare std::runtime_error, which falls through to the generic handler and becomes 500.
  • src/vllm/entrypoints/openai/mm_chat_dots3note.cpp is inconsistent with itself: it converts to vllm::v1::InputValidationError at :273, with a comment that says exactly why ("a bare runtime_error falls through"), and still throws std::runtime_error at :379.

src/vllm/entrypoints/openai/mm_chat_deepseek_v4.cpp does it correctly as of #2411 W5: it catches the codec's std::invalid_argument and the data-URI failures and re-throws vllm::v1::InputValidationError, which the server renders as 400 with a message naming the unsupported container format.

Found while wiring the DeepSeek-V4 vision seam (#2411 W5). That wave fixed its own seam and deliberately did not widen scope into the other two, which is why this issue exists rather than a silent drive-by edit.

Suggested shape: the conversion belongs in one place rather than three. Either the install's catch normalises a codec refusal, or the codec throws a type the seams do not each have to remember to translate. Whichever is chosen, the fix wants a case per seam that asserts the status code, because the current dots3-note file shows that knowing the rule is not enough to apply it consistently.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with AGENTS.md §"Shared seams", then compare the throw sites in src/vllm/entrypoints/openai/mm_chat_qwen3vl.cpp and mm_chat_dots3note.cpp with the handling in mm_chat_deepseek_v4.cpp. Trace the existing seam tests and add one case for each affected seam; done means PNG, JPEG, and http(s) image refusals return HTTP 400 with an explanatory message rather than 500.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
api, backend, testing-qa
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
66/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.