From 83e72b37cc621162835fffdd69ba160c011bf421 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Mon, 20 Oct 2025 00:38:38 +0900 Subject: [PATCH] =?UTF-8?q?LMStudio=20=E6=8E=A5=E7=B6=9A=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=81=A8=E3=83=A2=E3=83=87=E3=83=AB=E9=81=B8?= =?UTF-8?q?=E6=8A=9E=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0=E3=83=BB?= =?UTF-8?q?=E5=BC=B7=E5=8C=96=E3=80=81mainloop=20=E3=81=AB=E3=82=A8?= =?UTF-8?q?=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=80=81LMStudio/Ollama=20=E3=81=AE=E3=83=A2=E3=83=87?= =?UTF-8?q?=E3=83=AB=E5=8F=96=E5=BE=97=E3=82=92=E4=BE=8B=E5=A4=96=E8=80=90?= =?UTF-8?q?=E6=80=A7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Controller に checkTranslatorLMStudioConnection を追加し、接続成功時に SELECTABLE_TRANSLATION_ENGINE_STATUS や SELECTABLE_LMSTUDIO_MODEL_LIST を更新、選択モデルのフォールバック設定・クライアント更新・UI 更新呼び出しを行うよう実装 - setTranslatorLMStudioURL を接続成功時にモデルリスト/ステータス更新や選択モデルのフォールバック処理を行うよう拡張 - checkTranslatorOllamaConnection 成功時にも SELECTABLE_TRANSLATION_ENGINE_STATUS/モデルリスト更新、選択モデルフォールバック、クライアント更新、UI 更新呼び出しを追加 - mainloop に /get/data/lmstudio_connection エンドポイントを追加して LMStudio 接続チェックを公開 - translation_lmstudio.py と translation_ollama.py のモデル取得処理を try/except で保護し、例外時は空リストを返すよう修正(接続失敗やレスポンス異常に対する耐性向上) --- src-python/controller.py | 52 +++++++++++++++++++ src-python/mainloop.py | 1 + .../translation/translation_lmstudio.py | 12 +++-- .../models/translation/translation_ollama.py | 7 ++- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src-python/controller.py b/src-python/controller.py index 136f807c..f8ce770c 100644 --- a/src-python/controller.py +++ b/src-python/controller.py @@ -1877,16 +1877,59 @@ class Controller: } return response + def checkTranslatorLMStudioConnection(self, *args, **kwargs) -> dict: + printLog("Check Translator LMStudio Connection") + translator_name = "LMStudio" + try: + result = model.authenticationTranslatorLMStudio() + if result is True: + config.SELECTABLE_TRANSLATION_ENGINE_STATUS[translator_name] = True + config.SELECTABLE_LMSTUDIO_MODEL_LIST = model.getTranslatorLMStudioModelList() + self.run(200, self.run_mapping["selectable_lmstudio_model_list"], config.SELECTABLE_LMSTUDIO_MODEL_LIST) + if config.SELECTED_LMSTUDIO_MODEL not in config.SELECTABLE_LMSTUDIO_MODEL_LIST: + config.SELECTED_LMSTUDIO_MODEL = config.SELECTABLE_LMSTUDIO_MODEL_LIST[0] + self.run(200, self.run_mapping["selected_lmstudio_model"], config.SELECTED_LMSTUDIO_MODEL) + model.updateTranslatorLMStudioClient() + self.updateTranslationEngineAndEngineList() + response = {"status":200, "result":True} + else: + response = { + "status":400, + "result":{ + "message":"Cannot connect to LMStudio server", + "data": False + } + } + except Exception as e: + errorLogging() + response = { + "status":400, + "result":{ + "message":f"Error {e}", + "data": False + } + } + return response + def getTranslatorLMStudioURL(self, *args, **kwargs) -> dict: return {"status":200, "result":config.LMSTUDIO_URL} def setTranslatorLMStudioURL(self, data, *args, **kwargs) -> dict: printLog("Set Translator LMStudio URL", data) + translator_name = "LMStudio" try: data = str(data) result = model.authenticationTranslatorLMStudio(base_url=data) if result is True: config.LMSTUDIO_URL = data + config.SELECTABLE_TRANSLATION_ENGINE_STATUS[translator_name] = True + config.SELECTABLE_LMSTUDIO_MODEL_LIST = model.getTranslatorLMStudioModelList() + self.run(200, self.run_mapping["selectable_lmstudio_model_list"], config.SELECTABLE_LMSTUDIO_MODEL_LIST) + if config.SELECTED_LMSTUDIO_MODEL not in config.SELECTABLE_LMSTUDIO_MODEL_LIST: + config.SELECTED_LMSTUDIO_MODEL = config.SELECTABLE_LMSTUDIO_MODEL_LIST[0] + self.run(200, self.run_mapping["selected_lmstudio_model"], config.SELECTED_LMSTUDIO_MODEL) + model.updateTranslatorLMStudioClient() + self.updateTranslationEngineAndEngineList() response = {"status":200, "result":config.LMSTUDIO_URL} else: response = { @@ -1943,9 +1986,18 @@ class Controller: def checkTranslatorOllamaConnection(self, *args, **kwargs) -> dict: printLog("Check Translator Ollama Connection") + translator_name = "Ollama" try: result = model.authenticationTranslatorOllama() if result is True: + config.SELECTABLE_TRANSLATION_ENGINE_STATUS[translator_name] = True + config.SELECTABLE_OLLAMA_MODEL_LIST = model.getTranslatorOllamaModelList() + self.run(200, self.run_mapping["selectable_ollama_model_list"], config.SELECTABLE_OLLAMA_MODEL_LIST) + if config.SELECTED_OLLAMA_MODEL not in config.SELECTABLE_OLLAMA_MODEL_LIST: + config.SELECTED_OLLAMA_MODEL = config.SELECTABLE_OLLAMA_MODEL_LIST[0] + self.run(200, self.run_mapping["selected_ollama_model"], config.SELECTED_OLLAMA_MODEL) + model.updateTranslatorOllamaClient() + self.updateTranslationEngineAndEngineList() response = {"status":200, "result":True} else: response = { diff --git a/src-python/mainloop.py b/src-python/mainloop.py index 4e77104b..21e194bc 100644 --- a/src-python/mainloop.py +++ b/src-python/mainloop.py @@ -206,6 +206,7 @@ mapping = { "/set/data/openai_auth_key": {"status": True, "variable":controller.setOpenAIAuthKey}, "/delete/data/openai_auth_key": {"status": True, "variable":controller.delOpenAIAuthKey}, + "/get/data/lmstudio_connection": {"status": True, "variable":controller.checkTranslatorLMStudioConnection}, "/get/data/lmstudio_model_list": {"status": True, "variable":controller.getTranslatorLStudioModelList}, "/get/data/lmstudio_model": {"status": True, "variable":controller.getTranslatorLMStudioModel}, "/set/data/lmstudio_model": {"status": True, "variable":controller.setTranslatorLMStudioModel}, diff --git a/src-python/models/translation/translation_lmstudio.py b/src-python/models/translation/translation_lmstudio.py index 34319075..7751dc16 100644 --- a/src-python/models/translation/translation_lmstudio.py +++ b/src-python/models/translation/translation_lmstudio.py @@ -25,11 +25,15 @@ def _authentication_check(api_key: str, base_url: str | None = None) -> bool: def _get_available_text_models(api_key: str, base_url: str | None = None) -> list[str]: """Extract the list of available text models from the LM Studio. """ - client = OpenAI(api_key=api_key, base_url=base_url) - res = client.models.list() - allowed_models = [] + try: + client = OpenAI(api_key=api_key, base_url=base_url) + res = client.models.list() + models = res.data + except Exception: + models = [] - for model in res.data: + allowed_models = [] + for model in models: allowed_models.append(model.id) allowed_models.sort() diff --git a/src-python/models/translation/translation_ollama.py b/src-python/models/translation/translation_ollama.py index 2d56aaee..6dd1f2fb 100644 --- a/src-python/models/translation/translation_ollama.py +++ b/src-python/models/translation/translation_ollama.py @@ -26,8 +26,11 @@ def _authentication_check(base_url: str | None = None) -> bool: def _get_available_text_models(base_url: str | None = None) -> list[str]: """Extract available text models from Ollama. """ - response = requests.get(f"{base_url}/api/tags") - models = response.json()["models"] + try: + response = requests.get(f"{base_url}/api/tags") + models = response.json()["models"] + except Exception: + models = [] allowed_models = [] for model in models: