WeChatMsg/app/ui/chat/ai_chat.py

168 lines
5.4 KiB
Python
Raw Normal View History

2024-02-06 16:57:46 +08:00
import sys
import time
import traceback
2024-02-06 17:53:38 +08:00
import requests
2024-02-06 16:57:46 +08:00
from PyQt5.QtCore import QThread, pyqtSignal, QSize, Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout, QApplication, QTextBrowser
2024-02-06 17:53:38 +08:00
from app.log import logger
2024-02-06 16:57:46 +08:00
from app.ui.Icon import Icon
try:
from .chatInfoUi import Ui_Form
except:
from chatInfoUi import Ui_Form
from app.DataBase import msg_db, hard_link_db
from app.components.bubble_message import BubbleMessage, ChatWidget, Notice
from app.person import Me, Contact, ContactDefault
class Message(QWidget):
def __init__(self, is_send=False, text='', parent=None):
super().__init__(parent)
self.avatar = QLabel(self)
self.textBrowser = QTextBrowser(self)
self.textBrowser.setText(text)
layout = QHBoxLayout(self)
if is_send:
pixmap = Me().avatar.scaled(45, 45)
self.textBrowser.setLayoutDirection(Qt.RightToLeft)
self.textBrowser.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.avatar.setPixmap(pixmap)
layout.addWidget(self.textBrowser)
layout.addWidget(self.avatar)
else:
pixmap = QPixmap(Icon.Default_avatar_path).scaled(45, 45)
self.avatar.setPixmap(pixmap)
layout.addWidget(self.avatar)
layout.addWidget(self.textBrowser)
# self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height()))
self.textBrowser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.avatar.setFixedSize(QSize(60, 60))
def append(self, text: str):
self.textBrowser.insertPlainText(text)
self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height()))
class AIChat(QWidget, Ui_Form):
def __init__(self, contact, parent=None):
super().__init__(parent)
2024-02-06 17:53:38 +08:00
self.now_message: Message = None
2024-02-06 16:57:46 +08:00
self.setupUi(self)
self.last_timestamp = 0
self.last_str_time = ''
self.last_pos = 0
self.contact = contact
self.init_ui()
self.show_chats()
self.pushButton.clicked.connect(self.send_msg)
def init_ui(self):
self.textEdit.installEventFilter(self)
def chat(self, text):
self.now_message.append(text)
self.scrollArea.verticalScrollBar().setValue(self.scrollArea.verticalScrollBar().maximum())
def send_msg(self):
msg = self.textEdit.toPlainText().strip()
self.textEdit.setText('')
if not msg:
return
print(msg)
bubble_message = BubbleMessage(
msg,
Me().avatar,
1,
True,
)
self.verticalLayout_message.addWidget(bubble_message)
message1 = Message(False)
self.verticalLayout_message.addWidget(message1)
self.show_chat_thread.msg = msg
self.now_message = message1
self.show_chat_thread.start()
2024-02-06 17:53:38 +08:00
self.scrollArea.verticalScrollBar().setValue(self.scrollArea.verticalScrollBar().maximum())
2024-02-06 16:57:46 +08:00
def show_chats(self):
# return
self.show_chat_thread = AIChatThread()
self.show_chat_thread.msgSignal.connect(self.chat)
def update_history_messages(self):
print('开始发送信息')
message1 = Message(False)
2024-02-06 17:53:38 +08:00
msg = '你好!'
2024-02-06 16:57:46 +08:00
self.verticalLayout_message.addWidget(message1)
self.show_chat_thread.msg = msg
self.now_message = message1
self.show_chat_thread.start()
2024-02-06 17:53:38 +08:00
2024-02-06 16:57:46 +08:00
def add_message(self, message):
print('message', message)
# self.textBrowser.append(message)
self.textBrowser.insertPlainText(message)
self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height()))
def eventFilter(self, obj, event):
if obj == self.textEdit and event.type() == event.KeyPress:
key = event.key()
if key == 16777220: # 回车键的键值
self.send_msg()
self.textEdit.setText('')
return True
return super().eventFilter(obj, event)
2024-02-06 17:53:38 +08:00
2024-02-06 16:57:46 +08:00
class AIChatThread(QThread):
msgSignal = pyqtSignal(str)
showSingal = pyqtSignal(tuple)
finishSingal = pyqtSignal(int)
msg_id = 0
# heightSingal = pyqtSignal(int)
def __init__(self):
super().__init__()
self.msg = ''
def run(self) -> None:
2024-02-06 17:53:38 +08:00
url = 'http://api.lc044.love/chat'
data = {
'username': Me().wxid,
'messages': [
{
'role': 'user',
"content": self.msg
}
]
}
try:
resp = requests.post(url, json=data, stream=True)
if resp.status_code==200:
for line in resp.iter_lines():
if line:
trunk = line.decode('utf-8')
print(trunk)
self.msgSignal.emit(trunk)
else:
error = resp.json().get('error')
logger.error(f'ai请求错误:{error}')
self.msgSignal.emit(error)
except Exception as e:
error = str(e)
logger.error(f'ai请求错误:{error}')
self.msgSignal.emit(error)
2024-02-06 16:57:46 +08:00
if __name__ == '__main__':
app = QApplication(sys.argv)
contact = ContactDefault('1')
dialog = AIChat(contact)
dialog.show()
sys.exit(app.exec_())