factory.py
1 """ 2 Factory module 3 """ 4 5 from ...util import Resolver 6 7 from .external import External 8 from .huggingface import HFVectors 9 from .litellm import LiteLLM 10 from .llama import LlamaCpp 11 from .m2v import Model2Vec 12 from .sbert import STVectors 13 from .words import WordVectors 14 15 16 class VectorsFactory: 17 """ 18 Methods to create dense vector models. 19 """ 20 21 @staticmethod 22 def create(config, scoring=None, models=None): 23 """ 24 Create a Vectors model instance. 25 26 Args: 27 config: vector configuration 28 scoring: scoring instance 29 models: models cache 30 31 Returns: 32 Vectors 33 """ 34 35 # Determine vector method 36 method = VectorsFactory.method(config) 37 38 # External vectors 39 if method == "external": 40 return External(config, scoring, models) 41 42 # LiteLLM vectors 43 if method == "litellm": 44 return LiteLLM(config, scoring, models) 45 46 # llama.cpp vectors 47 if method == "llama.cpp": 48 return LlamaCpp(config, scoring, models) 49 50 # Model2vec vectors 51 if method == "model2vec": 52 return Model2Vec(config, scoring, models) 53 54 # Sentence Transformers vectors 55 if method == "sentence-transformers": 56 return STVectors(config, scoring, models) if config and config.get("path") else None 57 58 # Word vectors 59 if method == "words": 60 return WordVectors(config, scoring, models) 61 62 # Transformers vectors 63 if HFVectors.ismethod(method): 64 return HFVectors(config, scoring, models) if config and config.get("path") else None 65 66 # Resolve custom method 67 return VectorsFactory.resolve(method, config, scoring, models) if method else None 68 69 @staticmethod 70 def method(config): 71 """ 72 Get or derive the vector method. 73 74 Args: 75 config: vector configuration 76 77 Returns: 78 vector method 79 """ 80 81 # Determine vector method 82 method = config.get("method") 83 path = config.get("path") 84 85 # Infer method from path, if blank 86 if not method: 87 if path: 88 if LiteLLM.ismodel(path): 89 method = "litellm" 90 elif LlamaCpp.ismodel(path): 91 method = "llama.cpp" 92 elif Model2Vec.ismodel(path): 93 method = "model2vec" 94 elif WordVectors.ismodel(path): 95 method = "words" 96 else: 97 method = "transformers" 98 elif config.get("transform"): 99 method = "external" 100 101 return method 102 103 @staticmethod 104 def resolve(backend, config, scoring, models): 105 """ 106 Attempt to resolve a custom backend. 107 108 Args: 109 backend: backend class 110 config: vector configuration 111 scoring: scoring instance 112 models: models cache 113 114 Returns: 115 Vectors 116 """ 117 118 try: 119 return Resolver()(backend)(config, scoring, models) 120 except Exception as e: 121 raise ImportError(f"Unable to resolve vectors backend: '{backend}'") from e