prompt_message_util.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. 'id': tool_call.id,
  31. 'type': 'function',
  32. 'function': {
  33. 'name': tool_call.function.name,
  34. 'arguments': tool_call.function.arguments,
  35. }
  36. } for tool_call in prompt_message.tool_calls]
  37. elif prompt_message.role == PromptMessageRole.SYSTEM:
  38. role = 'system'
  39. elif prompt_message.role == PromptMessageRole.TOOL:
  40. role = 'tool'
  41. else:
  42. continue
  43. text = ''
  44. files = []
  45. if isinstance(prompt_message.content, list):
  46. for content in prompt_message.content:
  47. if content.type == PromptMessageContentType.TEXT:
  48. content = cast(TextPromptMessageContent, content)
  49. text += content.data
  50. else:
  51. content = cast(ImagePromptMessageContent, content)
  52. files.append({
  53. "type": 'image',
  54. "data": content.data[:10] + '...[TRUNCATED]...' + content.data[-10:],
  55. "detail": content.detail.value
  56. })
  57. else:
  58. text = prompt_message.content
  59. prompt = {
  60. "role": role,
  61. "text": text,
  62. "files": files
  63. }
  64. if tool_calls:
  65. prompt['tool_calls'] = tool_calls
  66. prompts.append(prompt)
  67. else:
  68. prompt_message = prompt_messages[0]
  69. text = ''
  70. files = []
  71. if isinstance(prompt_message.content, list):
  72. for content in prompt_message.content:
  73. if content.type == PromptMessageContentType.TEXT:
  74. content = cast(TextPromptMessageContent, content)
  75. text += content.data
  76. else:
  77. content = cast(ImagePromptMessageContent, content)
  78. files.append({
  79. "type": 'image',
  80. "data": content.data[:10] + '...[TRUNCATED]...' + content.data[-10:],
  81. "detail": content.detail.value
  82. })
  83. else:
  84. text = prompt_message.content
  85. params = {
  86. "role": 'user',
  87. "text": text,
  88. }
  89. if files:
  90. params['files'] = files
  91. prompts.append(params)
  92. return prompts