mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-04-17 20:37:27 +00:00
Summary
-------
1. Introduced a reusable `toBoolean` utility (`web/src/helpers/boolean.js`) that converts
strings (`'true'/'false'`, `'1'/'0'`), numbers, and native booleans to a proper boolean.
2. Re-exported `toBoolean` via `web/src/helpers/index.js` for simple one-line imports.
Refactors
---------
• Systematically replaced all legacy `item.value === 'true'` checks with `toBoolean(item.value)` in
the following components:
– `SystemSetting.js`
– `OperationSetting.js`
– `PaymentSetting.js`
– `RatioSetting.js`
– `RateLimitSetting.js`
– `ModelSetting.js`
– `DrawingSetting.js`
– `DashboardSetting.js`
– `ChatsSetting.js`
• Unified import statements to
`import { …, toBoolean } from '../../helpers';`
removing redundant `../../helpers/boolean` paths.
Why
---
SQLite sometimes returns `1/0` or boolean literals instead of the string `'true'/'false'`, causing
checkbox states to reset on page reload. The new utility guarantees consistent boolean parsing,
fixing the issue across all environments (SQLite, MySQL, etc.) while improving code clarity.
96 lines
2.9 KiB
JavaScript
96 lines
2.9 KiB
JavaScript
import React, { useEffect, useState } from 'react';
|
|
import { Card, Spin, Tabs } from '@douyinfe/semi-ui';
|
|
|
|
import { API, showError, showSuccess, toBoolean } from '../../helpers';
|
|
import { useTranslation } from 'react-i18next';
|
|
import SettingGeminiModel from '../../pages/Setting/Model/SettingGeminiModel.js';
|
|
import SettingClaudeModel from '../../pages/Setting/Model/SettingClaudeModel.js';
|
|
import SettingGlobalModel from '../../pages/Setting/Model/SettingGlobalModel.js';
|
|
|
|
const ModelSetting = () => {
|
|
const { t } = useTranslation();
|
|
let [inputs, setInputs] = useState({
|
|
'gemini.safety_settings': '',
|
|
'gemini.version_settings': '',
|
|
'gemini.supported_imagine_models': '',
|
|
'claude.model_headers_settings': '',
|
|
'claude.thinking_adapter_enabled': true,
|
|
'claude.default_max_tokens': '',
|
|
'claude.thinking_adapter_budget_tokens_percentage': 0.8,
|
|
'global.pass_through_request_enabled': false,
|
|
'general_setting.ping_interval_enabled': false,
|
|
'general_setting.ping_interval_seconds': 60,
|
|
'gemini.thinking_adapter_enabled': false,
|
|
'gemini.thinking_adapter_budget_tokens_percentage': 0.6,
|
|
});
|
|
|
|
let [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 === 'gemini.safety_settings' ||
|
|
item.key === 'gemini.version_settings' ||
|
|
item.key === 'claude.model_headers_settings' ||
|
|
item.key === 'claude.default_max_tokens' ||
|
|
item.key === 'gemini.supported_imagine_models'
|
|
) {
|
|
if (item.value !== '') {
|
|
item.value = JSON.stringify(JSON.parse(item.value), null, 2);
|
|
}
|
|
}
|
|
if (item.key.endsWith('Enabled') || item.key.endsWith('enabled')) {
|
|
newInputs[item.key] = toBoolean(item.value);
|
|
} else {
|
|
newInputs[item.key] = item.value;
|
|
}
|
|
});
|
|
|
|
setInputs(newInputs);
|
|
} else {
|
|
showError(message);
|
|
}
|
|
};
|
|
async function onRefresh() {
|
|
try {
|
|
setLoading(true);
|
|
await getOptions();
|
|
// showSuccess('刷新成功');
|
|
} catch (error) {
|
|
showError('刷新失败');
|
|
console.error(error);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}
|
|
|
|
useEffect(() => {
|
|
onRefresh();
|
|
}, []);
|
|
|
|
return (
|
|
<>
|
|
<Spin spinning={loading} size='large'>
|
|
{/* OpenAI */}
|
|
<Card style={{ marginTop: '10px' }}>
|
|
<SettingGlobalModel options={inputs} refresh={onRefresh} />
|
|
</Card>
|
|
{/* Gemini */}
|
|
<Card style={{ marginTop: '10px' }}>
|
|
<SettingGeminiModel options={inputs} refresh={onRefresh} />
|
|
</Card>
|
|
{/* Claude */}
|
|
<Card style={{ marginTop: '10px' }}>
|
|
<SettingClaudeModel options={inputs} refresh={onRefresh} />
|
|
</Card>
|
|
</Spin>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default ModelSetting;
|