| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | from collections.abc import Sequencefrom typing import Any, castfrom core.model_runtime.entities import (    AssistantPromptMessage,    AudioPromptMessageContent,    ImagePromptMessageContent,    PromptMessage,    PromptMessageContentType,    PromptMessageRole,    TextPromptMessageContent,)from core.prompt.simple_prompt_transform import ModelModeclass PromptMessageUtil:    @staticmethod    def prompt_messages_to_prompt_for_saving(model_mode: str, prompt_messages: Sequence[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:            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 isinstance(content, TextPromptMessageContent):                            text += content.data                        elif isinstance(content, ImagePromptMessageContent):                            files.append(                                {                                    "type": "image",                                    "data": content.data[:10] + "...[TRUNCATED]..." + content.data[-10:],                                    "detail": content.detail.value,                                }                            )                        elif isinstance(content, AudioPromptMessageContent):                            files.append(                                {                                    "type": "audio",                                    "data": content.data[:10] + "...[TRUNCATED]..." + content.data[-10:],                                    "format": content.format,                                }                            )                else:                    text = cast(str, 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 = cast(str, prompt_message.content)            params: dict[str, Any] = {                "role": "user",                "text": text,            }            if files:                params["files"] = files            prompts.append(params)        return prompts
 |