mirror of
http://112.124.100.131/ebiz-ai/ebiz-base-ai.git
synced 2025-12-11 03:46:50 +08:00
fix(AI-new):修复产品推荐和知识问答场景下智能小助手未结束的问题- 在 chat-new.vue 中添加 messageEnd 标志来标识消息是否结束- 在 message.vue 中仅在消息结束时显示点赞和踩按钮- 在产品知识和推荐场景的初始消息中设置 messageEnd为 true-修复了智能小助手未结束导致的后续智能推荐场景异常
This commit is contained in:
@@ -56,54 +56,54 @@ import { audioToText, gwcsChat } from '@/api/generatedApi'
|
|||||||
|
|
||||||
const MESSAGE_STATUS = {
|
const MESSAGE_STATUS = {
|
||||||
processing: 1,
|
processing: 1,
|
||||||
end: 0
|
end: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
SvgIcon
|
SvgIcon,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
messages: {
|
messages: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: () => []
|
default: () => [],
|
||||||
},
|
},
|
||||||
messageStatus: {
|
messageStatus: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'stop'
|
default: 'stop',
|
||||||
},
|
},
|
||||||
isDeep: {
|
isDeep: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false,
|
||||||
},
|
},
|
||||||
isSearching: {
|
isSearching: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false,
|
||||||
},
|
},
|
||||||
conversationId: {
|
conversationId: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: '',
|
||||||
},
|
},
|
||||||
productName: {
|
productName: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: '',
|
||||||
},
|
},
|
||||||
autoScrollEnabled: {
|
autoScrollEnabled: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false,
|
||||||
},
|
},
|
||||||
chatData: {
|
chatData: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => ({})
|
default: () => ({}),
|
||||||
},
|
},
|
||||||
appType: {
|
appType: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'gwcsHelper'
|
default: 'gwcsHelper',
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'normal_chat'
|
default: 'normal_chat',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -124,7 +124,7 @@ export default {
|
|||||||
genMessage: null,
|
genMessage: null,
|
||||||
messageInfo: {
|
messageInfo: {
|
||||||
is_complete: false.toString(),
|
is_complete: false.toString(),
|
||||||
information: ''
|
information: '',
|
||||||
},
|
},
|
||||||
currentMessageID: '',
|
currentMessageID: '',
|
||||||
// 打字机相关
|
// 打字机相关
|
||||||
@@ -154,7 +154,7 @@ export default {
|
|||||||
this.genMessage.status = MESSAGE_STATUS.processing
|
this.genMessage.status = MESSAGE_STATUS.processing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
deepInternet() {
|
deepInternet() {
|
||||||
@@ -178,7 +178,7 @@ export default {
|
|||||||
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
|
const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
|
||||||
this.mediaRecorder = new MediaRecorder(stream)
|
this.mediaRecorder = new MediaRecorder(stream)
|
||||||
this.audioChunks = []
|
this.audioChunks = []
|
||||||
this.mediaRecorder.ondataavailable = event => {
|
this.mediaRecorder.ondataavailable = (event) => {
|
||||||
if (event.data.size > 0) {
|
if (event.data.size > 0) {
|
||||||
this.audioChunks.push(event.data)
|
this.audioChunks.push(event.data)
|
||||||
}
|
}
|
||||||
@@ -222,12 +222,12 @@ export default {
|
|||||||
formData.append('appType', 'haslBigHelper')
|
formData.append('appType', 'haslBigHelper')
|
||||||
formData.append('user', 'chenyuda')
|
formData.append('user', 'chenyuda')
|
||||||
audioToText(formData)
|
audioToText(formData)
|
||||||
.then(res => {
|
.then((res) => {
|
||||||
if (res) {
|
if (res) {
|
||||||
resolve(res.content)
|
resolve(res.content)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch((err) => {
|
||||||
reject(err)
|
reject(err)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -259,7 +259,7 @@ export default {
|
|||||||
conversationId: this.conversationId,
|
conversationId: this.conversationId,
|
||||||
message: this.action === 'normal_chat' ? this.newMessage : JSON.stringify(this.messageInfo),
|
message: this.action === 'normal_chat' ? this.newMessage : JSON.stringify(this.messageInfo),
|
||||||
user: 'gwcs-test',
|
user: 'gwcs-test',
|
||||||
inputs: {}
|
inputs: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
this.currentMessage = {
|
this.currentMessage = {
|
||||||
@@ -271,7 +271,7 @@ export default {
|
|||||||
isThink: false,
|
isThink: false,
|
||||||
showThink: false,
|
showThink: false,
|
||||||
isLike: false,
|
isLike: false,
|
||||||
isDisLike: false
|
isDisLike: false,
|
||||||
}
|
}
|
||||||
if (this.single) {
|
if (this.single) {
|
||||||
// this.$set(this.messages, this.messages.length - 1, { ...this.currentMessage })
|
// this.$set(this.messages, this.messages.length - 1, { ...this.currentMessage })
|
||||||
@@ -291,13 +291,13 @@ export default {
|
|||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
signal: abortController.signal,
|
signal: abortController.signal,
|
||||||
body: JSON.stringify(params),
|
body: JSON.stringify(params),
|
||||||
timeout: 60000
|
timeout: 60000,
|
||||||
})
|
})
|
||||||
.then(async res => {
|
.then(async (res) => {
|
||||||
await this.processStreamResponse(res, requestIndex)
|
await this.processStreamResponse(res, requestIndex)
|
||||||
this.single = false
|
this.single = false
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch((err) => {
|
||||||
// debugger
|
// debugger
|
||||||
this.$emit('update:messageStatus', 'stop')
|
this.$emit('update:messageStatus', 'stop')
|
||||||
})
|
})
|
||||||
@@ -316,7 +316,7 @@ export default {
|
|||||||
if (done) break
|
if (done) break
|
||||||
buffer += new TextDecoder().decode(value)
|
buffer += new TextDecoder().decode(value)
|
||||||
const lines = buffer.split('\n')
|
const lines = buffer.split('\n')
|
||||||
lines.slice(0, -1).forEach(line => {
|
lines.slice(0, -1).forEach((line) => {
|
||||||
const parsed = this.parseStreamLine(line)
|
const parsed = this.parseStreamLine(line)
|
||||||
if (parsed) this.updateMessageContent(parsed, requestIndex)
|
if (parsed) this.updateMessageContent(parsed, requestIndex)
|
||||||
})
|
})
|
||||||
@@ -385,6 +385,11 @@ export default {
|
|||||||
updateMessageContent(parse, requestIndex) {
|
updateMessageContent(parse, requestIndex) {
|
||||||
let { event, answer, isThink, message_id } = parse
|
let { event, answer, isThink, message_id } = parse
|
||||||
this.currentMessageID = message_id
|
this.currentMessageID = message_id
|
||||||
|
|
||||||
|
if (event === 'message_end' || event === 'workflow_finished') {
|
||||||
|
this.$set(this.currentMessage, 'messageEnd', true)
|
||||||
|
// this.currentMessage.messageEnd = true
|
||||||
|
}
|
||||||
if (!this.currentMessage || !answer) return
|
if (!this.currentMessage || !answer) return
|
||||||
if (event !== 'message') return
|
if (event !== 'message') return
|
||||||
|
|
||||||
@@ -392,7 +397,7 @@ export default {
|
|||||||
const chars = {
|
const chars = {
|
||||||
answer: answer,
|
answer: answer,
|
||||||
isThink: isThink,
|
isThink: isThink,
|
||||||
message_id
|
message_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
this.typingQueue.push(chars)
|
this.typingQueue.push(chars)
|
||||||
@@ -467,8 +472,8 @@ export default {
|
|||||||
|
|
||||||
cancelSend() {
|
cancelSend() {
|
||||||
this.requestSingle.abort()
|
this.requestSingle.abort()
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<div class="text-right fs12 mb5 mr10" style="font-size: 10px; color: #f6aa21">
|
<div class="text-right fs12 mb5 mr10" style="font-size: 10px; color: #f6aa21">
|
||||||
<!-- 新增点赞和踩按钮 -->
|
<!-- 新增点赞和踩按钮 -->
|
||||||
<div class="reaction-buttons mb10" v-if="message.type !== 'user' && !message.status">
|
<div class="reaction-buttons mb10" v-if="message.type !== 'user' && !message.status && message.messageEnd">
|
||||||
<button @click="handleReaction(message, 'like')" class="like">
|
<button @click="handleReaction(message, 'like')" class="like">
|
||||||
<svg-icon :icon-class="message.isLike ? 'fillLike' : 'like'" class-name="chat-icon"></svg-icon>
|
<svg-icon :icon-class="message.isLike ? 'fillLike' : 'like'" class-name="chat-icon"></svg-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ export default {
|
|||||||
showProduct() {
|
showProduct() {
|
||||||
this.messages = []
|
this.messages = []
|
||||||
this.$refs.chatMessage.requestSingle.abort()
|
this.$refs.chatMessage.requestSingle.abort()
|
||||||
|
this.conversationId = ''
|
||||||
},
|
},
|
||||||
|
|
||||||
getIsThink(e) {
|
getIsThink(e) {
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ export default {
|
|||||||
this.messages.splice(0, this.messages.length, {
|
this.messages.splice(0, this.messages.length, {
|
||||||
type: 'bot',
|
type: 'bot',
|
||||||
text: `这里是产品知识小助手,请告诉我您想要了解哪个产品?也可以输入以下信息,我帮您进行精准查询:\n\n1.投保规则\n\n2.保障责任\n\n3.增值服务\n\n您可以直接向我提问~`,
|
text: `这里是产品知识小助手,请告诉我您想要了解哪个产品?也可以输入以下信息,我帮您进行精准查询:\n\n1.投保规则\n\n2.保障责任\n\n3.增值服务\n\n您可以直接向我提问~`,
|
||||||
|
messageEnd: true,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ export default {
|
|||||||
\n\n2.如果您需要推荐理财储蓄类产品,您可以告诉我以下信息:
|
\n\n2.如果您需要推荐理财储蓄类产品,您可以告诉我以下信息:
|
||||||
\n\n• 客户主要目标是什么?(财富升值/子女教育/资产传承/养老保障)
|
\n\n• 客户主要目标是什么?(财富升值/子女教育/资产传承/养老保障)
|
||||||
\n\n• 客户的年龄、性别、年收入、风险承受能力`,
|
\n\n• 客户的年龄、性别、年收入、风险承受能力`,
|
||||||
|
messageEnd: true,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user