2024-05-09 15:40:36 +02:00
|
|
|
# SPDX-FileCopyrightText: 2022-present deepset GmbH <info@deepset.ai>
|
|
|
|
#
|
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
2025-05-26 17:22:51 +01:00
|
|
|
|
2023-09-04 21:16:20 +02:00
|
|
|
import logging
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
2024-07-04 23:21:53 -07:00
|
|
|
from haystack import Document, GeneratedAnswer
|
2023-11-24 14:48:43 +01:00
|
|
|
from haystack.components.builders.answer_builder import AnswerBuilder
|
2025-05-26 14:12:19 +01:00
|
|
|
from haystack.dataclasses.chat_message import ChatMessage
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
|
2025-05-22 14:32:36 +02:00
|
|
|
def _check_metadata_excluding_all_messages(actual_meta, expected_meta):
|
|
|
|
"""Helper function to check metadata while ignoring the all_messages field"""
|
|
|
|
actual_without_messages = {k: v for k, v in actual_meta.items() if k != "all_messages"}
|
|
|
|
assert actual_without_messages == expected_meta
|
|
|
|
|
|
|
|
|
2023-09-05 14:34:22 +02:00
|
|
|
class TestAnswerBuilder:
|
2023-09-04 21:16:20 +02:00
|
|
|
def test_run_unmatching_input_len(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder()
|
2023-09-04 21:16:20 +02:00
|
|
|
with pytest.raises(ValueError):
|
2023-12-21 17:09:58 +05:30
|
|
|
component.run(query="query", replies=["reply1"], meta=[{"test": "meta"}, {"test": "meta2"}])
|
2023-09-28 14:42:19 +02:00
|
|
|
|
|
|
|
def test_run_without_meta(self):
|
|
|
|
component = AnswerBuilder()
|
|
|
|
output = component.run(query="query", replies=["reply1"])
|
|
|
|
answers = output["answers"]
|
|
|
|
assert answers[0].data == "reply1"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta # Check that all_messages exists
|
2023-09-28 14:42:19 +02:00
|
|
|
assert answers[0].query == "query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
|
|
|
|
|
|
|
def test_run_meta_is_an_empty_list(self):
|
|
|
|
component = AnswerBuilder()
|
2023-12-21 17:09:58 +05:30
|
|
|
output = component.run(query="query", replies=["reply1"], meta=[])
|
2023-09-28 14:42:19 +02:00
|
|
|
answers = output["answers"]
|
|
|
|
assert answers[0].data == "reply1"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-28 14:42:19 +02:00
|
|
|
assert answers[0].query == "query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2023-09-04 21:16:20 +02:00
|
|
|
|
2024-11-20 11:07:04 -08:00
|
|
|
def test_run_with_meta(self):
|
|
|
|
component = AnswerBuilder()
|
|
|
|
output = component.run(query="query", replies=["reply1"], meta=[{"test": "meta"}])
|
|
|
|
answers = output["answers"]
|
|
|
|
assert answers[0].data == "reply1"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {"test": "meta"})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2024-11-20 11:07:04 -08:00
|
|
|
assert answers[0].query == "query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
|
|
|
|
2023-09-04 21:16:20 +02:00
|
|
|
def test_run_without_pattern(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder()
|
2023-12-21 17:09:58 +05:30
|
|
|
output = component.run(query="test query", replies=["Answer: AnswerString"], meta=[{}])
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "Answer: AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_pattern_with_capturing_group(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder(pattern=r"Answer: (.*)")
|
2023-12-21 17:09:58 +05:30
|
|
|
output = component.run(query="test query", replies=["Answer: AnswerString"], meta=[{}])
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_pattern_without_capturing_group(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder(pattern=r"'.*'")
|
2023-12-21 17:09:58 +05:30
|
|
|
output = component.run(query="test query", replies=["Answer: 'AnswerString'"], meta=[{}])
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "'AnswerString'"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_pattern_with_more_than_one_capturing_group(self):
|
|
|
|
with pytest.raises(ValueError, match="contains multiple capture groups"):
|
2023-09-13 11:01:16 +01:00
|
|
|
AnswerBuilder(pattern=r"Answer: (.*), (.*)")
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_pattern_set_at_runtime(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder(pattern="unused pattern")
|
2023-12-21 17:09:58 +05:30
|
|
|
output = component.run(query="test query", replies=["Answer: AnswerString"], meta=[{}], pattern=r"Answer: (.*)")
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_documents_without_reference_pattern(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder()
|
2023-09-07 12:54:24 +02:00
|
|
|
output = component.run(
|
2023-09-13 11:01:16 +01:00
|
|
|
query="test query",
|
|
|
|
replies=["Answer: AnswerString"],
|
2023-12-21 17:09:58 +05:30
|
|
|
meta=[{}],
|
2023-10-31 12:44:04 +01:00
|
|
|
documents=[Document(content="test doc 1"), Document(content="test doc 2")],
|
2023-09-04 21:16:20 +02:00
|
|
|
)
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "Answer: AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert len(answers[0].documents) == 2
|
2023-11-17 15:33:43 +01:00
|
|
|
assert answers[0].documents[0].content == "test doc 1"
|
|
|
|
assert answers[0].documents[1].content == "test doc 2"
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_documents_with_reference_pattern(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder(reference_pattern="\\[(\\d+)\\]")
|
2023-09-07 12:54:24 +02:00
|
|
|
output = component.run(
|
2023-09-13 11:01:16 +01:00
|
|
|
query="test query",
|
|
|
|
replies=["Answer: AnswerString[2]"],
|
2023-12-21 17:09:58 +05:30
|
|
|
meta=[{}],
|
2023-10-31 12:44:04 +01:00
|
|
|
documents=[Document(content="test doc 1"), Document(content="test doc 2")],
|
2023-09-04 21:16:20 +02:00
|
|
|
)
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "Answer: AnswerString[2]"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert len(answers[0].documents) == 1
|
2023-11-17 15:33:43 +01:00
|
|
|
assert answers[0].documents[0].content == "test doc 2"
|
2023-09-04 21:16:20 +02:00
|
|
|
|
|
|
|
def test_run_with_documents_with_reference_pattern_and_no_match(self, caplog):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder(reference_pattern="\\[(\\d+)\\]")
|
2023-09-04 21:16:20 +02:00
|
|
|
with caplog.at_level(logging.WARNING):
|
2023-09-07 12:54:24 +02:00
|
|
|
output = component.run(
|
2023-09-13 11:01:16 +01:00
|
|
|
query="test query",
|
|
|
|
replies=["Answer: AnswerString[3]"],
|
2023-12-21 17:09:58 +05:30
|
|
|
meta=[{}],
|
2023-10-31 12:44:04 +01:00
|
|
|
documents=[Document(content="test doc 1"), Document(content="test doc 2")],
|
2023-09-04 21:16:20 +02:00
|
|
|
)
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "Answer: AnswerString[3]"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert len(answers[0].documents) == 0
|
2023-09-04 21:16:20 +02:00
|
|
|
assert "Document index '3' referenced in Generator output is out of range." in caplog.text
|
|
|
|
|
|
|
|
def test_run_with_reference_pattern_set_at_runtime(self):
|
2023-09-05 14:34:22 +02:00
|
|
|
component = AnswerBuilder(reference_pattern="unused pattern")
|
2023-09-07 12:54:24 +02:00
|
|
|
output = component.run(
|
2023-09-13 11:01:16 +01:00
|
|
|
query="test query",
|
|
|
|
replies=["Answer: AnswerString[2][3]"],
|
2023-12-21 17:09:58 +05:30
|
|
|
meta=[{}],
|
2023-10-31 12:44:04 +01:00
|
|
|
documents=[Document(content="test doc 1"), Document(content="test doc 2"), Document(content="test doc 3")],
|
2023-09-04 21:16:20 +02:00
|
|
|
reference_pattern="\\[(\\d+)\\]",
|
|
|
|
)
|
2023-09-07 12:54:24 +02:00
|
|
|
answers = output["answers"]
|
2023-09-04 21:16:20 +02:00
|
|
|
assert len(answers) == 1
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].data == "Answer: AnswerString[2][3]"
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {})
|
|
|
|
assert "all_messages" in answers[0].meta
|
2023-09-13 11:01:16 +01:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert len(answers[0].documents) == 2
|
2023-11-17 15:33:43 +01:00
|
|
|
assert answers[0].documents[0].content == "test doc 2"
|
|
|
|
assert answers[0].documents[1].content == "test doc 3"
|
2024-07-04 23:21:53 -07:00
|
|
|
|
|
|
|
def test_run_with_chat_message_replies_without_pattern(self):
|
|
|
|
component = AnswerBuilder()
|
2024-11-28 10:35:24 +01:00
|
|
|
|
|
|
|
message_meta = {
|
2024-09-17 10:36:42 +02:00
|
|
|
"model": "gpt-4o-mini",
|
2024-07-04 23:21:53 -07:00
|
|
|
"index": 0,
|
|
|
|
"finish_reason": "stop",
|
|
|
|
"usage": {"prompt_tokens": 32, "completion_tokens": 153, "total_tokens": 185},
|
|
|
|
}
|
2024-11-28 10:35:24 +01:00
|
|
|
replies = [ChatMessage.from_assistant("Answer: AnswerString", meta=message_meta)]
|
|
|
|
|
|
|
|
output = component.run(query="test query", replies=replies, meta=[{}])
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "Answer: AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
# Check metadata excluding all_messages
|
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, message_meta)
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
|
2024-07-04 23:21:53 -07:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
|
|
|
|
|
|
|
def test_run_with_chat_message_replies_with_pattern(self):
|
|
|
|
component = AnswerBuilder(pattern=r"Answer: (.*)")
|
2024-11-28 10:35:24 +01:00
|
|
|
|
|
|
|
message_meta = {
|
2024-09-17 10:36:42 +02:00
|
|
|
"model": "gpt-4o-mini",
|
2024-07-04 23:21:53 -07:00
|
|
|
"index": 0,
|
|
|
|
"finish_reason": "stop",
|
|
|
|
"usage": {"prompt_tokens": 32, "completion_tokens": 153, "total_tokens": 185},
|
|
|
|
}
|
2024-11-28 10:35:24 +01:00
|
|
|
replies = [ChatMessage.from_assistant("Answer: AnswerString", meta=message_meta)]
|
|
|
|
|
|
|
|
output = component.run(query="test query", replies=replies, meta=[{}])
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, message_meta)
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
|
2024-07-04 23:21:53 -07:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
|
|
|
|
|
|
|
def test_run_with_chat_message_replies_with_documents(self):
|
|
|
|
component = AnswerBuilder(reference_pattern="\\[(\\d+)\\]")
|
2024-11-28 10:35:24 +01:00
|
|
|
message_meta = {
|
|
|
|
"model": "gpt-4o-mini",
|
|
|
|
"index": 0,
|
|
|
|
"finish_reason": "stop",
|
|
|
|
"usage": {"prompt_tokens": 32, "completion_tokens": 153, "total_tokens": 185},
|
|
|
|
}
|
|
|
|
replies = [ChatMessage.from_assistant("Answer: AnswerString[2]", meta=message_meta)]
|
|
|
|
|
2024-07-04 23:21:53 -07:00
|
|
|
output = component.run(
|
|
|
|
query="test query",
|
|
|
|
replies=replies,
|
|
|
|
meta=[{}],
|
|
|
|
documents=[Document(content="test doc 1"), Document(content="test doc 2")],
|
|
|
|
)
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "Answer: AnswerString[2]"
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
# Check metadata excluding all_messages
|
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, message_meta)
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
|
2024-07-04 23:21:53 -07:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert len(answers[0].documents) == 1
|
|
|
|
assert answers[0].documents[0].content == "test doc 2"
|
|
|
|
|
|
|
|
def test_run_with_chat_message_replies_with_pattern_set_at_runtime(self):
|
|
|
|
component = AnswerBuilder(pattern="unused pattern")
|
2024-11-28 10:35:24 +01:00
|
|
|
message_meta = {
|
2024-09-17 10:36:42 +02:00
|
|
|
"model": "gpt-4o-mini",
|
2024-07-04 23:21:53 -07:00
|
|
|
"index": 0,
|
|
|
|
"finish_reason": "stop",
|
|
|
|
"usage": {"prompt_tokens": 32, "completion_tokens": 153, "total_tokens": 185},
|
|
|
|
}
|
2024-11-28 10:35:24 +01:00
|
|
|
replies = [ChatMessage.from_assistant("Answer: AnswerString", meta=message_meta)]
|
|
|
|
|
|
|
|
output = component.run(query="test query", replies=replies, meta=[{}], pattern=r"Answer: (.*)")
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
# Check metadata excluding all_messages
|
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, message_meta)
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
|
2024-07-04 23:21:53 -07:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2024-11-20 11:07:04 -08:00
|
|
|
|
|
|
|
def test_run_with_chat_message_replies_with_meta_set_at_run_time(self):
|
|
|
|
component = AnswerBuilder()
|
2024-11-28 10:35:24 +01:00
|
|
|
message_meta = {
|
|
|
|
"model": "gpt-4o-mini",
|
|
|
|
"index": 0,
|
|
|
|
"finish_reason": "stop",
|
|
|
|
"usage": {"prompt_tokens": 32, "completion_tokens": 153, "total_tokens": 185},
|
|
|
|
}
|
|
|
|
replies = [ChatMessage.from_assistant("AnswerString", meta=message_meta)]
|
|
|
|
|
2024-11-20 11:07:04 -08:00
|
|
|
output = component.run(query="test query", replies=replies, meta=[{"test": "meta"}])
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
# Check metadata excluding all_messages
|
|
|
|
expected_meta = {
|
2024-11-20 11:07:04 -08:00
|
|
|
"model": "gpt-4o-mini",
|
|
|
|
"index": 0,
|
|
|
|
"finish_reason": "stop",
|
|
|
|
"usage": {"prompt_tokens": 32, "completion_tokens": 153, "total_tokens": 185},
|
|
|
|
"test": "meta",
|
|
|
|
}
|
2025-05-22 14:32:36 +02:00
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, expected_meta)
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
|
2024-11-20 11:07:04 -08:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
|
|
|
|
|
|
|
def test_run_with_chat_message_no_meta_with_meta_set_at_run_time(self):
|
|
|
|
component = AnswerBuilder()
|
2024-11-28 10:35:24 +01:00
|
|
|
replies = [ChatMessage.from_assistant("AnswerString")]
|
2024-11-20 11:07:04 -08:00
|
|
|
output = component.run(query="test query", replies=replies, meta=[{"test": "meta"}])
|
2024-11-28 10:35:24 +01:00
|
|
|
|
2024-11-20 11:07:04 -08:00
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "AnswerString"
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
# Check metadata excluding all_messages
|
|
|
|
_check_metadata_excluding_all_messages(answers[0].meta, {"test": "meta"})
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
|
2024-11-20 11:07:04 -08:00
|
|
|
assert answers[0].query == "test query"
|
|
|
|
assert answers[0].documents == []
|
|
|
|
assert isinstance(answers[0], GeneratedAnswer)
|
2025-05-22 14:32:36 +02:00
|
|
|
|
|
|
|
def test_conversation_history_with_last_message_only_false(self):
|
|
|
|
"""Test behavior with last_message_only=False (default)"""
|
|
|
|
# Test with two messages in replies
|
|
|
|
component = AnswerBuilder(last_message_only=False)
|
|
|
|
replies = [
|
|
|
|
ChatMessage.from_user("What is Haystack?"),
|
|
|
|
ChatMessage.from_assistant("Haystack is a framework for building LLM applications."),
|
|
|
|
]
|
|
|
|
output = component.run(query="test query", replies=replies)
|
|
|
|
|
|
|
|
answers = output["answers"]
|
|
|
|
# Should have one answer for each message in replies
|
|
|
|
assert len(answers) == 2
|
|
|
|
assert answers[0].data == "What is Haystack?"
|
|
|
|
assert answers[1].data == "Haystack is a framework for building LLM applications."
|
|
|
|
|
|
|
|
# Check that each answer contains the full conversation history
|
|
|
|
for answer in answers:
|
|
|
|
assert "all_messages" in answer.meta
|
|
|
|
assert len(answer.meta["all_messages"]) == 2
|
|
|
|
assert answer.meta["all_messages"] == replies
|
|
|
|
|
|
|
|
# Test with one message in replies
|
|
|
|
component = AnswerBuilder(last_message_only=False)
|
|
|
|
replies = [ChatMessage.from_user("What is Haystack?")]
|
|
|
|
output = component.run(query="test query", replies=replies)
|
|
|
|
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "What is Haystack?"
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
assert answers[0].meta["all_messages"] == replies
|
|
|
|
assert len(answers[0].meta["all_messages"]) == 1
|
|
|
|
|
|
|
|
def test_conversation_history_with_last_message_only_true(self):
|
|
|
|
"""Test behavior with last_message_only=True"""
|
|
|
|
# Test with two messages in replies
|
|
|
|
component = AnswerBuilder(last_message_only=True)
|
|
|
|
replies = [
|
|
|
|
ChatMessage.from_user("What is Haystack?"),
|
|
|
|
ChatMessage.from_assistant("Haystack is a framework for building LLM applications."),
|
|
|
|
]
|
|
|
|
output = component.run(query="test query", replies=replies)
|
|
|
|
|
|
|
|
answers = output["answers"]
|
|
|
|
# Should only have one answer - the last message
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "Haystack is a framework for building LLM applications."
|
|
|
|
|
|
|
|
# Check that the answer contains the full conversation history
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
assert len(answers[0].meta["all_messages"]) == 2
|
|
|
|
assert answers[0].meta["all_messages"] == replies
|
|
|
|
|
|
|
|
# Test with one message in replies
|
|
|
|
component = AnswerBuilder(last_message_only=True)
|
|
|
|
replies = [ChatMessage.from_user("What is Haystack?")]
|
|
|
|
output = component.run(query="test query", replies=replies)
|
|
|
|
|
|
|
|
answers = output["answers"]
|
|
|
|
assert len(answers) == 1
|
|
|
|
assert answers[0].data == "What is Haystack?"
|
|
|
|
assert "all_messages" in answers[0].meta
|
|
|
|
assert answers[0].meta["all_messages"] == replies
|
|
|
|
assert len(answers[0].meta["all_messages"]) == 1
|