DevLog:2026年1月25日

1、截至目前,四款应用问题如下,加粗内容暂未修复:

1.DoitWith

-不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

-设置-关于,DoitWith下面的小字和开屏上的小字是否一致?以设置-关于中的小字为准

-在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

-在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

-考虑到后续可能要和Mac版数据打通/同步(通过CloudKit,两个App绑定同一个iCloud Container),趁早将应用的数据持久化方式由Core Data改成SwiftData,和DoitWith for Mac的数据持久化方式保持一致,仅外观设置使用UserDefaults保存

-当天到期的Todo,早上九点推送通知

-添加小组件,小组件上显示当天到期的Todo,信息包括所在分组、标题、下一步

2.DoitWith for Mac

-调整新建分组、添加和编辑Todo窗口的视觉效果,部分图标和文字太小

-设置-关于页面下方增加“近期更新”区域,由Cursor总结近期更新了哪些功能

3.ChatWith

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,可以看到思考内容区域,但看不到具体的思考内容

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

-参考链接引用10条,参考链接区域默认折叠,可展开

4.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

-优化上传附件和图片后的显示效果,比如取消附件和图标的红叉需要改小一些

2、近期的重点在于对齐移动版和Mac版的现有功能,修复明显问题,首先是DoitWith移动版,将数据持久化方式由Core Data改成SwiftData,步骤包括创建SwiftData模型文件,更新PersistenceController.swift、更新TodoData.swift、更新所有视图文件,删除旧的Core Data文件,修改过程中发现虽然Composer 1模型的修改速度非常快,但修改后出现多个语法错误,未能自动检测出来

3、接下来测试功能,让Cursor修复问题,首先是待办页的空状态提示,“暂无任务”改成“暂无待办”,“添加任务开始使用”改成“添加待办或分组以开始使用”,另外待办页无待办时,这些文字上方会显示一条分割线,需要去掉,出现分割线的原因是,以前在无待办时,List里仍有一个底部占位Section(Spacer高度200),该Section上方会出现分割线,修改之后,仅在有待办或分组时显示底部占位Section

4、然后测试添加、完成、修改、删除、搜索Todo和分组,测试发现问题如下:

1.不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

2.在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

3.在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

5、之前遇到过的同一分组内的Todo无法通过拖动调整顺序的问题,这次测试未能复现,可能在修改数据持久化方式之后也给解决了?

6、继续优化ChatWith移动版,主要针对之前测试遇到的问题,包括:

1.在与支持深度思考的模型对话时,现在可以看到思考内容区域,但看不到具体的思考内容,只能看到“思考中…”的提示

2.用户发送消息后,需要立刻显示在对话界面内,现在好像是在AI有响应后才会显示

3.虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

4.参考链接引用由5条加到10条,并且参考链接区域默认折叠,可展开

7、首轮修改之后,上述问题只有4已经被修复,换用内置的Kimi K2试一下,卡在分析问题的过程中,等了一段时间也没有对代码进行实际的修改,然后切换到Composer 1,修改速度很快,并且解决了“看不到具体的思考内容”、“回答内容未结合Tavily搜索结果”的问题,再次测试,要求进行如下修改:

1.思考内容区域要整合到AI消息区域中,即 最上面是思考区域(如果支持深度思考的话),然后是回答内容、参考链接,并且这三块要对齐

2.用户问题发送之后,对话界面应该立刻跳到新问题的位置,现在好像还需要手动往上划一下才能看到?

8、再次测试,上述问题好像也已经修复,但应用非常卡顿,可能是添加了太多调试信息导致的,后面再去掉,先继续用Composer 1尝试修复“清除后台后,再打开应用秒闪退”的问题,这次修改涉及生命周期管理、错误回复、超时保护、友好错误提示等,再次测试,应用直接无法正常启动了,要求Cursor清理所有的调试信息,并检查语法错误,首次启动速度是快了一点儿,但依然没有解决清除后台后无法启动的问题

9、决定换个思路,在ChatWith for Mac的基础上,适配一个iOS版,先让Curosr评估了下,首先,核心业务逻辑100%兼容,且有部分Flutter依赖已支持iOS,需要适配的部分包括部分原生平台代码、UI布局、几个macOS平台的特定功能(比如拖拽、粘贴、word文档和PDF文档解析),Cursor给出了完全兼容(使用条件编译和抽象层)和最小化适配两个方案,决定采纳方案1,希望这样可以减少后续对单独某个功能在Mac和iOS端的重复修改

10、由于存在代码隔离机制,macos和ios是独立的目录和Xcode项目,另有lib统一管理两个平台共用的代码,在后续测试时需要打开.xcworkspace文件,而非.xcodeproj文件,并且在修改共享的代码时要注意平台兼容性

11、分析的很简单,但实际操作时反复出错,比如因为权限问题不能创建项目文件,因为网络问题不能运行pod install等等,按照Cursor提供的文档手动创建项目后,又提示创建的项目不正确,反复修改了一段时间,仍未能修复

12、使用Cursor中的Codex插件检查该版本iOS应用的构建失败问题,几次修改后可以正常构建,但同样出现了ChatWith移动版存在的“清除后台后再打开应用秒闪退”的问题,结合Device Logs,Codex认为可能是一些依赖导致的崩溃,于是先暂时将其在iOS上禁用,避免启动时注册崩溃,多次修改后依然未能解决,而且基于ChatWith for Mac修改的iOS版应用在界面上还是Mac版的样子,完全没有适配移动设备,可能将使用Flutter开发的桌面版应用改为移动版并没有Cursor说的那么简单

13、用Codex,结合Device Logs检查一下“清除后台后再打开应用秒闪退”和首次打开时启动速度很慢的问题,也进行了多次反馈和调整,甚至还暂时去掉了可能导致崩溃的SwiftFlutterSecureStoragePlugin,即flutter_secure_storage依赖,但还是不管用

14、换个思路,从应用的首次启动速度入手,Codex加上了首屏耗时分析,包括First frame: startup=26145ms build=7611ms raster=11ms total=8631ms,针对这一问题进行多次修改,包括把启动阶段的初始化拆到首帧后执行、把设置读取和服务配置的初始化延后到首帧之后、把原生启动页改成橙色背景+标题和副标题以跳过白屏、去掉启动阶段的首帧调试输出等,首屏耗时变成了flutter: First frame: startup=18011ms build=4065ms raster=5ms total=4074ms

15、然后按照Codex的建议,删除App,运行flutter clean、flutter pub get,再重新构建,解决构建错误等等,首次启动可以正常启动,但启动速度比之前更慢了,而且清除后台后无法启动的问题依然存在,后面还得继续修改

DevLog:2026年1月22日

1、截至目前,四款应用问题如下,加粗内容暂未修复:

1.DoitWith

-首次启动应用时无需生成示例数据

-设置-已完成 Todo,数据统计不正确

-已完成Todo页面同样以分组形式显示,需要能看到Todo原本所属的分组

-已过期的Todo需要在显示上有所差异,比如标题用红字

