prompt_message_util.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from typing import cast
  2. from core.model_runtime.entities import (
  3. AssistantPromptMessage,
  4. AudioPromptMessageContent,
  5. ImagePromptMessageContent,
  6. PromptMessage,
  7. PromptMessageContentType,
  8. PromptMessageRole,
  9. TextPromptMessageContent,
  10. )
  11. from core.prompt.simple_prompt_transform import ModelMode
  12. class PromptMessageUtil:
  13. @staticmethod
  14. def prompt_messages_to_prompt_for_saving(model_mode: str, prompt_messages: list[PromptMessage]) -> list[dict]:
  15. """
  16. Prompt messages to prompt for saving.
  17. :param model_mode: model mode
  18. :param prompt_messages: prompt messages
  19. :return:
  20. """
  21. prompts = []
  22. if model_mode == ModelMode.CHAT:
  23. tool_calls = []
  24. for prompt_message in prompt_messages:
  25. if prompt_message.role == PromptMessageRole.USER:
  26. role = "user"
  27. elif prompt_message.role == PromptMessageRole.ASSISTANT:
  28. role = "assistant"
  29. if isinstance(prompt_message, AssistantPromptMessage):
  30. tool_calls = [
  31. {
  32. "id": tool_call.id,
  33. "type": "function",
  34. "function": {
  35. "name": tool_call.function.name,
  36. "arguments": tool_call.function.arguments,
  37. },
  38. }
  39. for tool_call in prompt_message.tool_calls
  40. ]
  41. elif prompt_message.role == PromptMessageRole.SYSTEM:
  42. role = "system"
  43. elif prompt_message.role == PromptMessageRole.TOOL:
  44. role = "tool"
  45. else:
  46. continue
  47. text = ""
  48. files = []
  49. if isinstance(prompt_message.content, list):
  50. for content in prompt_message.content:
  51. if isinstance(content, TextPromptMessageContent):
  52. text += content.data
  53. elif isinstance(content, ImagePromptMessageContent):
  54. files.append(
  55. {
  56. "type": "image",
  57. "data": content.data[:10] + "...[TRUNCATED]..." + content.data[-10:],
  58. "detail": content.detail.value,
  59. }
  60. )
  61. elif isinstance(content, AudioPromptMessageContent):
  62. files.append(
  63. {
  64. "type": "audio",
  65. "data": content.data[:10] + "...[TRUNCATED]..." + content.data[-10:],
  66. "format": content.format,
  67. }
  68. )
  69. else:
  70. text = prompt_message.content
  71. prompt = {"role": role, "text": text, "files": files}
  72. if tool_calls:
  73. prompt["tool_calls"] = tool_calls
  74. prompts.append(prompt)
  75. else:
  76. prompt_message = prompt_messages[0]
  77. text = ""
  78. files = []
  79. if isinstance(prompt_message.content, list):
  80. for content in prompt_message.content:
  81. if content.type == PromptMessageContentType.TEXT:
  82. content = cast(TextPromptMessageContent, content)
  83. text += content.data
  84. else:
  85. content = cast(ImagePromptMessageContent, content)
  86. files.append(
  87. {
  88. "type": "image",
  89. "data": content.data[:10] + "...[TRUNCATED]..." + content.data[-10:],
  90. "detail": content.detail.value,
  91. }
  92. )
  93. else:
  94. text = prompt_message.content
  95. params = {
  96. "role": "user",
  97. "text": text,
  98. }
  99. if files:
  100. params["files"] = files
  101. prompts.append(params)
  102. return prompts