From 7c699cc86ff275dbe01c0713a56da8f40ab3af4c Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Sun, 26 Apr 2026 21:43:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E4=BC=98=E5=8C=96=20LangGraph=20?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=B6=88=E6=81=AF=E4=BF=9D=E5=AD=98=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=94=99=E8=AF=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=92=8C=E8=AD=A6=E5=91=8A=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot --- backend/package/yuxi/services/chat_service.py | 94 +++++++++++-------- web/src/composables/useAgentStreamHandler.js | 6 ++ 2 files changed, 60 insertions(+), 40 deletions(-) diff --git a/backend/package/yuxi/services/chat_service.py b/backend/package/yuxi/services/chat_service.py index 4b78f785..518d186e 100644 --- a/backend/package/yuxi/services/chat_service.py +++ b/backend/package/yuxi/services/chat_service.py @@ -245,29 +245,23 @@ async def save_messages_from_langgraph_state( config_dict: dict, trace_info: dict[str, Any] | None = None, ) -> None: - try: - messages = await _get_langgraph_messages(agent_instance, config_dict) - if messages is None: - return + messages = await _get_langgraph_messages(agent_instance, config_dict) + if messages is None: + return - existing_ids = await _get_existing_message_ids(conv_repo, thread_id) + existing_ids = await _get_existing_message_ids(conv_repo, thread_id) - for msg in messages: - msg_dict = msg.model_dump() if hasattr(msg, "model_dump") else {} - msg_type = msg_dict.get("type", "unknown") + for msg in messages: + msg_dict = msg.model_dump() if hasattr(msg, "model_dump") else {} + msg_type = msg_dict.get("type", "unknown") - if msg_type == "human" or getattr(msg, "id", None) in existing_ids: - continue - - if msg_type == "ai": - await _save_ai_message(conv_repo, thread_id, msg_dict, trace_info=trace_info) - elif msg_type == "tool": - await _save_tool_message(conv_repo, msg_dict) - - except Exception as e: - logger.error(f"Error saving messages from LangGraph state: {e}") - logger.error(traceback.format_exc()) + if msg_type == "human" or getattr(msg, "id", None) in existing_ids: + continue + if msg_type == "ai": + await _save_ai_message(conv_repo, thread_id, msg_dict, trace_info=trace_info) + elif msg_type == "tool": + await _save_tool_message(conv_repo, msg_dict) def _extract_interrupt_info(state) -> Any | None: """从 LangGraph state 中提取中断信息""" @@ -648,13 +642,23 @@ async def agent_chat( except Exception: agent_state = {} - await save_messages_from_langgraph_state( - agent_instance=agent, - thread_id=thread_id, - conv_repo=conv_repo, - config_dict=langgraph_config, - trace_info=trace_info, - ) + try: + await save_messages_from_langgraph_state( + agent_instance=agent, + thread_id=thread_id, + conv_repo=conv_repo, + config_dict=langgraph_config, + trace_info=trace_info, + ) + except Exception as e: + logger.error(f"Error saving messages from LangGraph state: {e}") + logger.error(traceback.format_exc()) + return { + "status": "error", + "error_type": "save_message_error", + "error_message": f"消息保存失败: {e}", + "request_id": meta.get("request_id"), + } return { "status": "finished", @@ -895,13 +899,18 @@ async def stream_agent_chat( yield make_chunk(status="agent_state", agent_state=agent_state, meta=meta) # 先存储数据库,再返回 finished,避免前端查询时数据未落库 - await save_messages_from_langgraph_state( - agent_instance=agent, - thread_id=thread_id, - conv_repo=conv_repo, - config_dict=langgraph_config, - trace_info=trace_info, - ) + try: + await save_messages_from_langgraph_state( + agent_instance=agent, + thread_id=thread_id, + conv_repo=conv_repo, + config_dict=langgraph_config, + trace_info=trace_info, + ) + except Exception as e: + logger.error(f"Error saving messages from LangGraph state: {e}") + logger.error(traceback.format_exc()) + yield make_chunk(status="warning", message=f"消息保存失败: {e}", meta=meta) yield make_chunk(status="finished", meta=meta) @@ -1066,13 +1075,18 @@ async def stream_agent_resume( # 先存储数据库,再返回 finished,避免前端查询时数据未落库 conv_repo = ConversationRepository(db) - await save_messages_from_langgraph_state( - agent_instance=agent, - thread_id=thread_id, - conv_repo=conv_repo, - config_dict=langgraph_config, - trace_info=trace_info, - ) + try: + await save_messages_from_langgraph_state( + agent_instance=agent, + thread_id=thread_id, + conv_repo=conv_repo, + config_dict=langgraph_config, + trace_info=trace_info, + ) + except Exception as e: + logger.error(f"Error saving messages from LangGraph state: {e}") + logger.error(traceback.format_exc()) + yield make_chunk(status="warning", message=f"消息保存失败: {e}", meta=meta) yield make_resume_chunk(status="finished", meta=meta) diff --git a/web/src/composables/useAgentStreamHandler.js b/web/src/composables/useAgentStreamHandler.js index f02758d9..6d2e3966 100644 --- a/web/src/composables/useAgentStreamHandler.js +++ b/web/src/composables/useAgentStreamHandler.js @@ -218,6 +218,12 @@ export function useAgentStreamHandler({ message.info(chunkMessage) } return true + + case 'warning': + if (chunkMessage) { + message.warning(chunkMessage) + } + return false } return false