Skip to content

[trap] SGLang answers requests for a model name it does not serve #71

Description

@scottleimroth

Scrub check

I have removed hostnames, IPs, absolute paths, usernames, tokens and keys from anything pasted below.

What broke

A health check that asks a server for a specific model, gets HTTP 200 and a sensible answer, and concludes it is talking to that model. On SGLang it is not a check at all. The server answers a request for a model name it does not serve, using whatever model is actually loaded.

We found it because our consumer probe suite has a deliberate negative control: ask for a model name the server should reject. On two separate SGLang serves, same morning, that probe was ANSWERED both times. vLLM 0.26 on the same hardware rejects the identical request properly.

What you saw

Probe "wrong-name rejected" reporting ok: false on every SGLang cell of a 6-cell speed battery, while every content probe (plain chat, structured output, tool calling, reasoning effort) passed. The failing probe requests a model name that is not the served name, and gets a normal 200 with confident content instead of a 404 or 400.

Scrubbed shape of the two cases:

serve A: --served-model-name bench-speed-house
serve B: --served-model-name bench-speed-rarkfp4
request:  {"model": "<a name neither server serves>", ...}
response: HTTP 200, ordinary assistant content, no warning anywhere

Same suite against a vLLM serve of a different checkpoint on the same estate, the night before: the wrong-name request is rejected, 9/9 probes pass.

Why this is worse than an ordinary unsupported-parameter case: model is not an exotic field. It is the one field every harness, every router and every canary uses to say WHICH model it is measuring. On this stack it is decoration.

The consequence in our own terms: a scorer, canary or health check that "asks for model X and gets an answer" has NOT established it is talking to model X. Point it at the wrong port, or at a server someone else reloaded with different weights, and it passes while measuring something else entirely. It is the same family as a check that returns a plausible answer instead of an error.

What fixed it

Nothing fixes the server behaviour; the workaround is to stop trusting the request field. Verify identity from RESOLVED SERVER STATE instead:

  • GET /get_server_info and read model_path and served_model_name back, or
  • read the resolved launch arguments from the container's own process listing.

Our agent-task benchmark does this by design and records the resolved args in every result artifact. Our ad-hoc checks mostly did not, which is how it survived unnoticed. If you only take one thing: an identity assertion has to read the server's answer about itself, never the client's question.

What were you serving

  • Engine: SGLang, build 0.0.0.dev1+g5f55db35e
  • Image: lmsysorg/sglang:dev-cu13-qwen38-27b-dflash2 (image ID 60166a99b661)
  • Models: unsloth/Qwen3.8-27B-NVFP4 and RadixArk/Qwen3.8-27B-NVFP4, both NVFP4
  • Hardware: NVIDIA GB10 Grace Blackwell, 128 GB unified, Ubuntu 24.04, aarch64
  • Contrast case: vLLM 0.26 on the same hardware, which rejects correctly
  • Conditions: two separate serves, same morning, context length 131072, --mem-fraction-static 0.80, one model loaded at a time

Optional diagnostic evidence

Probe results are recorded per serve as consumer-house.json and consumer-rarkfp4.json, each listing all 9 probes with pass/fail plus the raw response detail. Happy to share those two files.

Related existing entries, which this is NOT a duplicate of: trap 77 covers invented request fields being accepted on Ollama; this is the model field itself, on SGLang, and the failure selects a real model rather than silently ignoring a knob.

I am happy for this data and the credit to be published. Credit as @scottleimroth.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions