qdrant-haystack 12.0.0__tar.gz → 13.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 (27) hide show
  1. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/CHANGELOG.md +22 -0
  2. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/PKG-INFO +3 -3
  3. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/pyproject.toml +2 -2
  4. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/document_stores/qdrant/document_store.py +11 -0
  5. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_dict_converters.py +3 -0
  6. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_document_store.py +26 -0
  7. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_document_store_async.py +17 -0
  8. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_embedding_retriever.py +1 -0
  9. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_hybrid_retriever.py +1 -0
  10. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_sparse_embedding_retriever.py +1 -0
  11. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/.gitignore +0 -0
  12. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/LICENSE.txt +0 -0
  13. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/README.md +0 -0
  14. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/examples/embedding_retrieval.py +0 -0
  15. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/pydoc/config_docusaurus.yml +0 -0
  16. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/components/retrievers/py.typed +0 -0
  17. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/components/retrievers/qdrant/__init__.py +0 -0
  18. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/components/retrievers/qdrant/retriever.py +0 -0
  19. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/document_stores/py.typed +0 -0
  20. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/document_stores/qdrant/__init__.py +0 -0
  21. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/document_stores/qdrant/converters.py +0 -0
  22. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/document_stores/qdrant/filters.py +0 -0
  23. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/src/haystack_integrations/document_stores/qdrant/migrate_to_sparse.py +0 -0
  24. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/__init__.py +0 -0
  25. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/conftest.py +0 -0
  26. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_converters.py +0 -0
  27. {qdrant_haystack-12.0.0 → qdrant_haystack-13.1.0}/tests/test_filters.py +0 -0
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## [integrations/qdrant-v13.0.0] - 2026-10-16
4
+
5
+ ### 🧪 Testing
6
+
7
+ - Test compatible integrations with Python 3.15; update pyproject (#4104)
8
+
9
+ ### 🧹 Chores
10
+
11
+ - [**breaking**] Drop Python 3.10 support (#4105)
12
+
13
+
14
+ ## [integrations/qdrant-v12.0.0] - 2026-10-09
15
+
16
+ ### 🐛 Bug Fixes
17
+
18
+ - [**breaking**] Use exact matching for Qdrant equality and membership filters (#3950)
19
+
20
+ ### 🧹 Chores
21
+
22
+ - Drop redundant deserialize_secrets_inplace calls in integrations requiring haystack-ai>=2.23 (#4058)
23
+
24
+
3
25
  ## [integrations/qdrant-v11.1.0] - 2026-10-01
4
26
 
5
27
  ### 🐛 Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: qdrant-haystack
3
- Version: 12.0.0
3
+ Version: 13.1.0
4
4
  Summary: An integration of Qdrant ANN vector database backend with Haystack
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/qdrant/README.md
@@ -11,14 +11,14 @@ License-File: LICENSE.txt
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: License :: OSI Approved :: Apache Software License
13
13
  Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3.10
15
14
  Classifier: Programming Language :: Python :: 3.11
16
15
  Classifier: Programming Language :: Python :: 3.12
17
16
  Classifier: Programming Language :: Python :: 3.13
18
17
  Classifier: Programming Language :: Python :: 3.14
18
+ Classifier: Programming Language :: Python :: 3.15
19
19
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
20
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
- Requires-Python: >=3.10
21
+ Requires-Python: >=3.11
22
22
  Requires-Dist: haystack-ai>=2.29.0
23
23
  Requires-Dist: qdrant-client>=1.17.0
24
24
  Description-Content-Type: text/markdown
@@ -7,7 +7,7 @@ name = "qdrant-haystack"
7
7
  dynamic = ["version"]
8
8
  description = 'An integration of Qdrant ANN vector database backend with Haystack'
9
9
  readme = "README.md"
10
- requires-python = ">=3.10"
10
+ requires-python = ">=3.11"
11
11
  license = "Apache-2.0"
12
12
  keywords = []
13
13
  authors = [
@@ -19,11 +19,11 @@ classifiers = [
19
19
  "License :: OSI Approved :: Apache Software License",
20
20
  "Development Status :: 4 - Beta",
21
21
  "Programming Language :: Python",
22
- "Programming Language :: Python :: 3.10",
23
22
  "Programming Language :: Python :: 3.11",
24
23
  "Programming Language :: Python :: 3.12",
25
24
  "Programming Language :: Python :: 3.13",
26
25
  "Programming Language :: Python :: 3.14",
26
+ "Programming Language :: Python :: 3.15",
27
27
  "Programming Language :: Python :: Implementation :: CPython",
28
28
  "Programming Language :: Python :: Implementation :: PyPy",
29
29
  ]
@@ -150,6 +150,7 @@ class QdrantDocumentStore:
150
150
  write_batch_size: int = 100,
151
151
  scroll_size: int = 10_000,
152
152
  payload_fields_to_index: list[dict] | None = None,
153
+ client_kwargs: dict[str, Any] | None = None,
153
154
  ) -> None:
154
155
  """
155
156
  Initializes a QdrantDocumentStore.
@@ -236,6 +237,14 @@ class QdrantDocumentStore:
236
237
  The scroll size for reading documents.
237
238
  :param payload_fields_to_index:
238
239
  List of payload fields to index.
240
+ :param client_kwargs:
241
+ Additional keyword arguments passed to both `QdrantClient` and `AsyncQdrantClient`.
242
+ These arguments take precedence over named client parameters in case of overlap.
243
+ Serialized as-is by `to_dict()`: callbacks and `httpx.Limits` may not serialize, and
244
+ authentication headers will appear in plain text in pipeline YAML.
245
+ The same arguments are used for sync and async clients. For example, an async
246
+ `auth_token_provider` is also passed to `QdrantClient`, where it may not work with
247
+ synchronous requests.
239
248
  """
240
249
 
241
250
  self._client: qdrant_client.QdrantClient | None = None
@@ -255,6 +264,7 @@ class QdrantDocumentStore:
255
264
  self.path = path
256
265
  self.force_disable_check_same_thread = force_disable_check_same_thread
257
266
  self.metadata = metadata or {}
267
+ self.client_kwargs = dict(client_kwargs or {})
258
268
 
259
269
  # Store the Qdrant collection specific attributes
260
270
  self.shard_number = shard_number
@@ -2485,6 +2495,7 @@ class QdrantDocumentStore:
2485
2495
  # when using a hosted Qdrant service, which means running to_dict() exposes the api key.
2486
2496
  "metadata": {**self.metadata},
2487
2497
  "force_disable_check_same_thread": self.force_disable_check_same_thread,
2498
+ **{key: {**value} if isinstance(value, dict) else value for key, value in self.client_kwargs.items()},
2488
2499
  }
2489
2500
 
2490
2501
  def _prepare_collection_config(
@@ -43,6 +43,7 @@ def test_to_dict():
43
43
  "write_batch_size": 100,
44
44
  "scroll_size": 10000,
45
45
  "payload_fields_to_index": None,
46
+ "client_kwargs": {},
46
47
  },
47
48
  }
48
49
 
@@ -73,6 +74,7 @@ def test_from_dict():
73
74
  "write_batch_size": 1000,
74
75
  "scroll_size": 10000,
75
76
  "payload_fields_to_index": None,
77
+ "client_kwargs": {"check_compatibility": False},
76
78
  },
77
79
  }
