vllm-project/vllm · error · Error

cannot continue the final message when the last message is…

Error message

cannot continue the final message when the last message is not from the assistant

What it means

The pynccl EPLB path requires a healthy PyNCCL communicator on the device group (pynccl_comm exists, is not disabled, and reports available). One of those conditions failed, so the requested backend cannot be used.

Solutions

  1. Verify device group init succeeded and pynccl was not disabled (check startup logs for pynccl initialization lines)
  2. Use backend='torch_nccl', which uses torch.distributed NCCL instead of PyNCCL
  3. Reinstall a vLLM build that includes the pynccl extension if logs show it failed to load

Example fix

# before
backend = "pynccl"  # pynccl disabled in this process

# after
backend = "torch_nccl"
Defensive patterns

Strategy: validation

Validate before calling

comm = group_coordinator.device_communicator
pynccl = getattr(comm, 'pynccl_comm', None) if comm else None
usable = pynccl is not None and not pynccl.disabled and pynccl.available
backend = 'pynccl' if usable else 'torch_nccl'

Prevention

When it happens

Trigger: Creating the pynccl EPLB communicator when vLLM was started with VLLM_USE_V1/or config paths that disable pynccl, when the pynccl build was unavailable at group init, or on platforms where the pynccl extension did not load.

Common situations: Custom builds without the pynccl extension; a distributed init path that never created device_communicator.pynccl_comm; the pynccl comm was disabled via config because another backend owns NCCL.

Related errors


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

Appendix: source

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

// 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}`")]
    ParserUnavailableForModel {
        kind: &'static str,

View on GitHub (pinned to c794754062)