-设置-关于卡片最下方增加版本号信息,先用v0.1.0,居中显示

-按住拖动调整排序的功能无法正常使用

-不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

2.ChatWith(目标是对齐ChatWith for Mac)

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别(两轮修改后已有思考内容区域,但看不到具体的思考内容)

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

-不要给所有填写了Tavily Key的模型自动开启联网搜索功能,改为由用户自行开启/关闭联网搜索功能

-发送按钮上方设置联网搜索开关,并调整布局,拉高消息框,右侧放竖向排列的联网搜索开关和发送按钮

-对话列表中显示的标题是用户的第一个问题,需要改为用户的最后一个问题

-参考链接区域版式优化,目前的链接间距太近,想点开某条时容易点错

-点击对话界面右上角弹出选择模型界面,每个模型的信息分成四行,备注、模型名称、是否支持联网,是否支持深度思考

-长按消息(包括用户消息和AI消息)可弹出菜单,菜单中包含复制、收藏、删除 三个按钮,其中在AI消息上长按点删除时要同步删除思考过程、回答内容和参考链接

-消息(包括用户消息和AI消息)的时间显示有问题,现在只显示时:分,看不到是哪天,当天的消息可以只显示时:分,最近的消息显示昨天、前天、几天前,较早的消息显示完整日期+时:分

3.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

-优化上传附件和图片后的显示效果,比如取消附件和图标的红叉需要改小一些

4.DoitWith for Mac

-询问并调整数据持久化方式

-界面优化,以卡片形式呈现每条Todo

-增加“下一步”功能,和DoitWith移动版采用相同的完成Todo逻辑

2、继续优化ChatWith,之前遗留的几个问题暂时搁置,本轮修改主要针对以下几点:

1.不要给所有填写了Tavily Key的模型自动开启联网搜索功能,改为由用户自行开启/关闭联网搜索功能

2.发送按钮上方设置联网搜索开关,并调整布局,拉高消息框,右侧放竖向排列的联网搜索开关和发送按钮

3.对话列表中显示的标题是用户的第一个问题,需要改为用户的最后一个问题

4.参考链接区域版式优化,目前的链接间距太近,想点开某条时容易点错

5.点击对话界面右上角弹出选择模型界面,每个模型的信息分成四行,备注、模型名称、是否支持联网,是否支持深度思考

3、Composer 1模型的修改速度一流,涉及了五个文件,连接真机测试,1已实现,2消息框的高度没有变,可输入区域还是只有一行,右侧已有联网搜索开关,3对话列表里的标题已可显示用户的最后一个问题,但点开对话之后顶部的标题还是第一个问题,需要统一成最后一个问题,4参考链接之间的间距可以适当缩小一些,5已实现,另外在设置-模型管理界面,每个模型的信息也和刚刚修改的选择模型界面一样分为四行:备注、模型名称、是否支持联网、是否支持深度思考,继续让Cursor修改

4、本次修改Cursor针对消息框设置了最多5行的显示高度,设置了最大高度为120,对话列表和对话页面标题保持一致,将参考链接间距由上次修改的12改为8,并且调整了模型管理页面,与模型选择界面保持一致,真机测试,其他问题都已解决,但输入框仍然只显示为一行,另外再调整下添加模型和编辑模型页面,现有的五个字段都必填,并且把“备注”挪到最前边,提示“起个简单好记的名字吧”

5、针对添加模型和编辑模型页面,Cursor在调整字段顺序的同时,给备注、API Key、Tavily Key字段添加了必填验证,不过Tavily Key字段其实不用必填,再次改了下,针对输入框的高度,截了一张ChatWith for Mac的输入框的图,并让Cursor参考调整了输入框的高度,但测试发现依然未能实现想要的效果,决定将联网搜索按钮从目前的位置挪出来,浮在输入框的上方,居左显示,带有提示文字,另外,在添加模型和编辑模型界面,备注字段的输入框高度和其他几个字段高度保持一致

6、再次真机测试,需求已实现,继续优化,除上述未解决的问题之外,在对话界面还要增加如下功能:

1.长按消息(包括用户消息和AI消息)可弹出菜单,菜单中包含复制、收藏、删除 三个按钮,其中在AI消息上长按点删除时要同步删除思考过程、回答内容和参考链接

2.消息(包括用户消息和AI消息)的时间显示有问题,现在只显示时:分,看不到是哪天,当天的消息可以只显示时:分,最近的消息显示昨天、前天、几天前,较早的消息显示完整日期+时:分

7、测试发现上述需求已实现,发现回收站还有一个问题,目前设置-回收站-收藏内容里会显示我删除的每一条对话内容,这里应该只显示我删除的收藏内容,经过一次修改后我才注意到,每条收藏只有复制、取消收藏两个选项,点取消收藏后,这条内容就会从收藏列表消失,不会进入回收站,需要将“取消收藏”改成“删除”,点击即进入回收站-收藏内容里,并且可恢复到收藏列表、可永久删除,这样才合理,在修改过程中,Cursor出现了反复使用同样的命令行的循环,打断之后虽然出现了构建错误,但再次反馈问题并重新生成代码、运行pod install之后,应用可正常构建,并且删除收藏/恢复收藏的需求也已达成

8、发现真机测试的效率真的比模拟器测试要高很多,而且更符合真实的使用场景,毕竟在Mac上用鼠标操作iOS应用还是不太符合使用手机的习惯,而且模拟器和手机的性能表现也很不一样,在模拟器上有些卡顿的功能,在真机上使用却会很流畅

9、然后将ChatWith for Mac的模型服务商列表截图给Cursor,让它给添加模型和编辑模型界面增加常用的提供商,实现自动填充Base URL的功能,同时保留自定义选项,可以手动输入Base URL,修改之后替换了下百度云千帆的链接,此需求已达成

10、然后是设置-数据统计页只需要保留AI对话和收藏内容两个卡片就行,不要再套一层卡片(外层Card包装),另外设置页底部增加一个“关于ChatWith”卡片,大字显示应用名“ChatWith”,第二行小字“Any AI LLM you like.”,第三行是版本号“v0.1.0”,这三行信息都居中显示

11、至此ChatWith的修改暂告一段落,继续修改DoitWith,需求包括:

1.首次启动应用时无需生成示例数据

2.设置-已完成 Todo,数据统计不正确

3.已完成Todo页面同样以分组形式显示,需要能看到Todo原本所属的分组

4.已过期的Todo需要在显示上有所差异,比如标题用红字

5.设置-关于卡片最下方增加版本号信息,先用v0.1.0,居中显示

12、也用Composer1模型进行修改,修改点包括修改TodoData.swift以移除自动创建示例数据的逻辑,修改SettingView.swift中的统计逻辑,修改CompletedTodosView.swift以按分组显示已完成的Todo,修改TodoRowView.swift和GroupTodoRowView.swift以添加过期检查逻辑,修改SettingView的关于部分,之后开始真机测试,上述需求的2、3、4、5均已实现,1可能需要在另一台手机上测试

