5353 @item-click =" handlePromptItemClick"
5454 ></tr-prompts >
5555 </div >
56- <tr-bubble-provider :content-renderers =" { markdown: MarkdownRenderer } " v-else >
56+ <tr-bubble-provider :content-renderers =" contentRenderers " v-else >
5757 <tr-bubble-list :items =" activeMessages" :roles =" roles" autoScroll ></tr-bubble-list >
5858 </tr-bubble-provider >
5959 </div >
8080
8181<script lang="ts">
8282/* metaService: engine.plugins.robot.Main */
83- import { ref , onMounted , watchEffect , type CSSProperties , h , resolveComponent , computed , watch } from ' vue'
83+ import {
84+ ref ,
85+ onMounted ,
86+ watchEffect ,
87+ type CSSProperties ,
88+ h ,
89+ resolveComponent ,
90+ computed ,
91+ watch ,
92+ nextTick ,
93+ type Component
94+ } from ' vue'
8495import { Notify , Loading , TinyPopover } from ' @opentiny/vue'
8596import { useCanvas , useHistory , usePage , useModal , getMetaApi , META_SERVICE } from ' @opentiny/tiny-engine-meta-register'
8697import { extend } from ' @opentiny/vue-renderless/common/object'
@@ -92,6 +103,7 @@ import { getBlockContent, initBlockList, getAIModelOptions } from './js/robotSet
92103import McpServer from ' ./mcp/McpServer.vue'
93104import useMcpServer from ' ./mcp/useMcp'
94105import MarkdownRenderer from ' ./mcp/MarkdownRenderer.vue'
106+ import LoadingRenderer from ' ./mcp/LoadingRenderer.vue'
95107import { sendMcpRequest } from ' ./mcp/utils'
96108
97109export default {
@@ -151,6 +163,14 @@ export default {
151163 )
152164 }
153165
166+ const scrollContent = async () => {
167+ await nextTick ()
168+ const el = chatContainerRef .value as HTMLElement | null
169+ if (el ) {
170+ el .scrollTop = el .scrollHeight
171+ }
172+ }
173+
154174 const createNewPage = (schema ) => {
155175 if (! (pageSettingState .isNew && pageSettingState .isAIPage )) {
156176 pageSettingState .isNew = true
@@ -206,7 +226,7 @@ export default {
206226 if (useMcpServer ().isToolsEnabled ) {
207227 try {
208228 requestLoading .value = true
209- await scrollContent () // eslint-disable-line
229+ await scrollContent ()
210230 await sendMcpRequest (messages .value , {
211231 model: selectedModel .value .value ,
212232 headers: {
@@ -218,7 +238,7 @@ export default {
218238 } finally {
219239 inProcesing .value = false
220240 requestLoading .value = false
221- await scrollContent () // eslint-disable-line
241+ await scrollContent ()
222242 }
223243 return
224244 }
@@ -246,12 +266,6 @@ export default {
246266 })
247267 }
248268
249- const scrollContent = async () => {
250- if (chatContainerRef .value ) {
251- chatContainerRef .value .scrollTop = chatContainerRef .value .scrollHeight
252- }
253- }
254-
255269 const resetContent = async () => {
256270 activeMessages .value = messages .value
257271 await scrollContent ()
@@ -429,10 +443,15 @@ export default {
429443 user: { placement: ' end' , avatar: userAvatar , maxWidth: ' 90%' , contentRenderer: MarkdownRenderer }
430444 }
431445
432- watch ([activeMessages .value .length , activeMessages .value .at (- 1 )?.renderContent ?.length ], async () => {
433- await scrollContent ()
446+ watch ([() => activeMessages .value .length , () => activeMessages .value .at (- 1 )?.renderContent ?.length ?? 0 ], () => {
447+ scrollContent ()
434448 })
435449
450+ const contentRenderers: Record <string , Component > = {
451+ markdown: MarkdownRenderer ,
452+ loading: LoadingRenderer
453+ }
454+
436455 const mcpDrawerPosition = computed (() => {
437456 return {
438457 type: ' fixed' ,
@@ -468,7 +487,7 @@ export default {
468487 handlePromptItemClick ,
469488 welcomeIcon ,
470489 roles ,
471- MarkdownRenderer ,
490+ contentRenderers ,
472491 requestLoading ,
473492 mcpDrawerPosition
474493 }
0 commit comments