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是否了解最新的开发规范,后面再试

DevLog:2025年10月11日

1、节前发现的遗留问题如下,今天开始逐步修改:

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

2.联网搜索的触发词有点少,比如“今年”就无法触发搜索,需要进一步扩充,或者增加一个联网搜索按钮,点亮后开启联网搜索,或者改一下逻辑,在添加模型时只要填了Tavily Key,就开启联网搜索,并且在选择模型界面显示是否填写了Tavily Key,如果填写了就显示“联网搜索已开启”

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

2、首先修改上面的问题2,决定先用第三种方案,来解决部分AI模型因为训练数据比较老导致回答内容易出现错误的问题,要求Cursor修改一下联网搜索功能的逻辑,不再通过关键词判定是否开启联网搜索,而是在添加模型时只要填了Tavily Key,就会一直开启联网搜索,并且在选择AI模型界面显示“联网搜索已开启”,未填写Tavily Key的AI模型,则显示“联网搜索未开启”

3、但在这次修改后只要点击发送问题应用就会卡死,结合DEBUG信息,Cursor认为这是因为每次发送消息都会进行联网搜索会阻塞主线程,导致应用卡主,并且会消耗大量API配额、增加不必要的延迟,于是又给我改回了之前的方案1

4、可能方案2会比较合适?尝试让Cursor在发送按钮旁边增加一个“联网搜索已开启/已关闭” 的按钮,需要用户手动开启/关闭,默认是关闭状态,不用关键词来判定是否开启联网搜索,但在发送问题后仍然会让应用卡住,Cursor分析表示虽然代码本身是异步的,但可能存在网络请求没有超时控制(Tavily搜索请求可能长时间等待)、缺少用户反馈(用户不知道搜索正在进行)等问题,于是给TavilySearchService添加了超时控制、给AIService添加了搜索状态反馈,改进了AIViewModel和AIChatView的UI状态显示,但依然没有解决问题,甚至现在即使不打开联网搜索开关,点击发送按钮时应用也会卡死,而且也没有看到Cursor给AIService添加的调试信息

5、近期Cursor频繁更新,先更新一下再重新开启对话来修正这个问题,另外在将电脑系统更新到最新的macOS  Tahoe 26之后,由于整个系统的界面都有变化,ChatWith的一些UI也发生了变化,比如对话界面有些消息的边框看不到了,输入框的边框也看不到了,后面也需要调整下

DevLog:2025年9月30日

1、首先跟Cursor明确了模型切换界面AIModelSelectorView底部的确认和取消按钮的功能,切换模型时,点“确认”确认我对模型的切换,点“取消”则不切换模型,仍然保持打开模型切换界面前的选择,为实现这一功能,Cursor在这个文件里增加了临时选择机制,界面会高亮显示临时选择的模型,只有点确认时才会更新模型选择并关闭界面,在打开界面时,临时选择状态会设置为当前已选择的模型

2、昨天发现Xcode更新了,并且支持了Coding Intelligence功能,可以使用内建的Claude in Xcode(需要登录Claude账号),也可以自己添加模型或调用本地模型,还没有测试,感觉这个功能可能会和Cursor之类的AI IDE比较像,当然了更专注于苹果的应用

3、接下来可以试试用Icon Composer或者Asset Catalog给ChatWith for Mac创建一套图标

4、遗留问题如下,节后再修改:

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

2.联网搜索的触发词有点少,比如“今年”就无法触发搜索,需要进一步扩充,或者增加一个联网搜索按钮,点亮后开启联网搜索,或者改一下逻辑,在添加模型时只要填了Tavily Key,就开启联网搜索,并且在选择模型界面显示是否填写了Tavily Key,如果填写了就显示“联网搜索已开启”

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

DevLog:2025年9月26日

1、询问Cursor如何将当前的应用打包,没想到Cursor竟然直接用Archive命令给我完成了打包,并且创建了ExportOptions.plist配置文件,并使用macOS Developer证书签名,生成了通用的双架构二进制文件,并输出为.app应用程序包,放到了ChatWith_Distribution文件夹下,另有一个名为ChatWith_v1.0_macOS的分发包,应用大小3.5MB(毕竟应用的功能还很简单)

