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

List the curated catalogue and what is already downloaded.

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>) 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>) 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.tui(url: str = <typer.models.OptionInfo object>) None[source]#

The control panel on a text console, for a machine with no browser.

Drives the panel over HTTP when it is running, and falls back to this process for everything that has a local answer – which is all of it except downloading, since that is state the panel owns.

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]#