From 430c9f5da2f25f12b6bbcf7cb57e59b557fd9d49 Mon Sep 17 00:00:00 2001
From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com>
Date: Fri, 14 Nov 2025 12:41:05 +0900
Subject: [PATCH] [Update] UI: Add LM Studio and Ollama model components to the
Translation section.
---
.../config_page_setter/ui_config_setter.js | 56 ++++++++++++
.../setting_box/translation/Translation.jsx | 88 +++++++++++++++++++
2 files changed, 144 insertions(+)
diff --git a/src-ui/logics/configs/config_page_setter/ui_config_setter.js b/src-ui/logics/configs/config_page_setter/ui_config_setter.js
index a59b8e2b..f3790a6c 100644
--- a/src-ui/logics/configs/config_page_setter/ui_config_setter.js
+++ b/src-ui/logics/configs/config_page_setter/ui_config_setter.js
@@ -314,6 +314,62 @@ export const SETTINGS_ARRAY = [
add_endpoint_run_array: ["from_backend"],
base_endpoint_name: "selected_openai_model",
},
+ // LM Studio
+ {
+ Category: "Translation",
+ Base_Name: "LMStudioURL",
+ default_value: "",
+ ui_template_id: "input",
+ logics_template_id: "get_set",
+ base_endpoint_name: "lmstudio_url",
+ },
+ {
+ Category: "Translation",
+ Base_Name: "SelectableLMStudioModelList",
+ default_value: [],
+ ui_template_id: "list",
+ logics_template_id: "get_set",
+ add_endpoint_run_array: ["from_backend"],
+ base_endpoint_name: "selectable_lmstudio_model_list",
+ response_transform: "arrayToObject",
+ },
+ {
+ Category: "Translation",
+ Base_Name: "SelectedLMStudioModel",
+ default_value: "",
+ ui_template_id: "select",
+ logics_template_id: "get_set",
+ add_endpoint_run_array: ["from_backend"],
+ base_endpoint_name: "selected_lmstudio_model",
+ },
+ // Ollama
+ {
+ Category: "Translation",
+ Base_Name: "OllamaURL",
+ default_value: "",
+ ui_template_id: "input",
+ logics_template_id: "get_set",
+ base_endpoint_name: "ollama_url",
+ },
+ {
+ Category: "Translation",
+ Base_Name: "SelectableOllamaModelList",
+ default_value: [],
+ ui_template_id: "list",
+ logics_template_id: "get_set",
+ add_endpoint_run_array: ["from_backend"],
+ base_endpoint_name: "selectable_ollama_model_list",
+ response_transform: "arrayToObject",
+ },
+ {
+ Category: "Translation",
+ Base_Name: "SelectedOllamaModel",
+ default_value: "",
+ ui_template_id: "select",
+ logics_template_id: "get_set",
+ add_endpoint_run_array: ["from_backend"],
+ base_endpoint_name: "selected_ollama_model",
+ },
// Transcription
// Mic
diff --git a/src-ui/views/app/config_page/setting_section/setting_box/translation/Translation.jsx b/src-ui/views/app/config_page/setting_section/setting_box/translation/Translation.jsx
index b7bdf99f..7ad243ff 100644
--- a/src-ui/views/app/config_page/setting_section/setting_box/translation/Translation.jsx
+++ b/src-ui/views/app/config_page/setting_section/setting_box/translation/Translation.jsx
@@ -14,6 +14,7 @@ import {
DownloadModelsContainer,
AuthKeyContainer,
MultiDropdownMenuContainer,
+ EntryWithSaveButtonContainer,
RadioButtonContainer,
DropdownMenuContainer,
@@ -44,6 +45,11 @@ export const Translation = () => {
+
+
+
+
+
>
);
};
@@ -415,6 +421,88 @@ const OpenAIModelContainer = () => {
};
+
+const LMStudioURL_Box = () => {
+ const { t } = useI18n();
+ const { currentLMStudioURL, setLMStudioURL, deleteLMStudioURL } = useTranslation();
+
+ const { variable, onChangeFunction, saveFunction } = useSaveButtonLogic({
+ variable: currentLMStudioURL.data,
+ state: currentLMStudioURL.state,
+ setFunction: setLMStudioURL,
+ deleteFunction: deleteLMStudioURL,
+ });
+
+ return (
+ <>
+
+ >
+ );
+};
+const LMStudioModelContainer = () => {
+ const { t } = useI18n();
+ const {
+ currentSelectableLMStudioModelList,
+
+ currentSelectedLMStudioModel,
+ setSelectedLMStudioModel,
+ } = useTranslation();
+
+ if (currentSelectableLMStudioModelList.data.length === 0) return null;
+
+ const selectFunction = (selected_data) => {
+ setSelectedLMStudioModel(selected_data.selected_id);
+ };
+
+ return (
+
+ );
+};
+
+const OllamaModelContainer = () => {
+ const { t } = useI18n();
+ const {
+ currentSelectableOllamaModelList,
+
+ currentSelectedOllamaModel,
+ setSelectedOllamaModel,
+ } = useTranslation();
+
+ if (currentSelectableOllamaModelList.data.length === 0) return null;
+
+ const selectFunction = (selected_data) => {
+ setSelectedOllamaModel(selected_data.selected_id);
+ };
+
+ return (
+
+ );
+};
+
+
// Duplicate
const transformDeviceArray = (devices) => {
const name_counts = Object.values(devices).reduce((counts, device) => {