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" # 知识库级角色权限:维护角色/检索角色(多选 checkbox 提交 list,兼容逗号串) def _roles_csv(v): if isinstance(v, (list, tuple)): return ','.join([str(x) for x in v if str(x).strip()]) return str(v or '') maintain_roles = _roles_csv(ns.get("maintain_roles", "")) search_roles = _roles_csv(ns.get("search_roles", "")) 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"}