mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 11:07:06 +00:00
(feature)(webapp) modify QL to SQL (#354)
This commit is contained in:
@@ -71,9 +71,9 @@ export type EntityDimensionType = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type SqlInfoType = {
|
export type SqlInfoType = {
|
||||||
s2QL: string;
|
s2SQL: string;
|
||||||
logicSql: string;
|
correctS2SQL: string;
|
||||||
querySql: string;
|
querySQL: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ChatContextType = {
|
export type ChatContextType = {
|
||||||
|
|||||||
@@ -130,14 +130,14 @@ const ParseTip: React.FC<Props> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`${prefixCls}-tip-content`}>
|
<div className={`${prefixCls}-tip-content`}>
|
||||||
{!!agentType && queryMode !== 'LLM_S2QL' ? (
|
{!!agentType && queryMode !== 'LLM_S2SQL' ? (
|
||||||
<div className={`${prefixCls}-tip-item`}>
|
<div className={`${prefixCls}-tip-item`}>
|
||||||
将由{agentType === 'plugin' ? '插件' : '内置'}工具
|
将由{agentType === 'plugin' ? '插件' : '内置'}工具
|
||||||
<span className={itemValueClass}>{agentName}</span>来解答
|
<span className={itemValueClass}>{agentName}</span>来解答
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{(queryMode?.includes('ENTITY') || queryMode === 'LLM_S2QL') &&
|
{(queryMode?.includes('ENTITY') || queryMode === 'LLM_S2SQL') &&
|
||||||
typeof entityId === 'string' &&
|
typeof entityId === 'string' &&
|
||||||
!!entityAlias &&
|
!!entityAlias &&
|
||||||
!!entityName ? (
|
!!entityName ? (
|
||||||
@@ -162,14 +162,14 @@ const ParseTip: React.FC<Props> = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{['METRIC_GROUPBY', 'METRIC_ORDERBY', 'ENTITY_DETAIL', 'LLM_S2QL'].includes(
|
{['METRIC_GROUPBY', 'METRIC_ORDERBY', 'ENTITY_DETAIL', 'LLM_S2SQL'].includes(
|
||||||
queryMode!
|
queryMode!
|
||||||
) &&
|
) &&
|
||||||
fields &&
|
fields &&
|
||||||
fields.length > 0 && (
|
fields.length > 0 && (
|
||||||
<div className={`${prefixCls}-tip-item`}>
|
<div className={`${prefixCls}-tip-item`}>
|
||||||
<div className={`${prefixCls}-tip-item-name`}>
|
<div className={`${prefixCls}-tip-item-name`}>
|
||||||
{queryMode === 'LLM_S2QL'
|
{queryMode === 'LLM_S2SQL'
|
||||||
? nativeQuery
|
? nativeQuery
|
||||||
? '查询字段'
|
? '查询字段'
|
||||||
: '下钻维度'
|
: '下钻维度'
|
||||||
@@ -275,7 +275,7 @@ const ParseTip: React.FC<Props> = ({
|
|||||||
const tipNode = (
|
const tipNode = (
|
||||||
<div className={`${prefixCls}-tip`}>
|
<div className={`${prefixCls}-tip`}>
|
||||||
{getTipNode()}
|
{getTipNode()}
|
||||||
{!(!!agentType && queryMode !== 'LLM_S2QL') && getFiltersNode()}
|
{!(!!agentType && queryMode !== 'LLM_S2SQL') && getFiltersNode()}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ const SqlItem: React.FC<Props> = ({ integrateSystem, sqlInfo, sqlTimeCost }) =>
|
|||||||
setSqlType('');
|
setSqlType('');
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!sqlInfo.s2QL && !sqlInfo.logicSql && !sqlInfo.querySql) {
|
if (!sqlInfo.s2SQL && !sqlInfo.correctS2SQL && !sqlInfo.querySQL) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,37 +49,37 @@ const SqlItem: React.FC<Props> = ({ integrateSystem, sqlInfo, sqlTimeCost }) =>
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className={`${tipPrefixCls}-content-options`}>
|
<div className={`${tipPrefixCls}-content-options`}>
|
||||||
{sqlInfo.s2QL && (
|
{sqlInfo.s2SQL && (
|
||||||
<div
|
<div
|
||||||
className={`${tipPrefixCls}-content-option ${
|
className={`${tipPrefixCls}-content-option ${
|
||||||
sqlType === 's2QL' ? `${tipPrefixCls}-content-option-active` : ''
|
sqlType === 's2SQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||||
}`}
|
}`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setSqlType(sqlType === 's2QL' ? '' : 's2QL');
|
setSqlType(sqlType === 's2SQL' ? '' : 's2SQL');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
解析S2QL
|
解析S2SQL
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{sqlInfo.logicSql && (
|
{sqlInfo.correctS2SQL && (
|
||||||
<div
|
<div
|
||||||
className={`${tipPrefixCls}-content-option ${
|
className={`${tipPrefixCls}-content-option ${
|
||||||
sqlType === 'logicSql' ? `${tipPrefixCls}-content-option-active` : ''
|
sqlType === 'correctS2SQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||||
}`}
|
}`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setSqlType(sqlType === 'logicSql' ? '' : 'logicSql');
|
setSqlType(sqlType === 'correctS2SQL' ? '' : 'correctS2SQL');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
修正S2QL
|
修正S2SQL
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{sqlInfo.querySql && (
|
{sqlInfo.querySQL && (
|
||||||
<div
|
<div
|
||||||
className={`${tipPrefixCls}-content-option ${
|
className={`${tipPrefixCls}-content-option ${
|
||||||
sqlType === 'querySql' ? `${tipPrefixCls}-content-option-active` : ''
|
sqlType === 'querySQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||||
}`}
|
}`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setSqlType(sqlType === 'querySql' ? '' : 'querySql');
|
setSqlType(sqlType === 'querySQL' ? '' : 'querySQL');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
执行SQL
|
执行SQL
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ const MetricCard: React.FC<Props> = ({ data, loading, onApplyAuth }) => {
|
|||||||
const prefixCls = `${PREFIX_CLS}-metric-card`;
|
const prefixCls = `${PREFIX_CLS}-metric-card`;
|
||||||
|
|
||||||
const matricCardClass = classNames(prefixCls, {
|
const matricCardClass = classNames(prefixCls, {
|
||||||
[`${PREFIX_CLS}-metric-card-dsl`]: queryMode === 'LLM_S2QL',
|
[`${PREFIX_CLS}-metric-card-dsl`]: queryMode === 'LLM_S2SQL',
|
||||||
});
|
});
|
||||||
|
|
||||||
const [isNumber, setIsNumber] = useState(false);
|
const [isNumber, setIsNumber] = useState(false);
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ const ChatMsg: React.FC<Props> = ({ queryId, data, chartIndex, triggerResize })
|
|||||||
const metricFields = columns.filter(item => item.showType === 'NUMBER');
|
const metricFields = columns.filter(item => item.showType === 'NUMBER');
|
||||||
|
|
||||||
const isDslMetricCard =
|
const isDslMetricCard =
|
||||||
queryMode === 'LLM_S2QL' && singleData && metricFields.length === 1 && columns.length === 1;
|
queryMode === 'LLM_S2SQL' && singleData && metricFields.length === 1 && columns.length === 1;
|
||||||
|
|
||||||
const isMetricCard = (queryMode.includes('METRIC') || isDslMetricCard) && singleData;
|
const isMetricCard = (queryMode.includes('METRIC') || isDslMetricCard) && singleData;
|
||||||
|
|
||||||
@@ -210,7 +210,7 @@ const ChatMsg: React.FC<Props> = ({ queryId, data, chartIndex, triggerResize })
|
|||||||
);
|
);
|
||||||
|
|
||||||
const isMultipleMetric =
|
const isMultipleMetric =
|
||||||
(queryMode.includes('METRIC') || queryMode === 'LLM_S2QL') &&
|
(queryMode.includes('METRIC') || queryMode === 'LLM_S2SQL') &&
|
||||||
recommendMetrics?.length > 0 &&
|
recommendMetrics?.length > 0 &&
|
||||||
queryColumns?.filter(column => column.showType === 'NUMBER').length === 1;
|
queryColumns?.filter(column => column.showType === 'NUMBER').length === 1;
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ const ToolModal: React.FC<Props> = ({ editTool, onSaveTool, onCancel }) => {
|
|||||||
<FormItem name="name" label="名称">
|
<FormItem name="name" label="名称">
|
||||||
<Input placeholder="请输入工具名称" />
|
<Input placeholder="请输入工具名称" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
{(toolType === AgentToolTypeEnum.RULE || toolType === AgentToolTypeEnum.LLM_S2QL) && (
|
{(toolType === AgentToolTypeEnum.RULE || toolType === AgentToolTypeEnum.LLM_S2SQL) && (
|
||||||
<FormItem name="modelIds" label="主题域">
|
<FormItem name="modelIds" label="主题域">
|
||||||
<Select
|
<Select
|
||||||
options={modelList.map((model) => ({ label: model.name, value: model.id }))}
|
options={modelList.map((model) => ({ label: model.name, value: model.id }))}
|
||||||
@@ -122,7 +122,7 @@ const ToolModal: React.FC<Props> = ({ editTool, onSaveTool, onCancel }) => {
|
|||||||
/>
|
/>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
{toolType === AgentToolTypeEnum.LLM_S2QL && (
|
{toolType === AgentToolTypeEnum.LLM_S2SQL && (
|
||||||
<FormItem name="exampleQuestions" label="示例问题">
|
<FormItem name="exampleQuestions" label="示例问题">
|
||||||
<div className={styles.paramsSection}>
|
<div className={styles.paramsSection}>
|
||||||
{examples.map((example) => {
|
{examples.map((example) => {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export type MetricOptionType = {
|
|||||||
|
|
||||||
export enum AgentToolTypeEnum {
|
export enum AgentToolTypeEnum {
|
||||||
RULE = 'RULE',
|
RULE = 'RULE',
|
||||||
LLM_S2QL = 'LLM_S2QL',
|
LLM_S2SQL = 'LLM_S2SQL',
|
||||||
PLUGIN = 'PLUGIN',
|
PLUGIN = 'PLUGIN',
|
||||||
INTERPRET = 'INTERPRET'
|
INTERPRET = 'INTERPRET'
|
||||||
}
|
}
|
||||||
@@ -29,7 +29,7 @@ export const AGENT_TOOL_TYPE_LIST = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '大模型语义解析',
|
label: '大模型语义解析',
|
||||||
value: AgentToolTypeEnum.LLM_S2QL
|
value: AgentToolTypeEnum.LLM_S2SQL
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '大模型指标解读',
|
label: '大模型指标解读',
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ const DetailModal: React.FC<Props> = ({ detail, onSubmit, onCancel }) => {
|
|||||||
}))}
|
}))}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
setPluginType(value);
|
setPluginType(value);
|
||||||
if (value === PluginTypeEnum.LLM_S2QL) {
|
if (value === PluginTypeEnum.LLM_S2SQL) {
|
||||||
form.setFieldsValue({ parseMode: ParseModeEnum.FUNCTION_CALL });
|
form.setFieldsValue({ parseMode: ParseModeEnum.FUNCTION_CALL });
|
||||||
setFunctionParams([
|
setFunctionParams([
|
||||||
{
|
{
|
||||||
@@ -243,7 +243,7 @@ const DetailModal: React.FC<Props> = ({ detail, onSubmit, onCancel }) => {
|
|||||||
<FormItem name="pattern" label="函数描述">
|
<FormItem name="pattern" label="函数描述">
|
||||||
<TextArea placeholder="请输入函数描述,多个描述换行分隔" allowClear />
|
<TextArea placeholder="请输入函数描述,多个描述换行分隔" allowClear />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
{/* <FormItem name="params" label="函数参数" hidden={pluginType === PluginTypeEnum.LLM_S2QL}>
|
{/* <FormItem name="params" label="函数参数" hidden={pluginType === PluginTypeEnum.LLM_S2SQL}>
|
||||||
<div className={styles.paramsSection}>
|
<div className={styles.paramsSection}>
|
||||||
{functionParams.map((functionParam: FunctionParamFormItemType) => {
|
{functionParams.map((functionParam: FunctionParamFormItemType) => {
|
||||||
const { id, name, type, description } = functionParam;
|
const { id, name, type, description } = functionParam;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
export const PLUGIN_TYPE_MAP = {
|
export const PLUGIN_TYPE_MAP = {
|
||||||
WEB_PAGE: 'Web页面',
|
WEB_PAGE: 'Web页面',
|
||||||
WEB_SERVICE: 'Web服务',
|
WEB_SERVICE: 'Web服务',
|
||||||
// LLM_S2QL: 'LLM语义解析',
|
// LLM_S2SQL: 'LLM语义解析',
|
||||||
// CONTENT_INTERPRET: '内容解读',
|
// CONTENT_INTERPRET: '内容解读',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export type PluginConfigType = {
|
|||||||
export enum PluginTypeEnum {
|
export enum PluginTypeEnum {
|
||||||
WEB_PAGE = 'WEB_PAGE',
|
WEB_PAGE = 'WEB_PAGE',
|
||||||
WEB_SERVICE = 'WEB_SERVICE',
|
WEB_SERVICE = 'WEB_SERVICE',
|
||||||
LLM_S2QL = 'LLM_S2QL'
|
LLM_S2SQL = 'LLM_S2SQL'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ParseModeEnum {
|
export enum ParseModeEnum {
|
||||||
|
|||||||
Reference in New Issue
Block a user