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月5日

1、继续测试和优化体验,前两天盘了下各个API平台的余额,发现百度云千帆和硅基流动上还各有五六十块钱,先用硅基流动的API来测试NoteWith的AI对话功能了
2、首先就是在添加模型时,硅基流动官方文档里提到base url是https://api.siliconflow.cn/v1,但我直接填写这个url之后,在测试时仍然提示404错误,去掉后面的v1就好了,可能是因为之前我让Cursor添加了base url自动补全功能,所以现在只需要填写AI服务的根地址就行了
3、然后是在AI对话中切换模型时,选择AI模型的界面,每个模型都显示了模型的名称和“自定义模型”两行文字,我不需要“自定义模型”,我需要在这个页面看到每个模型的备注和模型名称两个字段的信息,Cursor删除了AIModelSelectorView中“硬编码”的“自定义模型”文字,并且完成了修改
4、接下来优化一下流式输出,发现AI回答内容像是在一段一段地输出,并且在AI回答内容输出之前就会有一条白色的区域,然后“AI正在思考中”前面的加载图标也比较大
5、Cursor表示目前的流式输出回答内容的分块是160字符,减少到了50字符,同时将思考过程的分块从80字符减少到了40字符,输出间隔时间也有缩减,至于在AI回答内容输出之前的白色区域,通过修改MessageView,只有当消息内容不为空时才显示消息内容区域,只有消息有内容时才会显示操作按钮(收藏、复制、删除),避免了空消息占位符显示白色背景区域的问题,然后缩小了“AI正在思考中”前面的加载图标
6、流式输出回答内容的分块还是有点大,还可以再缩小一些,另外由于目前AI回答中的文本内容渲染采用了NSTextView,虽然可以看到渲染后的结果,但语法标记所占的位置都显示成了空格,效果不是很好,这样做的原因是之前想要复制部分回答内容
7、尝试继续完善文本的渲染效果,将语法标记完全移除而不是设置为透明,这次竟然真的搞定了!真是万万没想到
8、然后调整下AI对话的标题,之前已经修改了AIChatView,目前它只负责AI对话详情页,也就是AI对话模块的第三栏,这页左上角的标题目前固定显示为“AI对话”,决定将其改为显示当前AI对话的标题,如果我没有打开任何对话,则显示为“AI对话”,如果我打开了某个对话,就显示当前对话的标题
9、发现AI对话内容(无论是提问还是回答)的底部都有一小条空白,Cursor表示这是因为消息容器的边距和内容区域的边距叠加导致的,稍微缩减了一下,目前显示效果还行
10、在测试时我发现调试信息里很早就已经出现了API返回的回答内容,但迟迟不见AI对话界面显示回答内容,猜测可能是API返回回答内容之后,先用MarkdownWithCodeBlocksView完成渲染,再流式输出到AI对话界面,实际上是API返回完整回答(AIService),然后分块流式输出(AIViewModel),再实时渲染(MessageView+MarkdownWithCodeBlocksView)
11、这不是真正的流式API,而是完整回答后模拟流式输出,由于这种方式每次内容更新都会重新渲染整个Markdown内容,可能会在长回答时造成性能开销,导致渲染闪烁(特别是复杂格式),Cursor建议使用真正的流式API,实现增量渲染(只渲染新增部分),并且缓存已渲染的组件,避免重复解析

打工人接入DeepSeek-R1 API不完全指南

这段时间DeepSeek爆火,工作中使用DeepSeek-R1的频率也越来越高,但DeepSeek官方的服务经常会出现服务器繁忙问题,基本无法正常使用,相信大家也经常遇到。解决办法有两个,一是使用已经接入了DeepSeek-R1的其它AI App,比如腾讯元宝、百度App、纳米AI搜索、Monica、Poe等等,二是使用云服务厂商或者硅基流动这种MaaS提供商都提供的DeepSeek-R1的API。这篇笔记结合这段时间的使用经历,给大家盘点一下哪家的客户端和API更好用。

说明一下,申请API,和在客户端中接入API都需要一点点动手能力,如果懒得搞,可以用去用上文提到的那些App。但对于工作场景来说,我还是更推荐去申请、接入API,更利于专注工作,不被各家厂商各种形式的广告或引流手段干扰。而且这不仅仅是DeepSeek官方服务不稳定时的一个过渡手段,更能给后续使用其它API积累一些经验。

