Sfoglia il codice sorgente

Fix: Creating Knowledge Base Support Enter Key (#7258)

### What problem does this PR solve?


[https://github.com/infiniflow/ragflow/issues/7180](https://github.com/infiniflow/ragflow/issues/7180)
When creating a knowledge base, support the enter key
### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
tags/v0.19.0
Stephen Hu 6 mesi fa
parent
commit
3da8776a3c
Nessun account collegato all'indirizzo email del committer

+ 13
- 0
web/src/pages/chat/chat-configuration-modal/index.tsx Vedi File

} }
}, [initialDialog, form, visible, modelId]); }, [initialDialog, form, visible, modelId]);


const handleKeyDown = (e: React.KeyboardEvent) => {
// Allow Enter in textareas
if (e.target instanceof HTMLTextAreaElement) {
return;
}

if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
handleOk();
}
};

return ( return (
<Modal <Modal
title={title} title={title}
style={{ maxWidth: 600 }} style={{ maxWidth: 600 }}
validateMessages={validateMessages} validateMessages={validateMessages}
colon={false} colon={false}
onKeyDown={handleKeyDown}
> >
{Object.entries(segmentedMap).map(([key, Element]) => ( {Object.entries(segmentedMap).map(([key, Element]) => (
<Element <Element

+ 7
- 1
web/src/pages/flow/list/create-agent-modal.tsx Vedi File

return onOk(ret.name); return onOk(ret.name);
}; };


const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter' && !e.shiftKey) {
handleOk();
}
};

return ( return (
<Modal <Modal
title={t('createGraph', { keyPrefix: 'flow' })} title={t('createGraph', { keyPrefix: 'flow' })}
name="name" name="name"
rules={[{ required: true, message: t('namePlaceholder') }]} rules={[{ required: true, message: t('namePlaceholder') }]}
> >
<Input />
<Input onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

+ 7
- 2
web/src/pages/knowledge/knowledge-creating-modal/index.tsx Vedi File



const handleOk = async () => { const handleOk = async () => {
const ret = await form.validateFields(); const ret = await form.validateFields();

onOk(ret.name); onOk(ret.name);
}; };


const handleKeyDown = async (e) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('createKnowledgeBase')} title={t('createKnowledgeBase')}
name="name" name="name"
rules={[{ required: true, message: t('namePlaceholder') }]} rules={[{ required: true, message: t('namePlaceholder') }]}
> >
<Input placeholder={t('namePlaceholder')} />
<Input placeholder={t('namePlaceholder')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

+ 15
- 9
web/src/pages/user-setting/setting-model/Tencent-modal/index.tsx Vedi File

onOk?.(data); onOk?.(data);
}; };


const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
}} }}
confirmLoading={loading} confirmLoading={loading}
> >
<Form
name="basic"
style={{ maxWidth: 600 }}
autoComplete="off"
layout={'vertical'}
form={form}
>
<Form>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelType')} label={t('modelType')}
name="model_type" name="model_type"
name="TencentCloud_sid" name="TencentCloud_sid"
rules={[{ required: true, message: t('TencentCloudSIDMessage') }]} rules={[{ required: true, message: t('TencentCloudSIDMessage') }]}
> >
<Input placeholder={t('TencentCloudSIDMessage')} />
<Input
placeholder={t('TencentCloudSIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addTencentCloudSK')} label={t('addTencentCloudSK')}
name="TencentCloud_sk" name="TencentCloud_sk"
rules={[{ required: true, message: t('TencentCloudSKMessage') }]} rules={[{ required: true, message: t('TencentCloudSKMessage') }]}
> >
<Input placeholder={t('TencentCloudSKMessage')} />
<Input
placeholder={t('TencentCloudSKMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

+ 11
- 2
web/src/pages/user-setting/setting-model/api-key-modal/index.tsx Vedi File

return onOk(ret); return onOk(ret);
}; };


const handleKeyDown = async (e) => {
if (e.key === 'Enter') {
await handleOk();
}
};

