Commit Graph
415 Commits
Author SHA1 Message Date
thzxx 4b72a1fc5d chore: 版本号升级至 v4.0.0,更新 README 2026-04-05 19:58:24 +08:00
thzxx bc63ba9611 feat: Agent 预设系统 - 一键切换角色/工作模式
- 内置 6 个预设:默认、翻译官、代码审查、写作助手、数据分析师、学习导师
- 每个预设包含:系统提示词、温度、上下文长度、Think 开关
- 预设栏胶囊按钮,点击即切换,自动应用全部配置
- 支持创建/编辑/删除自定义预设,IndexedDB 持久化
- 切换预设时同步设置面板 UI + toast 提示
- 温度参数集成到聊天 API 调用
2026-04-05 19:55:45 +08:00
thzxx 2c475c0c8c chore: 版本号升级至 v3.2.0,更新 README 更新日志 2026-04-05 01:59:40 +08:00
thzxx be8ef7641e style: 知识库弹框和帮助弹框视觉优化
- 知识库弹框: 加大至 900px/88vh,工具栏加边框背景,左侧分隔线
- 帮助弹框: 加大至 640px/88vh,各区块加左边线强调和背景
- 全局模态框: 更深毛玻璃、圆角 14px、入场缩放动画、头部渐变
- 快捷键表格: 带边框圆角、hover 高亮
- 文档/集合项: 更大 padding、hover 边框
2026-04-05 01:55:56 +08:00
thzxx e97e2e4078 perf: IVF 倒排索引优化向量搜索 - K-Means 聚类 + nprobe 近邻检索
- N < 200 自动降级暴力搜索
- N ≥ 200 K-Means++ 聚类构建 IVF 索引
- nprobe=5 探测最近 5 个聚类,搜索量降 75%
- 索引持久化到 IndexedDB,数据变化自动重建
- 内存向量缓存 + Map O(1) 查找
2026-04-05 01:47:57 +08:00
thzxx 4c52650881 fix: setSelectedModel 触发 change 事件,恢复模型能力检测(Think/Vision) 2026-04-05 01:38:56 +08:00
thzxx 32e3bf848e fix: RAG临时状态消息延迟到首个token到达时才清除,消除回复前的空白期 2026-04-05 01:32:08 +08:00
thzxx b802c896cf refactor: state 管理优化 - 结构化浅比较 + update/setIn/batch API
- state.js: 新增 shallowEqual、update()、setIn()、batch() 方法
- input-area.js: messages.push() 全部改为 state.update(),确保引用变化触发通知
- model-bar.js: 直接属性赋值改为 state.update(),修复 model 切换不触发变更检测
2026-04-05 01:27:24 +08:00
Metona e519631bee feat: 模型下拉框过滤嵌入模型,版本号升级至3.1.1
- loadModels 后台调用 /api/show 检测 capabilities
- 不支持 completion 的模型自动从下拉框移除
- 更新 README changelog
2026-04-05 01:10:12 +08:00
Metona f1a1c15a27 chore: 版本号升级至 v3.1.0,更新README
- index.html / app.js 版本号改为 3.1.0
- README badge 更新
- 新增更新日志章节 (v3.0.0 ~ v3.1.0)
2026-04-05 00:58:44 +08:00
Metona 13291fba77 fix: 流结束后手动插入RAG来源到DOM,解决历史中不显示的问题
ragSources 在流结束后才添加到消息对象,但 assistant 消息 DOM 已由流式更新创建,
renderMessages 只追加新消息不会重新渲染已有元素。
直接在流结束后将 RAG 来源 HTML 插入到 msg-body 中。
2026-04-05 00:53:20 +08:00
Metona 192e070516 fix: RAG状态消息放AI回复下方,开始回复时清除,保留历史RAG来源展示
- appendAssistantPlaceholder 回到 RAG 检索之前(placeholder在上方)
- RAG 状态消息显示在 placeholder 下方
- 开始回复时清除临时状态消息
- 历史记录中通过 ragSources 展示知识库来源
2026-04-05 00:50:00 +08:00
Metona a8aa00ce05 fix: RAG检索状态消息保留在AI回复上方,方便历史回顾
- 将 appendAssistantPlaceholder() 移到 RAG 检索之后
- 消息顺序:用户消息 → 检索状态 → AI回复
- 移除 rag-status 清除逻辑,检索状态永久保留
2026-04-05 00:46:13 +08:00
Metona 6b793f669b fix: RAG检索状态消息在AI回复后自动清除
给 appendSystemMessage 增加可选 tempClass 参数,
所有 RAG 状态消息标记为 'rag-status' class,
流式结束后和报错时统一移除这些临时消息。
2026-04-05 00:44:12 +08:00
Metona 1e3f4d4ba5 fix: 彻底修复RAG下消息不显示 - 用模块变量替代CSS选择器
根本原因:所有CSS选择器方案都依赖DOM位置关系,
而 appendSystemMessage 在 placeholder 之后插入 div 会破坏这种关系。

