From 6f45fcfb1ef9a7c1552b4ccd4f28edc378bb3546 Mon Sep 17 00:00:00 2001 From: jiangpeiling Date: Thu, 6 Nov 2025 10:51:03 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=90=9B=20Button=20text=20in=20agent?= =?UTF-8?q?=20tools=20modal=20are=20not=20centered.=20#1506?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/services/conversation_management_service.py | 3 ++- frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx | 5 ++--- frontend/services/conversationService.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/services/conversation_management_service.py b/backend/services/conversation_management_service.py index c489c0fb9..6b9a84e1a 100644 --- a/backend/services/conversation_management_service.py +++ b/backend/services/conversation_management_service.py @@ -277,7 +277,8 @@ def call_llm_for_title(content: str, tenant_id: str, language: str = LANGUAGE["Z # Call the model response = llm(messages, max_tokens=10) - + if response is None or response.content is None: + return "" return remove_think_blocks(response.content.strip()) diff --git a/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx b/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx index f8e53a46b..15abd982a 100644 --- a/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx +++ b/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx @@ -897,9 +897,8 @@ export const handleStreamResponse = async ( history, }); // Update the title above the conversation - if (title) { - setConversationTitle(title); - } + const finalTitle = title || t("chatInterface.newConversation"); + setConversationTitle(finalTitle); // Update the list await fetchConversationList(); } catch (error) { diff --git a/frontend/services/conversationService.ts b/frontend/services/conversationService.ts index 7537a803c..acc82bee7 100644 --- a/frontend/services/conversationService.ts +++ b/frontend/services/conversationService.ts @@ -802,7 +802,7 @@ export const conversationService = { const data = await response.json(); if (data.code === 0) { - return data.data; + return data.data || null; } throw new ApiError(data.code, data.message); From 4fee6e6b4706cd567baaff991778a5343f5b0cbf Mon Sep 17 00:00:00 2001 From: jiangpeiling Date: Thu, 6 Nov 2025 11:08:29 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=90=9B=20Button=20text=20in=20agent?= =?UTF-8?q?=20tools=20modal=20are=20not=20centered.=20#1506?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/consts/const.py | 3 +++ backend/services/conversation_management_service.py | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/consts/const.py b/backend/consts/const.py index 2877a4b7a..7a01b1d45 100644 --- a/backend/consts/const.py +++ b/backend/consts/const.py @@ -271,3 +271,6 @@ # APP Version APP_VERSION = "v1.7.5.1" + +DEFAULT_ZH_TITLE = "新对话" +DEFAULT_EN_TITLE = "New Conversation" diff --git a/backend/services/conversation_management_service.py b/backend/services/conversation_management_service.py index 6b9a84e1a..a794598df 100644 --- a/backend/services/conversation_management_service.py +++ b/backend/services/conversation_management_service.py @@ -7,7 +7,7 @@ from jinja2 import StrictUndefined, Template from smolagents import OpenAIServerModel -from consts.const import LANGUAGE, MODEL_CONFIG_MAPPING, MESSAGE_ROLE +from consts.const import LANGUAGE, MODEL_CONFIG_MAPPING, MESSAGE_ROLE, DEFAULT_EN_TITLE, DEFAULT_ZH_TITLE from consts.model import AgentRequest, ConversationResponse, MessageRequest, MessageUnit from database.conversation_db import ( create_conversation, @@ -277,8 +277,8 @@ def call_llm_for_title(content: str, tenant_id: str, language: str = LANGUAGE["Z # Call the model response = llm(messages, max_tokens=10) - if response is None or response.content is None: - return "" + if not response or not response.content or not response.content.strip(): + return DEFAULT_EN_TITLE if language == LANGUAGE["EN"] else DEFAULT_ZH_TITLE return remove_think_blocks(response.content.strip()) From dca4345a5469fc73fc19e7433222e08286372757 Mon Sep 17 00:00:00 2001 From: jiangpeiling Date: Thu, 6 Nov 2025 11:13:21 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=90=9B=20Button=20text=20in=20agent?= =?UTF-8?q?=20tools=20modal=20are=20not=20centered.=20#1506?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/services/conversationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/services/conversationService.ts b/frontend/services/conversationService.ts index acc82bee7..7537a803c 100644 --- a/frontend/services/conversationService.ts +++ b/frontend/services/conversationService.ts @@ -802,7 +802,7 @@ export const conversationService = { const data = await response.json(); if (data.code === 0) { - return data.data || null; + return data.data; } throw new ApiError(data.code, data.message); From 87bc31d12391a38fd4e6c32876358c0e1ccbd26d Mon Sep 17 00:00:00 2001 From: jiangpeiling Date: Thu, 6 Nov 2025 11:24:28 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=90=9B=20Button=20text=20in=20agent?= =?UTF-8?q?=20tools=20modal=20are=20not=20centered.=20#1506?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx b/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx index 15abd982a..f8e53a46b 100644 --- a/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx +++ b/frontend/app/[locale]/chat/streaming/chatStreamHandler.tsx @@ -897,8 +897,9 @@ export const handleStreamResponse = async ( history, }); // Update the title above the conversation - const finalTitle = title || t("chatInterface.newConversation"); - setConversationTitle(finalTitle); + if (title) { + setConversationTitle(title); + } // Update the list await fetchConversationList(); } catch (error) { From 3f560a0c18b376245565f3b387ee41ab2d4b2ff5 Mon Sep 17 00:00:00 2001 From: jiangpeiling Date: Thu, 6 Nov 2025 11:51:27 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=90=9B=20Button=20text=20in=20agent?= =?UTF-8?q?=20tools=20modal=20are=20not=20centered.=20#1506?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_conversation_management_service.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/test/backend/services/test_conversation_management_service.py b/test/backend/services/test_conversation_management_service.py index 009f7a84a..8c582fb02 100644 --- a/test/backend/services/test_conversation_management_service.py +++ b/test/backend/services/test_conversation_management_service.py @@ -346,6 +346,68 @@ def test_call_llm_for_title(self, mock_get_model_config, mock_get_prompt_templat mock_llm_instance.assert_called_once() mock_get_prompt_template.assert_called_once_with(language='zh') + @patch('backend.services.conversation_management_service.OpenAIServerModel') + @patch('backend.services.conversation_management_service.get_generate_title_prompt_template') + @patch('backend.services.conversation_management_service.tenant_config_manager.get_model_config') + def test_call_llm_for_title_response_none_zh(self, mock_get_model_config, mock_get_prompt_template, mock_openai): + """Test call_llm_for_title returns default ZH title when response is None.""" + # Setup + mock_get_model_config.return_value = { + "model_name": "gpt-4", + "model_repo": "openai", + "base_url": "http://example.com", + "api_key": "fake-key" + } + + mock_prompt_template = { + "SYSTEM_PROMPT": "Generate a short title", + "USER_PROMPT": "Generate a title for: {{content}}" + } + mock_get_prompt_template.return_value = mock_prompt_template + + mock_llm_instance = mock_openai.return_value + mock_llm_instance.return_value = None + + # Execute + result = call_llm_for_title( + "What is AI?", tenant_id=self.tenant_id, language="zh") + + # Assert + self.assertEqual(result, "新对话") + mock_openai.assert_called_once() + mock_get_prompt_template.assert_called_once_with(language='zh') + + @patch('backend.services.conversation_management_service.OpenAIServerModel') + @patch('backend.services.conversation_management_service.get_generate_title_prompt_template') + @patch('backend.services.conversation_management_service.tenant_config_manager.get_model_config') + def test_call_llm_for_title_response_none_en(self, mock_get_model_config, mock_get_prompt_template, mock_openai): + """Test call_llm_for_title returns default EN title when response is None.""" + # Setup + mock_get_model_config.return_value = { + "model_name": "gpt-4", + "model_repo": "openai", + "base_url": "http://example.com", + "api_key": "fake-key" + } + + mock_prompt_template = { + "SYSTEM_PROMPT": "Generate a short title", + "USER_PROMPT": "Generate a title for: {{content}}" + } + mock_get_prompt_template.return_value = mock_prompt_template + + mock_llm_instance = mock_openai.return_value + mock_llm_instance.return_value = None + + # Execute + result = call_llm_for_title( + "What is AI?", tenant_id=self.tenant_id, language="en") + + # Assert + self.assertEqual(result, "New Conversation") + mock_openai.assert_called_once() + mock_get_prompt_template.assert_called_once_with(language='en') + @patch('backend.services.conversation_management_service.rename_conversation') def test_update_conversation_title(self, mock_rename_conversation): # Setup