2、找到了第一个用户,直接发了分发包,解压放到Mac的“应用程序”文件夹,但打开时会提示:Apple无法验证ChatWith是否包含可能危害Mac安全或泄露隐私的恶意软件,需要在设置中允许一下,可能是没有签名吧,这个以后再说

3、发现了如下bug:

1.对话界面切换模型按钮无法直达添加模型界面,新用户首次打开应用可能会有点困惑

2.联网搜索的触发词有点少,比如“今年”就无法触发搜索,需要进一步扩充,或者增加一个联网搜索按钮,点亮后开启联网搜索,或者改一下逻辑,在添加模型时只要填了Tavily Key,就开启联网搜索,并且在选择模型界面显示是否填写了Tavily Key,如果填写了就显示联网搜索已开启

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

DevLog:2025年9月17日

1、昨天已经基本实现了模型添加、AI对话的基础功能,今天继续完善,首先是添加多个模型并在对话时切换模型,首先在添加两个模型之后,发现设置-可用模型的模型列表里,两个模型之间有两条分割线,而且创建新模型时,无法保存我填写的新API密钥和基础URL,而是沿用了我添加的第一个模型的API密钥和基础URL

2、首先更新了AIModel结构体,添加了apiKey和baseURL字段,移除了isDefault字段,修复了ModelEditView的保存逻辑,更新了模型测试逻辑和对话配置逻辑,使用模型自己的API配置进行对话,而不是使用全局的API配置(早就应该这样了),然后移除了modelRow函数中的Divider():,去掉了多余的分割线,再次测试,两个问题成功解决

3、但AI对话窗口里又出现了回答在上、问题在下的情况,另外切换模型的弹窗显示也有问题,先修复切换模型的弹窗的显示效果,同时修复一下AI对话列表的选中状态,目前根本看不出来选中了哪个对话,修改后仍然不能在对话列表中标示出当前选中的对话,还需要再修改

4、先用硅基流动的DeepSeek R1 API测试了一个需要联网获取最新信息的问题,发现目前思考过程没有展示、AI回答内容没有经Markdown渲染、看不到Tavily提供的资料链接,决定让Cursor同时修复这些问题,并明确要求使用MarkdownUI来进行Markdown渲染,其实之前已经有了一部分支持这些功能的代码,但功能不完整,Cursor列出了Todo,一步步修改,稍后一并给Cursor反馈问题

5、Cursor一次修改了思考过程展示/折叠和展开、Markdown渲染、Tavily资料链接显示等功能,其中在Markdown渲染上,先创建了一个新的文件MarkdownView,但没有添加到项目里,提示构建失败,于是又重新启用现有的MarkdownRenderer,并且引入了MarkdownUI,同时还保留了自定义AttributedString实现作为备选方案,原因貌似是MarkdownUI只支持14.0以上的macOS,我觉得没有必要保留备选方案,之前修改NoteWith时已经验证了MarkdownUI的渲染效果,于是要求Cursor去掉了自定义实现相关代码,使用MarkdownUI作为唯一的渲染方案,MarkdownRenderer代码更加简洁了

6、接下来测试一下思考过程、Markdown渲染、Tavily链接的显示效果,先把AI对话内容的显示顺序搞定,然后处理了一下点击AI对话右上角无法切换模型的问题(原因是ChatView的模型选择回调中代码被注释掉了,没有实际实现模型切换功能,而且每个对话都显示第一个可用模型,而不是用户选择的模型,模型切换没有保存到对话中,我需要为每个对话独立保存选择的模型),Cursor自称目前已经实现如下目标:新对话默认使用第一个可用模型、点击右上角的模型名称选择其它模型、选择的模型立即保存到该对话中、每个对话都有自己独立的模型选择、重启应用后每个对话仍然使用之前选择的模型

7、模型可以正常切换了,但试了几个问题,发现无法触发应用通过Tavily获取最新信息,Cursor分析发现虽然Tavily密钥已经存储在模型中,但实际的消息发送逻辑中没有使用Tavily服务,需要实现Tavily集成,创建了一个新的Tavily服务类TavilyService,并修改了OpenAIService,表示当提问时应用会自动通过Tavily获取最新信息

