message_entities.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from collections.abc import Sequence
  2. from enum import Enum, StrEnum
  3. from typing import Optional
  4. from pydantic import BaseModel, Field, 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(StrEnum):
  38. """
  39. Enum class for prompt message content type.
  40. """
  41. TEXT = "text"
  42. IMAGE = "image"
  43. AUDIO = "audio"
  44. VIDEO = "video"
  45. DOCUMENT = "document"
  46. class PromptMessageContent(BaseModel):
  47. """
  48. Model class for prompt message content.
  49. """
  50. type: PromptMessageContentType
  51. class TextPromptMessageContent(PromptMessageContent):
  52. """
  53. Model class for text prompt message content.
  54. """
  55. type: PromptMessageContentType = PromptMessageContentType.TEXT
  56. data: str
  57. class MultiModalPromptMessageContent(PromptMessageContent):
  58. """
  59. Model class for multi-modal prompt message content.
  60. """
  61. type: PromptMessageContentType
  62. format: str = Field(default=..., description="the format of multi-modal file")
  63. base64_data: str = Field(default="", description="the base64 data of multi-modal file")
  64. url: str = Field(default="", description="the url of multi-modal file")
  65. mime_type: str = Field(default=..., description="the mime type of multi-modal file")
  66. @property
  67. def data(self):
  68. return self.url or f"data:{self.mime_type};base64,{self.base64_data}"
  69. class VideoPromptMessageContent(MultiModalPromptMessageContent):
  70. type: PromptMessageContentType = PromptMessageContentType.VIDEO
  71. class AudioPromptMessageContent(MultiModalPromptMessageContent):
  72. type: PromptMessageContentType = PromptMessageContentType.AUDIO
  73. class ImagePromptMessageContent(MultiModalPromptMessageContent):
  74. """
  75. Model class for image prompt message content.
  76. """
  77. class DETAIL(StrEnum):
  78. LOW = "low"
  79. HIGH = "high"
  80. type: PromptMessageContentType = PromptMessageContentType.IMAGE
  81. detail: DETAIL = DETAIL.LOW
  82. class DocumentPromptMessageContent(MultiModalPromptMessageContent):
  83. type: PromptMessageContentType = PromptMessageContentType.DOCUMENT
  84. class PromptMessage(BaseModel):
  85. """
  86. Model class for prompt message.
  87. """
  88. role: PromptMessageRole
  89. content: Optional[str | Sequence[PromptMessageContent]] = None
  90. name: Optional[str] = None
  91. def is_empty(self) -> bool:
  92. """
  93. Check if prompt message is empty.
  94. :return: True if prompt message is empty, False otherwise
  95. """
  96. return not self.content
  97. class UserPromptMessage(PromptMessage):
  98. """
  99. Model class for user prompt message.
  100. """
  101. role: PromptMessageRole = PromptMessageRole.USER
  102. class AssistantPromptMessage(PromptMessage):
  103. """
  104. Model class for assistant prompt message.
  105. """
  106. class ToolCall(BaseModel):
  107. """
  108. Model class for assistant prompt message tool call.
  109. """
  110. class ToolCallFunction(BaseModel):
  111. """
  112. Model class for assistant prompt message tool call function.
  113. """
  114. name: str
  115. arguments: str
  116. id: str
  117. type: str
  118. function: ToolCallFunction
  119. @field_validator("id", mode="before")
  120. @classmethod
  121. def transform_id_to_str(cls, value) -> str:
  122. if not isinstance(value, str):
  123. return str(value)
  124. else:
  125. return value
  126. role: PromptMessageRole = PromptMessageRole.ASSISTANT
  127. tool_calls: list[ToolCall] = []
  128. def is_empty(self) -> bool:
  129. """
  130. Check if prompt message is empty.
  131. :return: True if prompt message is empty, False otherwise
  132. """
  133. if not super().is_empty() and not self.tool_calls:
  134. return False
  135. return True
  136. class SystemPromptMessage(PromptMessage):
  137. """
  138. Model class for system prompt message.
  139. """
  140. role: PromptMessageRole = PromptMessageRole.SYSTEM
  141. class ToolPromptMessage(PromptMessage):
  142. """
  143. Model class for tool prompt message.
  144. """
  145. role: PromptMessageRole = PromptMessageRole.TOOL
  146. tool_call_id: str
  147. def is_empty(self) -> bool:
  148. """
  149. Check if prompt message is empty.
  150. :return: True if prompt message is empty, False otherwise
  151. """
  152. if not super().is_empty() and not self.tool_call_id:
  153. return False
  154. return True