135 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from toolbox import trimmed_format_exc, get_conf, ProxyNetworkActivate
 | 
						|
from crazy_functions.agent_fns.pipe import PluginMultiprocessManager, PipeCom
 | 
						|
from request_llms.bridge_all import predict_no_ui_long_connection
 | 
						|
import time
 | 
						|
 | 
						|
def gpt_academic_generate_oai_reply(
 | 
						|
    self,
 | 
						|
    messages,
 | 
						|
    sender,
 | 
						|
    config,
 | 
						|
):
 | 
						|
    llm_config = self.llm_config if config is None else config
 | 
						|
    if llm_config is False:
 | 
						|
        return False, None
 | 
						|
    if messages is None:
 | 
						|
        messages = self._oai_messages[sender]
 | 
						|
 | 
						|
    inputs = messages[-1]['content']
 | 
						|
    history = []
 | 
						|
    for message in messages[:-1]:
 | 
						|
        history.append(message['content'])
 | 
						|
    context=messages[-1].pop("context", None)
 | 
						|
    assert context is None, "预留参数 context 未实现"
 | 
						|
 | 
						|
    reply = predict_no_ui_long_connection(
 | 
						|
        inputs=inputs,
 | 
						|
        llm_kwargs=llm_config,
 | 
						|
        history=history,
 | 
						|
        sys_prompt=self._oai_system_message[0]['content'],
 | 
						|
        console_slience=True
 | 
						|
    )
 | 
						|
    assumed_done = reply.endswith('\nTERMINATE')
 | 
						|
    return True, reply
 | 
						|
 | 
						|
class AutoGenGeneral(PluginMultiprocessManager):
 | 
						|
    def gpt_academic_print_override(self, user_proxy, message, sender):
 | 
						|
        # ⭐⭐ run in subprocess
 | 
						|
        self.child_conn.send(PipeCom("show", sender.name + "\n\n---\n\n" + message["content"]))
 | 
						|
 | 
						|
    def gpt_academic_get_human_input(self, user_proxy, message):
 | 
						|
        # ⭐⭐ run in subprocess
 | 
						|
        patience = 300
 | 
						|
        begin_waiting_time = time.time()
 | 
						|
        self.child_conn.send(PipeCom("interact", message))
 | 
						|
        while True:
 | 
						|
            time.sleep(0.5)
 | 
						|
            if self.child_conn.poll():
 | 
						|
                wait_success = True
 | 
						|
                break
 | 
						|
            if time.time() - begin_waiting_time > patience:
 | 
						|
                self.child_conn.send(PipeCom("done", ""))
 | 
						|
                wait_success = False
 | 
						|
                break
 | 
						|
        if wait_success:
 | 
						|
            return self.child_conn.recv().content
 | 
						|
        else:
 | 
						|
            raise TimeoutError("等待用户输入超时")
 | 
						|
 | 
						|
    def define_agents(self):
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
    def exe_autogen(self, input):
 | 
						|
        # ⭐⭐ run in subprocess
 | 
						|
        input = input.content
 | 
						|
        with ProxyNetworkActivate("AutoGen"):
 | 
						|
            code_execution_config = {"work_dir": self.autogen_work_dir, "use_docker": self.use_docker}
 | 
						|
            agents = self.define_agents()
 | 
						|
            user_proxy = None
 | 
						|
            assistant = None
 | 
						|
            for agent_kwargs in agents:
 | 
						|
                agent_cls = agent_kwargs.pop('cls')
 | 
						|
                kwargs = {
 | 
						|
                    'llm_config':self.llm_kwargs,
 | 
						|
                    'code_execution_config':code_execution_config
 | 
						|
                }
 | 
						|
                kwargs.update(agent_kwargs)
 | 
						|
                agent_handle = agent_cls(**kwargs)
 | 
						|
                agent_handle._print_received_message = lambda a,b: self.gpt_academic_print_override(agent_kwargs, a, b)
 | 
						|
                for d in agent_handle._reply_func_list:
 | 
						|
                    if hasattr(d['reply_func'],'__name__') and d['reply_func'].__name__ == 'generate_oai_reply':
 | 
						|
                        d['reply_func'] = gpt_academic_generate_oai_reply
 | 
						|
                if agent_kwargs['name'] == 'user_proxy':
 | 
						|
                    agent_handle.get_human_input = lambda a: self.gpt_academic_get_human_input(user_proxy, a)
 | 
						|
                    user_proxy = agent_handle
 | 
						|
                if agent_kwargs['name'] == 'assistant': assistant = agent_handle
 | 
						|
            try:
 | 
						|
                if user_proxy is None or assistant is None: raise Exception("用户代理或助理代理未定义")
 | 
						|
                user_proxy.initiate_chat(assistant, message=input)
 | 
						|
            except Exception as e:
 | 
						|
                tb_str = '```\n' + trimmed_format_exc() + '```'
 | 
						|
                self.child_conn.send(PipeCom("done", "AutoGen 执行失败: \n\n" + tb_str))
 | 
						|
 | 
						|
    def subprocess_worker(self, child_conn):
 | 
						|
        # ⭐⭐ run in subprocess
 | 
						|
        self.child_conn = child_conn
 | 
						|
        while True:
 | 
						|
            msg = self.child_conn.recv()  # PipeCom
 | 
						|
            self.exe_autogen(msg)
 | 
						|
 | 
						|
 | 
						|
