From 840de515a6d33ad2ca6ce998d3f5dbd77d2c662d Mon Sep 17 00:00:00 2001 From: tristanliu <37809633+sevenliu1896@users.noreply.github.com> Date: Wed, 30 Oct 2024 17:22:37 +0800 Subject: [PATCH] [improvement][headless-be] Optimized the logic for intent confirmation and streamlined mode in the question-answering dialogue of the assistant module. (#1860) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [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. * [improvement][headless-fe] Optimized the initialization process of dimension value settings in the assistant module. * [improvement][headless-fe] Added support for user confirmation mode in the question-answering dialogue of the assistant module. * [improvement][headless-be] As part of the ongoing improvements to the question-answering dialogue, the datasetId will now be included as a parameter in the API endpoint /api/chat/query/search for querying the question-answering dataset. * [improvement][headless-be] Optimized the logic for intent confirmation and streamlined mode in the question-answering dialogue of the assistant module. --------- Co-authored-by: tristanliu --- .../src/Chat/MessageContainer/index.tsx | 3 +- webapp/packages/chat-sdk/src/Chat/index.tsx | 1 + webapp/packages/chat-sdk/src/Chat/type.ts | 1 + .../components/ChatItem/ExpandParseTip.tsx | 205 ++++++++------ .../src/components/ChatItem/FilterItem.tsx | 5 + .../src/components/ChatItem/ParseTip.tsx | 7 +- .../src/components/ChatItem/index.tsx | 204 +++++++------ .../src/components/ChatItem/style.less | 11 +- .../chat-sdk/src/components/ChatMsg/index.tsx | 1 + webapp/packages/supersonic-fe/config/proxy.ts | 4 +- .../packages/supersonic-fe/config/routes.ts | 6 +- .../SemanticModel/Datasource/constants.ts | 18 ++ .../components/ModelRelationFormDrawer.tsx | 6 +- .../components/ClassDimensionTable.tsx | 126 ++++---- .../components/ClassMetricTable.tsx | 126 ++++---- .../components/DimensionValueSettingModal.tsx | 14 - .../DimensionValueSettingModal_backup.tsx | 268 ------------------ .../components/DomainManagerTab.tsx | 13 +- 18 files changed, 399 insertions(+), 620 deletions(-) delete mode 100644 webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DimensionValueSettingModal_backup.tsx diff --git a/webapp/packages/chat-sdk/src/Chat/MessageContainer/index.tsx b/webapp/packages/chat-sdk/src/Chat/MessageContainer/index.tsx index e0a609689..25fcf3b7f 100644 --- a/webapp/packages/chat-sdk/src/Chat/MessageContainer/index.tsx +++ b/webapp/packages/chat-sdk/src/Chat/MessageContainer/index.tsx @@ -45,7 +45,6 @@ const MessageContainer: React.FC = ({ onSendMsg, }) => { const [triggerResize, setTriggerResize] = useState(false); - const onResize = useCallback(() => { setTriggerResize(true); setTimeout(() => { @@ -71,6 +70,7 @@ const MessageContainer: React.FC = ({ {messageList.map((msgItem: MessageItem, index: number) => { const { id: msgId, + questionId, modelId, agentId, type, @@ -95,6 +95,7 @@ const MessageContainer: React.FC = ({ {identityMsg && } = ( const convertHistoryMsg = (list: HistoryMsgItemType[]) => { return list.map((item: HistoryMsgItemType) => ({ id: item.questionId, + questionId: item.questionId, type: MessageTypeEnum.QUESTION, msg: item.queryText, parseInfos: item.parseInfos, diff --git a/webapp/packages/chat-sdk/src/Chat/type.ts b/webapp/packages/chat-sdk/src/Chat/type.ts index 63b15efab..0d236440c 100644 --- a/webapp/packages/chat-sdk/src/Chat/type.ts +++ b/webapp/packages/chat-sdk/src/Chat/type.ts @@ -17,6 +17,7 @@ export type MessageItem = { id: string | number; type?: MessageTypeEnum; msg?: string; + questionId?: number; msgValue?: string; identityMsg?: string; modelId?: number; diff --git a/webapp/packages/chat-sdk/src/components/ChatItem/ExpandParseTip.tsx b/webapp/packages/chat-sdk/src/components/ChatItem/ExpandParseTip.tsx index 88f7c9a76..38475f724 100644 --- a/webapp/packages/chat-sdk/src/components/ChatItem/ExpandParseTip.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatItem/ExpandParseTip.tsx @@ -1,7 +1,7 @@ import React, { ReactNode } from 'react'; import { ChatContextType, DateInfoType, EntityInfoType, FilterItemType } from '../../common/type'; -import { Button, DatePicker, Row, Col, Tag } from 'antd'; -import { CheckCircleFilled, CloseCircleFilled, ReloadOutlined } from '@ant-design/icons'; +import { Button, DatePicker, Row, Col } from 'antd'; +import { CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons'; import Loading from './Loading'; import FilterItem from './FilterItem'; import classNames from 'classnames'; @@ -9,6 +9,7 @@ import { isMobile } from '../../utils/utils'; import dayjs, { Dayjs } from 'dayjs'; import quarterOfYear from 'dayjs/plugin/quarterOfYear'; import { prefixCls, getTipNode } from './ParseTipUtils'; +import MarkDown from '../ChatMsg/MarkDown'; import 'dayjs/locale/zh-cn'; @@ -18,14 +19,10 @@ dayjs.locale('zh-cn'); const { RangePicker } = DatePicker; type Props = { - parseLoading: boolean; + isSimpleMode?: boolean; parseInfoOptions: ChatContextType[]; - parseTip: string; currentParseInfo?: ChatContextType; agentId?: number; - dimensionFilters: FilterItemType[]; - dateInfo: DateInfoType; - entityInfo: EntityInfoType; integrateSystem?: string; parseTimeCost?: number; isDeveloper?: boolean; @@ -41,14 +38,10 @@ type RangeValue = [Dayjs, Dayjs]; type RangeKeys = '近7日' | '近14日' | '近30日' | '本周' | '本月' | '上月' | '本季度' | '本年'; const ExpandParseTip: React.FC = ({ - parseLoading, + isSimpleMode = false, parseInfoOptions, - parseTip, currentParseInfo, agentId, - dimensionFilters, - dateInfo, - entityInfo, integrateSystem, parseTimeCost, isDeveloper, @@ -76,21 +69,26 @@ const ExpandParseTip: React.FC = ({ const getNode = (tipTitle: ReactNode, tipNode?: ReactNode, failed?: boolean) => { return (
-
- {!failed ? ( - - ) : ( - - )} -
- {tipTitle} - {tipNode === undefined && } + {isSimpleMode ? ( + <> + ) : ( +
+ {!failed ? ( + + ) : ( + + )} +
+ {tipTitle} + {tipNode === undefined && } +
-
+ )} + {(tipNode || tipNode === null) && (
= ({ ); }; - if (parseLoading) { - return getNode('意图解析中'); - } - - if (parseTip) { - return getNode( - <> - 意图解析失败 - {!!parseTimeCost && isDeveloper && ( - (耗时: {parseTimeCost}ms) - )} - , - parseTip, - true - ); - } - - if (parseInfoOptions.length === 0) { - return null; - } - const { modelId, queryMode, entity, nativeQuery } = currentParseInfo || {}; const entityAlias = entity?.alias?.[0]?.split('.')?.[0]; - const getFilterContent = (filters: any) => { + const getFilterContent = (filters: any, dateInfo: DateInfoType) => { const itemValueClass = `${prefixCls}-tip-item-value`; const { startDate, endDate } = dateInfo || {}; const tipItemOptionClass = classNames(`${prefixCls}-tip-item-option`, { [`${prefixCls}-mobile-tip-item-option`]: isMobile, }); + const disabled = true; return (
{!!dateInfo && ( @@ -147,6 +125,7 @@ const ExpandParseTip: React.FC = ({ value={[dayjs(startDate), dayjs(endDate)]} onChange={onDateInfoChange} format="YYYY-MM-DD" + disabled={disabled} renderExtraFooter={() => ( {Object.keys(ranges).map(key => ( @@ -167,6 +146,7 @@ const ExpandParseTip: React.FC = ({ )} {filters?.map((filter: any, index: number) => ( = ({ }; const getFiltersNode = parseInfo => { + const { dateInfo, dimensionFilters } = parseInfo; return ( <> {(!!dateInfo || !!dimensionFilters?.length) && (
筛选条件:
- {getFilterContent(dimensionFilters)} + {getFilterContent(dimensionFilters, dateInfo)}
)} @@ -202,59 +183,109 @@ const ExpandParseTip: React.FC = ({ return getNode(
- 意图解析 + 意图确认 {!!parseTimeCost && isDeveloper && ( (耗时: {parseTimeCost}ms) )}
, - queryMode === 'PLAIN_TEXT' ? null : ( - <> -
- {parseInfoOptions.map((parseInfo, index) => { - const { queryMode, properties } = parseInfo || {}; - const { type: agentType } = properties || {}; - return ( -
-
- - 解析{index + 1}: - -
-
+ + <> +
+ {parseInfoOptions.map((parseInfo, index) => { + const { queryMode, properties, textInfo, id, dimensionFilters, entityInfo } = + parseInfo || {}; + const { type: agentType } = properties || {}; + return isSimpleMode ? ( + <> +
+ + 解析{index + 1}: {' '} + + +
+ + ) : ( +
+
+ + 解析{index + 1}: + +
+
+ <> {getTipNode({ parseInfo, dimensionFilters, entityInfo })} {!(!!agentType && queryMode !== 'LLM_S2SQL') && getFiltersNode(parseInfo)} -
+
- ); - })} - {parseInfoOptions?.length > 1 && ( -
-
+
+ ); + })} + {/* {parseInfoOptions.map((parseInfo, index) => { + const { queryMode, properties, textInfo, id, dimensionFilters, entityInfo } = + parseInfo || {}; + const { type: agentType } = properties || {}; + return ( +
+
+ + 解析{index + 1}: + +
+
+ {isSimpleMode ? ( + + ) : ( + <> + {getTipNode({ parseInfo, dimensionFilters, entityInfo })} + {!(!!agentType && queryMode !== 'LLM_S2SQL') && getFiltersNode(parseInfo)} + + )} +
+
+ ); + })} */} + {parseInfoOptions?.length > 1 && ( +
+
+ {!currentParseInfo && ( 请选择适合的解析意图,并进行下一步: - {parseInfoOptions.map((parseInfo, index) => ( -
{ - onSelectParseInfo(parseInfo); - }} - key={parseInfo.id} - > - 解析{index + 1} -
- ))} -
+ )} + + {parseInfoOptions.map((parseInfo, index) => ( +
{ + if (currentParseInfo) { + return; + } + onSelectParseInfo(parseInfo); + }} + key={parseInfo.id} + > + 解析{index + 1} +
+ ))}
- )} -
- - ) +
+ )} +
+ ); }; diff --git a/webapp/packages/chat-sdk/src/components/ChatItem/FilterItem.tsx b/webapp/packages/chat-sdk/src/components/ChatItem/FilterItem.tsx index b40c3c4da..d2b7a96b7 100644 --- a/webapp/packages/chat-sdk/src/components/ChatItem/FilterItem.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatItem/FilterItem.tsx @@ -14,6 +14,7 @@ type Props = { index: number; chatContext: ChatContextType; agentId?: number; + disabled?: boolean; entityAlias?: string; integrateSystem?: string; onFiltersChange: (filters: FilterItemType[]) => void; @@ -21,6 +22,7 @@ type Props = { }; const FilterItem: React.FC = ({ + disabled = false, modelId, filters, filter, @@ -151,6 +153,7 @@ const FilterItem: React.FC = ({ { label: '小于等于', value: '<=' }, { label: '小于', value: '<' }, ]} + disabled={disabled} className={`${prefixCls}-operator-control`} value={filter.operator} onChange={onOperatorChange} @@ -159,6 +162,7 @@ const FilterItem: React.FC = ({ {(typeof filter.value === 'number' || filter.value === null) && !filter.bizName?.includes('_id') ? ( = ({ ) : (typeof filter.value === 'string' || isArray(filter.value)) && !filter.bizName?.includes('_id') ? ( { - setFilterParams((preState) => { - return { - ...preState, - sensitiveLevel: value, - }; - }); - }} - /> - ), - }, - { - label: '是否为标签', - component: ( - { + setFilterParams((preState) => { + return { + ...preState, + sensitiveLevel: value, + }; + }); + }} + /> + ), + }, + { + label: '是否为标签', + component: ( + { - setFilterParams((preState) => { - return { - ...preState, - sensitiveLevel: value, - }; - }); - }} - /> - ), - }, - { - label: '是否为标签', - component: ( - { + setFilterParams((preState) => { + return { + ...preState, + sensitiveLevel: value, + }; + }); + }} + /> + ), + }, + { + label: '是否为标签', + component: ( +