fastembed-haystack 2.0.0__tar.gz → 2.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/CHANGELOG.md +7 -0
  2. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/PKG-INFO +1 -1
  3. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/examples/example.py +0 -1
  4. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/examples/ranker_example.py +0 -1
  5. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/examples/sparse_example.py +0 -1
  6. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/fastembed_document_embedder.py +0 -2
  7. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/fastembed_sparse_document_embedder.py +0 -2
  8. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/fastembed_sparse_text_embedder.py +0 -1
  9. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/fastembed_text_embedder.py +0 -1
  10. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/rankers/fastembed/ranker.py +2 -3
  11. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/test_fastembed_document_embedder.py +14 -1
  12. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/test_fastembed_ranker.py +15 -2
  13. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/test_fastembed_sparse_document_embedder.py +13 -2
  14. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/test_fastembed_sparse_text_embedder.py +14 -1
  15. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/test_fastembed_text_embedder.py +14 -1
  16. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/.gitignore +0 -0
  17. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/LICENSE.txt +0 -0
  18. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/README.md +0 -0
  19. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/pydoc/config_docusaurus.yml +0 -0
  20. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/pyproject.toml +0 -0
  21. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/__init__.py +0 -0
  22. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/embedding_backend/__init__.py +0 -0
  23. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/fastembed/embedding_backend/fastembed_backend.py +0 -0
  24. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/embedders/py.typed +0 -0
  25. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/rankers/fastembed/__init__.py +0 -0
  26. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/src/haystack_integrations/components/rankers/py.typed +0 -0
  27. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/__init__.py +0 -0
  28. {fastembed_haystack-2.0.0 → fastembed_haystack-2.1.0}/tests/test_fastembed_backend.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [integrations/fastembed-v2.0.0] - 2026-01-12
4
+
5
+ ### 🧹 Chores
6
+
7
+ - [**breaking**] Fastembed - drop Python 3.9 and use X|Y typing (#2698)
8
+
9
+
3
10
  ## [integrations/fastembed-v1.6.0] - 2026-01-09
4
11
 
5
12
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastembed-haystack
3
- Version: 2.0.0
3
+ Version: 2.1.0
4
4
  Summary: Haystack 2.x component to embed strings and Documents using fastembed embedding model
5
5
  Project-URL: Source, https://github.com/deepset-ai/haystack-core-integrations
6
6
  Project-URL: Documentation, https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/fastembed/README.md
@@ -14,7 +14,6 @@ documents = [
14
14
  ]
15
15
 
16
16
  document_embedder = FastembedDocumentEmbedder()
17
- document_embedder.warm_up()
18
17
  documents_with_embeddings = document_embedder.run(documents)["documents"]
19
18
  document_store.write_documents(documents_with_embeddings)
20
19
 
@@ -11,7 +11,6 @@ documents = [
11
11
  ]
12
12
 
13
13
  ranker = FastembedRanker(model_name="Xenova/ms-marco-MiniLM-L-6-v2")
14
- ranker.warm_up()
15
14
  reranked_documents = ranker.run(query=query, documents=documents)["documents"]
16
15
 
17
16
 
@@ -25,7 +25,6 @@ document_list = [
25
25
  ]
26
26
 
27
27
  document_embedder = FastembedSparseDocumentEmbedder()
28
- document_embedder.warm_up()
29
28
  documents_with_embeddings = document_embedder.run(document_list)["documents"]
30
29
 
31
30
  for doc in documents_with_embeddings:
@@ -29,8 +29,6 @@ class FastembedDocumentEmbedder:
29
29
  batch_size=256,
30
30
  )
31
31
 
32
- doc_embedder.warm_up()
33
-
34
32
  # Text taken from PubMed QA Dataset (https://huggingface.co/datasets/pubmed_qa)
