DevLog:2026年12月5日

1、昨天引入RichTextKit,替换了目前的备忘录模块,但依然未能正常进行构建测试,在Xcode中构建时发现存在两处错误,再次反馈给Cursor并修改后构建成功

2、测试发现目前的确已经可以实现富文本编辑器的部分功能,比如设置加粗、下划线、删除线、文字颜色、字体、对齐方式,但工具栏中的斜体、字号大小,还有一个不知道是啥按钮,点亮和取消都没有看到什么变化,而且需要先选中文字,再从菜单里选“Format——More”才能在窗口底部弹出格式工具栏,感觉不够直观,需要缩减菜单层级

3、反馈后Cursor把工具栏改成了常驻在标题和编辑器之间,但在Xcode中多次构建都存在错误,猜测可能是Composer 1模型的问题?于是把Cursor中的模型切换回了Auto再试,但在修改过程中又把格式工具栏给我改回了自定义的NSAttributedString,测试发现其中的按钮基本都没有用,于是要求Cursor用RichTextKit内置工具栏RichTextFormat.Toolbar替换自定义实现

4、这下RichTextFormat.Toolbar常驻在备忘录详情页的标题和编辑器之间了,但格式工具栏高度有些夸张了,我希望能把第一行(包含加粗、斜体、下划线、删除线、字号)常驻,其他按钮先折叠起来,在第一行按钮后方增加一个向下的箭头,点击可以展开完整的工具栏

5、Cursor在使用RichTextContent的API、RichTextStyle枚举、RichTextAction,并保持与RichTextKit的兼容性的同时,实现了我的需求,工具栏默认折叠,只显示第一行常用按钮,点击箭头可以展开更多选项,效果还可以

6、接下来添加一个支持深度思考的模型,测试思考内容的流式输出和展示是否正常

7、插播另一个话题,在使用Cherry Studio询问“有哪些比较好用的跨端开发框架”时,发现使用Cherry Studio调用百度千帆平台的DeepSeek API时,响应速度和回答速度都非常慢,回答一个问题可能需要四五分钟的时间,但直接调用DeepSeek官方的API就没有问题,看了下我在百度千帆上的费用还有47块多,消耗的速度好慢

8、说到跨端开发框架,DeepSeek推荐用Flutter,支持iOS、Android、Web、桌面(Windows/macOS/Linux),高性能、重热载、组件库丰富、生态强大,缺点在于需要学习Dart语言(有Cursor,这个不算缺点)、包体积较大、Web端体验较差(无所谓,我也没打算上Web端),看起来的确是最符合我需求的跨端开发框架

9、之前移动端的ChatWith一直无法全屏显示,多次修改也无果,决定就用它开刀了,看能否在Cursor里使用Flutter框架,把它改成跨端应用,先搞好iOS端,再搞Mac端

10、询问Cursor如果我想把ChatWith改成用Flutter框架的话,可行性如何,Cursor认为目前应用的功能在Flutter中均可实现,核心功能在Flutter中均有对应的方案,我比较关注本地存储和Markdown渲染,本次存储上,Cursor建议对话数据用sqflite数据库,配置用shared_preferences,Markdown渲染用flutter_markdown或markdown_widget,且Flutter的Markdown包更成熟,但是,需要完全重写,无法复用Swift代码

11、Cursor还推荐了如下技术栈:

核心框架:Flutter SDK(最新稳定版)

状态管理:Provider或Riverpod(推荐 Riverpod)

网络请求:dio(支持流式响应)

本地存储:shared_preferences (配置)、sqflite (对话数据)

Markdown渲染:flutter_markdown

UI组件:cupertino_icons (iOS风格图标) 、flutter_slidable (滑动操作)

并且推荐完全迁移,优点在于跨平台、长期维护成本低,缺点在于需要重写所有代码

12、继续询问,如果按照Cursor的建议完全迁移,并使用Cursor推荐的技术栈的话,让它分析了一下详细的迁移计划和项目结构建议,它直接写了三个文档:FLUTTER_MIGRATION_PLAN.md(迁移计划)、FLUTTER_CODE_EXAMPLES.md(代码示例)、FLUTTER_QUICK_START.md(快速开始),可能Cursor认为我自己会参考这三个文档来开发吧,先这样,接下来让Cursor来进行迁移

