Skip to content

Commit 104da63

Browse files
feat: Support Multiple System Messages with Better API (#3167)
Co-authored-by: Wendong-Fan <[email protected]> Co-authored-by: Wendong-Fan <[email protected]>
1 parent 473c93f commit 104da63

File tree

4 files changed

+87
-7
lines changed

4 files changed

+87
-7
lines changed

camel/agents/chat_agent.py

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -491,9 +491,7 @@ def __init__(
491491

492492
# Set up system message and initialize messages
493493
self._original_system_message = (
494-
BaseMessage.make_assistant_message(
495-
role_name="Assistant", content=system_message
496-
)
494+
BaseMessage.make_system_message(system_message)
497495
if isinstance(system_message, str)
498496
else system_message
499497
)
@@ -1629,10 +1627,7 @@ def _generate_system_message_for_output_language(
16291627
content = self._original_system_message.content + language_prompt
16301628
return self._original_system_message.create_new_instance(content)
16311629
else:
1632-
return BaseMessage.make_assistant_message(
1633-
role_name="Assistant",
1634-
content=language_prompt,
1635-
)
1630+
return BaseMessage.make_system_message(language_prompt)
16361631

16371632
def init_messages(self) -> None:
16381633
r"""Initializes the stored messages list with the current system
@@ -1650,6 +1645,62 @@ def init_messages(self) -> None:
16501645
)
16511646
)
16521647

1648+
def update_system_message(
1649+
self,
1650+
system_message: Union[BaseMessage, str],
1651+
reset_memory: bool = True,
1652+
) -> None:
1653+
r"""Update the system message.
1654+
It will reset conversation with new system message.
1655+
1656+
Args:
1657+
system_message (Union[BaseMessage, str]): The new system message.
1658+
Can be either a BaseMessage object or a string.
1659+
If a string is provided, it will be converted
1660+
into a BaseMessage object.
1661+
reset_memory (bool):
1662+
Whether to reinitialize conversation messages after updating
1663+
the system message. Defaults to True.
1664+
"""
1665+
if system_message is None:
1666+
raise ValueError("system_message is required and cannot be None. ")
1667+
self._original_system_message = (
1668+
BaseMessage.make_system_message(system_message)
1669+
if isinstance(system_message, str)
1670+
else system_message
1671+
)
1672+
self._system_message = (
1673+
self._generate_system_message_for_output_language()
1674+
)
1675+
if reset_memory:
1676+
self.init_messages()
1677+
1678+
def append_to_system_message(
1679+
self, content: str, reset_memory: bool = True
1680+
) -> None:
1681+
"""Append additional context to existing system message.
1682+
1683+
Args:
1684+
content (str): The additional system message.
1685+
reset_memory (bool):
1686+
Whether to reinitialize conversation messages after appending
1687+
additional context. Defaults to True.
1688+
"""
1689+
original_content = (
1690+
self._original_system_message.content
1691+
if self._original_system_message
1692+
else ""
1693+
)
1694+
new_system_message = original_content + '\n' + content
1695+
self._original_system_message = BaseMessage.make_system_message(
1696+
new_system_message
1697+
)
1698+
self._system_message = (
1699+
self._generate_system_message_for_output_language()
1700+
)
1701+
if reset_memory:
1702+
self.init_messages()
1703+
16531704
def reset_to_original_system_message(self) -> None:
16541705
r"""Reset system message to original, removing any appended context.
16551706

camel/messages/base.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,32 @@ def make_assistant_message(
178178
OpenAIVisionDetailType(video_detail).value,
179179
)
180180

181+
@classmethod
182+
def make_system_message(
183+
cls,
184+
content: str,
185+
role_name: str = "System",
186+
meta_dict: Optional[Dict[str, str]] = None,
187+
) -> "BaseMessage":
188+
r"""Create a new system message.
189+
190+
Args:
191+
content (str): The content of the system message.
192+
role_name (str): The name of the system role.
193+
(default: :obj:`"System"`)
194+
meta_dict (Optional[Dict[str, str]]): Additional metadata
195+
dictionary for the message.
196+
197+
Returns:
198+
BaseMessage: The new system message.
199+
"""
200+
return cls(
201+
role_name,
202+
RoleType.SYSTEM,
203+
meta_dict,
204+
content,
205+
)
206+
181207
def create_new_instance(self, content: str) -> "BaseMessage":
182208
r"""Create a new instance of the :obj:`BaseMessage` with updated
183209
content.

camel/types/enums.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
class RoleType(Enum):
2525
ASSISTANT = "assistant"
2626
USER = "user"
27+
SYSTEM = "system"
2728
CRITIC = "critic"
2829
EMBODIMENT = "embodiment"
2930
DEFAULT = "default"

test/toolkits/test_openai_function.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ def test_all_parameters(
104104
'enum': [
105105
'assistant',
106106
'user',
107+
'system',
107108
'critic',
108109
'embodiment',
109110
'default',
@@ -126,6 +127,7 @@ def test_all_parameters(
126127
'enum': [
127128
'assistant',
128129
'user',
130+
'system',
129131
'critic',
130132
'embodiment',
131133
'default',

0 commit comments

Comments
 (0)