diff --git a/haystack/components/builders/chat_prompt_builder.py b/haystack/components/builders/chat_prompt_builder.py index 3a468066f..07aabe3c5 100644 --- a/haystack/components/builders/chat_prompt_builder.py +++ b/haystack/components/builders/chat_prompt_builder.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 +from copy import deepcopy from typing import Any, Dict, List, Optional, Set from jinja2 import meta @@ -194,11 +195,9 @@ class ChatPromptBuilder: compiled_template = self._env.from_string(message.content) rendered_content = compiled_template.render(template_variables_combined) - rendered_message = ( - ChatMessage.from_user(rendered_content) - if message.is_from(ChatRole.USER) - else ChatMessage.from_system(rendered_content) - ) + # deep copy the message to avoid modifying the original message + rendered_message: ChatMessage = deepcopy(message) + rendered_message.content = rendered_content processed_messages.append(rendered_message) else: processed_messages.append(message) diff --git a/releasenotes/notes/adapt-chat-promp-builder-message-copy-6aa4de39363ffbf2.yaml b/releasenotes/notes/adapt-chat-promp-builder-message-copy-6aa4de39363ffbf2.yaml new file mode 100644 index 000000000..c3a9e049d --- /dev/null +++ b/releasenotes/notes/adapt-chat-promp-builder-message-copy-6aa4de39363ffbf2.yaml @@ -0,0 +1,4 @@ +--- +enhancements: + - | + Adapts how ChatPromptBuilder creates ChatMessages. Messages are deep copied to ensure all meta fields are copied correctly. diff --git a/test/components/builders/test_chat_prompt_builder.py b/test/components/builders/test_chat_prompt_builder.py index 4fa0870f6..e40b47b50 100644 --- a/test/components/builders/test_chat_prompt_builder.py +++ b/test/components/builders/test_chat_prompt_builder.py @@ -5,7 +5,7 @@ import pytest from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder from haystack import component from haystack.core.pipeline.pipeline import Pipeline -from haystack.dataclasses.chat_message import ChatMessage +from haystack.dataclasses.chat_message import ChatMessage, ChatRole from haystack.dataclasses.document import Document @@ -194,6 +194,17 @@ class TestChatPromptBuilder: assert builder.run(template, name="John", var1="Big") == expected_result + def test_run_with_meta(self): + """ + Test that the ChatPromptBuilder correctly handles meta data. + It should render the message and copy the meta data from the original message. + """ + m = ChatMessage(content="This is a {{ variable }}", role=ChatRole.USER, name=None, meta={"test": "test"}) + builder = ChatPromptBuilder(template=[m]) + res = builder.run(variable="test") + res_msg = ChatMessage(content="This is a test", role=ChatRole.USER, name=None, meta={"test": "test"}) + assert res == {"prompt": [res_msg]} + def test_run_with_invalid_template(self): builder = ChatPromptBuilder()