DevLog:2025年12月4日

1、今天让Cursor引入RichTextKit,替换目前的备忘录模块,Cursor分成了四步操作

1.添加RichTextKit的Swift Package Manager依赖

2.更新NoteEditView,使用RichTextKit替换当前的Markdown编辑器

3.更新Note模型以支持RichTextKit的富文本格式

4.更新NotesListView以正确显示富文本内容

2、同时对之前的功能进行了调整,比如移除了编辑/预览切换功能,可以直接编辑,支持富文本编辑(加粗、斜体、下划线、字体、颜色等),保留了标题输入和字数统计功能

3、据Cursor介绍,RichTextKit提供的功能还是很丰富的,包括加粗、斜体、下划线、删除线等文本样式、字体和字号设置、文本和背景颜色、文本对齐、图片

4、测试时首先遇到了一个Missing package product ‘RichTextKit’的错误,可能是因为未能正确添加RichTextKit依赖导致的,让Cursor修正了下,今天也没有时间测试

5、昨天刚更新Cursor,今天又有更新了,最新版本号2.1.47,暂时没发现有什么区别

DevLog:2025年12月3日

1、参考ChatWith for Mac添加模型的逻辑,预置一些常用的模型服务提供商,供用户在添加模型时选择,包括OpenAI、DeepSeek、Anthropic Claude、OpenRouter、Google Gemini、智谱GLM、月之暗面Kimi、百度文心一言、百度云千帆、阿里通义千问、阿里云百炼、腾讯混元、硅基流动、火山方舟、自定义,用户在添加模型时只需选择模型服务提供商,就能自动匹配对应的BASE URL,并且都是完整的地址,选择“自定义”时,可以自行填写BASE URL,并且有提示文字“需填写完整地址”,备注、模型名称、API Key仍然需要用户自定填写

2、在修改过程中,Cursor创建了模型服务提供商定义AIModelProvider.swift,并且将新文件添加到了项目文件里,测试发现功能基本正常,然后修改了AIModelManagementView里的几处细节:

1.有两个“服务提供商”,需要删除位置靠下的“服务提供商”,虽然完成了,但目前这里的界面略丑,后面再优化一下

2.模型名称下面的说明文字需要固定为“如openai/gpt-3.5-turbo,可根据需要修改”

3.在模型列表页,左滑菜单中已有“测试”按钮,就不需要再在模型右侧设置“地球”标志了,已经让Cursor去掉了

3、明天再让Cursor引入RichTextKit,替换目前的备忘录模块吧,今天就到这儿了

DevLog:2025年12月2日

1、昨天在引入MarkdownUI替换之前自定义的MarkdownRenderer之后,Cursor未能进行构建测试,虽然也自称检查后未发现语法错误,但今天在Xcode中构建测试发现AI对话核心的文件AIChatView存在多个错误,导致构建失败,先复制给Cursor让它修复下这些错误

2、Cursor在简化了AIChatView的部分代码后构建成功,接下来测试并逐个修改各个模块的问题,先是这两个:

1.添加模型之后,发送消息后收到错误提示:发送消息失败:API错误(404),导致无法正常对话

2.AI模型管理界面缺少对模型的测试机制,需要增加测试机制,点击可测试,确认能正常连接

3、Cursor认为第一个问题是因为缺少URL补全机制导致的,于是修复了URL拼接问题,在用户填写的Base URL后面增加/chat/completions,然后在模型管理界面(包括列表视图、表单视图)添加了测试UI

4、在Xcode中打开发现测试UI工作正常,但我与测试可用的模型对话时,出现AI正在思考中的提示之后,没有收到任何回复,继续让Cursor检查原因并修复

5、Cursor修复了流式解析问题,包括改进流式响应解析逻辑、改进错误处理、增强兼容性等,虽然可以正常构建了,但我测试了两个问题,回答内容都未能完整显示,输出了一部分就停了,并且停止按钮一直未能变成发送按钮(正常的话应该收到所有回答之后停止按钮就会变成发送按钮)

