# ChatBot Watch App 完全更新日志
https://github.com/Yamada-Ryo4/ChatBot-For-Apple-Watch
这份日志详细记录了所有修改的文件、功能变更以及技术细节。
# 🎉 2026-02-17 更新 (v2.0 记忆体觉醒版)
摘要:迈向 2.0 时代!引入核心的 RAG 向量记忆 与 云端同步 功能,让 ChatBot 拥有长期记忆;配套开源 Workers 代码,数据完全私有化;UI 全面升级。
# 🔥 核心特性
- 🧠 长期记忆 (Long-Term Memory):
- RAG集成: 基于向量数据库的检索增强生成,AI 能通过语义搜索"回忆"起你们过往的对话细节。
- 自动提取: 配合辅助模型,自动从对话中提取关键信息(喜好、背景、设定)并存入向量库。
- Workers AI: 支持连接自建的 Cloudflare Workers AI embedding 服务。
- ☁️ 云端备份 (Cloud Sync):
- R2 对象存储: 安全备份配置、聊天记录与记忆至 Cloudflare R2。
- 智能版本控制: 自动增量备份,支持去重(Dedup)与版本回溯。
- 自定义命名: 支持对重要备份进行重命名保护,防止被自动轮替删除。
- ⚡️ 性能与体验:
- 列表优化: 彻底重构备份列表 UI,支持左滑重命名/恢复/删除。
- 文档完善: 新增详尽的 API 文档与部署指南,降低自建服务门槛。
# 文件: [ChatView.swift]
- 记忆与向量:
- 集成
VectorService,在发送消息前自动检索相关记忆注入 Context。 - 优化 Prompt Template,让记忆内容的插入更加自然。
- 集成
# 文件: [ViewModels.swift]
- 云端同步逻辑:
- 新增
CloudDataService,处理所有上传/下载/去重逻辑。 - 实现
normalizedHash校验,确保跨设备/跨时间的数据一致性。
- 新增
# 文件: [Workers] (开源)
VectorWorker.js: 全新的向量嵌入服务代码,一键部署。_worker.js: 升级备份服务,支持rename、dedup、preview等高级接口。
# 🐞 Bug 修复
- 修复了版本号回填 (Gap Filling) 导致的顺序错乱问题。
- 修复了 ISO8601 时间解析在不同地区格式下的兼容性问题。
- 自定义备份名称现在能在列表和详情页正确显示。
# 🎯 2026-02-15 更新 (v1.7 辅助模型与记忆增强版)
摘要:新增辅助模型 (Helper Model) 用于低成本任务,彻底修复 Gemini 内容屏蔽问题,优化记忆提取逻辑,并引入自动同步预设功能。
# 🔥 新增功能
- 🤖 辅助模型 (Helper Model):
- 降本增效: 引入独立的辅助模型设置(默认推荐使用轻量级模型如 Gemini Flash)。
- 自动接管: 会话标题生成、记忆提取等后台任务自动切换至辅助模型,不再消耗主模型额度。
- 独立配置: 在 Settings -> Advanced 中可单独配置辅助模型。
- 🔄 预设自动同步:
- 无缝更新: 每次启动 App 自动同步代码中的最新预设(图标、URL、类型)。
- 数据保留: 完美保留用户手动填写的 API Key、收藏模型和聊天记录,无需再手动更新版本号。
# 🧠 记忆增强
- 内容屏蔽修复:
- 彻底解决 Gemini 模型因安全过滤器误判导致无法处理 "17岁" 等内容的问题(全量放开
BLOCK_NONE)。
- 彻底解决 Gemini 模型因安全过滤器误判导致无法处理 "17岁" 等内容的问题(全量放开
- 提取逻辑优化:
- 重构记忆提取 Prompt,强制使用第三人称陈述句,严禁摘抄原文。
- 提取任务迁移至辅助模型执行。
# 🛠 体验优化
- UI 调整: 导出选项(Export Config/Memories)现在始终可见,方便用户随时备份。
- 稳定性: 移除了可能导致启动崩溃的调试代码。
# 🎯 2026-02-14 更新 (v1.6 流式性能优化版)
摘要:彻底重构流式输出架构,实现"注视点渲染"技术;正式支持 DeepSeek R1 深度思考模式;新增主题切换功能。
# 🔥 新增功能
- 🧠 深度思考 (DeepSeek R1 Support):
- 完美支持
DeepSeek R1等推理模型的思维链展示。 - 流式思考: 思考过程与正文内容并行流式传输,实时可见。
- 可折叠视图: 思考内容默认折叠,点击展开查看详细推理步骤。
- 思考模式设置 (Settings -> 高级): 支持自动/强制开启/关闭。
- 完美支持
- 🎨 个性化主题 (Theming):
- 新增 主题配色 设置,内置多种气泡配色方案。
- ✨ 动画控制:
- 新增 消息气泡动画 开关,可关闭进场动画以进一步提升响应速度。
# ⚡️ 性能优化 (流式重构)
- 注视点渲染 (Foveated Rendering):
- 核心突破:使用
LazyVStack实现文本按行视口渲染。 - 性能恒定: 无论回复是一千字还是一万字,渲染开销恒定为屏幕可见的 ~20 行。
- 彻底解决 Apple Watch 滚动长文本卡顿问题。
- 核心突破:使用
- 流式状态隔离:
- 引入
streamingText/streamingThinkingText独立状态。 - 流式期间 零 DOM/Entity 刷新,仅纯文本更新。
- 引入
# 文件: ViewModels.swift
- 流式状态隔离:
- 新增
@Published var streamingText和@Published var streamingThinkingText - 流式期间只更新这两个轻量属性,不修改
sessions,避免触发全量 diff - 流式完成后一次性写入
sessions,触发完整 Markdown 渲染
- 新增
- 节流优化:
- 更新间隔 150ms(从 500ms 降低),因渲染开销极小可承受更高频率
regenerateLastMessage()同步优化:- 原实现在每个 chunk 调用
updateCurrentSessionMessages()(含磁盘写入),现改为纯内存 streamingText 更新
- 原实现在每个 chunk 调用
stopGeneration()状态清理:- 中断/错误时正确保留已接收文本写入 sessions,清空流式状态
# 文件: ChatView.swift
- 注视点渲染 (Foveated Rendering):
- 新增
StreamingBubbleView,流式文本按\n拆分为独立行 - 使用
LazyVStack实现屏幕可见行渲染,屏幕外的行零开销 - 无论回复多长,渲染成本恒定在 ~20 行
- 用户可自由滚动查看任意位置的流式文本
- 新增
- ThinkingContentView 懒加载优化:
- 折叠(默认)= 零渲染
- 展开 =
LazyVStack按行渲染,仅渲染 ScrollView 可见区域(~15 行)
- Typing Indicator 修复:
- 新增
viewModel.streamingText.isEmpty条件 - AI 开始输出文字后,跳动圆点自动消失
- 新增
- ForEach 条件渲染:
- 流式中的最后一条 AI 消息使用
StreamingBubbleView(纯 Text,零解析) - 其他消息使用
PrettyMessageBubble(完整 Markdown/LaTeX)
- 流式中的最后一条 AI 消息使用
# 性能对比
| v1.5 | v1.6 | |
|---|---|---|
| 每次更新重绘 | 全部 N 条消息 | 仅 1 条(可见行) |
| 渲染管线 | Markdown + LaTeX + regex | 纯 Text() |
| sessions 写入 | 每 500ms | 仅流式完成时 |
| 长文本性能 | 线性退化 | 恒定 |
# 🎯 2026-02-10 更新 (v1.5 性能优化版)
摘要:流畅流式渲染优化,新增三种 Markdown 渲染模式,增强 LaTeX 命令支持,彻底解决 watchOS 长文本流式输出卡顿问题。
# 文件: Models.swift
- 新增枚举
MarkdownRenderMode:- 三种渲染策略:
realtime(实时渲染)、onComplete(完成后渲染)、manual(手动渲染) - 支持用户根据性能需求灵活选择渲染时机
- 三种渲染策略:
# 文件: ViewModels.swift
- 渲染模式配置:
- 替换
realtimeMarkdownEnabled布尔值为markdownRenderMode枚举 - 新增计算属性
markdownRenderMode用于类型安全访问 - 默认值:
realtime(实时渲染)
- 替换
- 性能优化:
- 恢复 500ms UI 节流配置(从极限 5 秒回归最佳平衡)
- 移除所有中间更新动画,减少渲染开销
- 实现 O(N) 状态机解析(从 O(N²) 优化)
# 文件: SettingsView.swift
- 设置界面重构:
- Section 标题改为"文本渲染"(从"数学公式渲染")
- 使用 Picker 组件选择三种渲染模式,替代原有 Toggle
- 每种模式都有详细说明提示:
- 实时渲染:流式时实时渲染,可能影响性能
- 完成后渲染:完成后自动渲染,流畅且自动格式化(推荐)
- 手动渲染:流式显示纯文本,点击按钮手动渲染
# 文件: ChatView.swift
- MessageContentView 渲染逻辑优化:
- 根据
markdownRenderMode动态决定渲染时机 realtime模式:总是渲染 MarkdownonComplete模式:流式时显示纯文本,完成后自动渲染manual模式:流式时显示纯文本,通过按钮手动触发渲染
- 根据
- LaTeX 命令增强:
- 新增
\boxed{}支持:用于标注答案,转换为⟦内容⟧ - 嵌套命令优化:
\frac{}{}支持 30 层嵌套(从 10 层增加)\sqrt{}支持 20 层嵌套(从 5 层增加)
- 处理更复杂的数学公式
- 新增
# Bug 修复
- 修复
<details>/<summary>Markdown 渲染问题 - 修复嵌套 LaTeX 命令无法正确解析的问题
- 移除时间统计功能(性能和可靠性问题)
# 性能改进
- 流式输出期间减少 UI 刷新频率
- 移除动画效果减少渲染压力
- 状态机解析算法优化
# 🎯 2026-02-08 更新 (v1.4 正式版)
摘要:新增模型管理优化功能,包括最近使用模型、模型搜索、模型列表缓存、批量验证和配置导出。
# 文件: ViewModels.swift
- 智能预设更新 (Smart Preset Update):
- 升级版本号时不再丢失用户的收藏模型、验证状态等自定义数据。
- 只更新预设的 URL 和 API Key,保留用户配置。
- 自动验证逻辑:
- 启动时自动验证未验证的供应商(有 Key 的)。
- 版本更新后自动验证新增供应商。
- 模型列表缓存:
- 验证一次后模型列表自动缓存,1 小时内不重复请求。
- 可手动强制刷新。
- 最近使用模型:
- 新增
recentlyUsedModels计算属性。 - 发送消息时自动记录
lastUsedModelId。
- 新增
- 批量验证:
- 新增
validateAllProviders()方法,一键验证所有供应商。
- 新增
- 配置导出/导入:
- 新增
exportConfig()和importConfig()方法。 - 支持将配置导出为 JSON。
- 新增
# 文件: Models.swift
- ProviderConfig 扩展:
- 新增
lastUsedModelId: String?- 最近使用的模型 ID。 - 新增
modelsLastFetched: Date?- 模型列表缓存时间戳。
- 新增
- ExportableConfig 结构体:
- 新增用于配置导出/导入的数据结构。
# 文件: SettingsView.swift
- 模型搜索:
- 在模型选择页和供应商配置页新增搜索框。
- 支持按模型 ID 或显示名称过滤(不区分大小写)。
- 最近使用区域:
- 模型选择页顶部新增「🕐 最近使用」Section。
- 批量验证按钮:
- 设置页新增「批量验证供应商」按钮。
- 配置导出:
- 设置页新增「导出配置」功能。
# 新增预设供应商
- Nvidia (NIM 云平台)
- OpenCode Zen (OpenAI 兼容格式)
# Bug 修复
- 修复版本更新时用户收藏模型被清空的问题。
- 优化模型列表加载逻辑,减少重复 API 请求。
# 🎯 2026-01-29 更新 (v1.3 正式版)
摘要:重构 LaTeX 渲染系统,新增双模式切换、多 API Key 轮询、温度参数、系统提示词自定义等功能,大幅优化代码结构。
# 文件: ChatView.swift
- LaTeX 渲染双模式:
- 新增
SimpleLatexConverter简单模式,使用原生Text+ Unicode 符号替换,稳定可靠。 - 保留
AdvancedLatexView高级模式,使用 FlowLayout + AST 解析,效果更精细。 MessageContentView根据设置自动切换渲染方式。
- 新增
- 嵌套 LaTeX 支持:
- 支持
$$双美元符号标记。 - 预处理
\text{}命令,避免花括号干扰正则匹配。 - 迭代处理
\frac{}{}支持深层嵌套(最多 10 层)。 - 单独处理
\sqrt{}显示为√(内容)。
- 支持
- 根号视图优化:
- 高级模式使用
overlay绘制横线,宽度自动匹配内容,不再溢出。 - 添加
.fixedSize()防止视图扩展。
- 高级模式使用
- 代码优化:
- 符号映射表(希腊字母、数学运算符、上下标)改为静态常量。
- 正则表达式缓存为静态属性,避免每次调用重新编译。
- 删除约 200 行冗余代码。
# 文件: ViewModels.swift
- 新增设置项:
@AppStorage("latexRenderingEnabled")- LaTeX 数学公式渲染开关(默认开启)。@AppStorage("advancedLatexEnabled")- 高级渲染模式开关(默认关闭)。@AppStorage("enableHapticFeedback")- 振动反馈开关(默认开启)。@AppStorage("historyMessageCount")- 可配置对话历史数量(5-50 条,默认 10 条)。@AppStorage("customSystemPrompt")- 自定义系统提示词。@AppStorage("temperature")- 温度参数 (0.0-2.0,默认 0.7)。
- 条件性触觉反馈:
- 所有
WKInterfaceDevice.current().play(...)调用改为根据enableHapticFeedback设置决定是否执行。
- 所有
- 动态历史窗口:
buildHistoryWithContext方法使用historyMessageCount配置值替代硬编码的 10 条。
- 会话标题优化:
- 标题自动使用用户首条消息的前 15 字符 + 省略号。
- 仅在标题为空或"新对话"时更新,避免覆盖已有标题。
# 文件: Models.swift
- 多 API Key 支持 (Multi-Key Rotation):
- 重构
ProviderConfig结构,将单一apiKey改为apiKeys: [String]数组。 - 新增
currentKeyIndex跟踪当前使用的 Key 索引。 - 添加
rotateKey()方法实现自动轮询。 - 保留向后兼容的
apiKey计算属性,无缝升级。
- 重构
# 文件: SettingsView.swift
- 新增「数学公式渲染」Section:
- 「启用 LaTeX 渲染」Toggle 主开关。
- 「高级渲染模式」Toggle 子开关(仅在启用时显示)。
- 高级模式警告提示:"可能导致排版错误和渲染问题"。
- 新增「模型参数」Section:
- 温度 Picker (0.0-2.0,步进 0.1)。
- 系统提示词编辑入口 (NavigationLink)。
- 界面设置新增:
- 「启用振动反馈」Toggle 开关。
- 「对话历史上下文」Picker 控件(5-50 条,步进 5)。
- 多 Key 管理界面:
ProviderDetailView重构为列表式 Key 管理。- 显示所有已添加的 Key(掩码显示),当前使用的 Key 带 ✓ 标记。
- 支持删除单个 Key(至少保留一个)。
- 新增
SystemPromptEditView:- 使用
TextField多行输入。 - 保存/清空功能。
- 使用
- UI 优化:
- 全面移除设置页装饰性图标,回归原生简洁风格。
- 控件改为 Picker,交互更统一。
# 文件: LLMService.swift
- 温度参数支持:
streamChat方法签名新增temperature: Double参数。- OpenAI: 将 temperature 加入请求 body。
- Gemini: 通过
generationConfig传递 temperature。
# 文件: LaTeXParser.swift
- 数学符号增强:
- 常用分数:½, ⅓, ⅔, ¼, ¾ 等 15 个 Unicode 分数符号。
- 三角函数:sin, cos, tan, cot, sec, csc, arcsin, arccos, arctan, sinh, cosh, tanh。
- 数学函数:log, ln, exp, lg, lim, max, min, sup, inf, det, dim, ker, deg, gcd, lcm。
- 希腊字母:扩充至完整大小写 24 个字母。
- 运算符:新增 ∓, ≡, ∝, ∏, ∮, ∀, ∃, ∈, ∉, ⊂, ⊃, ⊆, ⊇, ∪, ∩, ∅, ⇐, ↔, ⇔, ∵, ∴, ∠, ⊥, ∥, △, ° 等。
# Bug 修复
- 修复
SecureField导致无法使用手机键盘连续互通输入的问题,改用TextField。 - 修复供应商配置页因动态标题刷新导致输入中断的问题 (Title 改为静态)。
- LaTeX 渲染修复:
- 增加对
/cos,/sin等非标准前缀的容错支持。 - 分数优化: 支持
\frac{a}{b}的正确解析,不再因嵌套花括号失效。 - 引入
FlowLayout实现图文混排,支持长数字/长单词自动换行。 - 逻辑修复: 恢复了 components 模式下对上标(^)、下标(_)等符号的解析支持。
- 增加对
# 🚀 2026-01-23 更新 (v1.2 正式版)
摘要:新增 Smart Stack 智能叠放组件,实现表盘复杂功能 (Complication),优化模型选择交互,修复 Widget 致命内存崩溃问题。
# 文件: ChatBotWidget.swift (关键修复)
- 内存优化 (Memory Optimization):
- 问题: Widget 启动时加载完整
chatSessions数组导致内存溢出 (Code=11 Crash)。 - 方案: 完全移除
ChatSession和ChatMessage结构体解码逻辑。 - 新逻辑: 改为读取轻量级字典
widget_tiny_data,仅包含title和lastMessage两个字符串。 - 效果: 内存占用降低 99%+,Widget 永不崩溃。
- 问题: Widget 启动时加载完整
# 文件: ViewModels.swift
- 轻量级 Widget 数据写入:
- 在
saveSessions()方法中新增逻辑:每次保存聊天记录时,同步写入一份精简的widget_tiny_data到UserDefaults。 - 数据结构:
["title": String, "lastMessage": String] - 联动: 确保 Widget 总能读取到最新的对话摘要。
- 在
# 文件: ChatBotApp.swift
- 表盘复杂功能 (Complication):
- 合并
ComplicationController类到主入口文件,确保被正确编译。 - 将类和所有协议方法设为
public,解决跨模块访问问题。 - 功能: 支持在表盘添加快捷方式,点击直接唤醒 ChatBot。
- 合并
- 二级模型选择菜单 (Nested Model Picker):
- 新增
ModelSelectionRootView和ModelListForProviderView两个视图结构。 - 交互: 设置页点击"选择模型" -> 显示服务商列表 -> 点击服务商 -> 显示该服务商下的模型列表。
- 效果: 模型选择更加清晰,不再需要在一个长列表中滚动寻找。
- 新增
# 文件: ChatView.swift
- 左滑删除对话 (Swipe-to-Delete):
- 在
HistoryListView的ForEach中添加.onDelete修饰符。 - 二次确认: 删除操作会弹出
Alert确认框,防止误删。 - 交互: 在历史列表中左滑某个对话 -> 点击删除 -> 弹窗确认 -> 执行删除。
- 在
# 文件: SettingsView.swift
- 模型选择入口重构:
- 将原有的
Picker组件替换为NavigationLink。 - 右侧显示当前选中的模型名称(自动截断)。
- 将原有的
# 文件: WatchInfo.plist
- Complication 模块名修复:
- 将
CLKComplicationPrincipalClass的值从硬编码的ChatBot_Watch_App.ComplicationController改为$(PRODUCT_MODULE_NAME).ComplicationController。 - 效果: 动态解析模块名,确保在不同构建配置下都能正确加载。
- 将
# 文件: README.md (全面重写)
- 内容: 新增 6 大核心特性分类、详细安装部署指南、Widget/Complication 使用说明、FAQ。
- 语法修正: 统一列表格式、修复空链接和乱码 emoji。
- 上下文说明: 明确"滑动窗口"机制——发送给 AI 的是最近 10 条消息,本地历史完整保留。
# 💎 2026-01-22 更新 (体验优化与隐私安全)
摘要:重点优化了输入与交互体验,新增消息行内编辑功能,并完成了代码的隐私合规化处理。
# 文件: ChatView.swift
- 行内编辑 (Inline Message Editing):
- 功能: 允许用户直接修改最近发送的消息内容。
- 逻辑: 编辑提交后,自动清除该消息之后的旧上下文,并触发重新生成。
- 交互: 点击用户气泡下方的编辑按钮(✏️)即可进入编辑模式。
- 快速重试 (Regenerate):
- 功能: 在用户最新消息下方新增"重新生成"按钮。
- 场景: 当 AI 回答不完整或卡住时,一键重试。
# 文件: SettingsView.swift
- 输入框焦点修复 (Input Stability):
- 引入了 Draft State (草稿状态) 模式来处理 API Key 和 URL 的编辑。
- 把编辑操作隔离在局部
@State中,并在onDisappear时才同步回主数据源。 - 修复问题: 彻底解决了 WatchOS 上键盘输入时,因父视图
ForEach刷新导致的键盘断连、闪退和吞字问题。
# 文件: ViewModels.swift
- 隐私合规 (Privacy Cleaning):
- 移除了代码中遗留的所有硬编码敏感配置(Key)。
- 优化了预设配置的加载逻辑 (v13)。
# 文件: LLMService.swift
- 网络层重构 (Network hardening):
- 移除了不稳定的自定义 TLS 验证代理,回归系统原生
URLSession安全策略。 - 增加了标准的
User-Agent请求头,解决了部分服务器返回SSL Closed或403的问题。
- 移除了不稳定的自定义 TLS 验证代理,回归系统原生
# 🔥 2026-01-21 紧急修复 (Critical Hotfix)
摘要:修复了流式传输期间退出 App 导致的闪退,以及因数据损坏导致 App 永久无法打开的致命 Bug。
# 文件: ChatView.swift
- 后台防崩机制 (Background Protection):
- 引入
@Environment(\.scenePhase)监听应用生命周期。 - 核心逻辑:当 App 进入后台 (
.inactive或.background) 时,立即调用viewModel.stopGeneration()强行中断生成。 - 修复问题:解决了流式输出未完成时用户按下表冠退出,后台线程尝试刷新 UI 导致的 WatchOS 系统强制崩溃 (Watchdog Termination)。
- 引入
# 文件: ViewModels.swift
- 启动容错 (Safe Boot):
- 重写
init()中的数据加载逻辑,将原本的try?替换为完整的do-catch结构。 - 自动修复:若检测到本地
UserDefaults中的 JSON 数据损坏(Crash Loop 的元凶),自动捕获错误并重置为空列表,优先保住 App 正常启动。 - 修复问题:解决了因一次意外崩溃导致本地数据写坏,进而导致 App 每次启动即闪退(Persistent Crash)的问题。
- 重写
# 文件: LLMService.swift
- 僵尸任务清理 (Zombie Task Killing):
- 在
streamOpenAIChat和streamGeminiChat的AsyncThrowingStream中添加continuation.onTermination回调。 - 联动取消:当 UI 层取消任务时,强制通过
task.cancel()切断底层的URLSession网络连接。 - 优化:防止 UI 停止生成后,后台仍在默默下载数据,既浪费电量又可能导致数据错乱写入。
- 在
# 🆕 2026-01-21 更新 (功能特性)
# 文件: ChatView.swift
- 回到底部浮动按钮 (Scroll-to-Bottom Button):
- 使用
GeometryReader+PreferenceKey检测底部是否可见。 - 加入状态防抖(
if isAtBottom != isVisible),防止无限重绘导致闪退。 - 使用
.overlay(alignment: .bottom)确保按钮可点击(避免 ZStack 与 ScrollView 的触摸冲突)。 - UI:纯蓝色向下箭头
chevron.down,无背景,触控区域 60×44pt。
- 使用
- 用户气泡颜色:
- 从蓝色 (
Color.blue) 改为绿色 (Color.green),模仿 iMessage 风格。
- 从蓝色 (
# 文件: SettingsView.swift
- 新增 Toggle:显示/隐藏导航栏模型名称。
- 新增 Toggle:显示/隐藏回到底部按钮。
# 文件: ViewModels.swift
- 新增属性:
@Published var showModelNameInNavBar: Bool@Published var showScrollToBottomButton: Bool@Published var isInputVisible: Bool
- 模型名称缓存:
- 新增
_cachedModelName和_cachedModelID,减少遍历计算。
- 新增
# 🛠 2026-01-13 更新 (核心架构与稳定性)
# 文件: ChatView.swift
- 重构视图结构:将
LazyVStack替换为VStack。- 原因:
LazyVStack在 WatchOS 上会导致动态加载时的 UI 跳动(黑屏闪烁)。 - 效果:流式输出现在丝般顺滑,不再抖动。
- 原因:
- 智能滚动 (Auto-Scroll):
- 修改
onChange(of: viewModel.currentMessages.count)逻辑。 - 效果:仅当新消息增加时才滚动到底部,查看历史消息时不会被强制拉回。
- 修改
- 消息截断 (Message Capping):
- 仅渲染最近的 20 条消息。
- 原因:防止长对话导致 Watch 内存溢出(OOM Crash)。
- Sheet 修复:
- 将
.sheet(isPresented: $showHistory)移动到NavigationStack最外层。 - 效果:彻底修复了"历史记录列表点不开"的 Bug。
- 将
# 文件: ViewModels.swift
- 强制配置刷新:
- 将
currentVersion从v9升级到v10。 - 效果:强制清空旧的
UserDefaults缓存,确保新的 API Key 不会被覆盖。
- 将
- 触觉反馈 (Haptics):
- 引入
WatchKit,在sendMessage,stopGeneration,error等关键节点加入震动。 - 效果:操作更有"质感",不再是干巴巴的点击。
- 引入
# 🎨 渲染引擎增强 (Rendering Engine)
# 文件: LaTeXParser.swift (完全重写)
- 移除正则:放弃了不稳定的正则表达式,改用递归下降解析。
- 新增数学符号支持:
- 向量:
\vec{a}->a⃗ - 顶部符号:
\bar{x}->x̅,\hat{i}->î - 矩阵:
\begin{bmatrix} ... \end{bmatrix}-> 自动转为 ASCII 对齐块。 - 嵌套分数:支持无限层级的
\frac{}{}嵌套。
- 向量:
- 防吞字机制 (Fallback):
- 以前:遇到不认识的
\command直接删除。 - 现在:遇到不认识的命令,保留原文本
\command,绝不吞掉用户的一个字。
- 以前:遇到不认识的
# 文件: MarkdownParser.swift (完全重写)
- 代码块保护 (Code Protection):
- 增加预处理逻辑,按
```分割文本。 - 效果:源码块内的 LaTeX 或表格语法不再被解析,保持原样。
- 增加预处理逻辑,按
- 手表专用表格 (Watch Tables):
- 样式:
| Header |->Header(去除两端竖线,节省空间)。 - 分隔:使用
│(全角/空格组合) 代替普通竖线,防止排版错乱。 - 线条:使用短横线
──────代替长线,防止换行。
- 样式:
# ✨ UI/UX 细节打磨 (Polish)
# 文件: ChatView.swift
- 原始模式 (Raw Mode):
- 新增
PrettyMessageBubble内的@State private var showRaw。 - 功能:点击气泡右下角的
{}图标,瞬间切换"渲染视图"和"原始 Markdown"。 - 目的:作为渲染出错时的终极兜底方案。
- 新增
- 按钮优化 (Touch Targets):
- 历史记录 (右上) & 设置 (左上) 按钮:
- 尺寸:强制设定为
44x44pt (Apple 推荐的最小触摸区)。 - 样式:统一加粗 (
Font.weight(.bold)),视觉更平衡。
- 停止按钮 (Stop Button):
- 在
BottomInputArea中,当isLoading为 true 时,发送箭头变为红色停止方块。
- 在
# 文件: ViewModels.swift (配置)
- 预设服务商:
- 智谱 AI、DeepSeek、硅基流动、阿里云百炼、ModelScope、OpenRouter、Gemini、Nvidia、OpenCode Zen。
- 用户需自行配置 API Key。
# 📝 总结
v1.6 (2026-02-14) 彻底重构流式输出架构,实现"注视点渲染"技术(LazyVStack 按行视口渲染),解决长文本流式卡顿问题,性能恒定不随文本长度退化。
v1.5 (2026-02-10) 流畅流式渲染优化,新增三种 Markdown 渲染模式,增强 LaTeX 命令支持。
v1.4 (2026-02-08) 优化了模型管理体验,新增最近使用模型、模型搜索、模型列表缓存、批量验证和配置导出功能。
v1.3 (2026-01-29) 是一次重大更新,重构了 LaTeX 渲染系统并提供双模式选择,新增多 API Key 轮询、温度参数、系统提示词等高级功能,同时大幅优化代码结构和性能。
v1.2 (2026-01-23) 引入了 Smart Stack 组件和表盘快捷方式,修复了 Widget 的致命内存崩溃问题。
v1.1 及更早版本 完成了核心功能的开发和稳定性修复。

