From 76da6dd65ae269e287ef8472230133e1daa392ef Mon Sep 17 00:00:00 2001 From: Nelson <1475262689@qq.com> Date: Wed, 8 Jul 2026 18:54:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=92=E5=BD=92=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=8F=AA=E9=9C=80=E8=BE=93=E5=85=A5NodeToken=EF=BC=8C=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=8E=B7=E5=8F=96SpaceID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - feishu_service.py: import_nodes_from_parent 去掉 space_id 参数, 通过 get_node_info 自动获取 space_id - admin_knowledge.py: import API 去掉 spaceId 参数 - App.vue: 前端去掉 SpaceID 输入框,只需输入 NodeToken --- ai_knowledge_base_v2/apps/admin-web/src/App.vue | 14 +++++--------- .../apps/backend/app/api/admin_knowledge.py | 7 +++---- .../apps/backend/app/services/feishu_service.py | 11 ++++++++++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/ai_knowledge_base_v2/apps/admin-web/src/App.vue b/ai_knowledge_base_v2/apps/admin-web/src/App.vue index 62120fe..f3cd91f 100644 --- a/ai_knowledge_base_v2/apps/admin-web/src/App.vue +++ b/ai_knowledge_base_v2/apps/admin-web/src/App.vue @@ -37,7 +37,6 @@ const chatDetailOpen = ref(false); const recordTab = ref("chats"); const editingModelId = ref(null); const editingKnowledgeId = ref(null); -const batchSpaceId = ref(""); const batchParentToken = ref(""); const batchImporting = ref(false); const agentDebugging = ref(false); @@ -593,17 +592,15 @@ function resetKnowledgeForm() { } async function batchImportKnowledge() { - const spaceId = batchSpaceId.value.trim(); const parentToken = batchParentToken.value.trim(); - if (!spaceId || !parentToken) { - ElMessage.warning("请输入 SpaceID 和父节点 NodeToken"); + if (!parentToken) { + ElMessage.warning("请输入父节点 NodeToken"); return; } batchImporting.value = true; try { - const result = await api.importKnowledgeFromSpace(JSON.stringify({ spaceId, parent_node_token: parentToken })); + const result = await api.importKnowledgeFromSpace({ parent_node_token: parentToken }); ElMessage.success(`导入完成:新增 ${result.imported} 个,跳过 ${result.skipped} 个`); - batchSpaceId.value = ""; batchParentToken.value = ""; await loadCurrentMenu(); } catch (e: any) { @@ -1128,9 +1125,8 @@ function buildChatQuery() {
- - - 递归导入子节点 + + 递归导入
diff --git a/ai_knowledge_base_v2/apps/backend/app/api/admin_knowledge.py b/ai_knowledge_base_v2/apps/backend/app/api/admin_knowledge.py index 57dc00e..ee79844 100644 --- a/ai_knowledge_base_v2/apps/backend/app/api/admin_knowledge.py +++ b/ai_knowledge_base_v2/apps/backend/app/api/admin_knowledge.py @@ -28,12 +28,11 @@ def import_knowledge_from_space( db: Session = Depends(get_db), current_admin: Admin = Depends(get_current_admin), ) -> dict: - space_id = payload.get("spaceId", "").strip() parent_node_token = payload.get("parent_node_token", "").strip() - if not space_id or not parent_node_token: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="SpaceID 和父节点 Token 不能为空") + if not parent_node_token: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="父节点 NodeToken 不能为空") - nodes = FeishuKnowledgeService.import_nodes_from_parent(space_id, parent_node_token, db) + nodes = FeishuKnowledgeService.import_nodes_from_parent(parent_node_token, db) if not nodes: return api_success({"imported": 0, "skipped": 0, "nodes": []}) diff --git a/ai_knowledge_base_v2/apps/backend/app/services/feishu_service.py b/ai_knowledge_base_v2/apps/backend/app/services/feishu_service.py index 620c281..632ad8d 100644 --- a/ai_knowledge_base_v2/apps/backend/app/services/feishu_service.py +++ b/ai_knowledge_base_v2/apps/backend/app/services/feishu_service.py @@ -333,12 +333,12 @@ class FeishuKnowledgeService: @classmethod def import_nodes_from_parent( cls, - space_id: str, parent_node_token: str, db: Session | None = None, ) -> list[dict]: """从指定节点递归获取所有子节点,用于批量导入知识库。 不需要空间级别权限,只需要对 parent_node_token 所在节点有查看权限。 + 自动通过 node_info 获取 space_id,调用方无需手动传入。 """ config = _feishu_retrieval_config(db) if not config.app_id or not config.app_secret: @@ -347,6 +347,15 @@ class FeishuKnowledgeService: provider="feishu", ) + # 先通过 node_token 获取 space_id + node_info = _get_wiki_node_info(parent_node_token, config) + space_id = node_info.get("space_id", "") + if not space_id: + raise ExternalServiceError( + f"无法获取节点 {parent_node_token} 所属的 SpaceID", + provider="feishu", + ) + all_nodes: list[dict] = [] visited: set[str] = set()