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之后,模型名称部分也会出现预置的模型名称,但我不需要,改成由用户手动填写模型名称,修改之后测试了几个不同的模型,都可以成功连接了