Skip to content

fix: declare Rust 1.88 as the MSRV and check it in CI (#377) - #379

Merged
haoshan98 merged 2 commits into
vllm-project:mainfrom
Zheng-Lu:fix/377-msrv
Oct 12, 2026
Merged

haoshan98 merged 2 commits into
vllm-project:mainfrom
Zheng-Lu:fix/377-msrv

Conversation

@Zheng-Lu

@Zheng-Lu Zheng-Lu commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Fixes #377, taking option 1 from the issue: raise the declared MSRV to what the locked dependencies need.

The documented MSRV was 1.85, but nothing declared or checked it, and the committed Cargo.lock needs more:

  • The default build needs 1.88: idna_adapter 1.2.2 needs 1.86, process-wrap 9 (for rmcp's stdio MCP transport) needs 1.87, and home 0.5.12 and icu_* 2.3 need 1.88.
  • The embedded-code-interpreter feature (feat: support code interpreter as gateway execution tool #368) needs 1.98.1: eryx 0.8.0 declares it, and wasmtime and cranelift 48 need 1.95. rust-toolchain.toml is already pinned to 1.98.1 for that feature.

Cargo expects rust-version to cover every feature, so the MSRV is 1.98.1:

  • rust-version = "1.98.1" in [workspace.package], inherited by every crate, so older toolchains fail with a clear message. clippy.toml's msrv matches it.
  • A new msrv CI job reads rust-version and fails if clippy.toml differs. It prepares the Eryx runtime, because the eryx build script needs it, then runs cargo check --workspace --all-targets --all-features --locked on that toolchain.
  • Every workflow toolchain pin is now 1.98.1. Jobs pinned to 1.98.0 had been running 1.98.1 only because rust-toolchain.toml overrode them.
  • The container now builds on cargo-chef 0.1.78 with Rust 1.98.1. It had been building with 1.96.0, because the image doesn't copy rust-toolchain.toml, so the new MSRV would have rejected it. cargo-chef publishes Rust 1.98 images only from 0.1.78.
  • The clippy suggestions enabled by the new MSRV are applied in a separate commit: if let chains, is_none_or, as_chunks, Duration::from_mins and is_multiple_of. No behavior changes.
  • The MSRV is updated in AGENTS.md, the README badge, the getting-started and container docs, and the embedded code interpreter design doc. That doc now says the toolchain pin and the MSRV are both 1.98.1. The provider-aware reasoning design doc no longer says an MSRV repair is pending.
  • The observability docs, OtlpProtocol and the unsupported-protocol startup error no longer blame the MSRV for the missing gRPC exporter. The error used to say "gRPC is unavailable below Rust 1.88"; it now says the exporter is not compiled in, matching the zstd compression error.
  • The website's copy of the observability page is a release snapshot that refresh-site-docs.mjs regenerates, so it is left for the next refresh.

Test Plan

# With the Eryx runtime prepared (./scripts/setup-eryx-runtime.sh):
cargo +1.98.1 check --workspace --all-targets --all-features --locked   # passes
cargo +1.98.0 check --workspace --locked                                 # refused: "agentic-* requires rustc 1.98.1"
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings   # clean with msrv = "1.98.1"
cargo clippy --workspace --all-targets --locked -- -D warnings                  # clean (default features)
cargo fmt -- --check
cargo test --workspace --locked                                          # 2281 passed, 1 failed, 18 ignored (see below)
uvx pre-commit run --from-ref upstream/main --to-ref HEAD               # includes the file-size ratchet
uvx --with-requirements docs/requirements.txt mkdocs build --strict
  • Without the Eryx runtime, the all-features check stops in eryx's build script ("Pre-compiled runtime (runtime.cwasm) not found"). The msrv job prepares the runtime the same way the embedded-code-interpreter job does, and shares its cache key.
  • The one test failure is web_fetch::http::tests::the_deadline_bounds_a_slow_origin. It fails the same way on unmodified main under the full suite and passes on its own; this PR doesn't touch web_fetch.
  • I dry-ran the job's version-reading step locally: both files read 1.98.1.
  • Container: on the old base (cargo-chef 0.1.77, Rust 1.96.0), cargo chef cook is refused with "rustc 1.96.0 is not supported … requires rustc 1.98.1". On the new base, the Rust build stage completes, and both binaries run (agentic-server 0.9.0). My local Docker has no BuildKit, so CI's image build covers the later COPY --chmod step.
  • Default features alone would still build on 1.88. On main at 2026-09-30, cargo +1.88.0 check --workspace --all-targets --locked passed, and on today's main every locked dependency outside eryx's tree still declares at most 1.88. The MSRV follows Cargo's expectation that rust-version covers every feature.
  • Rebased onto main 8b27941. The clippy autofix commit was redone against current main. ci: reduce duplicate builds and tests #427 removed the provider-upstream job, so that job's toolchain pin is gone too.

Merging alongside #375

#375 (#340) also edits .github/workflows/rust.yml; whichever lands second keeps both changes. Under msrv = "1.98.1", #375 must also pass clippy, which may need the same mechanical autofixes.

@Zheng-Lu Zheng-Lu changed the title Fix/377 msrv fix: declare Rust 1.88 as the MSRV and check it in CI (#377) Sep 25, 2026
haoshan98 added a commit that referenced this pull request Sep 30, 2026
## Summary

Several user-facing docs had fallen behind `main` or contradicted each
other and the code. This PR brings them in line with what has shipped.
It changes documentation only.


**Corrected claims**
- README listed the Messages API as "🚧 Planned" while another README
section documents `/v1/messages`. It is now listed as shipped; only
stateful Messages stays planned.
- README and `docs/index.md` advertised "Background execution" and
gateway-executed file search. Neither exists yet: background mode is
#357, and `file_search` declarations parse but are dropped before
inference (`tool/normalize.rs`). Both claims are removed.
- `docs/api/index.md` quoted fixed WebSocket and executor limits (256
KiB SSE lines, 1 MiB events and response budget). These now come from
the configurable `[responses]` settings, which default to 16 MiB and 8
MiB.
- `docs/api/index.md` listed only some of the conditions that route a
Responses request through the executor. The list now also includes
non-function tools, `multi_agent.enabled`, and tool-search state,
matching `handler/http/responses.rs`.
- CHANGELOG listed Tavily under 0.8.0, but it merged on Sep 28, after
the Sep 19 release. The two Tavily entries move to `[Unreleased]`.

**Newly documented features**
- README: a multi-agent Responses section with an example and the
gateway's limits (`store: true`, HTTP/SSE only, default of 3 concurrent
subagents, no `max_tool_calls` or reasoning summaries). Also new rows in
the API table for `/v1/responses/compact`, the full Conversations
routes, `/v1/messages` with `/v1/messages/count_tokens`, and
Swagger/OpenAPI (`ENABLE_OPENAPI_DOCS`). The features list, diagram, and
tool ownership table now include MCP, the code interpreter, Claude Code,
compaction, and OpenTelemetry.
- `docs/api/index.md`: new sections for `GET
/v1/responses/{response_id}`, multi-agent, Conversations, and Messages.
- CHANGELOG `[Unreleased]` was empty. It now has entries for #345, #347,
#349, #351/#370, #354, #368, #369, #372/#373, #380, and #387.

**Roadmap**
- ROADMAP.md marks multi-agent HTTP execution as shipped, with WebSocket
injection (#300) and stateless requests (#393) still open. It adds a
status note for Messages, a code interpreter entry, and a file search
item linking #34 and #356.
- README "Roadmap at a Glance" checks off Messages and Conversations and
adds unchecked items for multi-agent, file search, and stateful
Messages.

**Smaller fixes**
- The repository layout in README and AGENTS.md now lists
`agentic-llm-d`, `agentic-cli-docs`, and `python/agentic_api/`.
- ARCHITECTURE.md's list of multi-agent rejections now includes
`max_tool_calls`, matching `executor/rehydrate.rs`.
- `mkdocs.yaml` adds the existing but unlinked `design/shell-tool.md` to
the nav.

**Not changed:** the README's "Rust 1.85+" badge is wrong (1.85 cannot
build the lockfile, see #377), but #379 already updates it to 1.88 along
with `rust-version` and a CI check, so this PR leaves it alone to avoid
a conflict.

Signed-off-by: haoshan98 <haoshanw@gmail.com>
Comment thread Cargo.toml Outdated
Raise clippy's msrv to 1.98.1 and apply the suggestions it enables:
collapsed `if let` chains, `Option::is_none_or`, `slice::as_chunks`,
`Duration::from_mins`, and `is_multiple_of`. No behavior change.

Signed-off-by: Zheng Lu <Lz429671594@gmail.com>
The documented MSRV was 1.85, but nothing declared or checked it, and
the locked dependencies have long needed more: the default build needs
1.88, and eryx 0.8, behind the embedded-code-interpreter feature,
declares 1.98.1 (wasmtime and cranelift 48 need 1.95). The checked-in
toolchain is already pinned to 1.98.1 for that feature.

- Declare rust-version = "1.98.1" in [workspace.package] and inherit it
  in every crate, so older toolchains fail with a clear message.
- Add an msrv CI job that reads rust-version, fails if clippy.toml's msrv
  differs, prepares the Eryx runtime, and runs cargo check --workspace
  --all-targets --all-features --locked on that toolchain.
- Pin every workflow toolchain to 1.98.1 instead of relying on the
  rust-toolchain.toml override of 1.98.0.
- Build the container on cargo-chef 0.1.78 with Rust 1.98.1; the image
  does not copy rust-toolchain.toml, so it built with 1.96.0.
- Update AGENTS.md, the README badge, and the getting-started, container,
  observability, embedded code interpreter, and provider-aware reasoning
  docs. The OTLP/gRPC exporter is no longer excluded by the MSRV, so the
  docs and the unsupported-protocol startup error now say only that it
  is not compiled in.

Fixes vllm-project#377

Signed-off-by: Zheng Lu <Lz429671594@gmail.com>
@Zheng-Lu

Zheng-Lu commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto main 8b27941 and force-pushed (2dce11f).

  • The clippy autofix commit is redone against current main at msrv = "1.98.1". It now covers 34 files, all mechanical.
  • ci: reduce duplicate builds and tests #427 changed the workflows: I kept its new toolchain components lists with the pins at 1.98.1, and its removal of the provider-upstream job stands.
  • main brought two more places that cite the old MSRV, both now updated. The unsupported-protocol startup error said "gRPC is unavailable below Rust 1.88"; it now says the exporter is not compiled in, and its test asserts that. The provider-aware reasoning design doc said an MSRV repair was still needed.
  • The website copy of the observability page still has the old wording, because it is a release snapshot regenerated by refresh-site-docs.mjs.

Checks: cargo +1.98.1 check --workspace --all-targets --all-features --locked passes with the Eryx runtime prepared, and cargo +1.98.0 is refused for every workspace crate. Clippy with all features and with defaults, fmt, the size ratchet, pre-commit and mkdocs build --strict pass. Workspace tests: 2,281 passed. The only failure is web_fetch's the_deadline_bounds_a_slow_origin, which fails the same way on unmodified main and passes on its own.

@haoshan98 haoshan98 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for keeping this up, lgtm.

@haoshan98
haoshan98 merged commit 079a9a3 into vllm-project:main Oct 12, 2026
36 of 38 checks passed
@Zheng-Lu
Zheng-Lu deleted the fix/377-msrv branch October 12, 2026 19:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Documented MSRV 1.85 does not build: Cargo.lock requires Rust 1.86–1.88

2 participants