mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-23 06:46:40 +08:00
### What problem does this PR solve? Feat: Added meta data to the chat configuration page #8531 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
194 lines
5.5 KiB
TypeScript
194 lines
5.5 KiB
TypeScript
import KnowledgeBaseItem from '@/components/knowledge-base-item';
|
|
import { TavilyItem } from '@/components/tavily-item';
|
|
import { useTranslate } from '@/hooks/common-hooks';
|
|
import { useFetchTenantInfo } from '@/hooks/user-setting-hooks';
|
|
import { PlusOutlined } from '@ant-design/icons';
|
|
import { Form, Input, message, Select, Switch, Upload } from 'antd';
|
|
import classNames from 'classnames';
|
|
import { useCallback } from 'react';
|
|
import { ISegmentedContentProps } from '../interface';
|
|
|
|
import { DatasetMetadata } from '../constants';
|
|
import styles from './index.less';
|
|
import { MetadataFilterConditions } from './metadata-filter-conditions';
|
|
|
|
const emptyResponseField = ['prompt_config', 'empty_response'];
|
|
|
|
const AssistantSetting = ({
|
|
show,
|
|
form,
|
|
setHasError,
|
|
}: ISegmentedContentProps) => {
|
|
const { t } = useTranslate('chat');
|
|
const { data } = useFetchTenantInfo(true);
|
|
|
|
const MetadataOptions = Object.values(DatasetMetadata).map((x) => {
|
|
return {
|
|
value: x,
|
|
label: t(`meta.${x}`),
|
|
};
|
|
});
|
|
|
|
const metadata = Form.useWatch(['meta_data_filter', 'method'], form);
|
|
const kbIds = Form.useWatch(['kb_ids'], form);
|
|
|
|
const hasKnowledge = Array.isArray(kbIds) && kbIds.length > 0;
|
|
|
|
const handleChange = useCallback(() => {
|
|
const kbIds = form.getFieldValue('kb_ids');
|
|
const emptyResponse = form.getFieldValue(emptyResponseField);
|
|
|
|
const required =
|
|
emptyResponse && ((Array.isArray(kbIds) && kbIds.length === 0) || !kbIds);
|
|
|
|
setHasError(required);
|
|
form.setFields([
|
|
{
|
|
name: emptyResponseField,
|
|
errors: required ? [t('emptyResponseMessage')] : [],
|
|
},
|
|
]);
|
|
}, [form, setHasError, t]);
|
|
|
|
const normFile = (e: any) => {
|
|
if (Array.isArray(e)) {
|
|
return e;
|
|
}
|
|
return e?.fileList;
|
|
};
|
|
|
|
const handleTtsChange = useCallback(
|
|
(checked: boolean) => {
|
|
if (checked && !data.tts_id) {
|
|
message.error(`Please set TTS model firstly.
|
|
Setting >> Model providers >> System model settings`);
|
|
form.setFieldValue(['prompt_config', 'tts'], false);
|
|
}
|
|
},
|
|
[data, form],
|
|
);
|
|
|
|
const uploadButton = (
|
|
<button style={{ border: 0, background: 'none' }} type="button">
|
|
<PlusOutlined />
|
|
<div style={{ marginTop: 8 }}>{t('upload', { keyPrefix: 'common' })}</div>
|
|
</button>
|
|
);
|
|
|
|
return (
|
|
<section
|
|
className={classNames({
|
|
[styles.segmentedHidden]: !show,
|
|
})}
|
|
>
|
|
<Form.Item
|
|
name={'name'}
|
|
label={t('assistantName')}
|
|
rules={[{ required: true, message: t('assistantNameMessage') }]}
|
|
>
|
|
<Input placeholder={t('namePlaceholder')} />
|
|
</Form.Item>
|
|
<Form.Item name={'description'} label={t('description')}>
|
|
<Input placeholder={t('descriptionPlaceholder')} />
|
|
</Form.Item>
|
|
<Form.Item
|
|
name="icon"
|
|
label={t('assistantAvatar')}
|
|
valuePropName="fileList"
|
|
getValueFromEvent={normFile}
|
|
>
|
|
<Upload
|
|
listType="picture-card"
|
|
maxCount={1}
|
|
beforeUpload={() => false}
|
|
showUploadList={{ showPreviewIcon: false, showRemoveIcon: false }}
|
|
>
|
|
{show ? uploadButton : null}
|
|
</Upload>
|
|
</Form.Item>
|
|
<Form.Item
|
|
name={'language'}
|
|
label={t('language')}
|
|
initialValue={'English'}
|
|
tooltip="coming soon"
|
|
style={{ display: 'none' }}
|
|
>
|
|
<Select
|
|
options={[
|
|
{ value: 'Chinese', label: t('chinese', { keyPrefix: 'common' }) },
|
|
{ value: 'English', label: t('english', { keyPrefix: 'common' }) },
|
|
]}
|
|
/>
|
|
</Form.Item>
|
|
<Form.Item
|
|
name={emptyResponseField}
|
|
label={t('emptyResponse')}
|
|
tooltip={t('emptyResponseTip')}
|
|
>
|
|
<Input placeholder="" onChange={handleChange} />
|
|
</Form.Item>
|
|
<Form.Item
|
|
name={['prompt_config', 'prologue']}
|
|
label={t('setAnOpener')}
|
|
tooltip={t('setAnOpenerTip')}
|
|
initialValue={t('setAnOpenerInitial')}
|
|
>
|
|
<Input.TextArea autoSize={{ minRows: 5 }} />
|
|
</Form.Item>
|
|
<Form.Item
|
|
label={t('quote')}
|
|
valuePropName="checked"
|
|
name={['prompt_config', 'quote']}
|
|
tooltip={t('quoteTip')}
|
|
initialValue={true}
|
|
>
|
|
<Switch />
|
|
</Form.Item>
|
|
<Form.Item
|
|
label={t('keyword')}
|
|
valuePropName="checked"
|
|
name={['prompt_config', 'keyword']}
|
|
tooltip={t('keywordTip')}
|
|
initialValue={false}
|
|
>
|
|
<Switch />
|
|
</Form.Item>
|
|
<Form.Item
|
|
label={t('tts')}
|
|
valuePropName="checked"
|
|
name={['prompt_config', 'tts']}
|
|
tooltip={t('ttsTip')}
|
|
initialValue={false}
|
|
>
|
|
<Switch onChange={handleTtsChange} />
|
|
</Form.Item>
|
|
<TavilyItem></TavilyItem>
|
|
<KnowledgeBaseItem
|
|
required={false}
|
|
onChange={handleChange}
|
|
></KnowledgeBaseItem>
|
|
{hasKnowledge && (
|
|
<Form.Item
|
|
label={t('metadata')}
|
|
name={['meta_data_filter', 'method']}
|
|
tooltip={t('metadataTip')}
|
|
initialValue={DatasetMetadata.Disabled}
|
|
>
|
|
<Select options={MetadataOptions} />
|
|
</Form.Item>
|
|
)}
|
|
{hasKnowledge && metadata === DatasetMetadata.Manual && (
|
|
<Form.Item
|
|
label={t('conditions')}
|
|
tooltip={t('ttsTip')}
|
|
initialValue={false}
|
|
>
|
|
<MetadataFilterConditions kbIds={kbIds}></MetadataFilterConditions>
|
|
</Form.Item>
|
|
)}
|
|
</section>
|
|
);
|
|
};
|
|
|
|
export default AssistantSetting;
|