balibabu
feat: remove loading from document table and fixed the issue where gif images could not be uploaded on the configuration page (#122)
f1ced48
| import { | |
| useFetchKnowledgeBaseConfiguration, | |
| useKnowledgeBaseId, | |
| } from '@/hooks/knowledgeHook'; | |
| import { useFetchLlmList, useSelectLlmOptions } from '@/hooks/llmHooks'; | |
| import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; | |
| import { | |
| useFetchTenantInfo, | |
| useSelectParserList, | |
| } from '@/hooks/userSettingHook'; | |
| import { IKnowledge } from '@/interfaces/database/knowledge'; | |
| import { | |
| getBase64FromUploadFileList, | |
| getUploadFileListFromBase64, | |
| normFile, | |
| } from '@/utils/fileUtil'; | |
| import { PlusOutlined } from '@ant-design/icons'; | |
| import { | |
| Button, | |
| Divider, | |
| Flex, | |
| Form, | |
| Input, | |
| InputNumber, | |
| Radio, | |
| Select, | |
| Slider, | |
| Space, | |
| Typography, | |
| Upload, | |
| UploadFile, | |
| } from 'antd'; | |
| import pick from 'lodash/pick'; | |
| import { useEffect } from 'react'; | |
| import { useDispatch, useSelector } from 'umi'; | |
| import { LlmModelType } from '../../constant'; | |
| import styles from './index.less'; | |
| const { Title } = Typography; | |
| const { Option } = Select; | |
| const Configuration = () => { | |
| const [form] = Form.useForm(); | |
| const dispatch = useDispatch(); | |
| const knowledgeBaseId = useKnowledgeBaseId(); | |
| const loading = useOneNamespaceEffectsLoading('kSModel', ['updateKb']); | |
| const knowledgeDetails: IKnowledge = useSelector( | |
| (state: any) => state.kSModel.knowledgeDetails, | |
| ); | |
| const parserList = useSelectParserList(); | |
| const embeddingModelOptions = useSelectLlmOptions(); | |
| const onFinish = async (values: any) => { | |
| const avatar = await getBase64FromUploadFileList(values.avatar); | |
| dispatch({ | |
| type: 'kSModel/updateKb', | |
| payload: { | |
| ...values, | |
| avatar, | |
| kb_id: knowledgeBaseId, | |
| }, | |
| }); | |
| }; | |
| const onFinishFailed = (errorInfo: any) => { | |
| console.log('Failed:', errorInfo); | |
| }; | |
| useEffect(() => { | |
| const fileList: UploadFile[] = getUploadFileListFromBase64( | |
| knowledgeDetails.avatar, | |
| ); | |
| form.setFieldsValue({ | |
| ...pick(knowledgeDetails, [ | |
| 'description', | |
| 'name', | |
| 'permission', | |
| 'embd_id', | |
| 'parser_id', | |
| 'language', | |
| 'parser_config.chunk_token_num', | |
| ]), | |
| avatar: fileList, | |
| }); | |
| }, [form, knowledgeDetails]); | |
| useFetchTenantInfo(); | |
| useFetchKnowledgeBaseConfiguration(); | |
| useFetchLlmList(LlmModelType.Embedding); | |
| return ( | |
| <div className={styles.configurationWrapper}> | |
| <Title level={5}>Configuration</Title> | |
| <p>Update your knowledge base details especially parsing method here.</p> | |
| <Divider></Divider> | |
| <Form | |
| form={form} | |
| name="validateOnly" | |
| layout="vertical" | |
| autoComplete="off" | |
| onFinish={onFinish} | |
| onFinishFailed={onFinishFailed} | |
| > | |
| <Form.Item | |
| name="name" | |
| label="Knowledge base name" | |
| rules={[{ required: true }]} | |
| > | |
| <Input /> | |
| </Form.Item> | |
| <Form.Item | |
| name="avatar" | |
| label="Knowledge base photo" | |
| valuePropName="fileList" | |
| getValueFromEvent={normFile} | |
| > | |
| <Upload | |
| listType="picture-card" | |
| maxCount={1} | |
| beforeUpload={() => false} | |
| showUploadList={{ showPreviewIcon: false, showRemoveIcon: false }} | |
| > | |
| <button style={{ border: 0, background: 'none' }} type="button"> | |
| <PlusOutlined /> | |
| <div style={{ marginTop: 8 }}>Upload</div> | |
| </button> | |
| </Upload> | |
| </Form.Item> | |
| <Form.Item name="description" label="Description"> | |
| <Input /> | |
| </Form.Item> | |
| <Form.Item | |
| label="Language" | |
| name="language" | |
| initialValue={'Chinese'} | |
| rules={[{ required: true, message: 'Please input your language!' }]} | |
| > | |
| <Select placeholder="select your language"> | |
| <Option value="English">English</Option> | |
| <Option value="Chinese">Chinese</Option> | |
| </Select> | |
| </Form.Item> | |
| <Form.Item | |
| name="permission" | |
| label="Permissions" | |
| rules={[{ required: true }]} | |
| > | |
| <Radio.Group> | |
| <Radio value="me">Only me</Radio> | |
| <Radio value="team">Team</Radio> | |
| </Radio.Group> | |
| </Form.Item> | |
| <Form.Item | |
| name="embd_id" | |
| label="Embedding Model" | |
| rules={[{ required: true }]} | |
| tooltip="xx" | |
| > | |
| <Select | |
| placeholder="Please select a country" | |
| options={embeddingModelOptions} | |
| ></Select> | |
| </Form.Item> | |
| <Form.Item | |
| name="parser_id" | |
| label="Knowledge base category" | |
| tooltip="xx" | |
| rules={[{ required: true }]} | |
| > | |
| <Select placeholder="Please select a country"> | |
| {parserList.map((x) => ( | |
| <Option value={x.value} key={x.value}> | |
| {x.label} | |
| </Option> | |
| ))} | |
| </Select> | |
| </Form.Item> | |
| <Form.Item noStyle dependencies={['parser_id']}> | |
| {({ getFieldValue }) => { | |
| const parserId = getFieldValue('parser_id'); | |
| if (parserId === 'naive') { | |
| return ( | |
| <Form.Item label="Chunk token number" tooltip="xxx"> | |
| <Flex gap={20} align="center"> | |
| <Flex flex={1}> | |
| <Form.Item | |
| name={['parser_config', 'chunk_token_num']} | |
| noStyle | |
| initialValue={128} | |
| rules={[ | |
| { required: true, message: 'Province is required' }, | |
| ]} | |
| > | |
| <Slider className={styles.variableSlider} max={2048} /> | |
| </Form.Item> | |
| </Flex> | |
| <Form.Item | |
| name={['parser_config', 'chunk_token_num']} | |
| noStyle | |
| initialValue={128} | |
| rules={[ | |
| { required: true, message: 'Street is required' }, | |
| ]} | |
| > | |
| <InputNumber | |
| className={styles.sliderInputNumber} | |
| max={2048} | |
| min={0} | |
| /> | |
| </Form.Item> | |
| </Flex> | |
| </Form.Item> | |
| ); | |
| } | |
| return null; | |
| }} | |
| </Form.Item> | |
| <Form.Item> | |
| <div className={styles.buttonWrapper}> | |
| <Space> | |
| <Button htmlType="reset" size={'middle'}> | |
| Cancel | |
| </Button> | |
| <Button | |
| htmlType="submit" | |
| type="primary" | |
| size={'middle'} | |
| loading={loading} | |
| > | |
| Save | |
| </Button> | |
| </Space> | |
| </div> | |
| </Form.Item> | |
| </Form> | |
| </div> | |
| ); | |
| }; | |
| export default Configuration; | |