diff --git a/docs/changelog/roadmap.md b/docs/changelog/roadmap.md index 41409af2..c70e2529 100644 --- a/docs/changelog/roadmap.md +++ b/docs/changelog/roadmap.md @@ -7,7 +7,6 @@ ## Bugs -- [ ] LightRAG 知识库查看不了解析后的文本,偶然出现,未复现 ## Next @@ -41,4 +40,5 @@ - [x] 优化 MCP 逻辑,支持 common + special 创建方式 - [x] 修复本地知识库的 metadata 和 向量数据库中不一致的情况。 - [x] v1 版本的 LangGraph 的工具渲染有问题 -- [x] upload 接口会阻塞主进程 \ No newline at end of file +- [x] upload 接口会阻塞主进程 +- [x] LightRAG 知识库查看不了解析后的文本,偶然出现,未复现 \ No newline at end of file diff --git a/server/routers/knowledge_router.py b/server/routers/knowledge_router.py index 51f86221..98adc4d2 100644 --- a/server/routers/knowledge_router.py +++ b/server/routers/knowledge_router.py @@ -78,12 +78,16 @@ async def get_database_info(db_id: str, current_user: User = Depends(get_admin_u @knowledge.put("/databases/{db_id}") async def update_database_info( - db_id: str, name: str = Body(...), description: str = Body(...), current_user: User = Depends(get_admin_user) + db_id: str, + name: str = Body(...), + description: str = Body(...), + llm_info: dict = Body(None), + current_user: User = Depends(get_admin_user), ): """更新知识库信息""" - logger.debug(f"Update database {db_id} info: {name}, {description}") + logger.debug(f"Update database {db_id} info: {name}, {description}, llm_info: {llm_info}") try: - database = await knowledge_base.update_database(db_id, name, description) + database = await knowledge_base.update_database(db_id, name, description, llm_info) return {"message": "更新成功", "database": database} except Exception as e: logger.error(f"更新数据库失败 {e}, {traceback.format_exc()}") diff --git a/src/knowledge/base.py b/src/knowledge/base.py index f58884da..33c2adcf 100644 --- a/src/knowledge/base.py +++ b/src/knowledge/base.py @@ -482,7 +482,7 @@ class KnowledgeBase(ABC): os.makedirs(general_uploads, exist_ok=True) return general_uploads - def update_database(self, db_id: str, name: str, description: str) -> dict: + def update_database(self, db_id: str, name: str, description: str, llm_info: dict = None) -> dict: """ 更新数据库 @@ -490,6 +490,7 @@ class KnowledgeBase(ABC): db_id: 数据库ID name: 新名称 description: 新描述 + llm_info: LLM配置信息(可选,仅用于 LightRAG 类型知识库) Returns: 更新后的数据库信息 @@ -499,6 +500,11 @@ class KnowledgeBase(ABC): self.databases_meta[db_id]["name"] = name self.databases_meta[db_id]["description"] = description + + # 如果提供了 llm_info,则更新(仅针对 LightRAG 类型) + if llm_info is not None: + self.databases_meta[db_id]["llm_info"] = llm_info + self._save_metadata() return self.get_database_info(db_id) diff --git a/src/knowledge/implementations/lightrag.py b/src/knowledge/implementations/lightrag.py index 28130e8f..5a5ee54a 100644 --- a/src/knowledge/implementations/lightrag.py +++ b/src/knowledge/implementations/lightrag.py @@ -332,8 +332,12 @@ class LightRagKB(KnowledgeBase): if rag: try: # 获取文档的所有 chunks - assert hasattr(rag.text_chunks, "get_all"), "text_chunks does not have get_all method" - all_chunks = await rag.text_chunks.get_all() # type: ignore + # LightRAG v1.4+ 使用 JsonKVStorage,通过 _data 属性访问所有数据 + if hasattr(rag.text_chunks, "_data"): + all_chunks = dict(rag.text_chunks._data) + else: + logger.warning("text_chunks does not have _data attribute, cannot get file content") + return content_info # 筛选属于该文档的 chunks doc_chunks = [] diff --git a/src/knowledge/manager.py b/src/knowledge/manager.py index 95c148ba..b2ec2df8 100644 --- a/src/knowledge/manager.py +++ b/src/knowledge/manager.py @@ -366,10 +366,10 @@ class KnowledgeBaseManager: return False - async def update_database(self, db_id: str, name: str, description: str) -> dict: + async def update_database(self, db_id: str, name: str, description: str, llm_info: dict = None) -> dict: """更新数据库""" kb_instance = self._get_kb_for_database(db_id) - result = kb_instance.update_database(db_id, name, description) + result = kb_instance.update_database(db_id, name, description, llm_info) async with self._metadata_lock: if db_id in self.global_databases_meta: diff --git a/web/src/components/DatabaseHeader.vue b/web/src/components/DatabaseHeader.vue index 8cc11072..76c13e22 100644 --- a/web/src/components/DatabaseHeader.vue +++ b/web/src/components/DatabaseHeader.vue @@ -38,7 +38,7 @@ 删除数据库 取消 - 确定 + 确定 @@ -47,6 +47,15 @@ + + + + @@ -62,6 +71,7 @@ import { DeleteOutlined, } from '@ant-design/icons-vue'; import HeaderComponent from '@/components/HeaderComponent.vue'; +import ModelSelectorComponent from '@/components/ModelSelectorComponent.vue'; import { h } from 'vue'; const router = useRouter(); @@ -74,7 +84,11 @@ const editModalVisible = ref(false); const editFormRef = ref(null); const editForm = reactive({ name: '', - description: '' + description: '', + llm_info: { + provider: '', + model_name: '' + } }); const rules = { @@ -88,21 +102,59 @@ const backToDatabase = () => { const showEditModal = () => { editForm.name = database.value.name || ''; editForm.description = database.value.description || ''; + // 如果是 LightRAG 类型,加载当前的 LLM 配置 + if (database.value.kb_type === 'lightrag') { + const llmInfo = database.value.llm_info || {}; + editForm.llm_info.provider = llmInfo.provider || ''; + editForm.llm_info.model_name = llmInfo.model_name || ''; + } editModalVisible.value = true; }; const handleEditSubmit = () => { editFormRef.value.validate().then(async () => { - await store.updateDatabaseInfo({ + const updateData = { name: editForm.name, description: editForm.description - }); + }; + + // 如果是 LightRAG 类型,包含 llm_info + if (database.value.kb_type === 'lightrag') { + updateData.llm_info = { + provider: editForm.llm_info.provider, + model_name: editForm.llm_info.model_name + }; + } + + await store.updateDatabaseInfo(updateData); editModalVisible.value = false; }).catch(err => { console.error('表单验证失败:', err); }); }; +// LLM 模型选择处理 +const llmModelSpec = computed(() => { + const provider = editForm.llm_info?.provider || ''; + const modelName = editForm.llm_info?.model_name || ''; + if (provider && modelName) { + return `${provider}/${modelName}`; + } + return ''; +}); + +const handleLLMSelect = (spec) => { + console.log('LLM选择:', spec); + if (typeof spec !== 'string' || !spec) return; + + const index = spec.indexOf('/'); + const provider = index !== -1 ? spec.slice(0, index) : ''; + const modelName = index !== -1 ? spec.slice(index + 1) : ''; + + editForm.llm_info.provider = provider; + editForm.llm_info.model_name = modelName; +}; + const deleteDatabase = () => { store.deleteDatabase(); };