6、Cursor认为问题原因在于流式输出解析顺序和ViewModel中的更新逻辑,前者主要是先检查finish_reason再处理delta,导致最后一块内容可能被跳过,当finish_reason存在时直接break,未处理该条数据中的delta,后者主要是更新频率限制在100ms,可能导致最后的内容未及时更新,同时,为了确保流式输出正确完成,Cursor也做了一些修改,无论finish_reason是否存在,都会在结束时调用onUpdate,即使delta为空,也会更新一次,确保状态正确,isLoading会被正确设置为false,停止按钮会变回发送按钮

7、继续在Xcode中测试了两个问题,这次可以完整显示所有回答内容了,并且停止按钮也会随着输出结束变回发送按钮

8、接下来准备参考ChatWith for Mac添加模型的逻辑,预置一些常用的模型服务提供商供用户选择,包括OpenAI、DeepSeek、Anthropic Claude、OpenRouter、Google Gemini、智谱GLM、月之暗面Kimi、百度文心一言、百度云千帆、阿里通义千问、阿里云百炼、腾讯混元、硅基流动、火山方舟、自定义,然后让Cursor引入RichTextKit,替换目前的备忘录模块

DevLog:2025年12月1日

1、目前ChatWith for Mac的主要问题在于偶发应用卡死问题,之前已经多次修复但一直未能解决,先暂停

2、先把手机端的NoteWith搞一个版本到手机上进行实测,目前的NoteWith还有很多地方需要完善下才能通过TestFlight发布测试版,比如还没有应用图标(需要让ChatGPT给做一套),上次将对话和备忘录改用Core Data存储之后未做实际测试,且还需要引入三方库MarkdownUI和RichTextKit,完善AI问答和备忘录的渲染效果和编辑体验

3、先让ChatGPT给设计图标,这次以蓝色为底色,并且“也需要一些设计感,像上面那套图标那样简洁就可以”,但这次ChatGPT也把“NoteWith”给套到了对话消息的图标里,要求“不要把NoteWith放在对话消息图标里,没有体现出Note的含义”,然后要求ChatGPT基于这张图生成一套用于iOS App的图标文件,可以直接放到项目文件里使用,很快就生成了,图标搞定

3、时隔半个月再打开Cursor,发现它推出了自己的模型Composer 1,据称生成速度相比同类模型快四倍,且目前可以免费使用,决定使用它来为应用引入三方库MarkdownUI和RichTextKit

4、先引入MarkdownUI,指令“我需要为当前的应用引入三方库MarkdownUI,用于AI问答内容的显示效果渲染”,Cursor指出需要先添加Swift Package Manager依赖,再更新代码以使用MarkdownUI渲染AI回答内容,在引入MarkdownUI之后更新了AIChatView,以使用MarkdownUI来渲染AI回答内容,并且相比之前自定义的MarkdownRenderer增加了代码块、行内代码等样式,接下来需要在Xcode中打开项目,MarkdownUI会自动下载并集成,AI问答内容将使用MarkdownUI进行渲染

5、Composer在执行这次修改时速度的确很快,但在修改结束后未能进行构建测试,要求构建之后仍然不行,说是“命令行构建因模拟器配置问题无法完成,但依赖已成功解析,代码语法检查通过,项目配置正确,建议在Xcode中直接构建和运行,Xcode会自动处理模拟器配置”

6、然后打开Xcode,发现模拟器又要更新版本至iOS 26.1,需要下载8.32GB,看来我的确是有阵子没有用Xcode运行iOS应用了,而且貌似在新的系统版本下载完之前无法进行构建测试,只能等了,看今晚能不能把模拟器下载完,明天再构建测试

7、想尝试添加一个自定义的模型,在Cursor的设置中,目前预置的模型包括Composer 1、Grok Code、Kimi K2,并且可以通过填写API Key等信息快速添加OpenAI、Anthropic、Google、Azure、AWS Bedrock的模型,有一点之前没有注意,就是如果要使用其他兼容OpenAI的模型的话,可以开启“OpenAI API Key”,填写Key,并打开Override OpenAI  Base URL修改API地址,然后在上方找到Add Custom Model填写模型名称,我试一下OpenRouter的Claude Sonnet 4,不知道为啥加不上,感觉添加模型不是很方便

