跳到主内容

PRJ-03 WIP

BinCutAgent AI 视频操作系统

ai video operating system, prompt to mp4

一句自然语言,一条 AI 流水线,一支成片视频

  • AI Agent
  • Rust
  • TypeScript
  • 音视频
YEAR
2026
ROLE
独立开发 · 系统设计
STATUS
WIP
TIER
旗舰项目

4 阶段

AI Pipeline:Director → Script → Asset → Editing

2 处

HITL 人工审批节点(分镜与脚本阶段可确认 / 拒绝)

5 个

独立服务:gateway / agent / render / harness / mcp

M2 达成

端到端 TimelineDSL 生成 + Temporal 渲染派发(M3 成片管线推进中)

// 01

问题背景

AI 生成视频的痛点不在「调用一次大模型」,而在把分镜、脚本、素材、剪辑、渲染这条多阶段链路工程化:LLM 输出要可校验、流程要可中断可恢复、人要能在关键节点介入。

这条问题域我有一段已落地的对照经验:在电商产品 shatangAI(已上线 shatang.top)中,我用 BullMQ 任务队列与状态机把 6+ 家第三方视频生成服务编排成了可靠的生产系统——但那是「编排别人家的生成能力」,渲染与创作决策都不在自己手里。

BinCutAgent 是向更底层走一步的架构探索:自己拥有从分镜、脚本、素材到渲染的完整链路,按「操作系统」的思路分层——Rust 控流、Pi 控脑、Go 评测、Temporal 卖力、MCP 扩展,每个服务只做一件事,任何一层都能单独替换。如果说 shatangAI 回答了「AI 视频产品如何上线」,BinCutAgent 要回答的是「AI 视频系统应该如何构造」。

// 02

系统架构

前端层

对话 + 画布双形态的创作界面

Next.js 15 + React 19(App Router)TanStack Query v5 + Zustand v5 + shadcn/uiWebSocket 实时事件(useProductionSession)分镜 / 素材 / 时间轴 / 视频四块画布面板

网关层

Rust Axum 统一入口与实时推送

services/gateway(Axum 0.8 + tower-http)REST:/sessions /assets /auth /tenantsWebSocket Hub + 会话注册表Redis Streams 事件发布 / 订阅 + SQLx 迁移(PostgreSQL 17)

AI 编排层

TypeScript Agent 跑四阶段 LLM 流水线

services/agent(Pi Framework v0.78 + Fastify 5 + Zod)Director → Script → Asset → Editing 四个任务Qdrant 向量检索匹配素材HITL 中断 / 恢复(hitl_resumed 事件)多 LLM Provider(Anthropic / DeepSeek / OpenAI)

渲染与基础设施层

Temporal 调度 + FFmpeg 合成

services/render(Go Temporal Worker)VideoRenderWorkflow:下载素材 → complex_filter → MinIO 上传services/harness(Go JSON Schema 质量校验)services/mcp(ffmpeg / whisper / opencut 工具服务)Postgres 17 · Redis 7 · Qdrant · MinIO · Temporal

// 03

关键技术决策

每一条都包含「为什么这样选」与「代价是什么」——这是我理解这个项目的方式。

以 TimelineDSL 作为 AI 与渲染之间的唯一契约

LLM 的输出天然不稳定,直接让它生成 FFmpeg 命令或操作数据库都不可控。定义一份 Zod 描述的 TimelineDSL(轨道 / 片段 / 时间码),Agent 只能产出 DSL,harness 用从 Zod 导出的 JSON Schema 做机器校验,渲染端只认校验通过的 DSL。代价是多了一层 schema 同步成本(pnpm schema:export),但换来「AI 可换、渲染不变」的强类型边界,两侧可独立测试、独立演进。

Temporal 而非自研任务队列承载渲染

视频渲染耗时长、会失败、需要重试与可观测——这正是 Temporal 的主场:Workflow / Activity 语义自带重试、超时、心跳与执行历史,工作流代码可以像写同步函数一样写,省去自研状态机。代价是引入一个重量级基础设施(Temporal Server + Postgres),本地开发门槛变高,用 docker compose 一键起栈来对冲。

Rust Axum 做网关,Redis Streams 做服务间事件总线

网关要同时扛 REST、WebSocket 长连接与事件转发,Axum + Tokio 的性能与类型安全合适。服务间通信用 Redis Streams 而非 Kafka——本系统事件量不大,Streams 的消费者组语义足够,且与缓存共用一套 Redis,少养一个组件;Agent 重启时事件可回放,前端看到的是可恢复的事件流而非卡死。代价是 Streams 没有 Kafka 那样成熟的生态与重放工具,事件模型设计时要更克制。

HITL:把审批做成流水线的一等公民

全自动 AI 剪辑的错误会逐阶段放大——分镜错了脚本必错。在 Director 与 Script 两个高语义阶段后强制暂停,发 hitl_interrupt WebSocket 事件,前端渲染审批卡片;确认经 Gateway → Redis [hitl_resumed] → Agent 恢复执行,拒绝则会话置 failed。代价是牺牲「一句话秒出片」的爽感,换来结果可控。

多语言服务网格而非单语言单体

按语言的生态优势分工:Rust 控流(网关)、TypeScript 控脑(LLM 生态最丰富,Pi Framework 做 Agent 编排)、Go 卖力(渲染 Worker 与校验器,部署简单)。每个服务独立目录 + 独立扩容,用 pnpm workspace / go.work / Cargo workspace 统一管理。代价很明显——跨语言类型契约要靠 packages/types 与 JSON Schema 对齐,本地起全栈要开四个终端。

// 04

我的职责与产出

RESPONSIBILITIES

  • 设计系统总体架构与「每服务单一职责」的服务边界
  • 实现四阶段 LLM Pipeline 与 TimelineDSL 契约(Zod → JSON Schema 同步)
  • 实现 Rust 网关的 REST / WebSocket / Redis Streams 事件通路
  • 实现 Go Temporal 渲染 Worker 与 FFmpeg complex_filter 合成逻辑
  • 实现 HITL 审批的中断 / 恢复事件流与前端审批卡片交互
  • 搭建 docker compose 基础设施(Postgres / Redis / Qdrant / MinIO / Temporal)

OUTCOMES

  • Prompt → TimelineDSL → MP4 的端到端链路打通(M0–M2 里程碑完成)
  • TimelineDSL 成为跨语言(TS / Go)共享的唯一渲染契约,Agent 与渲染可独立演进
  • 渲染任务由 Temporal 托管,重试 / 超时 / 历史开箱即用
  • MCP 工具服务(ffmpeg / whisper / opencut)为后续技能扩展预留标准接口

// 05

踩坑与复盘

多语言 + 多服务的架构表达力很强,但对单人项目是双刃剑:联调一次全链路要同时盯四个进程的日志,改一个字段要在三种语言里同步。复盘下来最值得的是 TimelineDSL 这层契约——它把 LLM 的不确定性关进了 schema 的笼子。当前推进到 M3(真实素材管线与成片输出),后续规划 M4 技能系统(自动字幕、B-roll)与 M5 多租户生产化。

// 06

技术栈

  • Rust · Axum
  • TypeScript
  • Next.js 15
  • Go
  • Temporal
  • Redis Streams
  • FFmpeg

视觉风格