feat: MI50 as a Lyra backend (OpenAI-compatible local GPU)

The MI50 box (CT202) runs an OpenAI-compatible llama.cpp server on
10.0.0.44:8080. Wire it in as a third backend:

- llm.complete gains backend="mi50" (OpenAI client pointed at MI50_BASE_URL)
- config: MI50_BASE_URL (default http://10.0.0.44:8080/v1) + MI50_MODEL
- chat.respond labels the model per backend; web _backend_for maps "mi50"
- UI backend selector adds "MI50 — local GPU"

Verified end-to-end: llm.complete(backend="mi50") returns from the live server.
See homelab-inference memory for the box topology.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-16 05:37:22 +00:00
parent ecf0b852f9
commit 30185f3fd8
6 changed files with 27 additions and 3 deletions
+4 -1
View File
@@ -32,7 +32,10 @@ _CLOUD = {"OPENAI", "cloud", "custom"}
def _backend_for(label: str | None) -> Backend:
if label and label.upper() in {"PRIMARY", "SECONDARY", "FALLBACK", "LOCAL"}:
key = (label or "").lower()
if key == "mi50":
return "mi50"
if key in {"local", "primary", "secondary", "fallback"}:
return "local"
return "cloud"
+5
View File
@@ -123,6 +123,11 @@
<span>Local — Ollama</span>
<small>Free, private, runs on your home lab (LOCAL_MODEL)</small>
</label>
<label class="radio-label">
<input type="radio" name="backend" value="mi50">
<span>MI50 — local GPU</span>
<small>Free, llama.cpp on the MI50 box (MI50_BASE_URL)</small>
</label>
<label class="radio-label">
<input type="radio" name="backend" value="cloud">
<span>Cloud — OpenAI</span>