useEffect(() => { useEffect(() => {
if (visible) { if (visible) {
form.setFieldValue('api_key', initialValue); form.setFieldValue('api_key', initialValue);
tooltip={t('apiKeyTip')} tooltip={t('apiKeyTip')}
rules={[{ required: true, message: t('apiKeyMessage') }]} rules={[{ required: true, message: t('apiKeyMessage') }]}
> >
<Input />
<Input onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
{modelsWithBaseUrl.some((x) => x === llmFactory) && ( {modelsWithBaseUrl.some((x) => x === llmFactory) && (
<Form.Item<FieldType> <Form.Item<FieldType>
name="base_url" name="base_url"
tooltip={t('baseUrlTip')} tooltip={t('baseUrlTip')}
> >
<Input placeholder="https://api.openai.com/v1" />
<Input
placeholder="https://api.openai.com/v1"
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
)} )}
{llmFactory?.toLowerCase() === 'Minimax'.toLowerCase() && ( {llmFactory?.toLowerCase() === 'Minimax'.toLowerCase() && (

+ 19
- 4
web/src/pages/user-setting/setting-model/azure-openai-modal/index.tsx Vedi File

const getOptions = (factory: string) => { const getOptions = (factory: string) => {
return optionsMap.Default; return optionsMap.Default;
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
name="api_base" name="api_base"
rules={[{ required: true, message: t('baseUrlNameMessage') }]} rules={[{ required: true, message: t('baseUrlNameMessage') }]}
> >
<Input placeholder={t('baseUrlNameMessage')} />
<Input
placeholder={t('baseUrlNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('apiKey')} label={t('apiKey')}
name="api_key" name="api_key"
rules={[{ required: false, message: t('apiKeyMessage') }]} rules={[{ required: false, message: t('apiKeyMessage') }]}
> >
<Input placeholder={t('apiKeyMessage')} />
<Input placeholder={t('apiKeyMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelName')} label={t('modelName')}
initialValue="gpt-3.5-turbo" initialValue="gpt-3.5-turbo"
rules={[{ required: true, message: t('modelNameMessage') }]} rules={[{ required: true, message: t('modelNameMessage') }]}
> >
<Input placeholder={t('modelNameMessage')} />
<Input
placeholder={t('modelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('apiVersion')} label={t('apiVersion')}
initialValue="2024-02-01" initialValue="2024-02-01"
rules={[{ required: false, message: t('apiVersionMessage') }]} rules={[{ required: false, message: t('apiVersionMessage') }]}
> >
<Input placeholder={t('apiVersionMessage')} />
<Input
placeholder={t('apiVersionMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}

+ 23
- 11
web/src/pages/user-setting/setting-model/google-modal/index.tsx Vedi File

onOk?.(data); onOk?.(data);
}; };


const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
onCancel={hideModal} onCancel={hideModal}
okButtonProps={{ loading }} okButtonProps={{ loading }}
> >
<Form
name="basic"
style={{ maxWidth: 600 }}
autoComplete="off"
layout={'vertical'}
form={form}
>
<Form>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelType')} label={t('modelType')}
name="model_type" name="model_type"
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('GoogleModelIDMessage') }]} rules={[{ required: true, message: t('GoogleModelIDMessage') }]}
> >
<Input placeholder={t('GoogleModelIDMessage')} />
<Input
placeholder={t('GoogleModelIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addGoogleProjectID')} label={t('addGoogleProjectID')}
name="google_project_id" name="google_project_id"
rules={[{ required: true, message: t('GoogleProjectIDMessage') }]} rules={[{ required: true, message: t('GoogleProjectIDMessage') }]}
> >
<Input placeholder={t('GoogleProjectIDMessage')} />
<Input
placeholder={t('GoogleProjectIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addGoogleRegion')} label={t('addGoogleRegion')}
name="google_region" name="google_region"
rules={[{ required: true, message: t('GoogleRegionMessage') }]} rules={[{ required: true, message: t('GoogleRegionMessage') }]}
> >
<Input placeholder={t('GoogleRegionMessage')} />
<Input
placeholder={t('GoogleRegionMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addGoogleServiceAccountKey')} label={t('addGoogleServiceAccountKey')}
{ required: true, message: t('GoogleServiceAccountKeyMessage') }, { required: true, message: t('GoogleServiceAccountKeyMessage') },
]} ]}
> >
<Input placeholder={t('GoogleServiceAccountKeyMessage')} />
<Input
placeholder={t('GoogleServiceAccountKeyMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}

+ 14
- 2
web/src/pages/user-setting/setting-model/hunyuan-modal/index.tsx Vedi File

onOk?.(data); onOk?.(data);
}; };


const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
name="hunyuan_sid" name="hunyuan_sid"
rules={[{ required: true, message: t('HunyuanSIDMessage') }]} rules={[{ required: true, message: t('HunyuanSIDMessage') }]}
> >
<Input placeholder={t('HunyuanSIDMessage')} />
<Input
placeholder={t('HunyuanSIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addHunyuanSK')} label={t('addHunyuanSK')}
name="hunyuan_sk" name="hunyuan_sk"
rules={[{ required: true, message: t('HunyuanSKMessage') }]} rules={[{ required: true, message: t('HunyuanSKMessage') }]}
> >
<Input placeholder={t('HunyuanSKMessage')} />
<Input
placeholder={t('HunyuanSKMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

+ 16
- 3
web/src/pages/user-setting/setting-model/ollama-modal/index.tsx Vedi File



const { t } = useTranslate('setting'); const { t } = useTranslate('setting');


const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

const handleOk = async () => { const handleOk = async () => {
const values = await form.validateFields(); const values = await form.validateFields();
const modelType = const modelType =
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('modelNameMessage') }]} rules={[{ required: true, message: t('modelNameMessage') }]}
> >
<Input placeholder={t('modelNameMessage')} />
<Input
placeholder={t('modelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addLlmBaseUrl')} label={t('addLlmBaseUrl')}
name="api_base" name="api_base"
rules={[{ required: true, message: t('baseUrlNameMessage') }]} rules={[{ required: true, message: t('baseUrlNameMessage') }]}
> >
<Input placeholder={t('baseUrlNameMessage')} />
<Input
placeholder={t('baseUrlNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('apiKey')} label={t('apiKey')}
name="api_key" name="api_key"
rules={[{ required: false, message: t('apiKeyMessage') }]} rules={[{ required: false, message: t('apiKeyMessage') }]}
> >
<Input placeholder={t('apiKeyMessage')} />
<Input placeholder={t('apiKeyMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}
<InputNumber <InputNumber
placeholder={t('maxTokensTip')} placeholder={t('maxTokensTip')}
style={{ width: '100%' }} style={{ width: '100%' }}
onKeyDown={handleKeyDown}
/> />
</Form.Item> </Form.Item>



+ 20
- 22
web/src/pages/user-setting/setting-model/spark-modal/index.tsx Vedi File

onOk?.(data); onOk?.(data);
}; };


const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
okButtonProps={{ loading }} okButtonProps={{ loading }}
confirmLoading={loading} confirmLoading={loading}
> >
<Form
name="basic"
style={{ maxWidth: 600 }}
autoComplete="off"
layout={'vertical'}
form={form}
>
<Form>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelType')} label={t('modelType')}
name="model_type" name="model_type"
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('SparkModelNameMessage') }]} rules={[{ required: true, message: t('SparkModelNameMessage') }]}
> >
<Input placeholder={t('modelNameMessage')} />
<Input
placeholder={t('modelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item noStyle dependencies={['model_type']}>
{({ getFieldValue }) =>
getFieldValue('model_type') === 'chat' && (
<Form.Item<FieldType>
label={t('addSparkAPIPassword')}
name="spark_api_password"
rules={[
{ required: true, message: t('SparkAPIPasswordMessage') },
]}
>
<Input placeholder={t('SparkAPIPasswordMessage')} />
</Form.Item>
)
}
<Form.Item<FieldType>
label={t('addSparkAPIPassword')}
name="spark_api_password"
rules={[{ required: true, message: t('SparkAPIPasswordMessage') }]}
>
<Input
placeholder={t('SparkAPIPasswordMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item noStyle dependencies={['model_type']}> <Form.Item noStyle dependencies={['model_type']}>
{({ getFieldValue }) => {({ getFieldValue }) =>

+ 12
- 3
web/src/pages/user-setting/setting-model/yiyan-modal/index.tsx Vedi File

onOk?.(data); onOk?.(data);
}; };


const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};

return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('yiyanModelNameMessage') }]} rules={[{ required: true, message: t('yiyanModelNameMessage') }]}
> >
<Input placeholder={t('yiyanModelNameMessage')} />
<Input
placeholder={t('yiyanModelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addyiyanAK')} label={t('addyiyanAK')}
name="yiyan_ak" name="yiyan_ak"
rules={[{ required: true, message: t('yiyanAKMessage') }]} rules={[{ required: true, message: t('yiyanAKMessage') }]}
> >
<Input placeholder={t('yiyanAKMessage')} />
<Input placeholder={t('yiyanAKMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addyiyanSK')} label={t('addyiyanSK')}
name="yiyan_sk" name="yiyan_sk"
rules={[{ required: true, message: t('yiyanSKMessage') }]} rules={[{ required: true, message: t('yiyanSKMessage') }]}
> >
<Input placeholder={t('yiyanSKMessage')} />
<Input placeholder={t('yiyanSKMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}

Loading…
Annulla
Salva