|
import itertools |
|
from abc import ABC, abstractmethod |
|
|
|
from pydantic import BaseModel |
|
|
|
from proxy_lite.history import MessageAdapter, MessageHistory |
|
from proxy_lite.tools import Tool |
|
|
|
|
|
class BaseSerializer(BaseModel, ABC): |
|
"""Base class for serializers. |
|
|
|
Serializers are responsible for converting between the internal MessageHistory/Tool |
|
objects and the external API format. Deserialise is not always possible, so raise |
|
appropriate warnings. |
|
""" |
|
|
|
@abstractmethod |
|
def serialize_messages(self, message_history: MessageHistory) -> list[dict]: ... |
|
|
|
@abstractmethod |
|
def deserialize_messages(self, data: list[dict]) -> MessageHistory: ... |
|
|
|
@abstractmethod |
|
def serialize_tools(self, tools: list[Tool]) -> list[dict]: ... |
|
|
|
|
|
class OpenAICompatibleSerializer(BaseSerializer): |
|
def serialize_messages(self, message_history: MessageHistory) -> list[dict]: |
|
return message_history.to_dict(exclude={"label"}) |
|
|
|
def deserialize_messages(self, data: list[dict]) -> MessageHistory: |
|
return MessageHistory( |
|
messages=[MessageAdapter.validate_python(message) for message in data], |
|
) |
|
|
|
def serialize_tools(self, tools: list[Tool]) -> list[dict]: |
|
tool_schemas = [[{"type": "function", "function": schema} for schema in tool.schema] for tool in tools] |
|
return list(itertools.chain.from_iterable(tool_schemas)) |
|
|