模型 / 数据集
FranciscoMoretti/chat-js avatar
FranciscoMoretti/chat-js

ChatJS:把 AI 聊天应用的地基先打好,再谈你的差异化

Production-ready AI chat. Start here and make it your own. Formerly Sparka AI

1,198 个 Star122 个 ForkTypeScriptApache-2.0

秒懂

它是什么?
ChatJS 是一个基于 Next.js 与 AI SDK 的 AI 聊天应用脚手架,通过 CLI 生成 chat.config.ts,把认证、模型接入、流式响应、附件、分享这些重复劳动预先做完。它适合想快速起步且接受整套技术栈的团队,不适合只想引入一个聊天组件或需要自建模型层的项目。
适合谁用?
如果你的目标是做面向终端用户的 AI 聊天产品,并且愿意接受 Next.js、PostgreSQL、Redis、Vercel Blob 与 AI Gateway 这一整套依赖,ChatJS 能省掉认证、流式、附件、分享这些从零搭建的工作。如果你只需要一个嵌入已有系统的对话组件,或者模型路由必须掌握在自己手里,它就不合适,因为模型访问是经 AI Gateway 统一出去的,替换成本落在配置层之外。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 1 天前。
用什么语言写的?
主要是 TypeScript(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决的是一遍又一遍重写聊天底座的问题

README 的第一句话写得很直白:Stop rebuilding the same AI chat infrastructure。这句话圈定了 ChatJS 的定位,它不是模型 SDK,也不是聊天 UI 组件库,而是一个已经组装好的应用。认证、120 多个模型的接入、流式输出、工具调用这些部分被预先实现,开发者拿到的是一个能跑的聊天应用,而不是一堆需要自己接线的零件。

目标读者是那类已经决定要做 AI 聊天产品、但不想在第 N 次重写登录、会话存储、消息流式渲染的人。仓库把应用拆成 apps/site、apps/chat、apps/docs 和 packages/cli 四块,聊天应用本身在 apps/chat,官网和文档站是配套的独立应用。这种拆分意味着你可以只部署 apps/chat,也可以把官网和文档一起带走。

需要说清楚的是,README 用的是 production-ready 这个说法,但仓库本身没有给出部署拓扑、容量数据或压测结果。是否达到生产标准,取决于你的流量规模和运维能力,这一点只能自己验证。

CLI 是入口,chat.config.ts 是真正的契约

创建项目的命令是 npx @chat-js/cli@latest create my-app。README 说明这个 CLI 会依次询问 gateway、features 和 auth 三类选择,然后生成 chat.config.ts,并列出你所选组合需要的环境变量。

这个流程的设计意图很清楚:把配置决策前置到脚手架阶段,让生成出来的项目只包含你勾选的功能。从仓库的发布记录看,@chat-js/cli 是独立发包的,最近的版本是 0.8.0,此前还有 0.7.0 和 0.6.5,版本号仍停留在 0.x。0.x 意味着接口和生成结果都可能随版本调整,升级 CLI 后重新生成的配置与旧项目之间会有什么差异,README 没有说明。

features 这一项值得留意。附件、可恢复流、分支、分享、Web 搜索、图像生成、代码执行、MCP、Electron 桌面打包都在功能列表里,但列表本身不告诉你哪些功能彼此依赖。比如可恢复流依赖 Redis,附件依赖 Vercel Blob,这些关联只能靠 CLI 生成时列出的环境变量反推。

技术栈是承诺,也是约束

README 把整个栈列了出来,这份清单本身就是选型判断的依据。框架是 Next.js 的 App Router 与 React Server Components,语言是 TypeScript,模型调用走 AI SDK 加 AI Gateway,认证用 Better Auth,数据库访问用 Drizzle ORM,主库是 PostgreSQL,缓存与可恢复流用 Redis,文件存 Vercel Blob,API 层是 tRPC 加 Zod,状态管理用 Zustand,样式是 Tailwind 加 Shadcn/UI,环境变量校验用 t3-env,日志用 Pino,LLM 可观测性接 Langfuse。

这不是一个可以按需摘取的清单。Better Auth 决定了会话与用户表的结构,Drizzle 决定了你写查询的方式,tRPC 决定了前后端通信的形状。你当然可以替换其中任何一层,但替换的代价不是改一个依赖,而是改动贯穿 apps/chat 的调用链。README 没有提供任何替换指南,也没有说明哪些模块被设计成可插拔的。

模型访问这一层尤其值得注意。120+ models 是通过 AI Gateway 统一出去的,也就是说模型调用会经过一个中间层。这对多provider切换很方便,但如果你的场景要求直连某个厂商的 API,或者需要用到网关不暴露的参数,README 没有给出绕开网关的路径。

本地开发与多 worktree 的端口分配

开发命令在 README 里列得很具体。bun dev 跑聊天应用,bun dev:docs 跑文档,bun lint 跑工作区检查,bun test:types 跑聊天应用的类型检查,bun dev:info 打印当前 worktree 分配到的应用 URL。

多 worktree 的处理方式是这套工具链里比较少见的一处细节。在 .env.worktree.local 里设置 CHATJS_DEV_SLOT,就能为每个 worktree 预留十个端口的区间。区间内的偏移是固定的:聊天应用用 0,Electron 用 1,官网用 2,规则写在 .worktree-env.json 里。这个本地文件被 Git 忽略,并且与 Vercel 管理的 .env.local 分开存放。README 明确建议运行 bun dev:info 而不是自己猜端口。

这套机制解决的是并行开发时端口冲突的老问题,代价是引入了一个额外的环境文件和一个需要记住的偏移约定。如果你的团队不常开多个 worktree,这部分配置基本用不上;如果经常并行,它比手工改端口号要可靠。

可恢复流、分支与分享背后的状态成本

功能列表里有三项对后端状态有实质要求:Resumable Streams 让页面刷新后继续生成,Branching 允许从对话中分叉出不同走向,Sharing 生成公开链接。这三项都不是纯前端能力。

可恢复流在栈里对应的是 Redis,README 把 Redis 标注为 Caching & resumable streams,说明流的中间状态需要落到 Redis 而不是进程内存里。分支意味着消息树而不是消息列表,数据库结构要能表达父子关系,Drizzle 的 schema 需要为此设计。分享则要求会话能脱离用户身份被读取,这涉及权限模型上的一个例外路径。

README 没有描述这三项功能的数据模型,也没有说明分享链接的有效期、撤销方式或访问控制粒度。如果你打算把分享功能开放给外部用户,这些细节需要自己在代码里确认。同样,分支对话在 UI 上如何呈现、深度是否有限制,材料里也没有说明。

什么时候它不合适

最明显的不适用场景是:你不需要一个完整应用,只需要一个能嵌进现有系统的对话界面。ChatJS 交付的是 apps/chat 这个 Next.js 应用,把它拆出组件嵌到别的框架里,工作量可能超过自己写。

第二种情况是模型层必须自持。通过 AI Gateway 访问 120+ 模型是这个项目的主要卖点之一,但如果你的合规要求、成本核算方式或私有化部署需求不允许经过第三方网关,这个卖点就变成了障碍。README 没有提供直连模式。

第三种情况是团队已经在 PostgreSQL 之外选定数据库,或者已经在用别的认证方案。Better Auth 与 Drizzle 的组合是深度绑定的,迁移到 Prisma 或别的 ORM 需要重写数据访问层,而且仓库没有给出这类迁移的文档。

还有一点需要坦白:仓库没有给出性能数据、并发上限或任何负载测试结论,因此无法判断它在高并发下表现如何。把 production-ready 理解为功能完整,而不是性能已验证,是更稳妥的读法。

与纯组件方案的区别在哪里

把 ChatJS 和 Vercel 官方的 AI SDK 放在一起比较是有意义的,因为两者共享同一套底层。AI SDK 提供的是模型调用、流式协议、工具调用这些原语,你需要自己决定用什么框架、怎么存会话、怎么处理认证。ChatJS 在 AI SDK 之上把这一整层补齐了,代价是你接受了它的框架选择、数据库选择和认证选择。

另一类替代是直接使用托管式聊天产品,比如各家模型厂商自带的对话界面。这类方案零部署成本,但你无法控制数据存储、无法加自己的工具、也无法把对话能力嵌进自己的业务流程。ChatJS 的价值区间在两者之间:比纯 SDK 省事,比托管产品可控。

这个区间是否值得,取决于你打算在聊天底座之上加多少自己的东西。如果差异化很小,托管产品更划算;如果差异化很大且需要深度定制,从 AI SDK 起步可能更干净,因为不会有需要拆掉的既有结构。

许可、发布节奏与升级代价

许可证是 Apache-2.0。这个许可允许商用、修改和再分发,附带专利授权条款,同时要求保留版权与许可声明,并对修改过的文件作出说明。README 没有提到商标政策或项目名称的使用限制,如果你打算以 ChatJS 为基础做对外产品,命名和品牌方面需要自行确认,这里不构成法律意见。

发布流程由 Changesets 驱动整个仓库。README 说明的做法是:改动了可发布包就加一个 changeset,合并 Changesets 工作流生成的版本 PR,公开包如 @chat-js/cli 发布到 npm,@chat-js/electron 的桌面安装包发布到 GitHub Releases。

对使用者的实际影响是升级方式。CLI 是独立发包的,意味着你可以用新版本重新生成项目,但重新生成会覆盖你对 chat.config.ts 和周边文件的修改。README 没有描述从旧版本升级既有项目的路径,也没有给出迁移脚本。仓库最后一次推送是 2026 年 9 月,CLI 的版本节奏大致是几个月一个小版本,这个频率下,跟进升级需要预留人工比对配置差异的时间。

编辑结论

如果你的目标是做面向终端用户的 AI 聊天产品,并且愿意接受 Next.js、PostgreSQL、Redis、Vercel Blob 与 AI Gateway 这一整套依赖,ChatJS 能省掉认证、流式、附件、分享这些从零搭建的工作。如果你只需要一个嵌入已有系统的对话组件,或者模型路由必须掌握在自己手里,它就不合适,因为模型访问是经 AI Gateway 统一出去的,替换成本落在配置层之外。动手之前先确认三件事:跑 npx @chat-js/cli@latest create 走完选择流程后生成的 chat.config.ts 是否覆盖你的功能组合,CLI 列出的环境变量是否都能在你的部署环境里配齐,以及 Apache-2.0 下你打算保留还是替换 apps/site 与 apps/docs 这些你未必需要的子应用。

官方来源

  1. FranciscoMoretti/chat-js on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
社区笔记

社区笔记