13、然后检查一下目前应用都在哪些地方规定了版本号,可否只在一处填写版本号,在其他地方调用该处的版本号信息?针对这一需求,Cursor创建了AppConfig.swift文件来集中管理应用配置信息,规定了版本号优先从Bundle读取(Xcode项目中的MARKETING_VERSION),如果无法读取则使用默认值“v0.1.0”,同时提供了构建版本号的读取方法,然后将刚刚增加的设置-关于板块的硬编码版本号改为从项目配置中读取,这样就实现了版本号只在一个地方定义,并自动同步到使用版本号的地方

14、不止一个地方提到了“版本号”和“构建版本号”两个概念,询问了下ChatGPT,简单说就是版本号Version是给用户看的,构建版本号Build是给系统/开发者/审核看的;版本号表示产品层面的版本,如果用三位数(比如1.0.1)的话,三位数分别代表主版本号、次版本号、修订号,分别对应大版本、功能更新、Bug修复,构建版本号表示技术层面的“第几次打包”,每打一次包,就应该不一样,同一个版本号,对应的构建号必须递增,且不能重复;举例说,日常开发版本号可能是1.0.0+1,有功能更新时版本号可能是1.1.0+10,大版本发布时版本号可能是2.0.0+1,后续可以按照这种方式来管理版本,更加规范一些

15、针对DoitWith for Mac的数据持久化方式,首先让Cursor检查了下,受到以前有AI对话和笔记板块的影响,目前实际使用的是UserDefaults+JSON编码(TodoItem和TodoGroup通过JSON序列化存储在UserDefaults,每次修改都会序列化整个数组并保存),CoreDataManager已经初始化但实际未使用,而且数据模型中还保留着已经删除功能的实体(AIMessage、AISession、AIModel、Note);目前存在的问题有些多,比如Core Data已经初始化但未使用,造成资源浪费,数据模型包含已删除功能的实体,需要清理,UserDefaults不适合存储大量结构化数据,性能较差,每次保存都要序列化整个数组,数据量大时会有性能问题

16、针对上述问题,Cursor建议了三个方案,一是完全移除Core Data以简化架构,减少资源占用,降低维护成本;二是迁移到Core Data,性能好,支持大量数据,支持复杂查询/排序/过滤;三是使用SwiftData,具备更现代的API,与SwiftUI集成更好,代码更简洁,可自动处理数据同步,ChatGPT强烈推荐使用SwiftData(苹果在WWDC23推出的Core Data现代化封装,语法极简,学习成本低),认为它能最大化开发效率,同时不牺牲未来扩展性,让待办类工具使用Core Data有些“杀鸡用牛刀”,决定采纳ChatGPT的建议,使用SwiftData

17、Cursor认为TodoItem、TodoGroup这种业务数据可以使用SwiftData,界面设置和外观设置等配置数据可以继续使用UserDefaults,明天按照Cursor的建议修改下DoitWith的数据持久化方式,后续DoitWith移动版也考虑将Core Data换成SwiftData,ChatWith和ChatWith for Mac已经使用Flutter重制,不涉及Core Data或SwiftData

DevLog:2026年1月21日

1、截至目前,三款应用问题如下,加粗内容暂未修复:

1.DoitWith

-设置-已完成 Todo,数据统计不正确

-首次启动应用时无需示例数据

-已完成Todo页面同样以分组形式显示

-已过期的Todo需要在显示上有所差异

2.ChatWith(目标是对齐ChatWith for Mac)

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别(两轮修改后已有思考内容区域,但看不到具体的思考内容)

-参考链接放到AI回答内容气泡下方,不要合并到AI回答内容的气泡内

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-不要给所有填写了Tavily Key的模型开启联网搜索功能,由用户自行开启/关闭联网搜索功能

-发送按钮上方设置联网搜索开关,并调整布局,拉高消息框,右侧有竖向排列的联网搜索开关和发送按钮

-设置界面删掉多余的说明文字“管理您的AI模型配置,包括API Key、Base URL、模型名称等”

-针对API Key和Tavily Key添加加密机制,提升安全性

-目前已有默认模型机制,但还不能在对话中切换模型,需要添加切换模型机制,点击对话界面右上角的模型备注信息,弹出切换界面,切换界面列出当前的所有模型,点击可切换,并与新模型对话

-对话界面右上角显示的模型信息太长了,改为只显示备注,不显示模型名称

-对话列表中显示的标题是用户的第一个问题,需要改为用户的最后一个问题

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

3.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

2、首先让Cursor修正ChatWith移动版的启动即闪退问题,包括在main.dart中添加错误处理,防止初始化失败导致崩溃、添加全局错误处理,捕获未处理的异常、检查并修复数据库初始化可能的错误等步骤,再次测试暂时没有出现闪退问题,后面再继续测试,发现一个新问题,在对话页右上角点加号创建新对话时,会先闪过一个红屏,但也能正常创建新对话

3、Cursor表示问题可能出现在chat_page.dart中,当找不到对话时,之前会抛出Exeption,导致红屏,修改之后会返回一个默认的Conversation对象,显示“新会话”标题,在重新构建之前,发现再次出现了闪退问题,并且是“首次安装、启动后应用可以正常运行,一旦清了后台再打开,就会闪退”,Cursor认为这可能是应用从后台恢复时数据库连接已失效,但静态变量仍保留引用,使用失效连接会抛出异常,Provider初始化时未捕获异常,导致崩溃,于是对数据库层、Provider层进行了修改,并对main.dart添加了全局错误处理,主要是在获取数据库时检查连接有效性,失效则重新初始化

4、再次测试,依然会遇到清除后台后重新打开时闪退的问题,并且在真机测试过程中,控制台的日志也找不到ChatGPT和Cursor都在说的Exeption、Error、Fatal相关的错误,Cursor添加了更详细的调试信息,先看下在模拟器中测试时能否复现这一问题,以及返回怎样的错误信息,但在测试过程中并未看到“应用从后台恢复”及以后的调试信息,并且之后添加了更详细调试信息之后,也没能看到Cursor提及的可能有用的调试信息,在清除后台后重新打开时,没有返回任何调试信息

5、修改过程中反复遇到了因为没有添加缺失的导入,导致构建失败——反馈问题——添加导入的问题, 跟Cursor明确了下,以后在添加或修改代码时,主动检查并添加所有必需的导入,避免等构建失败后再修复

6、多次反馈、反复修改后依然存在清除后台后无法启动的问题,接下来先测试其他功能,暂时搁置对这一问题的修正

7、逐步调整ChatWith的其他功能,首批修改内容如下:

1.在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别

2.参考链接放到AI回答内容气泡下方,不要合并到AI回答内容的气泡内

3.发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

4.对话界面右上角显示的模型信息太长了,改为只显示备注,不显示模型名称

5.设置界面删掉多余的说明文字“管理您的AI模型配置,包括API Key、Base URL、模型名称等”

