feat: improve regenerate SQL chat feature

This commit is contained in:
ulleo
2025-12-11 16:22:33 +08:00
committed by ulleo
parent 52bba50929
commit 4d49819533
15 changed files with 334 additions and 35 deletions
+8 -3
View File
@@ -51,6 +51,7 @@ export class ChatRecord {
recommended_question?: string
analysis_record_id?: number
predict_record_id?: number
regenerate_record_id?: number
constructor()
constructor(
@@ -75,7 +76,8 @@ export class ChatRecord {
first_chat: boolean,
recommended_question: string | undefined,
analysis_record_id: number | undefined,
predict_record_id: number | undefined
predict_record_id: number | undefined,
regenerate_record_id: number | undefined
)
constructor(
id?: number,
@@ -99,7 +101,8 @@ export class ChatRecord {
first_chat?: boolean,
recommended_question?: string,
analysis_record_id?: number,
predict_record_id?: number
predict_record_id?: number,
regenerate_record_id?: number
) {
this.id = id
this.chat_id = chat_id
@@ -123,6 +126,7 @@ export class ChatRecord {
this.recommended_question = recommended_question
this.analysis_record_id = analysis_record_id
this.predict_record_id = predict_record_id
this.regenerate_record_id = regenerate_record_id
}
}
@@ -252,7 +256,8 @@ const toChatRecord = (data?: any): ChatRecord | undefined => {
data.first_chat,
data.recommended_question,
data.analysis_record_id,
data.predict_record_id
data.predict_record_id,
data.regenerate_record_id
)
}
const toChatRecordList = (list: any = []): ChatRecord[] => {
+1
View File
@@ -235,6 +235,7 @@
"continue_to_ask": "Continue asking:",
"data_analysis": "Data Analysis",
"data_predict": "Data Prediction",
"data_regenerated": "Regenerate",
"chat_search": "Search",
"thinking": "Thinking",
"thinking_step": "Thought Process",
+1
View File
@@ -235,6 +235,7 @@
"continue_to_ask": "계속 질문하기:",
"data_analysis": "데이터 분석",
"data_predict": "데이터 예측",
"data_regenerated": "재생성",
"chat_search": "검색",
"thinking": "생각 중",
"thinking_step": "사고 과정",
+1
View File
@@ -236,6 +236,7 @@
"continue_to_ask": "继续提问:",
"data_analysis": "数据分析",
"data_predict": "数据预测",
"data_regenerated": "重新生成",
"chat_search": "搜索",
"thinking": "思考中",
"thinking_step": "思考过程",
@@ -163,6 +163,15 @@ const sendMessage = async () => {
currentRecord.id = data.id
_currentChat.value.records[index.value].id = data.id
break
case 'regenerate_record_id':
currentRecord.regenerate_record_id = data.regenerate_record_id
_currentChat.value.records[index.value].regenerate_record_id =
data.regenerate_record_id
break
case 'question':
currentRecord.question = data.question
_currentChat.value.records[index.value].question = data.question
break
case 'info':
console.info(data.msg)
break
@@ -3,9 +3,11 @@ import type { ChatMessage } from '@/api/chat.ts'
import icon_copy_outlined from '@/assets/embedded/icon_copy_outlined.svg'
import { useI18n } from 'vue-i18n'
import { useClipboard } from '@vueuse/core'
import { computed } from 'vue'
const props = defineProps<{
message?: ChatMessage
allMessages?: ChatMessage[]
}>()
const { t } = useI18n()
const { copy } = useClipboard({ legacy: true })
@@ -16,6 +18,13 @@ function clickAnalysis() {
function clickPredict() {
console.info('predict_record_id: ' + props.message?.record?.predict_record_id)
}
function clickRegenerated() {
console.info('regenerate_record_id: ' + props.message?.record?.regenerate_record_id)
}
const isRegenerated = computed(() => {
return !!props.message?.record?.regenerate_record_id
})
const copyCode = () => {
const str = props.message?.content || ''
@@ -37,6 +46,9 @@ const copyCode = () => {
<span v-else-if="message?.record?.predict_record_id" class="prefix-title" @click="clickPredict">
{{ t('qa.data_predict') }}
</span>
<span v-else-if="isRegenerated" class="prefix-title" @click="clickRegenerated">
{{ t('qa.data_regenerated') }}
</span>
<span style="width: 100%">{{ message?.content }}</span>
<div style="position: absolute; right: 12px; bottom: -24px">
<el-tooltip :offset="12" effect="dark" :content="t('datasource.copy')" placement="top">
+25 -5
View File
@@ -211,7 +211,11 @@
<!-- @stop="onChatStop"-->
<!-- @loading-over="loadingOver"-->
<!-- />-->
<UserChat v-if="message.role === 'user'" :message="message" />
<UserChat
v-if="message.role === 'user'"
:message="message"
:all-messages="computedMessages"
/>
<template v-if="message.role === 'assistant' && !message.first_chat">
<ChartAnswer
v-if="
@@ -397,7 +401,7 @@
type="textarea"
:autosize="{ minRows: 1, maxRows: 8.583 }"
:placeholder="t('qa.question_placeholder')"
@keydown.enter.exact.prevent="($event: any) => sendMessage($event)"
@keydown.enter.exact.prevent="($event: any) => sendMessage(undefined, $event)"
@keydown.ctrl.enter.exact.prevent="handleCtrlEnter"
/>
@@ -764,7 +768,10 @@ const assistantPrepareSend = async () => {
}
}
}
const sendMessage = async ($event: any = {}) => {
const sendMessage = async (
regenerate_record_id: number | undefined = undefined,
$event: any = {}
) => {
if ($event?.isComposing) {
return
}
@@ -783,6 +790,7 @@ const sendMessage = async ($event: any = {}) => {
currentRecord.create_time = new Date()
currentRecord.chat_id = currentChatId.value
currentRecord.question = inputMessage.value
currentRecord.regenerate_record_id = regenerate_record_id
currentRecord.sql_answer = ''
currentRecord.sql = ''
currentRecord.chart_answer = ''
@@ -829,9 +837,21 @@ function onAnalysisAnswerError() {
}
function askAgain(message: ChatMessage) {
inputMessage.value = message.record?.question ?? ''
if (message.record?.question?.trim() === '') {
return
}
// regenerate
inputMessage.value = '/regenerate'
let regenerate_record_id = message.record?.id
if (message.record?.id == undefined && message.record?.regenerate_record_id) {
//只有当前对话内,上一次执行失败的重试会进这里
regenerate_record_id = message.record?.regenerate_record_id
}
if (regenerate_record_id) {
inputMessage.value = inputMessage.value + ' ' + regenerate_record_id
}
nextTick(() => {
sendMessage()
sendMessage(regenerate_record_id)
})
}