From 214bcb8d3eba2840200296538793615bd55fa72f Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Sat, 8 Nov 2025 14:20:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E6=95=8F=E6=84=9F=E5=86=85=E5=AE=B9=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=92=8C=E4=B8=AD=E6=96=AD=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 chat_agent 函数中,优化了敏感内容检测后的响应,添加了时间成本的记录。 - 修改了前端 AgentChatComponent 和 AgentMessageComponent,以正确处理和显示敏感内容中断的提示信息。 - 移除了不必要的代码注释和冗余逻辑,提升了代码可读性。 --- server/routers/chat_router.py | 27 +++---------------- .../middlewares/attachment_middleware.py | 2 +- web/src/components/AgentChatComponent.vue | 8 ++++-- web/src/components/AgentMessageComponent.vue | 19 ++++--------- 4 files changed, 16 insertions(+), 40 deletions(-) diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index 65b48d6b..e2a3f54d 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -375,7 +375,6 @@ async def get_agent(current_user: User = Depends(get_required_user)): return {"agents": agents} -# TODO:[未完成]这个thread_id在前端是直接生成的1234,最好传入thread_id时做校验只允许uuid4 @chat.post("/agent/{agent_id}") async def chat_agent( agent_id: str, @@ -472,7 +471,8 @@ async def chat_agent( if conf.enable_content_guard and await content_guard.check_with_keywords(full_msg.content[-20:]): logger.warning("Sensitive content detected in stream") await save_partial_message(conv_manager, thread_id, full_msg, "content_guard_blocked") - yield make_chunk(message="检测到敏感内容,已中断输出", status="error") + meta["time_cost"] = asyncio.get_event_loop().time() - start_time + yield make_chunk(status="interrupted", message="检测到敏感内容,已中断输出", meta=meta) return yield make_chunk(content=msg.content, msg=msg.model_dump(), metadata=metadata, status="loading") @@ -487,7 +487,8 @@ async def chat_agent( ): logger.warning("Sensitive content detected in final message") await save_partial_message(conv_manager, thread_id, full_msg, "content_guard_blocked") - yield make_chunk(message="检测到敏感内容,已中断输出", status="error") + meta["time_cost"] = asyncio.get_event_loop().time() - start_time + yield make_chunk(status="interrupted", message="检测到敏感内容,已中断输出", meta=meta) return # After streaming finished, check for interrupts and save messages @@ -512,16 +513,6 @@ async def chat_agent( # 客户端主动中断连接,检查中断并保存已生成的部分内容 logger.warning(f"Client disconnected, cancelling stream: {e}") - # 断开连接时不检查中断,直接保存部分消息 - langgraph_config = {"configurable": input_context} - - # 尝试从 LangGraph state 保存消息(可能没有,因为中断了) - await save_messages_from_langgraph_state( - agent_instance=agent, - thread_id=thread_id, - conv_mgr=conv_manager, - config_dict=langgraph_config, - ) # 如果有手动维护的 full_msg,直接保存到数据库 if full_msg: @@ -539,16 +530,6 @@ async def chat_agent( except Exception as e: logger.error(f"Error streaming messages: {e}, {traceback.format_exc()}") - # 异常情况下也不检查中断,直接保存部分消息 - langgraph_config = {"configurable": input_context} - - # 尝试从 LangGraph state 保存消息(可能没有,因为异常了) - await save_messages_from_langgraph_state( - agent_instance=agent, - thread_id=thread_id, - conv_mgr=conv_manager, - config_dict=langgraph_config, - ) # 如果有手动维护的 full_msg,直接保存到数据库 if full_msg: diff --git a/src/agents/common/middlewares/attachment_middleware.py b/src/agents/common/middlewares/attachment_middleware.py index 910f345e..de150860 100644 --- a/src/agents/common/middlewares/attachment_middleware.py +++ b/src/agents/common/middlewares/attachment_middleware.py @@ -64,7 +64,7 @@ class AttachmentMiddleware(AgentMiddleware[AttachmentState]): self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse] ) -> ModelResponse: # Read from State: get uploaded files metadata - logger.debug(f"inject_attachment_context: request.state = {request.state}") + # logger.debug(f"inject_attachment_context: request.state = {request.state}") attachments = request.state.get("attachments", []) if attachments: diff --git a/web/src/components/AgentChatComponent.vue b/web/src/components/AgentChatComponent.vue index cd3a7dc5..674ef95d 100644 --- a/web/src/components/AgentChatComponent.vue +++ b/web/src/components/AgentChatComponent.vue @@ -470,7 +470,7 @@ const resetOnGoingConv = (threadId = null, preserveMessages = false) => { }; const _processStreamChunk = (chunk, threadId) => { - const { status, msg, request_id, message } = chunk; + const { status, msg, request_id, message: chunkMessage } = chunk; const threadState = getThreadState(threadId); // console.log('Processing stream chunk:', chunk, 'for thread:', threadId); @@ -489,7 +489,7 @@ const _processStreamChunk = (chunk, threadId) => { } return false; case 'error': - handleChatError({ message }, 'stream'); + handleChatError({ message: chunkMessage }, 'stream'); // Stop the loading indicator if (threadState) { threadState.isStreaming = false; @@ -525,6 +525,10 @@ const _processStreamChunk = (chunk, threadId) => { if (threadState) { threadState.isStreaming = false; } + // 如果有 message 字段,显示提示(例如:敏感内容检测) + if (chunkMessage) { + message.info(chunkMessage); + } fetchThreadMessages({ agentId: currentAgentId.value, threadId: threadId }) .finally(() => { resetOnGoingConv(threadId, true); diff --git a/web/src/components/AgentMessageComponent.vue b/web/src/components/AgentMessageComponent.vue index 796931a7..147ddb9a 100644 --- a/web/src/components/AgentMessageComponent.vue +++ b/web/src/components/AgentMessageComponent.vue @@ -30,9 +30,10 @@
-
+
回答生成已中断 生成过程中出现异常 + 检测到敏感内容,已中断输出
@@ -365,19 +366,9 @@ const toggleToolCall = (toolCallId) => { display: flex; align-items: center; gap: 8px; - - &.error-interrupted { - background-color: #fffbeb; - // border: 1px solid #fbbf24; - color: #92400e; - } - - &.error-unexpect { - background-color: #fef2f2; - // border: 1px solid #f87171; - color: #991b1b; - } - + background-color: #fef2f2; + // border: 1px solid #f87171; + color: #991b1b; span { line-height: 1.5; }