aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop/assistant/Assistant.qml3
-rw-r--r--desktop/assistant/Card.qml1
-rw-r--r--desktop/modules/assistant/AssistantModule.qml13
-rw-r--r--desktop/modules/assistant/README.md7
-rw-r--r--desktop/shell.qml11
5 files changed, 33 insertions, 2 deletions
diff --git a/desktop/assistant/Assistant.qml b/desktop/assistant/Assistant.qml
index f76c38d..6692648 100644
--- a/desktop/assistant/Assistant.qml
+++ b/desktop/assistant/Assistant.qml
@@ -63,6 +63,9 @@ Scope {
readonly property bool connected: link.item?.connected ?? false
property string state: "idle"
property string model: ""
+ // The preferred model being loaded on open, shown in the header until
+ // the router reports it loaded. Set from shell.qml.
+ property string swapping: ""
property int ctxUsed: 0
property int ctxMax: 0
property var convId: null
diff --git a/desktop/assistant/Card.qml b/desktop/assistant/Card.qml
index 150e483..4c76e64 100644
--- a/desktop/assistant/Card.qml
+++ b/desktop/assistant/Card.qml
@@ -83,6 +83,7 @@ Rectangle {
Text {
anchors { left: parent.left; verticalCenter: parent.verticalCenter }
text: !card.canvas.connected ? "assistant not running"
+ : card.canvas.swapping ? `loading ${card.canvas.swapping}…`
: card.canvas.model || "assistant"
color: card.canvas.connected ? Theme.text : Theme.red
font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 2 }
diff --git a/desktop/modules/assistant/AssistantModule.qml b/desktop/modules/assistant/AssistantModule.qml
index a85b2b3..b53a33f 100644
--- a/desktop/modules/assistant/AssistantModule.qml
+++ b/desktop/modules/assistant/AssistantModule.qml
@@ -198,6 +198,19 @@ Module {
else { poll.left = 300; poll.start(); }
});
}
+ // Called when the assistant canvas opens: the preferred model, if one is
+ // set, still listed, and neither loaded nor loading, is loaded. One model
+ // and one client at a time is how this desktop runs, so opening the
+ // assistant is the moment to bring its model back.
+ function ensurePreferred() {
+ const id = Prefs.assistantModel;
+ if (id === "" || am.loading !== "") return;
+ am.listModels(() => {
+ const m = am.models.find(x => x.id === id);
+ if (m && m.status !== "loaded" && m.status !== "loading") am.loadModel(id);
+ });
+ }
+
property Timer poll: Timer {
property int left: 0
interval: 1000
diff --git a/desktop/modules/assistant/README.md b/desktop/modules/assistant/README.md
index 07cc7ad..93b8507 100644
--- a/desktop/modules/assistant/README.md
+++ b/desktop/modules/assistant/README.md
@@ -19,6 +19,13 @@ 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.
+Opening the assistant canvas (SUPER+Home) loads the preferred model when
+another one is resident, and the canvas header reads "loading <model>…"
+until it is in. This desktop runs one model and one client at a time, so
+opening the assistant is when its model should come back; the daemon still
+never asks for a model itself. With no preferred model set, nothing is
+swapped.
+
The daemon reads all of this only at startup, so after a change the page
says so and offers Restart, which runs `assistant.sh restart`; a daemon that
does not come back shows the script's status, whose log tail says why.
diff --git a/desktop/shell.qml b/desktop/shell.qml
index ec58936..ea2ce67 100644
--- a/desktop/shell.qml
+++ b/desktop/shell.qml
@@ -81,7 +81,7 @@ ShellRoot {
SunsetModule {},
IdleModule {},
AutostartModule {},
- AssistantModule {},
+ AssistantModule { id: asstSettings },
PresetsModule {},
GitModule {},
]
@@ -109,7 +109,14 @@ ShellRoot {
// The assistant canvas on SUPER+Home, a view over desktop-assistant's
// socket. See assistant/README.md.
- Assistant { id: assistant }
+ Assistant { id: assistant; swapping: asstSettings.loading }
+
+ // Opening the assistant loads its preferred model if another one is in
+ // VRAM. See modules/assistant/README.md.
+ Connections {
+ target: assistant
+ function onOpenChanged() { if (assistant.open) asstSettings.ensurePreferred(); }
+ }
// The waybar launcher and the deep-link keybinds all reach this:
// qs -p <this dir> ipc call drawer toggle -> the grid