amazon-bedrock-haystack 6.0.0__tar.gz → 6.1.1__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 (49) hide show
  1. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/CHANGELOG.md +14 -0
  2. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/PKG-INFO +1 -1
  3. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/embedders/amazon_bedrock/document_embedder.py +7 -4
  4. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/amazon_bedrock/generator.py +10 -7
  5. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/rankers/amazon_bedrock/ranker.py +2 -2
  6. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_document_embedder.py +68 -0
  7. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_generator.py +19 -0
  8. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/.gitignore +0 -0
  9. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/LICENSE.txt +0 -0
  10. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/README.md +0 -0
  11. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/examples/bedrock_ranker_example.py +0 -0
  12. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/examples/chatgenerator_example.py +0 -0
  13. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/examples/embedders_generator_with_rag_example.py +0 -0
  14. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/examples/s3_downloader_example.py +0 -0
  15. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/pydoc/config_docusaurus.yml +0 -0
  16. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/pyproject.toml +0 -0
  17. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/amazon_bedrock/__init__.py +0 -0
  18. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/amazon_bedrock/errors.py +0 -0
  19. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/amazon_bedrock/utils.py +0 -0
  20. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/py.typed +0 -0
  21. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/s3/__init__.py +0 -0
  22. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/s3/errors.py +0 -0
  23. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/common/s3/utils.py +0 -0
  24. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/downloaders/py.typed +0 -0
  25. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/downloaders/s3/__init__.py +0 -0
  26. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/downloaders/s3/s3_downloader.py +0 -0
  27. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/embedders/amazon_bedrock/__init__.py +0 -0
  28. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/embedders/amazon_bedrock/document_image_embedder.py +0 -0
  29. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/embedders/amazon_bedrock/text_embedder.py +0 -0
  30. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/embedders/py.typed +0 -0
  31. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/amazon_bedrock/__init__.py +0 -0
  32. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/amazon_bedrock/adapters.py +0 -0
  33. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/amazon_bedrock/chat/__init__.py +0 -0
  34. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/amazon_bedrock/chat/chat_generator.py +0 -0
  35. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/amazon_bedrock/chat/utils.py +0 -0
  36. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/generators/py.typed +0 -0
  37. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/rankers/amazon_bedrock/__init__.py +0 -0
  38. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/src/haystack_integrations/components/rankers/py.typed +0 -0
  39. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/__init__.py +0 -0
  40. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/conftest.py +0 -0
  41. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_chat_generator.py +0 -0
  42. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_chat_generator_utils.py +0 -0
  43. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_document_image_embedder.py +0 -0
  44. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_files/apple.jpg +0 -0
  45. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_files/haystack-logo.png +0 -0
  46. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_files/sample_pdf_1.pdf +0 -0
  47. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_ranker.py +0 -0
  48. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_s3_downloader.py +0 -0
  49. {amazon_bedrock_haystack-6.0.0 → amazon_bedrock_haystack-6.1.1}/tests/test_text_embedder.py +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [integrations/amazon_bedrock-v6.1.0] - 2026-01-13
