Newer
Older
from pydantic import BaseModel
from semantic_router.encoders import (
BaseEncoder,
CohereEncoder,
from semantic_router.utils.splitters import semantic_splitter
class RouteChoice(BaseModel):
name: Optional[str] = None
function_call: Optional[dict] = None
similarity_score: Optional[float] = None
trigger: Optional[bool] = None
def __init__(self, type: str, name: Optional[str]):
elif self.type == EncoderType.FASTEMBED:
def __call__(self, texts: list[str]) -> list[list[float]]:
class Message(BaseModel):
role: str
content: str
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}
class Conversation(BaseModel):
messages: list[Message]
def split_by_topic(
self,
encoder: BaseEncoder,
threshold: float = 0.5,
split_method: Literal[
"consecutive_similarity_drop", "cumulative_similarity_drop"
] = "consecutive_similarity_drop",
) -> dict[str, list[str]]:
docs = [f"{m.role}: {m.content}" for m in self.messages]
return semantic_splitter(
encoder=encoder, docs=docs, threshold=threshold, split_method=split_method
)