8、上周看Trae.ai官方公众号推送了文章说TRAE SOLO已经登陆中国版,并且可以免费使用,今天更新了下Trae,据介绍,SOLO 模式集成包括 IDE 在内的多种工具。你只需表达需求,它就会基于目标主动推进完整开发流程。

-SOLO=The Responsive Coding Agent,可以让你直观了解智能体正在处理的内容——从文件、工具到完整的工作上下文,它会随你的操作和变化即时响应,始终与你的工作流保持同步。

-从清晰的规划开始,与子智能体协作,将复杂问题拆解为更为聚焦的任务。借助完整代码上下文进行迭代、重构与优化,实现高精度的工程化执行。

-自动将长对话整理为结构化的任务流,清晰呈现执行路径。所有改动统一汇总在代码变更视图,配合上下文状态统一展示,方便回溯与协作。

介绍了这么多,也没有看出来它到底和之前、和Cursor有什么不同,后面再实际测试看看吧

DevLog:2025年11月17日

1、继续修正之前的问题,并且增加一些细节,首先是数据统计功能,对Cursor说:我需要在设置中增加针对每个模型的数据统计功能,显示自从该模型被添加以来的对话数据量,包含输出Tokens和输入Tokens,这一修改涉及Core Data模型、AIService、DataManager和AIModelManagementView

2、修改后测试发现AIModelManagementView里显示的内容有些多,比如Base URL这一行其实没有必要在这里显示,数据统计功能现在像是一个表格,改成单行就可以了,继续让Cursor修改

3、测试过程中发现对话时偶尔会遇到点击发送按钮后应用卡死的情况,继续让Cursor排查问题,Cursor进行了添加防止重复发送机制、优化Core Data操作、改进错误处理、减少不必要的操作等改进,但仍然没有解决问题,我在打开应用后,打开一个有历史对话记录的对话,输入问题并提交后应用就会卡死,可能是加载历史对话记录导致的卡顿?Cursor优化了处理大量历史消息时的性能问题,并且优化消息的payload构建,包括预取数据、减少faulting、优化排序等等操作

4、再次测试,首次打开一个有对话记录的对话并且提交问题后不会卡死了,但切换到另一个对话并且提交问题时又卡死了,Cursor继续优化流式响应处理,但依然存在应用卡死的问题,甚至打开应用后,打开一个已有历史消息的对话,应用就会被卡死

5、再次修改时,Cursor采用了分批处理消息(每批处理50条消息,避免一次性处理过多)、异步执行、预取优化等操作,并指出卡死时因为打开有大量历史消息的对话时,应用会一次性处理所有消息,长时间占用主线程,Core Data faulting导致同步IO操作,且排序操作在处理大量数据时耗时,现在我看见Cursor这种煞有介事的解读都已经麻木了,AI对自己的思考和操作都非常自信,但实际结果可能并没有多么好,实测果然还是会卡死

6、决定先绕开这个问题,将应用的对话界面修改成每次打开应用时,默认用模型列表里的第一个模型开启新对话,这样应该能避免一打开应用就加载历史对话导致的卡死问题,修改后的工作流程变成了:应用启动时,AIChatSessionListView出现——检查是否有模型配置——如果有模型,使用第一个模型创建新对话——自动选中新对话,用户可以直接开始聊天

7、修改之后实现了我的需求,但我发现目前应用的流式输出好像又出现了问题,像是每次跳出来一两句甚至一两段,Cursor分析后表示这是因为之前使用定时器延迟更新(0.12秒),导致内容在buffer中累积,每0.12秒才更新一次UI,于是将content和thinking内容改成了立即更新,不再使用定时器延迟,tavilyResults也改成了立即更新,这样可以实现接近逐字显示的平滑输出效果,明天再测试下看看

DevLog:2025年11月7日

1、今天再次遇到了用ChatWith for Mac对话时应用卡住的问题,但强制退出、重新对话时又能正常对话了,猜测可能是因为单个对话中内容比较多时,应用还未加载完成就提问,就会导致应用卡死?而且我还发现在不同对话间切换时,有时不会直接跳到最新的对话底部,有时还需要滚动一下才能看到对话内容,体验上也不够统一,继续优化,并且需要把停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计这些功能加进来,测试基本完善后,更新版本号为v0.3,移动端NoteWith的开发暂停

