fix: fixed the issue that ModelSetting could not be saved #614 (#617)

### What problem does this PR solve?

fix: fixed the issue that ModelSetting  could not be saved #614

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
balibabu 2024-04-30 11:27:10 +08:00 committed by GitHub
parent 674b3aeafd
commit 7059ec2298
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 179 additions and 117 deletions

View File

@ -21,11 +21,11 @@ export interface LlmSetting {
} }
export interface Variable { export interface Variable {
frequency_penalty: number; frequency_penalty?: number;
max_tokens: number; max_tokens?: number;
presence_penalty: number; presence_penalty?: number;
temperature: number; temperature?: number;
top_p: number; top_p?: number;
} }
export interface IDialog { export interface IDialog {
@ -38,7 +38,7 @@ export interface IDialog {
kb_names: string[]; kb_names: string[];
language: string; language: string;
llm_id: string; llm_id: string;
llm_setting: LlmSetting; llm_setting: Variable;
llm_setting_type: string; llm_setting_type: string;
name: string; name: string;
prompt_config: PromptConfig; prompt_config: PromptConfig;

View File

@ -181,6 +181,9 @@ const ChatConfigurationModal = ({
key={key} key={key}
show={key === value} show={key === value}
form={form} form={form}
{...(key === ConfigurationSegmented.ModelSetting
? { initialLlmSetting: initialDialog.llm_setting, visible }
: {})}
{...(key === ConfigurationSegmented.PromptEngine {...(key === ConfigurationSegmented.PromptEngine
? { ref: promptEngineRef } ? { ref: promptEngineRef }
: {})} : {})}

View File

@ -11,10 +11,19 @@ import { ISegmentedContentProps } from '../interface';
import { useTranslate } from '@/hooks/commonHooks'; import { useTranslate } from '@/hooks/commonHooks';
import { useFetchLlmList, useSelectLlmOptions } from '@/hooks/llmHooks'; import { useFetchLlmList, useSelectLlmOptions } from '@/hooks/llmHooks';
import { Variable } from '@/interfaces/database/chat';
import { variableEnabledFieldMap } from '../constants'; import { variableEnabledFieldMap } from '../constants';
import styles from './index.less'; import styles from './index.less';
const ModelSetting = ({ show, form }: ISegmentedContentProps) => { const ModelSetting = ({
show,
form,
initialLlmSetting,
visible,
}: ISegmentedContentProps & {
initialLlmSetting?: Variable;
visible?: boolean;
}) => {
const { t } = useTranslate('chat'); const { t } = useTranslate('chat');
const parameterOptions = Object.values(ModelVariableType).map((x) => ({ const parameterOptions = Object.values(ModelVariableType).map((x) => ({
label: t(camelCase(x)), label: t(camelCase(x)),
@ -29,14 +38,23 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
}; };
useEffect(() => { useEffect(() => {
const values = Object.keys(variableEnabledFieldMap).reduce< if (visible) {
Record<string, boolean> const values = Object.keys(variableEnabledFieldMap).reduce<
>((pre, field) => { Record<string, boolean>
pre[field] = true; >((pre, field) => {
return pre; pre[field] =
}, {}); initialLlmSetting === undefined
form.setFieldsValue(values); ? true
}, [form]); : !!initialLlmSetting[
variableEnabledFieldMap[
field as keyof typeof variableEnabledFieldMap
] as keyof Variable
];
return pre;
}, {});
form.setFieldsValue(values);
}
}, [form, initialLlmSetting, visible]);
useFetchLlmList(LlmModelType.Chat); useFetchLlmList(LlmModelType.Chat);
@ -60,7 +78,6 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
name="parameters" name="parameters"
tooltip={t('freedomTip')} tooltip={t('freedomTip')}
initialValue={ModelVariableType.Precise} initialValue={ModelVariableType.Precise}
// rules={[{ required: true, message: 'Please input!' }]}
> >
<Select<ModelVariableType> <Select<ModelVariableType>
options={parameterOptions} options={parameterOptions}
@ -76,26 +93,33 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
> >
<Switch size="small" /> <Switch size="small" />
</Form.Item> </Form.Item>
<Flex flex={1}> <Form.Item noStyle dependencies={['temperatureEnabled']}>
<Form.Item {({ getFieldValue }) => {
name={['llm_setting', 'temperature']} const disabled = !getFieldValue('temperatureEnabled');
noStyle return (
rules={[{ required: true, message: t('temperatureMessage') }]} <>
> <Flex flex={1}>
<Slider className={styles.variableSlider} max={1} step={0.01} /> <Form.Item name={['llm_setting', 'temperature']} noStyle>
</Form.Item> <Slider
</Flex> className={styles.variableSlider}
<Form.Item max={1}
name={['llm_setting', 'temperature']} step={0.01}
noStyle disabled={disabled}
rules={[{ required: true, message: t('temperatureMessage') }]} />
> </Form.Item>
<InputNumber </Flex>
className={styles.sliderInputNumber} <Form.Item name={['llm_setting', 'temperature']} noStyle>
max={1} <InputNumber
min={0} className={styles.sliderInputNumber}
step={0.01} max={1}
/> min={0}
step={0.01}
disabled={disabled}
/>
</Form.Item>
</>
);
}}
</Form.Item> </Form.Item>
</Flex> </Flex>
</Form.Item> </Form.Item>
@ -104,26 +128,33 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
<Form.Item name={'topPEnabled'} valuePropName="checked" noStyle> <Form.Item name={'topPEnabled'} valuePropName="checked" noStyle>
<Switch size="small" /> <Switch size="small" />
</Form.Item> </Form.Item>
<Flex flex={1}> <Form.Item noStyle dependencies={['topPEnabled']}>
<Form.Item {({ getFieldValue }) => {
name={['llm_setting', 'top_p']} const disabled = !getFieldValue('topPEnabled');
noStyle return (
rules={[{ required: true, message: t('topPMessage') }]} <>
> <Flex flex={1}>
<Slider className={styles.variableSlider} max={1} step={0.01} /> <Form.Item name={['llm_setting', 'top_p']} noStyle>
</Form.Item> <Slider
</Flex> className={styles.variableSlider}
<Form.Item max={1}
name={['llm_setting', 'top_p']} step={0.01}
noStyle disabled={disabled}
rules={[{ required: true, message: t('topPMessage') }]} />
> </Form.Item>
<InputNumber </Flex>
className={styles.sliderInputNumber} <Form.Item name={['llm_setting', 'top_p']} noStyle>
max={1} <InputNumber
min={0} className={styles.sliderInputNumber}
step={0.01} max={1}
/> min={0}
step={0.01}
disabled={disabled}
/>
</Form.Item>
</>
);
}}
</Form.Item> </Form.Item>
</Flex> </Flex>
</Form.Item> </Form.Item>
@ -136,26 +167,36 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
> >
<Switch size="small" /> <Switch size="small" />
</Form.Item> </Form.Item>
<Flex flex={1}> <Form.Item noStyle dependencies={['presencePenaltyEnabled']}>
<Form.Item {({ getFieldValue }) => {
name={['llm_setting', 'presence_penalty']} const disabled = !getFieldValue('presencePenaltyEnabled');
noStyle return (
rules={[{ required: true, message: t('presencePenaltyMessage') }]} <>
> <Flex flex={1}>
<Slider className={styles.variableSlider} max={1} step={0.01} /> <Form.Item
</Form.Item> name={['llm_setting', 'presence_penalty']}
</Flex> noStyle
<Form.Item >
name={['llm_setting', 'presence_penalty']} <Slider
noStyle className={styles.variableSlider}
rules={[{ required: true, message: t('presencePenaltyMessage') }]} max={1}
> step={0.01}
<InputNumber disabled={disabled}
className={styles.sliderInputNumber} />
max={1} </Form.Item>
min={0} </Flex>
step={0.01} <Form.Item name={['llm_setting', 'presence_penalty']} noStyle>
/> <InputNumber
className={styles.sliderInputNumber}
max={1}
min={0}
step={0.01}
disabled={disabled}
/>
</Form.Item>
</>
);
}}
</Form.Item> </Form.Item>
</Flex> </Flex>
</Form.Item> </Form.Item>
@ -171,28 +212,39 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
> >
<Switch size="small" /> <Switch size="small" />
</Form.Item> </Form.Item>
<Flex flex={1}> <Form.Item noStyle dependencies={['frequencyPenaltyEnabled']}>
<Form.Item {({ getFieldValue }) => {
name={['llm_setting', 'frequency_penalty']} const disabled = !getFieldValue('frequencyPenaltyEnabled');
noStyle return (
rules={[ <>
{ required: true, message: t('frequencyPenaltyMessage') }, <Flex flex={1}>
]} <Form.Item
> name={['llm_setting', 'frequency_penalty']}
<Slider className={styles.variableSlider} max={1} step={0.01} /> noStyle
</Form.Item> >
</Flex> <Slider
<Form.Item className={styles.variableSlider}
name={['llm_setting', 'frequency_penalty']} max={1}
noStyle step={0.01}
rules={[{ required: true, message: t('frequencyPenaltyMessage') }]} disabled={disabled}
> />
<InputNumber </Form.Item>
className={styles.sliderInputNumber} </Flex>
max={1} <Form.Item
min={0} name={['llm_setting', 'frequency_penalty']}
step={0.01} noStyle
/> >
<InputNumber
className={styles.sliderInputNumber}
max={1}
min={0}
step={0.01}
disabled={disabled}
/>
</Form.Item>
</>
);
}}
</Form.Item> </Form.Item>
</Flex> </Flex>
</Form.Item> </Form.Item>
@ -201,25 +253,32 @@ const ModelSetting = ({ show, form }: ISegmentedContentProps) => {
<Form.Item name={'maxTokensEnabled'} valuePropName="checked" noStyle> <Form.Item name={'maxTokensEnabled'} valuePropName="checked" noStyle>
<Switch size="small" /> <Switch size="small" />
</Form.Item> </Form.Item>
<Flex flex={1}> <Form.Item noStyle dependencies={['maxTokensEnabled']}>
<Form.Item {({ getFieldValue }) => {
name={['llm_setting', 'max_tokens']} const disabled = !getFieldValue('maxTokensEnabled');
noStyle
rules={[{ required: true, message: t('maxTokensMessage') }]} return (
> <>
<Slider className={styles.variableSlider} max={2048} /> <Flex flex={1}>
</Form.Item> <Form.Item name={['llm_setting', 'max_tokens']} noStyle>
</Flex> <Slider
<Form.Item className={styles.variableSlider}
name={['llm_setting', 'max_tokens']} max={2048}
noStyle disabled={disabled}
rules={[{ required: true, message: t('maxTokensMessage') }]} />
> </Form.Item>
<InputNumber </Flex>
className={styles.sliderInputNumber} <Form.Item name={['llm_setting', 'max_tokens']} noStyle>
max={2048} <InputNumber
min={0} disabled={disabled}
/> className={styles.sliderInputNumber}
max={2048}
min={0}
/>
</Form.Item>
</>
);
}}
</Form.Item> </Form.Item>
</Flex> </Flex>
</Form.Item> </Form.Item>