prompt_message_util.py 4.0 KB

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