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_DIR at what this builds – a compiled binary is a different promise from a verified download, and it is yours to make.

lllm3090.cli.models() → None[source]#

List the curated catalogue and what is already downloaded.

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.status() → None[source]#

Show what the engine is doing.

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.stop() → None[source]#

Stop the engine and free the VRAM.

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 install cannot 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-env prints 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 /model inside that session then stays local rather than falling back to the paid API.

slots is what the engine says it can hold at once, from lllm3090.engine.served_slots(). None means 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 claude elsewhere still reaches Anthropic on your normal account.

lllm3090.cli.main() → None[source]#