File size: 1,389 Bytes
f0f6e5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
853581f
f0f6e5c
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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))