Skip to main content
什么是Moana,是我做的一个套壳,目的是实验一些我的交互想法,比如工作空间,答案标题折叠,一键保存答案到笔记软件,等等。因为这个月的Vercel AI gateway免费额度已经用完所以暂不可用。 为什么要重写呢,简单来讲就是我自己的工具我想写就写,开玩笑了。现在的Moana鉴权用到了Clerk,数据库用到了Convex,一开始觉得很方便,直到有段时间两个服务轮番挂掉,虽然时间不长,但是都挂在正好要用到时候,就很烦,所以开始琢磨要不要整一个本地版本。加上正好差不多的时间在推上刷到有套壳的作者在无授权的情况下访问用户日志,甚至用日志变现,我问我自己,我有办法让用户信任我永远不会看他们的聊天记录吗,好像没有,那算了我不要碰这个数据了。两个综合起来,就很需要一个鉴权和数据都不上云的套壳。 那,要做桌面客户端吗,这样像是macOS可以用上keychain和icloud?不。其实Moana已经是我做的第二个套壳,第一个是桌面客户端,放弃是因为做完核心功能不久我就出门旅行去了,旅行途中好几次非常想要使用自己做的功能,可惜在路上不方便打开电脑,当时就悟了,还是web大法好啊。所以桌面是不可能桌面的,APP就更不可能这高级玩意儿我哪会。 已经够纠结了,但还没完。因为工作中种种资源受限,让我很是怀念刚上班的时候,那会作为一个非研发小朋友,拥有自己独占的服务器,除了GPU各种配置都是自己随便挑,需要什么申请一下都是秒批,那种舒爽的感觉谁懂?现在工作中没有了,但是我可以给自己买了呀!稍微想了想,给自己定下一个目标,一个用户如果想要使用本地化版本的Moana,他应该可以从Github获得代码,准备一台服务器或者跑在自己电脑上,准备好各种AI服务的API key,然后一行命令启动和初始化一个全新的套壳实例并开始使用。 问题来了,Moana的代码是用Cursor Agent和Claude Code生成的,我也好多年没有干过什么开发的工作了,计划虽有,但两眼一黑不知从何开始。可本人毕竟还是现学现卖的专家,立马打开阿里云,果不其然送了300块人民币的免费额度,于是火速创建ECS进行了一些服务器操作的复建,有了上文VPS部署从入门到放弃 接下来是进行代码层面的改造,主要有两个大改动。首先因为想要替换掉鉴权和数据库,我想到了当时做桌面应用的时候用过的Supabase,同时有这两个服务并且支持自己部署。其次,后端服务的语言从Node.js改为使用Python,因为想着之后还想试验一些科学计算相关的想法,Python生态较为健全,以及LLM provider官方的cookbook很多都是Jupyter Notebook加Python脚本,有需要的时候复制粘贴也比较容易。另外在开发体验方面,很想要几行命令就在终端搞定绝大多数工作,这也与上文所说的终极用户体验一致,所以决定从一开始就要做到所有东西容器化部署。 在Cursor Agent + GPT 5.1 Codex Max和Google AI Stuio + Gemini 3 Pro的帮助下糊出来两个版本(为什么不用我最爱的Claude Opus 4.5?因为Cursor这个月额度用完了,GPT 5.1 Codex Max正好限免,Google AI Stuio本身就有免费额度)。第一个版本,Supabase的部分无脑使用了官方镜像,后端部分是一个用FastAPI的LLM Gateway连御三家的API,整体用一个docker-compose.yml串起来,再用Makefile实现一行命令开启所有服务并初始化数据库。初看好像像模像样该有的都有,但细看问题来了。首先,Supabase全套服务有十四个容器,但我用得上的只有auth和db,其他全都是多余的,包括gatewaykong,略有洁癖的我看不下去,得想个办法去掉。其次,本想着不想增加复杂度先随便整个LLM Gateway看看效果再说,没想到让我对这个东西的存在产生了质疑。浏览御三家的API文档,会发现各自的设计并不是简单的接口层面的不一致,而是通过接口设计展示出了各家模型能力路线图的区别。作为一个自用的只打算接御三家的服务,真的有必要强行把它们拼接起来吗,好像不是很有必要,加上我还是一个很讨厌套娃的人,所以决定把LLM Gateway这个东西抛弃掉,在后端路由层面和各家的官方API分别集成。 第二个版本也是暂时的现行版本里,我去掉了Supabase除了auth和db外的所有服务,并且不使用Gateway由Python服务的容器直连这两个容器,另外在/chat路由里通过provider参数来判断应该使用哪一家的API,并直接透传各自的结果。当然了,现在前端还没开始重构,或许到时候会加上薄薄一层参数名称的转换,但怎么也说不上是LLM Gateway了。 本来想要加一个disclaimer说我不是专业的程序员内容可能有错,但那又怎么样又不是不能用?所以就这样了。万事俱备,我终于没有理由拖延Claude Agent SDK的集成了!Stay tuned.