From 8e9d8b9ac1b593032dea9eca312fa1495c0c8858 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Sat, 17 Oct 2026 10:59:22 +0200 Subject: assistant: Load no longer changes the preferred model Load set the preference as well as swapping the model in, so loading a model from the settings page for any reason made it the assistant's model too: after loading Qwen there, the canvas kept Qwen instead of bringing the preferred Gemma back. Load and Prefer are now separate buttons: Load swaps a model in now and leaves the preference alone, and Prefer only records which model the canvas loads when it opens. The canvas header also showed a stale model name after a swap; it now takes the model from the daemon's ctx event, which carries it from desktop-assistant f9d4644 on. Co-Authored-By: Claude Opus 5.5 --- desktop/modules/assistant/AssistantModule.qml | 8 ++++---- desktop/modules/assistant/AssistantPage.qml | 22 +++++++++++++++------- desktop/modules/assistant/README.md | 8 +++++--- 3 files changed, 24 insertions(+), 14 deletions(-) (limited to 'desktop/modules') diff --git a/desktop/modules/assistant/AssistantModule.qml b/desktop/modules/assistant/AssistantModule.qml index b53a33f..8253cc6 100644 --- a/desktop/modules/assistant/AssistantModule.qml +++ b/desktop/modules/assistant/AssistantModule.qml @@ -179,11 +179,11 @@ Module { } // The router keeps one model resident, so this swaps out whatever is - // loaded, for every client: it runs only on a click. The id becomes the - // preferred one, and the list is polled until the router reports it - // loaded, since the request may return before the load finishes. + // loaded, for every client. It does not touch the preferred model: a + // load from the page is for now, and the canvas brings the preferred one + // back when it opens. The list is polled until the router reports the + // model loaded, since the request may return before the load finishes. function loadModel(id) { - Prefs.setAssistantModel(id); am.modelError = ""; am.loading = id; am.run(["curl", "-s", "-m", "600", "-X", "POST", "-H", "Content-Type: application/json", diff --git a/desktop/modules/assistant/AssistantPage.qml b/desktop/modules/assistant/AssistantPage.qml index 2e40ed4..c6b63fc 100644 --- a/desktop/modules/assistant/AssistantPage.qml +++ b/desktop/modules/assistant/AssistantPage.qml @@ -165,8 +165,9 @@ Column { Small { width: page.width wrapMode: Text.Wrap - text: "The assistant answers with whichever model llama-server has loaded. Load makes one the " - + "preferred model and loads it now, which swaps out the loaded one for every client." + text: "The assistant answers with whichever model llama-server has loaded. Opening it loads " + + "the preferred model if another one is in. Load swaps a model in now, for every client, " + + "without changing the preference." } Small { @@ -211,13 +212,20 @@ Column { modelRow.preferred ? "preferred" : ""].filter(s => s).join(" · ") color: modelRow.preferred ? Theme.accent : Theme.subtext } + // Two separate choices: which model the assistant prefers, kept, + // and which one is loaded now, a swap for every client. Button { + id: loadBtn anchors { right: parent.right; rightMargin: 6; verticalCenter: parent.verticalCenter } - text: modelRow.loaded ? (modelRow.preferred ? "Loaded" : "Prefer") : "Load" - enabled: page.asst.loading === "" && !(modelRow.loaded && modelRow.preferred) - // A loaded model only becomes the preferred one: nothing to swap. - onClicked: modelRow.loaded ? Prefs.setAssistantModel(modelRow.modelData.id) - : page.asst.loadModel(modelRow.modelData.id) + text: "Load" + enabled: page.asst.loading === "" && !modelRow.loaded + onClicked: page.asst.loadModel(modelRow.modelData.id) + } + Button { + anchors { right: loadBtn.left; rightMargin: 6; verticalCenter: parent.verticalCenter } + text: modelRow.preferred ? "Preferred" : "Prefer" + enabled: !modelRow.preferred + onClicked: Prefs.setAssistantModel(modelRow.modelData.id) } } } diff --git a/desktop/modules/assistant/README.md b/desktop/modules/assistant/README.md index 93b8507..004ec05 100644 --- a/desktop/modules/assistant/README.md +++ b/desktop/modules/assistant/README.md @@ -15,9 +15,11 @@ to `.toml.off`, which the daemon's `*.toml` glob skips. The page also lists llama-server's models with their state. The daemon always answers with whichever model is loaded and never asks for one, so it never swaps a model out from under another client. Load is the -deliberate swap: it saves that model as the preferred one (in `Prefs`) -and asks the router to load it now, polling `/v1/models` until it reports -`loaded`. Prefer marks the already-loaded model as preferred. +deliberate swap: it asks the router to load that model now, polling +`/v1/models` until it reports `loaded`, and leaves the preference alone. +Prefer is the other, separate choice: the model the assistant should use, +saved in `Prefs`. A first version made Load also set the preference, so a +model loaded for another client became the assistant's too. Opening the assistant canvas (SUPER+Home) loads the preferred model when another one is resident, and the canvas header reads "loading …" -- cgit v1.2.3