跳到正文

AIYOU

一块装得下十二种节点的画布,把一句创意送到成片:大纲、分集、角色三视图、分镜、关键帧、视频——而底下那层 provider 会在某个模型额度用尽时顺着优先级往下换,让整条流水线继续跑。

Screenshot of AIYOU
编辑截图, 29 Sep 2026AIYOU ↗

这是什么

一个用节点做 AI 漫剧的工作台:React 网页应用加一个 Tauri 桌面壳。十二种节点盖住整条流水线——大纲、分集、角色设计(三视图加九宫格表情包)、分镜脚本、2K 分镜图、Sora 提示词组装、逐镜头视频、剧集分析——而一次生成就是你往画布上拖节点、把线连起来。生成走一层 provider:每个媒体类别各有一份优先级表,配额错误或连续失败会把活交给下一个模型,而不是让这次运行结束。README 自己写的样片成本是两块钱不到。

谁做的仓库归这个账号所有,它在里面只有两次提交。139 次里有 131 次记在另一个账号 superman32432432 名下,用的邮箱是占位地址 user@example.com,另有三次来自第三位贡献者。README 用第一人称单数写成,读起来是一个人的活——包括给自己打分那一段。拥有仓库的这个账号有 12 个公开仓库、8 个关注者。

它是怎么搭起来的

组成 · 6

流水线本身就是界面。它不用一个向导带你走完各个阶段,而是给一块画布:每个制作阶段是一个节点,一次运行就是你画出来的一张图,结果顺着连线流动,于是同样的十二种节点既能连成一条直线,也能分叉出同一镜头的三个版本。每种节点自带自己的提示词组装器和 provider 适配器,这正是十二个阶段没有在界面里变成十二个特例的原因——差异住在 services/promptBuilders/ 和各 provider 目录里,画布只认识节点和连线。底下两层干的是不显眼的活:一层 provider 按媒体类别持有优先级表,把失败或额度用尽的模型降下去;一层存储决定图片和视频最后落在哪。后面这层是这套设计始终没有定下来的部分——它在五份文档里被写成了三种方案,而树里留着三种方案的痕迹。

components/ 与 components/nodes/
画布与它的零件。components/nodes/ 六个文件里有一个 196,800 字节的 MediaContent.tsx 和一个 139,191 字节的 BottomPanel.tsx;旁边还有 ModelConfigPanel.tsx、StorageSettingsPanel.tsx、SmartSequenceDock.tsx、SonicStudio.tsx、StoryboardEditor.tsx,以及一个 31,731 字节的 StoryboardVideoNode.tsx——图一旦是真的,一个制作工具就需要这些面板。
services/
十二种节点真正不同的地方:nodes/ 放实现,promptBuilders/ 放每个阶段的提示词组装,后面站着四个 provider 目录——soraProviders/、llmProviders/、videoProviders/、videoPlatforms/——apiInterceptor/ 与 api/ 处理传输,storage/ 处理持久化。
handlers/ 与 hooks/
handlers/useNodeActions.ts 单个文件 149,348 字节——节点图的命令面——旁边是工作流与快捷键处理器;hooks/ 里有九个小钩子,管画布状态、历史、节点表、节点操作、视口裁剪与窗口尺寸。
server/
一个本地 Express 服务,十个源文件:80,707 字节的 index.js、db/index.js 与 db/migrate.js、三个分别管连线/媒体/节点的路由文件、一个 logger,以及 8,953 字节的 model-config.json。README 把它配到腾讯 COS 上,架构文档则规定 SQLite 加本地目录——两种都在树里。
src-tauri/ 与前端
一个 Tauri 外壳,让同一套 React 应用也能作为桌面应用运行,src-tauri/icons 下有 52 个图标文件。前端本身是 React 19.2、TypeScript 5.8、Vite 6.2、Zustand 管状态、React Flow 画图、Tailwind 做样式——而尽管 README 的架构一节写着有 frontend/ 目录,这个目录并不存在:所有东西都在仓库根目录。
docs/、根目录的 markdown 与 .claude/skills/
docs/ 下十九个文件,根目录另有九个——一份 49 KB 的 DETAILED_REFACTOR_GUIDE.md、一份 43 KB 的 COMMERCIALIZATION_ROADMAP.md 与配套的 34 KB 计划、一份 32 KB 的节点标准化总结、一份 28 KB 的题材风格指南——再加一个 23 KB 的 generate-doc.js。.claude/skills/ 里放着项目自己的 16,595 字节节点构建技能,以及一个引入的界面技能,后者的数据目录里有一张 96,553 字节的风格表和十四种编程工具的适配。