35
33
  document_list = [
36
34
  Document(
@@ -28,8 +28,6 @@ class FastembedSparseDocumentEmbedder:
28
28
  batch_size=32,
29
29
  )
30
30
 
31
- sparse_doc_embedder.warm_up()
32
-
33
31
  # Text taken from PubMed QA Dataset (https://huggingface.co/datasets/pubmed_qa)
34
32
  document_list = [
35
33
  Document(
@@ -28,7 +28,6 @@ class FastembedSparseTextEmbedder:
28
28
  sparse_text_embedder = FastembedSparseTextEmbedder(
29
29
  model="prithivida/Splade_PP_en_v1"
30
30
  )
31
- sparse_text_embedder.warm_up()
32
31
 
33
32
  sparse_embedding = sparse_text_embedder.run(text)["sparse_embedding"]
34
33
  ```
@@ -24,7 +24,6 @@ class FastembedTextEmbedder:
24
24
  text_embedder = FastembedTextEmbedder(
25
25
  model="BAAI/bge-small-en-v1.5"
26
26
  )
27
- text_embedder.warm_up()
28
27
 
29
28
  embedding = text_embedder.run(text)["embedding"]
30
29
  ```
@@ -177,13 +177,12 @@ class FastembedRanker:
177
177
  raise ValueError(msg)
178
178
 
179
179
  if self._model is None:
180
- msg = "The ranker model has not been loaded. Please call warm_up() before running."
181
- raise RuntimeError(msg)
180
+ self.warm_up()
182
181
 
183
182
  fastembed_input_docs = self._prepare_fastembed_input_docs(documents)
184
183
 
185
184
  scores = list(
186
- self._model.rerank(
185
+ self._model.rerank( # type: ignore[union-attr]
187
186
  query=query,
188
187
  documents=fastembed_input_docs,
189
188
  batch_size=self.batch_size,
@@ -281,12 +281,25 @@ class TestFastembedDocumentEmbedder:
281
281
  parallel=None,
282
282
  )
283
283
 
284
+ def test_run_calls_warm_up(self):
285
+ embedder = FastembedDocumentEmbedder()
286
+ assert embedder.embedding_backend is None
287
+
288
+ mock_backend = MagicMock()
289
+ mock_backend.embed.return_value = [[0.1, 0.2, 0.3]]
290
+
291
+ with patch.object(
292
+ embedder, "warm_up", side_effect=lambda: setattr(embedder, "embedding_backend", mock_backend)
293
+ ) as mock_warm_up:
294
+ embedder.run(documents=[Document(content="test document")])
295
+
296
+ mock_warm_up.assert_called_once()
297
+
284
298
  @pytest.mark.integration
285
299
  def test_run(self):
286
300
  embedder = FastembedDocumentEmbedder(
287
301
  model="BAAI/bge-small-en-v1.5",
288
302
  )
289
- embedder.warm_up()
290
303
 
291
304
  doc = Document(content="Parton energy loss in QCD matter")
292
305
 
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
- from unittest.mock import MagicMock
5
+ from unittest.mock import MagicMock, patch
6
6
 
7
7
  import numpy as np
8
8
  import pytest
@@ -257,10 +257,23 @@ class TestFastembedRanker:
257
257
  parallel=None,
258
258
  )
259
259
 
260
+ def test_run_calls_warm_up(self):
261
+ """
262
+ Unit test to check that warm_up is called when run is called for the first time.
263
+ """
264
+ ranker = FastembedRanker()
265
+
266
+ mock_model = MagicMock()
267
+ mock_model.rerank.return_value = [0.5]
268
+
269
+ with patch.object(ranker, "warm_up", side_effect=lambda: setattr(ranker, "_model", mock_model)) as mock_warm_up:
270
+ ranker.run(query="test query", documents=[Document(content="test document")])
271
+
272
+ mock_warm_up.assert_called_once()
273
+
260
274
  @pytest.mark.integration
261
275
  def test_run(self):
262
276
  ranker = FastembedRanker(model_name="Xenova/ms-marco-MiniLM-L-6-v2", top_k=2)
263
- ranker.warm_up()
264
277
 
265
278
  query = "Who is maintaining Qdrant?"
266
279
  documents = [
@@ -304,6 +304,19 @@ class TestFastembedSparseDocumentEmbedderDoc:
304
304
 
305
305
  assert embedder.model_kwargs == bm25_config
306
306
 
307
+ def test_run_calls_warm_up(self):
308
+ embedder = FastembedSparseDocumentEmbedder()
309
+
310
+ mock_backend = MagicMock()
311
+ mock_backend.embed.return_value = [{"indices": [0], "values": [0.5]}]
312
+
313
+ with patch.object(
314
+ embedder, "warm_up", side_effect=lambda: setattr(embedder, "embedding_backend", mock_backend)
315
+ ) as mock_warm_up:
316
+ embedder.run(documents=[Document(content="test document")])
317
+
318
+ mock_warm_up.assert_called_once()
319
+
307
320
  @pytest.mark.integration
308
321
  def test_run_with_model_kwargs(self):
309
322
  """
@@ -317,7 +330,6 @@ class TestFastembedSparseDocumentEmbedderDoc:
317
330
  model="Qdrant/bm42-all-minilm-l6-v2-attentions",
318
331
  model_kwargs=bm42_config,
319
332
  )
320
- embedder.warm_up()
321
333
 
322
334
  doc = Document(content="Example content using BM42")
323
335
 
@@ -336,7 +348,6 @@ class TestFastembedSparseDocumentEmbedderDoc:
336
348
  embedder = FastembedSparseDocumentEmbedder(
337
349
  model="prithivida/Splade_PP_en_v1",
338
350
  )
339
- embedder.warm_up()
340
351
 
341
352
  doc = Document(content="Parton energy loss in QCD matter")
342
353
 
@@ -224,6 +224,20 @@ class TestFastembedSparseTextEmbedder:
224
224
 
225
225
  assert embedder.model_kwargs == bm25_config
226
226
 
227
+ def test_run_calls_warm_up(self):
228
+ embedder = FastembedSparseTextEmbedder()
229
+ assert embedder.embedding_backend is None
230
+
231
+ mock_backend = MagicMock()
232
+ mock_backend.embed.return_value = [[0.1, 0.2, 0.3]]
233
+
234
+ with patch.object(
235
+ embedder, "warm_up", side_effect=lambda: setattr(embedder, "embedding_backend", mock_backend)
236
+ ) as mock_warm_up:
237
+ embedder.run(text="test text")
238
+
239
+ mock_warm_up.assert_called_once()
240
+
227
241
  @pytest.mark.integration
228
242
  def test_run_with_model_kwargs(self):
229
243
  """
@@ -258,7 +272,6 @@ class TestFastembedSparseTextEmbedder:
258
272
  embedder = FastembedSparseTextEmbedder(
259
273
  model="prithivida/Splade_PP_en_v1",
260
274
  )
261
- embedder.warm_up()
262
275
 
263
276
  text = "Parton energy loss in QCD matter"
264
277
 
@@ -202,12 +202,25 @@ class TestFastembedTextEmbedder:
202
202
  with pytest.raises(TypeError, match="FastembedTextEmbedder expects a string as input"):
203
203
  embedder.run(text=list_integers_input)
204
204
 
205
+ def test_run_calls_warm_up(self):
206
+ embedder = FastembedTextEmbedder()
207
+ assert embedder.embedding_backend is None
208
+
209
+ mock_backend = MagicMock()
210
+ mock_backend.embed.return_value = [[0.1, 0.2, 0.3]]
211
+
212
+ with patch.object(
213
+ embedder, "warm_up", side_effect=lambda: setattr(embedder, "embedding_backend", mock_backend)
214
+ ) as mock_warm_up:
215
+ embedder.run(text="test text")
216
+
217
+ mock_warm_up.assert_called_once()
218
+
205
219
  @pytest.mark.integration
206
220
  def test_run(self):
207
221
  embedder = FastembedTextEmbedder(
208
222
  model="BAAI/bge-small-en-v1.5",
209
223
  )
210
- embedder.warm_up()
211
224
 
212
225
  text = "Parton energy loss in QCD matter"
213
226