2、向Cursor反馈了这些问题,询问是否是因为内容加载机制导致的,Cursor分析后表示的确和对话内容加载机制有关,主要包括“流式更新时频繁遍历Core Data关系”和“每次保存都整表刷新会话列表”,建议拆分保存和刷新逻辑,减少loadAISessions()调用频率,或换成增量更新,同时在切换会话和流式结束后再合适地触发滚动,避免“滚动到底部”信号在数据还没稳定时被打断

3、具体操作上,需要先重构流式消息的更新方式,再优化Core Data刷新的节奏,修改一次之后依然存在打开对话窗口时不自动滚动到最新对话底部的情况,再次让Cursor修改之后可以自动滚到到最新对话底部了

4、接下来开始增加一些小功能,包括停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计,先增加停止生成按钮(发送消息后、正在回答时发送按钮变成停止生成按钮,点击可以停止生成)、消息时间显示(显示绝对时间),这两个功能都在AI对话界面里,其他功能稍等

5、修改过程中发现,今天Cursor的对话的语言风格突然变了,可能是Auto模式换成了另一个模型?而且也不会根据我之前的要求自动进行构建测试了,甚至在我要求进行构建测试时,也会出现因为权限问题导致的构建失败,挺奇怪的

6、修改之后测试发现已经有了停止生成按钮(但未测试)和消息时间显示功能,连续询问了三个问题,前两个问题都可以正常回答,但第三个问题在点击发送后应用就卡死了,我提交了调试信息,Cursor再次进行了节流流式更新、结束时一次性收尾、降低Core Data压力等优化,这次依然没有自动进行构建测试,那我只有自己继续测试了,连续多轮对话看是不是还会被卡死

7、连续问到第三个问题时应用依然会卡死,再次让Cursor修改,流式输出过程中只往缓冲区追加字符串,不直接操作Core Data,用定时器把写库和UI刷新节流到120ms等操作,这样每条回复只会做少量大块复制,避免了第三次对话时的主线程卡顿(当然这都是Cursor说的,具体体验如何还得看测试结果),再次测试,打开上次因卡死未收到回复的对话时也被卡死了,这次Cursor进行了清理空白AI消息、修改滚动逻辑、思考内容默认折叠(我还是更希望默认展开)等操作,再次测试,切换对话、切换模型后提问时依然有问题

8、这两天对ChatWith应用卡死问题的修改不是很顺畅,开始反思到底有没有必要在同一个对话里切换模型,对这种操作的支持,可能增加了应用的复杂性,如果增加一个默认模型机制(其实一开始是有的,但我给去掉了),每次创建新对话时就直接用默认模型,或者在新建对话时即要求用户选择模型,在一个对话中只允许使用一个模型,可能会更简单一些,但我最初借鉴的Chatbox和Cherry Studio,的确都支持在对话过程中切换模型

DevLog:2025年11月6日

1、让Cursor将当前版本(v0.2)打包,Cursor这次还同步创建了发布说明文档,其中包括版本信息、安装说明、更新内容、系统要求、支持的AI平台、反馈与支持、注意事项等内容,看起来还是挺规范的

2、已经用上了v0.2版本,以后对话时多多使用,修正问题并进一步优化,同时我还询问了Cursor下一个版本的建议,以细节补充和优化为主,Cursor给出了高、中、低三个不同优先级的建议,但我个人还是觉得有些并不着急

3、高优先级建议包括停止生成按钮(发送消息后按钮变成停止生成按钮,可以随时点击停止)、会话重命名/自动命名(其实现在可以重命名,也会自动获取用户的最后一个问题作为会话的名字)、消息复制按钮(已有)、快捷键支持(比如给创建新对话、切换模型、搜索等功能指定快捷键,这个可以有)、错误处理优化(更友好的错误提示、API限流处理、离线模式、崩溃日志等,我暂时不需要)

