123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- from typing import cast
- from core.model_runtime.entities.message_entities import (
- AssistantPromptMessage,
- ImagePromptMessageContent,
- PromptMessage,
- PromptMessageContentType,
- PromptMessageRole,
- TextPromptMessageContent,
- )
- from core.prompt.simple_prompt_transform import ModelMode
- class PromptMessageUtil:
- @staticmethod
- def prompt_messages_to_prompt_for_saving(model_mode: str, prompt_messages: list[PromptMessage]) -> list[dict]:
- """
- Prompt messages to prompt for saving.
- :param model_mode: model mode
- :param prompt_messages: prompt messages
- :return:
- """
- prompts = []
- if model_mode == ModelMode.CHAT.value:
- tool_calls = []
- for prompt_message in prompt_messages:
- if prompt_message.role == PromptMessageRole.USER:
- role = 'user'
- elif prompt_message.role == PromptMessageRole.ASSISTANT:
- role = 'assistant'
- if isinstance(prompt_message, AssistantPromptMessage):
- tool_calls = [{
- 'id': tool_call.id,
- 'type': 'function',
- 'function': {
- 'name': tool_call.function.name,
- 'arguments': tool_call.function.arguments,
- }
- } for tool_call in prompt_message.tool_calls]
- elif prompt_message.role == PromptMessageRole.SYSTEM:
- role = 'system'
- elif prompt_message.role == PromptMessageRole.TOOL:
- role = 'tool'
- else:
- continue
- text = ''
- files = []
- if isinstance(prompt_message.content, list):
- for content in prompt_message.content:
- if content.type == PromptMessageContentType.TEXT:
- content = cast(TextPromptMessageContent, content)
- text += content.data
- else:
- content = cast(ImagePromptMessageContent, content)
- files.append({
- "type": 'image',
- "data": content.data[:10] + '...[TRUNCATED]...' + content.data[-10:],
- "detail": content.detail.value
- })
- else:
- text = prompt_message.content
- prompt = {
- "role": role,
- "text": text,
- "files": files
- }
-
- if tool_calls:
- prompt['tool_calls'] = tool_calls
- prompts.append(prompt)
- else:
- prompt_message = prompt_messages[0]
- text = ''
- files = []
- if isinstance(prompt_message.content, list):
- for content in prompt_message.content:
- if content.type == PromptMessageContentType.TEXT:
- content = cast(TextPromptMessageContent, content)
- text += content.data
- else:
- content = cast(ImagePromptMessageContent, content)
- files.append({
- "type": 'image',
- "data": content.data[:10] + '...[TRUNCATED]...' + content.data[-10:],
- "detail": content.detail.value
- })
- else:
- text = prompt_message.content
- params = {
- "role": 'user',
- "text": text,
- }
- if files:
- params['files'] = files
- prompts.append(params)
- return prompts
|