import { Form, Input, Button, Switch, Tabs, Select, message, Space, Tooltip, Row, Col } from 'antd'; import MainTitleMark from '@/components/MainTitleMark'; import { AgentType, ChatAppConfig, ChatAppConfigItem } from './type'; import { useEffect, useState } from 'react'; import styles from './style.less'; import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { uuid, jsonParse } from '@/utils/utils'; import ToolsSection from './ToolsSection'; import globalStyles from '@/global.less'; import { QuestionCircleOutlined } from '@ant-design/icons'; import SelectTMEPerson from '@/components/SelectTMEPerson'; import FormItemTitle from '@/components/FormHelper/FormItemTitle'; import { getLlmModelTypeList, getLlmModelAppList, getLlmList } from '../../services/system'; import MemorySection from './MemorySection'; const FormItem = Form.Item; const { TextArea } = Input; type Props = { editAgent?: AgentType; onSaveAgent: (agent: AgentType) => Promise; onCreateToolBtnClick?: () => void; }; const defaultAgentConfig = { simpleMode: false, debugMode: true, }; const AgentForm: React.FC = ({ editAgent, onSaveAgent, onCreateToolBtnClick }) => { const [saveLoading, setSaveLoading] = useState(false); const [examples, setExamples] = useState<{ id: string; question?: string }[]>([]); const [activeKey, setActiveKey] = useState('basic'); const [modelTypeOptions, setModelTypeOptions] = useState< (OptionsItem & { enable: boolean; prompt: string; description: string })[] >([]); const [llmConfigListOptions, setLlmConfigListOptions] = useState([]); const [currentChatModel, setCurrentChatModel] = useState(''); const [defaultChatAppConfig, setDefaultChatAppConfig] = useState({}); const [formData, setFormData] = useState({ enableSearch: true, modelConfig: { timeOut: 60, provider: 'OPEN_AI', temperature: 0, }, toolConfig: { ...defaultAgentConfig, }, }); const [form] = Form.useForm(); useEffect(() => { if (editAgent) { const config = jsonParse(editAgent.toolConfig, {}); const initData = { ...editAgent, enableSearch: editAgent.enableSearch !== 0, enableFeedback: editAgent.enableFeedback !== 0, toolConfig: { ...defaultAgentConfig, ...config }, }; form.setFieldsValue(initData); setFormData(initData); if (editAgent.examples) { setExamples(editAgent.examples.map((question) => ({ id: uuid(), question }))); } } else { form.resetFields(); } queryModelTypeList(editAgent?.chatAppConfig); queryLlmList(); }, [editAgent]); const queryLlmList = async () => { const { code, data } = await getLlmList(); if (code === 200 && data) { const options = data.map((item) => { return { label: item.name, value: item.id, }; }); setLlmConfigListOptions(options); } else { message.error('获取模型场景类型失败'); } }; const queryModelTypeList = async (currentAgentChatConfig: any = {}) => { const { code, data } = await getLlmModelAppList(); if (code === 200 && data) { let options = Object.keys(data).map((key: string) => { let config = data[key]; if (currentAgentChatConfig[key]) { config = currentAgentChatConfig[key]; } return { label: config.name, value: key, enable: config.enable, description: config.description, prompt: config.prompt, }; }); const sqlParserIndex = options.findIndex((item) => item.value === 'S2SQL_PARSER'); if (sqlParserIndex >= 0) { options.splice(0, 0, options.splice(sqlParserIndex, 1)[0]); } const firstOption = options[0]; if (firstOption) { setCurrentChatModel(firstOption.value); } const initChatModelConfig = Object.keys(data).reduce( (modelConfig: ChatAppConfig, key: string) => { let config = data[key]; if (currentAgentChatConfig[key]) { config = currentAgentChatConfig[key]; } return { ...modelConfig, [key]: config, }; }, {}, ); setDefaultChatAppConfig(initChatModelConfig); const formData = form.getFieldsValue(); form.setFieldsValue({ ...formData, chatAppConfig: initChatModelConfig, }); setModelTypeOptions(options); } else { message.error('获取模型场景类型失败'); } }; const layout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; const onOk = async () => { const values = await form.validateFields(); setSaveLoading(true); const config = jsonParse(editAgent?.toolConfig, {}); await onSaveAgent?.({ id: editAgent?.id, ...(editAgent || {}), ...values, toolConfig: JSON.stringify({ ...config, ...values.toolConfig, debugMode: values.toolConfig?.simpleMode === true ? false : values.toolConfig?.debugMode, }) as any, examples: examples.map((example) => example.question), enableSearch: values.enableSearch ? 1 : 0, enableFeedback: values.enableFeedback ? 1 : 0, chatAppConfig: Object.keys(defaultChatAppConfig).reduce((mergeConfig, key) => { return { ...mergeConfig, [key]: { ...defaultChatAppConfig[key], ...(values.chatAppConfig?.[key] ? values.chatAppConfig[key] : {}), }, }; }, {}), }); setSaveLoading(false); }; const tips = [ '自定义提示词模板可嵌入以下变量,将由系统自动进行替换:', '-{{exemplar}} :替换成few-shot示例,示例个数由系统配置', '-{{question}} :替换成用户问题,拼接了一定的补充信息', '-{{schema}} :替换成数据语义信息,根据用户问题映射而来', ]; const formTabList = [ { label: '基本信息', key: 'basic', children: (
{/* */}
{examples.map((example) => { const { id, question } = example; return (
{ example.question = e.target.value; setExamples([...examples]); }} allowClear /> { setExamples(examples.filter((item) => item.id !== id)); }} />
); })}