vllm-project/vllm · error · Error
messagepack ext value decode failed: {message}
Error message
messagepack ext value decode failed: {message} What it means
Error::ExtValueDecode reports failure decoding a MessagePack extension value. Typed logprobs/structured-output payloads are encoded as MessagePack ext types; when the ext header or its payload cannot be decoded, the crate raises this variant with a free-form message (see usage in protocol/logprobs where tests assert on ExtValueDecode { message }).
Source
Thrown at rust/src/engine-core-client/src/error.rs:29
pub type Result<T> = std::result::Result<T, Error>;
/// Public error type for the Rust engine-core client.
#[derive(Debug, Error, Macro)]
pub enum Error {
#[error("messagepack encode failed for {target_type}: {message}")]
Encode {
target_type: &'static str,
message: String,
},
#[error("messagepack decode failed for {target_type}: {message}")]
Decode {
target_type: &'static str,
message: String,
},
#[error("messagepack value decode failed")]
ValueDecode(#[from] rmpv::decode::Error),
#[error("messagepack ext value decode failed: {message}")]
ExtValueDecode { message: String },
#[error("invalid structured outputs params: {message}")]
InvalidStructuredOutputsParams { message: String },
#[error("io error")]
Io(#[from] std::io::Error),
#[error("transport error")]
Transport(#[from] zeromq::ZmqError),
#[error("ZMQ runtime task failed")]
ZmqRuntimeTask(#[from] tokio::task::JoinError),
#[error("engine core reported fatal failure")]
EngineCoreDead,
#[error("startup handshake timed out while waiting for {stage} after {timeout:?}")]
HandshakeTimeout {
stage: &'static str,
timeout: Duration,
},
#[error("engine input registration timed out after {timeout:?}")]
InputRegistrationTimeout { timeout: Duration },View on GitHub (pinned to c794754062)
Solutions
- Check message — it names the specific ext decode step that failed
- Align Rust crate and vLLM engine versions so ext encodings match
- If the request did not ask for logprobs/structured outputs but got ext payloads, audit the request flags sent
- Add a regression test with the failing ext payload bytes
Defensive patterns
Strategy: try-catch
Type guard
fn is_ext_value_decode(e: &engine_core_client::Error) -> bool {
matches!(e, engine_core_client::Error::ExtValueDecode { .. })
} Try / catch
match result {
Err(e @ engine_core_client::Error::ExtValueDecode { message }) => {
tracing::warn!(message, "ext payload undecodable for this request"); // per-request failure, client stays usable
}
other => other?,
} Prevention
- Only request logprobs/structured outputs when the engine version matches the crate
- Assert on ExtValueDecode in decode tests when adding new ext payloads (see logprobs tests)
When it happens
Trigger: Decoding an engine output that embeds rmpv ext-encoded data (e.g. logprobs tensors) whose ext type tag or body does not match what the Rust decoder expects. Produced by the logprobs decoding paths exercised in protocol/logprobs/tests.rs:294-345.
Common situations: The Python engine changed how it packs a typed payload into an ext value (different type id, nesting, or endianness), or the payload is empty/garbage because the request asked for a feature the engine did not actually produce. Typically appears together with enabling logprobs or structured outputs across a version mismatch.
Related errors
- messagepack decode failed for {target_type}: {message}
- messagepack value decode failed
- messagepack encode failed for {target_type}: {message}
- unexpected startup handshake message: {message}
- unexpected output on main dispatcher path: {message}
AI-assisted analysis of vllm-project/vllm@c794754062 (2026-08-14).
Data as JSON: /api/errors/2784bbb614c40477.
Report an issue: GitHub.