OllamaInterface/OllamaClient.py

changeset 9
c471738b75b3
parent 8
3118d16e526e
child 11
3641ea6b55d5
--- a/OllamaInterface/OllamaClient.py	Sun Aug 25 19:44:24 2024 +0200
+++ b/OllamaInterface/OllamaClient.py	Mon Aug 26 16:01:11 2024 +0200
@@ -206,12 +206,14 @@
 
         @param model name of the model
         @type str
+        @return flag indicating success
+        @rtype bool
         """
-        # TODO: not implemented yet
         ollamaRequest = {
-            "name": model,
+            "model": model,
         }
-        self.__sendRequest("delete", data=ollamaRequest)
+        _, status = self.__sendSyncRequest("delete", data=ollamaRequest, delete=True)
+        return status == 200  # HTTP status 200 OK
 
     def list(self):
         """
@@ -232,15 +234,18 @@
             for model in response["models"]:
                 name = model["name"]
                 if name:
-                    models.append(name.replace(":latest", ""))
+                    models.append(name)
         self.modelsList.emit(models)
 
     def listDetails(self):
         """
         Public method to request a list of models available locally from the 'ollama'
         server with some model details.
+
+        @return list of dictionaries containing the available models and related data
+        @rtype list[dict[str, Any]]
         """
-        response = self.__sendSyncRequest("tags")
+        response, _ = self.__sendSyncRequest("tags")
 
         models = []
         if response is not None:
@@ -264,8 +269,11 @@
     def listRunning(self):
         """
         Public method to request a list of running models from the 'ollama' server.
+
+        @return list of dictionaries containing the running models and related data
+        @rtype list[dict[str, Any]]
         """
-        response = self.__sendSyncRequest("ps")
+        response, _ = self.__sendSyncRequest("ps")
 
         models = []
         if response is not None:
@@ -325,7 +333,7 @@
         """
         return self.__state
 
-    def __getServerReply(self, endpoint, data=None):
+    def __getServerReply(self, endpoint, data=None, delete=False):
         """
         Private method to send a request to the 'ollama' server and return a reply
         object.
@@ -335,10 +343,12 @@
         @param data dictionary containing the data to send to the server
             (defaults to None)
         @type dict (optional)
+        @param delete flag indicating to send a delete request (defaults to False)
+        @type bool (optional)
         @return 'ollama' server reply
         @rtype QNetworkReply
         """
-        ollamaUrl =  QUrl(
+        ollamaUrl = QUrl(
             "{0}://{1}:{2}/api/{3}".format(
                 self.__plugin.getPreferences("OllamaScheme"),
                 (
@@ -360,7 +370,12 @@
                 QNetworkRequest.KnownHeaders.ContentTypeHeader, "application/json"
             )
             jsonData = json.dumps(data).encode("utf-8")
-            reply = self.__networkManager.post(request, jsonData)
+            if delete:
+                reply = self.__networkManager.sendCustomRequest(
+                    request, b"DELETE", jsonData
+                )
+            else:
+                reply = self.__networkManager.post(request, jsonData)
         else:
             reply = self.__networkManager.get(request)
         reply.errorOccurred.connect(lambda error: self.__errorOccurred(error, reply))
@@ -381,35 +396,8 @@
         """
         self.__state = OllamaClientState.Requesting
 
-        ##ollamaUrl = QUrl(
-            ##"{0}://{1}:{2}/api/{3}".format(
-                ##self.__plugin.getPreferences("OllamaScheme"),
-                ##(
-                    ##"127.0.0.1"
-                    ##if self.__localServer
-                    ##else self.__plugin.getPreferences("OllamaHost")
-                ##),
-                ##(
-                    ##self.__plugin.getPreferences("OllamaLocalPort")
-                    ##if self.__localServer
-                    ##else self.__plugin.getPreferences("OllamaPort")
-                ##),
-                ##endpoint,
-            ##)
-        ##)
-        ##request = QNetworkRequest(ollamaUrl)
-        ##if data is not None:
-            ##request.setHeader(
-                ##QNetworkRequest.KnownHeaders.ContentTypeHeader, "application/json"
-            ##)
-            ##jsonData = json.dumps(data).encode("utf-8")
-            ##reply = self.__networkManager.post(request, jsonData)
-        ##else:
-            ##reply = self.__networkManager.get(request)
-##
         reply = self.__getServerReply(endpoint=endpoint, data=data)
         reply.finished.connect(lambda: self.__replyFinished(reply))
-        ##reply.errorOccurred.connect(lambda error: self.__errorOccurred(error, reply))
         reply.readyRead.connect(lambda: self.__processData(reply, processResponse))
         self.__replies.append(reply)
 
@@ -462,7 +450,7 @@
                 if data and processResponse:
                     processResponse(data)
 
-    def __sendSyncRequest(self, endpoint, data=None):
+    def __sendSyncRequest(self, endpoint, data=None, delete=False):
         """
         Private method to send a request to the 'ollama' server and handle its
         responses.
@@ -472,10 +460,15 @@
         @param data dictionary containing the data to send to the server
             (defaults to None)
         @type dict (optional)
+        @param delete flag indicating to send a delete request (defaults to False)
+        @type bool (optional)
+        @return tuple containing the data sent by the 'ollama' server and the HTTP
+            status code
+        @rtype tuple of (Any, int)
         """
         self.__state = OllamaClientState.Requesting
 
-        reply = self.__getServerReply(endpoint=endpoint, data=data)
+        reply = self.__getServerReply(endpoint=endpoint, data=data, delete=delete)
         while not reply.isFinished():
             QCoreApplication.processEvents()
             QThread.msleep(100)
@@ -484,13 +477,15 @@
 
         self.__state = OllamaClientState.Finished
 
+        statusCode = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute)
+
         if reply.error() == QNetworkReply.NetworkError.NoError:
             buffer = bytes(reply.readAll())
             with contextlib.suppress(json.JSONDecodeError):
                 data = json.loads(buffer)
-                return data
+                return data, statusCode
 
-        return None
+        return None, statusCode
 
     def heartbeat(self):
         """

eric ide

mercurial