feat(agent): 默认启用可访问知识库

未显式配置知识库时默认使用当前用户可访问的全部知识库,保留显式空列表表示不启用知识库的语义。
This commit is contained in:
Wenjie Zhang 2026-05-12 13:40:44 +08:00
parent 6315f9ccae
commit 6733710e18
6 changed files with 26 additions and 18 deletions

View File

@ -127,11 +127,6 @@ async def resolve_visible_knowledge_bases_for_context(context) -> list[dict[str,
setattr(context, "_visible_knowledge_bases", [])
return []
enabled_names = {str(name).strip() for name in (getattr(context, "knowledges", None) or []) if str(name).strip()}
if not enabled_names:
setattr(context, "_visible_knowledge_bases", [])
return []
try:
raw_user_id = int(user_id)
except (TypeError, ValueError):
@ -139,7 +134,12 @@ async def resolve_visible_knowledge_bases_for_context(context) -> list[dict[str,
return []
result = await knowledge_base.get_databases_by_raw_id(raw_user_id)
databases = [db for db in (result.get("databases") or []) if str(db.get("name") or "").strip() in enabled_names]
databases = result.get("databases") or []
enabled_knowledges = getattr(context, "knowledges", None)
if enabled_knowledges is not None:
enabled_names = {str(name).strip() for name in enabled_knowledges if str(name).strip()}
databases = [db for db in databases if str(db.get("name") or "").strip() in enabled_names]
setattr(context, "_visible_knowledge_bases", databases)
return databases

View File

@ -55,11 +55,11 @@ class BaseContext:
},
)
knowledges: Annotated[list[str], {"__template_metadata__": {"kind": "knowledges"}}] = field(
default_factory=list,
knowledges: Annotated[list[str] | None, {"__template_metadata__": {"kind": "knowledges"}}] = field(
default=None,
metadata={
"name": "知识库",
"description": "知识库列表,可以在左侧知识库页面中创建知识库。",
"description": "知识库列表,可以在左侧知识库页面中创建知识库。默认选择当前用户可访问的全部知识库。",
"type": "list", # Explicitly mark as list type for frontend if needed
},
)

View File

@ -39,8 +39,7 @@ async def list_kbs(dummy: str, runtime: ToolRuntime) -> str: # Now has 2 params
# 打印 runtime—context 中的所有信息以进行调试
logger.debug(f"Runtime context: {runtime_context.__dict__}")
# 获取用户在当前对话中启用的知识库列表
enabled_kb_names = getattr(runtime_context, "knowledges", []) or []
enabled_kb_names = getattr(runtime_context, "knowledges", None)
# 获取用户可访问的知识库列表(包含名称和描述)
try:
@ -55,8 +54,10 @@ async def list_kbs(dummy: str, runtime: ToolRuntime) -> str: # Now has 2 params
logger.debug(f"用户 {user_id} 可访问的知识库列表: {all_kb_names}")
logger.debug(f"用户 {user_id} 当前对话启用的知识库列表: {enabled_kb_names}")
# 与启用的知识库取交集
available_kbs = [kb for kb in all_kbs if kb["name"] in enabled_kb_names]
if enabled_kb_names is None:
available_kbs = all_kbs
else:
available_kbs = [kb for kb in all_kbs if kb["name"] in enabled_kb_names]
if not available_kbs:
return "当前没有可访问的知识库"

View File

@ -19,7 +19,6 @@
- 前置任务,多知识库并行检索(扩展 query_kb
- 新增 query_keywords 工具,专门用于基于关键词命中的排序,也结合词频(和 BM25 的区别?)
- 评估,基于 Agent 的评估,这里应该是结合 Langfuse 实现
- 知识库选择修改为默认选择所有知识库dev2
### Bugs
- 目前的知识库的图片存在公开访问风险
@ -37,6 +36,7 @@
### 0.6.2 开发记录
<!-- 0.6.2 的内容请放在这里 -->
- 调整 Agent 知识库默认选择:未显式配置知识库时默认启用当前用户可访问的全部知识库,显式保存空列表仍表示不启用知识库。
- 优化评估基准自动生成:仅支持 commonrag/Milvus 知识库,默认参考 chunks 数量改为 1多 chunk 场景复用知识库向量检索选择相似 chunks不再对全量 chunks 重新计算 embedding并移除前端 Embedding 模型选择。
- 修复知识库文档入库状态回退:当已解析文件缺失 `markdown_file` 解析产物时,索引流程会将文件状态恢复为未解析,便于重新解析而不是停留在索引失败。
- 优化 Agent 输入框文件 mention用户级 workspace 文件候选改为从独立 workspace API 递归加载,不再依赖 active thread插入时仍转换为 `/home/gem/user-data/workspace/` 沙盒虚拟路径,并修复附件上传后未立即刷新 mention 候选的问题。

View File

@ -824,6 +824,9 @@ const handleModelChange = (key, spec) => {
//
const ensureArray = (key) => {
const config = agentConfig.value || {}
if (config[key] === null && configurableItems.value[key]?.template_metadata?.kind === 'knowledges') {
return getConfigOptions(configurableItems.value[key]).map((option) => getOptionValue(option))
}
if (!config[key] || !Array.isArray(config[key])) {
return []
}
@ -891,8 +894,7 @@ const openSelectionModal = async (key) => {
if (configurableItems.value[key]?.template_metadata?.kind === 'subagents') {
await loadSubagentOptions()
}
const currentValues = agentConfig.value[key] || []
tempSelectedValues.value = [...currentValues]
tempSelectedValues.value = [...ensureArray(key)]
selectionModalOpen.value = true
}

View File

@ -91,6 +91,7 @@ export function useAgentMentionConfig({
const configItems = configurableItems.value || {}
const currentConfig = agentConfig.value || {}
let includeAllKnowledgeBases = false
const allowedKbNames = new Set()
const allowedMcpNames = new Set()
const allowedSkillNames = new Set()
@ -101,7 +102,9 @@ export function useAgentMentionConfig({
const kind = item?.template_metadata?.kind
const val = currentConfig[key]
if (Array.isArray(val)) {
if (kind === 'knowledges' && val === null) {
includeAllKnowledgeBases = true
} else if (Array.isArray(val)) {
if (kind === 'knowledges') {
val.forEach((v) => allowedKbNames.add(v))
} else if (kind === 'mcps') {
@ -133,7 +136,9 @@ export function useAgentMentionConfig({
}
})
const knowledgeBases = availableKnowledgeBases.value.filter((kb) => allowedKbNames.has(kb.name))
const knowledgeBases = includeAllKnowledgeBases
? availableKnowledgeBases.value
: availableKnowledgeBases.value.filter((kb) => allowedKbNames.has(kb.name))
const mcps = availableMcps.value.filter((mcp) => allowedMcpNames.has(mcp.name))
const skills = availableSkills.value.filter((skill) => {
const skillName = skill.name || ''