diff -r d8064fb63eac -r eb1dec15b2f0 OllamaInterface/OllamaWidget.py --- 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