]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
Capture model name only after first token (streaming) or completed request (#16405)
authorAleksander Grygier <redacted>
Fri, 3 Oct 2025 09:30:39 +0000 (11:30 +0200)
committerGitHub <redacted>
Fri, 3 Oct 2025 09:30:39 +0000 (11:30 +0200)
* feat: Capture model name only after first token (streaming) or completed request (non-streaming)

* chore: update webui build output

* chore: update webui build output

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

index 4a9efbc2f5af3d9b8fa520cf8bce033951e0571e..03eba07ff8776f8fa54576184d8965b5ed6c910f 100644 (file)
Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ
index 5a24f3f356677becbffeda7c32adf5cb29e5d5e8..e7f59d0117d0889471bb3757811f5515e4311f21 100644 (file)
@@ -307,8 +307,30 @@ class ChatStore {
                onError?: (error: Error) => void
        ): Promise<void> {
                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<DatabaseMessage | null> {
                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
                        );