wei-py
|
28e77223ef
|
feat(chat): 同次回答携带引用来源
|
3 weeks ago |
wanghanlin
|
0838dca61a
|
fix(auth): 修复后台会话长期不失效,JWT 时间配置改用可读单位
问题
- 关闭后台页面数天后重新打开,可跳过登录页直接进入后台
- 根因:refresh token 有效期 7 天且滚动续期无上限;refresh Cookie 为持久化 Cookie
(maxAge 硬编码 7 天)在浏览器关闭后不会删除,重开页面时 App.vue 启动自检发现
/auth/me 返回 401,静默调 /auth/refresh 换发新 token 并重置窗口 —— 只要 7 天内
来访一次即等效永久会话
会话有效期修复
- application.yml:refresh-expiration 由 7 天改为 8h,作为会话时长的唯一配置项,
所有环境统一生效(不在 dev/prod 覆盖)
- auth/AuthController:refresh Cookie 的 Max-Age 由硬编码 7*24*60*60 改为读
jwt.refresh-expiration,消除「改配置不改 Cookie」造成的有效期漂移
- App.vue:刷新 token 成功后二次校验 /auth/me,失败即登出;修复原先
.catch(() => {}) 丢弃返回值导致用户带着空 currentUser 进入后台、权限判断全部
失效、直到某个请求 401 才被踢出的漏洞
JWT 时间配置改用 Duration 可读格式
- expiration / refresh-expiration / sdk-expiration 均绑定为 java.time.Duration,
值写成 15m / 8h / 2h;纯数字仍按毫秒解析,向后兼容旧配置
- JwtTokenProvider 兜底默认值由 604800000(7 天,与 yml 的 8 小时并不一致)修正为 8h
- SdkJwtTokenProvider:默认有效期改 Duration,钳制边界 MIN/MAX_EXPIRATION 改为
Duration.ofMinutes(5) / Duration.ofDays(1),并公开 clampExpirationMillis 供控制器复用
SDK 配置接通
- controller/AuthController(SDK):默认 ttl 改读 jwt.sdk-expiration。此前硬编码
7200000L,而唯一读该配置的 3 参 generateToken 无任何调用方,属改了不生效的死配置
- 控制器内不再出现 300000L / 86400000L 等毫秒魔数,expiresIn 与 token 实际有效期
保持一致(对外的 ttl / expiresIn 单位仍为秒,契约不变)
验证
- 实测 Duration 绑定链路:15m→PT15M(900s)、8h→PT8H(28800s)、2h→PT2H(7200s),
纯数字 28800000→PT8H(28800s),确认向后兼容
- mvn clean package -P prod 构建通过(含前端构建)
文档
- CLAUDE.md 同步会话有效期约定、Duration 单位规范、SDK Token 有效期约定
已知残留
- 仍保留滚动续期,页面持续活跃的用户不会掉线;彻底杜绝需引入绝对过期上限或服务端
落库记录最后活动时间,本次未做
|
3 weeks ago |
wanghanlin
|
2001dc3a0f
|
fix(doc): 修复重新处理文档会按 2000 字截断预览重建导致内容丢失
问题
- knowledge_document.content 上传时被截断到 2000 字符(有意的预览设计),
但 reprocessDocument 把它当原文重建分块,而 DocumentProcessingService 以
cleanBeforeFirstAttempt=true 运行(先删光旧向量)——对超过 2000 字符的文档
执行 POST /document/batch/reprocess 会永久丢失其余内容
修复
- content 改存原文全文(列已是 TEXT,无需 DDL),并写 extra_config.contentComplete
作为完整性标记
- 实体 content 加 @JsonIgnore:全文任何接口都不返回(否则 GET /document/list
无字段投影,每行都会带上整篇正文);文档详情接口单独组装响应,返回 2000 字预览
(键名仍是 content)与 contentTruncated 标志,前端据此提示截断
- reprocessDocument 的数据源按优先级解析:
1) 有 contentComplete 标记 → 用库内全文(语义最忠实,JSON 的 fields/pointer
模式不受影响,也不依赖文件是否还在)
2) 历史遗留文档(无标记,content 是截断预览)→ 按 fileType 从原始文件重解析
(md → MarkdownDocumentLoader,json → JsonDocumentLoader,其余 → Tika),
成功后回填全文并打标记,此后不再依赖原始文件
3) 两者都不可用 → 明确报错拒绝,绝不静默按截断预览重建
无法完整还原时在标记 PROCESSING 之前抛错,事务回滚,文档状态与已有向量都不受影响
- contentTruncated 判据覆盖历史数据:长度恰好等于上限且无 contentComplete 标记时
同样判定为已截断,避免把截断预览误报成完整内容
- 同步 content 列注释(DatabaseInitConfig / init-database.sql / knowledge-base.sql),
该注释会在下次启动幂等刷新到库
验证(真实库 + 557 篇存量文档环境)
- 上传 4891 字符正文:库内存全文,详情接口返回 2000 字预览 + contentTruncated=true
- 重新处理:chunk_count 与首次完全一致(修复前会降为个位数),内容无丢失
- 模拟历史数据(截断 + 无标记):有文件时从文件重解析成功并回填全文;
文件也丢失时明确拒绝,且文档状态与 chunk_count 保持不变(向量未被破坏)
- 回填后再删文件重跑仍成功(已自愈);GET /document/list 不再含 content
- RAG 对话回归正常
已知降级
- JSON 的 basic/fields/pointer 解析模式上传时未持久化,历史 JSON 文档从文件重解析
只能按 basic 还原(不丢数据,仅抽取口径可能变化,日志有 WARN)
- 存量中疑似被截断的文档需重跑一次才能回填全文(均已保留原始文件,均可恢复)
|
3 weeks ago |
wanghanlin
|
84eea7564f
|
refactor: 自造轮子改用 Spring AI 标准组件、清理死代码并修复既有缺陷
组件替换(改用 1.1.x 标准组件)
- 文档提取:删除自写 TikaDocumentReader(内部直接 new org.apache.tika.Tika()),
改用官方 org.springframework.ai.reader.tika.TikaDocumentReader。
pom 早已引入 spring-ai-tika-document-reader 却从未使用其类,属典型「引了标准依赖却手写实现」
- 意图识别:IntentRouter 的手写正则解析(含去 BOM/零宽字符/全角空格等约 60 行防御逻辑)
改用标准 BeanOutputConverter<IntentResult>,保留原有降级语义(空输入/解析失败 → RAG)
- 推荐问题:SuggestionGenerator 的哨兵字符串 + 代码块剥离 + 按行降级解析改用
ChatClient.entity(ParameterizedTypeReference<List<String>>),整体删除 SuggestionResponseParser
- 分块:删除 MyTokenTextSplitter 薄壳,新增 OverlapTokenTextSplitter
分块器 overlap 缺陷修复(本次验证中发现并修复)
- 旧实现把 knowledge.chunk.overlap 传进了 TokenTextSplitter 第 2 个形参 minChunkSizeChars 位,
overlap 从未生效(Spring AI 的 TokenTextSplitter 根本没有 overlap 形参)
- 新实现继承标准 TextSplitter,复刻 TokenTextSplitter 全部切分语义,仅把前进步长改为
chunkSize - overlap,使重叠真正生效
- 验证中发现:标点截断会缩短本块消耗的 token 数,与 overlap 叠加后可把前进步长压到
1 个 token,分块数膨胀 10 倍(实测 349 块 vs 修复后 44 块)。故仅当截断后仍能前进
至少 (chunkSize - overlap) / 2 个 token 时才采用该截断,否则宁可切断句子
- overlap=0 时与标准 TokenTextSplitter 逐块一致(已对比验证)
- ⚠️ 存量文档需重新分块 + 重新向量化(POST /document/batch/reprocess),否则新旧向量口径混杂
其他既有缺陷修复
- RerankerService:原用 new RestTemplate() 且无任何超时,慢 provider 会把检索线程拖到
TCP 超时;改用 RestClient + JdkClientHttpRequestFactory 显式设置 connect/read 超时(各 3s)
- McpServerConfigController:MCP Server 增删改/启停/全量刷新后未清 AssistantApp 的
ChatClient 缓存,导致继续使用旧工具集;现补调 clearCache()
死代码清理(均已 grep 确认零引用)
- 删除 FileBasedChatMemory、ReReadingAdvisor(零装配且 before() 逻辑为 no-op)、
SseEventBuilder(零引用)、SuggestionResponseParser
- McpToolCallback 删除 EVENTS ThreadLocal 与 drainEvents()/resetEvents()(零调用),
保留在用的 MCP_EVENTS_KEY/MCP_ROUNDS_KEY ToolContext 机制
文档
- 同步更新 CLAUDE.md / README.md / DEPLOY.md 的版本号、组件说明与架构描述
- 修正 CLAUDE.md 中与代码不符的既有描述:主启动类并未排除 PgVectorStoreAutoConfiguration
(项目用的是非 starter 坐标,classpath 上本就没有该自动配置);分类过滤实现已完成,
原「Spring AI filter 支持有限」的 TODO 已不成立
|
4 weeks 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 month 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 month ago |
wanghanlin
|
2668b8e73b
|
feat(document): 文档列表支持移动到目录(统一分类根/目录)
- 后端 moveDocuments 统一移动:目标为目录时校验存在并强制采用目录所属分类,分类变更时同步 vector_store 的 categoryId metadata
- DocumentController 批量移动接口新增 folderId 参数(extractLong 兼容雪花 ID 字符串)
- 前端 DocList 新增单行/批量「移动」弹窗,复用目录树 t-tree 选目标,替换原「移动分类」
|
1 month ago |
wanghanlin
|
dc8aa7a9d1
|
refactor(backend): 列表排序字段白名单统一走 SortUtils 防 SQL 注入
- 新增 SortUtils.resolveColumn 统一排序字段白名单映射,未知字段回退默认列
- 各 Controller/Service 列表接口新增 sortField/sortOrder 参数并接入白名单
- 前端列表页列加 sorter 并透传服务端排序参数
|
1 month ago |
wanghanlin
|
780917561b
|
feat(document): 新增知识库文档目录(文件夹)功能
- 新增 KnowledgeFolder 实体/Mapper、FolderService、FolderController,支持目录树增删改查
- 文档新增 folderId 字段,列表支持按目录筛选与服务端排序
- 新增文件夹批量上传(按相对路径自动创建子目录)
- 文档列表页新增左侧目录树面板,上传页新增目录选择与文件夹上传
|
1 month ago |
wanghanlin
|
d5d392aca4
|
feat(sdk): 支持图片上传与多模态对话
SDK 前端新增图片附件上传与多模态对话能力,输入区新增附件按钮与图片预览,新增 allowImageUpload 配置项;/attachment/upload 鉴权改由 SdkAuthFilter 承担(移除方法级 @PreAuthorize),JwtAuthFilter/SecurityConfig 同步放行
|
1 month 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 未自动填充的问题
|
1 month 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 使用规范
|
1 month ago |
wanghanlin
|
1cd8ed1248
|
feat(chat): 流式对话输出对齐 OpenAI Chat Completions 标准 SSE 格式
- 新增 AssistantApp.chatStreamOpenAi,复用 chatStream 编排逻辑,将流式文本分片包装为 data: {"choices":[{"delta":{"content":"..."}}]} 标准 JSON chunk
- 首片 delta 携带 role=assistant,流结束时追加 finish_reason=stop chunk 与 data: [DONE];熔断降级、FAQ 命中、错误兜底统一走 openAiFallbackStream
- AiController、OpenApiController 的流式接口改调 chatStreamOpenAi,旧路径保留纯文本输出向后兼容
|
2 months ago |
wanghanlin
|
23f195326d
|
feat(llm-trace): 提示词追踪增强与缺陷修复
新增追踪字段与落库链路:
- FAQ 命中详情(faqId/faqQuestion/faqMatchType/faqScore)
- 错误分类(errorType/errorMessage)与 Token 用量三档
- MCP 工具调用事件(toolCallsJson)、多轮历史(historyMessagesJson/historyTurns)
- RAG 命中片段(ragHitsJson)、检索模式(searchMode)、账户/API Key
- 数据库迁移新增 13 列 + 3 索引,同步 init-database.sql
前端增强:
- 筛选新增 API Key / 错误类型下拉,列表新增 RAG 列与刷新按钮
- 详情 Tab 扩展 FAQ / 工具调用 / 对话上下文,Prompt 关键词搜索高亮
- 新增会话时间线抽屉、调用趋势图(Chart.js 双轴折线)
缺陷修复:
- MCP 工具事件采集改用 ToolContext 显式收集器,修复 Reactor 流式跨线程丢 ThreadLocal 导致 toolCallsJson 为空
- 趋势统计 GROUP BY 别名改为 date_trunc 表达式,修复 PostgreSQL 语法错误
- 详情表格移除重复 row-key,新增 /error-types 与 /trend 接口
|
2 months ago |
wanghanlin
|
2fe322aa7d
|
完成「LLM 调用追踪面板」开发
|
2 months ago |
wanghanlin
|
61b0ae5639
|
feat(sensitive-word): 敏感词管理页布局与交互优化
- 工具栏新增级别筛选、统计提示,表格新增备注/更新时间列
- 状态列改为 t-switch 一键启用/禁用(失败自动回滚)
- 编辑弹窗加宽并新增启用开关、保存 loading、必填校验
- 批量导入提示成功/跳过重复数,删除确认带词内容
- 后端 list 接口新增 level 级别过滤参数
|
2 months ago |
wanghanlin
|
6590ac762d
|
feat(role): 客服角色 MCP 工具授权
- 修正 allowedMcpTools 空列表语义:仅无角色(null)回退为全部,空列表=严格禁止
- 三个对话入口区分「无角色」与「角色无授权」,无角色向后兼容允许全部
- 工具注册名引入 configId 命名空间(mcp_<configId>_<name>),避免跨 Server 同名工具冲突
- 新增 GET /mcp-server/tools 接口,返回按 Server 分组的可用工具清单
- 更新角色 MCP 授权后清理 AssistantApp ChatClient 缓存,改动即时生效
- listRoles 解析 allowed_mcp_tools JSONB 为 string[],避免 PGobject 原样返回
- 前端 RoleManager 新增「MCP 工具授权」区块,接入保存/脏检测/全部授权
|
2 months ago |
wanghanlin
|
7ce8028d73
|
重构客服角色管理页面排版
|
2 months ago |
wanghanlin
|
1dc9cc9fe6
|
修复保存faq报错问题
|
2 months ago |
wanghanlin
|
d5585206cf
|
新增反馈运营看板删除功能
|
2 months ago |
wanghanlin
|
1ed6c8fb43
|
新增反馈运营看板
|
2 months ago |
wanghanlin
|
bfb5a66393
|
AI回复增加推荐问题功能
|
2 months ago |
wanghanlin
|
149dc3270c
|
新增日志查看功能
|
2 months ago |
wanghanlin
|
5caebfb20f
|
API Key 管理页面编辑功能
|
2 months ago |
wanghanlin
|
527d9e71b7
|
AI 对话执行链路流程图
|
2 months ago |
wanghanlin
|
4eb726a056
|
SDK 聊天窗口底部的保密声明
|
2 months ago |
wanghanlin
|
91c4c185b3
|
重构(AI对话): 统一对话管道,收敛接口形态,补齐Open API能力
|
2 months ago |
wanghanlin
|
14c5ccf6ab
|
、API Key 绑定客服角色、编写 SDK 集成文档
|
3 months ago |
wanghanlin
|
631398833a
|
添加文件存储和下载功能
|
3 months ago |
wanghanlin
|
8c02a3f054
|
为客服角色管理页面的字段添加 label
并移除排序字段
|
3 months ago |
wanghanlin
|
747a9ab558
|
支持mcp服务加入对话链
|
3 months ago |
wanghanlin
|
d95c921227
|
重构配置页面,对标cc-switch三要素设计,新增动态模型列表获取
|
3 months ago |
wanghanlin
|
f8e5a1b59c
|
fix(安全): 修复多个安全漏洞和功能问题
安全修复:
- 修复会话管理 API 安全限制被完全解除的问题
- 移除 SecurityConfig 中会话接口的 permitAll() 配置
- 为 ConversationController 所有方法添加 @PreAuthorize 注解
- 新增 SDK 安全会话端点,内置账户归属校验
- 修复 verifyConversationOwnership 所有权绕过漏洞
- 强制要求至少提供 accountId 或 roleId 一个有效参数
- 防止通过空参数绕过归属校验
功能修复:
- 修复 Webhook 创建时 user_id 违反非空约束
- 从 SecurityContext 获取当前登录用户 ID
- 同步修复 ApiKeyController 的相同问题
- 修复 SDK 会话接口安全问题
- 新增 /ai/sdk/conversation/* 端点
- 实现 conversation_session 表归属校验
- SDK 前端代码迁移到新端点
影响范围:
- 会话管理接口现在需要 JWT 认证
- Webhook 和 API Key 创建功能恢复正常
- SDK 会话功能通过归属校验保证安全
安全等级:高危漏洞修复
涉及文件:8 个 Java 文件 + 3 个 SDK 文件
|
3 months ago |
wanghanlin
|
43449bc59a
|
fix(model-config): AI 大模型配置管理全面排查修复(20 项)
后端修复:
- 修复 updateConfig 激活逻辑竞态条件:appType 变更时只停用目标类型的活跃配置
- 修复 getConfigDetail 直接修改 MyBatis 缓存实体的安全隐患,改为防御性拷贝
- 修复 persistExtraConfig 异常被静默吞掉的问题,改为抛出异常触发事务回滚
- 修复 deleteConfig 缺失 @Transactional 注解
- 修复 updatePriority 未校验配置存在性
- 修复 updateConfig 空 apiKey(trim 后)会覆盖已有值的问题
- createConfig 增加 provider 字段非空校验
- 导入接口增加 100 条数据量限制,导出接口移除 maskApiKey 参数强制脱敏
- ChatModelFactory.testConnection 使用专用线程池替代 ForkJoinPool.commonPool
- EmbeddingModelFactory RetryTemplate 显式设置最大重试次数
- ModelConfigLoader 增加 RERANK 类型启动校验
- RERANK 健康状态从误报 ONLINE 改为 UNKNOWN
- listConfigs 从原生 SQL 重构为 MyBatis Plus LambdaQueryWrapper
前端修复:
- 新建模式切换提供商时始终重置 model_name 为新提供商默认模型
- 编辑模式切换提供商时清理不属于新提供商的无效 model_name
- extraConfig 始终发送(含空对象),确保后端能清空已废弃的高级参数
- 关闭导入弹窗时重置预览和结果状态
- 健康看板支持 UNKNOWN 状态(🟡 未检测)展示
|
3 months ago |
wanghanlin
|
c70d96c00d
|
修复文档列表移动分类功能的 bug
|
3 months ago |
wanghanlin
|
0414e209cb
|
大模型配置管理功能增强
|
3 months ago |
wanghanlin
|
e5cf51c507
|
知识库文档管理 P0 阶段功能完善与体验优化
- 新增文档关键词搜索(title + source_name LIKE 查询,前端 300ms 防抖)
- 文档列表增加文件大小(formatBytes)和分类名称列
- 分类管理支持编辑弹窗、树形层级展示(最多3级)、创建时选择父分类
- 新建 DocumentProcessingService 异步处理服务,上传/重处理改为同步插入
PROCESSING 记录 + 异步执行,前端自动轮询状态
- 修复分页参数越界、LIKE 通配符未转义、异步删除竞态条件等安全问题
- 修复全选 checkbox 始终选中、分类排序方向不一致、文本上传缺少认证头等缺陷
- 移除 DocUpload.js 遗留调试日志
|
3 months ago |
pyx
|
1e0c9a7f11
|
智能客服支持角色知识库并修复 SDK 历史会话隔离
|
3 months ago |
wanghanlin
|
dec3d19f3c
|
用户认证/运营看板/API开放平台
|
3 months ago |
wanghanlin
|
f7eb0bfaf1
|
feat(P0): 完成阶段一全部需求 — 混合检索/内容安全/用户反馈/FAQ精准匹配
P0-001 混合检索+重排序引擎:
- HybridSearchService 支持 VECTOR/KEYWORD/HYBRID 三种检索模式
- RrfFusion RRF 融合算法 (k=60)
- RerankerService 支持 DashScope + OpenAI 兼容多提供商
- vector_store 新增 content_tsvector 列 + GIN 索引 + 触发器
- DocSearch.js 增加检索模式下拉选择
P0-004 内容安全过滤:
- ContentSafetyService DFA 字典树引擎(volatile + copy-on-write 线程安全)
- ContentSafetyAdvisor BaseAdvisor 实现,输入/输出双向审核
- SensitiveWordService 敏感词 CRUD + 批量导入 + 字典树热加载
- SensitiveWordManager.js 前端管理组件
P0-002 用户反馈系统:
- MessageFeedbackService upsert 语义反馈提交 + 统计 API
- ChatPanel.js 添加 👍/👎 反馈按钮
- Chat SDK handleFeedback() 对接后端 POST /feedback
- ConversationService 导出集成反馈信息
P0-003 意图识别+FAQ精准匹配:
- IntentRouter LLM 意图分类(FAQ/RAG/CHITCHAT)
- FaqMatchEngine 三级匹配(精确→关键词→向量语义,阈值 0.85)
- FaqService FAQ CRUD + 异步向量化
- FaqManager.js 前端管理(CRUD + 批量导入/导出 + 启用/禁用)
共享变更:
- DatabaseInitConfig 新增 5 张表 + 全文检索初始化
- api.js 新增反馈/敏感词/FAQ API 封装
- app.js 注册 SensitiveWordManager + FaqManager 组件
- application.yml 新增 knowledge.faq.semantic-threshold 配置
|
3 months ago |
wanghanlin
|
8e586a8c35
|
求移除未使用的 PRODUCT_EXTRACT(商品信息抽取)类型配置
|
3 months ago |
pyx
|
3e128ff5ff
|
聊天接口支持外部账号自动创建并修复会话按账号隔离
|
3 months ago |
pyx
|
b11d3f7ad7
|
聊天接口传入外部账号时自动创建客户账号
|
3 months ago |
wanghanlin
|
c4af6699cf
|
把嵌入模型支持从仅千问扩展到多厂商。前端限制、后端自动覆盖
|
3 months ago |
pyx
|
93a7291040
|
RAG选择补充为多路
|
3 months ago |
pyx
|
d3ed72f62b
|
fix: restore model config flow and make RAG optional
|
3 months ago |
pyx
|
9482a9e573
|
样式调整,角色账号权限初始化提交
|
3 months ago |
wanghanlin
|
f79350c363
|
完成了模型配置管理页面(5家AI提供商集成+运行时动态切换)
|
3 months ago |
pyx
|
dd103639f8
|
初次提交
|
3 months ago |
wanghanlin
|
4a69fa047f
|
三期- 前端会话管理功能
- 统计卡片:展示总会话数、总消息数、今日会话、今日消息
- 搜索栏:支持按会话ID或消息内容模糊搜索
- 会话列表表格:展示会话ID、消息数、最后消息时间、预览
- 消息详情弹窗:分类展示用户/AI/系统消息,带时间戳
- 导出功能:一键下载 .txt 格式的会话记录
- 删除功能:逻辑删除整会话的所有消息
|
3 months ago |