78
80
  )
@@ -102,5 +104,6 @@ def test_from_dict():
102
104
  document_store.scroll_size == 10000,
103
105
  document_store.api_key == Secret.from_env_var("ENV_VAR", strict=False),
104
106
  document_store.payload_fields_to_index is None,
107
+ document_store.client_kwargs == {"check_compatibility": False},
105
108
  ]
106
109
  )
@@ -49,6 +49,7 @@ class TestQdrantDocumentStoreUnit:
49
49
  wait_result_from_api=True,
50
50
  use_sparse_embeddings=False,
51
51
  api_key=Secret.from_env_var("QDRANT_API_KEY"),
52
+ client_kwargs={"check_compatibility": False},
52
53
  )
53
54
  expected_dict = {
54
55
  "type": "haystack_integrations.document_stores.qdrant.document_store.QdrantDocumentStore",
@@ -91,6 +92,7 @@ class TestQdrantDocumentStoreUnit:
91
92
  "write_batch_size": 100,
92
93
  "scroll_size": 10000,
93
94
  "payload_fields_to_index": None,
95
+ "client_kwargs": {"check_compatibility": False},
94
96
  },
95
97
  }
96
98
  assert doc_store.to_dict() == expected_dict
@@ -347,6 +349,30 @@ class TestQdrantDocumentStoreUnit:
347
349
  params["metadata"]["added"] = "x"
