From 9b5064dfd0690feae7dce22761706f308228d7e1 Mon Sep 17 00:00:00 2001 From: hexqi Date: Fri, 13 Feb 2026 14:56:32 +0800 Subject: [PATCH 1/5] fix(chat): fix missing reasoning content error and loading issue --- .../robot/src/composables/core/useMessageStream.ts | 1 + .../robot/src/composables/features/useToolCalls.ts | 8 +++++++- packages/plugins/robot/src/composables/useChat.ts | 8 +++++++- packages/plugins/robot/src/utils/chat.utils.ts | 3 ++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/plugins/robot/src/composables/core/useMessageStream.ts b/packages/plugins/robot/src/composables/core/useMessageStream.ts index bbf2bd3665..3699da0853 100644 --- a/packages/plugins/robot/src/composables/core/useMessageStream.ts +++ b/packages/plugins/robot/src/composables/core/useMessageStream.ts @@ -29,6 +29,7 @@ const handleDeltaReasoning = (choice: ChatCompletionStreamResponseChoice, lastMe }) } lastMessage.renderContent.at(-1)!.content += choice.delta.reasoning_content + lastMessage.reasoning_content = (lastMessage.reasoning_content || '') + choice.delta.reasoning_content } } diff --git a/packages/plugins/robot/src/composables/features/useToolCalls.ts b/packages/plugins/robot/src/composables/features/useToolCalls.ts index 7f0ff9d9cd..8229b9835e 100644 --- a/packages/plugins/robot/src/composables/features/useToolCalls.ts +++ b/packages/plugins/robot/src/composables/features/useToolCalls.ts @@ -74,6 +74,10 @@ export interface ToolCallHandlerConfig { onDone: (finishReason: string, messages: any[], contextMessages: any[], messageState: any) => Promise } getMessageState: () => any + statusManager?: { + isProcessing: () => boolean + setProcessing: () => void + } } /** @@ -81,7 +85,7 @@ export interface ToolCallHandlerConfig { * 使用工厂函数模式,将所有依赖通过配置注入 */ export function createToolCallHandler(config: ToolCallHandlerConfig) { - const { client, getAbortController, formatMessages, hooks, streamHandlers, getMessageState } = config + const { client, getAbortController, formatMessages, hooks, streamHandlers, getMessageState, statusManager } = config return async (tool_calls: ResponseToolCall[], messages: any[], contextMessages: RobotMessage[]) => { const hasToolCall = tool_calls?.length > 0 @@ -118,6 +122,8 @@ export function createToolCallHandler(config: ToolCallHandlerConfig) { delete currentMessage.tool_calls + statusManager?.setProcessing() + // 使用工具调用结果继续对话 await client.chatStream( { messages: toolMessages as any, options: { signal: abortController.signal } }, diff --git a/packages/plugins/robot/src/composables/useChat.ts b/packages/plugins/robot/src/composables/useChat.ts index 1772d968d1..f72413e174 100644 --- a/packages/plugins/robot/src/composables/useChat.ts +++ b/packages/plugins/robot/src/composables/useChat.ts @@ -168,7 +168,13 @@ const handleToolCall = createToolCallHandler({ onError: handleRequestError, onDone: handleFinishRequest }, - getMessageState: () => messageManager.messageState + getMessageState: () => messageManager.messageState, + statusManager: { + isProcessing: () => chatStatus === CHAT_STATUS.PROCESSING, + setProcessing: () => { + chatStatus = CHAT_STATUS.PROCESSING + } + } }) // 包装 conversation 方法,添加业务特定逻辑 diff --git a/packages/plugins/robot/src/utils/chat.utils.ts b/packages/plugins/robot/src/utils/chat.utils.ts index ddc0bb865b..557641dd79 100644 --- a/packages/plugins/robot/src/utils/chat.utils.ts +++ b/packages/plugins/robot/src/utils/chat.utils.ts @@ -11,7 +11,8 @@ export const formatMessages = (messages: LLMMessage[]) => { role: message.role, content: message.content, ...(message.tool_calls ? { tool_calls: message.tool_calls } : {}), - ...(message.tool_call_id ? { tool_call_id: message.tool_call_id } : {}) + ...(message.tool_call_id ? { tool_call_id: message.tool_call_id } : {}), + ...(message.reasoning_content ? { reasoning_content: message.reasoning_content } : {}) })) } From 008bd424908c253ba3a6537b368b31472b2269ff Mon Sep 17 00:00:00 2001 From: hexqi Date: Fri, 13 Feb 2026 14:57:50 +0800 Subject: [PATCH 2/5] fix: remove word limit --- packages/plugins/robot/src/components/chat/RobotChat.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/plugins/robot/src/components/chat/RobotChat.vue b/packages/plugins/robot/src/components/chat/RobotChat.vue index e24c375bdd..155e2f3198 100644 --- a/packages/plugins/robot/src/components/chat/RobotChat.vue +++ b/packages/plugins/robot/src/components/chat/RobotChat.vue @@ -36,8 +36,7 @@ :placeholder="GeneratingStatus.includes(props.status) ? '正在思考中...' : '请输入您的问题'" :clearable="true" :loading="GeneratingStatus.includes(props.status)" - :showWordLimit="true" - :maxLength="4000" + :showWordLimit="false" @submit="handleSendMessage" @cancel="handleAbortRequest" :allowFiles="selectedAttachments.length < 1 && props.allowFiles" From 19ac5be5970ddbd219460f93ee7671c1cacbb2c5 Mon Sep 17 00:00:00 2001 From: hexqi Date: Fri, 13 Feb 2026 16:19:55 +0800 Subject: [PATCH 3/5] fix: loading status --- packages/plugins/robot/src/Main.vue | 4 ++-- .../plugins/robot/src/composables/useChat.ts | 22 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/plugins/robot/src/Main.vue b/packages/plugins/robot/src/Main.vue index a4dfbe0466..4eeba186b8 100644 --- a/packages/plugins/robot/src/Main.vue +++ b/packages/plugins/robot/src/Main.vue @@ -18,7 +18,7 @@ v-model:fullscreen="fullscreen" v-model:show="robotVisible" v-model:input="inputMessage" - :status="messageState.status" + :status="chatStatus" :prompt-items="promptItems" :bubble-renderers="bubbleRenderers" :allowFiles="isVisualModel && robotSettingState.chatMode === ChatMode.Agent" @@ -147,9 +147,9 @@ const showTeleport = ref(false) const showSetting = ref(false) const { + chatStatus, inputMessage, messages, - messageState, changeChatMode, abortRequest, initChatClient, diff --git a/packages/plugins/robot/src/composables/useChat.ts b/packages/plugins/robot/src/composables/useChat.ts index f72413e174..a877882886 100644 --- a/packages/plugins/robot/src/composables/useChat.ts +++ b/packages/plugins/robot/src/composables/useChat.ts @@ -1,4 +1,4 @@ -import { nextTick } from 'vue' +import { nextTick, ref } from 'vue' import { GeneratingStatus, STATUS, type ChatMessage, type MessageState } from '@opentiny/tiny-robot-kit' import { formatMessages, removeLoading } from '../utils' import { getClientConfig as getConfig, updateClientConfig as updateConfig, client } from '../services/aiClient' @@ -39,7 +39,7 @@ enum CHAT_STATUS { FINISHED = 'finished' // 本轮对话结束 } -let chatStatus: CHAT_STATUS = CHAT_STATUS.PROCESSING +const chatStatus = ref(CHAT_STATUS.FINISHED) const abortControllerMap: Record = {} @@ -52,9 +52,9 @@ const handleStreamData = createStreamDataHandler({ onStreamTools }, statusManager: { - isStreaming: () => chatStatus === CHAT_STATUS.STREAMING, + isStreaming: () => chatStatus.value === CHAT_STATUS.STREAMING, setStreaming: () => { - chatStatus = CHAT_STATUS.STREAMING + chatStatus.value = CHAT_STATUS.STREAMING } } }) @@ -114,7 +114,7 @@ const handleFinishRequest = async ( } const handleRequestError = async (error: Error, messages: ChatMessage[], messageState: MessageState) => { - chatStatus = CHAT_STATUS.FINISHED + chatStatus.value = CHAT_STATUS.FINISHED delete abortControllerMap.main await onRequestEnd('error', messages.at(-1).content, messages, { error }) // 本次请求结束 messageState.status = STATUS.ERROR @@ -140,12 +140,12 @@ const { if (GeneratingStatus.includes(messageManager.messageState.status)) { messageManager.messageState.status = STATUS.FINISHED } - chatStatus = CHAT_STATUS.FINISHED + chatStatus.value = CHAT_STATUS.FINISHED }, statusManager: { - isProcessing: () => chatStatus === CHAT_STATUS.PROCESSING, + isProcessing: () => chatStatus.value === CHAT_STATUS.PROCESSING, setProcessing: () => { - chatStatus = CHAT_STATUS.PROCESSING + chatStatus.value = CHAT_STATUS.PROCESSING } } }) @@ -170,9 +170,9 @@ const handleToolCall = createToolCallHandler({ }, getMessageState: () => messageManager.messageState, statusManager: { - isProcessing: () => chatStatus === CHAT_STATUS.PROCESSING, + isProcessing: () => chatStatus.value === CHAT_STATUS.PROCESSING, setProcessing: () => { - chatStatus = CHAT_STATUS.PROCESSING + chatStatus.value = CHAT_STATUS.PROCESSING } } }) @@ -241,6 +241,7 @@ const abortRequest = () => { for (const key of Object.keys(abortControllerMap)) { delete abortControllerMap[key] } + chatStatus.value = CHAT_STATUS.FINISHED onRequestEnd('aborted', messageManager.messages.value.at(-1)?.content as string, messageManager.messages.value) } @@ -260,6 +261,7 @@ const changeChatMode = (chatMode: string) => { export default function () { return { + chatStatus, initChatClient, updateConfig, ...messageManager, From dcd403c9f387cb52ed1b2eb8a03e595e9077ace7 Mon Sep 17 00:00:00 2001 From: hexqi Date: Fri, 13 Feb 2026 17:17:07 +0800 Subject: [PATCH 4/5] fix: missing onMessageProcessed or occur multi times --- .../robot/src/composables/core/useConversation.ts | 4 +++- .../robot/src/composables/features/useToolCalls.ts | 1 + packages/plugins/robot/src/composables/useChat.ts | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/plugins/robot/src/composables/core/useConversation.ts b/packages/plugins/robot/src/composables/core/useConversation.ts index 7c0da5e7e4..ae2d70869d 100644 --- a/packages/plugins/robot/src/composables/core/useConversation.ts +++ b/packages/plugins/robot/src/composables/core/useConversation.ts @@ -11,6 +11,7 @@ export interface ConversationAdapterOptions { statusManager: { isProcessing: () => boolean setProcessing: () => void + resetProcessing: () => void } } @@ -43,7 +44,8 @@ export function useConversationAdapter(options: ConversationAdapterOptions) { const contextMessages = toRaw(messages.value.slice(0, -1)) await onFinishRequest(finishReason ?? 'unknown', messages.value, contextMessages, messageState) const lastMessage = messages.value.at(-1) - if (lastMessage) { + if (lastMessage && finishReason === 'stop' && !lastMessage.tool_calls && statusManager.isProcessing()) { + statusManager.resetProcessing() await onMessageProcessed(finishReason ?? 'unknown', lastMessage.content ?? '', messages.value, {}) } } diff --git a/packages/plugins/robot/src/composables/features/useToolCalls.ts b/packages/plugins/robot/src/composables/features/useToolCalls.ts index 8229b9835e..191ec4a0a2 100644 --- a/packages/plugins/robot/src/composables/features/useToolCalls.ts +++ b/packages/plugins/robot/src/composables/features/useToolCalls.ts @@ -77,6 +77,7 @@ export interface ToolCallHandlerConfig { statusManager?: { isProcessing: () => boolean setProcessing: () => void + resetProcessing: () => void } } diff --git a/packages/plugins/robot/src/composables/useChat.ts b/packages/plugins/robot/src/composables/useChat.ts index a877882886..4864351c8d 100644 --- a/packages/plugins/robot/src/composables/useChat.ts +++ b/packages/plugins/robot/src/composables/useChat.ts @@ -110,6 +110,10 @@ const handleFinishRequest = async ( if (finishReason === 'aborted' || messageState?.status === STATUS.ABORTED) { messageState.status = STATUS.ABORTED + } else if (finishReason === 'stop' && !lastMessage.tool_calls) { + messageState.status = STATUS.FINISHED + chatStatus.value = CHAT_STATUS.FINISHED + await await onMessageProcessed(finishReason, lastMessage.content ?? '', messages.value, {}) } } @@ -146,6 +150,9 @@ const { isProcessing: () => chatStatus.value === CHAT_STATUS.PROCESSING, setProcessing: () => { chatStatus.value = CHAT_STATUS.PROCESSING + }, + resetProcessing: () => { + chatStatus.value = CHAT_STATUS.FINISHED } } }) @@ -173,6 +180,9 @@ const handleToolCall = createToolCallHandler({ isProcessing: () => chatStatus.value === CHAT_STATUS.PROCESSING, setProcessing: () => { chatStatus.value = CHAT_STATUS.PROCESSING + }, + resetProcessing: () => { + chatStatus.value = CHAT_STATUS.FINISHED } } }) From c59faa5fbb8ae761629ff989dd0a944ccb32a9b6 Mon Sep 17 00:00:00 2001 From: hexqi Date: Fri, 13 Feb 2026 17:33:48 +0800 Subject: [PATCH 5/5] fix: review --- packages/plugins/robot/src/composables/useChat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugins/robot/src/composables/useChat.ts b/packages/plugins/robot/src/composables/useChat.ts index 4864351c8d..9ba4c505a1 100644 --- a/packages/plugins/robot/src/composables/useChat.ts +++ b/packages/plugins/robot/src/composables/useChat.ts @@ -113,7 +113,7 @@ const handleFinishRequest = async ( } else if (finishReason === 'stop' && !lastMessage.tool_calls) { messageState.status = STATUS.FINISHED chatStatus.value = CHAT_STATUS.FINISHED - await await onMessageProcessed(finishReason, lastMessage.content ?? '', messages.value, {}) + await onMessageProcessed(finishReason, lastMessage.content ?? '', messages.value, {}) } }