A model does not have one quality score. It has a quality score conditioned on the serving configuration it ran under. That is the sentence most eval-to-production surprises come down to, and it is exactly the sentence the phrase “sglang ome” tends to hide. If you have typed “sglang ome” into a search box, you are almost certainly mid-way through comparing inference runtimes — deciding what to host your model on before it goes live. The trap at that moment is subtle. It is tempting to treat the serving stack as a neutral pipe: pick a model on the strength of a leaderboard or a task-specific eval, then assume the same number holds once SGLang, OME, or any other engine is dropped underneath it. That assumption is where a quiet class of post-deployment regressions is born. What is SGLang and what is OME? SGLang is an inference and serving runtime for large language models. Its distinguishing features cluster around throughput and structured generation: aggressive KV-cache reuse (its RadixAttention scheme shares prefix cache across requests), continuous batching, and first-class support for constrained decoding — grammars, JSON schemas, regex-bounded outputs. OME, in the sense the “sglang ome” query usually intends, is the Open Model Engine layer that packages and manages models for that runtime — the orchestration and model-lifecycle piece that sits above the raw serving kernel. The relationship matters less than the category they both occupy. Both are decisions about how the model is hosted, and both make choices that touch the output the model produces — not merely how fast it produces it. That is the reframe this whole article turns on. A serving runtime is not a delivery truck for tokens the model already decided on. It participates in the decision. Here is the claim stated plainly so it is easy to lift: the serving layer — batching policy, KV-cache reuse, quantisation, structured-output constraints, and sampling defaults — is part of the system under test in any LLM eval, because those choices move both latency and output quality. An eval that ignores the serving layer measured a different system than the one you will deploy. Why does the serving runtime change whether a score transfers? Walk through the specific levers, because “the runtime matters” is too vague to act on. Quantisation. Running a model at FP8 or INT4 to fit a memory budget or hit a throughput target is a serving decision, and it changes the logits. On most tasks the drift is small; on a few — long-form arithmetic, tightly formatted extraction, edge-case reasoning — it is not. If your isolated eval ran the model at BF16 and production serves it quantised, the eval number is an upper bound you may not reach. Sampling defaults. Temperature, top-p, top-k, repetition penalty. Two runtimes can ship different defaults, and an eval harness can silently apply its own. A benchmark run at temperature 0 (greedy) and a production endpoint at temperature 0.7 are not evaluating the same behaviour, especially on tasks where determinism is what you were scoring. Constrained decoding. This is where SGLang-class runtimes bite hardest. Forcing output to satisfy a JSON schema or grammar constrains the token distribution at generation time. That can improve a structured-extraction score relative to free-text generation — or it can degrade reasoning quality when the constraint fights the model’s natural trajectory. Either way, an eval run without the constraint that production enforces (or vice versa) is measuring a different distribution. We treat constrained decoding as one of the first things to pin down when a team is standing up a serving stack, precisely because its effect on quality is the least intuitive. The mechanics of one decoding choice are worth understanding on their own; how beam search decoding shapes output quality is a good companion read for why decoding strategy is not a neutral knob. Batching and KV-cache reuse. These are usually framed as pure performance features, and mostly they are. But prefix caching and aggressive batching interact with numerical precision and, under some fused-kernel implementations, with the exact order of floating-point reductions — which can perturb outputs at the margin. The larger point is that batching is what makes your latency eval transfer or not; a single-request latency number says almost nothing about behaviour under production concurrency. None of these is exotic. Each is a routine setting someone flips while getting a model to run. The problem is that they are flipped after the eval, by a different person, on a different day, and nobody wrote down that the earlier score assumed different values. The divergence point: porting to production The moment a team ports a model onto a new runtime for production is the moment the earlier score becomes a claim about a system that no longer exists. This is not a criticism of SGLang or OME — it is the general shape of the problem, and those two are simply where a task-specific eval and a real deployment finally meet. The naive workflow looks reasonable from the inside: Evaluate candidate models on a task-specific harness (isolated, whatever defaults the harness ships). Pick the winner. Hand it to the platform team to serve on SGLang / OME. Ship. Discover in production that the structured-output pass rate, or the reasoning accuracy, or the tail latency, does not match the eval. Step 5 is the surprise the ROI of this whole discipline is built around. Aligning the eval runtime with the production serving stack up front prevents it: fewer eval-to-production quality gaps, fewer re-tuning cycles after a runtime migration, and — the part procurement cares about — a defensible record of which serving configuration each eval number was produced on. In our experience standing up serving stacks with clients, the teams that skip this do not skip the cost; they pay it later as an unexplained regression that is much harder to debug because the eval evidence no longer describes the running system. What to record: an eval-serving configuration checklist A quantity is only defensible if you can reproduce the system that produced it. Before an eval number goes into a decision record, capture the serving configuration alongside it. This block is meant to be extractable and reused as a template. Configuration axis What to record Why it can move the score Runtime + version e.g. SGLang vX.Y, OME layer version Kernel fusion and default behaviour change across versions Precision / quantisation BF16 / FP8 / INT4, method used Alters logits; upper-bound vs. deployed accuracy Sampling parameters temperature, top-p, top-k, seed Determinism and answer distribution Constrained decoding grammar / JSON schema / regex, on or off Constrains token distribution; changes quality both ways Batching regime concurrency level, continuous batching on/off Latency transfer; marginal numeric effects KV-cache policy prefix reuse on/off (e.g. RadixAttention) Reproducibility of cached-prefix behaviour Hardware GPU model, count, interconnect Precision paths and throughput ceiling The evidence class here is an observed-pattern one — these are the axes we consistently find explain eval-to-production gaps across engagements, not a ranked list from a single benchmark. Treat the table as a starting checklist, not a proof of which axis dominates for your task; that ordering is task-specific and is exactly what a task-specific eval is for. If you want the metric side of the same story — which numbers actually decide a hosting choice — which machine-learning model metrics decide a serving config covers the measurement layer this checklist feeds. Recording the serving configuration is not administrative overhead. It is what turns an eval number into procurement-grade evidence — the discipline that governs what counts as defensible eval evidence once someone downstream asks “under what conditions was this measured?” A number without its serving context is a rumour with a decimal point. How should a team keep an eval reproducible across runtimes? The practical answer is to make the serving configuration a first-class input to the eval, not a downstream fact discovered after the model is chosen. Two patterns work. The first is to run the task-specific eval through the production runtime from the start — evaluate the candidate models on SGLang/OME with the batching, quantisation, and decoding constraints you intend to ship, so the eval and the deployment are the same system by construction. This is the stronger option when the serving stack is already decided. The second, when the runtime is not yet fixed, is to record the configuration axes above for every eval run and re-run the eval against the new configuration whenever the runtime changes. The cost is a re-run; the payoff is that you never carry a stale number into a decision. For teams already comparing runtimes at the cost level, the SGLang OME cost-per-request analysis sibling article covers the economics that sit next to the quality story here, and the broader LynxBench AI work treats the serving stack as part of the system under test as a matter of method. FAQ How does sglang ome work? SGLang is an LLM serving runtime built around KV-cache reuse (RadixAttention), continuous batching, and constrained decoding; OME (Open Model Engine) is the model-management layer that packages and orchestrates models for that runtime. In practice they are decisions about how a model is hosted — and those decisions touch output quality, not just speed, which is why they belong inside your eval rather than after it. What is SGLang and what is OME (Open Model Engine), and how do they relate at the serving layer? SGLang is the serving kernel — the part that batches requests, reuses cache, and enforces decoding constraints. OME sits above it as the model-lifecycle and orchestration layer. They relate as runtime-plus-manager, and together they define the serving configuration your model actually runs under in production. Why does the serving runtime affect whether a benchmark or eval score transfers to production? Because the runtime makes choices — quantisation, sampling defaults, constrained decoding — that change the model’s output distribution, not only its latency. An eval run in isolation measured a different system than the one you deploy, so its score is a claim about a configuration that no longer exists once the model is ported. Which serving-layer choices can change model output quality, not just latency? Quantisation alters the logits; sampling defaults (temperature, top-p, top-k) change the answer distribution; constrained decoding reshapes the token distribution at generation time; and batching plus KV-cache reuse can perturb outputs at the numeric margin. Constrained decoding and quantisation are usually the two with the largest, least-intuitive effect on quality. How should a team keep an eval reproducible when the model is ported to a different runtime like SGLang or OME? Either run the task-specific eval through the intended production runtime from the start, so eval and deployment are the same system by construction, or record every serving-configuration axis and re-run the eval whenever the runtime changes. The second option costs a re-run; both prevent carrying a stale number into a decision. What should a buyer record about the serving configuration so an eval number stays defensible later? Record the runtime and version, precision/quantisation method, sampling parameters and seed, whether constrained decoding was on and its schema, the batching regime, the KV-cache policy, and the hardware. That record is what lets someone downstream reproduce the system the number came from — turning an eval score into defensible evidence rather than an unattributed figure. Where this leaves the runtime decision The honest position is that there is no context-free quality score to port. When you next compare candidate models, the question to hold onto is not “which model scored higher” but “which model scored higher under the serving configuration I am actually going to run.” SGLang and OME are worth understanding precisely because they are the point where that question stops being abstract — where the eval and the deployment become the same system, or quietly diverge. The validation discipline behind a production monitoring harness exists to keep that record straight; the failure class it guards against is the eval number that outlived the system it described.