[Feature]: Add global silent param for ConversableAgent (#3244)

* feat: add is_silent param

* modify param name

* param doc

* fix: silent only overwrite agent own

* fix: change _is_silent to static method and receive verbose print

* fix test failure

* add kwargs for ConversableAgent subclass

---------

Co-authored-by: gongwn1 <gongwn1@lenovo.com>
Co-authored-by: Li Jiang <bnujli@gmail.com>
Co-authored-by: Umer Mansoor <umermk3@gmail.com>
This commit is contained in:
wenngong 2024-08-02 22:39:42 +08:00 committed by GitHub
parent 466c851743
commit 354dca8035
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 25 additions and 4 deletions

View File

@ -39,6 +39,7 @@ class SocietyOfMindAgent(ConversableAgent):
code_execution_config: Union[Dict, Literal[False]] = False,
llm_config: Optional[Union[Dict, Literal[False]]] = False,
default_auto_reply: Optional[Union[str, Dict, None]] = "",
**kwargs,
):
super().__init__(
name=name,
@ -50,6 +51,7 @@ class SocietyOfMindAgent(ConversableAgent):
code_execution_config=code_execution_config,
llm_config=llm_config,
default_auto_reply=default_auto_reply,
**kwargs,
)
self.update_chat_manager(chat_manager)

View File

@ -41,6 +41,7 @@ class WebSurferAgent(ConversableAgent):
summarizer_llm_config: Optional[Union[Dict, Literal[False]]] = None,
default_auto_reply: Optional[Union[str, Dict, None]] = "",
browser_config: Optional[Union[Dict, None]] = None,
**kwargs,
):
super().__init__(
name=name,
@ -53,6 +54,7 @@ class WebSurferAgent(ConversableAgent):
code_execution_config=code_execution_config,
llm_config=llm_config,
default_auto_reply=default_auto_reply,
**kwargs,
)
self._create_summarizer_client(summarizer_llm_config, llm_config)

View File

@ -78,6 +78,7 @@ class ConversableAgent(LLMAgent):
default_auto_reply: Union[str, Dict] = "",
description: Optional[str] = None,
chat_messages: Optional[Dict[Agent, List[Dict]]] = None,
silent: Optional[bool] = None,
):
"""
Args:
@ -126,6 +127,8 @@ class ConversableAgent(LLMAgent):
chat_messages (dict or None): the previous chat messages that this agent had in the past with other agents.
Can be used to give the agent a memory by providing the chat history. This will allow the agent to
resume previous had conversations. Defaults to an empty chat history.
silent (bool or None): (Experimental) whether to print the message sent. If None, will use the value of
silent in each function.
"""
# we change code_execution_config below and we have to make sure we don't change the input
# in case of UserProxyAgent, without this we could even change the default value {}
@ -147,6 +150,7 @@ class ConversableAgent(LLMAgent):
if is_termination_msg is not None
else (lambda x: content_str(x.get("content")) == "TERMINATE")
)
self.silent = silent
# Take a copy to avoid modifying the given dict
if isinstance(llm_config, dict):
try:
@ -263,6 +267,10 @@ class ConversableAgent(LLMAgent):
)
self.client = None if self.llm_config is False else OpenAIWrapper(**self.llm_config)
@staticmethod
def _is_silent(agent: Agent, silent: Optional[bool] = False) -> bool:
return agent.silent if agent.silent is not None else silent
@property
def name(self) -> str:
"""Get the name of the agent."""
@ -606,7 +614,9 @@ class ConversableAgent(LLMAgent):
"""Process the message before sending it to the recipient."""
hook_list = self.hook_lists["process_message_before_send"]
for hook in hook_list:
message = hook(sender=self, message=message, recipient=recipient, silent=silent)
message = hook(
sender=self, message=message, recipient=recipient, silent=ConversableAgent._is_silent(self, silent)
)
return message
def send(
@ -648,7 +658,7 @@ class ConversableAgent(LLMAgent):
Raises:
ValueError: if the message can't be converted into a valid ChatCompletion message.
"""
message = self._process_message_before_send(message, recipient, silent)
message = self._process_message_before_send(message, recipient, ConversableAgent._is_silent(self, silent))
# When the agent composes and sends the message, the role of the message is "assistant"
# unless it's "function".
valid = self._append_oai_message(message, "assistant", recipient)
@ -698,7 +708,7 @@ class ConversableAgent(LLMAgent):
Raises:
ValueError: if the message can't be converted into a valid ChatCompletion message.
"""
message = self._process_message_before_send(message, recipient, silent)
message = self._process_message_before_send(message, recipient, ConversableAgent._is_silent(self, silent))
# When the agent composes and sends the message, the role of the message is "assistant"
# unless it's "function".
valid = self._append_oai_message(message, "assistant", recipient)
@ -780,7 +790,8 @@ class ConversableAgent(LLMAgent):
raise ValueError(
"Received message can't be converted into a valid ChatCompletion message. Either content or function_call must be provided."
)
if not silent:
if not ConversableAgent._is_silent(sender, silent):
self._print_received_message(message, sender)
def receive(

View File

@ -35,6 +35,7 @@ class UserProxyAgent(ConversableAgent):
llm_config: Optional[Union[Dict, Literal[False]]] = False,
system_message: Optional[Union[str, List]] = "",
description: Optional[str] = None,
**kwargs,
):
"""
Args:
@ -79,6 +80,8 @@ class UserProxyAgent(ConversableAgent):
Only used when llm_config is not False. Use it to reprogram the agent.
description (str): a short description of the agent. This description is used by other agents
(e.g. the GroupChatManager) to decide when to call upon this agent. (Default: system_message)
**kwargs (dict): Please refer to other kwargs in
[ConversableAgent](conversable_agent#__init__).
"""
super().__init__(
name=name,
@ -93,6 +96,7 @@ class UserProxyAgent(ConversableAgent):
description=(
description if description is not None else self.DEFAULT_USER_PROXY_AGENT_DESCRIPTIONS[human_input_mode]
),
**kwargs,
)
if logging_enabled():

View File

@ -208,6 +208,7 @@ def test_multi_tool_call():
def __init__(self, name):
self._name = name
self.received = []
self.silent = False
@property
def name(self):
@ -303,6 +304,7 @@ async def test_async_multi_tool_call():
def __init__(self, name):
self._name = name
self.received = []
self.silent = False
@property
def name(self):