{"record":{"id":"1a5f1008269b3360","repo":"vllm-project/vllm","slug":"recipe-json-does-not-contain-an-argv-field","errorCode":null,"errorMessage":"Recipe JSON does not contain an `argv` field","messagePattern":"Recipe JSON does not contain an `argv` field","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"tools/recipes/recipe_json_to_vllm_config.py","lineNumber":575,"sourceCode":"    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\"):\n        if recipe.get(key) is not None:\n            metadata.append(f\"# {key}: {recipe[key]}\")\n\n    body = yaml.safe_dump(\n        config,","sourceCodeStart":557,"sourceCodeEnd":593,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/tools/recipes/recipe_json_to_vllm_config.py#L557-L593","documentation":"recipe_argv() found neither an 'argv' field nor any of the known multi-process fields (head_argv, worker_argv, worker_argvs, prefill, decode, vllm_argv). The JSON object is structurally valid but uses a schema the converter does not recognize at all, so it fails with the generic 'no argv field' error.","triggerScenarios":"Recipe JSON from a future/older API version with a renamed command field (e.g. 'command', 'cli', 'rendered'); a minimal test fixture containing only metadata; passing an unrelated JSON object (e.g. a models.json entry) as the source.","commonSituations":"API schema drift; passing the wrong JSON file (model JSON instead of the per-hardware recipe); hand-authored JSON missing the command rendering.","solutions":["jq 'keys' recipe.json to see which command field it actually has","If a command-like field exists under another name, either rename it to 'argv' locally or update the vllm checkout for the new schema","Make sure you passed the per-hardware recipe JSON (the one with argv/recommended_command), not the model-level JSON","If the API legitimately changed schema, extend recipe_argv() to recognize the new field"],"exampleFix":"# before\n{\"command\": [\"vllm\",\"serve\",\"m\"]}\n# after\n{\"argv\": [\"vllm\",\"serve\",\"m\"]}","handlingStrategy":"validation","validationCode":"if \"argv\" not in recipe:\n    raise SystemExit(f\"recipe keys: {sorted(recipe)} — no 'argv'; wrong file or schema?\")","typeGuard":"def has_argv(recipe: dict) -> bool:\n    return isinstance(recipe.get(\"argv\"), list)","tryCatchPattern":null,"preventionTips":["Confirm you are passing the per-hardware recipe JSON, not a model or listing JSON","Assert the expected schema keys in test fixtures for recipe files"],"tags":["vllm-recipes","schema-drift","argv-parsing"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}