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

  1. Check message — it names the specific ext decode step that failed
  2. Align Rust crate and vLLM engine versions so ext encodings match
  3. If the request did not ask for logprobs/structured outputs but got ext payloads, audit the request flags sent
  4. 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

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


AI-assisted analysis of vllm-project/vllm@c794754062 (2026-08-14). Data as JSON: /api/errors/2784bbb614c40477. Report an issue: GitHub.