import json from typing import Any, Dict, List import redis import autogen from autogen import Cache class AgNestedChat: def __init__(self, redis_url: str, config_list: List[Dict[str, Any]]) -> None: # Initialize the workflows dictionary self.workflows = {} # Establish a connection to Redis self.redis_con = redis.from_url(redis_url) # Create a Redis cache with a seed of 16 self.redis_cache = Cache.redis(cache_seed=16, redis_url=redis_url) # Store the configuration list self.config_list = config_list # Define the GPT-4 configuration self.llm_config = { "cache_seed": False, # change the cache_seed for different trials "temperature": 0, "config_list": self.config_list, "timeout": 120, } # Initialize the writer agent self.writer = autogen.AssistantAgent( name="Writer", llm_config={"config_list": config_list}, system_message=""" You are a professional writer, known for your insightful and engaging articles. You transform complex concepts into compelling narratives. You should improve the quality of the content based on the feedback from the user. """, ) # Initialize the user proxy agent self.user_proxy = autogen.UserProxyAgent( name="User", human_input_mode="NEVER", is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0, code_execution_config={ "last_n_messages": 1, "work_dir": "tasks", "use_docker": False, }, # Please set use_docker=True if docker is available to run the generated code. Using docker is safer than running the generated code directly. ) # Initialize the critic agent self.critic = autogen.AssistantAgent( name="Critic", llm_config={"config_list": config_list}, system_message=""" You are a critic, known for your thoroughness and commitment to standards. Your task is to scrutinize content for any harmful elements or regulatory violations, ensuring all materials align with required guidelines. For code """, ) # Register the reply function for each agent agents_list = [self.writer, self.user_proxy, self.critic] for agent in agents_list: agent.register_reply( [autogen.Agent, None], reply_func=self._update_redis, config={"callback": None}, ) def _update_redis(self, recipient, messages=[], sender=None, config=None): # Publish a message to Redis mesg = {"sender": sender.name, "receiver": recipient.name, "messages": messages} self.redis_con.publish("channel:1", json.dumps(mesg)) return False, None def _reflection_message(self, recipient, messages, sender, config): # Generate a reflection message print("Reflecting...", "yellow") return f"Reflect and provide critique on the following writing. \n\n {recipient.chat_messages_for_summary(sender)[-1]['content']}" def chat(self, question: str) -> autogen.ChatResult: # Register nested chats for the user proxy agent self.user_proxy.register_nested_chats( [ { "recipient": self.critic, "message": self._reflection_message, "summary_method": "last_msg", "max_turns": 1, } ], trigger=self.writer, # condition=my_condition, ) # Initiate a chat and return the result res = self.user_proxy.initiate_chat( recipient=self.writer, message=question, max_turns=2, summary_method="last_msg", ) return res