(programmer_agent.py): 重构run方法以处理LLM_Util().invoke()的返回值

📝 (chat_list.py): 导入PythonExecute模块以支持代码执行功能,修改运行按钮布局
🔧 (chat_list.py): 重构run_button_clicked方法以支持更灵活的消息展示处理
🔧 (chat_list.py): 重构new_response方法,支持不同类型消息的展示
🔧 (chat_list.py): 重构stream_response方法以支持更灵活的消息流处理
🔧 (chat_list.py): 添加code_generate_before_signal和code_generate_after_signal信号
🔧 (chat_list.py): 重构code_generate_after方法以处理生成的代码展示方式
🔧 (chat_page.py): 删除未使用的delete_last_conversation方法
🔧 (chat_page.py): 删除未使用的run_button_clicked方法
This commit is contained in:
yuruo 2024-06-03 18:31:39 +08:00
parent 977693b47e
commit 2fc88263f0
3 changed files with 43 additions and 28 deletions

View File

@ -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

View File

@ -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"<p style='color:green;font-size:14px;'>代码执行完成,执行结果</p><br><code>{res}</code>")
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"<p style='font-size:10pt;'>{text}</p>")
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)

View File

@ -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"<p style='color:green;font-size:14px;'>代码执行完成,执行结果</p><br><code>{res}</code>", "system")
self.delete_last_conversation()
self.chat_list.new_response(f"<p style='color:green;font-size:14px;'>代码执行完成,执行结果</p><br><code>{res}</code>", "system")