4、中优先级建议包括重新生成功能、代码块复制(这个可以有)、消息时间显示(我忽略了这一点,现在还真没有)、空状态设计(无对话、无收藏时的引导界面,这个好像也已经有了)、数据导出功能(收藏内容导出成.md还是比较实用的)

5、低优先级建议包括主题色自定义(花里胡哨,不需要)、使用统计(显示使用次数、Token消耗等,后面可以加上)、标签分类(暂不需要)、字体调节(暂不需要)、帮助文档(暂不需要)

6、总结一下,v0.3要增加的功能包括:停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计,也都是一些细节上的补全

7、目前在进行中的开发项目,移动端有ChatWith、NoteWith和DoitWith,Mac端有ChatWith for Mac和NoteWith for Mac,NoteWith for Mac是由移动端NoteWith修改而来,功能上相当于在ChatWith基础上增加了备忘录和待办事项功能,整合的功能比较多,后续可能会考虑删掉待办事项功能,留给DoitWith,且AI对话功能需要重复开发,暂时先搁置,接下来继续开发移动端NoteWith

8、将近三个月没有修改过NoteWith了,甚至都忘了它的功能都有啥,先让Cursor梳理一下目前的项目,都有哪些功能,有哪些优化建议,在梳理过程中,先整理了应用功能与优化建议文档,然后检查发现了重复文件,Cursor建议先清理重复文件(我还发现目前应用文件夹里有多个Trae创建的项目文件备份和.sh文件,也都不需要了,一并清理掉)、清理调试打印和未使用的代码,后面可以考虑更换数据持久化方案为Core Data,然后优化性能、扩展功能等等

9、Cursor直接删掉了15个无用文件(应用能否正常运行还有待验证),然后我删掉了多余的空文件夹,和之前不知道啥时候、由哪个AI工具编写的重构指南文件,以及一个项目初始化脚本setup.sh

10、时隔三个月再次启动了iOS模拟器,iOS 26已经发布,模拟器也换成了iPhone 17 Pro、iOS 26.0,并且部分界面也自动变成了iOS 26的效果,比如底部的AI对话、备忘录、我的三个按钮及其切换效果,决定趁现在应用功能还很简单,结合近期修改ChatWith for Mac的经历,先开启一个新对话,把NoteWith的AI对话和备忘录的数据永久化方式改为Core Data,AI模型、设置等仍然采用UserDefaults

11、Cursor的建议是使用Core Data存储Note、AIChatSession、AIMessage、SearchLink、deletedNotes,仍然使用UserDefaults来保存AIConfig和应用设置,因为Core Data适合结构化数据,支持关系、查询和迁移,UserDefaults适合小量配置,访问频繁但更新不频繁

12、接下来创建Core Data模型文件和相关组件,创建了备忘录、AI对话、AI消息、搜索链接四个实体及对应的扩展类,重构了DataManager,并更新了项目文件,和以往修改数据永久化方式一样,这次Cursor也增加了迁移机制,首次运行时会自动将现有的UserDefaults数据迁移到Core Data,但因为当前应用还没有发布,不需要迁移机制,让Cursor去掉了迁移机制,并且修复了构建错误,具体使用体验怎么样,哪些功能受到了影响,明天再测试,然后引入三方库MarkdownUI和RichTextKit,完善AI问答和备忘录的渲染效果和编辑体验

DevLog:2025年11月5日

1、今天先来修复在对话过程中切换模型会导致应用卡死的问题,以及思考内容高度超出400点后无法自动滚动到最新内容的问题

2、昨天Cursor分析了切换模型可能导致应用卡死的问题,认为首要问题在于Core Data并发冲突,主要修复策略是1.将通知监听器从sheet移到主视图 2.使用安全的方式更新Core Data 3.添加状态管理避免并发冲突,测试发现仍然会卡死,于是要求Cursor添加调试信息来定位问题,在排查过程中还出现了在不同对话间切换会卡死的问题,甚至只是打开一个对话就会导致应用卡死

