From 2fc88263f09c39de4871e4c496b8fe2d50610914 Mon Sep 17 00:00:00 2001 From: yuruo Date: Mon, 3 Jun 2024 18:31:39 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20(programmer=5Fagent.py):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84run=E6=96=B9=E6=B3=95=E4=BB=A5=E5=A4=84?= =?UTF-8?q?=E7=90=86LLM=5FUtil().invoke()=E7=9A=84=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC=20=F0=9F=93=9D=20(chat=5Flist.py):=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5PythonExecute=E6=A8=A1=E5=9D=97=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BB=A3=E7=A0=81=E6=89=A7=E8=A1=8C=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=BF=90=E8=A1=8C=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=B8=83=E5=B1=80=20=F0=9F=94=A7=20(chat=5Flist.py):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84run=5Fbutton=5Fclicked=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=E6=9B=B4=E7=81=B5=E6=B4=BB=E7=9A=84?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=B1=95=E7=A4=BA=E5=A4=84=E7=90=86=20?= =?UTF-8?q?=F0=9F=94=A7=20(chat=5Flist.py):=20=E9=87=8D=E6=9E=84new=5Fresp?= =?UTF-8?q?onse=E6=96=B9=E6=B3=95=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=B1=BB=E5=9E=8B=E6=B6=88=E6=81=AF=E7=9A=84=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=20=F0=9F=94=A7=20(chat=5Flist.py):=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84stream=5Fresponse=E6=96=B9=E6=B3=95=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9B=B4=E7=81=B5=E6=B4=BB=E7=9A=84=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=B5=81=E5=A4=84=E7=90=86=20=F0=9F=94=A7=20(chat=5Flist.py):?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0code=5Fgenerate=5Fbefore=5Fsignal=E5=92=8C?= =?UTF-8?q?code=5Fgenerate=5Fafter=5Fsignal=E4=BF=A1=E5=8F=B7=20?= =?UTF-8?q?=F0=9F=94=A7=20(chat=5Flist.py):=20=E9=87=8D=E6=9E=84code=5Fgen?= =?UTF-8?q?erate=5Fafter=E6=96=B9=E6=B3=95=E4=BB=A5=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84=E4=BB=A3=E7=A0=81=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=20=F0=9F=94=A7=20(chat=5Fpage.py):=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84delete=5F?= =?UTF-8?q?last=5Fconversation=E6=96=B9=E6=B3=95=20=F0=9F=94=A7=20(chat=5F?= =?UTF-8?q?page.py):=20=E5=88=A0=E9=99=A4=E6=9C=AA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9A=84run=5Fbutton=5Fclicked=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/programmer_agent.py | 5 +++- pages/chat_list.py | 56 ++++++++++++++++++++++++++------------- pages/chat_page.py | 10 +------ 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/agent/programmer_agent.py b/agent/programmer_agent.py index 29892d1..deacb05 100644 --- a/agent/programmer_agent.py +++ b/agent/programmer_agent.py @@ -14,7 +14,10 @@ class ProgrammerAgent: def run(self, question): self.messages.append({"content": question, "role": "user"}) - yield from LLM_Util().invoke(self.messages) + res = "" + for text in LLM_Util().invoke(self.messages): + res += text + return res diff --git a/pages/chat_list.py b/pages/chat_list.py index e3c365c..5dfae77 100644 --- a/pages/chat_list.py +++ b/pages/chat_list.py @@ -4,6 +4,7 @@ from PyQt6.QtWidgets import QTextEdit, QPushButton, QLabel,QAbstractItemView, QL from PyQt6.QtGui import QPixmap from PyQt6 import QtGui, QtCore, QtWidgets from agent.programmer_agent import ProgrammerAgent +from pages.python_execute import PythonExecute from self_utils.qt_util import QtUtil from pages.python_code_edit import PythonHighlighter, QCodeEditor @@ -76,12 +77,12 @@ class ChatList(QListWidget): # save_button = QPushButton("保存") # save_button.setStyleSheet("background-color: grey; color: white;") # run_button_h_box.addWidget(save_button) - run_button_h_box.setStretch(1, 2) + # run_button_h_box.setStretch(1, 2) run_button = QPushButton("运行") run_button.clicked.connect(lambda:self.run_button_clicked(self.text_edit.toPlainText())) run_button.setStyleSheet("background-color: green; color: white;") run_button_h_box.addWidget(run_button) - run_button_h_box.setStretch(2, 2) + run_button_h_box.setStretch(2, 4) conversation_box.addLayout(run_button_h_box) def update_size(widget, item): # 获取 QTextEdit 的文档的大小 @@ -90,12 +91,17 @@ class ChatList(QListWidget): conversation_item.setSizeHint(conversation_widget.size()) # # 设置 QTextEdit 的背景为白色,边角为椭圆 self.text_edit.document().documentLayout().documentSizeChanged.connect(lambda: update_size(conversation_widget, conversation_item)) - + + def run_button_clicked(self, text): + self.new_response("执行代码中...") + res = PythonExecute().run(text) + self.takeItem(self.count()-1) + self.new_response(f"

代码执行完成,执行结果