1、怎样申请API

去DeepSeek开放平台、硅基流动或火山引擎官网注册账号、实名认证、选择模型、获取并复制API Key,不同平台在操作上略有区别。

2、用哪个客户端接入API

这里我主要推荐两款App,Chatbox和Cherry Studio,需要注意的是这段时间两款App更新非常频繁,如下内容仅说明了我在写这篇笔记时使用的版本功能。

Chatbox(Mac端版本号1.10.4,安卓端版本号1.9.8)

优势:

电脑端和手机端都有App;

接入API非常简单,预置了一些常用的AI服务,只需填写API Key就能使用;

预置了一些“搭档”可以添加使用,可以分别调用不同的模型;

支持联网搜索,会给出所有的参考链接,并且免费,点亮工具栏的地球就可以了。

不足:

不同模型的切换略显复杂;

思考过程的展现和对话内容的输出会卡顿,一段一段的蹦出来,不够流畅;

界面设计较为粗糙,或者说复古;

对话记录和模型设置无法做到多端同步(没有账号系统,希望后续能够上线)。

Cherry Studio(Mac端版本号1.0.4,安卓端无)

优势:

接入API非常简单,预置了比Chatbox更多的常用的AI服务,特别是大量国内的大模型,只需填写API Key就能使用;

支持自行设置助手,分别调用不同的模型;

预置了一些“智能体”可以添加使用,可以分别调用不同的模型;

不同模型的切换非常简单;

思考过程的展现和对话内容的输出都非常流畅;

以小程序(或者说网页)的形式提供了40余个大模型,点击并登录就能使用;

界面美观,设计比较现代;

支持翻译、生成图片等等办公中常用的功能;

最新版本可通过申请tavily的API实现全部模型联网搜索,会给出所有的参考链接,每月可以免费使用1000次,解决了下文会说到的部分API无法联网获取最新信息的问题,默认会提供5个搜索结果,可调整至最多20个,并且可以设置搜索结果黑名单,屏蔽来自部分网站的搜索结果。

不足:

暂无手机端App,仅有电脑端App;

对话记录和模型设置无法做到多端同步(没有账号系统,希望后续能够上线);

支持知识库功能的模型非常有限,我接入了DeepSeek官方、硅基流动、火山方舟三家的多个模型,其中仅有硅基流动提供的BAAI/bge-m3向量模型支持知识库。

3、哪家的API好用?

DeepSeek官方提供的API:

服务不稳定,经常遇到因繁忙不响应的情况,且API本身不支持联网搜索最新信息,时不时的就用英文回答我,像极了GPT-4刚上线那段时间。

硅基流动提供的API:

服务稳定性居中,偶尔会不响应,或者响应速度比较慢,且API本身不支持联网搜索最新信息,也会时不时的就用英文回答我。

不知道大家有没有遇到这个问题,硅基流动的API貌似需要先充值(充几块钱就行)才能使用,如果不充值会提示连接失败,充值之后立刻就能正常使用。

火山引擎提供的API:

服务稳定,响应速度快,在我使用的这段时间基本没有遇到不响应的情况,且API本身就已支持联网搜索最新信息(唯一的不足是看不到具体参考了哪些链接)。

综上,目前看来最稳定、功能最完整的API,是火山方舟提供的deepseek-r1 。

3、哪家的API更便宜?

DeepSeek官方API价格(deepseek-reasoner):

百万tokens输入(缓存命中)1元,百万tokens输入(缓存未命中)4元,百万tokens输出16元。

硅基流动API价格(Pro/deepseek-ai/DeepSeek-R1):

百万tokens输入4元,百万tokens输出16元,目前赠送14元。

火山引擎API价格(deepseek-r1):

百万tokens输入4元,百万tokens输出16元,目前赠送50万tokens免费额度。

综上,个人比较推荐的两个组合是:

电脑端:Cherry Studio+火山引擎/硅基流动的DeepSeek API

手机端:腾讯元宝/Chatbox+火山引擎的DeepSeek API

大家还有哪些用起来很顺手的组合?欢迎讨论。

最初发布于2025年3月5日