OllamaInterface/OllamaWidget.py

changeset 7
eb1dec15b2f0
parent 6
d8064fb63eac
child 8
3118d16e526e
--- a/OllamaInterface/OllamaWidget.py	Wed Aug 07 18:19:25 2024 +0200
+++ b/OllamaInterface/OllamaWidget.py	Thu Aug 08 18:33:49 2024 +0200
@@ -9,7 +9,7 @@
 import json
 import os
 
-from PyQt6.QtCore import Qt, QTimer, pyqtSlot
+from PyQt6.QtCore import QProcessEnvironment, Qt, QTimer, pyqtSlot
 from PyQt6.QtWidgets import (
     QDialog,
     QInputDialog,
@@ -84,6 +84,9 @@
         self.newChatButton.setEnabled(False)
         self.__handleServerStateChanged(False)
 
+        self.__localServerDialog = None
+        self.__localServerProcess = None
+
         self.__connectClient()
 
         self.__initOllamaMenu()
@@ -619,12 +622,30 @@
         self.__chatHistoryMenu.addAction(self.tr("Export"), self.__menuExportHistories)
 
         ###################################################################
+        ## Menu with Local Server related actions
+        ###################################################################
+
+        self.__localServerMenu = QMenu(self.tr("Local Server"))
+        self.__localServerStartMonitorAct = self.__localServerMenu.addAction(
+            self.tr("Start with Monitoring"), self.__startLocalServerMonitoring
+        )
+        self.__localServerMenu.addSeparator()
+        self.__startLocalServerAct = self.__localServerMenu.addAction(
+            self.tr("Start"), self.__startLocalServer
+        )
+        self.__stopLocalServerAct = self.__localServerMenu.addAction(
+            self.tr("Stop"), self.__stopLocalServer
+        )
+
+        ###################################################################
         ## Main menu
         ###################################################################
 
         self.__ollamaMenu = QMenu()
         self.__ollamaMenu.addMenu(self.__chatHistoryMenu)
         self.__ollamaMenu.addSeparator()
+        self.__ollamaMenu.addMenu(self.__localServerMenu)
+        self.__ollamaMenu.addSeparator()
         self.__ollamaMenu.addAction(self.tr("Configure..."), self.__ollamaConfigure)
 
         self.__ollamaMenu.aboutToShow.connect(self.__aboutToShowOllamaMenu)
@@ -638,6 +659,16 @@
         """
         self.__clearHistoriesAct.setEnabled(self.__chatHistoryLayout.count() > 1)
 
+        self.__localServerStartMonitorAct.setEnabled(
+            self.__localServerProcess is None and self.__localServerDialog is None
+        )
+        self.__startLocalServerAct.setEnabled(
+            self.__localServerProcess is None and self.__localServerDialog is None
+        )
+        self.__stopLocalServerAct.setEnabled(
+            self.__localServerProcess is not None and self.__localServerDialog is None
+        )
+
     @pyqtSlot()
     def __ollamaConfigure(self):
         """
@@ -717,3 +748,76 @@
                     if historyWidget is not None:
                         entries[hid] = historyWidget.saveToJson()
                 self.__saveChatHistoryFile(fileName, entries)
+
+    def prepareServerRuntimeEnvironment(self):
+        """
+        Public method to prepare a QProcessEnvironment object.
+
+        @return prepared environment object to be used with QProcess
+        @rtype QProcessEnvironment
+        """
+        env = QProcessEnvironment.systemEnvironment()
+        env.insert(
+            "OLLAMA_HOST",
+            "127.0.0.1:{0}".format(self.__plugin.getPreferences("OllamaLocalPort")),
+        )
+
+        return env
+
+    @pyqtSlot()
+    def __startLocalServerMonitoring(self):
+        """
+        Private slot to open a dialog for running a local 'ollama' server instance
+        and monitor its output.
+        """
+        # TODO: not implemented yet
+        from .RunOllamaServerDialog import RunOllamaServerDialog
+
+        self.__localServerDialog = RunOllamaServerDialog(
+            self.__client, self.__plugin, self
+        )
+        self.__localServerDialog.serverStarted.connect(self.__serverStarted)
+        self.__localServerDialog.serverStopped.connect(self.__serverStopped)
+        self.__localServerDialog.finished.connect(self.__serverDialogClosed)
+        self.__localServerDialog.show()
+        self.__localServerDialog.startServer()
+
+    @pyqtSlot()
+    def __startLocalServer(self):
+        """
+        Private slot to start a local 'ollama' server instance in the background.
+        """
+        # TODO: not implemented yet
+        pass
+
+    @pyqtSlot()
+    def __stopLocalServer(self):
+        """
+        Private slot to stop a running local 'ollama' server instance.
+        """
+        # TODO: not implemented yet
+        pass
+
+    @pyqtSlot()
+    def __serverStarted(self):
+        """
+        Private slot to handle the start of a local server.
+        """
+        self.__client.setMode(True)
+        self.on_reloadModelsButton_clicked()
+
+    @pyqtSlot()
+    def __serverStopped(self):
+        """
+        Private slot to handle the stopping of a local server.
+        """
+        self.__client.setMode(False)
+        self.on_reloadModelsButton_clicked()
+
+    @pyqtSlot()
+    def __serverDialogClosed(self):
+        """
+        Private slot handling the closing of the local server dialog.
+        """
+        self.__localServerDialog.deleteLater()
+        self.__localServerDialog = None

eric ide

mercurial