From 9ea59333b8636247a29296b98e21abb794e23d7e Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Fri, 6 Feb 2026 14:54:26 +0100 Subject: [PATCH] fix: Context info fixes & improvements --- .../app/dialogs/DialogChatError.svelte | 7 ++++++- .../app/dialogs/DialogModelInformation.svelte | 21 +++++++++++++------ .../components/app/server/ServerStatus.svelte | 2 +- .../src/lib/constants/default-context.ts | 1 - .../lib/hooks/use-processing-state.svelte.ts | 12 +++++++++-- .../webui/src/lib/stores/chat.svelte.ts | 18 +++++++++------- .../webui/src/lib/stores/models.svelte.ts | 4 +++- .../webui/src/lib/stores/server.svelte.ts | 4 +++- tools/server/webui/src/lib/types/api.d.ts | 2 +- 9 files changed, 50 insertions(+), 21 deletions(-) delete mode 100644 tools/server/webui/src/lib/constants/default-context.ts diff --git a/tools/server/webui/src/lib/components/app/dialogs/DialogChatError.svelte b/tools/server/webui/src/lib/components/app/dialogs/DialogChatError.svelte index 4e0e11317a..54a3c90d3c 100644 --- a/tools/server/webui/src/lib/components/app/dialogs/DialogChatError.svelte +++ b/tools/server/webui/src/lib/components/app/dialogs/DialogChatError.svelte @@ -59,7 +59,12 @@ Prompt tokens: {contextInfo.n_prompt_tokens.toLocaleString()}

-

Context size: {contextInfo.n_ctx.toLocaleString()}

