vllm-project/vllm · error · ValueError

Recipe deploy_type={deploy_type!r} is not a single-node depl

Error message

Recipe deploy_type={deploy_type!r} is not a single-node deployment. A single config.yml would not fully represent this deployment.

What it means

recipe_argv() accepts a recipe's 'argv' field only for single-node deployments. If the recipe object has an 'argv' list but its deploy_type is anything other than None or 'single_node' (e.g. 'multi_node', 'ray_cluster'), the tool refuses to emit one config.yml, since a single node config cannot faithfully represent a distributed deployment.

Source

Thrown at tools/recipes/recipe_json_to_vllm_config.py:550

            #   --no-enable-prefix-caching -> no-enable-prefix-caching: true
            value: Any = True
        elif len(raw_values) == 1:
            value = coerce(raw_values[0])
        else:
            value = [coerce(v) for v in raw_values]

        merge_value(config, normalize_key(key), value)

    return config


def recipe_argv(recipe: dict[str, Any]) -> list[Any]:
    deploy_type = recipe.get("deploy_type")

    # Current Recipes API's single-node rendering exposes `argv`.
    if isinstance(recipe.get("argv"), list):
        if deploy_type not in (None, "single_node"):
            raise ValueError(
                f"Recipe deploy_type={deploy_type!r} is not a single-node deployment. "
                "A single config.yml would not fully represent this deployment."
            )
        return recipe["argv"]

    # Give a useful failure for other known rendered shapes.
    multi_process_fields = [
        k
        for k in (
            "head_argv",
            "worker_argv",
            "worker_argvs",
            "prefill",
            "decode",
            "vllm_argv",
        )
        if k in recipe
    ]

View on GitHub (pinned to c794754062)

Solutions

  1. Check jq '.deploy_type' recipe.json — if it is not single_node/None, this recipe cannot be converted by this tool
  2. Pick the single-node (usually single GPU or single node multi-GPU) hardware rendering for the model instead
  3. For multi-node recipes, follow the Recipes API's own deployment instructions rather than generating config.yml
  4. If you truly have a single-node deployment mislabeled in the JSON, fix deploy_type in the recipe

Example fix

# before
{"deploy_type": "multi_node", "argv": ["vllm","serve","m","--tp","8"]}
# after
{"deploy_type": "single_node", "argv": ["vllm","serve","m","--tp","8"]}
Defensive patterns

Strategy: validation

Validate before calling

dt = recipe.get("deploy_type")
if "argv" in recipe and dt not in (None, "single_node"):
    raise SystemExit(f"deploy_type={dt!r} cannot be converted to one config.yml")

Type guard

def is_single_node_recipe(recipe: dict) -> bool:
    return recipe.get("deploy_type") in (None, "single_node") and isinstance(recipe.get("argv"), list)

Prevention

When it happens

Trigger: Passing a recipe JSON whose deploy_type is multi-node/multi-process but which still carries an 'argv' field (some renderings include a representative head-node argv). The converter checks deploy_type first and fails fast.

Common situations: Selecting a multi-node recipe (e.g. Ray or deep-seek style P/D deployments) from the Recipes API; hand-passing a cluster recipe file to a tool explicitly designed for single config.yml generation.

Related errors


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