from enum import Enum, EnumMeta from typing import Union class EnumMetaClass(Enum): def __eq__(self, other): if self.__class__ is other.__class__: return self.value.upper() == other.value.upper() return self.value == other def __hash__(self): return hash(self._name_) def __str__(self): return self.value @classmethod def get_enum(cls, value: str) -> Union[EnumMeta, None]: return next( ( enum_val for enum_val in cls if (enum_val.value == value) or ( isinstance(value, str) and isinstance(enum_val.value, str) and (value.lower() == enum_val.value.lower() or value.upper() == enum_val.name.upper()) ) ), None, ) @classmethod def _missing_(cls, name): for member in cls: if isinstance(member.name, str) and isinstance(name, str) and member.name.lower() == name.lower(): return member class EmbeddingTypes(EnumMetaClass): NA = "NA" OPENAI = "OpenAI" HUGGING_FACE = "Hugging Face" COHERE = "Cohere" class TransformType(EnumMetaClass): RecursiveTransform = "Recursive Text Splitter" CharacterTransform = "Character Text Splitter" SpacyTransform = "Spacy Text Splitter" NLTKTransform = "NLTK Text Splitter" class IndexerType(EnumMetaClass): FAISS = "FAISS" CHROMA = "Chroma" ELASTICSEARCH = "Elastic Search" class BotType(EnumMetaClass): qna = "Question Answering Bot ❓" conversational = "Chatbot 🤖"