From 8e8f2fd826dcfc64e4809992dce576f966f2d2ca Mon Sep 17 00:00:00 2001 From: -LAN- Date: Wed, 23 Jul 2025 13:48:57 +0800 Subject: [PATCH] fix: handle optional content types in LLM response parsing - Add get_text_content() helper method to PromptMessage class - Update generate_suggested_questions_after_answer to use the helper method - Properly handle str, list[PromptMessageContent], and None content types --- api/core/llm_generator/llm_generator.py | 3 ++- .../suggested_questions_after_answer.py | 3 --- .../model_runtime/entities/message_entities.py | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/api/core/llm_generator/llm_generator.py b/api/core/llm_generator/llm_generator.py index f7fd93be4a..331ac933c8 100644 --- a/api/core/llm_generator/llm_generator.py +++ b/api/core/llm_generator/llm_generator.py @@ -114,7 +114,8 @@ class LLMGenerator: ), ) - questions = output_parser.parse(cast(str, response.message.content)) + text_content = response.message.get_text_content() + questions = output_parser.parse(text_content) if text_content else [] except InvokeError: questions = [] except Exception: diff --git a/api/core/llm_generator/output_parser/suggested_questions_after_answer.py b/api/core/llm_generator/output_parser/suggested_questions_after_answer.py index 5125df7177..98cdc4c8b7 100644 --- a/api/core/llm_generator/output_parser/suggested_questions_after_answer.py +++ b/api/core/llm_generator/output_parser/suggested_questions_after_answer.py @@ -10,9 +10,6 @@ class SuggestedQuestionsAfterAnswerOutputParser: return SUGGESTED_QUESTIONS_AFTER_ANSWER_INSTRUCTION_PROMPT def parse(self, text: str) -> Any: - if not isinstance(text, str): - # Optionally log a warning here - return [] action_match = re.search(r"\[.*?\]", text.strip(), re.DOTALL) if action_match is not None: json_obj = json.loads(action_match.group(0).strip()) diff --git a/api/core/model_runtime/entities/message_entities.py b/api/core/model_runtime/entities/message_entities.py index 9d010ae28d..83dc7f0525 100644 --- a/api/core/model_runtime/entities/message_entities.py +++ b/api/core/model_runtime/entities/message_entities.py @@ -156,6 +156,23 @@ class PromptMessage(ABC, BaseModel): """ return not self.content + def get_text_content(self) -> str: + """ + Get text content from prompt message. + + :return: Text content as string, empty string if no text content + """ + if isinstance(self.content, str): + return self.content + elif isinstance(self.content, list): + text_parts = [] + for item in self.content: + if isinstance(item, TextPromptMessageContent): + text_parts.append(item.data) + return "".join(text_parts) + else: + return "" + @field_validator("content", mode="before") @classmethod def validate_content(cls, v):