3、Cursor在对话流程涉及的多个文件中都添加了大量调试信息,在可以正常切换对话、可以看到对话内容后,又出现了与支持深度思考的模型对话时看不到流式输出,但调试信息里可以看到正在输出的问题,原因在于负责思考内容的ThinkingProcessView的ScrollView频繁重建导致卡死(思考内容每秒更新10-20次——每次更新都重建ScrollView——ScrollView重建会触发布局计算——主线程被大量布局计算阻塞,导致卡死),修改过程中Cursor移除了ScrollView,改用简单Text,并且移除了展开/折叠动画,但我觉得展开/折叠动画还是可以保留的,又让Cursor加了回来

4、在修改过程中顺便给浅色模式下的AI对话增加了不同的底色,在最近更新系统到macOS 26之后,浅色模式下对话内容底色太浅,几乎是透明的,深色模式还是正常的,切换深色和浅色外观有时不会立即生效,也一并修改了

5、还是感觉AI回答内容的输出有些慢,怀疑可能是先接收到所有回答内容后再批量输出,Cursor认为当前“应该是”实时流式输出,但也添加了调试信息来帮我确认,如果是实时流式输出,就会在每次收到新内容后,MessageView立刻重新渲染,如果是批量延迟输出,就会在内容累积完成后再渲染,结合调试信息,的确是实时流式输出,在回应Cursor之后,Cursor便自动开始清理所有调试日志,让代码更简洁,涉及文件包括AIChatView、AIViewModel、AIService、MessageView、DataManager、CoreDataManager、TavilySearchService、AIChatSessionListView,二百来行调试信息

6、再次测试,发现现在又出现了在对话中切换模型、发送问题后应用会卡死的问题,打开一个新对话并且使用新模型就不会卡死,要求Cursor把跟这个过程相关的调试信息加回来,好定位一下问题出现在哪里,但添加调试信息后重新测试,发现无论是在新创建的对话里切换模型,还是在已有的对话里切换模型并对话,应用都不会再卡死,难道还是概率性出现?先留着调试信息,后面如果再出现就直接提交给Cursor

7、我需要在设置-关于页面下面增加一个文本区域,显示近期更新内容,并且让Cursor先拟一下近期更新点,微调内容和顺序之后,把版本号也改成了v0.2,以后每个版本都在这个位置显示一下更新日志,目前的更新日志包括:

“🎯 新增OpenAI、DeepSeek、Anthropic Claude及硅基流动、火山方舟等14个平台预设”,

“✨ 优化 AI 模型配置流程,自动填充常用平台的完整 API 地址”,

“🚀 大幅优化流式输出性能,AI 回答更加流畅”,

“🎨 改进消息气泡样式,浅色模式下有明显的背景色区分”,

“🎨 优化思考过程显示,支持完整内容展示”,

“⚡ 优化 Core Data 保存策略,减少数据库操作频率”,

“🔧 修复应用在切换对话时卡死的问题”,

“🔧 修复应用在切换模型后发送消息时卡死的问题”,

“🔧 修复深度思考模型卡死的问题”,

“🔧 修复外观模式切换无法生效的问题”,

“🐛 修复空消息导致的渲染循环问题”,

“🐛 修复死锁问题,提升应用稳定性”

8、然后优化收藏界面,发现在点击右上角的复制按钮时虽然的确可以复制整条收藏内容,但没有任何提示,于是让Cursor增加了Toast提示,并且在2秒后自动隐藏

9、收藏界面最右侧详情栏会显示两行一模一样的标题,Cursor检查后在收藏列表(NoteListView)和收藏内容(NoteEditView)中各有一个标题,只保留了后者,正好和复制收藏的按钮位于同一行,但复制按钮的高度好像有点高,导致收藏列表顶部的分割线和收藏内容顶部的分割线不对齐,可能是plus和doc.on.doc两个图标本身高度就不一样,于是让Cursor改成了文字按钮“创建新对话”和“复制收藏内容”,这下高度都一致了

10、再在更新日志中增加一条“🎨 优化创建新对话、复制收藏内容按钮的样式,删除重复的收藏标题”,明天继续测试、优化应用

DevLog:2025年11月4日

1、继续试用ChatWith,发现目前的应用在使用支持深度思考的模型时,思考内容好像限制了显示高度,一旦达到高度限制,就不会随着思考的内容继续自动滚动,Cursor表示思考内容的显示高度的确固定在了400点,且超出之后会出现滚动条,但超过400点后就不会再自动滚动,在修改过程中发现了另一个问题,好像在对话中切换了另一个模型,再提出新问题时应用就会卡死

