mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:18:23 +00:00
Merge pull request #2306 from 1985312383/master
(improvement)(headless | chat | launchers | webapp) Added assistant function! Call LLM to optimize SQL code performance before final SQL execution
This commit is contained in:
@@ -43,10 +43,26 @@ if "%service%"=="webapp" (
|
||||
call mvn -f %projectDir% clean package -DskipTests -Dspotless.skip=true
|
||||
IF ERRORLEVEL 1 (
|
||||
ECHO Failed to build backend Java modules.
|
||||
ECHO Please check Maven and Java versions are compatible.
|
||||
ECHO Current Java: %JAVA_HOME%
|
||||
ECHO Current Maven: %MAVEN_HOME%
|
||||
EXIT /B 1
|
||||
)
|
||||
|
||||
REM extract and copy files to deployment directory
|
||||
cd %projectDir%\launchers\%model_name%\target
|
||||
if exist "launchers-%model_name%-%MVN_VERSION%-bin.tar.gz" (
|
||||
echo "Extracting launchers-%model_name%-%MVN_VERSION%-bin.tar.gz..."
|
||||
tar -xf "launchers-%model_name%-%MVN_VERSION%-bin.tar.gz"
|
||||
if exist "launchers-%model_name%-%MVN_VERSION%" (
|
||||
echo "Copying files to deployment directory..."
|
||||
xcopy /E /Y "launchers-%model_name%-%MVN_VERSION%\*" "%buildDir%\supersonic-%model_name%-%MVN_VERSION%\"
|
||||
)
|
||||
)
|
||||
|
||||
copy /y %projectDir%\launchers\%model_name%\target\*.tar.gz %buildDir%\
|
||||
echo "finished building supersonic-%model_name% service"
|
||||
cd %baseDir%
|
||||
goto :EOF
|
||||
|
||||
|
||||
@@ -72,22 +88,55 @@ if "%service%"=="webapp" (
|
||||
cd %buildDir%
|
||||
if exist %release_dir% rmdir /s /q %release_dir%
|
||||
if exist %release_dir%.zip del %release_dir%.zip
|
||||
mkdir %release_dir%
|
||||
rem package webapp
|
||||
tar xvf supersonic-webapp.tar.gz
|
||||
move /y supersonic-webapp webapp
|
||||
echo {"env": ""} > webapp\supersonic.config.json
|
||||
move /y webapp %release_dir%
|
||||
rem package java service
|
||||
tar xvf %service_name%-bin.tar.gz
|
||||
for /d %%D in ("%service_name%\*") do (
|
||||
move "%%D" "%release_dir%"
|
||||
|
||||
rem check if release directory already exists from buildJavaService
|
||||
if exist %release_dir% (
|
||||
echo "Release directory already prepared by buildJavaService"
|
||||
) else (
|
||||
mkdir %release_dir%
|
||||
|
||||
rem package java service
|
||||
tar xvf %service_name%-bin.tar.gz 2>nul
|
||||
if errorlevel 1 (
|
||||
echo "Warning: tar command failed, trying PowerShell extraction..."
|
||||
powershell -Command "Expand-Archive -Path '%service_name%-bin.tar.gz' -DestinationPath '.' -Force"
|
||||
)
|
||||
for /d %%D in ("%service_name%\*") do (
|
||||
move "%%D" "%release_dir%"
|
||||
)
|
||||
rmdir /s /q %service_name% 2>nul
|
||||
)
|
||||
|
||||
rem package webapp
|
||||
if exist supersonic-webapp.tar.gz (
|
||||
tar xvf supersonic-webapp.tar.gz 2>nul
|
||||
if errorlevel 1 (
|
||||
echo "Warning: tar command failed, trying PowerShell extraction..."
|
||||
powershell -Command "Expand-Archive -Path 'supersonic-webapp.tar.gz' -DestinationPath '.' -Force"
|
||||
)
|
||||
move /y supersonic-webapp webapp
|
||||
echo {"env": ""} > webapp\supersonic.config.json
|
||||
move /y webapp %release_dir%
|
||||
del supersonic-webapp.tar.gz 2>nul
|
||||
)
|
||||
|
||||
rem verify deployment structure
|
||||
if exist "%release_dir%\lib\launchers-%model_name%-%MVN_VERSION%.jar" (
|
||||
echo "Deployment structure verified successfully"
|
||||
) else (
|
||||
echo "Warning: Main jar file not found in deployment structure"
|
||||
echo "Expected: %release_dir%\lib\launchers-%model_name%-%MVN_VERSION%.jar"
|
||||
)
|
||||
|
||||
rem generate zip file
|
||||
powershell Compress-Archive -Path %release_dir% -DestinationPath %release_dir%.zip
|
||||
del %service_name%-bin.tar.gz
|
||||
del supersonic-webapp.tar.gz
|
||||
rmdir /s /q %service_name%
|
||||
powershell -Command "Compress-Archive -Path '%release_dir%' -DestinationPath '%release_dir%.zip' -Force"
|
||||
if errorlevel 1 (
|
||||
echo "Warning: PowerShell compression failed, release directory still available: %release_dir%"
|
||||
) else (
|
||||
echo "Successfully created release package: %release_dir%.zip"
|
||||
)
|
||||
|
||||
del %service_name%-bin.tar.gz 2>nul
|
||||
echo "finished packaging supersonic release"
|
||||
goto :EOF
|
||||
|
||||
|
||||
@@ -75,8 +75,12 @@ public class SqlExecutor implements ChatQueryExecutor {
|
||||
return null;
|
||||
}
|
||||
|
||||
QuerySqlReq sqlReq =
|
||||
QuerySqlReq.builder().sql(parseInfo.getSqlInfo().getCorrectedS2SQL()).build();
|
||||
// 使用querySQL,它已经包含了所有修正(包括物理SQL修正)
|
||||
String finalSql = StringUtils.isNotBlank(parseInfo.getSqlInfo().getQuerySQL())
|
||||
? parseInfo.getSqlInfo().getQuerySQL()
|
||||
: parseInfo.getSqlInfo().getCorrectedS2SQL();
|
||||
|
||||
QuerySqlReq sqlReq = QuerySqlReq.builder().sql(finalSql).build();
|
||||
sqlReq.setSqlInfo(parseInfo.getSqlInfo());
|
||||
sqlReq.setDataSetId(parseInfo.getDataSetId());
|
||||
|
||||
@@ -90,7 +94,7 @@ public class SqlExecutor implements ChatQueryExecutor {
|
||||
queryResult.setQueryTimeCost(System.currentTimeMillis() - startTime);
|
||||
if (queryResp != null) {
|
||||
queryResult.setQueryAuthorization(queryResp.getQueryAuthorization());
|
||||
queryResult.setQuerySql(queryResp.getSql());
|
||||
queryResult.setQuerySql(finalSql);
|
||||
queryResult.setQueryResults(queryResp.getResultList());
|
||||
queryResult.setQueryColumns(queryResp.getColumns());
|
||||
queryResult.setQueryState(QueryState.SUCCESS);
|
||||
|
||||
@@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
@@ -39,6 +40,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentDOMapper, AgentDO> implem
|
||||
private MemoryService memoryService;
|
||||
|
||||
@Autowired
|
||||
@Lazy
|
||||
private ChatQueryService chatQueryService;
|
||||
|
||||
@Autowired
|
||||
|
||||
@@ -49,6 +49,7 @@ import net.sf.jsqlparser.schema.Column;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
@@ -66,6 +67,7 @@ public class ChatQueryServiceImpl implements ChatQueryService {
|
||||
@Autowired
|
||||
private SemanticLayerService semanticLayerService;
|
||||
@Autowired
|
||||
@Lazy
|
||||
private AgentService agentService;
|
||||
|
||||
private final List<ChatQueryParser> chatQueryParsers = ComponentFactory.getChatParsers();
|
||||
|
||||
@@ -16,4 +16,7 @@ public class SqlInfo implements Serializable {
|
||||
|
||||
// SQL to be executed finally
|
||||
private String querySQL;
|
||||
|
||||
// Physical SQL corrected by LLM for performance optimization
|
||||
private String correctedQuerySQL;
|
||||
}
|
||||
|
||||
@@ -8,5 +8,6 @@ public enum ChatWorkflowState {
|
||||
VALIDATING,
|
||||
SQL_CORRECTING,
|
||||
PROCESSING,
|
||||
PHYSICAL_SQL_CORRECTING,
|
||||
FINISHED
|
||||
}
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
package com.tencent.supersonic.headless.chat.corrector;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.ChatApp;
|
||||
import com.tencent.supersonic.common.pojo.enums.AppModule;
|
||||
import com.tencent.supersonic.common.util.ChatAppManager;
|
||||
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
|
||||
import com.tencent.supersonic.headless.chat.ChatQueryContext;
|
||||
import dev.langchain4j.model.chat.ChatLanguageModel;
|
||||
import dev.langchain4j.model.input.Prompt;
|
||||
import dev.langchain4j.model.input.PromptTemplate;
|
||||
import dev.langchain4j.model.output.structured.Description;
|
||||
import dev.langchain4j.provider.ModelProvider;
|
||||
import dev.langchain4j.service.AiServices;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 物理SQL修正器 - 使用LLM优化物理SQL性能
|
||||
*/
|
||||
@Slf4j
|
||||
public class LLMPhysicalSqlCorrector extends BaseSemanticCorrector {
|
||||
|
||||
private static final Logger keyPipelineLog = LoggerFactory.getLogger("keyPipeline");
|
||||
|
||||
public static final String APP_KEY = "PHYSICAL_SQL_CORRECTOR";
|
||||
private static final String INSTRUCTION = ""
|
||||
+ "#Role: You are a senior database performance optimization expert experienced in SQL tuning."
|
||||
+ "\n\n#Task: You will be provided with a user question and the corresponding physical SQL query,"
|
||||
+ " please analyze and optimize this SQL to improve query performance." + "\n\n#Rules:"
|
||||
+ "\n1. DO NOT add or introduce any new fields, columns, or aliases that are not in the original SQL."
|
||||
+ "\n2. Push WHERE conditions into JOIN ON clauses when possible to reduce intermediate result sets."
|
||||
+ "\n3. Optimize JOIN order by placing smaller tables or tables with selective conditions first."
|
||||
+ "\n4. For date range conditions, ensure they are applied as early as possible in the query execution."
|
||||
+ "\n5. Remove or comment out database-specific index hints (like USE INDEX) that may cause syntax errors."
|
||||
+ "\n6. ONLY modify the structure and order of existing elements, do not change field names or add new ones."
|
||||
+ "\n7. Ensure the optimized SQL is syntactically correct and logically equivalent to the original."
|
||||
+ "\n\n#Question: {{question}}" + "\n\n#OriginalSQL: {{sql}}";
|
||||
|
||||
public LLMPhysicalSqlCorrector() {
|
||||
ChatAppManager.register(APP_KEY, ChatApp.builder().prompt(INSTRUCTION).name("物理SQL修正")
|
||||
.appModule(AppModule.CHAT).description("通过大模型对物理SQL做性能优化").enable(false).build());
|
||||
}
|
||||
|
||||
@Data
|
||||
@ToString
|
||||
static class PhysicalSql {
|
||||
@Description("either positive or negative")
|
||||
private String opinion;
|
||||
|
||||
@Description("optimized sql if negative")
|
||||
private String sql;
|
||||
}
|
||||
|
||||
interface PhysicalSqlExtractor {
|
||||
PhysicalSql generatePhysicalSql(String text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doCorrect(ChatQueryContext chatQueryContext, SemanticParseInfo semanticParseInfo) {
|
||||
ChatApp chatApp = chatQueryContext.getRequest().getChatAppConfig().get(APP_KEY);
|
||||
if (!chatQueryContext.getRequest().getText2SQLType().enableLLM() || Objects.isNull(chatApp)
|
||||
|| !chatApp.isEnable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
ChatLanguageModel chatLanguageModel =
|
||||
ModelProvider.getChatModel(chatApp.getChatModelConfig());
|
||||
PhysicalSqlExtractor extractor =
|
||||
AiServices.create(PhysicalSqlExtractor.class, chatLanguageModel);
|
||||
Prompt prompt = generatePrompt(chatQueryContext.getRequest().getQueryText(),
|
||||
semanticParseInfo, chatApp.getPrompt());
|
||||
PhysicalSql physicalSql =
|
||||
extractor.generatePhysicalSql(prompt.toUserMessage().singleText());
|
||||
keyPipelineLog.info("LLMPhysicalSqlCorrector modelReq:\n{} \nmodelResp:\n{}", prompt.text(),
|
||||
physicalSql);
|
||||
if ("NEGATIVE".equalsIgnoreCase(physicalSql.getOpinion())
|
||||
&& StringUtils.isNotBlank(physicalSql.getSql())) {
|
||||
semanticParseInfo.getSqlInfo().setCorrectedQuerySQL(physicalSql.getSql());
|
||||
}
|
||||
}
|
||||
|
||||
private Prompt generatePrompt(String queryText, SemanticParseInfo semanticParseInfo,
|
||||
String promptTemplate) {
|
||||
Map<String, Object> variable = new HashMap<>();
|
||||
variable.put("question", queryText);
|
||||
variable.put("sql", semanticParseInfo.getSqlInfo().getQuerySQL());
|
||||
|
||||
return PromptTemplate.from(promptTemplate).apply(variable);
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticTranslateResp;
|
||||
import com.tencent.supersonic.headless.chat.ChatQueryContext;
|
||||
import com.tencent.supersonic.headless.chat.corrector.LLMPhysicalSqlCorrector;
|
||||
import com.tencent.supersonic.headless.chat.corrector.SemanticCorrector;
|
||||
import com.tencent.supersonic.headless.chat.mapper.SchemaMapper;
|
||||
import com.tencent.supersonic.headless.chat.parser.SemanticParser;
|
||||
@@ -76,6 +77,10 @@ public class ChatWorkflowEngine {
|
||||
long start = System.currentTimeMillis();
|
||||
performTranslating(queryCtx, parseResult);
|
||||
parseResult.getParseTimeCost().setSqlTime(System.currentTimeMillis() - start);
|
||||
queryCtx.setChatWorkflowState(ChatWorkflowState.PHYSICAL_SQL_CORRECTING);
|
||||
break;
|
||||
case PHYSICAL_SQL_CORRECTING:
|
||||
performPhysicalSqlCorrecting(queryCtx);
|
||||
queryCtx.setChatWorkflowState(ChatWorkflowState.FINISHED);
|
||||
break;
|
||||
default:
|
||||
@@ -162,4 +167,25 @@ public class ChatWorkflowEngine {
|
||||
parseResult.setErrorMsg(String.join("\n", errorMsg));
|
||||
}
|
||||
}
|
||||
|
||||
private void performPhysicalSqlCorrecting(ChatQueryContext queryCtx) {
|
||||
List<SemanticQuery> candidateQueries = queryCtx.getCandidateQueries();
|
||||
if (CollectionUtils.isNotEmpty(candidateQueries)) {
|
||||
for (SemanticQuery semanticQuery : candidateQueries) {
|
||||
for (SemanticCorrector corrector : semanticCorrectors) {
|
||||
if (corrector instanceof LLMPhysicalSqlCorrector) {
|
||||
corrector.correct(queryCtx, semanticQuery.getParseInfo());
|
||||
// 如果物理SQL被修正了,更新querySQL为修正后的版本
|
||||
SemanticParseInfo parseInfo = semanticQuery.getParseInfo();
|
||||
if (StringUtils.isNotBlank(parseInfo.getSqlInfo().getCorrectedQuerySQL())) {
|
||||
parseInfo.getSqlInfo().setQuerySQL(parseInfo.getSqlInfo().getCorrectedQuerySQL());
|
||||
log.info("Physical SQL corrected and updated querySQL: {}",
|
||||
parseInfo.getSqlInfo().getQuerySQL());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ com.tencent.supersonic.headless.chat.parser.SemanticParser=\
|
||||
|
||||
com.tencent.supersonic.headless.chat.corrector.SemanticCorrector=\
|
||||
com.tencent.supersonic.headless.chat.corrector.RuleSqlCorrector,\
|
||||
com.tencent.supersonic.headless.chat.corrector.LLMSqlCorrector
|
||||
com.tencent.supersonic.headless.chat.corrector.LLMSqlCorrector,\
|
||||
com.tencent.supersonic.headless.chat.corrector.LLMPhysicalSqlCorrector
|
||||
|
||||
com.tencent.supersonic.headless.chat.knowledge.file.FileHandler=\
|
||||
com.tencent.supersonic.headless.chat.knowledge.file.FileHandlerImpl
|
||||
|
||||
@@ -15,7 +15,8 @@ com.tencent.supersonic.headless.chat.parser.SemanticParser=\
|
||||
|
||||
com.tencent.supersonic.headless.chat.corrector.SemanticCorrector=\
|
||||
com.tencent.supersonic.headless.chat.corrector.RuleSqlCorrector,\
|
||||
com.tencent.supersonic.headless.chat.corrector.LLMSqlCorrector
|
||||
com.tencent.supersonic.headless.chat.corrector.LLMSqlCorrector,\
|
||||
com.tencent.supersonic.headless.chat.corrector.LLMPhysicalSqlCorrector
|
||||
|
||||
com.tencent.supersonic.headless.chat.knowledge.file.FileHandler=\
|
||||
com.tencent.supersonic.headless.chat.knowledge.file.FileHandlerImpl
|
||||
|
||||
10
pom.xml
10
pom.xml
@@ -10,9 +10,9 @@
|
||||
<version>${revision}</version>
|
||||
|
||||
<modules>
|
||||
<module>common</module>
|
||||
<module>auth</module>
|
||||
<module>chat</module>
|
||||
<module>common</module>
|
||||
<module>launchers</module>
|
||||
<module>headless</module>
|
||||
</modules>
|
||||
@@ -31,6 +31,7 @@
|
||||
<java.target.version>21</java.target.version>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<maven.compiler.release>21</maven.compiler.release>
|
||||
<file.encoding>UTF-8</file.encoding>
|
||||
<jsqlparser.version>4.9</jsqlparser.version>
|
||||
<pagehelper.version>6.1.0</pagehelper.version>
|
||||
@@ -254,6 +255,13 @@
|
||||
<source>${java.source.version}</source>
|
||||
<target>${java.target.version}</target>
|
||||
<encoding>${file.encoding}</encoding>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
|
||||
5
webapp/package.json
Normal file
5
webapp/package.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"supersonic-chat-sdk": "link:packages/chat-sdk"
|
||||
}
|
||||
}
|
||||
@@ -79,6 +79,7 @@ export type SqlInfoType = {
|
||||
parsedS2SQL: string;
|
||||
correctedS2SQL: string;
|
||||
querySQL: string;
|
||||
correctedQuerySQL?: string;
|
||||
};
|
||||
|
||||
export type ChatContextType = {
|
||||
|
||||
@@ -58,32 +58,28 @@ const SqlItem: React.FC<Props> = ({
|
||||
const getSchemaMapText = () => {
|
||||
return `
|
||||
Schema映射
|
||||
${schema?.fieldNameList?.length > 0 ? `名称:${schema.fieldNameList.join('、')}` : ''}${
|
||||
schema?.values?.length > 0
|
||||
${schema?.fieldNameList?.length > 0 ? `名称:${schema.fieldNameList.join('、')}` : ''}${schema?.values?.length > 0
|
||||
? `
|
||||
取值:${schema.values
|
||||
.map((item: any) => {
|
||||
return `${item.fieldName}: ${item.fieldValue}`;
|
||||
})
|
||||
.join('、')}`
|
||||
.map((item: any) => {
|
||||
return `${item.fieldName}: ${item.fieldValue}`;
|
||||
})
|
||||
.join('、')}`
|
||||
: ''
|
||||
}${
|
||||
priorExts
|
||||
}${priorExts
|
||||
? `
|
||||
附加:${priorExts}`
|
||||
: ''
|
||||
}${
|
||||
terms?.length > 0
|
||||
}${terms?.length > 0
|
||||
? `
|
||||
术语:${terms
|
||||
.map((item: any) => {
|
||||
return `${item.name}${item.alias?.length > 0 ? `(${item.alias.join(',')})` : ''}: ${
|
||||
item.description
|
||||
.map((item: any) => {
|
||||
return `${item.name}${item.alias?.length > 0 ? `(${item.alias.join(',')})` : ''}: ${item.description
|
||||
}`;
|
||||
})
|
||||
.join('、')}`
|
||||
})
|
||||
.join('、')}`
|
||||
: ''
|
||||
}
|
||||
}
|
||||
|
||||
`;
|
||||
};
|
||||
@@ -91,16 +87,16 @@ ${schema?.fieldNameList?.length > 0 ? `名称:${schema.fieldNameList.join('、
|
||||
const getFewShotText = () => {
|
||||
return `
|
||||
Few-shot示例${fewShots
|
||||
.map((item: any, index: number) => {
|
||||
return `
|
||||
.map((item: any, index: number) => {
|
||||
return `
|
||||
|
||||
示例${index + 1}:
|
||||
问题:${item.question}
|
||||
SQL:
|
||||
${format(item.sql)}
|
||||
`;
|
||||
})
|
||||
.join('')}
|
||||
})
|
||||
.join('')}
|
||||
`;
|
||||
};
|
||||
|
||||
@@ -120,6 +116,14 @@ ${format(sqlInfo.correctedS2SQL)}
|
||||
`;
|
||||
};
|
||||
|
||||
const getCorrectedQuerySQLText = () => {
|
||||
return `
|
||||
物理SQL修正
|
||||
|
||||
${format(sqlInfo.correctedQuerySQL || '')}
|
||||
`;
|
||||
};
|
||||
|
||||
const getQuerySQLText = () => {
|
||||
return `
|
||||
最终执行SQL
|
||||
@@ -155,6 +159,9 @@ ${executeErrorMsg}
|
||||
if (sqlInfo.correctedS2SQL) {
|
||||
text += getCorrectedS2SQLText();
|
||||
}
|
||||
if (sqlInfo.correctedQuerySQL) {
|
||||
text += getCorrectedQuerySQLText();
|
||||
}
|
||||
if (sqlInfo.querySQL) {
|
||||
text += getQuerySQLText();
|
||||
}
|
||||
@@ -183,9 +190,8 @@ ${executeErrorMsg}
|
||||
<div className={`${tipPrefixCls}-content-options`}>
|
||||
{llmReq && (
|
||||
<div
|
||||
className={`${tipPrefixCls}-content-option ${
|
||||
sqlType === 'schemaMap' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
className={`${tipPrefixCls}-content-option ${sqlType === 'schemaMap' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
onClick={() => {
|
||||
setSqlType(sqlType === 'schemaMap' ? '' : 'schemaMap');
|
||||
}}
|
||||
@@ -195,9 +201,8 @@ ${executeErrorMsg}
|
||||
)}
|
||||
{fewShots.length > 0 && (
|
||||
<div
|
||||
className={`${tipPrefixCls}-content-option ${
|
||||
sqlType === 'fewShots' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
className={`${tipPrefixCls}-content-option ${sqlType === 'fewShots' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
onClick={() => {
|
||||
setSqlType(sqlType === 'fewShots' ? '' : 'fewShots');
|
||||
}}
|
||||
@@ -207,9 +212,8 @@ ${executeErrorMsg}
|
||||
)}
|
||||
{sqlInfo.parsedS2SQL && (
|
||||
<div
|
||||
className={`${tipPrefixCls}-content-option ${
|
||||
sqlType === 'parsedS2SQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
className={`${tipPrefixCls}-content-option ${sqlType === 'parsedS2SQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
onClick={() => {
|
||||
setSqlType(sqlType === 'parsedS2SQL' ? '' : 'parsedS2SQL');
|
||||
}}
|
||||
@@ -219,9 +223,8 @@ ${executeErrorMsg}
|
||||
)}
|
||||
{sqlInfo.correctedS2SQL && (
|
||||
<div
|
||||
className={`${tipPrefixCls}-content-option ${
|
||||
sqlType === 'correctedS2SQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
className={`${tipPrefixCls}-content-option ${sqlType === 'correctedS2SQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
onClick={() => {
|
||||
setSqlType(sqlType === 'correctedS2SQL' ? '' : 'correctedS2SQL');
|
||||
}}
|
||||
@@ -229,16 +232,26 @@ ${executeErrorMsg}
|
||||
修正S2SQL
|
||||
</div>
|
||||
)}
|
||||
{sqlInfo.correctedQuerySQL && (
|
||||
<div
|
||||
className={`${tipPrefixCls}-content-option ${sqlType === 'correctedQuerySQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
onClick={() => {
|
||||
setSqlType(sqlType === 'correctedQuerySQL' ? '' : 'correctedQuerySQL');
|
||||
}}
|
||||
>
|
||||
物理SQL修正
|
||||
</div>
|
||||
)}
|
||||
{sqlInfo.querySQL && (
|
||||
<div
|
||||
className={`${tipPrefixCls}-content-option ${
|
||||
sqlType === 'querySQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
className={`${tipPrefixCls}-content-option ${sqlType === 'querySQL' ? `${tipPrefixCls}-content-option-active` : ''
|
||||
}`}
|
||||
onClick={() => {
|
||||
setSqlType(sqlType === 'querySQL' ? '' : 'querySQL');
|
||||
}}
|
||||
>
|
||||
最终执行SQL
|
||||
{sqlInfo.correctedQuerySQL ? '最终执行SQL' : '最终执行SQL'}
|
||||
</div>
|
||||
)}
|
||||
<Button className={`${prefixCls}-export-log`} size="small" onClick={onExportLog}>
|
||||
@@ -248,13 +261,12 @@ ${executeErrorMsg}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className={`${prefixCls} ${
|
||||
!window.location.pathname.includes('/chat') &&
|
||||
className={`${prefixCls} ${!window.location.pathname.includes('/chat') &&
|
||||
integrateSystem &&
|
||||
integrateSystem !== 'wiki'
|
||||
? `${prefixCls}-copilot`
|
||||
: ''
|
||||
}`}
|
||||
? `${prefixCls}-copilot`
|
||||
: ''
|
||||
}`}
|
||||
>
|
||||
{sqlType === 'schemaMap' && (
|
||||
<div className={`${prefixCls}-code`}>
|
||||
@@ -290,9 +302,8 @@ ${executeErrorMsg}
|
||||
<div className={`${prefixCls}-schema-content`}>
|
||||
{terms
|
||||
.map((item: any) => {
|
||||
return `${item.name}${
|
||||
item.alias?.length > 0 ? `(${item.alias.join(',')})` : ''
|
||||
}: ${item.description}`;
|
||||
return `${item.name}${item.alias?.length > 0 ? `(${item.alias.join(',')})` : ''
|
||||
}: ${item.description}`;
|
||||
})
|
||||
.join('、')}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user