Browse Source

区分真正的渲染变量和回传AI用变量

kagg886 2 months ago
parent
commit
deb3ba7729
2 changed files with 33 additions and 17 deletions
  1. 3 0
      src/api/assist/type.ts
  2. 30 17
      src/views/assistant/index.vue

+ 3 - 0
src/api/assist/type.ts

@@ -18,6 +18,9 @@
 export type Message = {
 export type Message = {
 	id: number
 	id: number
 	role: 'user' | 'assistant' | 'system' | 'meta'
 	role: 'user' | 'assistant' | 'system' | 'meta'
+	//仅markdown渲染器需要
+	render_content: string
+	//实际传给AI的内容
 	content: string
 	content: string
 	timestamp: number
 	timestamp: number
 
 

+ 30 - 17
src/views/assistant/index.vue

@@ -112,6 +112,7 @@ const sendMessage = () => {
 	messages.value.push({
 	messages.value.push({
 		id: Date.now(),
 		id: Date.now(),
 		role: 'user',
 		role: 'user',
+		render_content: inputMessage.value,
 		content: inputMessage.value,
 		content: inputMessage.value,
 		timestamp: Date.now(),
 		timestamp: Date.now(),
 	})
 	})
@@ -119,13 +120,14 @@ const sendMessage = () => {
 	const rtn = reactive<Message>({
 	const rtn = reactive<Message>({
 		id: Date.now(),
 		id: Date.now(),
 		role: 'assistant',
 		role: 'assistant',
+		render_content: '',
 		content: '',
 		content: '',
 		timestamp: Date.now(),
 		timestamp: Date.now(),
-		tools_calls: []
+		tools_calls: [],
 	})
 	})
 
 
 	const fn = watch(
 	const fn = watch(
-		() => rtn.content,
+		() => rtn.render_content,
 		(newVal) => console.log(newVal)
 		(newVal) => console.log(newVal)
 	)
 	)
 
 
@@ -141,6 +143,7 @@ const sendMessage = () => {
 						{
 						{
 							id: 0,
 							id: 0,
 							role: 'system',
 							role: 'system',
+							render_content: prompt.value,
 							content: prompt.value,
 							content: prompt.value,
 							timestamp: Date.now(),
 							timestamp: Date.now(),
 						},
 						},
@@ -152,9 +155,30 @@ const sendMessage = () => {
 		onReceive: (resp: ChatResponse) => {
 		onReceive: (resp: ChatResponse) => {
 			switch (resp.type) {
 			switch (resp.type) {
 				case 'message':
 				case 'message':
+					rtn.render_content += resp.message
 					rtn.content += resp.message
 					rtn.content += resp.message
 					break
 					break
+				case 'toolres': {
+					rtn.render_content += `
+\`\`\`tools-loading
+resp
+${resp.response.name}
+${resp.response.data.replace('\n', '')}
+\`\`\`
+
+`
+					break
+				}
+
 				case 'toolcall': {
 				case 'toolcall': {
+					rtn.render_content += `
+\`\`\`tools-loading
+request
+${resp.request.name}
+${resp.request.data.replace('\n', '')}
+\`\`\`
+
+`
 					rtn.tools_calls?.push({
 					rtn.tools_calls?.push({
 						id: 'qwq',
 						id: 'qwq',
 						type: 'function',
 						type: 'function',
@@ -165,19 +189,8 @@ const sendMessage = () => {
 					})
 					})
 					break
 					break
 				}
 				}
-				case 'toolres': {
-					rtn.content += `
-> ### ${resp.response.name}调用结果
->
->
->\`\`\`json
->${resp.response.data.split('\n').join('\n> ')}
->\`\`\`
-`
-					break
-				}
 				case 'error':
 				case 'error':
-					rtn.content += `
+					rtn.render_content += `
 > ### 系统报错
 > ### 系统报错
 >
 >
 >
 >
@@ -194,7 +207,7 @@ const sendMessage = () => {
 
 
 				`
 				`
 			}
 			}
-			rtn.content += '\n'
+			rtn.render_content += '\n'
 			chatInstance.value = undefined
 			chatInstance.value = undefined
 		},
 		},
 	})
 	})
@@ -364,7 +377,7 @@ const redirectToModelManager = () => router.push('manage/model')
 						<div v-if="message.role === 'assistant'" class="ai-message-container">
 						<div v-if="message.role === 'assistant'" class="ai-message-container">
 							<el-avatar class="message-avatar" :icon="ChatDotRound" />
 							<el-avatar class="message-avatar" :icon="ChatDotRound" />
 							<div class="message-bubble ai-bubble">
 							<div class="message-bubble ai-bubble">
-								<Markdown v-if="message.content !== ''" :content="message.content" :plugins="plugins" class="markdown-content" />
+								<Markdown v-if="message.render_content !== ''" :content="message.render_content" :plugins="plugins" class="markdown-content" />
 								<div v-else class="loading-container">
 								<div v-else class="loading-container">
 									<div class="loading-dots">
 									<div class="loading-dots">
 										<span class="dot"></span>
 										<span class="dot"></span>
@@ -379,7 +392,7 @@ const redirectToModelManager = () => router.push('manage/model')
 						<!-- 用户消息 -->
 						<!-- 用户消息 -->
 						<div v-if="message.role === 'user'" class="user-message-container">
 						<div v-if="message.role === 'user'" class="user-message-container">
 							<div class="message-bubble user-bubble">
 							<div class="message-bubble user-bubble">
-								{{ message.content }}
+								{{ message.render_content }}
 							</div>
 							</div>
 							<el-avatar class="message-avatar" :src="getUserInfos.avatar" :icon="User" />
 							<el-avatar class="message-avatar" :src="getUserInfos.avatar" :icon="User" />
 						</div>
 						</div>