8、在切换到Composer 1模型后(Cursor内置的GPT、Gemini、Claude等模型都因为区域受限无法使用,即使我开了梯子),响应速度明显快了很多,进行了调整思考内容展示区域、参考链接移到气泡下方、发送消息后立刻显示、模型信息只显示备注、删除设置界面多余的说明文字等修改,真机测试,上面的需求1未实现,2参考链接气泡和回答内容气泡未对齐,要继续改,3未实现,4、5已实现,另外在对话窗口顶部,对话的标题应该居左显示,再次反馈并修改

9、继续真机测试,思考内容区域只显示“思考中”,不显示具体的思考内容,发送消息后仍然要等一下才会显示在对话界面,参考链接气泡对齐方式已调整,标题已居左,继续修改,这两个问题依然没能解决,暂时搁置

10、继续进行其他修改,本轮需求包括:

1.针对API Key和Tavily Key添加加密机制,提升安全性

2.目前已有默认模型机制,但还不能在对话中切换模型,需要添加切换模型机制,点击对话界面右上角的模型备注信息,弹出切换界面,切换界面列出当前的所有模型,点击可切换,并与新模型对话

11、修改过程中,Cursor引入了encrypt和flutter_secure_storage用于AES加密存储,创建了model_selector_dialog.dart用于选择模型,并将model_display.dart修改为可点击,接下来真机测试(又要运行pod install以同步iOS依赖),模型切换和选择功能已经实现,但Tavily联网搜索功能好像失效了,重新填写Tavily Key(猜测可能是因为加密机制的问题?),依然无法在对话中获取参考链接和最新信息

12、Cursor添加了调试信息,测试发现Tavily Key解密成功,但出现网络错误,错误信息为null,继续添加更详细的调试信息,再次测试,结合调试信息中的错误HandshakeExeption: Connection terminated during handshake,Cursor认为是SSL/TLS握手失败,于是在Info.plist中添加了App Transport Security配置,在ApiClient中配置了SSL证书验证,再次测试,虽然可以联网搜索并获取链接,但搜索到的信息并未整合到回答内容里,反馈之后,Cursor改进了搜索结果的格式,添加了系统信息(明确指导AI要基于搜索结果回答问题),并且改进了消息构建逻辑,测试发现此问题仍然存在,后续再修改

DevLog:2026年1月14日

1、询问Gemini后,使用命令行在终端里打包了应用(cd+空格+项目文件夹路径,进入项目根目录,然后运行flutter build macos –release -v),实测只用了49.3秒就完成了打包,并且自动放到了项目文件夹——build-macos-Build-Products-Release文件夹下,拽到应用程序文件夹替换掉之前用Swift开发的版本,测试后发现功能正常

2、但是这个版本依然没有签名,可能在使用过程中还是会受苹果的Gatekeeper机制影响,结合Gemini的建议,删除缓存,将My Mac切换为Any Mac(Apple Silicon, Intel),并且给Xcode打开完全磁盘访问权限后再次打包,依然卡在in progress环节

3、然后根据Gemini的建议,陆续在终端中查询了最近公证记录(一共提交了4条,每条都是在in progress)、查询公证错误报告(公证流程还没有走完,所以也没有什么具体的错误信息),先继续优化应用、丰富功能,继续等这4条看啥时候能完成

4、接下来给应用增加对快捷键、右键菜单、剪贴板中的图片、拖拽图片和文件的支持,具体的需求是:

1.在设置列表中增加“快捷键”,放在数据统计和回收站中间,右侧设置详情展示对快捷键的说明

2.我需要的快捷键包括新建对话/笔记command+N(在对话页就新建对话,在笔记页就新建笔记)、发送消息command+enter(仅针对对话页)

3.另外在AI对话页,给每条消息增加右键菜单,包括收藏、复制、删除三个功能

4.AI对话页面目前好像不支持读取系统剪贴板中的图片,只支持文字,我需要在AI对话过程中,可以将剪贴板中的图片粘贴到AI对话框,效果和上传图片的效果一致

5.AI对话页面也需要支持拖拽图片和文件,将图片或文件拖拽到AI对话界面,效果和上传图片/文件的效果一致

5、在提交给Cursor之前,先询问下它对快捷键有哪些建议,只有上面需求中的两条好像的确有点少,结合Cursor的建议,增加command+F(打开搜索功能),其他快捷键后续再视使用情况陆续补充

6、本次修改涉及10个文件,包括设置列表中的快捷键选项、快捷键实现、AI对话页消息右键菜单、剪贴板图片粘贴支持、拖拽文件支持,测试时构建失败,可能这次同时涉及多个小功能的修改,比较复杂吧,出现了括号不匹配、结构问题、缺失的Intent类等问题,构建成功

7、逐个测试新增功能,并要求Cursor修复:

1.设置-快捷键,右侧的详情需要做一些微调,去掉顶部的“快捷键”三个字,“对话页面”改成“AI对话”,“笔记页面”改成“笔记”,去掉底部的“消息操作”分组及右键菜单的说明,其他快捷键说明和后面的文字需要居中对齐,目前好像是顶部对齐

2.新建对话、新建笔记的快捷键不管用,按command+N时未能新建对话、新建笔记,comman+enter发送消息的快捷键已支持

3.目前AI回复的消息已支持右键菜单,需要给用户消息也增加同样的右键菜单

4.不要自动把剪贴板中的图片粘贴过来,留给用户手动操作

5.实测仍不支持拖拽图片或文件到AI对话界面

8、再次测试,以上的1、3、4、5已支持,新建对话、新建笔记的快捷键command+N还是不管用,另外消息输入框还不支持通过command+V粘贴文字,也需要继续修改,当前对话中针对这一需求已经进行了两次修改,均未能实现,于是开启了一个新对话

9、提出需求:我需要在对话界面可以通过command+N新建对话,在笔记界面可以通过command+N新建笔记,另外对话的输入框需要支持用command+V粘贴从其他地方复制的文本和图片

10、Cursor指出目前新建对话和新建笔记的快捷键支持已经在对话和笔记列表中实现,无需修改,然后调整了对话输入框的粘贴处理逻辑,同时支持粘贴文本和图片,再次构建测试,对话框现在可以粘贴文字了,但粘贴图片时看不到缩略图,并且发送图片给支持图片的API后,再次出现了“错误: API密钥无效,请检查API Key设置”的提示,通过附件按钮上传图片时,可以正常显示缩略图,正常进行提问和解读,而且新建对话和新建笔记的快捷键只有光标停留在输入框、编辑某条笔记时才能生效,我需要的是只要当前位于对话界面就可以用快捷键新建对话,只要当前位于笔记界面就可以用快捷键新建笔记

11、修改后再次测试,两个问题都未能解决,继续反馈修改,粘贴到对话框的图片应该和通过附件上传图片的效果一致,Cursor添加了调试信息,明天再结合调试信息继续反馈给Cursor修改