+ {#if contextInfo.n_ctx} +

+ Context size: + {contextInfo.n_ctx.toLocaleString()} +

+ {/if} {/if} diff --git a/tools/server/webui/src/lib/components/app/dialogs/DialogModelInformation.svelte b/tools/server/webui/src/lib/components/app/dialogs/DialogModelInformation.svelte index fdf02ed1c2..25d8a55748 100644 --- a/tools/server/webui/src/lib/components/app/dialogs/DialogModelInformation.svelte +++ b/tools/server/webui/src/lib/components/app/dialogs/DialogModelInformation.svelte @@ -105,12 +105,21 @@ - - Context Size - {formatNumber(serverProps.default_generation_settings.n_ctx)} tokens - + {#if serverProps?.default_generation_settings?.n_ctx} + + Context Size + {formatNumber(serverProps.default_generation_settings.n_ctx)} tokens + + {:else} + + Context Size + Not available + + {/if} {#if modelMeta?.n_ctx_train} diff --git a/tools/server/webui/src/lib/components/app/server/ServerStatus.svelte b/tools/server/webui/src/lib/components/app/server/ServerStatus.svelte index d9f6d4a32a..86a962de12 100644 --- a/tools/server/webui/src/lib/components/app/server/ServerStatus.svelte +++ b/tools/server/webui/src/lib/components/app/server/ServerStatus.svelte @@ -48,7 +48,7 @@ {model || 'Unknown Model'} - {#if serverData.default_generation_settings.n_ctx} + {#if serverData?.default_generation_settings?.n_ctx} ctx: {serverData.default_generation_settings.n_ctx.toLocaleString()} diff --git a/tools/server/webui/src/lib/constants/default-context.ts b/tools/server/webui/src/lib/constants/default-context.ts deleted file mode 100644 index 78f31116e3..0000000000 --- a/tools/server/webui/src/lib/constants/default-context.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_CONTEXT = 4096; diff --git a/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts b/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts index b8d4616d0e..1205d9b973 100644 --- a/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts +++ b/tools/server/webui/src/lib/hooks/use-processing-state.svelte.ts @@ -147,7 +147,11 @@ export function useProcessingState(): UseProcessingStateReturn { } // Always show context info when we have valid data - if (stateToUse.contextUsed >= 0 && stateToUse.contextTotal > 0) { + if ( + typeof stateToUse.contextTotal === 'number' && + stateToUse.contextUsed >= 0 && + stateToUse.contextTotal > 0 + ) { const contextPercent = Math.round((stateToUse.contextUsed / stateToUse.contextTotal) * 100); details.push( @@ -193,7 +197,11 @@ export function useProcessingState(): UseProcessingStateReturn { const details: string[] = []; // Always show context info when we have valid data - if (stateToUse.contextUsed >= 0 && stateToUse.contextTotal > 0) { + if ( + typeof stateToUse.contextTotal === 'number' && + stateToUse.contextUsed >= 0 && + stateToUse.contextTotal > 0 + ) { const contextPercent = Math.round((stateToUse.contextUsed / stateToUse.contextTotal) * 100); details.push( diff --git a/tools/server/webui/src/lib/stores/chat.svelte.ts b/tools/server/webui/src/lib/stores/chat.svelte.ts index 7bb5e3b5f4..dc21d9444b 100644 --- a/tools/server/webui/src/lib/stores/chat.svelte.ts +++ b/tools/server/webui/src/lib/stores/chat.svelte.ts @@ -30,7 +30,6 @@ import { findLeafNode, isAbortError } from '$lib/utils'; -import { DEFAULT_CONTEXT } from '$lib/constants/default-context'; import { SYSTEM_MESSAGE_PLACEHOLDER } from '$lib/constants/ui'; import { REASONING_TAGS } from '$lib/constants/agentic'; import { @@ -1252,17 +1251,22 @@ class ChatStore { } } - private getContextTotal(): number { + private getContextTotal(): number | null { const activeConvId = this.activeConversationId; const activeState = activeConvId ? this.getProcessingState(activeConvId) : null; - if (activeState && activeState.contextTotal > 0) return activeState.contextTotal; + + if (activeState && typeof activeState.contextTotal === 'number' && activeState.contextTotal > 0) + return activeState.contextTotal; + if (isRouterMode()) { const modelContextSize = selectedModelContextSize(); - if (modelContextSize && modelContextSize > 0) return modelContextSize; + if (typeof modelContextSize === 'number' && modelContextSize > 0) return modelContextSize; + } else { + const propsContextSize = contextSize(); + if (typeof propsContextSize === 'number' && propsContextSize > 0) return propsContextSize; } - const propsContextSize = contextSize(); - if (propsContextSize && propsContextSize > 0) return propsContextSize; - return DEFAULT_CONTEXT; + + return null; } updateProcessingStateFromTimings( diff --git a/tools/server/webui/src/lib/stores/models.svelte.ts b/tools/server/webui/src/lib/stores/models.svelte.ts index 6451f6df84..4cb6167220 100644 --- a/tools/server/webui/src/lib/stores/models.svelte.ts +++ b/tools/server/webui/src/lib/stores/models.svelte.ts @@ -178,7 +178,9 @@ class ModelsStore { */ getModelContextSize(modelId: string): number | null { const props = this.getModelProps(modelId); - return props?.default_generation_settings?.n_ctx ?? null; + const nCtx = props?.default_generation_settings?.n_ctx; + + return typeof nCtx === 'number' ? nCtx : null; } /** diff --git a/tools/server/webui/src/lib/stores/server.svelte.ts b/tools/server/webui/src/lib/stores/server.svelte.ts index 47328a0adc..48874bf1b7 100644 --- a/tools/server/webui/src/lib/stores/server.svelte.ts +++ b/tools/server/webui/src/lib/stores/server.svelte.ts @@ -45,7 +45,9 @@ class ServerStore { } get contextSize(): number | null { - return this.props?.default_generation_settings?.n_ctx ?? null; + const nCtx = this.props?.default_generation_settings?.n_ctx; + + return typeof nCtx === 'number' ? nCtx : null; } get webuiSettings(): Record | undefined { diff --git a/tools/server/webui/src/lib/types/api.d.ts b/tools/server/webui/src/lib/types/api.d.ts index b73fe4acb9..307e3b71d9 100644 --- a/tools/server/webui/src/lib/types/api.d.ts +++ b/tools/server/webui/src/lib/types/api.d.ts @@ -351,7 +351,7 @@ export interface ApiProcessingState { tokensDecoded: number; tokensRemaining: number; contextUsed: number; - contextTotal: number; + contextTotal: number | null; outputTokensUsed: number; // Total output tokens (thinking + regular content) outputTokensMax: number; // Max output tokens allowed temperature: number;