8、测试发现即使是不支持深度思考的模型,回答内容里也会出现思考过程区域,而且回答内容没有经过Markdown渲染,也看不到Tavily的资料链接,在用MarkdownUI来实现Markdown渲染效果的过程中,Cursor多次创建和删除Package文件(因为一直没有真正引入MarkdownUI),多次用命令行修改MarkdownRenderer,多次尝试不使用MarkdownUI,而是换用SwiftUI的原生功能来实现基本的Markdown渲染,不知道为啥今天反复出现这种“退步”的操作,我多次打断,反复强调要用MarkdownUI来渲染

9、已经有部分文字可以呈现渲染后的效果,但表格还是无法正常显示,参考NoteWith,可能要对表格和代码块的显示进行单独的优化,猜测上面重复同样的操作可能是因为这个对话的上下文太长了导致的,后面在Cursor里开一个新对话再修改这些内容

10、又遇到了刚刚进行的问答没有被保存到对话里的问题,在修改ChatWith,将用户消息和AI消息更新后都调用onUpdate将其保存到Core Data后,问题解决

11、在修改MarkdownRenderer以支持对表格和代码块的渲染优化时,Cursor反复检查MarkdownUI的版本、添加MarkdownUI默认的表格和代码块渲染样式、添加自定义的表格和代码块渲染样式,然后删除这些内容,多次操作后相当于没有做任何的修改

12、决定试试让Cursor创建单独的文件来处理表格和代码块的渲染,并且使用MarkdownUI,Cursor创建了TableRenderer和CodeBlockRenderer,并将新文件添加到项目,但多次尝试后,即使已经将这两个新文件集成到AssistantMessageView之后,仍然未能实现对表格的正常渲染

13、由于目前的ChatWith是由iOS应用修改而来,且在修改过程中对代码和架构进行了大量的调整,怀疑目前有部分文件功能是重复的,让Cursor列举结构和分工后发现ChatWrapper是多余的、ChatView过于庞大、且组件职责不清晰,比如ChatMessageListSection和ChatMessageListView功能重复、ChatInputSection和ChatInputView功能重复,Cursor建议简化架构、删除冗余文件、重新组织文件结构,决定让Cursor实施这些优化

14、修改完成后架构更清晰(每个文件职责单一,易于维护,减少了不必要的中间层),代码更简洁(ChatView从436行减少到约280行,移除了重复的组件子定义),维护性更好(组件独立,便于单独测试和修改,文件结构更符合SwiftUI最佳实践),当然每次Cursor在修改完后都会这么说,还是要实际测试一下修改成果

15、继续测试具体的功能,首先发现在与支持深度思考的DeepSeek R1模型对话时,思考内容和回答内容混在了一起,未能像之前规划的那样分成两块,并且思考内容要可以折叠,可以展开,Cursor在分析后修改了OpenAIService中的seperateThinkAndAnswer函数,以正确解析思考内容,但仍然没有解决问题

16、我现在觉得可能将iOS版的ChatWith修改成Mac版,再逐个测试、恢复功能,可能是做了大量的重复工作,既然之前NoteWith for Mac已经基本可用了,那其实可以对它进行简化,实现我对ChatWith for Mac的一系列需求,于是复制了一份NoteWith for Mac的源文件,并要求Cursor将应用的名字改成ChatWith,这一过程包括将应用名称由NoteWith改为ChatWith、更新XCode项目文件中的名称引用、更新Swift文件中的名称引用、更新Info.plist文件、重命名相关文件夹和文件等

17、Cursor很快完成了修改,并且按照我的反馈替换掉了一些漏网之鱼,接下来就是去掉待办事项模块、测试功能了,后面可能还要把备忘录替换为收藏,去掉待办事项模块及相关功能包括了分析待办事项模块的组件和依赖、移除待办事项相关的数据模型、移除待办事项相关的视图、移除待办事项相关的视图模型、从DataManager中移除待办事项相关代码、从导航中移除待办事项相关项目、从项目文件中移除待办事项相关文件等步骤,并且根据我的反馈删掉了两处遗留的待办事项相关功能

18、构建成功后,整理了文件结构,特别是Views文件夹下既有AIChat和Notes两个文件夹来存放AI对话和备忘录相关的视图文件,又有大量视图文件散落在Views文件夹下,ViewModels文件夹也有类似问题,移动文件并更新project.pbxproj中的路径后,问题解决,结构清晰了一些

