# HANDOFF-LOKAL-LLM-GITEA-MCP.md # EGEN HANDOFF – UFRAVIKELIG STYRINGSDOKUMENT # GJELDER FRA NÅ OG FREM TIL 100 % FERDIGSTILLELSE ## 0. STATUS OG KOMMANDO Denne handoffen er det eneste autoritative arbeidsdokumentet for sporet "lokal LLM-fabrikk + OPAX-MCP + Gitea stabilisering + blueprinting til Gitea-VM". --- ## FREMDRIFT – OPPDATERT 2026-07-21 22:47 CEST ### ✅ FASE 0–5 — FERDIG (se tidligere logg) ### ⏳ FASE 6 – CPU-optimalisering — PÅGÅR Låste parametere: - `OLLAMA_KEEP_ALIVE=-1` ✅ - `OLLAMA_MAX_LOADED_MODELS=2` ✅ - `num_ctx=2048`, `num_batch=256` ✅ - `OLLAMA_NUM_THREADS` = ikke satt ✅ Testrekkefølge: 1. ✅ Kaldstart / keep_alive baseline — FERDIG 2. ✅ Resident modell-strategi — FERDIG 3. ✅ Parameter-matrise — FERDIG 4. ✅ Full Emma MCoT end-to-end — FERDIG 2026-07-21 5. ⏳ Belastningstest med samtidig Gitea + agent-last Exit-kriterium: - ✅ keep_alive-strategi bevist effektiv - ✅ resident modellvalg låst - ✅ optimal parameterkombinasjon dokumentert - ✅ full Emma-loop latency akseptert: **42.51s per varm turn (5 kall)** - ⏳ 2-timers belastningstest bestått uten OOM og uten swap --- ## FASE 6.1 – KALDSTART / KEEP_ALIVE BASELINE — FERDIG | Test | Modell | load_s | tok/s | Status | |---|---|---|---|---| | 1.1 Kaldstart | gemma3:4b | 117.69s | 4.9 | ✅ | | 1.2 Kaldstart | qwen2.5:3b | 71.13s | 6.4 | ✅ | | 1.5 Varme kall ×5 | gemma3:4b | ~1.0s | ~5 | ✅ | Konklusjon: keep_alive=-1 eliminerer 117s kaldstart fra kall 2+. --- ## FASE 6.2 – RESIDENT MODELL-STRATEGI — FERDIG | Konfigurasjon | Resultat | |---|---| | MAX=1 | Bytte 5–9s × 4–6 kall = 20–54s ekstra per turn | | **MAX=2 + KEEP_ALIVE=-1** | **0s bytte, begge Forever, 6.8 GB, Swap=0** | Låst: `OLLAMA_MAX_LOADED_MODELS=2` + `OLLAMA_KEEP_ALIVE=-1` i systemd. --- ## FASE 6.3 – PARAMETER-MATRISE — FERDIG | num_ctx | num_batch | avg tok/s | Delta | |---|---|---|---| | 1024 | 256 | 4.9 | baseline | | **2048** | **256** | **5.0** | **+0.1 ✅ VINNER** | | 4096 | 256 | 4.3 | -14% ⚠️ | | 2048 | 128 | 4.9 | -0.1 | | 2048 | 512 | 4.8 | -0.2 | Threads (2/3/4 vCPU): alle 4.8–4.9 tok/s — ingen forskjell, ikke sett. Låst: `num_ctx=2048`, `num_batch=256` (default), `OLLAMA_NUM_THREADS` ikke satt. --- ## FASE 6.4 – FULL EMMA MCOT END-TO-END — FERDIG 2026-07-21 Kjørt på: **gitea-cpu-vm** (34.67.252.59) — gemma3:4b, 5 sekvensielle kall (simulert Emma MCoT) ### Test 4a — første turn etter systemd-restart (kaldstart kall 1) | Kall | load_s | eval_s | Type | |---|---|---|---| | 1 | **55.6s** | 1.95s | embed (boot-kaldstart) | | 2 | 1.06s | 6.5s | think | | 3 | 1.0s | 6.3s | choose_action | | 4 | 1.01s | 7.23s | choose_action | | 5 | 1.06s | 13.0s | execute_action | | **Total** | | | **102.34s** | Rotårsak kall 1: modellen ikke i RAM etter systemd-restart — engangs boot-kostnad. ### Test 4b — varm turn (modell allerede i RAM, UNTIL=Forever) | Kall | load_s | eval_s | Type | |---|---|---|---| | 1 | 1.03s | 1.96s | embed | | 2 | 1.06s | 6.18s | think | | 3 | 1.01s | 6.15s | choose_action | | 4 | 1.01s | 6.5s | choose_action | | 5 | 1.07s | 13.08s | execute_action | | **Total** | | | **42.51s ✅** | ### ✅ EMMA MCOT LATENCY LÅST ``` Varm Emma-turn (5 kall): 42.51s Load-overhead per kall: ~1.0s (uunngåelig på CPU) Eval-tid per kall: 2–13s (avh. av num_predict) Boot-kaldstart (1 gang): ~56s ekstra første turn ``` **Konklusjoner:** 1. **42.51s per varm turn er akseptabelt** for asynkron/agent-bruk — ikke interaktiv chat 2. **Boot-warming er nødvendig** — legg inn oppvarmingskall i Ollama-oppstartskript etter systemd start 3. **load_s ~1.0s per kall er fast overhead** på CPU — ikke reduserbar med parameterjustering 4. **Ingen RAM-degradering** — 6.8 GB used, Swap=0 etter full sekvens 5. **qwen2.5:3b ble ikke testet i MCoT** — Emma bruker primært gemma3:4b; qwen2.5:3b er reserve ### RAM etter Fase 6.4 ``` NAME SIZE PROCESSOR UNTIL gemma3:4b 2.9 GB 100% CPU Forever qwen2.5:3b 2.2 GB 100% CPU Forever Mem: 15Gi | 6.8Gi used | 8.8Gi available | Swap: 0B ``` --- ## ÅPNE PUNKTER SOM MÅ LØSES FØR BLUEPRINT - `GITEA_URL` satt runtime — **må legges permanent inn i `opax-mcp.yaml` og rebuildes** - `git.vauco.no` er planlagt permanent domene for Gitea — erstatter IP når DNS er oppe - Gitea-commits er ikke GPG-signert — vurder om dette skal fikses - **Boot-warming:** legg til oppvarmingskall i Ollama systemd ExecStartPost eller egen service ## FASTE SANNHETER (uendret) - Gitea er source of truth - Lokale modeller er hovedretning - Gitea-VM (34.67.252.59) er planlagt permanent målmaskin - Denne handoffen overstyrer alt annet ## DEFINITION OF DONE - ✅ Lokale modeller lever og kan brukes lokalt - ✅ OPAX-MCP bruker lokal modellbackend korrekt - ✅ `list_emma_models` er grønn - ✅ Gitea read-only tools er grønne - ✅ GCP/Workspace-kjernen er fortsatt grønn - ⚠️ Konfigurasjon konsolidert — delvis (GITEA_URL må inn i repo) - ⏳ Ingen skjult API-/agentavhengighet som hovedbane — ikke verifisert - ✅ dev-snap-oppsettet dokumentert godt nok til blueprinting - ⏳ CPU-optimalisering verifisert på Gitea-VM — Fase 6.5 gjenstår ## OPPDATERINGSLOGG | Dato | Fase | Handling | |---|---|---| | 2026-07-21 | FASE 4 | Full smoke test grønn, alle 8 tools OK | | 2026-07-21 | FASE 5 | Blueprint frosset, FASE 5 lukket | | 2026-07-21 | FASE 6 | FASE 6 åpnet — CPU-optimalisering | | 2026-07-21 | FASE 6.1 | Kaldstart/keep_alive: gemma3=117s, qwen=71s, keep_alive=-1 bevist | | 2026-07-21 | FASE 6.2 | Resident strategi: MAX=2 + KEEP_ALIVE=-1 systemd, begge Forever | | 2026-07-21 | FASE 6.3 | Parameter-matrise: num_ctx=2048, num_batch=256, NUM_THREADS ikke satt | | 2026-07-21 | FASE 6.4 | Emma MCoT end-to-end: varm turn=42.51s (5 kall), boot-warming nødvendig, RAM OK |