Skip to content

message

dandy.llm.request.message

RoleLiteralStr = Literal['user', 'assistant', 'system'] module-attribute

DetailLiteralStr = Literal['auto', 'low', 'high'] module-attribute

TypeLiteralStr = Literal['text', 'image_url', 'input_audio'] module-attribute

ImageUrl

Bases: BaseModel

url instance-attribute

detail = 'auto' class-attribute instance-attribute

InputAudio

Bases: BaseModel

data instance-attribute

format instance-attribute

as_data_encoded_base64

Source code in dandy/llm/request/message.py
def as_data_encoded_base64(self) -> str:
    return f'data:audio/{self.format};base64,{self.data}'

MessageContent

Bases: BaseModel

type instance-attribute

text = None class-attribute instance-attribute

image_url = None class-attribute instance-attribute

input_audio = None class-attribute instance-attribute

as_str

Source code in dandy/llm/request/message.py
def as_str(self) -> str:
    if self.type == 'text' and self.text:
        return self.text

    if self.type == 'image_url' and self.image_url:
        return self.image_url.__str__()

    if self.type == 'input_audio' and self.input_audio:
        return self.input_audio.as_data_encoded_base64()

    return self.__str__()

Message

Bases: BaseModel

role instance-attribute

content = Field(default_factory=list) class-attribute instance-attribute

estimated_token_count property

add_content_from_text

Source code in dandy/llm/request/message.py
def add_content_from_text(self, text: str):
    self.content.append(
        MessageContent(type='text', text=text)
    )

add_content_from_image_url

Source code in dandy/llm/request/message.py
def add_content_from_image_url(self, image_url: str):
    self.content.append(
        MessageContent(type='image_url', image_url=ImageUrl(url=image_url))
    )

add_content_from_image_file_path

Source code in dandy/llm/request/message.py
def add_content_from_image_file_path(self, image_file_path: Path | str):
    with open(Path(image_file_path), 'rb') as image_file:
        self.add_content_from_image_base64_string(
            image_base64_string=base64.b64encode(
                image_file.read()
            ).decode('utf-8')
        )

add_content_from_image_base64_string

Source code in dandy/llm/request/message.py
def add_content_from_image_base64_string(self, image_base64_string: str):
    self.content.append(
        MessageContent(
            type='image_url',
            image_url=ImageUrl(
                url=f'data:{get_image_mime_type_from_base64_string(image_base64_string)};base64,{image_base64_string}'
            )
        )
    )

add_content_from_input_audio_url

Source code in dandy/llm/request/message.py
def add_content_from_input_audio_url(self, input_audio_url: str):
    self.content.append(
        MessageContent(
            type='input_audio',
            input_audio=InputAudio(
                data=input_audio_url,
                format=get_file_extension_from_url_string(input_audio_url)
            )
        )
    )

add_content_from_input_audio_file_path

Source code in dandy/llm/request/message.py
def add_content_from_input_audio_file_path(self, input_audio_file_path: Path | str):
    with open(Path(input_audio_file_path), 'rb') as input_audio_file:
        self.add_content_from_input_audio_base64_string(
            input_audio_base64_string=base64.b64encode(
                input_audio_file.read()
            ).decode('utf-8')
        )

add_content_from_input_audio_base64_string

Source code in dandy/llm/request/message.py
def add_content_from_input_audio_base64_string(self, input_audio_base64_string: str):
    self.content.append(
        MessageContent(
            type='input_audio',
            input_audio=InputAudio(
                data=input_audio_base64_string,
                format=get_audio_format_from_base64_string(input_audio_base64_string)
            )
        )
    )

MessageHistory

Bases: BaseModel

messages = Field(default_factory=list) class-attribute instance-attribute

estimated_token_count property

has_system_message property

__len__

Source code in dandy/llm/request/message.py
def __len__(self) -> int:
    return len(self.messages)

__getitem__

Source code in dandy/llm/request/message.py
def __getitem__(self, index: int) -> list[Message] | Message:
    return self.messages[index]

__iter__

Source code in dandy/llm/request/message.py
def __iter__(self) -> Iterator[list[Message] | Message]:
    yield from self.messages

__setitem__

Source code in dandy/llm/request/message.py
def __setitem__(self, index: int, message: Message) -> None:
    self.messages[index] = message

add_message

Source code in dandy/llm/request/message.py
def add_message(
        self,
        role: RoleLiteralStr,
        text: str | None = None,
        image_urls: list[str] | None = None,
        image_file_paths: list[Path | str] | None = None,
        image_base64_strings: list[str] | None = None,
        audio_urls: list[str] | None = None,
        audio_file_paths: list[str] | None = None,
        audio_base64_strings: list[str] | None = None,
        prepend: bool = False,
) -> None:
    message = Message(role=role)

    if text is not None:
        message.add_content_from_text(text=text)

    for image_url in image_urls or []:
        message.add_content_from_image_url(
            image_url=image_url
        )

    for image_file_path in image_file_paths or []:
        message.add_content_from_image_file_path(
            image_file_path=image_file_path
        )

    for image_base64_string in image_base64_strings or []:
        message.add_content_from_image_base64_string(
            image_base64_string=image_base64_string
        )

    for audio_url in audio_urls or []:
        message.add_content_from_input_audio_url(
            input_audio_url=audio_url
        )

    for audio_file_path in audio_file_paths or []:
        message.add_content_from_input_audio_file_path(
            input_audio_file_path=audio_file_path
        )

    for audio_base64_string in audio_base64_strings or []:
        message.add_content_from_input_audio_base64_string(
            input_audio_base64_string=audio_base64_string
        )

    if prepend:
        self.prepend(message)
    else:
        self.append(message)

append

Source code in dandy/llm/request/message.py
def append(self, message: Message) -> None:
    self.messages.append(message)

extend

Source code in dandy/llm/request/message.py
def extend(self, messages: list[Message]) -> None:
    self.messages.extend(messages)

prepend

Source code in dandy/llm/request/message.py
def prepend(self, message: Message) -> None:
    self.messages.insert(0, message)