import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import Button from "@mui/material/Button"; import LoadingButton from "@mui/lab/LoadingButton"; import MenuItem from "@mui/material/MenuItem"; import FormControlLabel from "@mui/material/FormControlLabel"; import Switch from "@mui/material/Switch"; import { OPT_TRANS_ALL, OPT_TRANS_MICROSOFT, OPT_TRANS_DEEPL, OPT_TRANS_DEEPLX, OPT_TRANS_DEEPLFREE, OPT_TRANS_BAIDU, OPT_TRANS_TENCENT, OPT_TRANS_VOLCENGINE, OPT_TRANS_OPENAI, OPT_TRANS_OPENAI_2, OPT_TRANS_OPENAI_3, OPT_TRANS_GEMINI, OPT_TRANS_GEMINI_2, OPT_TRANS_CLAUDE, OPT_TRANS_CLOUDFLAREAI, OPT_TRANS_OLLAMA, OPT_TRANS_OLLAMA_2, OPT_TRANS_OLLAMA_3, OPT_TRANS_CUSTOMIZE, OPT_TRANS_CUSTOMIZE_2, OPT_TRANS_CUSTOMIZE_3, OPT_TRANS_CUSTOMIZE_4, OPT_TRANS_CUSTOMIZE_5, OPT_TRANS_NIUTRANS, URL_NIUTRANS_REG, DEFAULT_FETCH_LIMIT, DEFAULT_FETCH_INTERVAL, DEFAULT_HTTP_TIMEOUT, } from "../../config"; import { useState } from "react"; import { useI18n } from "../../hooks/I18n"; import Typography from "@mui/material/Typography"; import Accordion from "@mui/material/Accordion"; import AccordionSummary from "@mui/material/AccordionSummary"; import AccordionDetails from "@mui/material/AccordionDetails"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import Alert from "@mui/material/Alert"; import { useAlert } from "../../hooks/Alert"; import { useApi } from "../../hooks/Api"; import { apiTranslate } from "../../apis"; import Box from "@mui/material/Box"; import Link from "@mui/material/Link"; import { limitNumber, limitFloat } from "../../libs/utils"; function TestButton({ translator, api }) { const i18n = useI18n(); const alert = useAlert(); const [loading, setLoading] = useState(false); const handleApiTest = async () => { try { setLoading(true); const [text] = await apiTranslate({ translator, text: "hello world", fromLang: "en", toLang: "zh-CN", apiSetting: api, useCache: false, }); if (!text) { throw new Error("empty result"); } alert.success(i18n("test_success")); } catch (err) { // alert.error(`${i18n("test_failed")}: ${err.message}`); let msg = err.message; try { msg = JSON.stringify(JSON.parse(err.message), null, 2); } catch (err) { // skip } alert.error( <>
{i18n("test_failed")}
{msg === err.message ? (
{msg}
) : (
              {msg}
            
)} ); } finally { setLoading(false); } }; return ( {i18n("click_test")} ); } function ApiFields({ translator, api, updateApi, resetApi }) { const i18n = useI18n(); const { url = "", key = "", model = "", systemPrompt = "", userPrompt = "", customBody = "", think = false, thinkIgnore = "", fetchLimit = DEFAULT_FETCH_LIMIT, fetchInterval = DEFAULT_FETCH_INTERVAL, httpTimeout = DEFAULT_HTTP_TIMEOUT, dictNo = "", memoryNo = "", reqHook = "", resHook = "", temperature = 0, maxTokens = 256, apiName = "", isDisabled = false, } = api; const handleChange = (e) => { let { name, value } = e.target; switch (name) { case "fetchLimit": value = limitNumber(value, 1, 100); break; case "fetchInterval": value = limitNumber(value, 0, 5000); break; case "httpTimeout": value = limitNumber(value, 5000, 30000); break; case "temperature": value = limitFloat(value, 0, 2); break; case "maxTokens": value = limitNumber(value, 0, 2 ** 15); break; default: } updateApi({ [name]: value, }); }; const builtinTranslators = [ OPT_TRANS_MICROSOFT, OPT_TRANS_DEEPLFREE, OPT_TRANS_BAIDU, OPT_TRANS_TENCENT, OPT_TRANS_VOLCENGINE, ]; const mulkeysTranslators = [ OPT_TRANS_DEEPL, OPT_TRANS_OPENAI, OPT_TRANS_OPENAI_2, OPT_TRANS_OPENAI_3, OPT_TRANS_GEMINI, OPT_TRANS_GEMINI_2, OPT_TRANS_CLAUDE, OPT_TRANS_CLOUDFLAREAI, OPT_TRANS_OLLAMA, OPT_TRANS_OLLAMA_2, OPT_TRANS_OLLAMA_3, OPT_TRANS_NIUTRANS, OPT_TRANS_CUSTOMIZE, OPT_TRANS_CUSTOMIZE_2, OPT_TRANS_CUSTOMIZE_3, OPT_TRANS_CUSTOMIZE_4, OPT_TRANS_CUSTOMIZE_5, ]; const keyHelper = translator === OPT_TRANS_NIUTRANS ? ( <> {i18n("mulkeys_help")} {i18n("reg_niutrans")} ) : mulkeysTranslators.includes(translator) ? ( i18n("mulkeys_help") ) : ( "" ); return ( {!builtinTranslators.includes(translator) && ( <> )} {(translator.startsWith(OPT_TRANS_OPENAI) || translator.startsWith(OPT_TRANS_OLLAMA) || translator === OPT_TRANS_CLAUDE || translator.startsWith(OPT_TRANS_GEMINI)) && ( <> )} {translator.startsWith(OPT_TRANS_OLLAMA) && ( <> {i18n("nothink")} {i18n("think")} )} {(translator.startsWith(OPT_TRANS_OPENAI) || translator === OPT_TRANS_CLAUDE || translator === OPT_TRANS_GEMINI || translator === OPT_TRANS_GEMINI_2) && ( <> )} {translator === OPT_TRANS_NIUTRANS && ( <> )} {translator.startsWith(OPT_TRANS_CUSTOMIZE) && ( <> )} { updateApi({ isDisabled: !isDisabled }); }} /> } label={i18n("is_disabled")} /> {translator.startsWith(OPT_TRANS_CUSTOMIZE) && (
{i18n("custom_api_help")}
)}
); } function ApiAccordion({ translator }) { const [expanded, setExpanded] = useState(false); const { api, updateApi, resetApi } = useApi(translator); const handleChange = (e) => { setExpanded((pre) => !pre); }; return ( }> {api.apiName ? `${translator} (${api.apiName})` : translator} {expanded && ( )} ); } export default function Apis() { const i18n = useI18n(); return ( {i18n("about_api")} {OPT_TRANS_ALL.map((translator) => ( ))} ); }