Skip to content
Snippets Groups Projects
schema.py 2.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • James Briggs's avatar
    James Briggs committed
    from enum import Enum
    
    from typing import List, Optional
    
    Simonas's avatar
    Simonas committed
    
    
    Kenny's avatar
    Kenny committed
    from pydantic.v1 import BaseModel
    from pydantic.v1.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
    )
    
    Ismail Ashraq's avatar
    Ismail Ashraq 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"
    
        MISTRAL = "mistral"
    
    James Briggs's avatar
    James Briggs committed
    
    
    Simonas's avatar
    Simonas committed
    
    
        name: Optional[str] = None
        function_call: Optional[dict] = None
    
    Simonas's avatar
    Simonas committed
        similarity_score: Optional[float] = 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)
    
            elif self.type == EncoderType.MISTRAL:
                self.model = MistralEncoder(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
    
    
        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
    
    
        def to_openai(self):
    
    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}
    
    
        def to_cohere(self):
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
            return {"role": self.role, "message": self.content}
    
    
    Bogdan Buduroiu's avatar
    Bogdan Buduroiu committed
        def to_llamacpp(self):
            return {"role": self.role, "content": self.content}
    
    Siraj R Aizlewood's avatar
    Siraj R Aizlewood committed
    
    
        def to_mistral(self):
            return {"role": self.role, "content": self.content}
    
    
        def __str__(self):
            return f"{self.role}: {self.content}"
    
    Ismail Ashraq's avatar
    Ismail Ashraq committed
    
    
    class DocumentSplit(BaseModel):
    
    Simonas's avatar
    Simonas committed
        docs: List[str]
    
        is_triggered: bool = False
    
        triggered_score: Optional[float] = None
    
    Simonas's avatar
    Simonas committed
        token_count: Optional[int] = None
        metadata: Optional[dict] = None
    
    
        @property
        def content(self) -> str:
            return " ".join(self.docs)
    
    Anush008's avatar
    Anush008 committed
    
    
    class Metric(Enum):
        COSINE = "cosine"
        DOTPRODUCT = "dotproduct"
        EUCLIDEAN = "euclidean"
        MANHATTAN = "manhattan"