vllm-project/vllm · error · Error

chat request must contain at least one message

Error message

chat request must contain at least one message

What it means

PyNCCL EPLB transfers require every expert-weight dtype to be mappable to an ncclDataType. At least one dtype in the first MoE layer (listed in the message) is not supported by NCCL collectives, e.g. int8 metadata tensors or exotic quantized dtypes.

Source

Thrown at rust/src/chat/src/error.rs:12

// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright contributors to the vLLM project

use thiserror::Error;
use thiserror_ext::{AsReport as _, Macro};

type BoxedError = Box<dyn std::error::Error + Send + Sync>;

#[derive(Debug, Error, Macro)]
#[thiserror_ext(macro(path = "crate::error"))]
pub enum Error {
    #[error("chat request must contain at least one message")]
    EmptyMessages,
    #[error("cannot continue the final message when the last message is not from the assistant")]
    ContinueFinalAssistantWithoutFinalAssistant,
    #[error("chat template is required but none was configured")]
    MissingChatTemplate,
    #[error("chat template error: {0}")]
    ChatTemplate(String),
    #[error("multimodal input is not supported by this chat renderer")]
    UnsupportedMultimodalRenderer,
    #[error("unsupported multimodal content: {0}")]
    UnsupportedMultimodalContent(&'static str),
    #[error("`{modality}` input is not supported by this model")]
    UnsupportedModality { modality: String },
    #[error("At most {limit} {modality}(s) may be provided in one prompt.")]
    MmLimitExceeded { modality: String, limit: usize },
    #[error("multimodal preprocessing error: {0}")]
    Multimodal(#[message] String),
    #[error("{kind} parsing is not available for model `{model_id}`")]

View on GitHub (pinned to c794754062)

Solutions

  1. Check the dtype list in the error message and separate non-transferable metadata tensors out of expert_weights
  2. Use BF16/FP16/FP8 expert weights, which NCCL supports, when using the pynccl backend
  3. Switch to the 'nixl' backend, which transfers raw bytes and is dtype-agnostic
Defensive patterns

Strategy: validation

Validate before calling

from vllm.distributed.device_communicators.pynccl_wrapper import ncclDataTypeEnum
bad = [str(t.dtype) for layer in expert_weights[:1] for t in layer if not ncclDataTypeEnum.supports_torch_dtype(t.dtype)]
assert not bad, f'pynccl cannot transfer dtypes: {bad}'

Prevention

When it happens

Trigger: Constructing the pynccl EPLB communicator over expert weights that include tensors with dtypes NCCL cannot express (some 8-bit/4-bit quantized types, or non-standard packed types).

Common situations: Heavily quantized MoE checkpoints where scale/zero-point tensors ride alongside weights in the same list; new quant formats not yet wired into ncclDataTypeEnum.supports_torch_dtype.

Related errors


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