--- 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): """