From a05df0a81a99d4c87023e98b294c48fdd9878833 Mon Sep 17 00:00:00 2001 From: Pascal Date: Wed, 15 Jul 2026 13:39:21 +0200 Subject: [PATCH] ui: fix thinking menu never appearing in single-model mode (#25637) 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 | 40 ++++++++++++++---------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/tools/ui/src/lib/stores/models.svelte.ts b/tools/ui/src/lib/stores/models.svelte.ts index 4c7c7cdfe..0b4d7b55d 100644 --- a/tools/ui/src/lib/stores/models.svelte.ts +++ b/tools/ui/src/lib/stores/models.svelte.ts @@ -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= 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= 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);