vllm-project/vllm · error · ValueError

This recipe is a multi-process deployment and cannot be repr

Error message

This recipe is a multi-process deployment and cannot be represented by one config.yml. Found fields: {', '.join(multi_process_fields)}

What it means

The recipe has no 'argv' field, but contains one of the known multi-process field names: head_argv, worker_argv, worker_argvs, prefill, decode, or vllm_argv. Such recipes describe multi-process deployments (head/worker split or prefill/decode disaggregation) that cannot be captured in a single config.yml, so the tool names the offending fields and aborts.

Source

Thrown at tools/recipes/recipe_json_to_vllm_config.py:570

                "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
    ]
    if multi_process_fields:
        raise ValueError(
            "This recipe is a multi-process deployment and cannot be represented "
            "by one config.yml. Found fields: " + ", ".join(multi_process_fields)
        )

    raise ValueError("Recipe JSON does not contain an `argv` field")


def write_config(
    path: str,
    source: str,
    recipe: dict[str, Any],
    config: dict[str, Any],
) -> None:
    metadata = [
        "# Generated from vLLM Recipes JSON.",
        f"# Source: {source}",
    ]
    for key in ("hardware", "strategy", "variant", "deploy_type"):

View on GitHub (pinned to c794754062)

Solutions

  1. jq the recipe for the listed fields to confirm which process roles it renders
  2. Select a single-process rendering of the same model (different --hardware/--strategy choice, or a single_node recipe)
  3. Deploy multi-process recipes using the Recipes API instructions or head/worker argvs directly instead of config.yml
Defensive patterns

Strategy: validation

Validate before calling

MULTI = {"head_argv", "worker_argv", "worker_argvs", "prefill", "decode", "vllm_argv"}
found = MULTI & set(recipe)
if found:
    raise SystemExit(f"multi-process recipe, fields: {sorted(found)}")

Type guard

def is_single_process_recipe(recipe: dict) -> bool:
    MULTI = {"head_argv", "worker_argv", "worker_argvs", "prefill", "decode", "vllm_argv"}
    return isinstance(recipe.get("argv"), list) and not (MULTI & set(recipe))

Prevention

When it happens

Trigger: Passing a disaggregated (P/D) or head/worker recipe JSON to the converter; these shapes are rendered for distributed setups and intentionally lack a unified 'argv'.

Common situations: Fetching the wrong hardware/strategy variant from the Recipes API (e.g. a disagg prefill recipe) and feeding it to the single-config converter; schema additions where the API renders per-process argvs by default.

Related errors


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