From 536a735acc68261c50d480abda517b51d2d396c2 Mon Sep 17 00:00:00 2001 From: Roland Tannous Date: Sun, 22 Feb 2026 13:17:03 +0000 Subject: [PATCH] feat(chat): eject current model and start fresh thread on model switch --- .../frontend/src/features/chat/chat-page.tsx | 195 +++++++++--------- .../chat/hooks/use-chat-model-runtime.ts | 6 +- 2 files changed, 106 insertions(+), 95 deletions(-) diff --git a/studio/frontend/src/features/chat/chat-page.tsx b/studio/frontend/src/features/chat/chat-page.tsx index 1184183088..986a3ee642 100644 --- a/studio/frontend/src/features/chat/chat-page.tsx +++ b/studio/frontend/src/features/chat/chat-page.tsx @@ -218,9 +218,9 @@ function InlineSidebar({ className={cn( "bg-sidebar text-sidebar-foreground h-full overflow-hidden rounded-2xl corner-squircle transition-[width] duration-200 ease-linear", !collapsed && - (side === "left" - ? "border-r border-0 border-sidebar-border" - : "border-l border-0 border-sidebar-border"), + (side === "left" + ? "border-r border-0 border-sidebar-border" + : "border-l border-0 border-sidebar-border"), collapsed ? "w-0" : "w-(--sidebar-width)", )} > @@ -301,9 +301,18 @@ export function ChatPage(): ReactElement { const handleCheckpointChange = useCallback( (value: string, meta?: { isLora: boolean }) => { - void selectModel({ id: value, isLora: meta?.isLora }); + const currentCheckpoint = + useChatRuntimeStore.getState().params.checkpoint; + if (!value || value === currentCheckpoint) return; + setView({ mode: "single", newThreadNonce: crypto.randomUUID() }); + void (async () => { + if (currentCheckpoint) { + await ejectModel(); + } + await selectModel({ id: value, isLora: meta?.isLora }); + })(); }, - [selectModel], + [selectModel, ejectModel], ); const handleEject = useCallback(() => { void ejectModel(); @@ -475,99 +484,99 @@ export function ChatPage(): ReactElement { return (
- - - - - + + + + + -
-
-
- - - - {loadingModel ? ( -
- - - Downloading model… - -
- ) : null} -
- {modelsError && ( -
- {modelsError} +
+
+
+ + + + {loadingModel ? ( +
+ + + Downloading model… + +
+ ) : null}
+ {modelsError && ( +
+ {modelsError} +
+ )} +
+ +
+ + {view.mode === "single" ? ( + + ) : ( + )} -
-
- {view.mode === "single" ? ( - - ) : ( - - )} -
- - - + +
); } diff --git a/studio/frontend/src/features/chat/hooks/use-chat-model-runtime.ts b/studio/frontend/src/features/chat/hooks/use-chat-model-runtime.ts index 961967cc9c..3dca94d7f5 100644 --- a/studio/frontend/src/features/chat/hooks/use-chat-model-runtime.ts +++ b/studio/frontend/src/features/chat/hooks/use-chat-model-runtime.ts @@ -165,8 +165,10 @@ export function useChatModelRuntime() { setLoadingModel({ id: modelId, displayName }); try { async function performLoad(): Promise { - if (params.checkpoint) { - await unloadModel({ model_path: params.checkpoint }); + const currentCheckpoint = + useChatRuntimeStore.getState().params.checkpoint; + if (currentCheckpoint) { + await unloadModel({ model_path: currentCheckpoint }); } const loadResponse = await loadModel({