Skip to content

About

A PyQt6 GUI frontend for llama-server (llama.cpp) - launch and configure local LLMs without the command line

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Repository files navigation

Llama CPP Launcher icon

🦙 Llama CPP Launcher

A full-featured GUI launcher for llama-server (llama.cpp) — bring your own binary.

All 226 llama-server CLI parameters in one panel · live default detection · presets · real-time log parsing · built-in GGUF inspector

Version Python PyQt6 License: MIT Platform

Download Latest Release · 📖 中文文档 · ⭐ Star this repo


📑 Table of Contents

💡 Why Llama CPP Launcher?

Most GUI tools (Ollama, LM Studio, …) bundle a fixed llama.cpp version and hide the command line. Llama CPP Launcher is the opposite: it drives the llama-server binary you installed, and everything it does is visible.

Llama CPP Launcher Bundled-backend tools
Upgrade llama.cpp ✅ Swap the binary, done ❌ Wait for an app update
Custom builds (CUDA / ROCm / Vulkan / Metal / SYCL) ✅ Use any build ❌ Stuck with the bundled one
Bleeding-edge commits ✅ Build today, run today ❌ Weeks or months of waiting
Rollback ✅ Put the old binary back ❌ Hope they ship it
The exact command the app runs ✅ Always visible, one-click copy ❌ Opaque

And it stays in sync automatically:

  • 🔍 Live default detection — runs llama-server --help on startup and parses the real defaults of your binary version. No stale hardcoded values, no drift (drift is surfaced via a ⚠️ indicator).
  • 🗂️ Chat template auto-discovery — templates shipped by your binary appear in the UI automatically.
  • 🖥️ GPU detection — probes --list-devices and shows e.g. 2× GPU: RTX 5090 (32GB) + RTX 2080 (8GB) next to the offload controls (never auto-fills, always your call).

🪶 Lightweight & private — ~13,000 lines of Python, one dependency (PyQt6). No bundled backend, no accounts, no telemetry, no phone home. 100% local.

📸 Screenshots

Advanced mode (light theme, left) · Basic mode with a model running (dark theme, right) — runtime info parsed live from server logs.

Advanced mode, light theme Basic mode with a model running, dark theme

🚀 Quick Start

Option 1: Windows exe (recommended)

  1. Download LlamaCppLauncher.exe from Releases and double-click to run — no Python needed.
  2. Install llama-server (e.g. from ggml-org/llama.cpp releases).
  3. In the app: File → Set llama-server path... and point it at the binary (or just add it to PATH — the launcher finds it automatically).
  4. Pick a model, hit Start, open the WebUI. Done.

⚠️ Windows SmartScreen may warn about the unsigned executable — click More info → Run anyway.

Option 2: From source (any OS)

git clone https://github.com/Mars-Albert/llama-cpp-launcher.git
cd llama-cpp-launcher

python -m venv venv
venv\Scripts\activate   # Windows   ·  source venv/bin/activate  # Linux/macOS
pip install -r requirements.txt

python main.py          # or double-click run.bat on Windows

✨ Features

🎭 Two Modes

Basic Mode Advanced Mode
Model & mmproj pickers backed by the model browser 226 parameters in 9 tabs
Sliders for temp / top-p / min-p / repeat penalty, top-k spin LoRA adapters & scales, control vectors, image token limits
Context quick-picks: Default → 4K → 262K Model sources: local file, HF repo, URL, Docker repo
GPU layers auto / all / manual, host/port/parallel Speculative decoding (draft-mtp, ngram, lookup cache)
⚡ Quick toggles — user-configurable (Settings → Customize): FlashAttn, reasoning, split mode, spec type, draft max… Full server config: SSL, CORS, slots, embedding/rerank, MCP
Get a model running in seconds Fine-tune every detail

🎛️ Advanced Mode — 9 Tabs

Tab What's inside
🧠 Model Model file, alias, tags, HF/URL/Docker sources, LoRA, control vectors, mmproj (vision)
📏 Context Context size, prompt & KV cache, RoPE / YaRN scaling
🎲 Sampling Temperature, top-k/p, min-p, penalties, grammar & repetition
🎮 GPU/Performance Offload, memory, CPU threads, affinity, priority
⚡ Speculative Draft models (draft-mtp), ngram, lookup cache, draft tokens
🌐 Server Host/port, slots, parallel, endpoints, SSL, CORS, embedding/rerank, router
🤖 Agent/Tools Tool calling, MCP server, agent settings
💬 Chat/Reasoning Chat templates, reasoning mode, thinking budget
🔧 Advanced Text I/O, logging, extra_args escape hatch