取舍,以及它替代了什么

  • 用本地服务,而不是在前端直接调用模型 API 替代 项目最初的样子:密钥在浏览器里,请求也从浏览器发出

    后端架构文档开篇就点明这是被替换掉的东西,并给出了它引入的两样东西各自的理由:Node.js 加 Express 加 TypeScript 是因为这样技术栈与前端一致、全栈开发留在一种语言里;SQLite 是因为它不需要独立的数据库服务、备份就是拷一个文件、而且支持事务。

  • 生成的素材写进用户自己选的文件夹 替代 浏览器 localStorage 加云对象存储桶

    存储设计把目标直接写了出来——把所有生成的图片和视频存进用户指定的文件夹,按画布和节点类型组织——而 README 给出了它对目标读者要紧的原因:本地部署,创作者的素材因此是私密的。迁移方案之所以存在,是因为在那之前生成的东西都躺在浏览器里。

  • 模型失败就换一个,而不是把错误报出来 替代 把报错摆到脸上、让这次运行停下

    降级指南点明了它按常规处理的触发条件——额度用尽、HTTP 429 与 503、计费类错误、连续失败三次——以及恢复规则:连续失败三次的模型会被标记不可用并跳过,一小时后重试。每次替换都会弹一条同时点名前后两个模型的通知,于是切换是可见的,但不构成打断。

  • 十二种节点,而不是一条固定的流水线 替代 按顺序跑完各个阶段的固定流程

    README 把这种可组合性说成产品的长处——拖拽连线即可生成,用它的原话,像搭积木一样简单——而树里也反映了代价:每种节点都有自己的实现、自己的提示词组装器和自己的 provider 适配器,这就是把顺序交给用户决定的成本。

依据docs/BACKEND_ARCHITECTURE.md(31,874 字符)与 docs/LOCAL_STORAGE_DESIGN.md(19,406)、MODEL_FALLBACK_GUIDE.md、README.md、docs/SERVICE_LAYER_COMPLETED.md、server/README.md,以及完整的 999 个文件树及其体积。

制作过程

