]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
webui: Fix context available value in Multi-model Router mode (#17804)
authorAleksander Grygier <redacted>
Sat, 6 Dec 2025 12:23:29 +0000 (13:23 +0100)
committerGitHub <redacted>
Sat, 6 Dec 2025 12:23:29 +0000 (13:23 +0100)
* fix: Use context size from `/props?model=...` in ROUTER mode

* chore: update webui build output

tools/server/public/index.html.gz
tools/server/webui/src/lib/stores/chat.svelte.ts
tools/server/webui/src/lib/stores/models.svelte.ts

index 38927736683ab580fd9dceb450e6022427d773a7..a9dba62abeb2190ce21f7a99cae86cd4d400eb21 100644 (file)
Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ
index dd6b77e71ae8ab005c0705b955ef71295f1524e3..167f24288f32e43312214b851b615e930a20a4e6 100644 (file)
@@ -2,7 +2,11 @@ import { DatabaseService, ChatService } from '$lib/services';
 import { conversationsStore } from '$lib/stores/conversations.svelte';
 import { config } from '$lib/stores/settings.svelte';
 import { contextSize, isRouterMode } from '$lib/stores/server.svelte';
-import { selectedModelName, modelsStore } from '$lib/stores/models.svelte';
+import {
+       selectedModelName,
+       modelsStore,
+       selectedModelContextSize
+} from '$lib/stores/models.svelte';
 import {
        normalizeModelName,
        filterByLeafNodeId,
@@ -261,6 +265,13 @@ class ChatStore {
                        return activeState.contextTotal;
                }
 
+               if (isRouterMode()) {
+                       const modelContextSize = selectedModelContextSize();
+                       if (modelContextSize && modelContextSize > 0) {
+                               return modelContextSize;
+                       }
+               }
+
                const propsContextSize = contextSize();
                if (propsContextSize && propsContextSize > 0) {
                        return propsContextSize;
@@ -458,6 +469,14 @@ class ChatStore {
                onError?: (error: Error) => void,
                modelOverride?: string | null
        ): Promise<void> {
+               // Ensure model props are cached before streaming (for correct n_ctx in processing info)
+               if (isRouterMode()) {
+                       const modelName = modelOverride || selectedModelName();
+                       if (modelName && !modelsStore.getModelProps(modelName)) {
+                               await modelsStore.fetchModelProps(modelName);
+                       }
+               }
+
                let streamedContent = '';
                let streamedReasoningContent = '';
                let streamedToolCallContent = '';
index 2e834af5a00a824bcab5e9bb957038e5049272f0..29416c2fe5becac803c786292a5af5b5d18f7e18 100644 (file)
@@ -158,6 +158,22 @@ class ModelsStore {
                return this.modelPropsCache.get(modelId) ?? null;
        }
 
+       /**
+        * Get context size (n_ctx) for a specific model from cached props
+        */
+       getModelContextSize(modelId: string): number | null {
+               const props = this.modelPropsCache.get(modelId);
+               return props?.default_generation_settings?.n_ctx ?? null;
+       }
+
+       /**
+        * Get context size for the currently selected model or null if no model is selected
+        */
+       get selectedModelContextSize(): number | null {
+               if (!this.selectedModelName) return null;
+               return this.getModelContextSize(this.selectedModelName);
+       }
+
        /**
         * Check if props are being fetched for a model
         */
@@ -579,3 +595,4 @@ export const loadedModelIds = () => modelsStore.loadedModelIds;
 export const loadingModelIds = () => modelsStore.loadingModelIds;
 export const propsCacheVersion = () => modelsStore.propsCacheVersion;
 export const singleModelName = () => modelsStore.singleModelName;
+export const selectedModelContextSize = () => modelsStore.selectedModelContextSize;