Repository navigation
Releases: coder/llm-helper
Releases · coder/llm-helper
Release list
dev (main)
v0.5.0
Added
- Built-in docs.
vllm-helper servenow has a Docs tab with a quickstart, the profile and memory knobs, the Coder integration, and a CLI reference generated from the command tree. The pages come fromdocs/, which stays readable on GitHub. - Public docs site.
cmd/vllm-helper-docsserves the same pages without the panel. It also serves each page's Markdown source,/llms.txt,/llms-full.txtand a sitemap.Dockerfile.docsdeploys it on Railway. It is a separate binary, sovllm-helperitself gains no unauthenticated routes. - Recipes: launch configurations that were run and measured, not inferred. Each one pins the model, the image (by digest), the exact argv, and the numbers it produced on named hardware.
recipes listandrecipes showsay where every setting came from.recipes launchstarts containers over SSH on the nodes you name; a recipe can span machines. It writes a profile of the same name and points Coder at what is serving, so the picker and the server always agree. Then it watches the load, likeswitchdoes.recipes stopremoves the containers.recipes install-serviceinstalls a unit that keeps the active recipe serving, plus a timer that relaunches it when the endpoint stops answering.- It stands down the native unit, which can't serve a container.
- It waits while a launch is in flight, so a loading model isn't mistaken for an outage and replaced with the previous profile.
- A deliberate
stoporsystemctl stopstays stopped.
- The web panel shows a recipe's health and log, but its buttons don't drive recipes yet; use the CLI.
- Runner-aware commands.
status,logs,restartandstopact on whatever is actually serving. They used to assume the init-system service. That made them report systemd as healthy while a container served, or print "Stopped vllm.service" for a two-node cluster. - Clean switches. Switching between a recipe and a native profile stops the one being left, so it frees the GPUs and port.
- Declared deviations. A recipe records each difference from its upstream recipe as data: the setting, upstream's value, ours, and why.
tools/recipediffreports any undeclared difference. It compares content, not commit ids, so a pin that only trails upstream isn't reported as drift. - More than one machine.
node addregisters a machine once, by the URL it serves on and its SSH target.pool,shardandrecipes launchthen refer to it by name.pool serveputs a router in front of replicas of one model and keeps each conversation on the node that already has its prefix cached.pool install-serviceruns the router as a unit.shard startsplits one model across machines with Ray or vLLM's multiprocessing executor, for trying a split before a recipe exists.shard install-rayprepares the nodes.spark doctorandspark install-prereqshandle the build packages a DGX Spark needs.
Changed
- Coder entries are matched by model, not profile name. A renamed profile, or a second machine serving the same model, now adopts the existing entry instead of adding a duplicate row to the picker.
doctorwarns when the Coder token is within two days of expiring. An expired token silently stops picker updates.- New setting
CODER_MAX_OUTPUT_TOKENS. It raises Coder's server-side reply cap for this machine's models. If it's unset, nothing is sent and Coder's own setting stays.
v0.4.0
Added
- A web panel,
vllm-helper serve: what's loaded and whether it's serving,
memory in use against what this machine can give a model, the saved profiles
with a switch button, and the server log. It can also search HuggingFace and
add or remove models, measuring a result against this machine before saving.
Control plane only — inference goes straight to vLLM. Localhost and a token
unless--listensays otherwise. - Choosing which quantization to serve, for GGUF repos that ship several:
new --quant Q8_0, a prompt insearch, a dropdown in the panel. Saved as
MODEL=repo:QUANTwith the--tokenizersuch a model needs. install-ggufinstalls the plugin vLLM now needs to read GGUF at all, into
the interpreter that owns the configured vLLM. Applies from the next switch.upgradereplaces the binary from a published release, checked against the
release's checksum.--checkreports without installing.- A dev channel:
upgrade --channel devfollows a build ofmainfrom every
commit that passes CI;--channel stablereturns to tagged releases. - macOS (Apple Silicon): launchd, memory from
sysctl,doctorchecks the
cmake/ninja/clang toolchain withbrewhints. stop,restart,logs,inspect,edit, andset KEY=VALUE.switch,new, andrestartwatch the boot, report when the model is
actually serving, and fail fast on a crash loop.--wait,--no-follow,
--timeout.--jsonforstatus,list,search, anddoctor.coder-sync pruneclears Coder entries for models this machine can't serve.
Reports by default, deletes with--yes.CODER_ORGANIZATION, for Coder deployments with more than one.versionprints the commit, which is what tells two dev builds apart.doctorverifies Coder and HuggingFace credentials against their APIs.
Changed
- Long flags need two dashes. The old parser also accepted
-json; the new
one reads that as a bundle of short flags.logs -nstill works. - An argument too many is an error instead of being dropped, so
vllm-helper status runingfails rather than reporting on something else. - The KV cache is sized for the model being served instead of taking whatever
vLLM finds left over. Every profile carriedGPU_MEMORY_UTILIZATION=0.85, and
that fraction is what decided the cache: a 1.1 GB model took 101.77 GiB of it.
New profiles getKV_CACHE_MEMORY_BYTES, computed from the model's attention
shape andKV_CONTEXT_TARGETfull contexts (four by default), and
--gpu-memory-utilizationbecomes a ceiling rather than the cache size.
Existing profiles are untouched. A profile written here names a flag older
vLLM builds don't have. - The model budget is measured from the machine rather than fixed at 70% of
unified memory or 80% of VRAM, both of which were invented — on a 128 GB
machine the first held back 37 GiB for an OS that measures under 6 GiB. It is
re-measured every run, soMODEL_BUDGET_GBis now an override andsetup
writes it commented out. If you ransetupon an earlier version, that
number is still in yourconfig.envand now pins the budget; comment it out.
doctorsays when an override is in force. inspect,searchand the panel list every quant in a repo and lead with the
biggest that fits, rather than reporting only the smallest — a 32B repo was
being shown as 9.0 GB, which was its 2-bit quant. They also report how much
context the model can hold on this machine.- Quants vLLM can't load are marked, not offered: it addresses GGUF by name and
only for a single file at the repo root, so split-file and subfolder copies
are listed as unselectable, and a machine without the plugin is told before
the pull rather than after the restart. - GGUF builds of MoE models are marked unsupported. The plugin maps fused expert
weights for OLMoE and MiniMax-M2 only; every other MoE fails at load, after
the restart has already taken down what was serving. - Coder sync is now a plugin behind a small interface. Nothing changes for
users — same verbs, same config, same state file; it keeps the churn of an
undocumented experimental API in one package. - Commands are built on cobra: grouped
--help, per-command flags, cobra's wording for unknown ones. Exit codes
unchanged.--helpnow works onset,edit,remove, andcoder-sync. - The boot log banner says that Ctrl+C stops watching and leaves the server
loading. People were interrupting a first-run download believing they had
killed it. - Non-interactive sessions never prompt, tail, or block on
sudo, which makes
the CLI usable from scripts and a UI backend. EXTRA_ARGSis split shell-style, so a quoted value with spaces survives.coder-sync register-allonly backfills what's missing.startexits cleanly when no model is active, instead of sending
Restart=on-failureinto a crash loop with nothing to serve.
Fixed
- gpt-oss models work. Their cards carry no
vllm servesnippet, so profiles
were written with no flags, and served that way the model answers chat but
returns an empty message for anything involving tools.newnow adds the
parsers and fetches the vocab files, where the installed vLLM confirms them. - Model-card flags are checked against the vLLM installed here before reaching a
profile. Anything this build won't accept used to be copied verbatim and
surface as a crash loop on the next switch. Nothing is substituted
automatically: parsers one character apart are different parsers. - More of a card's flags are adopted — only five were recognised, so settings
like--max-num-seqswere dropped without a word. --gpu-memory-utilizationis capped where the GPU shares memory with the host
(GB10, Jetson, Thor). The old guard asked whether an NVIDIA GPU was present,
which is right for discrete VRAM and wrong for unified, where overshooting can
wedge the host below the CUDA runtime rather than OOM cleanly. Linux hosts
with no GPU are clamped to what's free, and no longer charged for a CUDA
context they never create — a 7 GB CPU-only box was told nothing would run.- Fit checks were 7.4% pessimistic: HuggingFace reports decimal GB and memory
was read as GiB, so models that fit were called too big. - Weights are measured wherever they live. The listing only looked at the repo
root, so a model keeping weights one level down measured as 0 and read as
"unknown", and a sharded repo past one page was never counted in full. - Coder sync follows the model-config collection to
/api/v2/organizations/{org}/chats/models. Against Coder 2.37 every sync
failed with a 404 that read like a bad URL or token — which is whatdoctor
said. Both generations stay supported. statustells a service that is failing to start from one still loading.
Reporting a crash-looping unit as "still loading" sent people off to wait for
a server that was never coming up; it now shows the last log line.- The capability probe had stopped working wherever a vLLM plugin was installed:
plugin registration on stdout meant the probe's JSON no longer parsed, so flag
validation silently stopped and an installed GGUF plugin read as missing. inspectand the panel's model detail ranvllm --versionbefore consulting
the cache, which imports vLLM: 10.1s per lookup on a DGX Spark, now 0.25s.- Installing the GGUF plugin from the panel no longer holds a request open for
the whole source build. It runs on the server and the page polls it, so a
reload rejoins an install in progress. newclampsMAX_MODEL_LENto the model'smax_position_embeddingseven
when the card has no snippet — the clamp sat behind an early return taken on
exactly those cards, sofacebook/opt-125mgot 131072 and vLLM refused.setandeditrefuse aMAX_MODEL_LENthat isn't a positive number, and
setvalidates the whole batch before writing anything.- A bad
MAX_MODEL_LENis reported before it reaches Coder, instead of becoming
a context limit of 0 and an HTTP 400 that names nothing. - Bare JSON in
EXTRA_ARGSwas mangled by shell-style splitting, turning
{"thinking":true}into{thinking:true}, which vLLM rejects. - Profile values round-trip: unusual leading or trailing whitespace was written
unquoted and read back empty, and a NUL byte came back as a backslash. adoptsaved a lossy copy of the server it took over — seven flags were
recognised and the rest dropped, and--gpu-memory-utilizationwas hardcoded
to0.85, so a server tuned to0.92came back with less KV cache. It could
also carry credential-bearing flags into a profile and intodoctor --json.upgrade --checkno longer claims an update when you're already on that
channel, and no longer writesUPDATE_CHANNELwhile reporting.--versionprints the commit, matchingversion.- Redirecting to
/dev/nullno longer looks like a terminal, so
vllm-helper logs > /dev/nullprints and exits instead of following forever. switchcould wait forever: only afailedunit ended the wait, so a service
that went inactive left it polling a health endpoint that never answered.doctor --yeshung on asudoprompt with no terminal to answer it.statusreports the host's service manager rather than always saying systemd.--is honored as an end-of-flags terminator.
v0.3.1
v0.3.0
v0.2.0
Changelog
- 801843c feat: Go CLI with detection/adoption engine and binary release pipeline