12、发现在对AI消息进行收藏、复制操作时,没有将深度思考内容和Tavily的参考链接包含在内,但在右键点击时,在深度思考内容和Tavily参考链接的显示区域也可以弹出右键菜单,但想了想好像的确不需要复制和收藏思考内容及Tavily参考链接,以后视需求再做调整

13、明天继续详细测试每个功能,再问问Cursor能否使用macOS的textutil实现对word文档的解析(来自千问的建议),然后版本号更新为v0.1.1,build号用2,刷新README.MD和设置-关于ChatWith,下一个版本重点优化笔记板块的功能和界面

DevLog:2026年1月12日

1、昨天对发送图片、解读图片的功能进行了修正,并且修改了切换模型后仅界面发生变化,实际仍未切换模型的问题,接下来继续丰富应用功能,优化体验

2、有一个遗留问题,在AI输出过程中对话列表频繁刷新,不是很影响使用体验,只是视觉上感觉不太好,之前多次修改后问题仍然存在,试试看能否修正,Cursor在修复时在Consumer中添加了缓存机制,并在_ChatSessionRow的_onViewModelChanged中添加检查,对话列表只在如下情况刷新:AI回答结束后、创建新对话、删除对话、修改标题、置顶/取消置顶,测试发现已修复,对话列表不再频繁刷新,看来如果在一个对话里多次提出某个需求未能解决的话,打开一个新对话再重新提需求,或许真的能解决问题

3、到目前,使用Flutter重构的ChatWith for Mac已经基本对齐了之前的Swift版本,并且还增加了对笔记(原收藏)的富文本编辑、上传和解读图片的功能,接下来将版本号修改为v0.1,并刷新一下README.md,再看看Cursor有哪些增加功能、优化体验的建议

4、Cursor列举了大量不同优先级的建议,结合个人的使用习惯,我觉得这些功能可以作为下一步的开发重点:对话导出(导出为Markdown,放在设置-数据管理中)、收藏导出(导出为Markdown,放在设置-数据管理中)、多模态支持(支持word、pdf等文档)、快捷键支持(新建对话/笔记command+N、发送消息command+enter、复制消息command+C,并且在设置中列出这些快捷键)、拖拽功能(拖拽图片、拖拽文档)、API Key和Tavily Key加密存储

5、先逐个增加这些功能,不更改版本号:

1.选择AI模型的界面,增加“添加更多模型”功能,也用目前的模型卡片样式,放在已有模型的下方,点击直接跳转设置-AI模型管理界面

2.选择AI模型的界面,底部的“取消”按钮改为确认

3.API Key和Tavily Key加密存储,之前竟然不是加密存储?也需要跟Cursor确认下

4.设置列表增加“数据管理”,放在“外观设置”和“数据统计”之间,包含导出所有对话、导出所有笔记两个功能,但要询问下Cursor到底是导出为Markdown还是JSON

6、首先是“添加更多模型”功能,Cursor在模型选择界面添加了“添加更多模型”卡片,并实现了跳转功能(使用GlobalKey实现跨组件导航),方便添加新模型,另外由于目前在选择AI模型界面点击模型即可实现切换,那就把底部的“取消”按钮改成“确定”就行了,不需要在功能上有啥变化

7、然后是API Key和Tavily Key的加密存储,询问Cursor后得知目前是以明文存储在SharedPreferences中,感觉还是挺不安全的,Cursor建议了三种加密方式:使用flutter_secure_storage或encrypt包对敏感信息加密、使用macOS的Keychain存储密钥,或者至少使用AES进行基础加密

8、我选择了使用AES进行基础加密,这也需要添加encrypt依赖,实现的效果包括AES-256加密(使用256位密钥),每个应用实例生成唯一的加密密钥,密钥存储在SharedPreferences中,并且在保存时自动加密,加载时自动解密,Cursor还增加了“旧的未加密数据在首次加载时会保持原样,下次保存时会被加密”的功能,测试一下,现有模型功能未受影响,但与新添加的模型对话时,“AI正在思考中”的提示一闪而过,看不到回答的内容,不清楚是否与刚刚的加密功能有关

9、可能是在加密之后,应用会将加密的字符串误当做API Key导致的?Cursor进行了调整并添加了详细的调试信息,收到了“这可能表示API返回格式不符合预期,或者模型配置有问题”的调试信息,结合调试信息,Cursor认为原因是DeepSeek API在流式响应中返回的usage字段为null,代码直接将其转换为Map<String, dynamic>导致类型转换错误,修改之后再次测试,新模型也可以正常使用了

10、还有一个问题,貌似在对话过程中将模型A切换为模型B后,如果对话中有前文,就会继续和模型A对话,如果是新的对话,没有前文,就会和模型B对话,这个逻辑也不对,应该是我切换到模型B后,就直接跟模型B对话,让Cursor检查下是否存在这个问题,Cursor在检查后认为sendMessage中获取的session可能不是最新的,于是修复了这部分的逻辑,切换模型后,无论是否有前文,都会使用新的模型进行对话,测试发现该需求已成功搞定

11、然后就是数据导出功能了,我先询问了ChatGPT,我有一个使用Flutter开发的AI对话应用,包含AI对话和笔记两个模块,我需要增加数据导出功能,点击可以导出所有的AI对话和笔记,你建议默认导出为哪种格式?ChatGPT回答是“笔记以 Markdown 为主形态,对话以 JSON 为主形态;但完整导出时,两者都应同时提供。”感觉没能解决我的问题,反而更复杂了,Cursor则建议AI对话和笔记都导出为Markdown,AI对话的导出内容包含会话标题、时间范围、消息列表(用户/AI)、时间戳、token统计(可选,话说不知道Cursor啥时候给我加上了这个功能,AI每次回答的底部现在都有统计信息),笔记的导出内容包含标题、内容、创建/修改时间、字数统计(可选)

12、结合ChatGPT和Cursor的回答,明确我的需求如下:

1.在设置列表增加“数据管理”,放在“外观设置”和“数据统计”之间

2.点击设置列表中的“数据管理”,右侧详情包含“导出所有AI对话”和“导出所有笔记”两个功能

3.点击“导出所有AI对话”,即将所有AI对话内容,包括会话标题、时间范围、消息列表(用户/AI)、时间戳、token统计导出为一个.md文件,命名为“AI对话+当前时间”,并提醒用户选择保存路径

4.点击“导出所有笔记”,即将所有笔记内容,包括标题、内容、创建/修改时间、字数统计导出为一个.md文件,命名为“笔记+当前时间”,并提醒用户选择保存路径

13、上述需求提交给Cursor,修改过程中,Cursor进一步细化了导出的AI对话和笔记涉及的内容,并且会有错误提示和成功提示、自动排除已删除的对话和笔记,测试发现顶部的“数据管理”和“导出所有数据为Markdown格式文件”提示文字都可以去掉,但点击导出按钮后Xcode提示错误:Unable to display save panel: your app has the User Selected File Read entitlement but it needs User Selected File Read/Write to display save panels. Please ensure that your app’s target capabilities include the proper entitlements.可能还是权限问题?