DevLog:2025年9月16日

1、今天首先解决昨天的遗留问题,统一一下应用的布局,改成三栏布局,最左边是应用的名字,以及对话、收藏、设置 三个按钮,中间栏是对话列表、收藏列表和设置大项,第三栏是对应的详情,Cursor延续了昨天的NavigationSplitView,并且创建了AppSidebar和MiddleSideBar组件(都在ContentView里,后面可能也要拆分这个文件了),然后修改了多个文件来匹配三栏布局

2、最左侧导航栏的颜色、图标、文字大小等样式都还可以,但目前对话界面缺少了创建对话按钮,设置界面的详情显示也都比较局促,需要继续调整布局和功能,比如:

1.模型设置界面需要有多模型管理功能,可以添加、删除、测试模型,并且增加Tavily联网搜索能力的支持,Base URL需要具备自动补全能力

2.增加回收站功能,可以管理已删除的对话和收藏,并且按钮放在数据统计和外观设置之间

3.外观设置的样式也需要改一下,现在这种横向三个按钮切换显得很局促

3、接下来一步步修改,先从模型的添加、修改、删除、测试功能开始,第一次修改后效果不佳,我发现DetailView好像包含了对话、收藏、设置三个模块的最右侧区域,于是让Cursor将其拆分为单独的文件,ConversationDetailView、FavoriteDetailView、SettingsDetailView,拆分后DetailView由596行代码缩减成了42行,并且新创建的三个文件每个文件都专注于特定功能,代码结构清晰了一些

4、现在添加模型的弹窗显示不正常,可填写信息的窗口只有很小一块,存在大片空白,无法正常使用,让Cursor修复,同时删除可用模型列表顶部的API配置按钮,我不需要在列表里配置API Key和BASE URL

5、然后调整弹窗的功能,包括给弹窗增加Tavily密钥字段,放在API配置的最后,弹窗底部增加取消和保存两个按钮,去掉“默认模型”相关的设置等等,现在弹窗信息可以完整显示,并且效果还可以,然后删除了部分按钮的边框线,去掉了“默认”标识,但Cursor标识在删除当前使用的模型时会自动切换到第一个可用的模型,看样子还是有类似默认模型、当前模型的设置,还是要清理掉

6、开始添加模型,测试后决定,删掉应用预置的默认模型配置,所有的模型都由用户来自行设置,另外在点击测试时,无需通过弹窗提示测试结果,直接在列表里模型名称的下方显示测试结果,比如错误信息、响应时间等,然后修正部分问题,比如在添加模型后重启应用模型信息会消失,创建新模型时可以看到之前填写的API KEY和Base URL

7、发现SettingsView里目前还有一些AI模型相关设置,但刚刚这些修改都不涉及SettingsView,怀疑可能有部分代码未被使用,询问后发现整个文件都未被使用,并且SidebarView里也有部分过时代码,一并进行了清理

7、看起来暂时没有引发新的问题,目前已经添加了第一个模型,继续测试AI对话功能,首先就是对话界面缺少了创建新对话按钮,把这个按钮加在对话界面右上角,测试发现即使是经过测试提示连接成功的模型,也无法正常对话,Cursor表示目前没有实现真正的模型测试功能,没有真正调用API,怪不得每次测试连接时间都是1.2s,并且ChatView使用的是全局的AppStorage值,而不是用户选择的模型配置,在修改过程中Cursor添加了一些调试信息,发现可能是因为currentModelID为空字符串,导致无法找到匹配的模型,系统回退到默认配置gpt-3.5-turbo,而不是我自己配置的模型

8、这就是上面说的“当前模型”的设置,要求Cursor去掉这个增加了应用复杂性的功能,在开启对话时,直接用可用模型列表里的第一个模型

9、测试了几次对话,但发送消息后会报错400,结合Cursor添加的调试信息,多次反馈后定位了问题,然后修正了AI对话内容无法保存的问题,可能是未能将新对话和更新的对话保存到Core Data,至此已经基本实现了添加模型、AI对话的基础操作

