99from . import llm , op
1010from .typing import TypeAttr , Vector
1111
12- # Check if sentence_transformers is available
13- try :
14- import sentence_transformers # type: ignore
15-
16- _SENTENCE_TRANSFORMERS_AVAILABLE = True
17- except ImportError :
18- _SENTENCE_TRANSFORMERS_AVAILABLE = False
19-
2012
2113class ParseJson (op .FunctionSpec ):
2214 """Parse a text into a JSON object."""
@@ -79,18 +71,19 @@ class SentenceTransformerEmbedExecutor:
7971 """Executor for SentenceTransformerEmbed."""
8072
8173 spec : SentenceTransformerEmbed
82- _model : "sentence_transformers.SentenceTransformer"
74+ _model : Any | None = None
8375
8476 def analyze (self , text : Any ) -> type :
85- if not _SENTENCE_TRANSFORMERS_AVAILABLE :
77+ try :
78+ # Only import sentence_transformers locally when it's needed, as its import is very slow.
79+ import sentence_transformers # pylint: disable=import-outside-toplevel
80+ except ImportError as e :
8681 raise ImportError (
8782 "sentence_transformers is required for SentenceTransformerEmbed function. "
8883 "Install it with one of these commands:\n "
8984 " pip install 'cocoindex[embeddings]'\n "
9085 " pip install sentence-transformers"
91- )
92-
93- import sentence_transformers # pylint: disable=import-outside-toplevel
86+ ) from e
9487
9588 args = self .spec .args or {}
9689 self ._model = sentence_transformers .SentenceTransformer (self .spec .model , ** args )
@@ -102,5 +95,6 @@ def analyze(self, text: Any) -> type:
10295 return result
10396
10497 def __call__ (self , text : str ) -> NDArray [np .float32 ]:
98+ assert self ._model is not None
10599 result : NDArray [np .float32 ] = self ._model .encode (text , convert_to_numpy = True )
106100 return result
0 commit comments