lllm3090.panel#

The control panel: a loopback-only web UI for starting, stopping and downloading models.

Binds 127.0.0.1 by design. These endpoints start processes and write to disk with no authentication, so reach it remotely with an SSH tunnel (ssh -L 8080:127.0.0.1:8080 host) rather than by binding a LAN address.

lllm3090.panel.lifespan(_: FastAPI)[source]#

Pick up anything a previous panel process left half-downloaded.

lllm3090.panel.status()[source]#

The machine, plus the two things only this process can answer for.

async lllm3090.panel.start(model: str, ctx: int | None = None, parallel: int | None = None)[source]#
async lllm3090.panel.stop()[source]#
lllm3090.panel.download(model_id: str)[source]#
lllm3090.panel.cancel_download(model_id: str)[source]#
lllm3090.panel.logs(tail: int = 200)[source]#
lllm3090.panel.clear_logs()[source]#

Empty the engine log, leaving the engine writing to it alone.

Truncated rather than rotated or deleted. The engine holds this file open for the life of the process, so a rename would send its output to a file nothing is reading, and an unlink would send it nowhere at all. lllm3090.engine.start() opens the log O_APPEND for the same reason – the next line the engine writes lands at the beginning of the emptied file rather than at the offset it had reached.

The tailer notices the file has shrunk and emits rotated, which is already what tells the browser to clear the pane it is showing.

async lllm3090.panel.logstream()[source]#
lllm3090.panel.index()[source]#