wanghanlin
|
90754d15b2
|
perf(rag): MULTI_QUERY 多路检索并行化并避免 FAQ 重复语义匹配
- 新增 ragRetrieveExecutor 有界线程池 + knowledge.rag.multiquery.parallel 开关:
多路检索默认并行执行(各路 embedding HTTP + PG 查询相互独立,可把 N 路串行降为 1 段最慢路),
按原查询顺序合并去重,结果与串行路径一致;单路异常降级为空不拖垮整次检索;
饱和时退回请求线程串行(CallerRuns),供高并发/embedding 侧限流时置 false 回退
- ChatPipeline/RagPipeline:FAQ 高置信已「干净跑完」完整三级匹配仍未命中时,进入 RAG 检索跳过
重复的 FAQ 匹配(FaqMatchOutcome 携带 completedCleanly 标记),避免同一请求两次 FAQ 语义 embedding;
异常降级的 miss 不跳过,防止误跳
- FaqMatchEngine:语义匹配前加 faq_embedding 门控,作用域内无向量候选时直接返回未命中,
省掉一次注定失败的语义 embedding HTTP
|
1 week ago |
wanghanlin
|
a7d0ad87c9
|
feat(doc): 文档列表目录树默认收起并移除标签筛选
- 目录树去除 expand-all,初始仅显示分类、子目录折叠,点击展开
- 移除工具栏「全部标签」下拉及其数据源链路:filterTag/tagOptions、
api 的 listDocuments tag 参数与 getTagList、store 的 tags/loadTags、
路由守卫预加载
- 后端删除 /document/list 的 tag 参数过滤与 /tag/list 聚合接口
(getTagList 实现一并移除)
- 文档自带 tags 属性、行内/详情展示、向量 metadata 均保留不变
|
1 week ago |
wanghanlin
|
6c35aa0ff6
|
style(frontend): 上传页让「选择文件夹上传」与「选择文件」按钮同行显示
将独立成行的文件夹上传按钮并入 t-upload file-flow 的 trigger 插槽,
与「选择文件」按钮并排一行,消除上传区顶部孤零按钮的松散观感。
- 文件夹上传:@click.stop.prevent 触发独立 webkitdirectory input
- 选择文件:调用官方实例方法 uploadRef.triggerUpload() 打开多文件选择器
- 两个入口各自触发、互不误触;拖拽卡与底部上传按钮逻辑保持不变
|
1 week ago |
wanghanlin
|
06edac2738
|
feat(frontend): 文档列表位置列显示目录路径并修复一屏滚动布局
- 文档列表分类列改为「位置」列:沿 folderMap 回溯 parentId 拼出目录路径(不含分类名),直接挂分类根显示 —,长路径省略号截断+悬停 title 看全
- 修复文档卡片一屏高度布局:补 .t-loading__parent 参与 flex 高度链,目录树/表格在面板内滚动不再撑高整页
|
1 week ago |
wanghanlin
|
06fbbaa41d
|
chore(frontend): 更新 SDK 测试面板构建产物引用
|
1 week ago |
wanghanlin
|
d0cd06f9fc
|
fix(document): 修复批量上传向量化只成功小文档问题并加固处理链路
- 移除逐 chunk 串行 AI 关键词提取(MyKeywordEnricher):产出 excerpt_keywords 全库无检索消费点,却将外部调用放大 chunkCount 倍且与在线对话共用模型抢限流
- 向量化改按批入库(默认 50 块/批, knowledge.vector.batch-size)逐批 try-catch 隔离:失败批只记录缺失区间继续,已入库块保留,error_message 聚合"已入库 x/y 块+缺失区间+原因",chunk_count 改为实际入库块数
- 新增文档级失败自动整体重试(≤2 次, 仅 timeout/429/5xx 等瞬时错误):重试前清残留向量防重复;处理期间删除文档即终止写入避免孤儿向量;外层兜底保证状态不悬挂 PROCESSING
- Embedding 客户端(DashScope/OpenAI 兼容/豆包多模态)补显式 connect 10s/read 60s 超时,避免慢响应无限挂起占死 documentExecutor 线程
- 文档同步 CLAUDE.md/README.md,新增 knowledge.vector.batch-size 配置说明
|
1 week ago |
wanghanlin
|
459cabb1bc
|
fix(mcp-server): 修复启用开关触发 toggle/refresh 请求死循环
- 前端 toggleMcpServer 补发 { active } 请求体,与后端 @RequestBody 契约一致(此前 active 拼在 query、无 body,每次点开关必 400)
- 后端 toggleActive 兼容 query 兜底,避免旧调用方仍 400
- axios 拦截器加重试上限(_retry),刷新改用裸 axios 发起,切断 401→refresh→重试 自激递归
- MCP 开关失败回滚 _active 状态并加 _toggling 防连点
|
1 week ago |
wanghanlin
|
9896dec82a
|
feat(frontend): DocList 目录树支持拖拽宽度与更多操作菜单,接入 BaseTable
目录树宽度可拖拽调节(分隔条)并将节点操作收敛为 t-dropdown 更多菜单(新建子目录/重命名/删除);文档表格接入 BaseTable,改为固定表头 + 内容超高内部滚动(基于视口 calc 高度)。因与目录树样式在同一段 CSS 中交织,同文件一并提交
|
1 week ago |
wanghanlin
|
97f9befc6d
|
refactor(frontend): 统一列表表格为 BaseTable 组件
新增 BaseTable 封装 t-table,统一下发小尺寸/悬浮/占满宽度/固定表头,操作列自动右固定,替换 13 个列表页 t-table,补齐缺失 loading;同步 UI 开发准则与组件声明
|
1 week ago |
wanghanlin
|
1ea991e5b8
|
fix(frontend): 全局重置 body margin 消除页面多余滚动
浏览器默认 body margin:8px 未清零,导致 .layout-container(100vh) 与登录页 min-height:100vh 超出视口出现滚动条及四周白边。在 shared.css 顶部新增全局基础重置(margin/padding 清零 + box-sizing:border-box)。
|
2 weeks ago |
wanghanlin
|
2668b8e73b
|
feat(document): 文档列表支持移动到目录(统一分类根/目录)
- 后端 moveDocuments 统一移动:目标为目录时校验存在并强制采用目录所属分类,分类变更时同步 vector_store 的 categoryId metadata
- DocumentController 批量移动接口新增 folderId 参数(extractLong 兼容雪花 ID 字符串)
- 前端 DocList 新增单行/批量「移动」弹窗,复用目录树 t-tree 选目标,替换原「移动分类」
|
2 weeks ago |
wanghanlin
|
f06422d5e9
|
docs: 补充开发规范与踩坑记录
- 列表排序字段白名单、vector_store 物理删除、数据库初始化幂等自愈、Java 文本块拼 SQL 等规则
|
2 weeks ago |
wanghanlin
|
1ffd960377
|
feat(document): 目录树独立滚动与文件夹上传完善
- 文档列表目录树独立滚动
- 上传页目录选择器改为先选分类再选目录
- 文件夹上传标题剥离目录前缀(原样文件名)
- 部分文件失败时弹窗按原因分组展示失败明细
|
2 weeks ago |
wanghanlin
|
562370ece5
|
fix(backend): 数据库初始化幂等自愈与 vector_store 物理删除
- DatabaseInitConfig 改为全幂等自愈(ADD COLUMN IF NOT EXISTS + 回填 + 索引/触发器幂等)
- HybridSearchService 移除对 vector_store 的 is_delete 过滤(该表无此列,物理删除)
|
2 weeks ago |
wanghanlin
|
dc8aa7a9d1
|
refactor(backend): 列表排序字段白名单统一走 SortUtils 防 SQL 注入
- 新增 SortUtils.resolveColumn 统一排序字段白名单映射,未知字段回退默认列
- 各 Controller/Service 列表接口新增 sortField/sortOrder 参数并接入白名单
- 前端列表页列加 sorter 并透传服务端排序参数
|
2 weeks ago |
wanghanlin
|
367ec79401
|
fix(document): 修复文件夹上传连接池耗尽与目录树独立滚动
- 移除 DocumentProcessingService 异步方法上的跨方法事务,AI 关键词提取/向量化期间不再占用数据库连接,避免文件夹批量上传时连接池被占满超时
- 新增有界 documentExecutor 线程池,替代默认无界 SimpleAsyncTaskExecutor,防线程爆炸与大模型限流
- 文档列表页目录树与列表改为左右独立滚动
|
2 weeks ago |
wanghanlin
|
780917561b
|
feat(document): 新增知识库文档目录(文件夹)功能
- 新增 KnowledgeFolder 实体/Mapper、FolderService、FolderController,支持目录树增删改查
- 文档新增 folderId 字段,列表支持按目录筛选与服务端排序
- 新增文件夹批量上传(按相对路径自动创建子目录)
- 文档列表页新增左侧目录树面板,上传页新增目录选择与文件夹上传
|
2 weeks ago |
wanghanlin
|
8256e9ee85
|
fix(upload): 文档上传去重改为仅同分类内查重
去重范围从全局收窄为按分类:checkContentDuplicate 增加 category_id 条件,不同分类允许内容重复,未分类按 0 归并;修正误导文案并改用 selectList 规避多结果异常
|
2 weeks ago |
wanghanlin
|
9d5fe80fb3
|
fix(upload): 修复文档上传多文件失效与 401 跳登录
- 上传改走 axios 复用 401 自动刷新,显式 multipart/form-data 修复 MultipartException
- DocUpload 文件 Tab 加 multiple,上传 handler 按 TDesign requestMethod 契约重写
- AuthController 的 refresh cookie Secure 属性按请求 scheme 动态判断,HTTP 自动降级
- application.yml / application-dev.yml 统一 refresh-cookie-secure 配置
|
2 weeks ago |
wanghanlin
|
1986500321
|
style(frontend): API Key 角色绑定弹窗简化角色名展示
角色绑定弹窗 checkbox 仅展示角色 name,移除冗余的 roleKey 显示
|
2 weeks ago |
wanghanlin
|
cbbb588c69
|
chore: 清理角色表误加的 sort_order 孤儿列
customer_service_role 无排序权重需求,按 id 排序即可;sort_order 列系误加且无代码引用,启动时 DROP COLUMN IF EXISTS 幂等清理
|
2 weeks ago |
wanghanlin
|
1e768a7409
|
fix(service): 修复角色创建主键获取异常
创建角色改用 RETURNING id 显式取回主键,避免 PostgreSQL JDBC 对 RETURN_GENERATED_KEYS 追加 RETURNING * 导致 GeneratedKeyHolder.getKey() 抛 multiple keys 异常
|
2 weeks ago |
wanghanlin
|
a2dff86923
|
feat(rag): FAQ 匹配支持分类隔离并在闲聊意图前精准匹配
FaqMatchEngine 三级匹配(精确/关键词/语义)新增 categoryIds 分类过滤,授权分类与未分类 FAQ 可见;ChatPipeline 闲聊(CHITCHAT)意图前先尝试 FAQ 精准匹配,命中则短路返回标准答案;同步更新 PipelineFlow 架构图
|
2 weeks ago |
wanghanlin
|
3038cd0387
|
fix(security): CORS 拆分为 SDK 开放与管理白名单双轨
修复 9338fcb 收紧 CORS 白名单后引发的线上 403 回归:
将 corsConfigurationSource 与 addCorsMappings 拆分为两套配置——SDK 第三方接入接口
(/ai/**、/category/tree、/category/list、/feedback、/attachment/upload)开放 allowedOriginPatterns("*"),
管理后台接口保持 allowed-origins 白名单防 CSRF;并在 application-prod.yml 白名单补上线上域名
https://aidoc.dgscdw.com:11300,同时记录 CORS 双轨制踩坑规范。
|
3 weeks ago |
wanghanlin
|
9fe3ee6828
|
fix(sdk): 修复历史会话不显示图片附件
- MessageConverter 落库时持久化多模态 Media 到 metadata._media
- ConversationService 历史消息接口提取 _media 为顶层 images 字段
- SDK 前端历史映射补齐 images,复用 renderUserBubble 附件渲染
|
3 weeks ago |
wanghanlin
|
081758128c
|
fix(app): 修复切换会话后用户提问被查询重写结果覆盖
RAG 查询重写(REWRITE 等策略)的润色产物被当作用户消息落库到
chat_message 会话记忆表,导致 ChatSDK 切换角色/对话后前端拉取
历史显示的是润色版而非原始提问。
ChatPipeline 在 RAG 分支将 finalMessage 由 rag.rewrittenQuery()
改为 ctx.message(),使查询重写仅服务于检索,用户消息(传给模型、
落库、前端展示)统一为原始提问。
|
3 weeks ago |
wanghanlin
|
377aad48db
|
fix(app): 修复切换推理模型后对话流式超时
chatStreamOpenAi 流开始时立即发出首片 chunk(role=assistant),确保 SSE 响应头及时 flush,避免推理模型思考阶段无输出导致前端等待首字节触发 60s 超时;AI_READ_TIMEOUT 由 120s 放宽到 300s,给推理模型思考+生成留足总时长
|
3 weeks ago |
wanghanlin
|
0aa11a5ec6
|
fix(app): 修复推荐问题显示哨兵标记异常
SuggestionResponseParser 剥离旧版 ___SUGGESTIONS___ 哨兵标记,避免按行降级解析成垃圾条目;同步更新 suggestion_prompt 种子默认值,移除与新架构"只输出 JSON 数组"要求矛盾的哨兵文案
|
3 weeks ago |
wanghanlin
|
d5d392aca4
|
feat(sdk): 支持图片上传与多模态对话
SDK 前端新增图片附件上传与多模态对话能力,输入区新增附件按钮与图片预览,新增 allowImageUpload 配置项;/attachment/upload 鉴权改由 SdkAuthFilter 承担(移除方法级 @PreAuthorize),JwtAuthFilter/SecurityConfig 同步放行
|
3 weeks ago |
wanghanlin
|
5856237746
|
fix(frontend): 移除分类管理列表中的文档数量显示
|
3 weeks ago |
wanghanlin
|
9338fcbd5f
|
feat(security): JWT token_version 服务端撤销与登录安全加固
- 新增 token_version 服务端撤销机制:改密/禁用/角色变更/登出时自增,使已签发 token 立即失效
- refresh token 从 localStorage 迁移到 httpOnly Cookie,access token 有效期缩短至 15 分钟
- 新增登录失败锁定(LoginAttemptService)与密码强度校验(PasswordValidator)
- SDK JWT 密钥支持环境变量注入,使用默认密钥时告警
修复:
- assignRoles 角色未变化仍自增 token_version,导致用户新建用户时 token 被误失效而跳转登录
- 角色 ID 解析兼容前端字符串传输,避免雪花 ID 精度丢失导致 ClassCastException
- updateFill 改用 setFieldValByName,修复 update_time 未自动填充的问题
|
3 weeks ago |
wanghanlin
|
f0325d8f2d
|
feat(frontend): AI 执行链页面新增导出图片功能
- PipelineFlow.vue 增加导出 PNG/SVG 按钮,支持将当前渲染的流程图导出为高清图片
- 同步更新 static/sdk/test.html 构建产物资源引用
|
3 weeks ago |
wanghanlin
|
d6a20f228a
|
feat: 支持图片/附件 SFTP 上传、多模态对话与 FAQ Markdown 编辑器
后端:
- 新增 SFTP 附件上传服务与 /attachment/upload 接口
- 新增 StorageProperties 集中化存储配置(支持 DataSize 50MB)
- ChatContext 新增 imageUrls,AI 调用链路透传多模态图片
- AssistantApp 构造 UserMessage(text, Media) 实现视觉输入
- ContentSafetyAdvisor MASK 脱敏时保留原消息图片 Media
- 配置拆分到 application-dev.yml / application-prod.yml(对齐参考项目)
前端:
- 对话面板支持图片/附件上传与缩略图/下载链接展示
- chat.ts 透传 imageUrls,chatAdapter 增加 Attachment 模型
- FAQ 编辑器替换为 md-editor-v3,支持粘贴图片自动上传
- FAQ 表格答案摘要去除 markdown 语法
- UI-DEV-GUIDE 补充 FormDrawer 使用规范
|
3 weeks ago |
wanghanlin
|
08fdc2e82d
|
修改样式
|
3 weeks ago |
wanghanlin
|
321bee93ff
|
fix(mcp): 修复 SSE 端点带路径前缀时连接 404
HttpClientSseClientTransport 内部用 URI.resolve 拼接端点,对以 / 开头的
sseEndpoint 会整体替换 path,导致 /mcp-cdw/sse 被解析成 /sse 丢失前缀。
改为显式拆分 origin 与 path,分别作为 baseUri 与 sseEndpoint 传入,
并兼容用户填 base 或完整 SSE URL 两种写法。
|
3 weeks ago |
wanghanlin
|
11572a7023
|
修改样式
|
3 weeks ago |
wanghanlin
|
83964afcfc
|
refactor(client): 外围组件原生化并清理死代码,缩小 SDK 体积
- t-select/t-dialog/t-alert/t-tag/t-button 替换为原生 DOM,删 5 条组件 import 与 omi 直接依赖,min 版缩小约 212KB
- 清理死代码:images.d.ts、失效测试、dist 残留、getMessages、死类型、showAdminPanel、未用 i18n key、t-tag 死 CSS
- 修复 i18n 缺失 confirm/cancel 翻译与自绘确认框 ESC 冲突
|
3 weeks ago |
wanghanlin
|
a2971ba2c2
|
修改样式
|
3 weeks ago |
wanghanlin
|
b56cea0c8c
|
fix(client): 历史会话时间智能分档显示并修复操作栏按钮 tooltip
历史会话列表时间由原始 ISO 字符串改为智能分档:今天/昨天显示 HH:mm,同年显示 MM-DD HH:mm,跨年显示 YYYY-MM-DD HH:mm。
操作栏按钮(重新生成/复制/点赞/点踩)补齐 hover 文字说明:修复 tooltip 浮层 z-index 低于聊天窗(9999)被遮挡,及 .t-tooltip 深色背景样式在 light DOM 浮层缺失的问题(globalCSS 只对 shadow DOM 生效)。
|
3 weeks ago |
wanghanlin
|
431b1f2b1d
|
fix(client): 修复第三方接入 SDK 后 markdown 排版与标签样式缺失
根因:tdesign-web-components 的聊天/markdown 变量(--td-chat-*/--td-chat-md-*/--td-chat-input-*)
定义在 globalCSS 的 constructable stylesheet 中,选择器为 :root;但 adoptedStyleSheets 里的
:root 不匹配 shadow root,导致这些变量无法进入渲染 markdown 的 shadow DOM,标题/列表/引用/
代码块回退为初始值。t-tag 是 light DOM 组件,其 .t-tag 样式同样只在 globalCSS 中、进不了 light DOM。
改动:
- styles.ts 新增 tdChatVars(),将聊天/markdown/input 变量自包含声明在 .csk-root 上
- styles.ts 补注入 .csk-root .t-tag 系列 light DOM 样式
- 配合此前 tdThemeVars() 的主题变量,SDK 样式完全自包含,不再依赖宿主页面
|
4 weeks ago |
wanghanlin
|
da031c6ff0
|
fix(client): 修复重新生成清空历史,优化引用来源/推荐问题与历史滚动
- 重新生成改为调用后端会话截断接口,同步前后端数据,避免历史回复被清空
- 引用来源折叠开关与推荐问题改用 t-button,风格对齐 ChatActionbar 操作栏
- 历史消息渲染后延迟滚动到底部,修复停在滚动条中间的问题
|
4 weeks ago |
wanghanlin
|
021dfa9199
|
回复内容自适应 SDK 弹窗宽度
|
4 weeks ago |
wanghanlin
|
a1328994a5
|
feat(mcp): MCP 服务配置支持自定义请求头鉴权
- mcp_server_config 新增 headers JSONB 字段,SSE 模式通过 customizeRequest 注入请求头
- 敏感头(Authorization 等)返回前脱敏,更新时未改动保留原值
- DatabaseInitConfig 与 init-database.sql 同步新增 headers 列迁移
- McpClientManager 增加 @DependsOn(databaseInitConfig) 保证列迁移先于客户端加载
- 前端 MCP 配置弹窗新增请求头输入框
|
4 weeks ago |
wanghanlin
|
97f8f1a8f0
|
回复内容自适应 SDK 弹窗宽度
|
4 weeks ago |
wanghanlin
|
e23b70ffca
|
feat(client): SDK 界面重构改用 TDesign Web Components 组件
- 聊天核心:消息气泡/输入框/操作栏/加载态改用 t-chat-message/t-chat-sender/t-chat-action/t-chat-loading
- 外围 UI:知识库下拉/推荐问题/离线横幅改用 t-select/t-tag/t-alert
- Markdown 渲染由 t-chat-item 内置 cherry-markdown 承担,移除自研 marked 渲染器与 marked.min.js
- 构建管线:引入 tdesign-web-components@1.2.10 按需打包,mermaid 用本地 stub 替换省约 1.2MB
- 清理重构后死代码与死样式(escapeHtml/getLocale/appendStreamingCaret/offlineBannerEl 等)
- 同步更新测试面板断言(T3/T6/T10 适配 t-chat-sender)与 README/CLAUDE.md
|
4 weeks ago |
wanghanlin
|
b9f91d0903
|
fix(sse): 修复 SSE 鉴权头覆盖问题并同步测试用例文档
- sse.ts authHeaders 仅当调用方未显式提供 Authorization 时才注入管理后台 token,避免覆盖测试面板传入的 SDK Token
- client/README.md、client/CLAUDE.md 同步测试用例数量 22 → 10
|
4 weeks ago |
wanghanlin
|
8132f26891
|
feat(sdk-test): 测试面板重构为 Vue 3 + TDesign Chat 应用
- 新增 Vite 多页入口 sdk-test.html 与 SdkTestPanel.vue,用 TDesign Chat(ChatList/ChatSender/ChatActionbar)渲染对话演示
- 对话演示直调 GET /ai/chat/stream(OpenAI 格式),复用 readSSEStream 解析 delta.content,支持同步/流式、RAG 开关与来源展示
- SDK 集成验证区精简为 10 个核心用例,接口统一迁到新路径 /ai/chat*
- cp-to-static.mjs 构建后将 sdk-test.html 移动到 static/sdk/test.html
|
4 weeks ago |
wanghanlin
|
2f09b3fabf
|
feat(client): SDK 悬浮窗口对话视觉对齐 TDesign Chat 规范
- styles.ts 对齐气泡圆角/头像/时间戳/输入框/发送按钮/加载态/操作栏/来源卡片/快捷芯片视觉
- dom.ts 微调时间戳与操作栏相对位置
- 保持零依赖 IIFE、csk-* 类名零增删改、主色变量与暗色模式同步
|
4 weeks ago |
wanghanlin
|
940caedea8
|
feat(部署): 前端静态资源免认证访问与打包配置
- pom.xml 将 static/** 单独作为资源目录,关闭 filtering 并指定 targetPath 避免平铺到 classes 根目录
- JwtAuthFilter 跳过首页与静态资源路径,避免管理后台密钥误校验产生 WARN 日志
- SecurityConfig 放行 /、/index.html、/assets/**、/sdk/** 等静态资源与首页
|
4 weeks ago |
wanghanlin
|
60d336d384
|
fix(前端): 反馈看板时间列统一 formatDate 格式化
- 反馈看板「时间」列改用 formatDate 输出 YYYY-MM-DD HH:mm:ss,空值显示 -
- 提示词追踪移除重复的 fmtDateTime 内联实现,复用统一 formatDate
- 反馈看板新增「补充说明」列及消息详情补充说明展示
|
4 weeks ago |