Skip to content

Commit 194ef51

Browse files
committed
feat: 更新数据库信息接口,支持可选的 LLM 配置信息,并在前端表单中添加相应字段
1 parent 022eea8 commit 194ef51

File tree

6 files changed

+80
-14
lines changed

6 files changed

+80
-14
lines changed

docs/changelog/roadmap.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
## Bugs
99

10-
- [ ] LightRAG 知识库查看不了解析后的文本,偶然出现,未复现
1110

1211
## Next
1312

@@ -41,4 +40,5 @@
4140
- [x] 优化 MCP 逻辑,支持 common + special 创建方式 <Badge type="info" text="0.3.5" />
4241
- [x] 修复本地知识库的 metadata 和 向量数据库中不一致的情况。
4342
- [x] v1 版本的 LangGraph 的工具渲染有问题
44-
- [x] upload 接口会阻塞主进程
43+
- [x] upload 接口会阻塞主进程
44+
- [x] LightRAG 知识库查看不了解析后的文本,偶然出现,未复现

server/routers/knowledge_router.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,16 @@ async def get_database_info(db_id: str, current_user: User = Depends(get_admin_u
7878

7979
@knowledge.put("/databases/{db_id}")
8080
async def update_database_info(
81-
db_id: str, name: str = Body(...), description: str = Body(...), current_user: User = Depends(get_admin_user)
81+
db_id: str,
82+
name: str = Body(...),
83+
description: str = Body(...),
84+
llm_info: dict = Body(None),
85+
current_user: User = Depends(get_admin_user),
8286
):
8387
"""更新知识库信息"""
84-
logger.debug(f"Update database {db_id} info: {name}, {description}")
88+
logger.debug(f"Update database {db_id} info: {name}, {description}, llm_info: {llm_info}")
8589
try:
86-
database = await knowledge_base.update_database(db_id, name, description)
90+
database = await knowledge_base.update_database(db_id, name, description, llm_info)
8791
return {"message": "更新成功", "database": database}
8892
except Exception as e:
8993
logger.error(f"更新数据库失败 {e}, {traceback.format_exc()}")

src/knowledge/base.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,14 +482,15 @@ def get_db_upload_path(self, db_id: str | None = None) -> str:
482482
os.makedirs(general_uploads, exist_ok=True)
483483
return general_uploads
484484

485-
def update_database(self, db_id: str, name: str, description: str) -> dict:
485+
def update_database(self, db_id: str, name: str, description: str, llm_info: dict = None) -> dict:
486486
"""
487487
更新数据库
488488
489489
Args:
490490
db_id: 数据库ID
491491
name: 新名称
492492
description: 新描述
493+
llm_info: LLM配置信息(可选,仅用于 LightRAG 类型知识库)
493494
494495
Returns:
495496
更新后的数据库信息
@@ -499,6 +500,11 @@ def update_database(self, db_id: str, name: str, description: str) -> dict:
499500

500501
self.databases_meta[db_id]["name"] = name
501502
self.databases_meta[db_id]["description"] = description
503+
504+
# 如果提供了 llm_info,则更新(仅针对 LightRAG 类型)
505+
if llm_info is not None:
506+
self.databases_meta[db_id]["llm_info"] = llm_info
507+
502508
self._save_metadata()
503509

504510
return self.get_database_info(db_id)

src/knowledge/implementations/lightrag.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,12 @@ async def get_file_content(self, db_id: str, file_id: str) -> dict:
332332
if rag:
333333
try:
334334
# 获取文档的所有 chunks
335-
assert hasattr(rag.text_chunks, "get_all"), "text_chunks does not have get_all method"
336-
all_chunks = await rag.text_chunks.get_all() # type: ignore
335+
# LightRAG v1.4+ 使用 JsonKVStorage,通过 _data 属性访问所有数据
336+
if hasattr(rag.text_chunks, "_data"):
337+
all_chunks = dict(rag.text_chunks._data)
338+
else:
339+
logger.warning("text_chunks does not have _data attribute, cannot get file content")
340+
return content_info
337341

338342
# 筛选属于该文档的 chunks
339343
doc_chunks = []

src/knowledge/manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,10 +366,10 @@ def file_existed_in_db(self, db_id: str | None, content_hash: str | None) -> boo
366366

367367
return False
368368

369-
async def update_database(self, db_id: str, name: str, description: str) -> dict:
369+
async def update_database(self, db_id: str, name: str, description: str, llm_info: dict = None) -> dict:
370370
"""更新数据库"""
371371
kb_instance = self._get_kb_for_database(db_id)
372-
result = kb_instance.update_database(db_id, name, description)
372+
result = kb_instance.update_database(db_id, name, description, llm_info)
373373

374374
async with self._metadata_lock:
375375
if db_id in self.global_databases_meta:

web/src/components/DatabaseHeader.vue

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<DeleteOutlined /> 删除数据库
3939
</a-button>
4040
<a-button key="back" @click="editModalVisible = false">取消</a-button>
41-
<a-button key="submit" type="primary" :loading="loading" @click="handleEditSubmit">确定</a-button>
41+
<a-button key="submit" type="primary" @click="handleEditSubmit">确定</a-button>
4242
</template>
4343
<a-form :model="editForm" :rules="rules" ref="editFormRef" layout="vertical">
4444
<a-form-item label="知识库名称" name="name" required>
@@ -47,6 +47,15 @@
4747
<a-form-item label="知识库描述" name="description">
4848
<a-textarea v-model:value="editForm.description" placeholder="请输入知识库描述" :rows="4" />
4949
</a-form-item>
50+
<!-- 仅对 LightRAG 类型显示 LLM 配置 -->
51+
<a-form-item v-if="database.kb_type === 'lightrag'" label="语言模型 (LLM)" name="llm_info">
52+
<ModelSelectorComponent
53+
:model_spec="llmModelSpec"
54+
placeholder="请选择模型"
55+
@select-model="handleLLMSelect"
56+
style="width: 100%;"
57+
/>
58+
</a-form-item>
5059
</a-form>
5160
</a-modal>
5261
</template>
@@ -62,6 +71,7 @@ import {
6271
DeleteOutlined,
6372
} from '@ant-design/icons-vue';
6473
import HeaderComponent from '@/components/HeaderComponent.vue';
74+
import ModelSelectorComponent from '@/components/ModelSelectorComponent.vue';
6575
import { h } from 'vue';
6676
6777
const router = useRouter();
@@ -74,7 +84,11 @@ const editModalVisible = ref(false);
7484
const editFormRef = ref(null);
7585
const editForm = reactive({
7686
name: '',
77-
description: ''
87+
description: '',
88+
llm_info: {
89+
provider: '',
90+
model_name: ''
91+
}
7892
});
7993
8094
const rules = {
@@ -88,21 +102,59 @@ const backToDatabase = () => {
88102
const showEditModal = () => {
89103
editForm.name = database.value.name || '';
90104
editForm.description = database.value.description || '';
105+
// 如果是 LightRAG 类型,加载当前的 LLM 配置
106+
if (database.value.kb_type === 'lightrag') {
107+
const llmInfo = database.value.llm_info || {};
108+
editForm.llm_info.provider = llmInfo.provider || '';
109+
editForm.llm_info.model_name = llmInfo.model_name || '';
110+
}
91111
editModalVisible.value = true;
92112
};
93113
94114
const handleEditSubmit = () => {
95115
editFormRef.value.validate().then(async () => {
96-
await store.updateDatabaseInfo({
116+
const updateData = {
97117
name: editForm.name,
98118
description: editForm.description
99-
});
119+
};
120+
121+
// 如果是 LightRAG 类型,包含 llm_info
122+
if (database.value.kb_type === 'lightrag') {
123+
updateData.llm_info = {
124+
provider: editForm.llm_info.provider,
125+
model_name: editForm.llm_info.model_name
126+
};
127+
}
128+
129+
await store.updateDatabaseInfo(updateData);
100130
editModalVisible.value = false;
101131
}).catch(err => {
102132
console.error('表单验证失败:', err);
103133
});
104134
};
105135
136+
// LLM 模型选择处理
137+
const llmModelSpec = computed(() => {
138+
const provider = editForm.llm_info?.provider || '';
139+
const modelName = editForm.llm_info?.model_name || '';
140+
if (provider && modelName) {
141+
return `${provider}/${modelName}`;
142+
}
143+
return '';
144+
});
145+
146+
const handleLLMSelect = (spec) => {
147+
console.log('LLM选择:', spec);
148+
if (typeof spec !== 'string' || !spec) return;
149+
150+
const index = spec.indexOf('/');
151+
const provider = index !== -1 ? spec.slice(0, index) : '';
152+
const modelName = index !== -1 ? spec.slice(index + 1) : '';
153+
154+
editForm.llm_info.provider = provider;
155+
editForm.llm_info.model_name = modelName;
156+
};
157+
106158
const deleteDatabase = () => {
107159
store.deleteDatabase();
108160
};

0 commit comments

Comments
 (0)