🏆 参赛作品 · #AttraX春潮Spring黑客松 Tag:
#AttraX春潮Spring黑客松Live Demo: https://video.yeadon.top Slide: seehacthon.md一句话介绍: VidClaw 是一个 AI 电商短视频广告生成平台,上传一张产品图,3 分钟自动产出带脚本、文案、标签的带货视频;支持 8 种语言、Sora 2 / VEO 3.1 / Seedance / Hailuo / Grok 等主流模型统一调度,单条成本 ~¥1,已跑出单店单月 10 万+ 比索佣金的真实带货数据。
VidClaw v2 是一个基于 Next.js 16 的短视频生成 Web 应用,支持三种输入方式:
- 主题生成:输入一个主题,调用 Gemini 生成脚本与文案,再提交给视频模型生成视频
- 链接二创:输入抖音或 TikTok 链接,经 TikHub 解析下载原视频,再进入 Gemini 分析
- 本地视频二创:先上传本地视频到上传网关,再进入 Gemini 分析和后续生成
这个仓库的真实形态是一个 Web 应用,不是单文件 Python skill。
- 父目录里历史上存在一个 Python 版 skill,用于命令行调用 Gemini + Sora/VEO
- 当前仓库是在那套能力基础上重构出的 Web 应用
- 因此,父目录旧 skill 只能作为历史背景,不能作为当前仓库的实现说明或运行说明
- 当前仓库的事实来源应以
src/、scripts/、drizzle/和本 README 为准
- Framework: Next.js 16 App Router + React 19
- Auth: Supabase Auth
- Database: Supabase PostgreSQL + Drizzle ORM
- State: Zustand
- UI: Tailwind CSS v4 + shadcn/ui
- AI Script: Gemini (
gemini-3.1-pro-preview) - Video Provider: BLTCY / Plato compatible API
- Source Video Parsing: TikHub
- Asset Storage: Cloudflare upload gateway + R2 style object storage
- Deploy: Vercel
- 用户注册、登录、鉴权
- 主题生成、链接二创、本地视频二创
- 参考图上传与管理
- 可配置的视频模型与积分消耗
- 自定义 Prompt 模板保存与加载
- 任务列表、轮询刷新、失败退款
- 定时托管生成和超时清理
- 管理后台:模型、任务、积分、公告
- 主页与营销页:
src/app/page.tsx - 主工作台:
src/app/(dashboard)/layout.tsx - 生成页:
src/app/(dashboard)/generate/page.tsx - 任务页:
src/app/(dashboard)/tasks/page.tsx - 资源页:
src/app/(dashboard)/assets/page.tsx - 设置页:
src/app/(dashboard)/settings/page.tsx - 管理后台:
src/app/(dashboard)/admin/*
- 生成主入口:
src/app/api/generate/route.ts - 生成状态轮询:
src/app/api/generate/status/route.ts - 任务刷新:
src/app/api/tasks/refresh/route.ts - 模型列表:
src/app/api/generate/models/route.ts - 资源上传令牌:
src/app/api/assets/upload-token/route.ts - 资源登记:
src/app/api/assets/register/route.ts - Prompt 保存与读取:
src/app/api/prompts/route.ts - 健康检查:
src/app/api/health/route.ts - 定时任务:
src/app/api/cron/scheduled/route.ts - 超时清理:
src/app/api/cron/timeout/route.ts
- 鉴权:
src/lib/auth.ts - 限流:
src/lib/rate-limit.ts - 数据库:
src/lib/db/index.ts,src/lib/db/schema.ts - Gemini:
src/lib/gemini.ts - 视频平台对接:
src/lib/video/plato.ts - TikHub:
src/lib/tikhub.ts - 上传网关:
src/lib/storage/gateway.ts - Supabase SSR:
src/lib/supabase/*
生成页 src/app/(dashboard)/generate/page.tsx 根据用户输入判断类型:
- 包含抖音或 TikTok 链接时,走
url模式 - 上传本地视频后,走
video_key模式 - 其他文本输入默认走
theme模式
前端向 POST /api/generate 发起请求,并通过 SSE 接收日志、阶段更新、脚本结果和任务信息。
src/app/api/generate/route.ts 依次执行:
- IP 级限流
- 用户鉴权
- 根据所选模型计算积分消耗
- 检查余额是否足够
- 从数据库读取当前用户最近上传的参考图
当前实现中,生成前至少需要 1 张参考图,否则会直接报错。
url模式:通过src/lib/tikhub.ts提取并下载源视频video_key模式:通过src/lib/storage/gateway.ts拉取用户已上传视频theme模式:不需要视频素材
src/lib/gemini.ts 负责:
- 基于视频或主题生成结构化脚本 JSON
- 输出镜头列表、完整英文视频提示词和文案字段
- 针对 TikTok 平台切换英文文案要求
- 支持用户在设置页定义 Prompt 模板
src/lib/video/plato.ts 向视频供应商提交生成任务:
- 默认请求地址来自
VIDEO_BASE_URL,缺省时回退到https://api.bltcy.ai - 模型优先级是请求参数,其次环境变量
VIDEO_MODEL - 单次最多可提交多个子任务
状态更新涉及三条路径:
- 生成页实时轮询:
src/app/api/generate/status/route.ts - 任务页补偿轮询:
src/app/api/tasks/refresh/route.ts - 定时清理:
src/app/api/cron/timeout/route.ts
相关信息会持久化到:
taskstask_itemscredit_txnsuser_assets
数据库结构定义在 src/lib/db/schema.ts,核心表包括:
usersmodelstaskstask_itemscredit_txnsuser_assetssystem_configannouncements
迁移文件位于 drizzle/,默认模型种子脚本位于 scripts/seed.ts。
复制示例文件:
cp .env.local.example .env.local关键变量分组如下。
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=DATABASE_URL=GEMINI_API_KEY=
GEMINI_BASE_URL=https://yunwu.ai代码也兼容以下回退变量:
YUNWU_GEMINI_API_KEY=
YUNWU_API_KEY=VIDEO_API_KEY=
VIDEO_BASE_URL=https://api.bltcy.ai
VIDEO_MODEL=
VIDEO_HD=TIKHUB_API_KEY=UPLOAD_API_URL=
UPLOAD_API_KEY=
UPLOAD_PREFIX=vidclaw-assetsCRON_SECRET=npm installcp .env.local.example .env.local至少需要先补齐:
- Supabase
DATABASE_URLGEMINI_API_KEY或其回退变量VIDEO_API_KEY
如果需要链接解析、上传资源、定时任务,还需要补齐:
TIKHUB_API_KEYUPLOAD_API_URLUPLOAD_API_KEYCRON_SECRET
开发环境通常使用:
npm run db:push
npm run db:seed如果你希望按迁移文件推进:
npm run db:migratenpm run dev默认访问:
http://localhost:3000
npm run dev
npm run build
npm run lint
npm run db:generate
npm run db:migrate
npm run db:push
npm run db:studio
npm run db:seedVercel 配置位于 vercel.json。
src/app/api/generate/route.ts允许较长执行时间src/app/api/cron/scheduled/route.ts用于触发定时托管任务src/app/api/cron/timeout/route.ts用于处理超时任务
当前 cron 配置:
- 每天 UTC 18:00 触发
/api/cron/scheduled - 每天 UTC 00:00 触发
/api/cron/timeout
这些接口要求请求头中的 Authorization: Bearer <CRON_SECRET>。
- 当前仓库不是 Python skill,旧 skill 的运行命令不适用于这里
- 生成流程当前强依赖至少 1 张参考图
- 上传网关对正常 Web 使用基本是必需的,尤其是本地视频二创和资源管理
- 链接二创依赖 TikHub,没有
TIKHUB_API_KEY时无法解析抖音或 TikTok 链接 - 自动退款与任务状态更新逻辑分散在多个 API 路径中,修改计费逻辑时需要整体审视
scripts/seed.ts默认写入的模型是veo3.1-fast、veo3.1-components、veo3.1-pro-4k、sorasrc/lib/video/plato.ts的环境变量回退默认模型是sora-2,这和种子数据并不完全一致,修改前应确认预期行为
这个仓库目前没有自动化测试套件。改动后建议至少执行:
npm run lint
npm run build如果你在排查环境问题,还可以访问:
/api/health
它会返回数据库、Supabase 和关键环境变量的诊断信息。
如果你第一次接手这个仓库,建议按这个顺序读:
README.mdAGENTS.mdsrc/app/(dashboard)/generate/page.tsxsrc/app/api/generate/route.tssrc/lib/gemini.tssrc/lib/video/plato.tssrc/lib/db/schema.ts