diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 4a9efbc2f5af3..03eba07ff8776 100644 Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ diff --git a/tools/server/webui/src/lib/stores/chat.svelte.ts b/tools/server/webui/src/lib/stores/chat.svelte.ts index 5a24f3f356677..e7f59d0117d08 100644 --- a/tools/server/webui/src/lib/stores/chat.svelte.ts +++ b/tools/server/webui/src/lib/stores/chat.svelte.ts @@ -307,8 +307,30 @@ class ChatStore { onError?: (error: Error) => void ): Promise { let streamedContent = ''; - let streamedReasoningContent = ''; + let modelCaptured = false; + + const captureModelIfNeeded = (updateDbImmediately = true): string | undefined => { + if (!modelCaptured) { + const currentModelName = serverStore.modelName; + + if (currentModelName) { + if (updateDbImmediately) { + DatabaseStore.updateMessage(assistantMessage.id, { model: currentModelName }).catch( + console.error + ); + } + + const messageIndex = this.findMessageIndex(assistantMessage.id); + + this.updateMessageAtIndex(messageIndex, { model: currentModelName }); + modelCaptured = true; + + return currentModelName; + } + } + return undefined; + }; slotsService.startStreaming(); @@ -319,6 +341,8 @@ class ChatStore { streamedContent += chunk; this.currentResponse = streamedContent; + captureModelIfNeeded(); + const partialThinking = extractPartialThinking(streamedContent); const messageIndex = this.findMessageIndex(assistantMessage.id); this.updateMessageAtIndex(messageIndex, { @@ -328,7 +352,11 @@ class ChatStore { onReasoningChunk: (reasoningChunk: string) => { streamedReasoningContent += reasoningChunk; + + captureModelIfNeeded(); + const messageIndex = this.findMessageIndex(assistantMessage.id); + this.updateMessageAtIndex(messageIndex, { thinking: streamedReasoningContent }); }, @@ -339,17 +367,36 @@ class ChatStore { ) => { slotsService.stopStreaming(); - await DatabaseStore.updateMessage(assistantMessage.id, { + const updateData: { + content: string; + thinking: string; + timings?: ChatMessageTimings; + model?: string; + } = { content: finalContent || streamedContent, thinking: reasoningContent || streamedReasoningContent, timings: timings - }); + }; + + const capturedModel = captureModelIfNeeded(false); + + if (capturedModel) { + updateData.model = capturedModel; + } + + await DatabaseStore.updateMessage(assistantMessage.id, updateData); const messageIndex = this.findMessageIndex(assistantMessage.id); - this.updateMessageAtIndex(messageIndex, { + const localUpdateData: { timings?: ChatMessageTimings; model?: string } = { timings: timings - }); + }; + + if (updateData.model) { + localUpdateData.model = updateData.model; + } + + this.updateMessageAtIndex(messageIndex, localUpdateData); await DatabaseStore.updateCurrentNode(this.activeConversation!.id, assistantMessage.id); this.activeConversation!.currNode = assistantMessage.id; @@ -478,9 +525,6 @@ class ChatStore { private async createAssistantMessage(parentId?: string): Promise { if (!this.activeConversation) return null; - // Capture the current model name when creating the assistant message - const currentModelName = serverStore.modelName; - return await DatabaseStore.createMessageBranch( { convId: this.activeConversation.id, @@ -489,8 +533,7 @@ class ChatStore { content: '', timestamp: Date.now(), thinking: '', - children: [], - model: currentModelName || undefined + children: [] }, parentId || null ); @@ -1287,9 +1330,6 @@ class ChatStore { this.isLoading = true; this.currentResponse = ''; - // Capture the current model name when creating the assistant message - const currentModelName = serverStore.modelName; - const newAssistantMessage = await DatabaseStore.createMessageBranch( { convId: this.activeConversation.id, @@ -1298,8 +1338,7 @@ class ChatStore { role: 'assistant', content: '', thinking: '', - children: [], - model: currentModelName || undefined + children: [] }, parentMessage.id ); @@ -1346,9 +1385,6 @@ class ChatStore { false ) as DatabaseMessage[]; - // Capture the current model name when creating the assistant message - const currentModelName = serverStore.modelName; - // Create new assistant message branch const assistantMessage = await DatabaseStore.createMessageBranch( { @@ -1358,8 +1394,7 @@ class ChatStore { role: 'assistant', content: '', thinking: '', - children: [], - model: currentModelName || undefined + children: [] }, userMessageId );