Skip to content
Snippets Groups Projects
schema.py 2.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • James Briggs's avatar
    James Briggs committed
    from enum import Enum
    
    hananel's avatar
    hananel committed
    from typing import Optional, Literal
    
    Simonas's avatar
    Simonas committed
    
    
    from pydantic import BaseModel
    
    from pydantic.dataclasses import dataclass
    
    Simonas's avatar
    Simonas committed
    
    
    James Briggs's avatar
    James Briggs committed
    from semantic_router.encoders import (
        BaseEncoder,
        CohereEncoder,
    
    James Briggs's avatar
    James Briggs committed
        OpenAIEncoder,
    
    James Briggs's avatar
    James Briggs committed
    )
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
    from semantic_router.utils.splitters import semantic_splitter
    
    
    James Briggs's avatar
    James Briggs committed
    
    
    James Briggs's avatar
    James Briggs committed
    class EncoderType(Enum):
    
    James Briggs's avatar
    James Briggs committed
        HUGGINGFACE = "huggingface"
    
        FASTEMBED = "fastembed"
    
    James Briggs's avatar
    James Briggs committed
        OPENAI = "openai"
        COHERE = "cohere"
    
    
    Simonas's avatar
    Simonas committed
    
    
        name: Optional[str] = None
        function_call: Optional[dict] = None
    
    Simonas's avatar
    Simonas committed
        similarity_score: Optional[float] = None
        trigger: Optional[bool] = None
    
    James Briggs's avatar
    James Briggs committed
    @dataclass
    
    James Briggs's avatar
    James Briggs committed
    class Encoder:
    
    James Briggs's avatar
    James Briggs committed
        type: EncoderType
    
        name: Optional[str]
    
    James Briggs's avatar
    James Briggs committed
        model: BaseEncoder
    
    James Briggs's avatar
    James Briggs committed
    
    
        def __init__(self, type: str, name: Optional[str]):
    
    James Briggs's avatar
    James Briggs committed
            self.type = EncoderType(type)
    
    James Briggs's avatar
    James Briggs committed
            self.name = name
    
    James Briggs's avatar
    James Briggs committed
            if self.type == EncoderType.HUGGINGFACE:
    
                raise NotImplementedError
    
            elif self.type == EncoderType.FASTEMBED:
    
    James Briggs's avatar
    James Briggs committed
                self.model = FastEmbedEncoder(name=name)
    
    James Briggs's avatar
    James Briggs committed
            elif self.type == EncoderType.OPENAI:
    
    James Briggs's avatar
    James Briggs committed
                self.model = OpenAIEncoder(name=name)
    
    James Briggs's avatar
    James Briggs committed
            elif self.type == EncoderType.COHERE:
    
    James Briggs's avatar
    James Briggs committed
                self.model = CohereEncoder(name=name)
    
    James Briggs's avatar
    James Briggs committed
            else:
    
    James Briggs's avatar
    James Briggs committed
                raise ValueError
    
    James Briggs's avatar
    James Briggs committed
    
    
    Simonas's avatar
    Simonas committed
        def __call__(self, texts: list[str]) -> list[list[float]]:
    
    James Briggs's avatar
    James Briggs committed
            return self.model(texts)
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
    
    
    class Message(BaseModel):
        role: str
        content: str
    
    
    hananel's avatar
    hananel committed
        def to_openai(self) -> dict[str, str]:
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
            if self.role.lower() not in ["user", "assistant", "system"]:
                raise ValueError("Role must be either 'user', 'assistant' or 'system'")
            return {"role": self.role, "content": self.content}
    
    
    hananel's avatar
    hananel committed
        def to_cohere(self) -> dict[str, str]:
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
            return {"role": self.role, "message": self.content}
    
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
    
    class Conversation(BaseModel):
        messages: list[Message]
    
        def split_by_topic(
    
    hananel's avatar
    hananel committed
                self,
                encoder: BaseEncoder,
                threshold: float = 0.5,
                split_method: Literal[
                    "consecutive_similarity_drop", "cumulative_similarity_drop"
                ] = "consecutive_similarity_drop",
        ) -> dict[str, list[str]]:
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
            docs = [f"{m.role}: {m.content}" for m in self.messages]
            return semantic_splitter(
                encoder=encoder, docs=docs, threshold=threshold, split_method=split_method
            )