| | 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): |
| | |
| | self.child_conn.send(PipeCom("show", sender.name + "\n\n---\n\n" + message["content"])) |
| |
|
| | def gpt_academic_get_human_input(self, user_proxy, message): |
| | |
| | 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): |
| | |
| | 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): |
| | |
| | self.child_conn = child_conn |
| | while True: |
| | msg = self.child_conn.recv() |
| | self.exe_autogen(msg) |
| |
|
| |
|
| | class AutoGenGroupChat(AutoGenGeneral): |
| | def exe_autogen(self, input): |
| | |
| | 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 |
| |
|