2、Cursor分析了可能导致应用卡死的几个问题:Core Data并发冲突、通知监听器生命周期、状态读取时序、缺少状态同步,特别是Core Data并发冲突,由于直接在主线程修改Core Data managedobject,如果此时用户立即发送消息,可能造成并发访问冲突,updateAISession可能触发Core Data save操作,与其他操作冲突,明天继续修改这个问题

3、添加其他模型来测试Base URL的填写方法,之前已经要求Cursor将其改为用户手动填写AI服务的跟地址,应用会自动补全路径,比如api.openai.com、openrouter.ai/api,然后针对火山引擎的“应用”(bots)做了特别优化,需要填写完整地址https://ark.cn-beijing.volces.com/api/v3/bots/,测试发现百度云千帆的Base URL填写仍然有问题,比如我填写官网提供的https://qianfan.baidubce.com/v2/chat/completions就会连接失败,删掉v2往后的内容也不行,只填写https://qianfan.baidubce.com也不行,与其设定各种复杂的自动补全规则,倒不如直接要求用户填写完整的Base URL,或者应用内置一些常用的Base URL来的简单

附上常用的几个AI的Base URL:

OpenAI

https://api.openai.com/v1/chat/completions

DeepSeek

https://api.deepseek.com/v1/chat/completions

OpenRouter

https://openrouter.ai/api/v1/chat/completions

硅基流动

https://api.siliconflow.cn/v1/chat/completions

火山方舟

https://ark.cn-beijing.volces.com/api/v3/chat/completions

https://ark.cn-beijing.volces.com/api/v3/bots/chat/completions

百度云千帆

https://qianfan.baidubce.com/v2/chat/completions

阿里云百炼

https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

4、询问Cursor目前应用在Base URL补全方面的规则是怎样的,根据回答内容,规则包括:

1.如果没有http://或https://,就自动添加https://

2.如果URL末尾有斜杠,就自动移除

3.如果已经包含完整路径,就不做任何修改

4.如果包含部分路径,就自动补全,比如补全v1,补全/chat/completions

5.如果只有基础URL,就自动补全/v1/chat/completions

按照这套规则,我填写了完整的百度云千帆的Base URL,应该能正常使用才对,但填写完整地址之后测试仍然提示404

5、问题可能出现在自动补全v1上,也就是在“包含/chat/completions但不包含v1时,会自动添加v1前缀,包含/api/、/bots/、/v3/、/v2/,且不含/chat/时,则添加chat/completions”这里,根据Cursor给出的示例,可能会出现/v1出现在/chat/completions之后的情况

6、目前的规则的确有些复杂,可能用户在填写过程中也会不知道该填写完整的地址还是部分地址,倒不如直接在应用里内置几个常用的、完整的Base URL,由用户自行选择,要求:目前的规则有些复杂,我希望能在添加和编辑AI模型界面,预置几个常用的API平台的完整Base URL,用户只需要填写备注、模型名称、选择模型提供商、填写API Key、填写Tavily API Key即可使用模型

7、Cursor在修改过程中创建了APIProvider枚举,包含10个常用平台(OpenAI、DeepSeek、Anthropic Claude、OpenRouter、Google Gemini、智谱GLM、月之暗面Kimi、百度文心一言、阿里通义千问、腾讯混元、自定义),这样就不再需要配置路径补全规则,用起来也更方便了,先添加几个模型试试,再决定要不要增加或删减APIProvider

8、在修正因为使用中文引号导致构建失败的错误之后,百度云千帆和火山方舟的API都可成功连接,当API提供商选择自定义时,需在“高级设置”的Base URL中填写完整地址,即带有/chat/completions的地址

9、APIProvider需要增加硅基流动、火山方舟、百度云千帆、阿里云百炼,这四个都放在“自定义”前面,另外我发现在选择某个APIProvider之后,模型名称部分也会出现预置的模型名称,但我不需要,改成由用户手动填写模型名称,修改之后测试了几个不同的模型,都可以成功连接了