| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 | from abc import ABCfrom collections.abc import Sequencefrom enum import Enum, StrEnumfrom typing import Literal, Optionalfrom pydantic import BaseModel, Field, field_validatorclass PromptMessageRole(Enum):    """    Enum class for prompt message.    """    SYSTEM = "system"    USER = "user"    ASSISTANT = "assistant"    TOOL = "tool"    @classmethod    def value_of(cls, value: str) -> "PromptMessageRole":        """        Get value of given mode.        :param value: mode value        :return: mode        """        for mode in cls:            if mode.value == value:                return mode        raise ValueError(f"invalid prompt message type value {value}")class PromptMessageTool(BaseModel):    """    Model class for prompt message tool.    """    name: str    description: str    parameters: dictclass PromptMessageFunction(BaseModel):    """    Model class for prompt message function.    """    type: str = "function"    function: PromptMessageToolclass PromptMessageContentType(StrEnum):    """    Enum class for prompt message content type.    """    TEXT = "text"    IMAGE = "image"    AUDIO = "audio"    VIDEO = "video"    DOCUMENT = "document"class PromptMessageContent(BaseModel):    """    Model class for prompt message content.    """    type: PromptMessageContentType    data: strclass TextPromptMessageContent(PromptMessageContent):    """    Model class for text prompt message content.    """    type: PromptMessageContentType = PromptMessageContentType.TEXTclass VideoPromptMessageContent(PromptMessageContent):    type: PromptMessageContentType = PromptMessageContentType.VIDEO    data: str = Field(..., description="Base64 encoded video data")    format: str = Field(..., description="Video format")class AudioPromptMessageContent(PromptMessageContent):    type: PromptMessageContentType = PromptMessageContentType.AUDIO    data: str = Field(..., description="Base64 encoded audio data")    format: str = Field(..., description="Audio format")class ImagePromptMessageContent(PromptMessageContent):    """    Model class for image prompt message content.    """    class DETAIL(StrEnum):        LOW = "low"        HIGH = "high"    type: PromptMessageContentType = PromptMessageContentType.IMAGE    detail: DETAIL = DETAIL.LOWclass DocumentPromptMessageContent(PromptMessageContent):    type: PromptMessageContentType = PromptMessageContentType.DOCUMENT    encode_format: Literal["base64"]    mime_type: str    data: strclass PromptMessage(ABC, BaseModel):    """    Model class for prompt message.    """    role: PromptMessageRole    content: Optional[str | Sequence[PromptMessageContent]] = None    name: Optional[str] = None    def is_empty(self) -> bool:        """        Check if prompt message is empty.        :return: True if prompt message is empty, False otherwise        """        return not self.contentclass UserPromptMessage(PromptMessage):    """    Model class for user prompt message.    """    role: PromptMessageRole = PromptMessageRole.USERclass AssistantPromptMessage(PromptMessage):    """    Model class for assistant prompt message.    """    class ToolCall(BaseModel):        """        Model class for assistant prompt message tool call.        """        class ToolCallFunction(BaseModel):            """            Model class for assistant prompt message tool call function.            """            name: str            arguments: str        id: str        type: str        function: ToolCallFunction        @field_validator("id", mode="before")        @classmethod        def transform_id_to_str(cls, value) -> str:            if not isinstance(value, str):                return str(value)            else:                return value    role: PromptMessageRole = PromptMessageRole.ASSISTANT    tool_calls: list[ToolCall] = []    def is_empty(self) -> bool:        """        Check if prompt message is empty.        :return: True if prompt message is empty, False otherwise        """        if not super().is_empty() and not self.tool_calls:            return False        return Trueclass SystemPromptMessage(PromptMessage):    """    Model class for system prompt message.    """    role: PromptMessageRole = PromptMessageRole.SYSTEMclass ToolPromptMessage(PromptMessage):    """    Model class for tool prompt message.    """    role: PromptMessageRole = PromptMessageRole.TOOL    tool_call_id: str    def is_empty(self) -> bool:        """        Check if prompt message is empty.        :return: True if prompt message is empty, False otherwise        """        if not super().is_empty() and not self.tool_call_id:            return False        return True
 |