Timothy Jaeryang Baek 3 月之前
父節點
當前提交
1635dcb69b
共有 3 個文件被更改,包括 29 次插入16 次删除
  1. 7 1
      backend/open_webui/utils/middleware.py
  2. 12 12
      src/lib/components/chat/Chat.svelte
  3. 10 3
      src/lib/utils/index.ts

+ 7 - 1
backend/open_webui/utils/middleware.py

@@ -1120,7 +1120,7 @@ async def process_chat_response(
                             output = html.escape(json.dumps(output))
 
                             if raw:
-                                content = f'{content}<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n```output\n{output}\n```\n</details>\n'
+                                content = f'{content}<code_interpreter type="code" lang="{lang}">\n{block["content"]}\n</code_interpreter>\n```output\n{output}\n```\n'
                             else:
                                 content = f'{content}<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
                         else:
@@ -1312,6 +1312,12 @@ async def process_chat_response(
                                         )
 
                                         if end:
+                                            data = {
+                                                "content": serialize_content_blocks(
+                                                    content_blocks
+                                                ),
+                                            }
+
                                             break
 
                                     if ENABLE_REALTIME_CHAT_SAVE:

+ 12 - 12
src/lib/components/chat/Chat.svelte

@@ -45,7 +45,7 @@
 		promptTemplate,
 		splitStream,
 		sleep,
-		removeDetailsWithReasoning,
+		removeDetails,
 		getPromptVariables
 	} from '$lib/utils';
 
@@ -1338,8 +1338,17 @@
 		parentId: string,
 		{ modelId = null, modelIdx = null, newChat = false } = {}
 	) => {
-		const _chatId = JSON.parse(JSON.stringify($chatId));
+		// If modelId is provided, use it, else use selected model
+		let selectedModelIds = modelId
+			? [modelId]
+			: atSelectedModel !== undefined
+				? [atSelectedModel.id]
+				: selectedModels;
+
+		// Create response messages for each selected model
+		const responseMessageIds: Record<PropertyKey, string> = {};
 
+		const _chatId = JSON.parse(JSON.stringify($chatId));
 		// Create new chat if newChat is true and first user message
 		if (
 			newChat &&
@@ -1351,15 +1360,6 @@
 			await saveChatHandler(_chatId);
 		}
 
-		// If modelId is provided, use it, else use selected model
-		let selectedModelIds = modelId
-			? [modelId]
-			: atSelectedModel !== undefined
-				? [atSelectedModel.id]
-				: selectedModels;
-
-		// Create response messages for each selected model
-		const responseMessageIds: Record<PropertyKey, string> = {};
 		for (const [_modelIdx, modelId] of selectedModelIds.entries()) {
 			const model = $models.filter((m) => m.id === modelId).at(0);
 
@@ -1515,7 +1515,7 @@
 				: undefined,
 			...createMessagesList(history, responseMessageId).map((message) => ({
 				...message,
-				content: removeDetailsWithReasoning(message.content)
+				content: removeDetails(message.content, ['reasoning', 'code_interpreter'])
 			}))
 		]
 			.filter((message) => message?.content?.trim())

+ 10 - 3
src/lib/utils/index.ts

@@ -668,8 +668,15 @@ export const cleanText = (content: string) => {
 	return removeFormattings(removeEmojis(content.trim()));
 };
 
-export const removeDetailsWithReasoning = (content) => {
-	return content.replace(/<details\s+type="reasoning"[^>]*>.*?<\/details>/gis, '').trim();
+export const removeDetails = (content, types) => {
+	for (const type of types) {
+		content = content.replace(
+			new RegExp(`<details\\s+type="${type}"[^>]*>.*?<\\/details>`, 'gis'),
+			''
+		);
+	}
+
+	return content;
 };
 
 // This regular expression matches code blocks marked by triple backticks
@@ -741,7 +748,7 @@ export const extractSentencesForAudio = (text: string) => {
 };
 
 export const getMessageContentParts = (content: string, split_on: string = 'punctuation') => {
-	content = removeDetailsWithReasoning(content);
+	content = removeDetails(content, ['reasoning', 'code_interpreter']);
 	const messageContentParts: string[] = [];
 
 	switch (split_on) {