langchain-ai/langgraph · error · ValueError

{ch!r} is not a valid interleave_projections channel{hint}.

Error message

{ch!r} is not a valid interleave_projections channel{hint}. Supported channels: {', '.join(SUPPORTED_INTERLEAVE_CHANNELS)}, or an extension name.

What it means

Error "{ch!r} is not a valid interleave_projections channel{hint}. Supported channels: {', '.join(SUPPORTED_INTERLEAVE_CHANNELS)}, or an extension name." thrown in langchain-ai/langgraph.

Source

Thrown at libs/sdk-py/langgraph_sdk/stream/decoders.py:45

#: to the extension/``custom:`` fallback would subscribe to a channel that never
#: matches and silently yield nothing, so they are rejected up front (fail
#: closed). ``lifecycle`` is control-plane (drives run output/interrupt); ``tools``
#: is the wire alias for the public ``tool_calls`` channel.
RESERVED_INTERLEAVE_CHANNELS = frozenset({"lifecycle", "tools", "input"})


def validate_interleave_channels(channels: list[str]) -> None:
    """Reject reserved protocol channel names before they hit the fallback.

    Genuine extension names pass through untouched; only names that
    ``infer_channel`` treats as built-in methods without an interleave decoder
    are rejected, so a typo'd or unsupported protocol channel surfaces an error
    instead of an empty stream.
    """
    for ch in channels:
        if ch in RESERVED_INTERLEAVE_CHANNELS:
            hint = ' (use "tool_calls")' if ch == "tools" else ""
            raise ValueError(
                f"{ch!r} is not a valid interleave_projections channel{hint}. "
                f"Supported channels: {', '.join(SUPPORTED_INTERLEAVE_CHANNELS)}, "
                "or an extension name."
            )


def _event_namespace(params_field: Any) -> list[str]:
    if not isinstance(params_field, dict):
        return []
    namespace = params_field.get("namespace") or []
    return list(namespace) if isinstance(namespace, list) else []


def _message_event_id(data: dict[str, Any]) -> str | None:
    message_id = data.get("id") or data.get("message_id")
    return str(message_id) if message_id is not None else None

View on GitHub (pinned to 38031739e5)

When it happens

Trigger: Thrown at libs/sdk-py/langgraph_sdk/stream/decoders.py:45 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of langchain-ai/langgraph@38031739e5 (2026-08-26). Data as JSON: /api/errors/4e4bce1d1b75edcd. Report an issue: GitHub.