/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import React, { useEffect, useState } from 'react'; import { Card, Spin, Tabs } from '@douyinfe/semi-ui'; import { useTranslation } from 'react-i18next'; import GroupRatioSettings from '../../pages/Setting/Ratio/GroupRatioSettings'; import ModelRatioSettings from '../../pages/Setting/Ratio/ModelRatioSettings'; import ModelSettingsVisualEditor from '../../pages/Setting/Ratio/ModelSettingsVisualEditor'; import ModelRatioNotSetEditor from '../../pages/Setting/Ratio/ModelRationNotSetEditor'; import UpstreamRatioSync from '../../pages/Setting/Ratio/UpstreamRatioSync'; import { API, showError, toBoolean } from '../../helpers'; const RatioSetting = () => { const { t } = useTranslation(); let [inputs, setInputs] = useState({ ModelPrice: '', ModelRatio: '', CacheRatio: '', CompletionRatio: '', GroupRatio: '', GroupGroupRatio: '', ImageRatio: '', AudioRatio: '', AudioCompletionRatio: '', AutoGroups: '', DefaultUseAutoGroup: false, ExposeRatioEnabled: false, UserUsableGroups: '', }); const [loading, setLoading] = useState(false); const getOptions = async () => { const res = await API.get('/api/option/'); const { success, message, data } = res.data; if (success) { let newInputs = {}; data.forEach((item) => { if ( item.key === 'ModelRatio' || item.key === 'GroupRatio' || item.key === 'GroupGroupRatio' || item.key === 'AutoGroups' || item.key === 'UserUsableGroups' || item.key === 'CompletionRatio' || item.key === 'ModelPrice' || item.key === 'CacheRatio' || item.key === 'ImageRatio' || item.key === 'AudioRatio' || item.key === 'AudioCompletionRatio' ) { try { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } catch (e) { // 如果后端返回的不是合法 JSON,直接展示 } } if (['DefaultUseAutoGroup', 'ExposeRatioEnabled'].includes(item.key)) { newInputs[item.key] = toBoolean(item.value); } else { newInputs[item.key] = item.value; } }); setInputs(newInputs); } else { showError(message); } }; const onRefresh = async () => { try { setLoading(true); await getOptions(); } catch (error) { showError('刷新失败'); } finally { setLoading(false); } }; useEffect(() => { onRefresh(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( {/* 模型倍率设置以及可视化编辑器 */} ); }; export default RatioSetting;