📂 Model Browser

  • 🔎 Background-thread scan of your model directory — the UI never freezes
  • 🏷️ Auto-categorizes .gguf files into Models / Multimodal (mmproj) with sizes
  • 📏 Instant model info: size, estimated parameters, quantization type
  • 🧾 GGUF quick-metadata row: architecture + max context of the selected model, parsed from the file header only (a few MB, cached, off the GUI thread); the row turns amber when your context setting exceeds the model's limit (the server would clamp it at load)
  • 🔗 Auto-matches the mmproj to your model by name
  • 📁 Scan directory remembered across sessions; F5 to re-scan

📊 Real-time Log Parsing

Every line of llama-server output is parsed as it arrives (74 patterns, both old and v9174+ srv-prefixed formats) and distilled into the Runtime Info panel — 40+ data points across 8 categories:

Category What you see
🖥️ Hardware GPU name / compute capability / total & free VRAM per GPU, CPU
📦 Model File, model name, quant type, GGUF version
🏗️ Architecture Params, layers, embed/FFN dims, vocab, tensor precision split
⚙️ Runtime Train vs runtime ctx, batch/ubatch, slots, RoPE freq, thinking mode
💾 VRAM Offload layers, model/KV-cache/compute buffers, projected usage
⚡ Performance Flash attention, KV unified, graph nodes & splits
🔧 System Threads, OpenMP, repack
👁️ Vision Encoder status, mmproj, image resolution, min image tokens

The panel fills in live — offload layers appear during loading, buffer sizes during init, and the status flips to ready the moment the server starts listening.

📄 Log Panel

  • 🔍 Ctrl+F search with match count and wrap-around
  • Level filter — Debug / Info / Warn / Error (follows Error by default)
  • 📤 Export the visible area or the full run (every run is also mirrored to ~/.llama-cpp-launcher/logs/last_run.log)
  • 🪟 Per-level history windows — each level (D/I/W/E) keeps its own 5,000-line window, so a burst of hidden lines (e.g. a debug prompt dump) can never evict the lines you're filtering for
  • Auto-scroll toggle, clear button, colorized by level

💾 Presets

  • Save / load / delete named presets — only the diff vs. defaults is stored
  • Import / export as JSON for sharing; created-time shown in the list
  • Choose to include or exclude machine-local paths (model/mmproj) when saving
  • The preset you last loaded is restored automatically on next start
  • Param keys renamed/removed across llama.cpp versions are migrated on load

❓ Per-Parameter Help

Every parameter row has a ? button that opens a floating card: the CLI flag, your binary's live default (from --help), the valid range, and a plain-language explanation. No more memorizing what --no-kv-offload does.

🔬 GGUF Inspector

A built-in binary inspector (no weights loaded, pure-stdlib parser):

  • 7 tabs: Overview · Statistics · Metadata · Tensors · Tokenizer · Filename · Diagnostics
  • 📊 Visual breakdowns: quantization distribution, layer/module structure, parameter concentration
  • 🩺 Launcher-aware diagnostics: context exceeds model limit, mmproj name mismatch, draft-mtp without sidecar, chat-template / RoPE / MoE / shard info
  • 📤 Export to JSON / CSV / Markdown · background parsing with an in-memory cache

🚀 Server Lifecycle

  • ▶️ One-click start/stop with color-coded status + runtime counter (MM:SS)
  • ⚠️ Port-conflict check before launch
  • 🌐 One-click open of the llama-server WebUI
  • Graceful stop (non-blocking, force-kill fallback); auto-stops when you close the app
  • ↩️ Undo — 800ms-debounced snapshots, up to 20 steps back
  • 📝 Command preview — the exact llama-server command, updated on every change, one-click copy (paths with spaces are quoted correctly)

