lllm3090.cli#
The lllm3090 command.
- lllm3090.cli.doctor() None[source]#
Check this machine can run the stack, and say precisely what is missing.
- lllm3090.cli.install_engine(force: bool = <typer.models.OptionInfo object>) None[source]#
Fetch and verify the pinned llama.cpp build.
- lllm3090.cli.fetch_engine(build: str = <typer.models.OptionInfo object>, force: bool = <typer.models.OptionInfo object>) None[source]#
Fetch a build to measure against, without touching the installed engine.
Deciding whether to move the pin means running a candidate and the incumbent on the same machine, so a benchmark build is kept beside the install rather than replacing it. The digest printed here is what gets committed if the candidate wins and becomes the pin.
- lllm3090.cli.build_cuda(force: bool = <typer.models.OptionInfo object>) None[source]#
Compile a CUDA engine for this card, beside the installed one.
llama.cpp publishes CUDA archives for Windows only, so on Linux this is compiled or it is absent. It is worth having: on the dense 27B, CUDA plus multi-token prediction measures 1.55-1.60x the Vulkan engine that installs by default, and 1.93x on copy-heavy work with
--profile copy.Nothing is switched. The Vulkan engine keeps serving until you point
LLLM3090_LLAMA_DIRat what this builds – a compiled binary is a different promise from a verified download, and it is yours to make.
- lllm3090.cli.sweep(limit: int = <typer.models.OptionInfo object>, gpu: str | None = <typer.models.OptionInfo object>, show_yaml: bool = <typer.models.OptionInfo object>, show_skipped: bool = <typer.models.OptionInfo object>) None[source]#
Survey published GGUF models and price them against this card.
Downloads no weights: each candidate costs one config.json, from which the KV cost per token is derived and then run through the same arithmetic the panel uses. What comes out is a shortlist worth spending disk on, and – just as usefully – a list of models that fit the card and still cannot hold an agent’s system prompt.
- lllm3090.cli.bench(model: str = <typer.models.ArgumentInfo object>) None[source]#
Benchmark a model with llama-bench and print a profile contribution.
The catalogue’s speeds are measurements, never extrapolations, so a card other than the one they were taken on has no numbers until somebody runs this on it. The output is meant to be pasted into an issue.
- lllm3090.cli.start(model: str = <typer.models.ArgumentInfo object>, ctx: int = <typer.models.OptionInfo object>, parallel: int = <typer.models.OptionInfo object>, profile: str = <typer.models.OptionInfo object>, effort: str = <typer.models.OptionInfo object>) None[source]#
Start the engine on an installed model.
- lllm3090.cli.setup(yes: bool = <typer.models.OptionInfo object>, service: bool = <typer.models.OptionInfo object>, model_folder: str | None = <typer.models.OptionInfo object>) None[source]#
Prepare this machine: system packages, engine, and the panel service.
Everything
uv tool installcannot do for itself. Safe to re-run – each step is skipped when it is already done.
- lllm3090.cli.install_service(enable: bool = <typer.models.OptionInfo object>) None[source]#
Write the systemd user unit for the panel, and start it.
Lives here rather than in the installer so that installing from PyPI – where there is no checkout to copy a unit file out of – works identically.
- lllm3090.cli.panel(port: int = <typer.models.OptionInfo object>) None[source]#
Run the control panel.
- lllm3090.cli.claude_env(model: str, window: int, slots: int | None = None) dict[str, str][source]#
The environment Claude Code is launched with, in one place.
Claude Code’s variables are not a versioned contract: a release can add one, rename one, or start reading one that is currently ignored. Nothing can be done about that from here – moving these strings into a data file would change where they are written, not whether they still match – so what this does instead is make the whole mapping one value that can be printed, diffed and tested.
lllm3090 claude --print-envprints exactly this, which is how you check it against a new Claude Code without running a session to find out.All three model slots point at the local model deliberately: switching with
/modelinside that session then stays local rather than falling back to the paid API.slotsis what the engine says it can hold at once, fromlllm3090.engine.served_slots().Nonemeans it would not say, and the pool this project starts by default is assumed.
- lllm3090.cli.CLAUDE_UNSET = 'ANTHROPIC_API_KEY'#
Removed rather than blanked when Claude Code is launched. An empty ANTHROPIC_API_KEY still counts as set, which makes Claude Code disable its claude.ai connectors and say so on every launch.
- lllm3090.cli.claude(ctx: Context, force: bool = <typer.models.OptionInfo object>, print_env: bool = <typer.models.OptionInfo object>) None[source]#
Launch Claude Code against the local engine.
Sets Anthropic environment variables for one subprocess only – nothing is written to ~/.claude/settings.json, so a plain
claudeelsewhere still reaches Anthropic on your normal account.