import { ReactComponent as ChatConfigurationAtom } from '@/assets/svg/chat-configuration-atom.svg'; import { IModalManagerChildrenProps } from '@/components/modal-manager'; import { ModelVariableType, settledModelVariableMap, } from '@/constants/knowledge'; import { IDialog } from '@/interfaces/database/chat'; import { Divider, Flex, Form, Modal, Segmented, UploadFile } from 'antd'; import { SegmentedValue } from 'antd/es/segmented'; import camelCase from 'lodash/camelCase'; 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 { useTranslate } from '@/hooks/commonHooks'; import styles from './index.less'; 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}', }, }; enum ConfigurationSegmented { AssistantSetting = 'Assistant Setting', PromptEngine = 'Prompt Engine', ModelSetting = 'Model Setting', } const segmentedMap = { [ConfigurationSegmented.AssistantSetting]: AssistantSetting, [ConfigurationSegmented.ModelSetting]: ModelSetting, [ConfigurationSegmented.PromptEngine]: PromptEngine, }; 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.AssistantSetting, ); const promptEngineRef = useRef>([]); const modelId = useFetchModelId(visible); const { t } = useTranslate('chat'); 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 = (
{t('chatConfiguration')}
{t('chatConfigurationDescription')}
); useEffect(() => { if (visible) { const icon = initialDialog.icon; let fileList: UploadFile[] = []; if (icon) { fileList = [{ uid: '1', name: 'file', thumbUrl: icon, status: 'done' }]; } form.setFieldsValue({ ...initialDialog, llm_setting: initialDialog.llm_setting ?? settledModelVariableMap[ModelVariableType.Precise], icon: fileList, llm_id: initialDialog.llm_id ?? modelId, }); } }, [initialDialog, form, visible, modelId]); return ( ({ label: t(camelCase(x)), value: x, }))} block />
{Object.entries(segmentedMap).map(([key, Element]) => ( ))}
); }; export default ChatConfigurationModal;