balibabu
feat: display chunk token number when category of knowledge as general and unavailable llm models appear disabled and if the backend returns 401, it will jump to the login page and fixed the issue where the greeting would disappear when clicking on a new dialog (#117)
f30b544
import { ReactComponent as ChatConfigurationAtom } from '@/assets/svg/chat-configuration-atom.svg'; | |
import { IModalManagerChildrenProps } from '@/components/modal-manager'; | |
import { IDialog } from '@/interfaces/database/chat'; | |
import { Divider, Flex, Form, Modal, Segmented, UploadFile } from 'antd'; | |
import { SegmentedValue } from 'antd/es/segmented'; | |
import omit from 'lodash/omit'; | |
import { useEffect, useRef, useState } from 'react'; | |
import { variableEnabledFieldMap } from '../constants'; | |
import { IPromptConfigParameters } from '../interface'; | |
import { excludeUnEnabledVariables } from '../utils'; | |
import AssistantSetting from './assistant-setting'; | |
import { useFetchModelId } from './hooks'; | |
import ModelSetting from './model-setting'; | |
import PromptEngine from './prompt-engine'; | |
import styles from './index.less'; | |
enum ConfigurationSegmented { | |
AssistantSetting = 'Assistant Setting', | |
PromptEngine = 'Prompt Engine', | |
ModelSetting = 'Model Setting', | |
} | |
const segmentedMap = { | |
[ConfigurationSegmented.AssistantSetting]: AssistantSetting, | |
[ConfigurationSegmented.ModelSetting]: ModelSetting, | |
[ConfigurationSegmented.PromptEngine]: PromptEngine, | |
}; | |
const layout = { | |
labelCol: { span: 7 }, | |
wrapperCol: { span: 17 }, | |
}; | |
const validateMessages = { | |
required: '${label} is required!', | |
types: { | |
email: '${label} is not a valid email!', | |
number: '${label} is not a valid number!', | |
}, | |
number: { | |
range: '${label} must be between ${min} and ${max}', | |
}, | |
}; | |
interface IProps extends IModalManagerChildrenProps { | |
initialDialog: IDialog; | |
loading: boolean; | |
onOk: (dialog: IDialog) => void; | |
clearDialog: () => void; | |
} | |
const ChatConfigurationModal = ({ | |
visible, | |
hideModal, | |
initialDialog, | |
loading, | |
onOk, | |
clearDialog, | |
}: IProps) => { | |
const [form] = Form.useForm(); | |
const [value, setValue] = useState<ConfigurationSegmented>( | |
ConfigurationSegmented.AssistantSetting, | |
); | |
const promptEngineRef = useRef<Array<IPromptConfigParameters>>([]); | |
const modelId = useFetchModelId(visible); | |
const handleOk = async () => { | |
const values = await form.validateFields(); | |
const nextValues: any = omit(values, [ | |
...Object.keys(variableEnabledFieldMap), | |
'parameters', | |
...excludeUnEnabledVariables(values), | |
]); | |
const emptyResponse = nextValues.prompt_config?.empty_response ?? ''; | |
const fileList = values.icon; | |
let icon; | |
if (Array.isArray(fileList) && fileList.length > 0) { | |
icon = fileList[0].thumbUrl; | |
} | |
const finalValues = { | |
dialog_id: initialDialog.id, | |
...nextValues, | |
prompt_config: { | |
...nextValues.prompt_config, | |
parameters: promptEngineRef.current, | |
empty_response: emptyResponse, | |
}, | |
icon, | |
}; | |
onOk(finalValues); | |
}; | |
const handleCancel = () => { | |
hideModal(); | |
}; | |
const handleSegmentedChange = (val: SegmentedValue) => { | |
setValue(val as ConfigurationSegmented); | |
}; | |
const handleModalAfterClose = () => { | |
clearDialog(); | |
form.resetFields(); | |
}; | |
const title = ( | |
<Flex gap={16}> | |
<ChatConfigurationAtom></ChatConfigurationAtom> | |
<div> | |
<b>Chat Configuration</b> | |
<div className={styles.chatConfigurationDescription}> | |
Here, dress up a dedicated assistant for your special knowledge bases! | |
💕 | |
</div> | |
</div> | |
</Flex> | |
); | |
useEffect(() => { | |
if (visible) { | |
const icon = initialDialog.icon; | |
let fileList: UploadFile[] = []; | |
if (icon) { | |
fileList = [{ uid: '1', name: 'file', thumbUrl: icon, status: 'done' }]; | |
} | |
form.setFieldsValue({ | |
...initialDialog, | |
icon: fileList, | |
llm_id: initialDialog.llm_id ?? modelId, | |
}); | |
} | |
}, [initialDialog, form, visible, modelId]); | |
return ( | |
<Modal | |
title={title} | |
width={688} | |
open={visible} | |
onOk={handleOk} | |
onCancel={handleCancel} | |
confirmLoading={loading} | |
destroyOnClose | |
afterClose={handleModalAfterClose} | |
> | |
<Segmented | |
size={'large'} | |
value={value} | |
onChange={handleSegmentedChange} | |
options={Object.values(ConfigurationSegmented)} | |
block | |
/> | |
<Divider></Divider> | |
<Form | |
{...layout} | |
name="nest-messages" | |
form={form} | |
style={{ maxWidth: 600 }} | |
validateMessages={validateMessages} | |
colon={false} | |
> | |
{Object.entries(segmentedMap).map(([key, Element]) => ( | |
<Element | |
key={key} | |
show={key === value} | |
form={form} | |
{...(key === ConfigurationSegmented.PromptEngine | |
? { ref: promptEngineRef } | |
: {})} | |
></Element> | |
))} | |
</Form> | |
</Modal> | |
); | |
}; | |
export default ChatConfigurationModal; | |