4
+
5
+ ### 🐛 Bug Fixes
6
+
7
+ - AmazonBedrockDocumentEmbedder to not modify Documents in place (#2174) (#2702)
8
+
9
+
10
+ ## [integrations/amazon_bedrock-v6.0.0] - 2026-01-09
11
+
12
+ ### 🧹 Chores
13
+
14
+ - [**breaking**] Amazon_bedrock - drop Python 3.9 and use X|Y typing (#2685)
15
+
16
+
3
17
  ## [integrations/amazon_bedrock-v5.4.0] - 2026-01-08
4
18
 
5
19
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: amazon-bedrock-haystack
3
- Version: 6.0.0
3
+ Version: 6.1.1
4
4
  Summary: An integration of AWS S3 and Bedrock as a Downloader and Generator components.
5
5
  Project-URL: Documentation, https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/amazon_bedrock#readme
6
6
  Project-URL: Issues, https://github.com/deepset-ai/haystack-core-integrations/issues
@@ -1,4 +1,5 @@
1
1
  import json
2
+ from dataclasses import replace
2
3
  from typing import Any
3
4
 
4
5
  from botocore.config import Config
@@ -186,10 +187,11 @@ class AmazonBedrockDocumentEmbedder:
186
187
  )
187
188
  all_embeddings.extend(embeddings_list)
188
189
 
190
+ new_documents = []
189
191
  for doc, emb in zip(documents, all_embeddings, strict=True):
190
- doc.embedding = emb
192
+ new_documents.append(replace(doc, embedding=emb))
191
193
 
192
- return documents
194
+ return new_documents
193
195
 
194
196
  def _embed_titan(self, documents: list[Document]) -> list[Document]:
195
197
  """
@@ -214,10 +216,11 @@ class AmazonBedrockDocumentEmbedder:
214
216
  embedding = response_body["embedding"]
215
217
  all_embeddings.append(embedding)
216
218
 
219
+ new_documents = []
217
220
  for doc, emb in zip(documents, all_embeddings, strict=True):
218
- doc.embedding = emb
221
+ new_documents.append(replace(doc, embedding=emb))
219
222
 
220
- return documents
223
+ return new_documents
221
224
 
222
225
  @component.output_types(documents=list[Document])
223
226
  def run(self, documents: list[Document]) -> dict[str, list[Document]]:
@@ -63,14 +63,17 @@ class AmazonBedrockGenerator:
63
63
  supports Amazon Bedrock.
64
64
  """
65
65
 
66
+ # Regex pattern for supported AWS Bedrock region prefixes
67
+ _REGION_PREFIX_PATTERN = r"((?:global|us-gov|us|eu|apac|au|ca|jp)\.)?"
68
+
66
69
  SUPPORTED_MODEL_PATTERNS: ClassVar[dict[str, type[BedrockModelAdapter]]] = {
67
- r"([a-z]{2}\.)?amazon.titan-text.*": AmazonTitanAdapter,
68
- r"([a-z]{2}\.)?ai21.j2.*": AI21LabsJurassic2Adapter,
69
- r"([a-z]{2}\.)?cohere.command-[^r].*": CohereCommandAdapter,
70
- r"([a-z]{2}\.)?cohere.command-r.*": CohereCommandRAdapter,
71
- r"([a-z]{2}\.)?anthropic.claude.*": AnthropicClaudeAdapter,
72
- r"([a-z]{2}\.)?meta.llama.*": MetaLlamaAdapter,
73
- r"([a-z]{2}\.)?mistral.*": MistralAdapter,
70
+ rf"{_REGION_PREFIX_PATTERN}amazon.titan-text.*": AmazonTitanAdapter,
71
+ rf"{_REGION_PREFIX_PATTERN}ai21.j2.*": AI21LabsJurassic2Adapter,
72
+ rf"{_REGION_PREFIX_PATTERN}cohere.command-[^r].*": CohereCommandAdapter,
73
+ rf"{_REGION_PREFIX_PATTERN}cohere.command-r.*": CohereCommandRAdapter,
74
+ rf"{_REGION_PREFIX_PATTERN}anthropic.claude.*": AnthropicClaudeAdapter,
75
+ rf"{_REGION_PREFIX_PATTERN}meta.llama.*": MetaLlamaAdapter,
76
+ rf"{_REGION_PREFIX_PATTERN}mistral.*": MistralAdapter,
74
77
  }
75
78
 
76
79
  SUPPORTED_MODEL_FAMILIES: ClassVar[dict[str, type[BedrockModelAdapter]]] = {
@@ -1,3 +1,4 @@
1
+ from dataclasses import replace
1
2
  from typing import Any
2
3
 
3
4
  from botocore.exceptions import ClientError
@@ -251,8 +252,7 @@ class AmazonBedrockRanker:
251
252
  idx = result["index"]
252
253
  score = result["relevanceScore"]
253
254
  doc = documents[idx]
254
- doc.score = score
255
- sorted_docs.append(doc)
255
+ sorted_docs.append(replace(doc, score=score))
256
256
 
257
257
  return {"documents": sorted_docs}
258
258
  except ClientError as client_error:
@@ -257,6 +257,74 @@ class TestAmazonBedrockDocumentEmbedder:
257
257
  assert doc.content == docs[i].content
258
258
  assert doc.embedding == [0.1, 0.2, 0.3]
259
259
 
260
+ def test_run_cohere_does_not_modify_original_documents(self, mock_boto3_session):
261
+ embedder = AmazonBedrockDocumentEmbedder(model="cohere.embed-english-v3")
262
+
263
+ original_docs = [
264
+ Document(content="test 1", id="doc1"),
265
+ Document(content="test 2", id="doc2"),
266
+ ]
267
+
268
+ # Store original IDs to verify they're the same objects
269
+ original_doc_ids = [id(doc) for doc in original_docs]
270
+ original_embeddings = [doc.embedding for doc in original_docs]
271
+
272
+ with patch.object(embedder, "_client") as mock_client:
273
+ mock_client.invoke_model.return_value = {
274
+ "body": io.StringIO('{"embeddings": [[0.1, 0.2], [0.3, 0.4]]}'),
275
+ }
276
+
277
+ result = embedder.run(documents=original_docs)
278
+
279
+ # Verify originals are unchanged
280
+ assert all(doc.embedding is None for doc in original_docs)
281
+ assert original_embeddings == [None, None]
282
+
283
+ # Verify returned documents are NEW instances
284
+ returned_doc_ids = [id(doc) for doc in result["documents"]]
285
+ assert original_doc_ids != returned_doc_ids
286
+
287
+ # Verify returned documents have embeddings
288
+ assert result["documents"][0].embedding == [0.1, 0.2]
289
+ assert result["documents"][1].embedding == [0.3, 0.4]
290
+ assert result["documents"][0].content == "test 1"
291
+ assert result["documents"][1].content == "test 2"
292
+
293
+ def test_run_titan_does_not_modify_original_documents(self, mock_boto3_session):
294
+ embedder = AmazonBedrockDocumentEmbedder(model="amazon.titan-embed-text-v1")
295
+
296
+ original_docs = [
297
+ Document(content="test 1", id="doc1"),
298
+ Document(content="test 2", id="doc2"),
299
+ ]
300
+
301
+ # Store original IDs to verify they're the same objects
302
+ original_doc_ids = [id(doc) for doc in original_docs]
303
+ original_embeddings = [doc.embedding for doc in original_docs]
304
+
305
+ with patch.object(embedder, "_client") as mock_client:
306
+ # Titan returns one embedding at a time
307
+ mock_client.invoke_model.side_effect = [
308
+ {"body": io.StringIO('{"embedding": [0.1, 0.2]}')},
309
+ {"body": io.StringIO('{"embedding": [0.3, 0.4]}')},
310
+ ]
311
+
312
+ result = embedder.run(documents=original_docs)
313
+
314
+ # Verify originals are unchanged
315
+ assert all(doc.embedding is None for doc in original_docs)
316
+ assert original_embeddings == [None, None]
317
+
318
+ # Verify returned documents are NEW instances
319
+ returned_doc_ids = [id(doc) for doc in result["documents"]]
320
+ assert original_doc_ids != returned_doc_ids
321
+
322
+ # Verify returned documents have embeddings
323
+ assert result["documents"][0].embedding == [0.1, 0.2]
324
+ assert result["documents"][1].embedding == [0.3, 0.4]
325
+ assert result["documents"][0].content == "test 1"
326
+ assert result["documents"][1].content == "test 2"
327
+
260
328
  @pytest.mark.integration
261
329
  @pytest.mark.skipif(
262
330
  not os.getenv("AWS_ACCESS_KEY_ID")
@@ -129,6 +129,11 @@ def test_constructor_with_empty_model():
129
129
  ("anthropic.claude-v2", AnthropicClaudeAdapter),
130
130
  ("eu.anthropic.claude-v1", AnthropicClaudeAdapter), # cross-region inference
131
131
  ("us.anthropic.claude-v2", AnthropicClaudeAdapter), # cross-region inference
132
+ ("global.anthropic.claude-v2", AnthropicClaudeAdapter),
133
+ ("us-gov.anthropic.claude-v1", AnthropicClaudeAdapter),
134
+ ("apac.anthropic.claude-v2", AnthropicClaudeAdapter),
135
+ ("au.anthropic.claude-v1", AnthropicClaudeAdapter),
136
+ ("jp.anthropic.claude-v1", AnthropicClaudeAdapter),
132
137
  ("anthropic.claude-instant-v1", AnthropicClaudeAdapter),
133
138
  ("anthropic.claude-super-v5", AnthropicClaudeAdapter), # artificial
134
139
  ("cohere.command-text-v14", CohereCommandAdapter),
@@ -207,6 +212,20 @@ def test_get_model_adapter_auto_detect_family_fails():
207
212
  AmazonBedrockGenerator.get_model_adapter(model="arn:123435423")
208
213
 
209
214
 
215
+ @pytest.mark.parametrize(
216
+ "model",
217
+ [
218
+ "invalid.anthropic.claude-v2",
219
+ "xyz.meta.llama2-13b-chat-v1",
220
+ "fake-region.mistral.mistral-7b-instruct-v0:2",
221
+ "global.us.anthropic.claude-v2",
222
+ ],
223
+ )
224
+ def test_get_model_adapter_with_invalid_region_prefix(model: str):
225
+ with pytest.raises(AmazonBedrockConfigurationError):
226
+ AmazonBedrockGenerator.get_model_adapter(model=model)
227
+
228
+
210
229
  def test_get_model_adapter_model_family_over_auto_detection():
211
230
  """
212
231
  Test that the model_family is used over auto-detection