10、修改了AI对话消息的显示顺序,改成问题在上、回答在下,明天再继续完善功能,比如添加多个模型、测试模型的切换效果,完善AI对话列表的选中状态提示、更新时间、置顶/取消置顶等右键菜单操作

DevLog:2025年8月18日

1、截至目前已经用Cursor编辑了63939行代码,今天继续让Cursor恢复各个模块的功能,并优化应用界面和交互,整体原则就是优先用已有的代码
2、首先是AI对话相关功能,从添加模型开始,添加模型功能目前不能正常使用,填写所有信息并点击添加后,没有保存到模型列表里,且添加模型界面需要增加一个备注字段,优先用已有的代码来实现此功能
3、在可以保存模型之后,发现只能删除,不能编辑模型,且API Key、Tavily Key都是以明文显示,也不安全,点击AI对话右上角的模型切换按钮,也看不到目前已有的模型,继续让Cursor修正
4、一直以来都是使用Cursor的Auto模式,但今天第一次见到它出现了思考过程,今天这是在调用什么支持深度思考的模型了吗?
5、继续调整模型添加和选择相关功能,比如把备注字段放在添加和编辑模型界面的最上面,对话界面右上角也显示备注字段,显示选择状态等等
6、AI模型的添加、编辑、切换基本搞定,接下来测试对话过程,首先遇到的问题是:已经填写了AI模型的信息,但提问后反馈“错误,未找到指定的AI模型”,在修改过程中发现目前存在aiModels和aiConfigs两种模型数据混用的情况,于是让Cursor检查有无其它功能仍在混用,Cursor检查后建议完全迁移到aiConfigs,因为它功能更完整,且不需要Core Data的复杂性,已经实现了完整的GRUD操作
7、有点疑惑UserDefaults和Core Data两种数据存储方式竟然可以混用?询问Cursor目前哪些地方用了UserDefaults,哪些地方用了Core Data,Cursor在梳理后表示现在的确是“分层混用”的状态,Core Data管理业务数据(笔记、会话、消息),UserDefaults管理轻量设置(外观、Tavily Key)以及AI模型配置aiConfigs,技术上是合理的,决定暂时保持目前的混用状态
8、继续测试AI对话相关功能,发现无论我问哪个模型,都会收到“这是一个模拟的AI问答。您的问题是:你好”的回答;对话内容没能保存到对话列表里;即使模型不支持深度思考,也会显示思考过程,看一下是怎么回事,并且尽量使用已有的文件和代码来解决问题
9、再次测试时发现无论使用哪个模型都会收到模拟的回答,而不是真实的AI的回答,并且AI问答列表显示的内容也有问题,继续让Cursor修正,Cursor表示是为了先确保实现其它功能,避免因误调用产生费用,而且即使真实调用失败时界面也能正常流转,但我不需要这种所谓的兜底方案,于是直接让Cursor真实调用AI模型,不需要模拟回答
10、然后又遇到了“网络连接错误”的提示,怀疑可能是Base URL的问题,询问Cursor之后,决定让应用自动补全/chat/completions,并且在AI模型添加/编辑界面增加说明文字,防止用户填错,Cursor添加了智能URL自动补全机制,如果用户只输入了基础地址(如 api.openai.com),会自动添加 https:// 和 /v1/chat/completions,如果用户已经包含了部分路径,会智能补全,从而避免重复添加路径导致的双重拼接问题,测试发现只需要填写最简单的网址就可以,比如https://api.deepseek.com、https://openrouter.ai/api
11、然后我发现无论模型是否支持深度思考,在回答时都会显示思考过程区域,如果模型不支持深度思考,就看不到完整的回答内容,让Cursor增加了自动判断模型是否支持深度思考的机制,修改过程中Cursor在AI模型设置中增加了深度思考开关,将决定权交给用户,我觉得还是自动判断更方便,于是改成了自动判断是否支持深度思考的方式
12、现在可以正常判断出deepseek r1支持深度思考了,思考过程可以展开/折叠,但即使展开也看不到思考过程的详细内容,在回答过程中,界面无法随着回答内容自动向下滚动,且看不到完整的回答内容,Cursor在修改过程中改进思考过程内容、改进自动滚动逻辑、改进内容更新机制,在测试过程中发现之前的MarkdownRenderer和CodeBlock相关功能还都有效,太棒了!
13、我之前有要求Cursor在AI对话页的每条消息下面添加三个按钮,收藏、复制、删除,不知道现在还有没有相关代码,没有的话就重新添加三个按钮和对应的功能,针对这一需求,修改后竟然给思考过程和回答内容增加了不同的背景色,但思考过程应该在回答内容上方,继续调整
14、调整完这些之后,AI对话界面的问题和回答都统一居左了,让Cursor调整了下,问题在左边,思考和回答在右边,然后点击收藏消息时,不要滚动到底部,保持在当前的浏览位置就行
15、接下来测试Tavily相关功能是否正常,询问deepseek r1一个需要搜索最新信息的问题,同步测试下深度思考是否正常,能否看到搜索链接,能否点击打开对应页面,能否收藏等功能,发现1.深度思考可以按句流式输出,但看不到完整的思考内容,只能看到最后两行 2.目前项目文件里已有Tavily相关文件和代码,回答内容的下方需要展示Tavily参考的链接,并且可以点击打开链接,看看现有的文件是否支持该功能 3.回答内容中包含网址时,其中的“.”会显示为“。” 4.点击收藏按钮,虽然提示收藏成功,但没有出现在备忘录列表里,四个问题全部反馈给Cursor修改
16、今日遗留问题:1.AI回答内容里的“.”都显示成了“。”,网址和代码都受此影响;2.思考内容虽然支持流式输出,但始终只能看到两行,看不到全部思考内容;3.提出问题后,只有主动滑动一下才能看到底部的“AI正在思考中”的提示
17、Cursor已经开始建议我“Start a new chat for better results”,难道是这个对话里内容太多了?明天重新开启一个对话之后再修正这三个遗留问题,然后测试其它功能

