用途:OpenStory 将文字脚本转为带风格的视频序列,流程包括拆分场景、从可复用团队库中选角与选址、生成视觉/运动/音乐提示词、通过 Fal.ai 渲染帧、动画化为运动片段、配乐并合并。整个应用是单个 Cloudflare Worker(src/server.ts),使用 D1 存数据、R2 存媒体、33 个命名 Cloudflare Workflows 做持久生成、Durable Object 提供 SSE 进度。本地开发通过 Miniflare 运行同一 Workerd 运行时。
主要能力与用法:本地运行可执行 git clone https://github.com/openstory-so/openstory.git,然后 cd openstory && bun install && bun dev(http://localhost:3000)。bun dev 会自举写入 .env.local 并执行迁移与种子。生成功能需配置 FAL_KEY(图像、视频、音频及经 fal 的 OpenRouter 端点调用 LLM)与 OPENROUTER_KEY(LLM 脚本分析)。
流水线阶段依次为:Verify+Prepare、Poster(非关键)、Scene Splitting、Casting、References & Prompts、Frame Images 与 Motion/Music prompts、Motion + Music、Complete。调试时应先通过 workflowRunId / sequence_events 定位失败阶段。
新增工作流需三处接线:wrangler.jsonc 的 workflows[](含 env.production / env.test)、src/server.ts 的类再导出、TRIGGER_TO_BINDING 条目,并由 wiring-consistency.test.ts 校验。硬性规则:运行中不做 D1 读取(scopedDb 类型上只写);步骤体每次回调从头重放,须幂等;triggerWorkflow() 的 retries/retryDelay 无效,重试应放在 step.do() 或类上。
模型目录:LLM 注册表在 src/lib/ai/models.config.ts,图像/图生视频/音频在 src/lib/ai/models.ts,运动参数在生成的 endpoint-map.ts(运行 bun motion:codegen)。改 fal 端点前先读对应 llms.txt,再用 bun models:check 比对。下线模型应标记隐藏而非删除。
迁移:用 bun db:generate 与 bun db:migrate:local,不要手写 SQL。D1 多语句迁移在隐式事务中会忽略 PRAGMA foreign_keys = OFF,可能触发 ON DELETE CASCADE,曾破坏生产认证表(#612)。优先 ALTER TABLE 而非重建表。
部署:可用 Deploy-to-Cloudflare 按钮、Workers Builds 自动部署 main,或手动 bun cf:typegen && bun cf:deploy:prd。构建需带 CLOUDFLARE_ENV=production。贡献 PR 分支名须为 <issue-number>-feature-name,推送前运行 bun lint && bun format:check && bun typecheck && bun run test。
限制:生成调用按次计费,迭代时应用最便宜的预览模型;不适用于通用 AI 视频请求、本地桌面时间线剪辑或与本代码库无关的 Cloudflare/TanStack 教程。