mirror of
https://github.com/microsoft/autogen.git
synced 2025-07-21 07:51:55 +00:00
109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
![]() |
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
|