]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
ui: fix thinking menu never appearing in single-model mode (#25637)
authorPascal <redacted>
Wed, 15 Jul 2026 11:39:21 +0000 (13:39 +0200)
committerGitHub <redacted>
Wed, 15 Jul 2026 11:39:21 +0000 (13:39 +0200)
In MODEL mode, modelPropsCache is never populated: fetchModelProps
call sites are gated on router-only state (isRouterMode checks,
routerModels always empty), so supportsThinking always reads an
empty chat template once a model is auto-selected.

Read serverStore.props.chat_template directly in non-router mode,
since the global /props already describes the single loaded model.

tools/ui/src/lib/stores/models.svelte.ts

index 4c7c7cdfec243c2a18a281e8c746150bf141a5fe..0b4d7b55d9393b5183fd6981f8088d31d33ebd6e 100644 (file)
@@ -245,21 +245,20 @@ class ModelsStore {
         * Whether the selected model's chat template supports thinking/reasoning.
         * Uses heuristic detection on the model's chat_template from /props.
         *
-        * - MODEL mode: uses serverStore.props.chat_template (single loaded model)
-        * - ROUTER mode: fetches /props?model=<id> for the selected model (cached)
-        *
-        * Triggers an async fetch of model props if not yet cached in ROUTER mode.
+        * - MODEL mode: the global /props already describes the single loaded model,
+        *   so its chat_template is used directly and no per-model cache is involved
+        * - ROUTER mode: fetches /props?model=<id> for the selected model (cached),
+        *   triggering an async fetch if not yet cached
         */
        get supportsThinking(): boolean {
-               const modelId = this.selectedModelName;
-               if (!modelId) {
-                       if (!isRouterMode()) {
-                               return detectThinkingSupport(serverStore.props?.chat_template ?? '');
-                       }
-                       return false;
+               if (!isRouterMode()) {
+                       return detectThinkingSupport(serverStore.props?.chat_template ?? '');
                }
 
-               if (isRouterMode() && !this.modelPropsCache.get(modelId)) {
+               const modelId = this.selectedModelName;
+               if (!modelId) return false;
+
+               if (!this.modelPropsCache.get(modelId)) {
                        this.fetchModelProps(modelId);
                }
                const props = this.getModelProps(modelId);
@@ -268,12 +267,17 @@ class ModelsStore {
 
        /**
         * Check if a specific model supports thinking.
-        * Fetches model props if not cached (in router mode).
+        * In MODEL mode the global /props describes the single loaded model.
+        * In ROUTER mode, fetches model props if not cached.
         */
        checkModelSupportsThinking(modelId: string): boolean {
+               if (!isRouterMode()) {
+                       return detectThinkingSupport(serverStore.props?.chat_template ?? '');
+               }
+
                if (!modelId) return false;
 
-               if (isRouterMode() && !this.modelPropsCache.get(modelId)) {
+               if (!this.modelPropsCache.get(modelId)) {
                        this.fetchModelProps(modelId);
                }
 
@@ -285,14 +289,16 @@ class ModelsStore {
         * Detailed thinking support detection result with reason for debugging/UI.
         */
        get thinkingSupportDetails(): { supported: boolean; reason: string } {
+               if (!isRouterMode()) {
+                       return detectThinkingSupportWithReason(serverStore.props?.chat_template ?? '');
+               }
+
                const modelId = this.selectedModelName;
                if (!modelId) {
-                       if (!isRouterMode()) {
-                               return detectThinkingSupportWithReason(serverStore.props?.chat_template ?? '');
-                       }
                        return { supported: false, reason: 'No model selected' };
                }
-               if (isRouterMode() && !this.modelPropsCache.get(modelId)) {
+
+               if (!this.modelPropsCache.get(modelId)) {
                        this.fetchModelProps(modelId);
                }
                const props = this.getModelProps(modelId);