12c2ae1d17
CLAUDE.md says every page is its own embedded .html file next to main.go, and that no page markup lives in Go. Two pages were still Go string constants: passkeyPageHTML in webauthn.go and modelsHTML in models.go. They are now passkey.html and models.html, embedded. The identifiers keep their names, so passkey_prf_test.go still reads passkeyPageHTML and still asserts on the same bytes. Both templates now build through parsePage, and Page and handleModels render through renderPage. handleEcosystem did too and now does the same. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
2.0 KiB
HTML
36 lines
2.0 KiB
HTML
{{template "shellTop" "models"}}
|
|
<h1>Resident model</h1>
|
|
<p class=hint>swapping requires step-up — <a href=/auth/passkey>assert a passkey</a> first. The old model is unloaded before the new one is loaded (one model fits the iGPU at a time), so turns during the load are refused and fall back to the classifier.</p>
|
|
<p class=hint>a swap is not remembered. Nothing writes it down, so the next restart of the daemon — including the one <code>mavupdate</code> does — comes back on <code>phraser.model_path</code> from the config. Make it stick by editing that.</p>
|
|
{{if .Msg}}<div class="msg msg-ok">{{.Msg}}</div>{{end}}
|
|
{{if .Err}}<div class="msg msg-err">{{.Err}}</div>{{end}}
|
|
{{if .Off}}
|
|
<section class=card>
|
|
<h2 class=card-title>swap not configured</h2>
|
|
<p class=hint>this core has no <code>phraser.swap_models</code> allowlist, so there is nothing to swap to. Add the gguf paths you allow to <code>deploy/mavend.json</code> and restart once.</p>
|
|
</section>
|
|
{{else}}
|
|
<section class=card>
|
|
<h2 class=card-title>loaded now</h2>
|
|
<div class=scroll><table>
|
|
<tr><th>model</th><td><code>{{.Status.Model}}</code></td></tr>
|
|
<tr><th>file</th><td><code>{{.Status.ModelPath}}</code></td></tr>
|
|
<tr><th>server</th><td><code>{{.Status.BaseURL}}</code></td></tr>
|
|
<tr><th>n_ctx</th><td>{{.Status.NCtx}}</td></tr>
|
|
<tr><th>n_gpu_layers</th><td>{{.Status.NGpuLayers}}</td></tr>
|
|
</table></div>
|
|
<p class=hint>the model name is what llama-server reports for itself, not what the config says it should be.</p>
|
|
</section>
|
|
<section class=card>
|
|
<h2 class=card-title>allowed models <span class=badge>{{len .Status.Swappable}}</span></h2>
|
|
{{if .Status.Swappable}}<div class=scroll><table><tr><th>file</th><th></th></tr>
|
|
{{range .Status.Swappable}}<tr><td><code>{{.}}</code></td>
|
|
<td><form method=post action=/models class=inline-form>
|
|
<input type=hidden name=model_path value="{{.}}">
|
|
<button class=btn>load this one</button></form></td></tr>{{end}}
|
|
</table></div>
|
|
{{else}}<div class=empty><div>no models allowlisted</div></div>{{end}}
|
|
</section>
|
|
{{end}}
|
|
{{template "shellBottom"}}
|