fix: 修复 refs 在部分场景下显示错误的问题

This commit is contained in:
Wenjie Zhang 2026-06-06 18:43:25 +08:00
parent e5553f1bfc
commit d19264bf77
2 changed files with 22 additions and 15 deletions

View File

@ -59,7 +59,7 @@
- 重构知识库共享权限:`share_config` 改为全局共享、部门共享、指定人可访问三档,部门共享必须包含当前用户部门,指定人可访问必须包含当前用户,并补充权限过滤测试。
- 移除知识库沙盒文件系统映射:不再通过 `/home/gem/kbs` 暴露知识库文件树Agent 继续使用 `query_kb``open_kb_document` 访问知识库内容。
- 规范 Agent 知识库 Search/Find/Open 工具协议:`resource_id` 统一表示知识库 `kb_id`Search 返回结构化 `resource_id/file_id/chunk` 结果,新增 `find_kb_document` 在已知文件内做关键词或正则定位Open 默认窗口扩大到 1800 行。
- 收敛知识库分块配置:分块预设仅表达策略选择,通用分块参数统一通过 `chunk_parser_config` 传递;移除 `chunk_size`、`chunk_overlap`、`qa_separator` 等旧 root 字段兼容。
- 收敛知识库分块配置:分块预设仅表达策略选择,通用分块参数统一通过 `chunk_parser_config` 传递;移除 `chunk_size`、`chunk_overlap`、`qa_separator` 等旧 root 字段兼容Book 分块补充输出 token 上限保护,避免层级合并后生成超长 chunk 导致 embedding 400General 分块硬切支持显式 hard limit默认 512 token 目标下允许到 768 再切分并合并短尾巴
- 收敛知识库文件解析参数:文件级 `processing_params` 统一保存 `ocr_engine``ocr_engine_config`,解析阶段直接使用该结构并保留分块参数快照。
- 修复知识库文件大小显示为 0 的问题:文件上传时 `file_sizes` 参数未正确传播或历史数据缺失导致 DB 中 `file_size``None`;新增 `MinIOClient.stat_file/astat_file` 获取文件大小方法,`add_file_record` 在 `size` 缺失时从 MinIO 回补,`_load_metadata` 加载元数据后自动为缺少 `size` 的文件从 MinIO 补全并持久化。
- 优化评估基准自动生成:生成任务支持配置队列并发数,默认 10范围 1-20。
@ -67,7 +67,7 @@
- 扩展知识库上传来源:添加“从工作区上传”模式,后端将当前用户工作区文件预处理上传到 MinIO前端沿用现有 `addDocuments` 入库链路提交 MinIO URL、内容哈希和文件大小。
- 重构知识库详情页布局:`DatabaseInfo` 改为顶部详情 header + 左侧功能 tab 侧边栏 + 右侧内容区Milvus 默认进入文件管理并将检索测试、知识图谱、知识导图、检索配置、RAG 评估和评估基准统一纳入侧边栏导航;只读连接器保留检索测试与检索配置。
- 整合知识导图接口:移除独立 mindmap router 与前端 API 模块,思维导图生成、查询和文件列表接口统一收敛到知识库 API 下。
- 收敛独立模型配置模块运行时:运行时 chat / embedding / rerank 均统一从 provider 模块与模型缓存读取 `provider_id:model_id`旧版静态模型配置、v1 slash spec、旧模型列表接口和 Ollama 适配已移除;内置 provider 模板补充 XiaomiMiMo、XiaomiMiMo Token Plan CN 与 Kimi Code`kimi-for-coding`)。
- 收敛独立模型配置模块运行时:运行时 chat / embedding / rerank 均统一从 provider 模块与模型缓存读取 `provider_id:model_id`旧版静态模型配置、v1 slash spec、旧模型列表接口和 Ollama 适配已移除;内置 provider 模板补充 XiaomiMiMo、XiaomiMiMo Token Plan CN 与 Kimi Code`kimi-for-coding`Embedding 请求对 429 限流执行最多 10 次退避重试,对 5xx/网络临时错误执行短重试
- 调整智能体配置归属与字段权限:`AgentConfig` 从部门共享改为按 `uid` 隔离,所有登录用户可管理自己的配置;`BaseContext` 支持字段级 `auth` 元数据,后端按用户角色过滤可见与可保存的配置项。
- 新增用户级沙盒环境变量:增加 `agent_envs` 表与 `/api/user/agent-env` 接口,设置面板支持当前用户维护 Agent 沙盒环境变量;创建新沙盒时与全局 `sandbox.env` 合并注入,用户变量优先。
- 收敛用户身份命名:原业务登录标识统一改为 `uid`Agent/LangGraph runtime、conversation、agent_run、sandbox 路径和前端用户态均使用字符串 `uid``user_id` 仅保留给外部响应中的数值 `users.id` 或真实外键场景。

View File

@ -53,7 +53,7 @@
v-if="displayItem.type === 'message'"
:message="displayItem.message"
:is-processing="isDisplayMessageProcessing(row.conv, displayItem)"
:show-refs="showMsgRefs(displayItem.message)"
:show-refs="showMsgRefs(displayItem.message, row.conv)"
:hide-tool-calls="true"
:mention="mentionConfig"
@retry="retryMessage(displayItem.message)"
@ -972,20 +972,28 @@ const shouldSuppressRefsForApproval = () =>
isProcessing.value
)
// refs/
// - human message
// -
// human message AI resume
const isConversationSettled = (conv) => {
const convs = conversations.value
const idx = convs.indexOf(conv)
if (idx === -1) return false
const next = convs[idx + 1]
if (next) {
return next.messages?.[0]?.type === 'human'
}
return !(isProcessing.value || isReplyLoading.value)
}
// Refs
const shouldShowRefs = computed(() => {
const convs = conversations.value
const lastConv = convs.length ? convs[convs.length - 1] : null
return (conv) => {
if (!getLastMessage(conv) || conv.status === 'streaming' || shouldSuppressRefsForApproval()) {
return false
}
// resume refs
// isReplyLoading/ isStreaming false
if (conv === lastConv && (isProcessing.value || isReplyLoading.value)) {
return false
}
return true
return isConversationSettled(conv)
}
})
@ -2254,14 +2262,13 @@ const getLastMessage = (conv) => {
return null
}
const showMsgRefs = (msg) => {
const showMsgRefs = (msg, conv) => {
if (shouldSuppressRefsForApproval()) {
return false
}
// resume /
// isReplyLoading / isStreaming false
if (msg.isLast && (isProcessing.value || isReplyLoading.value)) {
// human message AI
if (!isConversationSettled(conv)) {
return false
}