Skip to content

Commit 9fa8ce2

Browse files
committed
feat: 添加知识库名称检查,防止重复创建相同名称的知识库 #466
1 parent 386c5d5 commit 9fa8ce2

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

docs/latest/changelog/roadmap.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@
3838
- 优化 RAG 检索,支持根据文件 pattern 来检索(Agentic Mode)
3939
- 重构智能体对于“工具变更/模型变更”的处理逻辑,无需导入更复杂的中间件
4040
- 重构知识库的 Agentic 配置逻辑,与 Tools 解耦
41-
- 新增Sqlite Web UI 方便通过Web页面管理数据库中数据[#463](https://github.com/xerrors/Yuxi-Know/pull/463)
41+
- 新增Sqlite Web UI 方便通过Web页面管理数据库中数据[#463](https://github.com/xerrors/Yuxi-Know/pull/463)
4242
- 将工具与知识库解耦,在 context 中就完成解耦,虽然最终都是在 Agent 中的 get_tools 中获取
4343
- 优化chunk逻辑,移除 QA 分割,集成到普通分块中
4444
- 重构知识库处理逻辑,分为 上传—解析—入库 三个阶段
45+
- 重构 MCP 相关配置,使用数据库来控制 [#469](https://github.com/xerrors/Yuxi-Know/pull/469)
4546

4647
### 修复
4748

4849
- 修复知识图谱上传的向量配置错误,并新增模型选择以及 batch size 选择
50+
- 修复部分场景下获取工具列表报错 [#470](https://github.com/xerrors/Yuxi-Know/pull/470)
4951

5052
## v0.4
5153

server/routers/knowledge_router.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ async def create_database(
8989
f"embed_model_name {embed_model_name}"
9090
)
9191
try:
92+
# 先检查名称是否已存在
93+
if knowledge_base.database_name_exists(database_name):
94+
raise HTTPException(
95+
status_code=409,
96+
detail=f"知识库名称 '{database_name}' 已存在,请使用其他名称",
97+
)
98+
9299
additional_params = {**(additional_params or {})}
93100
additional_params["auto_generate_questions"] = False # 默认不生成问题
94101

@@ -119,9 +126,11 @@ def remove_reranker_config(kb: str, params: dict) -> None:
119126
await agent_manager.reload_all()
120127

121128
return database_info
129+
except HTTPException:
130+
raise
122131
except Exception as e:
123132
logger.error(f"创建数据库失败 {e}, {traceback.format_exc()}")
124-
return {"message": f"创建数据库失败 {e}", "status": "failed"}
133+
raise HTTPException(status_code=400, detail=f"创建数据库失败: {e}")
125134

126135

127136
@knowledge.get("/databases/{db_id}")

src/knowledge/manager.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,20 @@ def get_databases(self) -> dict:
233233

234234
return {"databases": all_databases}
235235

236+
def database_name_exists(self, database_name: str) -> bool:
237+
"""检查知识库名称是否已存在
238+
239+
Args:
240+
database_name: 要检查的知识库名称
241+
242+
Returns:
243+
True 如果名称已存在,False 否则
244+
"""
245+
for db_id, meta in self.global_databases_meta.items():
246+
if meta.get("name", "").lower() == database_name.lower():
247+
return True
248+
return False
249+
236250
async def create_folder(self, db_id: str, folder_name: str, parent_id: str = None) -> dict:
237251
"""Create a folder in the database."""
238252
kb_instance = self._get_kb_for_database(db_id)
@@ -258,6 +272,10 @@ async def create_database(
258272
available_types = list(KnowledgeBaseFactory.get_available_types().keys())
259273
raise ValueError(f"Unsupported knowledge base type: {kb_type}. Available types: {available_types}")
260274

275+
# 检查名称是否已存在
276+
if self.database_name_exists(database_name):
277+
raise ValueError(f"知识库名称 '{database_name}' 已存在,请使用其他名称")
278+
261279
kb_instance = self._get_or_create_kb_instance(kb_type)
262280

263281
db_info = kb_instance.create_database(database_name, description, embed_info, **kwargs)

web/src/views/DataBaseView.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</template>
99
</HeaderComponent>
1010

11-
<a-modal :open="state.openNewDatabaseModel" title="新建知识库" @ok="handleCreateDatabase" @cancel="cancelCreateDatabase" class="new-database-modal" width="800px">
11+
<a-modal :open="state.openNewDatabaseModel" title="新建知识库" :confirm-loading="dbState.creating" @ok="handleCreateDatabase" @cancel="cancelCreateDatabase" class="new-database-modal" width="800px">
1212

1313
<!-- 知识库类型选择 -->
1414
<h3>知识库类型<span style="color: var(--color-error-500)">*</span></h3>
@@ -172,8 +172,8 @@ import { useRouter, useRoute } from 'vue-router';
172172
import { storeToRefs } from 'pinia';
173173
import { useConfigStore } from '@/stores/config';
174174
import { useDatabaseStore } from '@/stores/database';
175-
import { Database, FileDigit, Waypoints, Building2, DatabaseZap } from 'lucide-vue-next';
176-
import { LockOutlined, InfoCircleOutlined, QuestionCircleOutlined, PlusOutlined } from '@ant-design/icons-vue';
175+
import { Database, Waypoints, DatabaseZap } from 'lucide-vue-next';
176+
import { LockOutlined, InfoCircleOutlined, PlusOutlined } from '@ant-design/icons-vue';
177177
import { typeApi } from '@/apis/knowledge_api';
178178
import HeaderComponent from '@/components/HeaderComponent.vue';
179179
import ModelSelectorComponent from '@/components/ModelSelectorComponent.vue';
@@ -266,6 +266,7 @@ const resetNewDatabase = () => {
266266
267267
const cancelCreateDatabase = () => {
268268
state.openNewDatabaseModel = false
269+
resetNewDatabase()
269270
}
270271
271272
// 知识库类型相关工具方法

0 commit comments

Comments
 (0)