- 存储: 知识库文件存 {workspace_base}/{org}/rags/{kb}/ (机构目录下开设rags目录)
- 容量: rag_check_storage_quota 参数控制是否检查机构上限(默认不检查)
- 权限: rag_knowledge_bases 加 maintain_roles/search_roles; 空=同机构默认可用
维护入口(upload/delete/rename/tree/tags)校验maintain; 检索入口(search/file_list/file_serve)校验search
- file_serve.dspy: 下载/预览走校验端点, 堵住/idfile/猜路径越权
- 机构隔离: 跨机构KB一律拒绝
31 lines
1.6 KiB
Plaintext
31 lines
1.6 KiB
Plaintext
ns = params_kw.copy()
|
||
db = DBPools()
|
||
dbname = get_module_dbname('rag')
|
||
async with db.sqlorContext(dbname) as sor:
|
||
env = request._run_ns
|
||
userorgid = await env.get_userorgid()
|
||
kb_id = uuid()
|
||
name = ns.get("name", "")
|
||
desc = ns.get("description", "")
|
||
# 向量引擎:bge-m3=文本(在线) / qwen3-vl-embedding=多媒体(在线) / clip-vith14=多媒体(GPU本地CLIP)
|
||
emb_type = ns.get("embedding_type", "") or ns.get("embedding_engine", "")
|
||
if emb_type not in ("bge-m3", "clip-vith14", "qwen3-vl-embedding"):
|
||
emb_type = "bge-m3"
|
||
# 知识库级角色权限:维护角色/检索角色(逗号分隔,空=同机构默认可用)
|
||
maintain_roles = ns.get("maintain_roles", "") or ""
|
||
search_roles = ns.get("search_roles", "") or ""
|
||
await sor.sqlExe(
|
||
"INSERT INTO rag_knowledge_bases (id, name, description, org_id, embedding_engine, vdb_collection, doc_count, total_size, chunk_count, status, maintain_roles, search_roles, created_at) "
|
||
"VALUES (${id}$, ${name}$, ${desc}$, ${org_id}$, ${emb}$, 'rag_collection', 0, 0, 0, 'active', ${mr}$, ${sr}$, NOW())",
|
||
{"id": kb_id, "name": name, "desc": desc, "org_id": userorgid, "emb": emb_type,
|
||
"mr": maintain_roles, "sr": search_roles})
|
||
# 机构 rags 目录下建知识库子目录:{workspace_base}/{org}/rags/{kb}/
|
||
from rag.init import get_rags_base, ensure_kb_dir
|
||
rags_base = await get_rags_base(sor)
|
||
ensure_kb_dir(rags_base, userorgid, kb_id)
|
||
return {
|
||
"widgettype": "urlwidget",
|
||
"options": {"url": entire_url('/rag/knowledge_bases_list/index.ui')}
|
||
}
|
||
return {"error": "failed"}
|