message_entities.py 5.1 KB

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