message_entities.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from abc import ABC
  2. from enum import Enum
  3. from typing import Optional
  4. from pydantic import BaseModel, field_validator
  5. class PromptMessageRole(Enum):
  6. """
  7. Enum class for prompt message.
  8. """
  9. SYSTEM = "system"
  10. USER = "user"
  11. ASSISTANT = "assistant"
  12. TOOL = "tool"
  13. @classmethod
  14. def value_of(cls, value: str) -> 'PromptMessageRole':
  15. """
  16. Get value of given mode.
  17. :param value: mode value
  18. :return: mode
  19. """
  20. for mode in cls:
  21. if mode.value == value:
  22. return mode
  23. raise ValueError(f'invalid prompt message type value {value}')
  24. class PromptMessageTool(BaseModel):
  25. """
  26. Model class for prompt message tool.
  27. """
  28. name: str
  29. description: str
  30. parameters: dict
  31. class PromptMessageFunction(BaseModel):
  32. """
  33. Model class for prompt message function.
  34. """
  35. type: str = 'function'
  36. function: PromptMessageTool
  37. class PromptMessageContentType(Enum):
  38. """
  39. Enum class for prompt message content type.
  40. """
  41. TEXT = 'text'
  42. IMAGE = 'image'
  43. class PromptMessageContent(BaseModel):
  44. """
  45. Model class for prompt message content.
  46. """
  47. type: PromptMessageContentType
  48. data: str
  49. class TextPromptMessageContent(PromptMessageContent):
  50. """
  51. Model class for text prompt message content.
  52. """
  53. type: PromptMessageContentType = PromptMessageContentType.TEXT
  54. class ImagePromptMessageContent(PromptMessageContent):
  55. """
  56. Model class for image prompt message content.
  57. """
  58. class DETAIL(Enum):
  59. LOW = 'low'
  60. HIGH = 'high'
  61. type: PromptMessageContentType = PromptMessageContentType.IMAGE
  62. detail: DETAIL = DETAIL.LOW
  63. class PromptMessage(ABC, BaseModel):
  64. """
  65. Model class for prompt message.
  66. """
  67. role: PromptMessageRole
  68. content: Optional[str | list[PromptMessageContent]] = None
  69. name: Optional[str] = None
  70. def is_empty(self) -> bool:
  71. """
  72. Check if prompt message is empty.
  73. :return: True if prompt message is empty, False otherwise
  74. """
  75. return not self.content
  76. class UserPromptMessage(PromptMessage):
  77. """
  78. Model class for user prompt message.
  79. """
  80. role: PromptMessageRole = PromptMessageRole.USER
  81. class AssistantPromptMessage(PromptMessage):
  82. """
  83. Model class for assistant prompt message.
  84. """
  85. class ToolCall(BaseModel):
  86. """
  87. Model class for assistant prompt message tool call.
  88. """
  89. class ToolCallFunction(BaseModel):
  90. """
  91. Model class for assistant prompt message tool call function.
  92. """
  93. name: str
  94. arguments: str
  95. id: str
  96. type: str
  97. function: ToolCallFunction
  98. @field_validator('id', mode='before')
  99. @classmethod
  100. def transform_id_to_str(cls, value) -> str:
  101. if not isinstance(value, str):
  102. return str(value)
  103. else:
  104. return value
  105. role: PromptMessageRole = PromptMessageRole.ASSISTANT
  106. tool_calls: list[ToolCall] = []
  107. def is_empty(self) -> bool:
  108. """
  109. Check if prompt message is empty.
  110. :return: True if prompt message is empty, False otherwise
  111. """
  112. if not super().is_empty() and not self.tool_calls:
  113. return False
  114. return True
  115. class SystemPromptMessage(PromptMessage):
  116. """
  117. Model class for system prompt message.
  118. """
  119. role: PromptMessageRole = PromptMessageRole.SYSTEM
  120. class ToolPromptMessage(PromptMessage):
  121. """
  122. Model class for tool prompt message.
  123. """
  124. role: PromptMessageRole = PromptMessageRole.TOOL
  125. tool_call_id: str
  126. def is_empty(self) -> bool:
  127. """
  128. Check if prompt message is empty.
  129. :return: True if prompt message is empty, False otherwise
  130. """
  131. if not super().is_empty() and not self.tool_call_id:
  132. return False
  133. return True