diff --git a/src-python/controller.py b/src-python/controller.py index 2f3aa530..714b6a85 100644 --- a/src-python/controller.py +++ b/src-python/controller.py @@ -1900,6 +1900,9 @@ class Controller: } return response + def getTranslatorLMStudioConnection(self, *args, **kwargs) -> dict: + return {"status":200, "result":model.getTranslatorLMStudioConnected()} + def checkTranslatorLMStudioConnection(self, *args, **kwargs) -> dict: printLog("Check Translator LMStudio Connection") translator_name = "LMStudio" @@ -1937,6 +1940,10 @@ class Controller: } return response + def getConnectedLMStudio(self, *args, **kwargs) -> dict: + is_connected = model.getTranslatorLMStudioConnectedStatus() + return {"status":200, "result": is_connected} + def getTranslatorLMStudioURL(self, *args, **kwargs) -> dict: return {"status":200, "result":config.LMSTUDIO_URL} @@ -2015,6 +2022,9 @@ class Controller: } return response + def getTranslatorOllamaConnection(self, *args, **kwargs) -> dict: + return {"status":200, "result":model.getTranslatorOllamaConnected()} + def checkTranslatorOllamaConnection(self, *args, **kwargs) -> dict: printLog("Check Translator Ollama Connection") translator_name = "Ollama" diff --git a/src-python/mainloop.py b/src-python/mainloop.py index 58a760a5..20b4bf2f 100644 --- a/src-python/mainloop.py +++ b/src-python/mainloop.py @@ -207,6 +207,7 @@ mapping = { "/set/data/openai_auth_key": {"status": True, "variable":controller.setOpenAIAuthKey}, "/delete/data/openai_auth_key": {"status": True, "variable":controller.delOpenAIAuthKey}, + "/get/data/connected_lmstudio": {"status": True, "variable":controller.getTranslatorLMStudioConnection}, "/run/lmstudio_connection": {"status": True, "variable":controller.checkTranslatorLMStudioConnection}, "/get/data/selectable_lmstudio_model_list": {"status": True, "variable":controller.getTranslatorLStudioModelList}, "/get/data/selected_lmstudio_model": {"status": True, "variable":controller.getTranslatorLMStudioModel}, @@ -214,6 +215,7 @@ mapping = { "/get/data/lmstudio_url": {"status": True, "variable":controller.getTranslatorLMStudioURL}, "/set/data/lmstudio_url": {"status": True, "variable":controller.setTranslatorLMStudioURL}, + "/get/data/connected_ollama": {"status": True, "variable":controller.getTranslatorOllamaConnection}, "/run/ollama_connection": {"status": True, "variable":controller.checkTranslatorOllamaConnection}, "/get/data/selectable_ollama_model_list": {"status": True, "variable":controller.getTranslatorOllamaModelList}, "/get/data/selected_ollama_model": {"status": True, "variable":controller.getTranslatorOllamaModel}, diff --git a/src-python/model.py b/src-python/model.py index 58f947dc..0283d7d7 100644 --- a/src-python/model.py +++ b/src-python/model.py @@ -249,6 +249,10 @@ class Model: self.ensure_initialized() self.translator.updateOpenAIClient() + def getTranslatorLMStudioConnected(self) -> bool: + self.ensure_initialized() + return self.translator.getLMStudioConnected() + def authenticationTranslatorLMStudio(self, base_url: str) -> bool: result = self.translator.setLMStudioClientURL(base_url=base_url, root_path=config.PATH_LOCAL) return result @@ -265,6 +269,10 @@ class Model: self.ensure_initialized() self.translator.updateLMStudioClient() + def getTranslatorOllamaConnected(self) -> bool: + self.ensure_initialized() + return self.translator.getOllamaConnected() + def authenticationTranslatorOllama(self) -> bool: result = self.translator.checkOllamaClient(root_path=config.PATH_LOCAL) return result diff --git a/src-python/models/translation/translation_lmstudio.py b/src-python/models/translation/translation_lmstudio.py index 7751dc16..aa8509e8 100644 --- a/src-python/models/translation/translation_lmstudio.py +++ b/src-python/models/translation/translation_lmstudio.py @@ -1,6 +1,6 @@ -from openai import OpenAI from langchain_openai import ChatOpenAI from pydantic import SecretStr +import requests try: from .translation_languages import translation_lang @@ -8,33 +8,35 @@ try: except Exception: import sys from os import path as os_path - sys.path.append(os_path.dirname(os_path.dirname(os_path.dirname(os_path.abspath(__file__))))) - from translation_languages import translation_lang + sys.path.append(os_path.dirname(os_path.abspath(__file__))) + from translation_languages import translation_lang, loadTranslationLanguages from translation_utils import loadPromptConfig + loadTranslationLanguages(path=".", force=True) -def _authentication_check(api_key: str, base_url: str | None = None) -> bool: +def _authentication_check(base_url: str | None = None) -> bool: """Check if the provided API key is valid by attempting to list models. """ try: - client = OpenAI(api_key=api_key, base_url=base_url) - client.models.list() - return True + response = requests.get(f"{base_url}/models", timeout=0.2) + if response.status_code == 200: + return True + else: + return False except Exception: return False -def _get_available_text_models(api_key: str, base_url: str | None = None) -> list[str]: +def _get_available_text_models(base_url: str | None = None) -> list[str]: """Extract the list of available text models from the LM Studio. """ try: - client = OpenAI(api_key=api_key, base_url=base_url) - res = client.models.list() - models = res.data + response = requests.get(f"{base_url}/models", timeout=0.2) + models = response.json()["data"] except Exception: models = [] allowed_models = [] for model in models: - allowed_models.append(model.id) + allowed_models.append(model["id"]) allowed_models.sort() return allowed_models @@ -58,13 +60,13 @@ class LMStudioClient: return self.base_url def setBaseURL(self, base_url: str | None) -> None: - result = _authentication_check(api_key=self.api_key, base_url=base_url) + result = _authentication_check(base_url=base_url) if result: self.base_url = base_url return result def getModelList(self) -> list[str]: - return _get_available_text_models(api_key=self.api_key, base_url=self.base_url) if self.base_url else [] + return _get_available_text_models(base_url=self.base_url) if self.base_url else [] def getModel(self) -> str: return self.model @@ -108,7 +110,7 @@ class LMStudioClient: return content.strip() if __name__ == "__main__": - client = LMStudioClient(base_url="http://192.168.68.110:1234/v1") + client = LMStudioClient(base_url="http://127.0.0.1:1234/v1") models = client.getModelList() if models: print("Available models:", models) diff --git a/src-python/models/translation/translation_ollama.py b/src-python/models/translation/translation_ollama.py index 4152c953..ae4cc860 100644 --- a/src-python/models/translation/translation_ollama.py +++ b/src-python/models/translation/translation_ollama.py @@ -7,15 +7,16 @@ try: except Exception: import sys from os import path as os_path - sys.path.append(os_path.dirname(os_path.dirname(os_path.dirname(os_path.abspath(__file__))))) - from translation_languages import translation_lang + sys.path.append(os_path.dirname(os_path.abspath(__file__))) + from translation_languages import translation_lang, loadTranslationLanguages from translation_utils import loadPromptConfig + loadTranslationLanguages(path=".", force=True) def _authentication_check(base_url: str | None = None) -> bool: """Check authentication for Ollama API. """ try: - response = requests.get(f"{base_url}") + response = requests.get(f"{base_url}", timeout=0.2) if response.status_code == 200: return True else: diff --git a/src-python/models/translation/translation_translator.py b/src-python/models/translation/translation_translator.py index 249a09f1..4023bcc4 100644 --- a/src-python/models/translation/translation_translator.py +++ b/src-python/models/translation/translation_translator.py @@ -176,6 +176,16 @@ class Translator: """Update the OpenAI client (fetch available models).""" self.openai_client.updateClient() + def getLMStudioConnected(self) -> bool: + """Get LM Studio connection status. + + Returns True if connected, False otherwise. + """ + if self.lmstudio_client is None: + return False + else: + return True + def setLMStudioClientURL(self, base_url: str | None = None, root_path: str = None) -> bool: """Authenticate LM Studio with the provided base URL. @@ -207,6 +217,16 @@ class Translator: """Update the LM Studio client (fetch available models).""" self.lmstudio_client.updateClient() + def getOllamaConnected(self) -> bool: + """Get Ollama connection status. + + Returns True if connected, False otherwise. + """ + if self.ollama_client is None: + return False + else: + return True + def checkOllamaClient(self, root_path: str = None) -> bool: """Check if Ollama client is available.