class AutoGenGroupChat(AutoGenGeneral):
 | 
						|
    def exe_autogen(self, input):
 | 
						|
        # ⭐⭐ run in subprocess
 | 
						|
        import autogen
 | 
						|
 | 
						|
        input = input.content
 | 
						|
        with ProxyNetworkActivate("AutoGen"):
 | 
						|
            code_execution_config = {"work_dir": self.autogen_work_dir, "use_docker": self.use_docker}
 | 
						|
            agents = self.define_agents()
 | 
						|
            agents_instances = []
 | 
						|
            for agent_kwargs in agents:
 | 
						|
                agent_cls = agent_kwargs.pop("cls")
 | 
						|
                kwargs = {"code_execution_config": code_execution_config}
 | 
						|
                kwargs.update(agent_kwargs)
 | 
						|
                agent_handle = agent_cls(**kwargs)
 | 
						|
                agent_handle._print_received_message = lambda a, b: self.gpt_academic_print_override(agent_kwargs, a, b)
 | 
						|
                agents_instances.append(agent_handle)
 | 
						|
                if agent_kwargs["name"] == "user_proxy":
 | 
						|
                    user_proxy = agent_handle
 | 
						|
                    user_proxy.get_human_input = lambda a: self.gpt_academic_get_human_input(user_proxy, a)
 | 
						|
            try:
 | 
						|
                groupchat = autogen.GroupChat(agents=agents_instances, messages=[], max_round=50)
 | 
						|
                manager = autogen.GroupChatManager(groupchat=groupchat, **self.define_group_chat_manager_config())
 | 
						|
                manager._print_received_message = lambda a, b: self.gpt_academic_print_override(agent_kwargs, a, b)
 | 
						|
                manager.get_human_input = lambda a: self.gpt_academic_get_human_input(manager, a)
 | 
						|
                if user_proxy is None:
 | 
						|
                    raise Exception("user_proxy is not defined")
 | 
						|
                user_proxy.initiate_chat(manager, message=input)
 | 
						|
            except Exception:
 | 
						|
                tb_str = "```\n" + trimmed_format_exc() + "```"
 | 
						|
                self.child_conn.send(PipeCom("done", "AutoGen exe failed: \n\n" + tb_str))
 | 
						|
 | 
						|
    def define_group_chat_manager_config(self):
 | 
						|
        raise NotImplementedError
 |