diff --git a/docs/latest/changelog/roadmap.md b/docs/latest/changelog/roadmap.md index 269787fd..25210a85 100644 --- a/docs/latest/changelog/roadmap.md +++ b/docs/latest/changelog/roadmap.md @@ -38,14 +38,16 @@ - 优化 RAG 检索,支持根据文件 pattern 来检索(Agentic Mode) - 重构智能体对于“工具变更/模型变更”的处理逻辑,无需导入更复杂的中间件 - 重构知识库的 Agentic 配置逻辑,与 Tools 解耦 -- 新增Sqlite Web UI 方便通过Web页面管理数据库中数据[#463](https://github.com/xerrors/Yuxi-Know/pull/463)) +- 新增Sqlite Web UI 方便通过Web页面管理数据库中数据[#463](https://github.com/xerrors/Yuxi-Know/pull/463) - 将工具与知识库解耦,在 context 中就完成解耦,虽然最终都是在 Agent 中的 get_tools 中获取 - 优化chunk逻辑,移除 QA 分割,集成到普通分块中 - 重构知识库处理逻辑,分为 上传—解析—入库 三个阶段 +- 重构 MCP 相关配置,使用数据库来控制 [#469](https://github.com/xerrors/Yuxi-Know/pull/469) ### 修复 - 修复知识图谱上传的向量配置错误,并新增模型选择以及 batch size 选择 +- 修复部分场景下获取工具列表报错 [#470](https://github.com/xerrors/Yuxi-Know/pull/470) ## v0.4 diff --git a/server/routers/knowledge_router.py b/server/routers/knowledge_router.py index b5b2263a..36c02564 100644 --- a/server/routers/knowledge_router.py +++ b/server/routers/knowledge_router.py @@ -89,6 +89,13 @@ async def create_database( f"embed_model_name {embed_model_name}" ) try: + # 先检查名称是否已存在 + if knowledge_base.database_name_exists(database_name): + raise HTTPException( + status_code=409, + detail=f"知识库名称 '{database_name}' 已存在,请使用其他名称", + ) + additional_params = {**(additional_params or {})} additional_params["auto_generate_questions"] = False # 默认不生成问题 @@ -119,9 +126,11 @@ async def create_database( await agent_manager.reload_all() return database_info + except HTTPException: + raise except Exception as e: logger.error(f"创建数据库失败 {e}, {traceback.format_exc()}") - return {"message": f"创建数据库失败 {e}", "status": "failed"} + raise HTTPException(status_code=400, detail=f"创建数据库失败: {e}") @knowledge.get("/databases/{db_id}") diff --git a/src/knowledge/manager.py b/src/knowledge/manager.py index e5ac85b8..abf09713 100644 --- a/src/knowledge/manager.py +++ b/src/knowledge/manager.py @@ -233,6 +233,20 @@ class KnowledgeBaseManager: return {"databases": all_databases} + def database_name_exists(self, database_name: str) -> bool: + """检查知识库名称是否已存在 + + Args: + database_name: 要检查的知识库名称 + + Returns: + True 如果名称已存在,False 否则 + """ + for db_id, meta in self.global_databases_meta.items(): + if meta.get("name", "").lower() == database_name.lower(): + return True + return False + async def create_folder(self, db_id: str, folder_name: str, parent_id: str = None) -> dict: """Create a folder in the database.""" kb_instance = self._get_kb_for_database(db_id) @@ -258,6 +272,10 @@ class KnowledgeBaseManager: available_types = list(KnowledgeBaseFactory.get_available_types().keys()) raise ValueError(f"Unsupported knowledge base type: {kb_type}. Available types: {available_types}") + # 检查名称是否已存在 + if self.database_name_exists(database_name): + raise ValueError(f"知识库名称 '{database_name}' 已存在,请使用其他名称") + kb_instance = self._get_or_create_kb_instance(kb_type) db_info = kb_instance.create_database(database_name, description, embed_info, **kwargs) diff --git a/web/src/views/DataBaseView.vue b/web/src/views/DataBaseView.vue index 828bc266..e8a4c7f4 100644 --- a/web/src/views/DataBaseView.vue +++ b/web/src/views/DataBaseView.vue @@ -8,7 +8,7 @@ - +

知识库类型*

@@ -172,8 +172,8 @@ import { useRouter, useRoute } from 'vue-router'; import { storeToRefs } from 'pinia'; import { useConfigStore } from '@/stores/config'; import { useDatabaseStore } from '@/stores/database'; -import { Database, FileDigit, Waypoints, Building2, DatabaseZap } from 'lucide-vue-next'; -import { LockOutlined, InfoCircleOutlined, QuestionCircleOutlined, PlusOutlined } from '@ant-design/icons-vue'; +import { Database, Waypoints, DatabaseZap } from 'lucide-vue-next'; +import { LockOutlined, InfoCircleOutlined, PlusOutlined } from '@ant-design/icons-vue'; import { typeApi } from '@/apis/knowledge_api'; import HeaderComponent from '@/components/HeaderComponent.vue'; import ModelSelectorComponent from '@/components/ModelSelectorComponent.vue'; @@ -266,6 +266,7 @@ const resetNewDatabase = () => { const cancelCreateDatabase = () => { state.openNewDatabaseModel = false + resetNewDatabase() } // 知识库类型相关工具方法