mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-23 15:06:50 +08:00
### What problem does this PR solve? Feat: Allow chat to use meta data #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@ -8,10 +8,25 @@ 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 MetadataOptions = Object.values(DatasetMetadata).map((x) => {
|
||||
let value: DatasetMetadata | boolean = x;
|
||||
if (x === DatasetMetadata.Disabled) {
|
||||
value = false;
|
||||
} else if (x === DatasetMetadata.Automatic) {
|
||||
value = true;
|
||||
}
|
||||
return {
|
||||
value,
|
||||
label: x,
|
||||
};
|
||||
});
|
||||
|
||||
const AssistantSetting = ({
|
||||
show,
|
||||
form,
|
||||
@ -20,6 +35,11 @@ const AssistantSetting = ({
|
||||
const { t } = useTranslate('chat');
|
||||
const { data } = useFetchTenantInfo(true);
|
||||
|
||||
const metadata = Form.useWatch(['meta_data_filter', 'auto'], 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);
|
||||
@ -153,6 +173,24 @@ const AssistantSetting = ({
|
||||
required={false}
|
||||
onChange={handleChange}
|
||||
></KnowledgeBaseItem>
|
||||
{hasKnowledge && (
|
||||
<Form.Item
|
||||
label={t('metadata')}
|
||||
name={['meta_data_filter', 'auto']}
|
||||
tooltip={t('metadataTip')}
|
||||
>
|
||||
<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>
|
||||
);
|
||||
};
|
||||
|
||||
@ -0,0 +1,84 @@
|
||||
import { useFetchKnowledgeMetadata } from '@/hooks/use-knowledge-request';
|
||||
import { SwitchOperatorOptions } from '@/pages/agent/constant';
|
||||
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
|
||||
import {
|
||||
Button,
|
||||
Dropdown,
|
||||
Empty,
|
||||
Form,
|
||||
FormListOperation,
|
||||
Input,
|
||||
Select,
|
||||
Space,
|
||||
} from 'antd';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
export function MetadataFilterConditions({ kbIds }: { kbIds: string[] }) {
|
||||
const metadata = useFetchKnowledgeMetadata(kbIds);
|
||||
|
||||
const renderItems = useCallback(
|
||||
(add: FormListOperation['add']) => {
|
||||
if (Object.keys(metadata.data).length === 0) {
|
||||
return [{ key: 'noData', label: <Empty></Empty> }];
|
||||
}
|
||||
return Object.keys(metadata.data).map((key) => {
|
||||
return {
|
||||
key,
|
||||
onClick: () => {
|
||||
add({
|
||||
key,
|
||||
value: '',
|
||||
op: SwitchOperatorOptions[0].value,
|
||||
});
|
||||
},
|
||||
label: key,
|
||||
};
|
||||
});
|
||||
},
|
||||
[metadata],
|
||||
);
|
||||
return (
|
||||
<Form.List name={['meta_data_filter', 'manual']}>
|
||||
{(fields, { add, remove }) => (
|
||||
<>
|
||||
{fields.map(({ key, name, ...restField }) => (
|
||||
<Space
|
||||
key={key}
|
||||
style={{ display: 'flex', marginBottom: 8 }}
|
||||
align="baseline"
|
||||
>
|
||||
<Form.Item
|
||||
{...restField}
|
||||
name={[name, 'key']}
|
||||
rules={[{ required: true, message: 'Missing first name' }]}
|
||||
>
|
||||
<Input placeholder="First Name" />
|
||||
</Form.Item>
|
||||
<Form.Item {...restField} name={[name, 'op']} className="w-20">
|
||||
<Select
|
||||
options={SwitchOperatorOptions}
|
||||
popupMatchSelectWidth={false}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
{...restField}
|
||||
name={[name, 'value']}
|
||||
rules={[{ required: true, message: 'Missing last name' }]}
|
||||
>
|
||||
<Input placeholder="Last Name" />
|
||||
</Form.Item>
|
||||
<MinusCircleOutlined onClick={() => remove(name)} />
|
||||
</Space>
|
||||
))}
|
||||
<Form.Item>
|
||||
<Dropdown trigger={['click']} menu={{ items: renderItems(add) }}>
|
||||
<Button type="dashed" block icon={<PlusOutlined />}>
|
||||
Add Condition
|
||||
</Button>
|
||||
</Dropdown>
|
||||
</Form.Item>
|
||||
</>
|
||||
)}
|
||||
</Form.List>
|
||||
);
|
||||
}
|
||||
@ -1 +1,7 @@
|
||||
export const EmptyConversationId = 'empty';
|
||||
|
||||
export enum DatasetMetadata {
|
||||
Disabled = 'disabled',
|
||||
Automatic = 'automatic',
|
||||
Manual = 'manual',
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user