/ src / python / txtai / vectors / dense / factory.py
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