{"record":{"id":"e37386730846fe2b","repo":"mudler/LocalAI","slug":"ds4-worker-model-is-required","errorCode":null,"errorMessage":"ds4-worker: --model is required\n","messagePattern":"ds4-worker: --model is required\n","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/cpp/ds4/worker_main.c","lineNumber":104,"sourceCode":"            opt.n_threads = parse_int_arg(need_arg(&i, argc, argv, arg), arg);\n        } else if (!strcmp(arg, \"--cpu\")) {\n            opt.backend = DS4_BACKEND_CPU;\n        } else if (!strcmp(arg, \"--cuda\")) {\n            opt.backend = DS4_BACKEND_CUDA;\n        } else if (!strcmp(arg, \"--metal\")) {\n            opt.backend = DS4_BACKEND_METAL;\n        } else {\n            fprintf(stderr, \"ds4-worker: unknown option: %s\\n\", arg);\n            return 2;\n        }\n    }\n\n    if (opt.distributed.role != DS4_DISTRIBUTED_WORKER) {\n        fprintf(stderr, \"ds4-worker: --role worker is required\\n\");\n        return 2;\n    }\n    if (!opt.model_path) {\n        fprintf(stderr, \"ds4-worker: --model is required\\n\");\n        return 2;\n    }\n\n    char prep_err[256] = {0};\n    if (ds4_dist_prepare_engine_options(&opt.distributed, &opt,\n                                        prep_err, sizeof(prep_err)) != 0) {\n        fprintf(stderr, \"ds4-worker: %s\\n\", prep_err);\n        return 2;\n    }\n\n    ds4_engine *engine = NULL;\n    if (ds4_engine_open(&engine, &opt) != 0 || !engine) {\n        fprintf(stderr, \"ds4-worker: failed to open engine\\n\");\n        return 1;\n    }\n\n    ds4_dist_generation_options gen = {0};\n    gen.ctx_size = ctx_size;","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/mudler/LocalAI/blob/44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26/backend/cpp/ds4/worker_main.c#L86-L122","documentation":"Second post-parse invariant in ds4-worker: opt.model_path must be set (the worker loads only its --layers slice of the GGUF, but it still needs the file). Missing -m/--model exits with status 2 before engine open.","triggerScenarios":"'ds4-worker --role worker --layers 8' with no -m; or -m consumed by a typo'd variant like --model-path (which instead triggers unknown-option).","commonSituations":"Distributed templates where each worker gets host/port/layers env-vars but the model path variable is empty; shared-storage assumptions (model on NFS only on some nodes).","solutions":["Pass '-m /path/to/model.gguf' pointing at a file readable by this worker.","Verify the path exists on THIS node (shared volume mounted) before launch: test -f \"$MODEL\".","Parameterize the model path in your launcher so every worker replica receives it."],"exampleFix":"# before\nds4-worker --role worker --layers 8\n\n# after\nds4-worker --role worker --layers 8 -m /shared/ds4.gguf","handlingStrategy":"validation","validationCode":"# launcher invariant: model file must exist and be non-empty before exec\n[ -n \"$MODEL\" ] && [ -f \"$MODEL\" ] && [ -s \"$MODEL\" ] || { echo \"--model path missing/empty: $MODEL\" >&2; exit 2; }\nexec ds4-worker --role worker -m \"$MODEL\" \"$@\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Parameterize the model path in every worker replica template and assert it is set.","With shared storage, verify the mount exists on the worker node (not just the launcher) before start."],"tags":["c","ds4","cli","usage-error","distributed"],"backgroundTag":null,"analyzedSha":"44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26","analyzedAt":"2026-08-15T10:13:50.291Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}