Skip to content

Commit 5b35a05

Browse files
fix: prevent GeneratedAnswer.from_dict crash on empty all_messages (#11626)
Co-authored-by: David S. Batista <dsbatista@gmail.com>
1 parent 008c89c commit 5b35a05

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

haystack/dataclasses/answer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def from_dict(cls, data: dict[str, Any]) -> "GeneratedAnswer":
139139
init_params["documents"] = [Document.from_dict(d) for d in documents]
140140

141141
meta = init_params.get("meta", {})
142-
if (all_messages := meta.get("all_messages")) is not None and isinstance(all_messages[0], dict):
142+
if (all_messages := meta.get("all_messages")) and isinstance(all_messages[0], dict):
143143
meta["all_messages"] = [ChatMessage.from_dict(m) for m in all_messages]
144144
init_params["meta"] = meta
145145

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed ``GeneratedAnswer.from_dict`` raising an ``IndexError`` when the serialized
5+
``meta`` contained an empty ``all_messages`` list. Deserialization now guards
6+
against the empty list (consistent with ``to_dict``) and round-trips correctly.

test/dataclasses/test_answer.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,26 @@ def test_from_dict_with_chat_message_in_meta(self):
264264
assert answer.meta["meta_key"] == "meta_value"
265265
assert answer.meta["all_messages"] == [ChatMessage.from_user("What is the answer?")]
266266

267+
def test_from_dict_with_empty_all_messages(self):
268+
# An empty `all_messages` list must not crash deserialization: `is not None`
269+
# let `[]` through and then indexed `all_messages[0]`, raising IndexError.
270+
answer = GeneratedAnswer.from_dict(
271+
{
272+
"type": "haystack.dataclasses.answer.GeneratedAnswer",
273+
"init_parameters": {
274+
"data": "42",
275+
"query": "What is the answer?",
276+
"documents": [],
277+
"meta": {"all_messages": []},
278+
},
279+
}
280+
)
281+
assert answer.meta["all_messages"] == []
282+
283+
def test_to_dict_from_dict_round_trip_with_empty_all_messages(self):
284+
answer = GeneratedAnswer(data="42", query="What is the answer?", documents=[], meta={"all_messages": []})
285+
assert GeneratedAnswer.from_dict(answer.to_dict()) == answer
286+
267287
def test_no_warning_on_init(self):
268288
with warnings.catch_warnings():
269289
warnings.simplefilter("error", Warning)

0 commit comments

Comments
 (0)