14、Cursor指出这是macOS权限配置问题,目前的entitlements文件只有只读权限,但保存文件需要读写权限,将两处read-only改成read-write后再次测试,AI对话和笔记都可以正常导出并选择保存路径了

15、然后给应用增加一个关于页面,设置列表的最后增加一个“关于ChatWith”,点击后在右侧设置详情显示如下内容:

第一行,标题:ChatWith

第二行,文本:Any AI LLM you like.

第三行,版本号:v0.1.0(当前版本号)

分割线

近期更新:罗列一下近期的更新点

然后,设置-数据管理顶部的“数据管理”和“导出所有数据为Markdown格式文件”提示文字一并去掉

16、修改过程中添加了新的依赖package_info_plus,但未自动运行pod install,导致构建失败,再次提示Cursor运行pod install更新CocoaPods依赖,然后修复了一个package_info_plus中的版本号显示逻辑问题,但还有一些地方版本号显示有问题,梳理之后发现主要版本定义(源头)在于pubspec.yaml,这是Flutter的版本定义源,但有些地方甚至采用了硬编码来定义版本号,于是要求所有显示版本号的地方都统一采用pubspec.yaml中的版本号,并移除硬编码,以后要修改版本号只需修改这一处就好了,再次测试、Clean Build Folder、测试、用Cursor清理缓存、测试,版本号已可正常显示,明天继续丰富功能、优化体验

DevLog:2026年1月6日

1、继续测试使用Flutter重写的ChatWith for Mac,还有很多问题需要修改,先修改这几处:

1.把右上角的搜索按钮挪到最左侧,放在“对话”上面

2.明确对话列表、收藏列表的显示规则,对话列表中,标题是用户提出的最后一个问题,下面小字显示最后一次回答的内容,只显示一行,收藏列表中,标题是收藏的回答对应的问题,下面小字显示收藏的回答内容,只显示一行

3.对话列表和收藏列表的宽度都固定为300,且不需要拖动调整

4.应用最顶部标题栏的chatwith改成ChatWith

2、上述问题1、2、3均已修改,问题4仍未修改,而且还存在如下问题,继续修改

1.顶部居中显示的ChatWith没有用,可以去掉

2.每次打开应用时窗口大小都会回到初始值,没有保存上次打开时对窗口大小的调整,还需要手动调整一下

3.简化一下设置界面,第三列即设置详情的顶部,需要去掉AI模型管理、外观设置、数据统计、回收站这些标题

4.添加和修改模型时,底部的高级设置展开后显示不全,并且有一条多余的分割线,可以去掉

3、继续修改一些界面上的小问题,之后重点测试对话流程,比如切换模型对话、联网搜索功能等等

1、左上角搜索按钮,鼠标划过时不需要显示提示,并且划过时的背景大小要和下面的对话、收藏、设置按钮背景大小一致,在搜索按钮下方增加“搜索”二字,与其他三个按钮样式保持一致

2.去掉对话列表顶部的“新建对话”按钮,去掉收藏列表顶部的“新建收藏”按钮

3.About chatwith界面的应用名是哪里规定的?可否改成ChatWith?

4.每条AI回答内容的底部除现有的收藏、复制按钮外,增加一个删除按钮

4、Cursor修改之后,上面2、3、4都已经OK,但是1鼠标在划过时显示成了方形的背景,而非划过对话、收藏、设置按钮时的圆角矩形按钮,继续修改,并且给最左侧导航栏顶部添加了8像素的间距,不再紧贴顶部

5、收藏界面打开一条收藏后,列表顶部的分割线和收藏详情顶部的分割线没有对齐,让Cursor把收藏详情顶部的“编辑”和“复制”按钮改成和对话详情顶部的“新建对话”按钮一致的样式,虽然仍然没有完全对齐,但相比之前已经美观很多了

6、继续修改对话和收藏页,首次打开应用时对话界面虽然有空状态提示,但没有新建对话按钮,还需要把刚才删掉的对话列表顶部的“新建对话”按钮加回来,同时右侧详情页顶部的模型切换按钮、新建对话按钮,即使未打开任何对话,也要一直显示;针对收藏页,收藏列表顶部的“新建收藏”按钮也加回来,如果没有打开任何一条收藏,右侧详情页顶部就只显示一个“新建收藏”按钮,如果打开了任何一条收藏,右侧详情页顶部就显示“编辑”和“复制”按钮,这样修改之后对话和收藏页面的列表、详情页分割线就对齐了

7、接下来给收藏详情页底部增加一行信息栏,打开一条收藏后,可显示该条收藏的添加时间、修改时间(最后一次修改的时间)、字数统计三个信息;然后在对话详情页,需要给每条消息增加时间信息,显示在消息下方,Cursor先使用了比较复杂的相对时间(近期)+完整日期时间(较早的日期)的方式,今天的时间只显示时分,昨天的时间显示为昨天+时分,一周内的时间显示为几天前,更早的显示为完整日期时间,貌似这也是苹果设备上的应用比较常用的时间显示方式

8、然后把回收站的收藏和对话换个顺序,左边是已删除的对话,右边是已删除的收藏,到此,对于应用界面的首轮修改就差不多了,备份了之前使用Swift写的ChatWith for Mac,然后清理了对应的文件、刷新了README.md文档

9、接下来开始对各项功能进行测试和完善,在对话过程中发现如下问题,先集中修改一波:

1.新建对话时,有时会出现这样的问题:新对话在列表里会显示和上一个对话一样的标题和副标题,再次新建对话才会以“新对话”为标题

2.启用联网搜索功能后,联网搜索结果的显示需要优化,我只需要看到标题-网站名和来源链接,不需要从中摘取的内容,并且这些链接我需要可以点击,点击后直接用默认浏览器打开

3.对话列表的置顶功能有问题,比如我将对话A和B都置顶,再取消对话A的置顶,这时应该只有对话B置顶,但实际使用时却是对话A置顶,对话B被取消了置顶,并且置顶的对话应该有个区别于非置顶对话的底色,可以对比下收藏列表的置顶功能,收藏列表的置顶功能正常

4.对话列表和收藏列表,都应当支持用户修改标题(点击标题后面的三个圆点,菜单里需要有置顶/取消置顶、修改、删除三个功能,在在现在的基础上增加“修改”功能),如果用户修改了标题,就一直用用户修改的标题,如果没有修改,就沿用之前的标题获取逻辑

10、修改后测试,构建失败,问题:The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation.原因在于刚刚为了实现参考链接可点击的功能,添加了url_launcher依赖,需要重新安装Pods以包含新的macOS插件(url_launcher_macos),否则就会出现Podfile.lock与实际的Pods目录不同步的问题,修改之后解决

11、再次测试,其他问题基本都已修正,还需要继续进行一些优化:对话列表可能存在刷新机制的问题,对标题进行修改、置顶/取消置顶、新建对话等操作后,列表有时不会立即刷新;联网搜索功能参考的链接需要增加到10个,5个链接可能参考性不足;AI回答内容背景的灰色太深了,需要浅一些