解决方案:用模块变量 currentPlaceholder 直接持有 placeholder DOM 引用,
updateLastAssistantMessage 直接读取该引用,完全不依赖选择器。

- appendAssistantPlaceholder: 设置 currentPlaceholder = div
- updateLastAssistantMessage: 使用 currentPlaceholder,首次调用移除 loading
- clearMessages: 清除 currentPlaceholder
2026-04-05 00:38:35 +08:00
Metona 1de1084173 fix: 第一个chunk后loading class被移除导致后续内容更新全部跳过
updateLastAssistantMessage 的首次调用找到 .message.assistant.loading 后
立即 remove('loading'),导致后续 chunk 调用时选择器找不到元素,直接 return。

修复:
- 首次调用:找到 .loading,移除 loading 指示器,但保留 class 直到流结束
- 后续调用:.loading 选择器失败时回退到 .message.assistant:last-of-type
- loading class 在 sendMessage 的 try/finally 或 catch 中统一移除
2026-04-05 00:34:23 +08:00
Metona 86a2797d44 fix: 用 loading class 精确定位placeholder,修复RAG下loading不消失
上次用 :last-of-type 修复无效(:last-of-type 也是按元素类型div匹配,
系统消息也是div,一样命中不了placeholder)。

改用给 placeholder 加 .loading class 的方案:
- appendAssistantPlaceholder 添加 .loading class
- updateLastAssistantMessage 用 .message.assistant.loading 选择器
- 成功/失败后移除 .loading class

选择器不再依赖 DOM 位置,彻底不受 appendSystemMessage 影响。
2026-04-05 00:29:08 +08:00
Metona f3589ae057 fix: RAG开启时AI回复后loading动画不消失的问题
根因:appendSystemMessage() 在 assistant placeholder 之后插入了一个无 .message class 的 div,
导致 CSS 选择器 .message.assistant:last-child 无法命中 placeholder(它不再是 :last-child)。
updateLastAssistantMessage() 返回 null,loading 动画永远不会被移除。

