diff --git a/docs/develop-guides/roadmap.md b/docs/develop-guides/roadmap.md index ddecc8d3..789ffdcb 100644 --- a/docs/develop-guides/roadmap.md +++ b/docs/develop-guides/roadmap.md @@ -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 400;General 分块硬切支持显式 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` 或真实外键场景。 diff --git a/web/src/components/AgentChatComponent.vue b/web/src/components/AgentChatComponent.vue index fe1f6629..da5f7522 100644 --- a/web/src/components/AgentChatComponent.vue +++ b/web/src/components/AgentChatComponent.vue @@ -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 }