aidial_adapter_bedrock/llm/model/stability/message.py (60 lines of code) (raw):
from typing import List, Tuple, assert_never
from aidial_sdk.chat_completion import (
Message,
MessageContentImagePart,
MessageContentTextPart,
Role,
)
from aidial_sdk.chat_completion.request import ImageURL
from aidial_adapter_bedrock.dial_api.resource import (
AttachmentResource,
DialResource,
URLResource,
)
from aidial_adapter_bedrock.llm.errors import ValidationError
def parse_message(
message: Message, supported_types: List[str]
) -> Tuple[str | None, List[DialResource]]:
text_prompt: str | None = None
image_resources: List[DialResource] = []
match message.content:
case str(text):
text_prompt = text
case list():
text_parts: List[str] = []
for part in message.content:
match part:
case MessageContentTextPart(text=text):
text_parts.append(text)
case MessageContentImagePart(image_url=ImageURL(url=url)):
image_resources.append(
URLResource(
url=url, supported_types=supported_types
)
)
case _:
assert_never(part)
if text_parts:
text_prompt = " ".join(text_parts)
case None:
pass
case _:
assert_never(message.content)
if message.custom_content and message.custom_content.attachments:
image_resources.extend(
[
AttachmentResource(
attachment=attachment,
supported_types=supported_types,
)
for attachment in message.custom_content.attachments
]
)
return text_prompt, image_resources
def validate_last_message(messages: List[Message]):
if not messages:
raise ValidationError("No messages provided")
last_message = messages[-1]
if last_message.role != Role.USER:
raise ValidationError("Last message must be from user")
return last_message