From bf286e1f0117bd39947e117301d8e14c2ea51554 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Mon, 10 Nov 2025 22:34:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=B1=E4=BA=8E?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=84=E7=90=86=E8=B6=85=E6=97=B6=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=BC=82=E5=B8=B8=E6=9C=AA=E8=83=BD=E6=8D=95=E8=8E=B7?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/routers/knowledge_router.py | 32 ++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/server/routers/knowledge_router.py b/server/routers/knowledge_router.py index 823fc0b2..285bb4fd 100644 --- a/server/routers/knowledge_router.py +++ b/server/routers/knowledge_router.py @@ -236,12 +236,40 @@ async def add_documents( await context.set_progress(progress, f"正在处理第 {idx}/{total} 个文档") # 处理单个文档 - result = await knowledge_base.add_content(db_id, [item], params=params) - processed_items.extend(result) + try: + result = await knowledge_base.add_content(db_id, [item], params=params) + processed_items.extend(result) + except Exception as doc_error: + # 处理单个文档处理的所有异常(包括超时) + logger.error(f"Document processing failed for {item}: {doc_error}") + + # 判断是否是超时异常 + error_type = "timeout" if isinstance(doc_error, TimeoutError) else "processing_error" + error_msg = "处理超时" if isinstance(doc_error, TimeoutError) else "处理失败" + + processed_items.append({ + "item": item, + "status": "failed", + "error": f"{error_msg}: {str(doc_error)}", + "error_type": error_type + }) except asyncio.CancelledError: await context.set_progress(100.0, "任务已取消") raise + except Exception as task_error: + # 处理整体任务的其他异常(如内存不足、网络错误等) + logger.exception(f"Task processing failed: {task_error}") + await context.set_progress(100.0, f"任务处理失败: {str(task_error)}") + # 将所有未处理的文档标记为失败 + for item in items[len(processed_items):]: + processed_items.append({ + "item": item, + "status": "failed", + "error": f"任务失败: {str(task_error)}", + "error_type": "task_failed" + }) + raise item_type = "URL" if content_type == "url" else "文件" failed_count = len([_p for _p in processed_items if _p.get("status") == "failed"])