Selaa lähdekoodia

fix: zhipuai chatglm turbo prompts must user, assistant in sequence (#1899)

takatost 1 vuosi sitten
vanhempi
commit
0c5892bcb6
1 muutettua tiedostoa jossa 29 lisäystä ja 5 poistoa
  1. 29 5
      api/core/model_runtime/model_providers/zhipuai/llm/llm.py

+ 29 - 5
api/core/model_runtime/model_providers/zhipuai/llm/llm.py

@@ -8,8 +8,9 @@ from typing import (
     Union
 )
 
-from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool, UserPromptMessage, AssistantPromptMessage, \
-    SystemPromptMessage
+from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool, UserPromptMessage, \
+    AssistantPromptMessage, \
+    SystemPromptMessage, PromptMessageRole
 from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, \
     LLMResultChunkDelta
 from core.model_runtime.errors.validate import CredentialsValidateFailedError
@@ -111,16 +112,39 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
         if len(prompt_messages) == 0:
             raise ValueError('At least one message is required')
         
-        if prompt_messages[0].role.value == 'system':
+        if prompt_messages[0].role == PromptMessageRole.SYSTEM:
             if not prompt_messages[0].content:
                 prompt_messages = prompt_messages[1:]
 
+        # resolve zhipuai model not support system message and user message, assistant message must be in sequence
+        new_prompt_messages = []
+        for prompt_message in prompt_messages:
+            copy_prompt_message = prompt_message.copy()
+            if copy_prompt_message.role in [PromptMessageRole.USER, PromptMessageRole.SYSTEM, PromptMessageRole.TOOL]:
+                if not isinstance(copy_prompt_message.content, str):
+                    # not support image message
+                    continue
+
+                if new_prompt_messages and new_prompt_messages[-1].role == PromptMessageRole.USER:
+                    new_prompt_messages[-1].content += "\n\n" + copy_prompt_message.content
+                else:
+                    if copy_prompt_message.role == PromptMessageRole.USER:
+                        new_prompt_messages.append(copy_prompt_message)
+                    else:
+                        new_prompt_message = UserPromptMessage(content=copy_prompt_message.content)
+                        new_prompt_messages.append(new_prompt_message)
+            else:
+                if new_prompt_messages and new_prompt_messages[-1].role == PromptMessageRole.ASSISTANT:
+                    new_prompt_messages[-1].content += "\n\n" + copy_prompt_message.content
+                else:
+                    new_prompt_messages.append(copy_prompt_message)
+
         params = {
             'model': model,
             'prompt': [{
-                'role': prompt_message.role.value if prompt_message.role.value != 'system' else 'user',
+                'role': prompt_message.role.value,
                 'content': prompt_message.content
-            } for prompt_message in prompt_messages],
+            } for prompt_message in new_prompt_messages],
             **model_parameters
         }