prompt_message_util.py 4.4 KB

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