DevLog:2025年8月17日

1、今天重点优化备忘录相关功能,首先我发现备忘录列表里显示的备忘录内容不会随修改更新,比如备忘录里明明有文字,列表里却显示“空内容”,另外需要把备忘录标题下面的“文本编辑器”和右侧的字数统计去掉,因为界面右下角已经有字数统计了
2、修正这一问题后,发现又看不到支持深度思考的模型的思考过程了,并且在AI回答时,界面也不会自动向下滚动,可能是昨天将MessageView从AIChatView中拆分出来之后又有部分功能丢失了?先把这部分功能加回来,然后优化一下输出时的卡顿问题
3、继续优化备忘录,测试时发现了“列表顺序会随着点击发生变化,而不是只有修改内容时才会变化”和“光标自动跳转到结尾”的问题,在修改过程中,我发现虽然目前用的TextEditor是纯文本编辑器,但当前仍然有用到NSAttributedString来进行富文本处理,其实现在不需要处理富文本了,于是让Cursor去掉了富文本相关的代码
4、发现部分备忘录内容可以正常显示,部分不能,Cursor排查后发现Note模型有两个内容字段,一是markdownContent的纯文本内容,二是attrbutedContent的富文本内容,Cursor修改后改为二者均可正常显示,且优先使用前者,如果前者为空则使用后者
5、在修正备忘录问题的过程中,让Cursor去掉了知识库相关功能,暂时没有想好知识库该怎么用,而且知识库目前的存储也是以备忘录的形式存储的,和备忘录有些重合,先优化备忘录模块,后面再考虑更加其它功能吧
6、然后又修正了AI对话删除之后同时存在于列表和回收站的问题,修正了AI对话右上角无法切换模型的问题,奇怪的是之前我明明记得有一个AIModelSelectorView文件,啥时候消失了?
7、在让Cursor美化AIModelSelectorView时,美化有些过度了,并且再次出现了macOS不支持的SystemGray颜色,仍然时从iOS迁移至macOS的后遗症
8、结合当前应用的功能,让Cursor更新README,同时更新了应用的版本号为0.1,涉及info.plist和project.pbxproj两个文件
9、还在纠结数据的存储方式,因为UserDefaults主要用于存储一些配置相关的数据,在存储大小、性能、数据完整性、扩展性上均有限制,Cursor建议在数据量增长后迁移到Core Data或SQLite,比如数据大小超过5MB时,但因为对话内容中有大量的Markdown渲染,还有备忘录功能,数据可能很快就超过5MB了
10、决定先把目前的0.1备份一下,然后把数据存储机制改成Core Data,并且不需要迁移已有数据
11、Cursor表示要完成这一迁移,需要如下步骤 1.首先创建Core Data模型文件 2.创建Core Data管理器 3.更新数据模型以使用Core Data 4.更新DataManager以使用Core Data 5.更新相关的ViewModels,接下来当然又是修改项目文件、修复编译错误的漫长过程,待完成后再挨个测试功能
12、在修复编译错误的过程中,Cursor为了能更快解决编译错误竟然删除了五个视图文件,我拒绝,让它重新创建这五个文件,然后修正错误,因为担心后面还会再删除其它文件导致应用功能大量缺失
13、累计修复了:类型定义问题、可选值处理、方法签名修复、ScrollViewReader问题、Core Data关系处理、视图组件修复,以及几处警告,终于可以成功构建了
14、接下来测试功能,一打开App天都塌了,缺失了大量功能,接下来逐个修复,
1.备忘录界面没有创建备忘录的按钮 2.去掉预置模型中的所有模型,让用户自己添加,并且在添加模型界面增加Tavily密钥字段 3.AI模型管理界面无法关闭或返回 4.整体布局也很奇怪
15、Cursor还是将应用改成了三栏式布局,之后恢复设置功能,其中包含统一管理模型、数据统计、切换深色浅色模式、管理回收站等功能,并且提出优先让Cursor使用已有的文件和代码
16、然后调整了关于、模型管理功能(既然已经没有预置模型,那就不再需要每次打开应用时都删除了)、调整搜索功能(在导航栏里添加搜索按钮,点击弹出搜索弹窗,去掉备忘录界面的搜索按钮),仍然要求优先用已有的代码,目前已经恢复了应用的布局,今后再恢复各个功能

