From 84a8be0ce8fe7662fc80547aa53890758707830c Mon Sep 17 00:00:00 2001 From: lacerate551 <128470311+lacerate551@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:43:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(knowledge):=20list=5Fcollections=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E5=B8=B8=E4=BF=9D=E6=8A=A4=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=20ChromaDB=20=E6=95=B0=E6=8D=AE=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E5=AF=BC=E8=87=B4=20/collections=20500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 遍历 kb_metadata.json 时对每个集合的 get_collection/count 操作包裹 try/except,捕获 NotFoundError/InternalError 等异常后跳过并记录警告, 循环结束后自动清理失效的元数据条目。 --- knowledge/collection.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/knowledge/collection.py b/knowledge/collection.py index ae06685..7ae9e5f 100644 --- a/knowledge/collection.py +++ b/knowledge/collection.py @@ -382,16 +382,31 @@ class CollectionMixin: self._save_metadata() + stale_collections = [] + for name, info in self._metadata.get("collections", {}).items(): - collection = self.get_collection(name) - result.append(CollectionInfo( - name=name, - display_name=info.get("display_name", name), - document_count=collection.count() if collection else 0, - created_at=info.get("created_at", ""), - department=info.get("department", ""), - description=info.get("description", "") - )) + try: + collection = self.get_collection(name) + result.append(CollectionInfo( + name=name, + display_name=info.get("display_name", name), + document_count=collection.count() if collection else 0, + created_at=info.get("created_at", ""), + department=info.get("department", ""), + description=info.get("description", "") + )) + except Exception as e: + logger.warning( + f"跳过异常向量库 '{name}': {e},可能是 ChromaDB 数据目录已丢失" + ) + stale_collections.append(name) + + # 清理元数据中指向已失效集合的条目 + if stale_collections: + for name in stale_collections: + self._metadata.get("collections", {}).pop(name, None) + logger.info(f"清理失效向量库元数据: {name}") + self._save_metadata() return result