OllamaInterface/OllamaChatWidget.py

Tue, 06 Aug 2024 18:18:39 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 06 Aug 2024 18:18:39 +0200
changeset 5
6e8af43d537d
child 10
734921ab2b89
permissions
-rw-r--r--

Implemented the 'chat' functionality.

5
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2 # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de>
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 #
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 Module implementing a widget showing the chat with the 'ollama' server.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9 from PyQt6.QtCore import Qt, QTimer, pyqtSlot
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 from PyQt6.QtWidgets import QVBoxLayout, QWidget
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 from .OllamaChatMessageBox import OllamaChatMessageBox
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 from .Ui_OllamaChatWidget import Ui_OllamaChatWidget
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 class OllamaChatWidget(QWidget, Ui_OllamaChatWidget):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 Class implementing a widget showing the chat with the 'ollama' server.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 def __init__(self, hid, title, model, parent=None):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 Constructor
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 @param hid ID of the chat history
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 @type str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 @param title title of the chat
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 @type str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 @param model model name used for the chat
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 @type str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @param parent reference to the parent widget (defaults to None)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @type QWidget (optional)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 super().__init__(parent)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 self.setupUi(self)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 self.__hid = hid
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 self.headerLabel.setText(
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 self.tr("<b>{0} - {1}</b>", "title, model name").format(title, model)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 )
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 self.__messagesLayout = QVBoxLayout()
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 self.__messagesLayout.setContentsMargins(4, 4, 4, 4)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 self.__messagesLayout.setAlignment(Qt.AlignmentFlag.AlignTop)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 self.chatMessagesWidget.setLayout(self.__messagesLayout)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 def addMessage(self, role, message):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 Public method to add a new message.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 @param role role of the message sender (one of 'user' or 'assistant')
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 @type str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 @param message message text
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 @type str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 msgWidget = OllamaChatMessageBox(role=role, message=message)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.__messagesLayout.addWidget(msgWidget)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 QTimer.singleShot(0, self.__scrollChatToBottom)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 def appendMessage(self, message):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 Public method to append a given message to the bottom most message box.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 @param message message text to be appended
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @type str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 msgBox = self.__messagesLayout.itemAt(
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 self.__messagesLayout.count() - 1
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 ).widget()
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 msgBox.appendMessage(message)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 QTimer.singleShot(0, self.__scrollChatToBottom)
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 @pyqtSlot()
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 def __scrollChatToBottom(self):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 Private slot to scroll the chat scroll area to the bottom.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 scrollbar = self.chatMessagesScrollArea.verticalScrollBar()
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 scrollbar.setValue(scrollbar.maximum())
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 def getHistoryId(self):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 Public method to get the history ID of this chat.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 @return DESCRIPTION
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 @rtype TYPE
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 return self.__hid
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 def getRecentMessage(self):
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 Public method to get the message of the last message box.
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @return message content
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @rtype str
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 """
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 msgBox = self.__messagesLayout.itemAt(
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 self.__messagesLayout.count() - 1
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 ).widget()
6e8af43d537d Implemented the 'chat' functionality.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 return msgBox.getMessage()

eric ide

mercurial