6 个阶段
  1. 01

    工单指的其实是一个 fork

    gallery 给的条目是 lay950822/AIYOU:一个 fork,没有星,账号下只有一个公开仓库,简介指向一个中文域名。真正的源头是 yubowen123/AIYOU_open-ai-video-drama-generator——136 个星、49 个 fork,建于 2026-02-04,最后一次推送是 2026-03-05——两份副本带着同一句简介、同一个作者账号提交的 110 与 139 次提交,还有同一个占位邮箱。二手来源把一个 fork 当成项目本身来列,正是这套档案要接住的那类错误:记录按源头归档,工单条目上写明文件真正在哪。这个 fork 也顺手解释了自己那处异常——此前看着像 GitHub 的 bug:pushed_at 早于 created_at,正是一个副本的上游历史早于它创建时间时的样子。

  2. 02

    作者给它打 30 分

    多数 README 在推销,这一份在自审。在功能表和徽章下面,作者写着这个项目本身是为了锻炼自己 vibe coding 的能力,因此完善度不足、会有很多小 bug,然后打分:系统 30 分,提示词 50 分,理由是提示词才是其中还算有用的那部分。结论写得同样直白——它只能作为交流学习的工具,不能作为生产力工具——后面接着宣布要重构,把这个产品没做完、没构建的能力尽量补上,并敞开邀请从业者拍砖。有两点值得这份档案记下来:这个分数挂在一个 136 星、49 个 fork 的仓库上;而它是作者自己的,是这个档案唯一一种不需要核实就能引用的自评。

  3. 03

    半年的构建产物有多重

    GitHub 报的仓库体积是 126 MB,源码只占其中很小一部分。签进树里的是:npm-cache/_cacache,628 个文件、157 MB,npm 自己的内容寻址缓存——里面躺着八兆一个的单个 blob,就放在一个如实命名的文件夹下;一个 videos/ 目录,12 个文件、71.8 MB 生成结果;一个 releases/ 目录,装着一份 15.8 MB 的打包产物。同一种习惯也出现在依赖元数据里:这个项目有四份 lockfile——根目录一份 package-lock.json 加一份 pnpm-lock.yaml,server/ 里又是同样两份。这些都不影响运行,而它们正好是一个仓库把「提交」也当成备份策略时的样子。

  4. 04

    存储这一层被设计了五次

    docs/ 有十九个文件,其中关于「生成的素材放在哪」的是:LOCAL_STORAGE_DESIGN.md(19 KB)、LOCAL_STORAGE_PLAN_V2.md(41 KB)、LOCAL_STORAGE_MIGRATION_PLAN.md(44 KB)、LOCAL_STORAGE_IMPLEMENTATION_GUIDE.md(10 KB)和 WEB_STORAGE_OPTIMIZATION_PLAN.md(29 KB)——一份设计、一份第二版设计、两者之间的迁移方案、执行这份迁移的指南,以及一次优化。第二版设计选了 File System Access API,让网页应用把图片和视频写进用户自己指定的文件夹,按画布一个目录、按节点类型一个子目录排开,根目录放一个元数据索引,并为当时还躺在 localStorage 里的东西准备一条迁移路径。另一份 31 KB 的 BACKEND_ARCHITECTURE.md 用另一种方式回答同一个问题:把活搬到本地 Express 服务加 SQLite 上;它开篇第一句就把这次改动描述成替换掉「直接在前端调用 AI API」的架构。两份文档都还在树里,而树也说明了哪一份落地了:server/ 存在,里面是一个 80,707 字节的 index.js——用的是普通 JavaScript,而不是文档论证过要用的 TypeScript——旁边是 db/ 和三个路由文件。

  5. 05

    把模型降级当成功能,而不是错误处理

    在这个项目里,多数代码库会用一个下午搞定的部分,单独有一份指南。MODEL_FALLBACK_GUIDE.md 写明了按媒体类别——图片、文本、视频、音频——各一份、由用户在设置页里排序的优先级表,以及它下面的自动降级:额度用尽、HTTP 429 或 503、或者连续失败三次,请求就顺着往下换一个模型。连续失败三次会把该模型标记为不可用并跳过,一小时后自动恢复重试。每个模型的健康状态按成功率、连续失败次数和最后一次错误时间显示,计数存在 localStorage 的同一个键下,而每一次切换都会弹出一条通知,同时点名用尽的那个模型和接手的那一个。这是件小事,对产品的手感影响却很大:一块排满长时生成任务的画布,不会因为某家厂商的配额到点而停下来。

  6. 06

    一个人的构建日志,以及这份记录能看到的部分

    提交历史共 139 次——一月 58、二月 78、三月 3——其中 80 次带模型尾注:Claude Sonnet 4.5 七十四次,Opus 4.5 与 Opus 4.6 各三次。最早一次提交标着 2026-01-06,比仓库本身早一个月,也就是说活先干起来了,之后才有地方公开。131 次提交带着占位邮箱 user@example.com,这也是为什么贡献者列表看起来是三个账号,而 README 读起来像一个人。两个 tag:v0.1.0 和 v0.1.1,零个 release。社区留下了一个 pull request(自定义 Gemini base URL,零评论即关闭)和一个 issue——那个 issue 还开着,问有没有视频教程,并补了一句大佬我完全不知道怎么用。项目还自带了 agent 指令:.claude/skills/aiyou-node-builder.md 有 16,595 字节,讲的是怎么给这个代码库加一个节点;另有一个引入的界面技能,带着十四种编程工具的适配。2026-03-05 之后没有新的推送。

相关档案

全部档案 →