Release v0.11.0
Highlights
- Flow control for P/D: Saturation gating is stage-aware. Prefill and decode are measured separately and admission gates on the busier stage (#2221). The beta
max-saturation-detectorcombines several detectors and gates on the highest one, and each child can be limited to prefill or decode (#2827, #2926). Queue TTLs can be set per priority band, clients can ask for a shorter one withx-llm-d-inference-ttl, andnoEndpointRequestTTLbounds the wait while the pool is empty (#2649, #2284). New capacity utilization gauges and anx-llm-d-flow-queue-duration-msresponse header (#2184, #2490). - Scheduling and routing: The new
latency-observation-scorerranks endpoints by TTFT measured from real responses (#2371). In P/D, load is split by role: input tokens count against prefill and estimated output tokens against decode (#2396). Thecontext-length-awarescorer can route cached follow-ups by the prefill work that remains (#2559). Endpoints tied for the top score take turns instead of one pod getting the whole burst (#2515, #2709). Newturn-priorityfairness strategy and endpoint attribute weight scorer (#2116, #2204). - Tokenization and render:
token-producerrenders Anthropic Messages natively through vLLM/v1/messages/render, and falls back to the old conversion when the endpoint is missing (#2707). It can balance render calls across discovered endpoints (#2701), and supports HTTPS, mTLS and render endpoints started with--api-key(#2664, #2678, #2763). Opt-in xxhash block hashing makes precise prefix hashing about 8x cheaper (#2237). - API coverage: SGLang
/generate(#2391), OpenAI text-to-speech (#2484),/v1/images/edits(#2562), and pre-tokenized batch prompts on/v1/completions(#2523). Paths no parser claims are forwarded to the model server by default throughpassthrough-parser(#2507). ATOM is a built-in engine type (#2476). - Coordinator and DisaggregatedSet: The coordinator exposes Prometheus metrics, optionally over HTTPS, forwards unregistered paths such as
/v1/modelsto a decode pod, and adds an optional async-broker step (#2435, #2752, #2357, #2325). EPP replicas agree on DisaggregatedSet revision decisions, and the coordinator keeps the same decision across encode, prefill and decode (#2570, #2571, #2572, #2576). - Operations: A
--feature-gatesflag enables gates without restating the whole config (#2388). Helm adds Envoy priority routing for EPP failover in standalone mode,router.epp.deploymentStrategy, structuredrouter.epp.pluginsConfigandrouter.imagePullSecrets, and restarts the EPP pod when its ConfigMaps change (#2228, #2603, #2620, #2766, #2460). - Observability: Logs carry
trace_idandspan_id. New spans cover tokenization and the KV-event pipeline, and trace context is read from ext_proc gRPC metadata so traces connect end to end (#2271, #2272, #2830). Spans carryservice.nameand the pod resource attributes (#2298). - Fixes:
golang.org/x/cryptov0.55.0 for CVE-2026-56854 (#2739). Stale precise prefix-cache state after endpoints are removed (#2824). The PD Multi Tier decode leg starting before prefill stored its KV (#2451).min_tokensbreaking the prefill leg (#2593). MoRI-IO concurrent dispatch (#2816). Published standalone charts pointing agentgateway at a missing image tag (#2732). - Precise prefix cache: LoRA requests keep
BlockStoredextra keys aligned with request-side keys, restoring precise cache matches (#2929).
Upgrade Steps & Deprecations
This release removes many items deprecated in v0.7.0 and v0.9.0. Configurations that still use them fail at startup.
- Removed plugins:
pd-profile-handler, usedisagg-profile-handlerwith the nestedprofilesanddecidersformat (#2509).precise-prefix-cache-scorer, useprecise-prefix-cache-producerplusprefix-cache-scorerwithprefixMatchInfoProducerName(#2844).by-labelandby-label-selector, uselabel-selector-filteror the role filters (#2865).tokenizer, usetoken-producer(#2869). - Removed config: The top-level
saturationDetectorandparserfields, useflowControl.saturationDetectorandrequestHandler.parsers(#2838). The UDS tokenizer:udsTokenizerConfigandindexerConfig.tokenizersPoolConfigare rejected, setvllm.urlontoken-producerinstead (#2512).lasDecayFactoronprogram-aware-fairness, decay useslasHalfLifeSecondsonly (#2120). - Pod label:
llm-d.ai/role: bothno longer matches. Useprefill-decode(#2509). - Removed metrics: The legacy
inference_extension_*,llm_d_inference_scheduler_*, core request and inference-pool, andinference_objectivepredicted-latency families. Use thellm_d_epp_*series. Threeinference_extension_*series stay for the workload-variant autoscaler (#2826, #2675, #2821, #2509). - Changed metrics: KV-event metrics use the
llm_d_eppprefix instead ofllm_d_router_epp(#2385).kv_cache_index_lookup_hits_totalandkv_cache_index_max_pod_hit_count_totalcount only the longest contiguous prefix on one pod, so they read lower. Re-baseline dashboards and alerts (#2400, #2680). An empty-pool expiry is labelledEvictedNoEndpointsinstead ofEvictedTTL(#2284). - Coordinator TLS on by default: The inference listener serves HTTPS. Use https, or set
--secure-coordinator=falseto keep plaintext (#2805). - JSON logs: Field names follow OpenTelemetry. Collectors that match on
msgneed to matchbody(#2643). - Tracing: With tracing on and
OTEL_TRACES_EXPORTERunset, spans go to OTLP instead of stdout (#2566). - Helm: Charts default to Prometheus Operator monitoring for every gateway provider. GKE users who relied on implicit GMP monitoring must configure it explicitly (#2374). The Prometheus ClusterRole and binding are created only when metrics authentication is on (#2798).
- Endpoint attribute plugins:
endpoint-attribute-filterandendpoint-attribute-scorertake a separateproducerparameter, and the combinedName/Producerform is rejected. Out-of-tree plugins that useAttributeMapneed updating (#2190). - Prefix scoring: Device tiers without a configured weight score 0 instead of 1.0 (#2809).
- Stricter startup checks: Optional dependency cycles and invalid plugin ordering fail startup (#2721). Non-positive
--metrics-staleness-thresholdand--refresh-prometheus-metrics-intervalare rejected (#2914). - Conditional decode: The
Prefer: if-available412 gate moved intoprefix-based-pd-decider. Without that plugin, such requests get 412. SetnonCachedTokens: 1to keep the old behavior (#2335). - P/D failures: When a required prefill stage finds no endpoint, the request fails instead of running prefill on the decode pod (#2521). No eligible decode endpoint returns 503
rejected-no-endpoints(#2631). - Deprecated:
dataLayer.discovery.pluginRef, usedataLayer.discovery.endpoints.pluginRef; old configs are migrated automatically (#2434).kvcache.KVBlockScorerandkvcache.NewTracedScorer(#2669). - Latency predictor: Charts from this release use the
v0.8.0latency predictor images, the latest published predictor release.
Known Issues
- Endpoint score emission (
--emit-endpoint-scores) emits nothing under the deprecateddata-parallel-profile-handler. - With KV-event replay disabled, an inference engine that restarts at the same endpoint can retain stale precise prefix-cache state until eviction. Follow #2853 and #2854.
What's Changed
Click to expand
- fix(kvevents): drop the LoRA name from BlockStored extra keys by @wseaton in #2929
- test(flowcontrol): eviction dynamics benchmark by @LukeAVanDrie in #2107
- refactor(datalayer): key AttributeMap by DataKey instead of string by @satyamg1620 in #2190
- Filter prefix cache events by cache group kind by @vMaroon in #2363
- docs: add release-note fragment for PR #2190 by @llm-d-router-release-notes[bot] in #2367
- fix(charts): emit leading document separators in monitoring partials by @LukeAVanDrie in #2368
- Bumped Go version directive from 1.26.5 to 1.26.6. by @ahg-g in #2386
- Unify the metrics subsystem on llm_d_epp by @ahg-g in #2385
- fix(flowcontrol): prevent aggregate stats underflow on flow GC by @LukeAVanDrie in #2382
- docs: add release-note fragment for PR #2385 by @llm-d-router-release-notes[bot] in #2387
- feat: EPP peer discovery infrastructure by @evacchi in #2341
- make metricsLoggingInterval values match the comment by @yamt in #2405
- fix(tokenizer): translate Anthropic tool calls and thinking for render by @mschulist in #2389
- Bound and resume KV-event replay by @vMaroon in #2410
- fix(options): validate refresh-metrics-interval 50ms floor at startup by @noalimoy in #2394
- deps(actions): bump github/codeql-action/upload-sarif from 4.37.6 to 4.37.7 in the github-actions group by @dependabot[bot] in #2418
- deps(go): bump google.golang.org/protobuf from 1.36.12-0.20260120151049-f2248ac996af to 1.36.12 in the go-dependencies group by @dependabot[bot] in #2417
- docs: add release-note fragment for PR #2389 by @llm-d-router-release-notes[bot] in #2413
- test(tokenizer): cover Anthropic tool render request by @vMaroon in #2412
- perf(flowcontrol): index active queues so dispatch scans O(active) flows by @LukeAVanDrie in #2120
- feat(flowcontrol): split queue-wait budget by unavailability regime by @satyamg1620 in #2284
- docs: add release-note fragment for PR #2120 by @llm-d-router-release-notes[bot] in #2436
- perf(epp): reduce streaming parser allocations by @muchengl in #2425
- fix(epp): merge streaming usage per field instead of replacing it by @himanshu1573 in #2437
- feat(epp): record a termination cause on end-of-stream response records by @LukeAVanDrie in #2444
- docs: move Shmuel Kallner to emeritus, drop from CODEOWNERS by @elevran in #2449
- [ci]: Add path based PR labeling by @hickeyma in #2281
- feat(epp): expose a streamed-event count on the response record by @LukeAVanDrie in #2446
- docs: assemble release notes for v0.10.0 by @llm-d-router-release-notes[bot] in #2424
- docs: add release-note fragment for PR #2437 by @llm-d-router-release-notes[bot] in #2452
- docs: add release-note fragment for PR #2444 by @llm-d-router-release-notes[bot] in #2453
- docs: add release-note fragment for PR #2446 by @llm-d-router-release-notes[bot] in #2461
- feat(flowcontrol): add per-band and global capacity utilization gauges by @sudoalok in #2184
- feat(telemetry): align kvcache OTel scope and span names with router standard by @Alex-ai-future in #2164
- feat(kvcache): add opt-in xxhash hashing to the KV-block token processor by @vMaroon in #2237
- docs: add prose rules for model-drafted text to AGENTS.md by @LukeAVanDrie in #2420
- Skip body re-marshal/replace when no model-name rewrite occurred by @elevran in #2318
- feat(epp): add sglanghttp parser for /generate by @NaomiEisen in #2391
- docs: add release-note fragment for PR #2391 by @llm-d-router-release-notes[bot] in #2467
- docs: add release-note fragment for PR #2237 by @llm-d-router-release-notes[bot] in #2466
- fix: Make TokenizedPrompt.MultiModalFeatures per-prompt by @albertoperdomo2 in #1633
- refactor(epp): unexport RequestContext protocol and response state by @LukeAVanDrie in #2457
- feat(datalayer): record more OpenAI fields on the models attribute by @zdtsw in #2479
- fix(kvcache): report index hit metrics as contiguous prefix chains by @nilig in #2400
- docs(epp): fix stale links in pkg/epp/README.md by @varad-ahirwadkar in #2454
- [Flow Control] Stage-Aware Saturation Gating for disaggregated P/D deployments by @loicmarchal in #2221
- perf(epp): remove per-scrape allocations in the metrics extractor by @LukeAVanDrie in #2473
- cleanup(sidecar,logging): share the level encoder and use named verbosity constants by @LukeAVanDrie in #2474
- docs: add release-note fragment for PR #2221 by @llm-d-router-release-notes[bot] in #2497
- docs: add release-note fragment for PR #2400 by @llm-d-router-release-notes[bot] in #2496
- fix(chart): avoid inferring GMP from GKE gateway provider by @Alex-ai-future in #2374
- tracing: configure SDK explicitly instead of mutating process env by @satyamg1620 in #2298
- fix(prefix-scorer): aggregate missing match logs by @nilig in #2404
- docs: add release-note fragment for PR #2404 by @llm-d-router-release-notes[bot] in #2502
- docs: add release-note fragment for PR #2298 by @llm-d-router-release-notes[bot] in #2499
- docs: add release-note fragment for PR #2374 by @llm-d-router-release-notes[bot] in #2498
- feat(scorer): migrate five legacy Consumes scorers to ConsumerPlugin by @elevran in #2355
- fix(scheduling): return typed capacity rejection when filters drain candidates by @LukeAVanDrie in #2462
- docs: add release-note fragment for PR #2184 by @llm-d-router-release-notes[bot] in #2464
- docs: add release-note fragment for PR #2462 by @llm-d-router-release-notes[bot] in #2504
- perf(epp): derive Scope allowed-key sets once at datalayer init by @LukeAVanDrie in #2471
- perf(epp): guard hot-path log and span construction in scheduler, director, and handlers by @LukeAVanDrie in #2472
- Add passthrough-parser to the default parser list by @zetxqx in #2507
- docs: add release-note fragment for PR #2507 by @llm-d-router-release-notes[bot] in #2508
- Add an outcome metric for the affinity filter plugin by @mathias-kende in #2494
- feat(epp): move conditional-decode gate into prefix-based-pd-decider by @dmitripikus in #2335
- Output length aware TokenLoadScorer by @DolevAdas in #2309
- docs: add release-note fragment for PR #2494 by @llm-d-router-release-notes[bot] in #2526
- feat(epp): add x-llm-d-flow-queue-duration-ms response header by @jtechapps in #2490
- deps(actions): bump github/codeql-action/upload-sarif from 4.37.7 to 4.37.8 in the github-actions group by @dependabot[bot] in #2535
- docs: add release-note fragment for PR #2490 by @llm-d-router-release-notes[bot] in #2538
- docs: add release-note fragment for PR #2335 by @llm-d-router-release-notes[bot] in #2527
- docs: add release-note fragment for PR #2309 by @llm-d-router-release-notes[bot] in #2528
- deps(go): bump the go-dependencies group with 2 updates by @dependabot[bot] in #2532
- deps(docker): bump golang from 1.26.6 to 1.26.7 by @dependabot[bot] in #2533
- deps(go): bump the kubernetes group with 6 updates by @dependabot[bot] in #2534
- epp: remove code deprecated since v0.7.0 by @roytman in #2509
- docs: add release-note fragment for PR #2509 by @llm-d-router-release-notes[bot] in #2542
- fix(epp): fail P/D requests when a required prefill stage finds no endpoint by @elinacse in #2521
- fix(epp): classify non-OK gRPC trailers as errors by @yuanhuizang-cloud in #2517
- Preserve JSON number precision during request repackaging by @yankay in #2519
- feat(epp): add --feature-gates flag by @abhishekkarki in #2388
- feat: Support array<array> prompt in /v1/completions by @albertoperdomo2 in #2523
- docs: add release-note fragment for PR #2388 by @llm-d-router-release-notes[bot] in #2545
- docs: add release-note fragment for PR #2164 by @llm-d-router-release-notes[bot] in #2465
- docs: add release-note fragment for PR #2523 by @llm-d-router-release-notes[bot] in #2546
- config: consolidate discovery plugins under a single discovery section (follow up #2341) by @pazqo in #2434
- tracing: correlate logs with traces at request entry points by @satyamg1620 in #2271
- feat: auto-tune approx prefix cache block size from prefix_match_unit by @RishabhSaini in #2455
- refactor(flowcontrol): read capacity counters where they live by @LukeAVanDrie in #2456
- docs: add release-note fragment for PR #2434 by @llm-d-router-release-notes[bot] in #2551
- docs: add release-note fragment for PR #2271 by @llm-d-router-release-notes[bot] in #2552
- feat(plugin-state): Allow customizing staleness threshold by @asharkhan3101 in #2138
- test(e2e): warm up before disruption in streaming-request spec by @elevran in #2378
- docs: add release-note fragment for PR #2284 by @llm-d-router-release-notes[bot] in #2439
- tracing: support standard sampler values and validate the argument by @satyamg1620 in #2550
- fix(dev): remove stale external tokenizer config by @yuanhuizang-cloud in #2491
- Add endpoint-attribute parity coverage and a benchmark config (#2059 item 1) by @MicheleCampi in #2393
- tracing: default the trace exporter to otlp instead of console by @satyamg1620 in #2566
- feat(telemetry): finish dropping component prefixes from EPP scoring and P/D proxy spans by @gyliu513 in #2558
- feat(telemetry): drop misleading gateway. prefix from EPP root spans by @gyliu513 in #2557
- docs: add release-note fragment for PR #2455 by @llm-d-router-release-notes[bot] in #2553
- feat: parse multipart /v1/images/edits requests in OpenAI parser by @zetxqx in #2562
- docs: add release-note fragment for PR #2562 by @llm-d-router-release-notes[bot] in #2569
- [KVEvents] add dp rank to KV events by @sagearc in #2379
- docs: add release-note fragment for PR #2138 by @llm-d-router-release-notes[bot] in #2555
- Raise e2e EXISTS_TIMEOUT to 90s in CI to avoid namespace teardown flakes by @zetxqx in #2582
- feat(coordinator): proxy unregistered paths to the decode profile by @dmitripikus in #2357
- feat(epp): make the fairness_id metric label cap configurable by @mathias-kende in #2495
- pdd: Allow PD decider to select cache producer by @wez470 in #2560
- docs: add release-note fragment for PR #2560 by @llm-d-router-release-notes[bot] in #2592
- docs: add release-note fragment for PR #2357 by @llm-d-router-release-notes[bot] in #2583
- docs: add release-note fragment for PR #2495 by @llm-d-router-release-notes[bot] in #2584
- Fix Data race in TestFlowControlAdmissionController_Admit by @ahg-g in #2579
- fix: prune inflight metric series on endpoint deletion by @MisterCool in #2577
- refactor(flowcontrol): derive QueueOutcome from the finalization error by @LukeAVanDrie in #2458
- Add prefixMatchInfoProducerName to inflightload README.md by @nt591 in #2599
- feat(coordinator): expose Prometheus metrics by @dmitripikus in #2435
- docs: add release-note fragment for PR #2435 by @llm-d-router-release-notes[bot] in #2615
- [disagg-sidecar] Fix cached token usage for non-streaming P/D responses by @learner0810 in #2372
- Add Bob as request lifecycle code owner by @vMaroon in #2613
- Add Nili as P2P routing code owner by @vMaroon in #2614
- check pluginType for defaults metrics source by @zetxqx in #2618
- fix(epp): preserve endpoint attributes in data-parallel profile by @yuanhuizang-cloud in #2563
- perf(epp): optimize HTTP token ID request parsing by @yankay in #2522
- docs: add release-note fragment for PR #2372 by @llm-d-router-release-notes[bot] in #2624
- Fix: Scope Endpoint Metric Cleanup by Namespace and Producer by @weizhoublue in #2602
- fix(metrics): read SGLang cache capacity from dedicated gauges by @satyamg1620 in #2619
- llm-d observability: align OpenTelemetry GenAI semconv and refactor telemetry usages by @PlateauGao in #2503
- docs: add release-note fragment for PR #2458 by @llm-d-router-release-notes[bot] in #2597
- deps(go): bump google.golang.org/grpc from 1.82.1 to 1.82.2 in the go-dependencies group by @dependabot[bot] in #2632
- docs: add release-note fragment for PR #2619 by @llm-d-router-release-notes[bot] in #2635
- feat(epp): add atomic cross-replica coordination API [Safe DisaggSet 1/4] by @hasB4K in #2570
- fix(epp): use net.JoinHostPort for fallback random endpoints by @liuyuan10 in #2607
- docs: add release-note fragment for PR #2570 by @llm-d-router-release-notes[bot] in #2646
- docs: add release-note fragment for PR #2607 by @llm-d-router-release-notes[bot] in #2647
- docs: document that endpoint discovery honours custom pod readinessGates by @almogtavor in #2604
- deps(go): bump google.golang.org/grpc from 1.82.2 to 1.83.1 by @dependabot[bot] in #2660
- fix: IPv6 address in remaining endpoint by @zdtsw in #2658
- fix(epp): reject negative maxPrefixBlocksToMatch config by @Iceber in #2656
- feat: add OpenTelemetry spans for tokenization and KV-cache event processing by @satyamg1620 in #2272
- feat(epp): support OpenAI text-to-speech requests by @xiaojun-zhang in #2484
- tracing: support OTLP/HTTP as an alternative to the gRPC exporter by @satyamg1620 in #2573
- docs: add release-note fragment for PR #2272 by @llm-d-router-release-notes[bot] in #2662
- Fix routing imbalance: deterministic tie-breaking for equal-score endpoints by @bbenshab in #2515
- chore(epp): remove dead nil check and fix comment typo in approx-prefix by @Iceber in #2655
- Enable Envoy priorities for high availability for standalone mode by @rlakhtakia in #2228
- fix(chart): allow overriding the EPP Deployment strategy so multi-replica EPP can satisfy helm --wait by @almogtavor in #2603
- docs: add release-note fragment for PR #2228 by @llm-d-router-release-notes[bot] in #2681
- approximateprefix: change block hash insertion order to tail-first by @Iceber in #2661
- docs: add release-note fragment for PR #2603 by @llm-d-router-release-notes[bot] in #2683
- fix(kind): forward Prometheus host port by @Alex-ai-future in #2654
- feat: add custom TLS support for vLLM render endpoint by @zdtsw in #2664
- fix(epp): support vLLM render endpoints started with --api-key by @Iceber in #2678
- docs: add release-note fragment for PR #2664 by @llm-d-router-release-notes[bot] in #2688
- deps(actions): bump the github-actions group with 2 updates by @dependabot[bot] in #2634
- fix(CrossReplicaSyncer): disentangle CrossReplicaSyncing interval from main ticket in PoolingDispatcher by @Lucas-Fernandes-Martins in #2310
- docs(epp): add affinity filter composition requirements by @LukeAVanDrie in #2651
- docs: add release-note fragment for PR #2678 by @llm-d-router-release-notes[bot] in #2689
- docs: add a repository contributing guide covering issue claiming by @marzmesas in #2666
- Fix(helm): Enforce Boolean Types for Priority Routing and Health Checking by @weizhoublue in #2686
- feat(epp): order all requestcontrol hooks by data-dependency DAG by @chethanuk in #2359
- refactor(kvcache): fold prefix matching into one accumulator by @nilig in #2669
- Remove deprecated UDS/legacy tokenizer code and drop llm-d-kv-cache by @satyamg1620 in #2512
- docs: use blockSizeTokens in tokenProcessorConfig samples (#641) by @chethanuk in #2705
- fix(sidecar): await prefill before dispatching PD Multi Tier decode leg by @nilig in #2451
- docs: add release-note fragment for PR #2451 by @llm-d-router-release-notes[bot] in #2711
- docs: add release-note fragment for PR #2512 by @llm-d-router-release-notes[bot] in #2703
- docs: add release-note fragment for PR #2669 by @llm-d-router-release-notes[bot] in #2700
- docs: add release-note fragment for PR #2359 by @llm-d-router-release-notes[bot] in #2691
- [ci]: Run required checks on merge_group events by @hickeyma in #2682
- [ci]: Sign published container images with actions/attest by @hickeyma in #2285
- Validate prefix cache affinity threshold bounds by @googs1025 in #2720
- fix(epp): register default producer for UncachedRequestTokens by @ambermmxChen in #2407
- docs: drop links to deleted IGW guide pages (#1863) by @chethanuk in #2704
- Point sim-epp token-producer at the render Service by @tonibofarull in #2426
- docs: add release-note fragment for PR #2407 by @llm-d-router-release-notes[bot] in #2728
- ci(trivy): bump scanner to v0.74.0 by @elevran in #2718
- Enforce ordering for configured optional dependencies by @vMaroon in #2721
- Update Kubernetes libraries to 1.36 by @hasB4K in #2733
- fix: omit unexecuted pipeline step timings by @learner0810 in #2726
- bump golang.org/x/crypto@v0.53.0 to 0.55.0 due to a critical vulnerability by @roytman in #2739
- test(sidecar): add audio and video multimodal test coverage by @dmitripikus in #2639
- docs: add coordinator metrics specification by @revit13 in #2277
- fix(request): strip min_tokens in single-token request priming by @roytman in #2593
- deps(go): bump sigs.k8s.io/structured-merge-diff/v6 from 6.4.0 to 6.4.2 in the kubernetes group by @dependabot[bot] in #2736
- deps(actions): bump crate-ci/typos from 1.50.0 to 1.50.1 in the github-actions group by @dependabot[bot] in #2737
- deps(docker): bump golang from 1.26.7 to 1.26.8 by @dependabot[bot] in #2734
- deps(go): bump the go-dependencies group across 1 directory with 3 updates by @dependabot[bot] in #2735
- docs: add release-note fragment for PR #2593 by @llm-d-router-release-notes[bot] in #2744
- docs: add release-note fragment for PR #2739 by @llm-d-router-release-notes[bot] in #2740
- feat(epp): gate DisaggregatedSet readiness on initial Pod snapshot by @hasB4K in #2576
- docs: add release-note fragment for PR #2576 by @llm-d-router-release-notes[bot] in #2745
- ci: skip gosec SARIF upload on merge_group events by @elevran in #2751
- feat(epp): coordinate DisaggregatedSet revision decisions [Safe DisaggSet 2/4] by @hasB4K in #2571
- docs: add release-note fragment for PR #2571 by @llm-d-router-release-notes[bot] in #2756
- feat(epp): add latency-observation scorer and producer by @Mohammad-nassar10 in #2371
- ci: add DCO check that runs on merge_group by @elevran in #2750
- docs: add release-note fragment for PR #2721 by @llm-d-router-release-notes[bot] in #2730
- role-aware load split for P/D disaggregation by @DolevAdas in #2396
- fix(config): auto-inject saturation detector as scheduling filter by @RishabhSaini in #1741
- docs: add release-note fragment for PR #2396 by @llm-d-router-release-notes[bot] in #2759
- docs: add release-note fragment for PR #2371 by @llm-d-router-release-notes[bot] in #2758
- fix: quote lychee glob and exclude auth-walled URLs by @chethanuk in #2754
- Enable redundant-import-alias lint rule, remove existing hits by @roytman in #2760
- [ci]: Attach SBOM to published container images by @hickeyma in #2729
- docs: describe standalone service proxy mode by @seanwestfall in #2748
- fix(charts): roll the EPP pod when its ConfigMaps change by @shimib in #2460
- feat(flowcontrol): support scoped request queue TTLs by @nt591 in #2649
- feat(flowcontrol): make stale-metrics scoring configurable by @todayim in #2492
- perf(kvcache): match prefixes over an ordered index walk by @nilig in #2680
- fix(docs): repair broken links surfaced by quoted lychee glob by @Iceber in #2764
- docs: add release-note fragment for PR #2460 by @llm-d-router-release-notes[bot] in #2768
- docs: add release-note fragment for PR #2649 by @llm-d-router-release-notes[bot] in #2769
- docs: add release-note fragment for PR #2492 by @llm-d-router-release-notes[bot] in #2770
- docs: add release-note fragment for PR #2748 by @llm-d-router-release-notes[bot] in #2767
- Add session affinity perf configurations and summary by @jtechapps in #2217
- test(kvcache): release CostAware test resources by @Alex-ai-future in #2350
- feat(epp): add OTel span to prefix cache affinity filter decisions by @sudoalok in #2594
- fix(sidecar): forward untouched request fields as raw JSON to keep key order by @rebel-jinhwan in #2591
- fix(lora-affinity): correct ActiveModels docs and remove wrong capacity by @zdtsw in #2625
- feat: emit OpenTelemetry structured JSON logs to stdout by @den-rgb in #2643
- docs: add release-note fragment for PR #2591 by @llm-d-router-release-notes[bot] in #2772
- fix(cicd): move all lychee configuration to config file by @elevran in #2776
- fix(epp): rotate only equal top-scoring endpoints in maxscore picker by @quangh33 in #2709
- refactor(sidecar): extract shared concurrent prefill/decode dispatch helper by @roytman in #2589
- docs: add release-note fragment for PR #2643 by @llm-d-router-release-notes[bot] in #2773
- Fix agentgateway image tag defaulting to the release tag by @magic-peach in #2732
- docs(metrics): clarify metric sources and Prometheus series by @zdtsw in #2747
- test(epp): add coverage for InferencePoolToEndpointPool by @magic-peach in #2710
- fix(kvevents): wait for subscriber goroutines to exit on shutdown by @quangh33 in #2717
- Validate KV cache utilization threshold bounds by @googs1025 in #2753
- chore(chart): introduce imagePullSecrets to pull from private registries by @PiePra in #2766
- Rename completionRequest to body in sidecar proxy by @cyclinder in #2775
- docs: add release-note fragment for PR #2732 by @llm-d-router-release-notes[bot] in #2781
- docs: add release-note fragment for PR #2766 by @llm-d-router-release-notes[bot] in #2785
- fix(docs): repair session affinity performance links by @zdtsw in #2782
- test: validate CPU vLLM metrics for EPP by @pazqo in #2784
- metrics: remove core legacy metric families by @JaredTan95 in #2675
- fix: preserve API type through encoder disaggregation by @JaredTan95 in #2749
- docs: add release-note fragment for PR #2675 by @llm-d-router-release-notes[bot] in #2791
- feat(sidecar): add TLS security profile flags by @andresllh in #2676
- docs(epp): update maxscore picker doc for round-robin tie-breaking by @quangh33 in #2789
- feat(chart): Gate Prometheus RBAC on authentication by @learner0810 in #2798
- test(epp): wait for metrics delivery in endpoint scores test by @Iceber in #2797
- docs: add release-note fragment for PR #2676 by @llm-d-router-release-notes[bot] in #2795
- feat(coordinator): async-broker step serving OpenAI compatible enqueue, wait, and passthrough modes by @BenjaminBraunDev in #2325
- fix(scheduling): classify unavailable endpoints by @nicole-lihui in #2631
- fix(kvcache): score unconfigured tiers zero and add storage tier weights by @Iceber in #2809
- llm-d observability: finish remaining OpenTelemetry GenAI semconv and telemetry refactoring by @PlateauGao in #2516
- docs: add release-note fragment for PR #2325 by @llm-d-router-release-notes[bot] in #2803
- docs: add release-note fragment for PR #2631 by @llm-d-router-release-notes[bot] in #2804
- docs: add release-note fragment for PR #2809 by @llm-d-router-release-notes[bot] in #2810
- fix(perf): honor tracing configuration and report scheduler p99 by @0z5a in #2725
- feat(datalayer): typed attribute slots and value-safety registry by @elevran in #2352
- feat(chart): support vLLM Rust renderer flavor for tokenizer sidecar by @Madhumasa84 in #2657
- feat(metrics): add ATOM as a built-in engine by @Jasen2201 in #2476
- perf(picker): guard debug logging to avoid hot-path reflection by @mauriciopoppe in #2806
- feature(epp): authenticate token-producer warmup probe via VLLM_API_KEY by @Iceber in #2763
- ci: assemble release notes once per tag instead of per PR merge by @elevran in #2778
- feat(helm): support structured plugin config by @hugosmoreira in #2620
- docs: add release-note fragment for PR #2725 by @llm-d-router-release-notes[bot] in #2811
- perf(tokenload): guard debug logging in TokenLoadScorer by @ishwar170695 in #2819
- feat(sidecar+coordinator): add support for HTTPS /metrics by @zdtsw in #2752
- docs: add release-note fragment for PR #2763 by @llm-d-router-release-notes[bot] in #2814
- chore: remove deprecated disagg header handlers by @amirialy in #2815
- metrics: remove predicted latency legacy metrics by @JaredTan95 in #2821
- refactor(epp): add NewExtProcServerRunner and route every caller through it (#1370) by @chethanuk in #2706
- fix(agentidentity): trim whitespace from extracted session headers by @ishwar170695 in #2818
- epp: add turn-priority strategy to program-aware fairness by @ruocco in #2116
- refactor: unify API type handling across sidecar and coordinator by @revit13 in #2743
- Honor podLabelSelector for KV-event subscriptions by @vMaroon in #2445
- apix: remove deprecated EPPConfig top-level saturationDetector and parser by @zdtsw in #2838
- chore(epp): remove deprecated precise-prefix-cache-scorer plugin by @zdtsw in #2844
- metrics: remove deprecated legacy metric series by @JaredTan95 in #2826
- Broaden the link check exclusion pattern to cover the whole
makedocumentation tree by @roytman in #2863 - chore(epp): remove deprecated by-label filter plugins by @zdtsw in #2865
- Pass native vLLM render requests through without content conversion by @vMaroon in #2707
- test(flowcontrol): stop background GC racing hand-driven GC in band test by @heliubj18 in #2845
- chore(epp): remove deprecated tokenizer plugin by @zdtsw in #2869
- fix(kvevents): wait for old subscriber to exit on endpoint change by @quangh33 in #2719
- feat(flowcontrol): fail open in concurrency detector filter when all endpoints are filtered out by @jtechapps in #2883
- Add discovery-backed vLLM render balancing by @vMaroon in #2701
- coordinator: remove unused "tokens" field from chat-completions requests by @roytman in #2842
- fix(coordinator): log pipeline step names with their durations by @etai2404 in #2882
- fix(kvevents): stop the replay test buffer from dying on a client hangup by @elevran in #2860
- ci: retire release-notes.d fragment pipeline remnants by @elevran in #2868
- fix(kvevents): validate kvEventsConfig to prevent panics by @Iceber in #2885
- Document memory sizing for the in-memory KV index cap by @magic-peach in #2880
- RHOAIENG-83718 | standardize llm-d OTel stdout logs by @den-rgb in #2813
- chore: replace body-part terms in docs, comments, and code by @zdtsw in #2712
- test(e2e): deploy router through the standalone Helm chart by @delete-cloud in #2832
- fix(epp): extract trace context from gRPC metadata by @Phil-OSophy-42 in #2830
- fix(kvevents): Fix memory leak in dedup map for precise KV cache index by @Lucas-Fernandes-Martins in #2824
- feat(coordinator): share revision decisions across phases [Safe DisaggSet 4/4] by @hasB4K in #2572
- Route cached follow-ups by remaining prefill work by @nilig in #2559
- [doc] Add release verification guide for published images by @hickeyma in #2787
- feat(coordinator): serve the inference listener over TLS by @zdtsw in #2805
- chore: correct copyright attribution across migrated and llm-d-original files by @elevran in #2450
- feat(scheduling): add endpoint attribute weight scorer by @nicole-lihui in #2204
- ci: skip DCO and release-note checks for dependabot PRs by @elevran in #2856
- Propagate EPP-resolved priority to native backend schedulers (SGLang/… by @sywangyi in #2265
- fix(sidecar): send a pod-local DP rank on the MoRI-IO concurrent-dispatch path by @shikamd123 in #2816
- fix: run the release pipeline once per tag by @apurv-1 in #2847
- deps(actions): bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.0 in the github-actions group across 1 directory by @dependabot[bot] in #2851
- docs(dataproducer): explain ProducerPlugin vs DataProducer by @chethanuk in #2894
- deps(go): bump go.opentelemetry.io/otel/sdk from 1.44.0 to 1.45.0 by @dependabot[bot] in #2915
- fix(server): reject non-positive metrics timing flags by @ptimizeroracle in #2914
- deps(go): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace from 1.44.0 to 1.45.0 by @dependabot[bot] in #2918
- [Flow Control] Support Multiple Detectors by @robertgshaw2-redhat in #2827
- feat(flowcontrol): scope max-saturation-detector children to stages by @vMaroon in #2926
New Contributors
- @yamt made their first contribution in #2405
- @muchengl made their first contribution in #2425
- @himanshu1573 made their first contribution in #2437
- @Alex-ai-future made their first contribution in #2164
- @NaomiEisen made their first contribution in #2391
- @DolevAdas made their first contribution in #2309
- @yuanhuizang-cloud made their first contribution in #2517
- @abhishekkarki made their first contribution in #2388
- @pazqo made their first contribution in #2434
- @wez470 made their first contribution in #2560
- @MisterCool made their first contribution in #2577
- @nt591 made their first contribution in #2599
- @PlateauGao made their first contribution in #2503
- @liuyuan10 made their first contribution in #2607
- @almogtavor made their first contribution in #2604
- @xiaojun-zhang made their first contribution in #2484
- @bbenshab made their first contribution in #2515
- @ambermmxChen made their first contribution in #2407
- @tonibofarull made their first contribution in #2426
- @Mohammad-nassar10 made their first contribution in #2371
- @seanwestfall made their first contribution in #2748
- @shimib made their first contribution in #2460
- @todayim made their first contribution in #2492
- @rebel-jinhwan made their first contribution in #2591
- @den-rgb made their first contribution in #2643
- @quangh33 made their first contribution in #2709
- @magic-peach made their first contribution in #2732
- @PiePra made their first contribution in #2766
- @cyclinder made their first contribution in #2775
- @JaredTan95 made their first contribution in #2675
- @0z5a made their first contribution in #2725
- @Jasen2201 made their first contribution in #2476
- @mauriciopoppe made their first contribution in #2806
- @hugosmoreira made their first contribution in #2620
- @amirialy made their first contribution in #2815
- @ruocco made their first contribution in #2116
- @heliubj18 made their first contribution in #2845
- @etai2404 made their first contribution in #2882
- @delete-cloud made their first contribution in #2832
- @sywangyi made their first contribution in #2265
- @apurv-1 made their first contribution in #2847
- @ptimizeroracle made their first contribution in #2914
Full Changelog: v0.10.0...v0.11.0