12、再次测试,发现对话列表的刷新机制还是有点问题,比如AI正在回答时,对话列表就会频繁刷新,其实不需要,让Cursor改成了回答结束后刷新对话列表,但发现在联网搜索过程中和回答过程中还是在频繁刷新,于是和Cursor明确:在联网搜索过程中也不要频繁刷新,只有回答结束后、置顶/取消置顶后、修改标题后、创建新对话后 这几种情况下才触发对话列表的刷新操作,再次修改后对话列表仍然会在AI回答过程中频繁刷新,这个问题后面再开一个新对话再修改

13、继续测试应用的功能,接下来是收藏模块,首先收藏的内容比较长时,收藏详情底部会出现“BOTTOM OVERFLOWED BY XXX PIXELS”这种提示,并且无法滚动查看,只有在点击编辑后才能滚动查看,修改过程中将非编辑模式下的MarkdownBody包裹在SingleChildScrollView中,使内容可滚动,问题已解决

14、发现新问题,有些回答内容中就会带一些文字形式的链接,但只显示为蓝色文字,无法打开,我需要让这些链接也像Tavily提供的参考链接那样可以直接点开,在回答内容、收藏内容都是如此,都要点击可以直接点开,为实现这一需求,针对AI回答内容中的链接,Cursor给MarkdownBody添加了onTapLink回调,点击链接时使用url_launcher在默认浏览器中打开,并且添加了链接样式,针对收藏内容中的链接,Cursor导入了url_launcher包,并为MarkdownBody添加了onTapLink回调,实测问题已解决

15、对话和收藏删除之后,回收站里第一条内容和分割线之间没有任何间距,需要稍微增加一点间距(可以用第一条和第二条之间的间距),视觉上更好一些,针对这一问题,Cursor给第一条删除的内容和TabBar分割线之间增加了8像素的间距,与列表项之间的间距一致,视觉上更统一了

16、还有,数据统计界面的收藏、对话、模型三个图标颜色有些突兀,需要改一下,针对这种比较模糊的需求,Cursor将Colors.red、Colors.blue和Colors.purple改成了Colors.pink.shade300、Colors.blue.shade300和Colors.grey.shade300,认为这些颜色比较柔和,与界面更协调,再次构建看效果,的确比之前要好些了

17、AI模型管理界面,每个模型卡片的整体高度需要稍微缩减一下,稍微紧凑一点点,现在每个卡片的高度都比较高,默认窗口大小的情况下只能显示两三个模型,Cursor同步修改了卡片内边距、标题字体大小、垂直间距、文字大小、按钮尺寸等等,显示效果好多了

18、然后调整数据统计界面的卡片间距,之前间距过大,要求统一成8,但视觉上还是很大,可能每个卡片上下各有8的间距?另外还需要增加已删除的对话、已删除的收藏 两个数据统计卡片,图标颜色用灰色,整体顺序用:AI模型数量、对话数量、已删除对话数量、收藏数量、已删除收藏数量,再次构建测试,需求已达成,今天到此结束

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

DevLog:2025年12月15日

1、继续测试深度思考功能是否正常,换不同的问题问一下支持深度思考的模型,以及对话的置顶/修改/删除功能(已有按钮,和之前使用Swift的ChatWith操作方式一致,但按钮的样式变了,可能是安卓原生的按钮?)

2、测试发现未能显示深度思考内容,且即使在问题中增加了“最新”这样的提示词,也未能联网获取最新信息,对话的三个操作按钮中,置顶/取消置顶功能正常,修改标题后在列表中仍然显示原标题,删除后可正常进入回收站,也能从回收站中恢复到对话列表,且在回收站里的对话会显示为修改后的标题

3、除了要修正上面的问题外,还需要补充的功能包括触发联网搜索、显示联网搜索的参考链接、测试模型是否可用,继续对Cursor提出需求如下:

1.只要是与支持深度思考的模型对话,就在对话最上方显示思考内容,默认展开,可在回答结束后折叠

2.只要我在模型设置中填写了Tavily Key,在回答时就调用Tavily的联网搜索能力,并且在回答内容下方显示参考链接,样式需要与回答内容有所区别

3.在添加/编辑模型页底部增加测试按钮,点击测试模型是否可正常使用,如果不能正常使用需要给出错误信息

4.在对话上左滑修改对话标题后,对话列表里仍然显示为原标题,但在回收站里的对话会显示为修改后的标题

5.对话列表里,只能看到最后一个问题,看不到最后一次回答,我需要在每个对话的标题下方显示一行最后一次回答的内容

4、修改完成后测试上述功能,发现:

1.与支持深度思考的模型对话时,仍然未能看到思考内容,又添加了另一个支持深度思考的模型(DeepSeek官方的deepseek-reasoner),也看不到思考内容,但是回答的速度还是挺快的

2.联网搜索功能已实现,点击参考链接不会直接打开,而是可以看到完整链接,并且可以选中、复制,可能改成点击直接跳转至默认浏览器打开链接会比较合适

3.模型测试功能已实现

4.已实现需求,对话列表里可以看到修改后的标题,但不是我最后一次提出的问题

5.创建新的对话,已经可以在列表里看到最后一次回答的内容,可能已经改好了?

5、基于上述测试结果,继续提出修改需求:

1.对于联网搜索的参考链接,我需要点击后直接在默认浏览器中打开

2.在对话列表中,我需要对话的标题默认显示我提出的最后一个问题,如果我修改了标题,则一直显示为修改后的标题

3.AI回答的内容下方,除了收藏按钮之外,还需要增加一个复制按钮,点击可将回答内容(不含参考链接)复制到剪贴板,并且在点击收藏和复制按钮时,要分别有收藏成功、复制成功的toast提示

6、修改过程中,对于上述第一个需求,出现了/Users/jinlei.wu/Documents/GitHub/ChatWith/chatwith_flutter/ios/Runner/GeneratedPluginRegistrant.m:24:9 Module ‘url_launcher_ios’ not found的错误提示,无法构建,Cursor认为这是在添加url_launcher后,iOS项目需要更新CocoaPods依赖,修改之后可以正常构建并在模拟器中运行应用,并且上述三个需求均已实现

7、仍有如下需求未能实现,后面在Cursor中开启新对话时再看能否实现:

对话页、收藏页、设置页三个页面的标题仍然是居中显示(第二次修改无效),看不到支持深度思考的模型的思考内容(第三次修改无效)

8、还需要处理一下目前Xcode中出现的警告信息:/Users/jinlei.wu/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ios/url_launcher_ios/Sources/url_launcher_ios/URLLauncherPlugin.swift:22:26 ‘keyWindow’ was deprecated in iOS 13.0: Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes,看样子还是刚刚添加的url_launcher导致的问题

DevLog:2025年12月11日

