Spaces:
Runtime error
Runtime error
File size: 5,133 Bytes
b628e9d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
import autogen
from autogen.agentchat.contrib.text_analyzer_agent import TextAnalyzerAgent
from autogensop.gradio_chat_manager import GroupChat, GroupChatManager
class GradioAutogenSop(autogen.ConversableAgent):
def __init__(
self,
target="",
states=[],
agents=[],
user_name="",
llm_config={},
max_user_input=100,
**kwargs,
) -> None:
super().__init__(
name="State manager",
human_input_mode="NEVER",
llm_config=llm_config,
system_message="You are a state manager",
**kwargs,
)
self.target = target
self.states = states
self.agents = agents
self.user_name = user_name
self.llm_config = llm_config
self.max_user_input = max_user_input
self.groupchat = autogen.GroupChat(agents, messages=[])
self.user = self.groupchat.agent_by_name(self.user_name)
self.manager = GroupChatManager(self.groupchat, llm_config=self.llm_config)
self.messages = []
self.state_groupchat = None
def _state_start_condition(self):
return "\n".join([f"{key}: {item['start_condition']}" for key, item in self.states.items()])
def _state_task(self):
return "\n".join([f"{key}: {item['task']}" for key, item in self.states.items()])
def judge_target_reached(self):
# 判断self.target是否满足
rule = f"""Your judgment condition is {self.target} If the judgment condition is reached, only return: EXIT, else only return: CONTINUE. """
prompt = self.messages + [{
"role": "system",
"content": rule,
}]
final, res = self.generate_oai_reply(prompt)
print('***************target_reached:' + res)
if final:
if 'EXIT' in res:
return True
else:
return False
else:
print('judge_target_reached 错误')
exit()
def select_state(self):
# 判断进入的state
states_rule = f"""Your ultimate goal is {self.target} The optional states are as follows:
{self._state_start_condition()}.
Read the above conversation. Then select the next state from {[key for key in self.states]}. Only return the state."""
prompt = self.messages[-4:] + [{
"role": "system",
"content": states_rule,
}]
print('【判断进入的state】')
print(prompt)
final, name = self.generate_oai_reply(prompt)
while name not in list(self.states.keys()):
prompt += [{
"role": "system",
"content": name + "is wrong answer",
}]
final, name = self.generate_oai_reply(prompt)
print('************进入:' + name + '阶段************\n')
if final:
return name
else:
print('select_state 错误')
exit()
def get_response(self, history):
while True:
print('【选择发言人】')
speaker = self.manager.groupchat.select_speaker(self.user, self.manager)
print('************选择发言的是:' + speaker.name + '**************\n')
if speaker.name == self.user.name:
break
# 如果是可学习的agent则学习
if hasattr(speaker, 'learn_from_user_feedback'):
speaker.learn_from_user_feedback()
reply = speaker.generate_reply(messages=self.messages, sender=self.manager)
self.manager.broadcast(reply, speaker)
message = self.manager.chat_messages[self.user][-1]
message["name"] = speaker.name
self.messages.append(message)
self.manager.groupchat.messages = self.messages
history += [[None, " **" + speaker.name + ":** " + reply]]
yield history
yield history
def ready_response(self, msg, history):
self.user.send(message=msg, recipient=self.manager, request_reply=False)
message = self.manager.chat_messages[self.user][-1]
message["name"] = self.user.name
self.messages.append(message)
state_name = self.select_state()
# 根据state更改参与者的sys_msg,将阶段目标拼接到sys_msg后面
for agent_name, sys_msg in self.states[state_name]['sys_msg'].items():
agent = self.groupchat.agent_by_name(agent_name)
if sys_msg not in agent.system_message:
agent.update_system_message(agent.system_message + '此阶段你的目标是:' + sys_msg)
# 创建group chat,继承已有对话
self.state_groupchat = GroupChat(
[self.groupchat.agent_by_name(agent_name) for agent_name in
self.states[state_name]['participate_agent_names']],
messages=self.messages,
max_round=4
)
self.manager.groupchat = self.state_groupchat
self.manager.broadcast(msg, self.user)
return "", history + [[msg, None]]
|