Feat: Allow chat to use meta data #3221 (#9393)

### 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:
balibabu
2025-08-12 10:15:10 +08:00
committed by GitHub
parent 9433f64fe2
commit 76118000c1
13 changed files with 240 additions and 31 deletions

View File

@ -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>
);
};

View File

@ -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>
);
}

View File

@ -1 +1,7 @@
export const EmptyConversationId = 'empty';
export enum DatasetMetadata {
Disabled = 'disabled',
Automatic = 'automatic',
Manual = 'manual',
}