{"record":{"id":"49b870acd36821db","repo":"vllm-project/vllm","slug":"this-recipe-is-a-multi-process-deployment-and-cann","errorCode":null,"errorMessage":"This recipe is a multi-process deployment and cannot be represented by one config.yml. Found fields: {', '.join(multi_process_fields)}","messagePattern":"This recipe is a multi-process deployment and cannot be represented by one config\\.yml\\. Found fields: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"tools/recipes/recipe_json_to_vllm_config.py","lineNumber":570,"sourceCode":"                \"A single config.yml would not fully represent this deployment.\"\n            )\n        return recipe[\"argv\"]\n\n    # Give a useful failure for other known rendered shapes.\n    multi_process_fields = [\n        k\n        for k in (\n            \"head_argv\",\n            \"worker_argv\",\n            \"worker_argvs\",\n            \"prefill\",\n            \"decode\",\n            \"vllm_argv\",\n        )\n        if k in recipe\n    ]\n    if multi_process_fields:\n        raise ValueError(\n            \"This recipe is a multi-process deployment and cannot be represented \"\n            \"by one config.yml. Found fields: \" + \", \".join(multi_process_fields)\n        )\n\n    raise ValueError(\"Recipe JSON does not contain an `argv` field\")\n\n\ndef write_config(\n    path: str,\n    source: str,\n    recipe: dict[str, Any],\n    config: dict[str, Any],\n) -> None:\n    metadata = [\n        \"# Generated from vLLM Recipes JSON.\",\n        f\"# Source: {source}\",\n    ]\n    for key in (\"hardware\", \"strategy\", \"variant\", \"deploy_type\"):","sourceCodeStart":552,"sourceCodeEnd":588,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/tools/recipes/recipe_json_to_vllm_config.py#L552-L588","documentation":"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.","triggerScenarios":"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'.","commonSituations":"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.","solutions":["jq the recipe for the listed fields to confirm which process roles it renders","Select a single-process rendering of the same model (different --hardware/--strategy choice, or a single_node recipe)","Deploy multi-process recipes using the Recipes API instructions or head/worker argvs directly instead of config.yml"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"MULTI = {\"head_argv\", \"worker_argv\", \"worker_argvs\", \"prefill\", \"decode\", \"vllm_argv\"}\nfound = MULTI & set(recipe)\nif found:\n    raise SystemExit(f\"multi-process recipe, fields: {sorted(found)}\")","typeGuard":"def is_single_process_recipe(recipe: dict) -> bool:\n    MULTI = {\"head_argv\", \"worker_argv\", \"worker_argvs\", \"prefill\", \"decode\", \"vllm_argv\"}\n    return isinstance(recipe.get(\"argv\"), list) and not (MULTI & set(recipe))","tryCatchPattern":null,"preventionTips":["Check the recipe's process-role fields before conversion","Choose non-disaggregated hardware/strategy renderings when you need config.yml output"],"tags":["vllm-recipes","multi-process","prefill-decode","deploy-type"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}