🪟 Window & UI

  • 🖼️ Frameless rounded-card window — the app paints its own card with a soft drop shadow: one integrated title row (icon · title · menu · Win11-style minimize/maximize/close), drag to move, double-click to maximize, edge-resize right at the visible card edge. Maximized, the card goes full-bleed with the system's own rounded corners.
  • 🎴 Themed dialogs & message boxes — every dialog, confirm and error box belongs to the same frameless card family (dark/light aware), so nothing pops out of the look.
  • 📐 Comfortable by default — first launch opens at 1600×940 (clamped to your screen) with a 400px model column; size, position, mode, tabs and splitter layout are restored on next start.
  • 🧘 Small windows behave — the parameter area never gets a vertical scrollbar and no control is squashed or overlapped: quick toggles re-wrap into more rows and the window's minimum size grows instead; very narrow windows scroll the wide rows sideways.

🌐 i18n & Themes

  • 🈶/🈷 Chinese ↔ English live switching — no restart, preference persisted
  • 🌙 Dark / light theme — one click in the Settings menu (File · Settings · Help), persisted; the log panel and inspector stay theme-aware
  • Menu layout: File (scan path, llama-server path, refresh, exit) · Settings (customize quick toggles, language, theme) · Help (about)

🆚 Comparison

Feature Llama CPP Launcher Ollama LM Studio
Bring your own llama.cpp binary ✅ ❌ ❌
Run the latest llama.cpp the day it ships ✅ ❌ ❌
Any custom backend (CUDA/ROCm/Vulkan/Metal/SYCL) ✅ ❌ ❌
Full CLI parameter access (226) ✅ ❌ Partial
The exact command is visible & copyable ✅ ❌ ❌
Presets with version-aware migration ✅ ❌ ❌
Built-in GGUF inspector ✅ ❌ ❌
No telemetry, 100% local ✅ ❌ ✅
Single lightweight dependency (PyQt6) ✅ — ❌

🛠️ Development

  • Python 3.11+, PyQt6 (pinned), pytest for tests
  • ~13,000 lines of application code (+~5,500 lines of tests); the core schema (core/params_schema.py) is the single source of truth for the UI, CLI emission, get/set values, and i18n coverage — adding a parameter is one entry
  • gguf/, ui/log_parser.py, ui/command_builder.py are Qt-free and unit-testable headlessly
Project structure
llama-cpp-launcher/
├── main.py                  # Entry point (async startup, logging setup)
├── run.bat                  # Windows launcher (activates venv)
├── build_config.py          # App name / version (CI rewrites on tag)
├── llama_cpp_launcher.spec  # PyInstaller spec (icon embedded)
├── requirements.txt
├── core/
│   ├── params_schema.py     # ★ 226-param schema (Qt-free, single source of truth)
│   ├── params_help.py       # Per-parameter help texts (226 entries)
│   ├── defaults.py          # `--help` parsing, fallback defaults, GPU probe
│   ├── config.py            # Preset & settings IO (~/.llama-cpp-launcher)
│   ├── runner.py            # QProcess wrapper (start/stop/readiness)
│   ├── i18n.py              # zh/en translation (Chinese source language)
│   └── constants.py
├── gguf/                    # Pure-stdlib GGUF binary reader
│   ├── parser.py  models.py  ggml_types.py  filename.py  diagnostics.py
├── ui/
│   ├── main_window.py       # Window orchestration, theme, log panel
│   ├── frameless.py         # Frameless rounded-card window, title bar, edge-resize
│   ├── message_box.py       # Themed frameless message boxes & dialog base
│   ├── basic_panel.py       # Basic mode (incl. user-configurable quick toggles)
│   ├── advanced_panel.py    # Advanced mode (schema-driven, 9 tabs)
│   ├── quick_params.py      # Quick-toggles pool + widget factory
│   ├── quick_params_dialog.py  # Customize-quick-toggles dialog
│   ├── server_path_dialog.py   # llama-server path dialog
│   ├── param_help.py        # "?" button + floating help card
│   ├── model_browser.py     # GGUF scanner (background thread)
│   ├── gguf_inspector.py    # 7-tab inspector dialog
│   ├── log_parser.py        # Log line patterns → runtime info (Qt-free)
│   ├── command_builder.py   # Params → `llama-server` argv (Qt-free)
│   └── runtime_info.py      # Runtime info HTML (Qt-free)
├── tests/                   # 26 test modules (headless, in-memory fakes)
└── assets/icon.ico|png

Releases: pushing a tag v* runs CI on windows-latest — tests, then PyInstaller, then the exe is published as a GitHub Release automatically.

📄 License

MIT — do whatever you want with it.

About

A PyQt6 GUI frontend for llama-server (llama.cpp) - launch and configure local LLMs without the command line

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages