agent-platform release v4.34.1
Fixed
- The classic vLLM runtime runs its container through the llm-d template’s argument grammar, so every shipped preset serves on the classic
InferenceService path too (giantswarm/agent-platform#549). The chart’s kserve-vllm ClusterServingRuntime — the path model-manager composes into wherever the LLMInferenceService API is not served — put a preset’s arguments straight into argv, while the presets write every JSON-valued vLLM flag single-quoted inside one argument (--limit-mm-per-prompt='{"image": 1, "video": 0}', giantswarm/agent-platform#532) because the llm-d runtime template re-parses its arguments with a shell; vLLM received the single quotes literally and refused the value (invalid loads value), so the six presets with such a flag could not start on the classic path, and a bare JSON that would have worked there fails the chart’s argument guard. The runtime container now has the command /bin/sh -c 'eval "exec vllm serve $@"' -- ahead of its base arguments (modelServing.runtime.args, unchanged: --model /mnt/models --port 8080 --served-model-name {{.Name}}, KServe still expands {{.Name}} before the container starts); KServe appends the preset’s arguments after them, so $@ is base + preset and a single-quoted JSON value reaches vLLM as one word with the quotes gone — exactly as on the llm-d template, one grammar for presets. The image must carry /bin/sh and vllm on PATH (the upstream vLLM images do; an installation’s own modelServing.runtime.image must too). make verify-serving-slice now also runs the RENDERED classic command over the rendered base arguments and every shipped preset’s, with a vllm stub dumping argv, and asserts the base arguments (the {{.Name}} placeholder expanded the way KServe does, an installation’s extra ones) and the preset’s reach vLLM one word each with every JSON value parsing on both paths, so the two cannot drift again; the fixture pod of verify-model-serving-policies carries the command. Not changed: a preset’s argument rule (single-quote a value with whitespace or JSON; the render refuses the rest), the base arguments, the port, the image. - The shipped presets serve on the llm-d runtime: a JSON-valued vLLM argument is one argument with the JSON single-quoted inside it, and the chart refuses a preset argument the runtime’s shell would re-split (giantswarm/agent-platform#532; proof 1 of giantswarm/giantswarm#37639). The well-known runtime template’s entrypoint (
kserve-config-llm-template, from the kserve-runtime-configs chart) ends in eval "exec vllm serve … $@": every argument is re-parsed by the shell, so --default-chat-template-kwargs followed by {"enable_thinking": false} reached vLLM as {enable_thinking: and false} — invalid loads value, CrashLoopBackOff — and qwen3-8b-fp8 could not be served; qwen3-14b, qwen3-5-27b, qwen3-5-35b-a3b, nemotron-3-super-nvfp4 and qwen3-8-27b (three such arguments) carried the same shape. The six presets now write each such value as --flag='{…}', which the shell’s re-parse yields as one word with the JSON intact. The connectivity chart’s resolvePreset fails the render of any preset — shipped or modelServing.presets — whose argument carries whitespace, a quote or a shell metacharacter outside single quotes, naming the preset and the argument; the preset schema’s spec.args states the contract. make verify-serving-slice runs the template’s exact eval over every shipped preset’s arguments (argv dumped in place of vLLM) and asserts one word per argument and a parsing JSON value, and that seven bad argument shapes fail the render naming the guard. The classic InferenceService path gets the same grammar in giantswarm/agent-platform#549 (below).