修复:将 3 处 :last-child 改为 :last-of-type,使选择器基于元素类型(div)而非精确的最后一个子节点匹配。
2026-04-05 00:22:24 +08:00
thzxx 8d4ab5c98c chore: 版本号升级至 v3.0.2 2026-04-05 00:03:46 +08:00
thzxx 08cd0de89b feat: 新建会话时自动释放显存,清理模型上下文 2026-04-05 00:01:35 +08:00
thzxx 292e84651c fix: RAG上下文根据numCtx和已有消息动态计算可用预算,智能截取 2026-04-05 00:00:14 +08:00
thzxx 492a4027b6 fix: RAG请求增加system prompt长度限制(12000字节),增加错误提示和调试日志 2026-04-04 23:58:03 +08:00
thzxx 20876713d3 feat: RAG检索过程可视化,显示检索状态和结果提示 2026-04-04 23:53:02 +08:00
thzxx ce930560f8 feat: RAG回复显示知识库来源,含文件名和相似度分数 2026-04-04 23:46:16 +08:00
thzxx 30c6916d6f fix: 修复文档上传无反馈的bug,FileList在清空前被读取导致丢失;增加分块数和批量汇总提示 2026-04-04 23:41:09 +08:00
thzxx 8c7ad06dce chore: 版本号升级至 v3.0.1 2026-04-04 23:31:26 +08:00
thzxx ebaacb5631 fix: 嵌入模型检测改用 /api/show capabilities 判断 2026-04-04 23:24:16 +08:00
thzxx 582661146b feat: 嵌入模型下拉仅显示 embedding 模型 2026-04-04 23:22:37 +08:00
thzxx 2048d98d96 docs: 完善 RAG 知识库文档,更新 API 清单和项目结构 2026-04-04 23:15:09 +08:00
thzxx 2c72fc570f chore: 版本号升级至 v3.0.0,更新README功能列表 2026-04-04 23:10:24 +08:00
developer 76d33108e2 fix: 嵌入模型下拉收窄并与工具栏同行 2026-04-04 22:57:52 +08:00
developer 3749d5c2de feat: 添加帮助按钮和使用说明弹框 2026-04-04 22:56:34 +08:00
developer dc3cb77dd2 fix: 嵌入模型选择栏固定不被挤压 2026-04-04 22:53:56 +08:00
developer a790060b87 fix: 修复知识库弹框布局错位,添加 flex 约束和溢出控制 2026-04-04 22:51:18 +08:00
developer 33d3122e93 feat: RAG 本地知识库 - 向量存储、文档分块、语义检索、知识库管理面板 2026-04-04 22:46:29 +08:00
developer e15e102eec chore: 版本号升级至 v2.2.0,更新README 2026-04-04 22:28:17 +08:00
developer af290829ef fix: 兼容非HTTPS环境,crypto.subtle不可用时降级为XOR加密 2026-04-04 22:24:55 +08:00
developer c736dbbca4 feat: 会话导出加密(.metona),导入仅支持.metona格式 2026-04-04 22:22:25 +08:00
developer 3dfe64cd93 fix: 修复刷新后模型选择恢复为排序第一个的问题 2026-04-04 22:16:46 +08:00
developer 0a85ff3dfa feat: 选中模型持久化为默认,刷新后自动恢复选中 2026-04-04 22:13:57 +08:00
developer e435f0f1a0 feat: 模型列表按名称排序,同名称按大小升序 2026-04-04 22:09:15 +08:00
developer dcb66df200 fix: 模型下拉框展示磁盘实际文件大小替代参数量 2026-04-04 22:06:46 +08:00
Metona 4542b225a2 chore: 版本号升级至 v2.1.0,更新 README 文档 2026-04-04 21:47:16 +08:00
Metona c8bf90f64b fix: 修复 chatAreaEl 重复声明报错 2026-04-04 21:43:32 +08:00
Metona 12843f09a5 feat: 智能滚动 - 流式回复时可向上查看历史,浮动按钮回到底部
- 流式输出时不再强制锁定底部,用户可自由滚动查看历史
- 滚动离开底部时显示「回到底部」浮动按钮(sticky 定位)
- 点击按钮平滑滚动并恢复自动跟踪
- 用户手动滚回底部时自动恢复跟踪
- 发送消息/新建会话时自动重置为跟踪状态
- 首次渲染(加载历史)强制滚到底部
2026-04-04 21:41:26 +08:00
Metona d61764a5e9 fix: 禁用按钮保留 hover 提示,提高 think 禁用态可见度 2026-04-04 21:35:22 +08:00
Metona d82455b079 feat: 模型 vision 能力检测,不支持时禁用图片上传
- model-bar.js: 新增 setVisionAvailable() 控制图片按钮状态
- model-bar.js: 导出 isVisionAvailable() 供其他组件查询
- input-area.js: 点击图片按钮时校验 vision 能力
- input-area.js: 发送消息时二次校验,防止绕过
- style.css: .icon-btn.disabled 灰显不可点击样式
2026-04-04 21:30:47 +08:00
Metona 35a3b5815f fix: 文件图标按类型区分,统一两个组件的图标映射 2026-04-04 21:20:20 +08:00
Metona 5259b8017a refactor: 文件上传展示与发送逻辑分离
- 消息对象新增 files 元数据数组(name/language/size)和 _fileContents 内容数组
- content 字段仅保留用户输入的纯文本
- 新增 buildApiMessages() 构建 API 消息时动态拼接文件内容
- chat-area 渲染时从 msg.files 取文件名+图标展示 chip,不暴露文件内容
- 用户消息气泡内文件 chip 用紫色主题区分于输入区的青色 chip
- 导出功能(MD/HTML/TXT)同步适配
2026-04-04 21:15:02 +08:00
Metona 7f31034073 feat: 支持上传文本/代码文件给 Ollama 分析
- utils.js: 新增 fileToText() 读取文件文本、detectLanguage() 识别编程语言
- index.html: 新增文件上传按钮(📄)和文件预览容器
- input-area.js: 完整文件上传流程(校验/读取/预览/消息构造/发送)
- style.css: 文件 chip 预览样式

支持 50+ 种文本/代码扩展名,文件内容以代码块格式嵌入消息。
单文件限制 500KB,支持多文件同时上传。
2026-04-04 21:08:21 +08:00