|
|
@@ -755,6 +755,77 @@ class ConversableAgent(Agent): |
|
|
|
|
|
|
|
|
return False, None |
|
|
return False, None |
|
|
|
|
|
|
|
|
|
|
|
async def a_check_termination_and_human_reply( |
|
|
|
|
|
self, |
|
|
|
|
|
messages: Optional[List[Dict]] = None, |
|
|
|
|
|
sender: Optional[Agent] = None, |
|
|
|
|
|
config: Optional[Any] = None, |
|
|
|
|
|
) -> Tuple[bool, Union[str, Dict, None]]: |
|
|
|
|
|
"""(async) Check if the conversation should be terminated, and if human reply is provided.""" |
|
|
|
|
|
if config is None: |
|
|
|
|
|
config = self |
|
|
|
|
|
if messages is None: |
|
|
|
|
|
messages = self._oai_messages[sender] |
|
|
|
|
|
message = messages[-1] |
|
|
|
|
|
reply = "" |
|
|
|
|
|
no_human_input_msg = "" |
|
|
|
|
|
if self.human_input_mode == "ALWAYS": |
|
|
|
|
|
reply = await self.a_get_human_input( |
|
|
|
|
|
f"Provide feedback to {sender.name}. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: " |
|
|
|
|
|
) |
|
|
|
|
|
no_human_input_msg = "NO HUMAN INPUT RECEIVED." if not reply else "" |
|
|
|
|
|
# if the human input is empty, and the message is a termination message, then we will terminate the conversation |
|
|
|
|
|
reply = reply if reply or not self._is_termination_msg(message) else "exit" |
|
|
|
|
|
else: |
|
|
|
|
|
if self._consecutive_auto_reply_counter[sender] >= self._max_consecutive_auto_reply_dict[sender]: |
|
|
|
|
|
if self.human_input_mode == "NEVER": |
|
|
|
|
|
reply = "exit" |
|
|
|
|
|
else: |
|
|
|
|
|
# self.human_input_mode == "TERMINATE": |
|
|
|
|
|
terminate = self._is_termination_msg(message) |
|
|
|
|
|
reply = await self.a_get_human_input( |
|
|
|
|
|
f"Please give feedback to {sender.name}. Press enter or type 'exit' to stop the conversation: " |
|
|
|
|
|
if terminate |
|
|
|
|
|
else f"Please give feedback to {sender.name}. Press enter to skip and use auto-reply, or type 'exit' to stop the conversation: " |
|
|
|
|
|
) |
|
|
|
|
|
no_human_input_msg = "NO HUMAN INPUT RECEIVED." if not reply else "" |
|
|
|
|
|
# if the human input is empty, and the message is a termination message, then we will terminate the conversation |
|
|
|
|
|
reply = reply if reply or not terminate else "exit" |
|
|
|
|
|
elif self._is_termination_msg(message): |
|
|
|
|
|
if self.human_input_mode == "NEVER": |
|
|
|
|
|
reply = "exit" |
|
|
|
|
|
else: |
|
|
|
|
|
# self.human_input_mode == "TERMINATE": |
|
|
|
|
|
reply = await self.a_get_human_input( |
|
|
|
|
|
f"Please give feedback to {sender.name}. Press enter or type 'exit' to stop the conversation: " |
|
|
|
|
|
) |
|
|
|
|
|
no_human_input_msg = "NO HUMAN INPUT RECEIVED." if not reply else "" |
|
|
|
|
|
# if the human input is empty, and the message is a termination message, then we will terminate the conversation |
|
|
|
|
|
reply = reply or "exit" |
|
|
|
|
|
|
|
|
|
|
|
# print the no_human_input_msg |
|
|
|
|
|
if no_human_input_msg: |
|
|
|
|
|
print(colored(f"\n>>>>>>>> {no_human_input_msg}", "red"), flush=True) |
|
|
|
|
|
|
|
|
|
|
|
# stop the conversation |
|
|
|
|
|
if reply == "exit": |
|
|
|
|
|
# reset the consecutive_auto_reply_counter |
|
|
|
|
|
self._consecutive_auto_reply_counter[sender] = 0 |
|
|
|
|
|
return True, None |
|
|
|
|
|
|
|
|
|
|
|
# send the human reply |
|
|
|
|
|
if reply or self._max_consecutive_auto_reply_dict[sender] == 0: |
|
|
|
|
|
# reset the consecutive_auto_reply_counter |
|
|
|
|
|
self._consecutive_auto_reply_counter[sender] = 0 |
|
|
|
|
|
return True, reply |
|
|
|
|
|
|
|
|
|
|
|
# increment the consecutive_auto_reply_counter |
|
|
|
|
|
self._consecutive_auto_reply_counter[sender] += 1 |
|
|
|
|
|
if self.human_input_mode != "NEVER": |
|
|
|
|
|
print(colored("\n>>>>>>>> USING AUTO REPLY...", "red"), flush=True) |
|
|
|
|
|
|
|
|
|
|
|
return False, None |
|
|
|
|
|
|
|
|
def generate_reply( |
|
|
def generate_reply( |
|
|
self, |
|
|
self, |
|
|
messages: Optional[List[Dict]] = None, |
|
|
messages: Optional[List[Dict]] = None, |
|
|
@@ -891,6 +962,20 @@ class ConversableAgent(Agent): |
|
|
reply = input(prompt) |
|
|
reply = input(prompt) |
|
|
return reply |
|
|
return reply |
|
|
|
|
|
|
|
|
|
|
|
async def a_get_human_input(self, prompt: str) -> str: |
|
|
|
|
|
"""(Async) Get human input. |
|
|
|
|
|
|
|
|
|
|
|
Override this method to customize the way to get human input. |
|
|
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
|
prompt (str): prompt for the human input. |
|
|
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
|
str: human input. |
|
|
|
|
|
""" |
|
|
|
|
|
reply = input(prompt) |
|
|
|
|
|
return reply |
|
|
|
|
|
|
|
|
def run_code(self, code, **kwargs): |
|
|
def run_code(self, code, **kwargs): |
|
|
"""Run the code and return the result. |
|
|
"""Run the code and return the result. |
|
|
|
|
|
|
|
|
|