{res}") def _text_response_render(self, text, conversation_widget, conversation_box, conversation_item): self.text_edit = QTextEdit() self.text_edit.setReadOnly(True) - self.text_edit.setHtml(f"

{text}

") + self.text_edit.setHtml(text) def update_size(widget, item): # 获取 QTextEdit 的文档的大小 doc_size = self.text_edit.document().size().toSize() @@ -106,16 +112,25 @@ class ChatList(QListWidget): conversation_box.addWidget(self.text_edit) - def new_response(self, text, role="system"): + def new_response(self, text, type="text", role="system"): conversation_widget = QtWidgets.QWidget() conversation_widget.setGeometry(QtCore.QRect(110, 100, 160, 80)) conversation_box = QtWidgets.QVBoxLayout(conversation_widget) conversation_box.addLayout(self._sender_render(role)) conversation_item = QListWidgetItem() - self._text_response_render(text, conversation_widget, conversation_box, conversation_item) - self.text_edit.setStyleSheet(""" + if type=="text": + self._text_response_render(text, conversation_widget, conversation_box, conversation_item) + self.text_edit.setStyleSheet(""" + background-color: white; + border-radius: 10px; + font-size:14px; + """) + elif type=="code": + self._code_response_render(text, conversation_widget, conversation_box, conversation_item) + self.text_edit.setStyleSheet(""" background-color: white; border-radius: 10px; + font-size:16px; """) self.text_edit.document().setDocumentMargin(10) # 将 item 添加到 QListWidget self.insertItem(self.count(), conversation_item) @@ -123,19 +138,17 @@ class ChatList(QListWidget): self.scrollToBottom() - def stream_response(self, stream, type="text"): + def stream_response(self, stream): conversation_widget = QtWidgets.QWidget() conversation_widget.setGeometry(QtCore.QRect(110, 100, 160, 80)) conversation_box = QtWidgets.QVBoxLayout(conversation_widget) conversation_box.addLayout(self._sender_render("system")) conversation_item = QListWidgetItem() - if type=="code": - self._code_response_render("我在思考中...", conversation_widget, conversation_box, conversation_item) - elif type=="text": - self._text_response_render("我在思考中...", conversation_widget, conversation_box, conversation_item) + self._text_response_render("我在思考中...", conversation_widget, conversation_box, conversation_item) self.text_edit.setStyleSheet(""" background-color: white; border-radius: 10px; + font-size:14px; """) self.text_edit.document().setDocumentMargin(10) # 将 item 添加到 QListWidget self.insertItem(self.count(), conversation_item) @@ -144,9 +157,15 @@ class ChatList(QListWidget): self.stream_thread = StreamOutput(stream, self.programmer_agent) self.first_call = True self.stream_thread.stream_signal.connect(self.append_text) - self.stream_thread.code_stream_signal.connect(lambda x: self.stream_response(x, type="code")) + self.stream_thread.code_generate_before_signal.connect(lambda : self.new_response("我将根据以上用例生成代码,思考中...")) + self.stream_thread.code_generate_after_signal.connect(self.code_generate_after) self.stream_thread.start() - + + + def code_generate_after(self, code): + self.takeItem(self.count()-1) + self.new_response(code, type="code") + def append_text(self, text): if self.first_call: self.text_edit.setPlainText("") @@ -157,7 +176,8 @@ class ChatList(QListWidget): class StreamOutput(QThread): stream_signal = pyqtSignal(str) - code_stream_signal = pyqtSignal(object) + code_generate_before_signal = pyqtSignal() + code_generate_after_signal = pyqtSignal(str) def __init__(self, stream, programmer_agent): QThread.__init__(self) self.stream = stream @@ -168,9 +188,9 @@ class StreamOutput(QThread): for text in self.stream: response += text self.stream_signal.emit(text) - if "[自动化方案]" in response: + self.code_generate_before_signal.emit() content = response.split("[自动化方案]")[1] - content_stream = self.programmer_agent.run(content) - self.code_stream_signal.emit(content_stream) + code = self.programmer_agent.run(content) + self.code_generate_after_signal.emit(code) diff --git a/pages/chat_page.py b/pages/chat_page.py index 0bc5ee0..b69bab5 100644 --- a/pages/chat_page.py +++ b/pages/chat_page.py @@ -8,7 +8,6 @@ from agent.require_alignment_agent import RequireAlignmentAgent from pages.chat_list import ChatList from pages.config_page import ConfigPage from pages.plugin_page import PluginPage -from pages.python_execute import PythonExecute from self_utils.global_keyboard_listen import GlobalKeyboardListen from self_utils.qt_util import QtUtil @@ -223,15 +222,8 @@ class ChatPage(QMainWindow, interface_ui): def mousePressEvent(self, event): self.action_list.setVisible(False) - def delete_last_conversation(self): - self.chat_list.takeItem(self.chat_list.count()-1) - def run_button_clicked(self, text): - self.chat_list.new_response("执行代码中...") - res = PythonExecute().run(text) - self.chat_list.new_response(f"

代码执行完成,执行结果


{res}", "system") - self.delete_last_conversation() - self.chat_list.new_response(f"

代码执行完成,执行结果


{res}", "system") +