Files
supersonic/webapp/packages/supersonic-fe/src/pages/Agent/AgentForm.tsx
tristanliu 5eefeb85a3 [improvement][headless-fe] Revamped the dimension value settings in the assistant module. (#1842)
* [improvement][semantic-fe] Fixing the logic error in the dimension value setting.

* [improvement][semantic-fe] Fixing the synchronization issue with the question and answer settings information.

* [improvement][semantic-fe] Optimizing the canvas functionality for better performance and user experience.

* [improvement][semantic-fe] Optimizing the update process for drawing model relationship edges in the canvas.

* [improvement][semantic-fe] Changing the line type for canvas connections.

* [improvement][semantic-fe] Replacing the initialization variable from "semantic" to "headless".

* [improvement][semantic-fe] Fixing the missing migration issue for default drill-down dimension configuration in model editing. Additionally, optimizing the data retrieval method for initializing fields in the model.

* [improvement][semantic-fe] Updating the logic for the fieldName.

* [improvement][semantic-fe] Adjusting the position of the metrics tab.

* [improvement][semantic-fe] Changing the 字段名称 to 英文名称.

* [improvement][semantic-fe] Fix metric measurement deletion.

* [improvement][semantic-fe] UI optimization for metric details page.

* [improvement][semantic-fe] UI optimization for metric details page.

* [improvement][semantic-fe] UI adjustment for metric details page.

* [improvement][semantic-fe] The granularity field in the time type of model editing now supports setting it as empty.

* [improvement][semantic-fe] Added field type and metric type to the metric creation options.

* [improvement][semantic-fe] The organization structure selection feature has been added to the permission management.

* [improvement][semantic-fe] Improved user experience for the metric list.

* [improvement][semantic-fe] fix update the metric list.

* [improvement][headless-fe] Added view management functionality.

* [improvement][headless-fe] The view management functionality has been added. This feature allows users to create, edit, and manage different views within the system.

* [improvement][headless-fe] Added model editing side effect detection.

* [improvement][headless-fe] Fixed the logic error in view editing.

* [improvement][headless-fe] Fixed the issue with initializing dimension associations in metric settings.

* [improvement][headless-fe] Added the ability to hide the Q&A settings entry point.

* [improvement][headless-fe] Fixed the issue with selecting search results in metric field creation.

* [improvement][headless-fe] Added search functionality to the field list in model editing.

* [improvement][headless-fe] fix the field list in model editing

* [improvement][headless-fe] Restructured the data for the dimension value settings interface.

* [improvement][headless-fe] Added dynamic variable functionality to model creation based on SQL scripts.

* [improvement][headless-fe] Added support for passing dynamic variables as parameters in the executeSql function.

* [improvement][headless-fe] Resolved the issue where users were unable to select all options for dimensions, metrics, and fields in the metric generation process.

* [improvement][headless-fe] Replaced the term "view" with "dataset"

* [improvement][headless-fe] Added the ability to export metrics and dimensions to a specific target.

* [improvement][headless-fe] Enhanced dataset creation to support the tag mode.

* [improvement][headless-fe] Added tag value setting.

* [improvement][headless-fe] Optimized the tag setting system.

* [improvement][headless-fe] Optimized the tag setting system.

* [improvement][headless-fe] Updated the data initialization for model editing to use API requests instead.

* [improvement][headless-fe] Added search functionality to model management.

* [improvement][headless-fe] Removed field null validation during model editing.

* [improvement][headless-fe] Updated the batch operation button component.

* [improvement][headless-fe] Optimized the logic for initializing indicators in dimension value settings.

* [improvement][headless-fe] Adjusted the length of the input field for model editing names.

* [improvement][headless-fe]  Lock the version of the @ant-design/pro-table component and replace it with @ant-design/pro-components.

* [improvement][headless-fe] Optimized the style of the metrics market and tags market.

* [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling.

* [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling

* [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling.

* [improvement][headless-fe] Fixed the issue where the conditions for metric measurement creation were not being saved correctly.

* [improvement][headless-fe] Default value setting for hiding dimensions.

* [improvement][headless-fe] Updated the file imports in the project.

* [improvement][headless-fe] Adjusted the logic for displaying the tab in the theme domain.

* [improvement][headless-fe] Added term management functionality.

* [improvement][headless-fe] When creating a model, the current metric operator now allows for clearance.

* [improvement][headless-fe] Term management interface transformation

* [improvement][headless-fe] Migrating scaffold version to @umi/max

* [improvement][headless-fe] remove modle column

* [improvement][headless-fe] 1.Added configuration for the large language model in the agent; 2.upgraded React version from 17 to 18; 3.modified some UI effects.

* [improvement][headless-fe] Added a simplified mode to the question-answering system.

* [improvement][headless-fe] remove pnpm-lock

* [improvement][headless-fe] add pnpm-lock

* [improvement][headless-fe] Fixed the issue with passing the modelId during initialization.

* [improvement][headless-fe] Fixed the issue with abnormal comments during model creation.

* [improvement][headless-fe] fix  build bugs

* [improvement][headless-fe]  change build config

* [improvement][headless-fe] route config change

* [improvement][headless-fe] Optimized data updating when switching domains.

* [improvement][headless-fe] css change

* [improvement][semantic-fe] logo css change

* [improvement][semantic-fe] system config add defaultValue support

* [improvement][semantic-fe] tag mode wording change

* [improvement][semantic-fe] fix metric edit page init error

* [improvement][supersonic-fe] Updated the way chat projects are imported in supersonic-fe.

* [improvement][chat-engine] Added a background silent mode for watching chat projects.

* [improvement][supersonic-fe] fix proxy url

* [improvement][headless-fe] agent setting update

* [improvement][headless-fe] Agent configuration: Added connectivity testing for large models.

* [improvement][headless-fe] Chat: Enabled integration with agent configuration.

* [improvement][headless-fe] SQL formatter: Updated the import method.

* [improvement][headless-fe] login fixed

* [improvement][headless-fe] Agent: Optimized the logic for saving.

* [improvement][headless-fe] Model management: Integrated into the main theme domain.

* [improvement][headless-fe] Sensitivity: Added bulk modification functionality.

* [improvement][headless-fe] wording change

* [improvement][headless-fe] Prompt configuration: Added the ability to configure prompts.

* [improvement][headless-fe] Added the ability to configure embedding models.

* [improvement][headless-fe] hidden configure embedding models.

* [improvement][headless-fe] Connection test prompt update for large language model settings.

* [improvement][headless-fe]  add memory review config

* [improvement][headless-fe] Rollback of data structure for large language model configuration.

* [improvement][headless-fe] Added dependency relationships between various items in system configuration.

* [improvement][headless-fe] Added password parsing to the generation rules of system settings.

* [improvement][headless-fe] Added slider parsing to the generation rules of system settings.

* [improvement][headless-fe] Optimized the logic for initializing values in system settings.

* [improvement][headless-fe] Optimized the time format

* [improvement][headless-fe] Unified the SQL generation method for data sets to ensure consistency and improve efficiency.

* [improvement][headless-fe] Added support for data sets with non-partitioned time fields

* [improvement][headless-fe] Added support for editing time formats in dimension settings

* [improvement][headless-fe] Rolled back the time parameter in the metric details page to its previous state

* [improvement][headless-fe] Fixed the issue with hidden field validation when editing dimensions

* [improvement][headless-fe] Added a connectivity test for large models in the system settings

* [improvement][headless-fe] Changed the METRIC type in ChatContextType queryType to AGGREGATE

* [improvement][headless-fe] Added query and batch delete operations to the terminology management feature

* [improvement][headless-fe] Enhanced the memory management feature by adding sorting functionality and other optimization features.

* [improvement][headless-fe] Resolved the compatibility issue with the backend service where the updatedAt and other time fields were not being properly converted to the updated_at format for sorting purposes.

* [improvement][headless-fe] Added a configuration interface for large language models

* [improvement][headless-fe] Introduced a new configuration option in the assistant module specifically for large model applications.

* [improvement][headless-fe] Replaced the agentConfig with toolConfig

* [improvement][headless-fe] Resolved the issue with the test connection parameters for the large model configuration.

* [improvement][headless-fe] Implemented a new feature where the tool configuration types can be fetched from the backend API

* [improvement][headless-fe] Updated the dimension value settings to retrieve and display values from a dictionary.

* [improvement][headless-fe] Adjusted the pageSize of the dimension value settings list to 20.

* [improvement][headless-fe] Introduced a revamped configuration for the large model in the assistant module.

* [improvement][headless-fe] Added new functionality to the assistant's memory management system

* [improvement][headless-fe] Optimized the management of CSS styles in the assistant module.

* [improvement][headless] fixed build config

* [improvement][headless-fe] Revamped the dimension value settings in the assistant module.

---------

Co-authored-by: tristanliu <tristanliu@tencent.com>
2024-10-23 15:24:34 +08:00

448 lines
14 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 { 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<void>;
onCreateToolBtnClick?: () => void;
};
const defaultAgentConfig = {
simpleMode: false,
debugMode: true,
};
const AgentForm: React.FC<Props> = ({ 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<OptionsItem[]>([]);
const [currentChatModel, setCurrentChatModel] = useState<string>('');
const [defaultChatAppConfig, setDefaultChatAppConfig] = useState<ChatAppConfig>({});
const [formData, setFormData] = useState<any>({
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: (
<div className={styles.agentFormContainer}>
<FormItem
name="name"
label="名称"
rules={[{ required: true, message: '请输入助理名称' }]}
>
<Input placeholder="请输入助理名称" />
</FormItem>
<FormItem name="enableSearch" label="开启输入联想" valuePropName="checked" htmlFor="">
<Switch />
</FormItem>
<FormItem name="enableFeedback" label="开启用户确认" valuePropName="checked" htmlFor="">
<Switch />
</FormItem>
{/* <FormItem
name={['multiTurnConfig', 'enableMultiTurn']}
label="开启多轮对话"
valuePropName="checked"
>
<Switch />
</FormItem>
<FormItem name="enableMemoryReview" label="开启记忆评估" valuePropName="checked">
<Switch />
</FormItem> */}
<FormItem
name={['toolConfig', 'simpleMode']}
label="开启精简模式"
tooltip="精简模式下不可调整查询条件、不显示调试信息、不显示可视化组件"
valuePropName="checked"
htmlFor=""
>
<Switch />
</FormItem>
<FormItem
name={['toolConfig', 'debugMode']}
label="开启调试信息"
hidden={formData?.toolConfig?.simpleMode === true}
tooltip="包含Schema映射、SQL生成每阶段的关键信息"
valuePropName="checked"
htmlFor=""
>
<Switch />
</FormItem>
<FormItem name="examples" label="示例问题">
<div className={styles.paramsSection}>
{examples.map((example) => {
const { id, question } = example;
return (
<div className={styles.filterRow} key={id}>
<Input
placeholder="示例问题"
value={question}
className={styles.questionExample}
onChange={(e) => {
example.question = e.target.value;
setExamples([...examples]);
}}
allowClear
/>
<DeleteOutlined
onClick={() => {
setExamples(examples.filter((item) => item.id !== id));
}}
/>
</div>
);
})}
<Button
onClick={() => {
setExamples([...examples, { id: uuid() }]);
}}
>
<PlusOutlined />
</Button>
</div>
</FormItem>
<FormItem name="description" label="描述">
<TextArea placeholder="请输入助理描述" />
</FormItem>
</div>
),
},
{
label: '大模型配置',
key: 'modelConfig',
children: (
<div className={styles.agentFormContainer} style={{ width: '1200px', marginTop: 20 }}>
<div className={styles.agentFormTitle}>
<Space>
<MainTitleMark />
</Space>
</div>
<Space style={{ alignItems: 'start' }}>
{/* <Row> */}
{/* <Col flex="400px"> */}
<div style={{ width: 350 }}>
{modelTypeOptions.map((item) => {
return (
<div
className={`${styles.agentChatModelCell} ${
currentChatModel === item.value ? styles.agentChatModelCellActive : ''
}`}
onClick={() => {
setCurrentChatModel(item.value);
}}
>
<FormItem
name={['chatAppConfig', item.value, 'enable']}
label={item.label}
valuePropName="checked"
tooltip={item.description}
htmlFor=""
>
<Switch />
</FormItem>
</div>
);
})}
</div>
{/* </Col>
<Col flex="auto"> */}
<div style={{ width: 900 }}>
{modelTypeOptions.map((item) => {
return (
<div
key={`setting-${item.value}`}
style={{
display: currentChatModel === item.value ? 'block' : 'none',
}}
>
<FormItem
name={['chatAppConfig', item.value, 'chatModelId']}
label="应用模型"
tooltip={item.description}
>
<Select placeholder="" options={llmConfigListOptions} />
</FormItem>
<FormItem
name={['chatAppConfig', item.value, 'prompt']}
label={
<>
<Space>
<Tooltip
overlayInnerStyle={{ width: 400 }}
title={
<>
{tips.map((tip) => (
<div>{tip}</div>
))}
</>
}
>
<QuestionCircleOutlined />
</Tooltip>
</Space>
</>
}
>
<Input.TextArea style={{ minHeight: 600 }} />
</FormItem>
</div>
);
})}
</div>
{/* </Col> */}
{/* </Row> */}
</Space>
</div>
),
},
// {
// label: '提示词配置',
// key: 'promptConfig',
// children: (
// <div className={styles.agentFormContainer}>
// <FormItem
// name={['promptConfig', 'promptTemplate']}
// label={
// <>
// <Space>
// 提示词模板
// <Tooltip
// overlayInnerStyle={{ width: 400 }}
// title={
// <>
// {tips.map((tip) => (
// <div>{tip}</div>
// ))}
// </>
// }
// >
// <QuestionCircleOutlined />
// </Tooltip>
// </Space>
// </>
// }
// >
// <Input.TextArea style={{ minHeight: 600 }} />
// </FormItem>
// </div>
// ),
// },
{
label: '工具配置',
key: 'tools',
children: <ToolsSection currentAgent={editAgent} onSaveAgent={onSaveAgent} />,
},
{
label: '记忆管理',
key: 'memory',
children: <MemorySection agentId={editAgent?.id} />,
},
];
return (
<Form
{...layout}
form={form}
initialValues={formData}
onValuesChange={(value, values) => {
setFormData(values);
}}
className={globalStyles.supersonicForm}
>
<Tabs
tabBarExtraContent={
<Space>
{activeKey !== 'memory' && (
<Button
type="primary"
loading={saveLoading}
onClick={() => {
onOk();
}}
>
</Button>
)}
{activeKey === 'tools' && (
<Button
type="primary"
onClick={() => {
onCreateToolBtnClick?.();
}}
>
<PlusOutlined />
</Button>
)}
</Space>
}
defaultActiveKey="basic"
activeKey={activeKey}
onChange={(key) => {
setActiveKey(key);
}}
items={formTabList}
/>
</Form>
);
};
export default AgentForm;