# 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: 升级备份服务,支持 renamededuppreview 等高级接口。

# 🐞 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)。
  • 提取逻辑优化:
    • 重构记忆提取 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 更新
  • 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)

# 性能对比

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 模式:总是渲染 Markdown
    • onComplete 模式:流式时显示纯文本,完成后自动渲染
    • 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)。
    • 方案: 完全移除 ChatSessionChatMessage 结构体解码逻辑。
    • 新逻辑: 改为读取轻量级字典 widget_tiny_data,仅包含 titlelastMessage 两个字符串。
    • 效果: 内存占用降低 99%+,Widget 永不崩溃。

# 文件: ViewModels.swift

  • 轻量级 Widget 数据写入:
    • saveSessions() 方法中新增逻辑:每次保存聊天记录时,同步写入一份精简的 widget_tiny_dataUserDefaults
    • 数据结构:["title": String, "lastMessage": String]
    • 联动: 确保 Widget 总能读取到最新的对话摘要。

# 文件: ChatBotApp.swift

  • 表盘复杂功能 (Complication):
    • 合并 ComplicationController 类到主入口文件,确保被正确编译。
    • 将类和所有协议方法设为 public,解决跨模块访问问题。
    • 功能: 支持在表盘添加快捷方式,点击直接唤醒 ChatBot。
  • 二级模型选择菜单 (Nested Model Picker):
    • 新增 ModelSelectionRootViewModelListForProviderView 两个视图结构。
    • 交互: 设置页点击"选择模型" -> 显示服务商列表 -> 点击服务商 -> 显示该服务商下的模型列表。
    • 效果: 模型选择更加清晰,不再需要在一个长列表中滚动寻找。

# 文件: ChatView.swift

  • 左滑删除对话 (Swipe-to-Delete):
    • HistoryListViewForEach 中添加 .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 Closed403 的问题。

# 🔥 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):
    • streamOpenAIChatstreamGeminiChatAsyncThrowingStream 中添加 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

  • 强制配置刷新
    • currentVersionv9 升级到 v10
    • 效果:强制清空旧的 UserDefaults 缓存,确保新的 API Key 不会被覆盖。
  • 触觉反馈 (Haptics)
    • 引入 WatchKit,在 sendMessage, stopGeneration, error 等关键节点加入震动。
    • 效果:操作更有"质感",不再是干巴巴的点击。

# 🎨 渲染引擎增强 (Rendering Engine)

# 文件: LaTeXParser.swift (完全重写)

  • 移除正则:放弃了不稳定的正则表达式,改用递归下降解析。
  • 新增数学符号支持
    • 向量\vec{a} -> a⃗
    • 顶部符号\bar{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)
    • 历史记录 (右上) & 设置 (左上) 按钮:
    • 尺寸:强制设定为 44x44 pt (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 及更早版本 完成了核心功能的开发和稳定性修复。

总访问量:加载中...

请我喝一杯咖啡~( ̄▽ ̄)~*

LengFengY 微信支付

微信支付

LengFengY USDT(TRC20)

USDT(TRC20)

LengFengY USDT(Aptos)

USDT(Aptos)