1、需要给应用增加多模型管理和切换、联网搜索(通过Tavily,在模型界面增加Tavily Key字段)、回收站(可删除和恢复AI对话、收藏内容)、深度思考(在使用支持深度思考的模型时,可在对话过程中看到思考过程,并且样式和回答内容要有区别)、流式输出(可能现在已经有了?)、Markdown渲染(可能现在已经有了?)等功能

2、决定先增加联网搜索、回收站、深度思考功能,Cursor规划了7步:实现联网搜索功能(Tavily):添加Tavily Key字段到设置页面和存储、创建Tavily服务,实现联网搜索API调用、在聊天中集成联网搜索功能、实现回收站功能:修改数据库添加is_deleted字段、修改删除逻辑为软删除,创建回收站页面、实现深度思考功能:修改OpenAI服务解析思考内容、修改消息显示组件,区分显示思考过程和回答内容

3、Cursor只用了几分钟就完成了如下修改:

1. 联网搜索功能(Tavily):在设置页面的API配置部分添加了Tavily Key输入字段;创建了TavilyService处理联网搜索API调用;在聊天中集成:配置Tavily Key后,发送消息时会自动进行联网搜索,并将搜索结果作为上下文发送给 AI

2. 回收站功能:数据库更新:为conversations和messages表添加了is_deleted和deleted_at字段;软删除:删除操作改为软删除,数据不会真正删除;回收站页面:在设置页面的“数据管理”部分可进入回收站;可查看已删除的AI对话和收藏内容;可恢复已删除的内容;永久删除(不可恢复)

3. 深度思考功能:OpenAI服务更新:支持解析深度思考模型的thinking字段;消息显示更新:区分显示思考过程和回答内容;思考过程:灰色背景、斜体、带边框,顶部有“思考过程”标签;回答内容:正常样式显示

4、按照目前已有的功能,应该已经可以实现从添加模型到对话到删除的完整流程了,测试一下,先让Cursor解决两个问题,以及一个新需求:

1.在模拟器中打开应用时,对话页面出现了错误提示:LocaleDataException: Locale data has not been initialized, call initializedDataFormatting(<locale>).

2.在填写API Key、Base URL、模型名、Tavily Key后,填写的信息无法保存,退出设置界面后再回来看填写的信息就消失了

3.我需要把数据统计和回收站都放到设置-数据管理里

5、第一个问题,可能是因为中文日期的问题?第二个问题,为所有输入框添加了onEditComplete回调,在失去焦点时自动保存,第三个问题,将数据统计和回收站合并到了“数据管理”卡片中,继续测试,1和3已经解决,二仍然未能保存,决定直接动个大手术,添加多模型管理和切换功能,并在其中增加模型信息保存机制,需求包括:

1.在设置界面增加“模型管理”卡片,将现有的API配置整合到“模型管理”卡片中

2.可以在“模型管理”界面查看我添加的所有模型,可以在这里新建、修改、删除模型,并且可以将我添加的任何一个模型设置为默认模型,在开启新对话时,直接使用默认模型

3.添加和修改模型的界面,需要有取消和确认按钮,点确认按钮确认添加/修改,点取消按钮可取消添加/修改,点击确认或取消后可以返回“模型管理”界面

4.在添加和修改模型的界面,增加“备注”字段,可自行填写,并在对话窗口右上角的模型切换按钮上显示备注名和模型名

5.开启新对话时,直接使用默认模型

6.在对话中允许用户切换模型,模型切换按钮放在对话窗口右上角

6、修改过程中,Cursor将操作分为如下步骤:更新AIModel模型,添加备注字段和默认模型标记;创建模型数据库表和DAO;创建模型管理的Respository和Provider、创建模型管理界面、创建添加/编辑模型界面、修改设置界面,整合API配置到模型管理、修改对话页面,添加模型切换功能、修改聊天provider使用当前模型,大概耗时5分钟

7、在测试之前先记录一个关于Flutter开发的知识点:关于这几天在修改过程中频繁出现的DAO、Repository和Provider。

1.DAO(Data Access Object,数据访问对象)专注于数据存储层的读写,是直接与底层数据源交互的抽象层,封装所有数据访问细节,对外提供统一的GRUD(增删改查)接口,简单说就是DAO只负责“怎么从数据库/网络/本地文件拿数据/存数据”,不关心业务逻辑

2.Repository(业务数据仓库)是“业务层与数据层的中间层”,聚合多个DAO/数据源,封装业务逻辑,为上层(UI/Provider)提供统一的业务数据接口,简单说就是Repository负责“什么时候/从哪里/拿什么数据”,是数据的“调度中心”

3.Provider(状态管理工具)是“UI层与业务层的桥梁”,管理应用的状态(如用户信息、页面数据、加载状态),并将状态分发给UI组件,实现“状态变化——UI自动刷新”,简单说就是Provider负责“管理UI需要的状态,让UI能拿到最新数据”。

4.这几个概念之间的关系是:UI依赖Provider,Provider依赖Repository,Repository依赖DAO,分层设计本质是为了降低耦合,提升代码的可维护性

8、后续再测试今天新增的功能:多模型管理和切换、联网搜索、回收站、深度思考,测试正常后,还需要补充的细节包括流式输出、回答和收藏内容的Markdown渲染、模型测试、消息时间显示等等

DevLog:2025年10月13日

1、在上周给对话界面增加联网搜索开关功能之后,出现了点击发送问题应用便会卡死的问题,且看不到Cursor增加的搜索状态提示,在Cursor中开启新对话,排查一下问题出在哪里

2、Cursor在排查之后指出可能是TavilySearchService在执行网络请求时使用了await MainActor.run,导致网络请求在主线程上等待响应,但网络请求通常需要数秒时间,在主线程上等待会导致UI完全卡死,于是修改了TavilySearchService、AIService和AIViewModel三个文件,再次测试发现问题已经解决,可以看到搜索状态和思考状态提示,思考内容、回答内容、参考链接的展示也都正常,回答结束后状态提示也会消失

3、接下来解决之前用户反馈的其它问题,包括:

1.当前搜索页面缺少返回按钮,实际上搜索功能目前还不全,搜完能看到关键词所在的对话/收藏,但点击不会跳转到对应条目,还得再完善下

2.问题太长时,对话界面上方的标题可能会断行,需要限制一下字数

4、先解决第二个问题,让Cursor限制一下对话界面顶部标题的显示字数,这里涉及到了AIChatView,目前直接显示了完整的用户问题内容,没有长度限制,改成了完整显示前20个字符,之后则用省略号

5、然后完善搜索功能,搜索界面需要增加返回按钮,另外在输入关键词、呈现搜索结果后,点击搜索结果就应该跳转到对应的对话内容所在位置或对应的收藏内容,已要求Cursor修改,包括添加返回按钮、实现搜索结果跳转功能、UI的改进等,但未实际测试

6、还有一些需要优化的地方,比如将系统更新到macOS Tahoe 26.0.1之后,AI对话的提问和回答都没有边框了,可能是因为系统更新之后一些UI有了变化导致的,但不清楚Cursor是否了解最新的开发规范,后面再试