348
350
  assert metadata == {"key": "value"}
349
351
 
352
+ def test_prepare_client_params_does_not_mutate_client_kwargs(self):
353
+ client_kwargs = {"grpc_options": {"custom_option": "value"}}
354
+ document_store = QdrantDocumentStore(location=":memory:", client_kwargs=client_kwargs)
355
+ params = document_store._prepare_client_params()
356
+ params["grpc_options"]["grpc.primary_user_agent"] = "qdrant-client"
357
+
358
+ assert client_kwargs == {"grpc_options": {"custom_option": "value"}}
359
+ assert document_store.to_dict()["init_parameters"]["client_kwargs"] == client_kwargs
360
+
361
+ @pytest.mark.parametrize("port", [6333, 7333])
362
+ def test_client_kwargs_are_forwarded_with_client_kwargs_taking_precedence(self, port):
363
+ document_store = QdrantDocumentStore(
364
+ location=":memory:", port=port, client_kwargs={"check_compatibility": False, "port": 8333}
365
+ )
366
+
367
+ with (
368
+ patch("haystack_integrations.document_stores.qdrant.document_store.qdrant_client.QdrantClient") as client,
369
+ patch.object(document_store, "_set_up_collection"),
370
+ ):
371
+ document_store._initialize_client()
372
+
373
+ assert client.call_args.kwargs["check_compatibility"] is False
374
+ assert client.call_args.kwargs["port"] == 8333
375
+
350
376
  def test_get_batches_from_generator(self):
351
377
  batches = list(get_batches_from_generator([1, 2, 3, 4, 5], 2))
352
378
  assert batches == [(1, 2), (3, 4), (5,)]
@@ -35,6 +35,23 @@ from haystack_integrations.document_stores.qdrant.document_store import (
35
35
 
36
36
  @pytest.mark.asyncio
37
37
  class TestQdrantDocumentStoreAsyncUnit:
38
+ @pytest.mark.parametrize("port", [6333, 7333])
39
+ async def test_client_kwargs_are_forwarded_async(self, port):
40
+ document_store = QdrantDocumentStore(
41
+ location=":memory:", port=port, client_kwargs={"check_compatibility": False, "port": 8333}
42
+ )
43
+
44
+ with (
45
+ patch(
46
+ "haystack_integrations.document_stores.qdrant.document_store.qdrant_client.AsyncQdrantClient"
47
+ ) as client,
48
+ patch.object(document_store, "_set_up_collection_async", new_callable=AsyncMock),
49
+ ):
50
+ await document_store._initialize_async_client()
51
+
52
+ assert client.call_args.kwargs["check_compatibility"] is False
53
+ assert client.call_args.kwargs["port"] == 8333
54
+
38
55
  async def test_query_hybrid_search_batch_failure_async(self):
39
56
  document_store = QdrantDocumentStore(location=":memory:", use_sparse_embeddings=True)
40
57
  await document_store._initialize_async_client()
@@ -83,6 +83,7 @@ class TestQdrantRetriever:
83
83
  "write_batch_size": 100,
84
84
  "scroll_size": 10000,
85
85
  "payload_fields_to_index": None,
86
+ "client_kwargs": {},
86
87
  },
87
88
  },
88
89
  "filters": None,
@@ -81,6 +81,7 @@ class TestQdrantHybridRetriever:
81
81
  "write_batch_size": 100,
82
82
  "scroll_size": 10000,
83
83
  "payload_fields_to_index": None,
84
+ "client_kwargs": {},
84
85
  },
85
86
  },
86
87
  "filters": None,
@@ -82,6 +82,7 @@ class TestQdrantSparseEmbeddingRetriever:
82
82
  "write_batch_size": 100,
83
83
  "scroll_size": 10000,
84
84
  "payload_fields_to_index": None,
85
+ "client_kwargs": {},
85
86
  },
86
87
  },
87
88
  "filters": None,