104 lines
4.5 KiB
Python
104 lines
4.5 KiB
Python
from toolbox import CatchException, update_ui, gen_time_str, trimmed_format_exc, is_the_upload_folder
|
||
import time
|
||
|
||
class PipeCom():
|
||
def __init__(self, cmd, content) -> None:
|
||
self.cmd = cmd
|
||
self.content = content
|
||
|
||
class PluginMultiprocessManager():
|
||
def __init__(self, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
|
||
# ⭐ 主进程
|
||
self.llm_kwargs = llm_kwargs
|
||
self.plugin_kwargs = plugin_kwargs
|
||
self.chatbot = chatbot
|
||
self.history = history
|
||
self.system_prompt = system_prompt
|
||
self.web_port = web_port
|
||
self.alive = True
|
||
|
||
def is_alive(self):
|
||
return self.alive
|
||
|
||
def launch_subprocess_with_pipe(self):
|
||
# ⭐ 主进程
|
||
from multiprocessing import Process, Pipe
|
||
parent_conn, child_conn = Pipe()
|
||
self.p = Process(target=self.subprocess_worker, args=(child_conn,))
|
||
self.p.daemon = True
|
||
self.p.start()
|
||
return parent_conn
|
||
|
||
def terminate(self):
|
||
self.p.terminate()
|
||
self.alive = False
|
||
print('[debug] instance terminated')
|
||
|
||
def subprocess_worker(self, child_conn):
|
||
# ⭐⭐ 子进程
|
||
raise NotImplementedError
|
||
|
||
def send_command(self, cmd):
|
||
# ⭐ 主进程
|
||
self.parent_conn.send(PipeCom("user_input", cmd))
|
||
|
||
def main_process_ui_control(self, txt, create_or_resume) -> str:
|
||
# ⭐ 主进程
|
||
if create_or_resume == 'create':
|
||
self.cnt = 1
|
||
self.parent_conn = self.launch_subprocess_with_pipe() # ⭐⭐⭐
|
||
self.send_command(txt)
|
||
if txt == 'exit':
|
||
self.chatbot.append([f"结束", "结束信号已明确,终止AutoGen程序。"])
|
||
yield from update_ui(chatbot=self.chatbot, history=self.history)
|
||
self.terminate()
|
||
return "terminate"
|
||
|
||
while True:
|
||
time.sleep(0.5)
|
||
if self.parent_conn.poll():
|
||
if '[GPT-Academic] 等待中' in self.chatbot[-1][-1]:
|
||
self.chatbot.pop(-1) # remove the last line
|
||
msg = self.parent_conn.recv() # PipeCom
|
||
if msg.cmd == "done":
|
||
self.chatbot.append([f"结束", msg.content]); self.cnt += 1
|
||
yield from update_ui(chatbot=self.chatbot, history=self.history)
|
||
self.terminate(); break
|
||
if msg.cmd == "show":
|
||
self.chatbot.append([f"运行阶段-{self.cnt}", msg.content]); self.cnt += 1
|
||
yield from update_ui(chatbot=self.chatbot, history=self.history)
|
||
if msg.cmd == "interact":
|
||
self.chatbot.append([f"程序抵达用户反馈节点.", msg.content +
|
||
"\n\n等待您的进一步指令. \n\n(1) 如果您没有什么想说的, 清空输入区,然后直接点击“提交”以继续. " +
|
||
"\n\n(2) 如果您需要补充些什么, 输入要反馈的内容, 直接点击“提交”以继续. " +
|
||
"\n\n(3) 如果您想终止程序, 输入exit, 直接点击“提交”以终止AutoGen并解锁. "
|
||
])
|
||
yield from update_ui(chatbot=self.chatbot, history=self.history)
|
||
# do not terminate here, leave the subprocess_worker instance alive
|
||
return "wait_feedback"
|
||
else:
|
||
if '[GPT-Academic] 等待中' not in self.chatbot[-1][-1]:
|
||
self.chatbot.append(["[GPT-Academic] 等待AutoGen执行结果 ...", "[GPT-Academic] 等待中"])
|
||
self.chatbot[-1] = [self.chatbot[-1][0], self.chatbot[-1][1].replace("[GPT-Academic] 等待中", "[GPT-Academic] 等待中.")]
|
||
yield from update_ui(chatbot=self.chatbot, history=self.history)
|
||
|
||
self.terminate()
|
||
return "terminate"
|
||
|
||
def subprocess_worker_wait_user_feedback(self, wait_msg="wait user feedback"):
|
||
# ⭐⭐ 子进程
|
||
patience = 5 * 60
|
||
begin_waiting_time = time.time()
|
||
self.child_conn.send(PipeCom("interact", wait_msg))
|
||
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
|
||
return wait_success
|
||
|