DevLog:2025年8月11日

1、今天先试一下上周五新增的Tavily联网搜索功能是否可用,但在Xcode模拟器中打开应用发现,添加Tavily API字段之后原本保存的模型都被删掉了,先添加一个deepseek v3试试,果然可以在AI回答内容中融合最新信息,并且会标注信息的来源(以“来源1、来源2、来源3”的文字形式),我需要增加参考的搜索结果数量至5条,并且在回答内容中带上链接,点击可以直接跳转到来源链接,然后结合Cursor的建议添加更多的搜索触发词,毕竟现在已经很少会完全让AI基于训练数据回答了
2、Cursor大幅扩展了搜索触发词列表,可以通过更多自然语言触发搜索,并且支持调用Tavily API获取5条搜索结果,在AI回答下方显示参考链接区域,点击链接可以直接跳转到浏览器,甚至还设计了卡片和蓝色主题?同时还有一些性能优化,比如链接信息轻量化存储、异步处理避免阻塞主线程等等,实测并没有出现“参考链接”区域,链接也无法点击、跳转,只能看到网址,而且Xcode中还有一些警告信息,截图反馈给Cursor调整
3、在修改过程中,同步让Cursor修改了对话页面的收藏逻辑,去掉消息右侧的收藏按钮,改为长按消息弹出菜单,菜单中包含收藏、复制、删除,目前已经可以看到AI回答内容底部的“参考链接”区域,且链接可以点击跳转至浏览器打开
4、测试发现复制和收藏功能已经实现,但“删除”功能好像不管用,让Cursor修复,然后优化了“选择模型”界面(ModelSelectorView)的视觉效果,采用和“AI模型管理”界面(AIModelManagementView)一致的视觉效果
5、发现在AI模型管理界面,AI模型列表上方有大片的空白,Cursor认为是因为AIModelManagementView使用了NavigationView包装整个界面,这回自动添加导航栏的空白区域,修复之后选择模型界面和AI模型管理界面样式已经一致

DevLog:2025年8月8日

