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

1、昨天给使用Flutter重构的ChatWith增加了多模型管理和切换、联网搜索、回收站、深度思考等等,添加OpenRouter的Claude 3.7 Sonnet和硅基流动的DeepSeek-R1试试看,首轮测试问题如下:

1.在添加/编辑模型页,目前“模型名称”和“模型”两个字段都是必填,如果作用一样的话,可以去掉“模型”字段

2.模型管理页,不需要显示太多内容,可以去掉这里的Base URL,只保留“模型名称”和“备注”字段

3.模型管理页,每个模型前边都有星号,但点击星号无法设置为默认模型,而是进入了模型编辑页,我需要在点击星号时将其设为默认模型,再次点击取消默认

4.点击对话界面上方的按钮,可以切换模型,想再次切换时就会显示“加载中”,看不到我添加的其它模型

5.对话时,AI返回的内容是乱码

6.创建新对话后,仍然使用了我在上次对话时切换的模型,想切换其他模型就会显示“加载中”,看不到我添加的其它模型

2、全部反馈给Cursor进行修改,去掉了“模型”字段,包括“模型名称”会作为model字段的值保留,模型管理页简化显示,点击星号设置默认模型,并且可切换实心空心,修复模型选择器加载问题,使用watch正确监听模型列表变化,使用utf8.decode()正确解码响应流,新对话使用默认模型,再次测试,上面提到的问题1、2、3、5均已修复,但在对话中切换模型时依然会显示“加载中”,看不到我添加的其它模型

3、决定简化对话页的逻辑,并做更多修改如下:

1.创建新对话时即使用默认模型,仅在对话窗口上方显示当前的默认模型,不需要在这里切换模型

2.去掉对话列表和收藏列表右上方的“设置”按钮,将“设置”改成应用底部的第三个Tab

3.设置页顶部的“设置”二字居左显示,和对话列表页顶部的“全部对话”保持一致

4.收藏页顶部的“收藏夹”三个字居左显示,和对话列表页顶部的“全部对话”样式一致

5.与支持深度思考的模型(如DeepSeek R1)对话时,看不到思考过程,是否需要增加一个判断模型是否支持深度思考的功能?如果支持就展示思考过程

6.AI对话内容的字号调小一点,现在有点大

4、Cursor陆续实现上述需求,创建了ModelDisplay组件,在对话窗口只显示当前的默认模型名称,移除了模型切换功能,在AIModel中添加了supportsThinkinggetter,通过模型名称判断是否支持深度思考,目前的判定逻辑是包含r1、o1、deepseek、thinking等关键词,但我觉得可能不是很合适,后面还得再优化,然后把Markdown样式中段落字号从16调整为14,再次测试,果然在与DeepSeek R1对话时仍未显示思考过程,且对话页、收藏页、设置页三个页面的标题目前均为居中,继续反馈问题并增加更多需求:

1.在与DeepSeek R1对话时仍然未能显示思考过程,可能通过模型名称来判断是否支持深度思考并不是很合适,有没有其它更好的判定方法?或者在添加/编辑模型页增加一个是否支持深度思考的选项?如果选择了支持,就在对话时展示思考过程,如果选择了不支持,就不展示思考内容,这两种方式你更推荐哪一种?(先回答我这个问题,不要直接修改,后面问题2到问题6请直接修改)

2.对话页、收藏页、设置页三个页面的标题(全部对话、收藏夹、设置)目前均为居中,我需要统一成居左显示

3.对话列表里的标题显示用户提出的最后一个问题,下面的小字显示AI最后一次回答的内容,都只显示一行

4.对话详情页,用户和AI都需要有一个头像,并且在消息下方显示消息时间

5.调整一下设置页的“数据管理”,点击“数据统计”,打开新页面,可在新页面里查看AI对话、收藏内容的数量,并且也在“数据统计”前增加一个图标,和“回收站”入口的样式一致

6.在设置页,把外观设置挪到最下方,设置页共三个模块:模型管理、数据管理、外观

5、关于上面的第一个问题,Cursor更推荐在添加/编辑模型页增加“是否支持深度思考”选项,这种方式不依赖模型名称的命名规则,用户可手动控制,模型名称变化不影响判断,用户明确知道哪些模型支持,决定采纳建议,并进一步明确如下:

在添加/编辑模型页增加“是否支持深度思考”选项,默认选中“不支持”,用户可自行选择,同时在模型管理页,每个模型的信息中增加一行,根据用户的选择情况显示“支持深度思考”或“不支持深度思考”

6、让Cursor实现上述需求,修改过程中重写了chat_message_item.dart文件,可能是多次修改导致结构出现了问题?完成之后再次测试,对话详情页已支持对话双方的头像,设置页已基本符合需求,回答内容的流式输出正常,Markdown渲染正常

7、但是,对话页、收藏页、设置页三个页面的标题仍然是居中显示(第二次修改仍然无效),对话列表里每个对话只能看到最后一个问题,看不到最后一次回答,即使我给硅基流动的DeepSeek R1打开了支持深度思考,好像仍然不显示思考过程,需要再用其它问题试一下

8、另外还需要补充的功能包括触发联网搜索、显示联网搜索的参考链接、测试模型是否可用、对话的置顶/修改/删除功能(已有按钮,需测试是否可用)

9、使用Flutter创建的应用,在界面上整体明显更偏向原生安卓的风格,毕竟谷歌出品

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