1、NoteWith默认模型的切换还是存在问题,正确的逻辑应该是:我将模型B设置为默认模型时,模型A自动取消默认模型状态,反之亦然,但现在我将模型B设置为默认模型时,模型A仍然还是默认模型;并且我将模型B设置为默认模型时,新建AI对话后自动使用模型B,多次修改后无果,决定先简化一下模型的选择和切换逻辑
2、简化内容包括:去掉“默认模型”和“当前模型”相关设置,在模型设置中不需要这两个功能,也不需要设置这两种状态,在创建新对话时,直接用AI模型列表里的第一个就行
3、测试发现Cursor直接把AI对话界面右上角的模型切换功能也给去掉了,还得加回来,在加回这个功能的过程中,我询问Cursor“你看下是否需要单独的视图文件来管理这个功能”,Cursor的确创建了一个单独的ModelSelectorView文件,但在将这个文件添加到项目文件的过程中,Cursor又突然说项目文件被损坏了,并且决定不创建单独文件,改为在AIChatView中直接内联定义ModelSelectorView,并且又恢复了昨天备份的一版项目文件,再次更新引用,感觉有点绕圈了,为什么之前可以直接修改项目文件,现在不行了呢?而且它这样恢复备份之后,我还得关掉Xcode,重新打开项目所在文件夹,好在测试后实现了我的需求
4、模型管理相关功能已经基本OK了,接下来就是思考内容的流式输出,在ChatWith上花了很多时间想完善这个功能,但一直没能达成,先跟Cursor明确下需求,针对支持深度思考的大模型,目前的应用是否会对思考内容进行流式输出?我需要看到支持深度思考的模型的思考过程,先流式输出思考内容,再流式输出回答内容,且思考内容和回答内容在样式上要有所区别,思考内容要支持折叠和展开
5、Cursor表示目前已经有部分功能支持了 ,但需要完善流式输出逻辑,更好地处理思考内容和回答内容的分离,并且优化UI交互(思考内容的折叠和展开),修改完成后测试,发现即使用的是DeepSeek-R1(深度求索官方的API)也不会出现思考过程,另外还有两个影响使用的问题1.在同一个对话里多次对话后,AI的输出就会变得特别卡,我再提出新问题时也会变卡 2.目前的markdown渲染也不是很完善,比如回答内容里有python代码时就无法正常渲染,可以看下截图,是不是还要再完善下MarkdownRenderer
6、Cursor认为可能是历史消息过多导致内存占用过大、每次发送消息时都加载全部历史记录、流式输出时的状态更新过于频繁,优化了AIViewModel、AIService中的历史消息处理,之后完善MarkdownRenderer,以支持代码块、语法高亮和图表,修改完成后连续回答多个问题之后应用还是会卡顿,对代码块的渲染效果也不是很好,另外还发现,在切换一个对话的模型之后,其它对话的模型也都会随之切换,我需要在每个对话中保存对模型的选择,比如在对话1中选择模型A,对话2中可以选择模型B,对话3中选择模型C,应该互不影响
7、Cursor认为卡顿是因为每次流式更新时都在主线程更新UI,并且频繁的状态更新导致界面卡顿,继续优化了AIViewModel中的流式更新逻辑,关于模型的选择,需要在每个对话中独立保存模型选择,修改之后前者略有改善,后者已经搞定
8、继续优化一下模型选择器的触控区域:点击AI对话界面右上角选择模型时,选择模型时,需要加大触控选取的范围,我需要点击整行时都可以选择对应的模型,现在只有点击文字区域时才会选择对应的模型,Cursor修改成了整个模型行都是可点击区域,并且认为这更符合iOS用户习惯
9、昨晚GPT-5刚发布,今天早上打开Cursor就提示已支持,并且可以免费使用,但我没有试用
10、突发奇想,问Cursor能否通过Tavily实现联网搜索,竟然可以,快速创建了一个Tavily搜索服务TavilySearchService,并且在AIConfig中添加Tavily API密钥配置,修改AIService集成Tavily搜索功能,Cursor表示需要在对话过程中输入搜索、查找、最新、新闻、今天、现在、实时、当前、最新消息、最近、近期等关键词才能触发联网搜索,并且会将搜索结果作为上下文提供给AI,但目前会自动获取前3个最相关结果
11、以后再测试集成Tavily搜索的效果如何,再看看要不要增加搜索结果数量,要不要调整填写Tavily API的位置等等
12、发现这两天Cursor明显变慢了,经常在修改过程中等待很长时间