ai-chatbot/docs/系统全链路开发文档-含九宫格视频Agent技能化方案.md
Your Name ec988be30a
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Update agent workflow and video task handling
2026-03-13 11:21:42 +08:00

18 KiB
Raw Blame History

系统全链路开发文档(基于当前项目)

项目:ai-chatbot-main
文档目标:沉淀当前系统已实现能力,并给出“RUXA 视频九宫格 + Agent 技能化”完整可开发方案
适用范围:聊天页、无限画布、3D 生成、AI 详情、视频生成、存储迁移、后台模型配置


1. 项目定位与能力边界

本系统是一个多模态 AI 创作平台,核心能力覆盖:

  1. 文本/图片/视频对话式生成(统一在聊天链路)
  2. 无限画布创作与多节点编排(图片、视频、文本、3D)
  3. Agent 智能路由与智能参数推荐
  4. AI 详情生成(电商详情页自动分镜 + 质检回修)
  5. 多供应商模型治理(后台可配置 provider/model)
  6. 多存储后端(S3/MinIO/OSS)与 OSS 降本迁移任务

2. 技术架构总览

2.1 技术栈

  • 前端:Next.js 16 + React 19 + Tailwind + shadcn/ui
  • 后端:Next.js Route Handlers(Node Runtime)
  • AI 编排:ai SDK + LangGraph(Agent 流程)
  • 数据库:PostgreSQL + Drizzle ORM
  • 存储:S3 兼容存储 / Aliyun OSS / Vercel Blob(兼容)
  • 图像处理:sharp
  • 状态管理:Zustand(画布)

2.2 关键目录

  • 聊天主链路:/Users/lanmu/Desktop/ai-chatbot-main/app/(chat)/api/chat/route.ts
  • 模型动态加载:/Users/lanmu/Desktop/ai-chatbot-main/lib/ai/dynamic-provider.ts
  • Agent 编排:/Users/lanmu/Desktop/ai-chatbot-main/lib/ai/auto-agent-graph.ts
  • 智能分析:/Users/lanmu/Desktop/ai-chatbot-main/lib/ai/smart-analyzer.ts
  • 无限画布页面:/Users/lanmu/Desktop/ai-chatbot-main/app/canvas/[id]/page.tsx
  • 画布聊天面板:/Users/lanmu/Desktop/ai-chatbot-main/components/canvas/CanvasChatPanel.tsx
  • 3D 页面:/Users/lanmu/Desktop/ai-chatbot-main/app/canvas/[id]/model3d/page.tsx
  • 3D API:/Users/lanmu/Desktop/ai-chatbot-main/app/api/canvas/3d/tasks/route.ts
  • 后台设置:/Users/lanmu/Desktop/ai-chatbot-main/app/(admin)/settings/admin-settings-client.tsx
  • 数据模型:/Users/lanmu/Desktop/ai-chatbot-main/lib/db/schema.ts
  • 存储迁移任务:/Users/lanmu/Desktop/ai-chatbot-main/lib/jobs/oss-image-migration-job.ts

3. 当前模型与供应商体系(已实现)

3.1 Provider 类型(后台可配置)

已接入的 provider 类型(数据库 + 后台一致):

  • alibaba、openai、custom、local
  • gemini、huanke-gemini
  • alibaba-image、ruxa-image、fal-image、volcano-vision
  • qianwen-video、doubao-video、fal-video、ruxa-video、volcano-video
  • tripo-3d
  • 扩展兼容:zhipu、volcano-multimodal(由 custom 映射识别)

参考实现:

  • /Users/lanmu/Desktop/ai-chatbot-main/app/api/admin/ai-providers/route.ts
  • /Users/lanmu/Desktop/ai-chatbot-main/lib/ai/provider-defaults.ts

3.2 视频模型与模式能力(代码内置)

视频能力模型通过 capabilities + videoToolCapability 驱动前端 UI 与参数限制:

  • RUXA:仅 first-frame(图生视频),比例 16:9/9:16/1:1,时长 5/10
  • Qianwen:first-frame
  • FAL:first-frame/first-last-frame
  • Volcano/Doubao:支持文生/首帧/首尾帧/多参考图(按模型能力动态裁剪)

参考实现:

  • /Users/lanmu/Desktop/ai-chatbot-main/lib/ai/video-tool-capability.ts
  • /Users/lanmu/Desktop/ai-chatbot-main/components/video-params-bar.tsx

3.3 代码中已出现的具体模型名称(非运行态 DB 全量)

  • RUXA 视频:veo3.1(后台模型可配置)
  • 实时画布默认模型:fal-ai/flux-2/klein/realtime
  • 火山预设模型族:
    • doubao-seedance-1-0-pro-250528
    • doubao-seedance-1-0-pro-fast-251015
    • doubao-seedance-1-0-lite-t2v-250428
    • doubao-seedance-1-0-lite-i2v-250428
  • Tripo3D 版本选项:
    • Turbo-v1.0-20250506
    • v3.1-20260211
    • v3.0-20250812
    • v2.5-20250123
    • v2.0-20240919
    • v1.4-20240625

说明:系统最终“在用模型清单”来自数据库 AiModel,由后台“AI模型/本地AI模型”动态配置。


4. 核心链路说明(已实现)

4.1 聊天与 Agent 模式

入口:POST /api/chat
实现:/Users/lanmu/Desktop/ai-chatbot-main/app/(chat)/api/chat/route.ts

主流程:

  1. 鉴权 + 请求去重(同 chatId:messageId 防重入)
  2. 自动模式判定(selectedChatModel === "auto" 或固定视觉模型 + deepThinking)
  3. 历史图片补全(当前无图时回溯最近生成图/上传图)
  4. 调用 LangGraph Agent:
    • 意图识别(图编/图生/视频/问答)
    • 友好回复
    • 提示词优化
    • 推荐图片/视频参数
    • 路由到最佳模型
  5. 按 provider 分支执行(文本、图片、视频)
  6. 流式返回 + 消息持久化 + 积分/配额扣减

4.2 无限画布

页面:/canvas/[id]
实现:

  • /Users/lanmu/Desktop/ai-chatbot-main/app/canvas/[id]/page.tsx
  • /Users/lanmu/Desktop/ai-chatbot-main/components/canvas/CanvasWorkspace.tsx
  • /Users/lanmu/Desktop/ai-chatbot-main/store/canvas/index.ts

能力:

  • 节点类型:message/image/video/text/scene-fusion/model3d
  • 自动保存 + 节流重试(429 后重试)
  • 节点操作:拖拽、缩放、撤销/重做、多选
  • 画布与聊天联动(图片可回注对话)

4.3 AI 详情生成

核心接口:

  • POST /api/canvas/detail-plan
  • POST /api/canvas/detail-review
  • GET|POST|PATCH|DELETE /api/canvas/[id]/detail-archives

核心能力:

  1. 电商详情 brief 结构化输入
  2. 分屏规划(传统生图 / agent_layout 可编辑文字层)
  3. 逐屏生成 + 质检 + 二次修图
  4. 存档回放(canvasDetailArchive)

主要实现:

  • /Users/lanmu/Desktop/ai-chatbot-main/components/canvas/CanvasChatPanel.tsx
  • /Users/lanmu/Desktop/ai-chatbot-main/app/api/canvas/detail-plan/route.ts
  • /Users/lanmu/Desktop/ai-chatbot-main/app/api/canvas/detail-review/route.ts

4.4 3D 生成(Tripo3D)

页面:/canvas/[id]/model3d
API:

  • POST /api/canvas/3d/upload-image
  • POST /api/canvas/3d/tasks
  • GET /api/canvas/3d/tasks/[taskId]
  • GET /api/canvas/3d/balance

后端关键点:

  • 从 AiProvider(type="tripo-3d") 读取 key/baseUrl
  • 对 API key 做隐藏字符清洗(解决 ByteString 8232 问题)
  • 统一 Tripo 错误结构返回(含 traceId)

主要实现:

  • /Users/lanmu/Desktop/ai-chatbot-main/lib/tripo/server.ts
  • /Users/lanmu/Desktop/ai-chatbot-main/lib/tripo/client.ts

4.5 存储与 OSS 迁移降本

现状策略(已上线):

  1. 上传优先走可用存储配置(支持 OSS 作为入口桶)
  2. 记录迁移任务(StorageMigrationTask)
  3. 定时任务将 OSS 图片转存到默认桶
  4. 回写数据库 URL(消息、画布、详情存档)
  5. 到期清理 OSS 源对象

接口:

  • POST /api/jobs/migrate-oss-images
  • GET /api/jobs/migrate-oss-images

主要实现:

  • /Users/lanmu/Desktop/ai-chatbot-main/lib/storage/service.ts
  • /Users/lanmu/Desktop/ai-chatbot-main/lib/jobs/oss-image-migration-job.ts
  • /Users/lanmu/Desktop/ai-chatbot-main/app/api/jobs/migrate-oss-images/route.ts

5. 数据库核心表(当前)

主要业务表:

  • AiProvider:供应商配置
  • AiModel:模型配置、能力、故障迁移字段
  • StorageConfig:存储桶配置
  • StorageMigrationTask:OSS 迁移任务
  • SiteSettings + SystemSettings:站点与功能开关
  • Message:消息主表(含视频存储元数据)
  • GeneratedImage:图片记录
  • CanvasProject、CanvasNode、CanvasImageTask
  • CanvasDetailArchive:AI详情归档

定义文件:/Users/lanmu/Desktop/ai-chatbot-main/lib/db/schema.ts


6. 新需求:RUXA 视频九宫格 + Agent 技能化(待开发)

2026-03-12 补充需求:多宫格(4/6/9)标准切片、切片后先生成高清镜头图、用户确认分镜后才允许开始生视频。
需求详见:docs/多宫格分镜视频需求补充-2026-03-12.md
开发清单详见:docs/多宫格分镜视频开发清单-2026-03-12.md

6.1 需求归纳

当用户在视频模式选中 RUXA 视频 时:

  1. Agent 判断用户上传图是否为九宫格
  2. 若是九宫格,切成 9 张图
  3. 用户脚本格式不固定,先由 Agent 归一为 9 镜头脚本
  4. 切图后尺寸偏小,后台预留“图片变清晰”调用链路(默认关闭,待测试后再开启)
  5. 每张图按对应脚本生成视频,串行发送,间隔 10 秒
  6. 失败自动重试;超限/失败可降级到其它视频模型
  7. 全流程可追踪进度,可回放任务结果

6.2 合理性评估结论

该需求合理,且与现有架构兼容;但需工程化约束:

  • 超分能力先预留不启用,通过配置开关控制,默认 false
  • 九宫格检测需置信度门槛,低置信度不自动切片
  • 串行队列必须持久化到 DB,避免重启丢任务

7. 九宫格技能链设计(建议实现)

采用“技能链(Skill Chain)”封装,而不是把全部逻辑塞进 chat/route.ts。

实施约束:当前阶段仅输出方案文档,不改动业务代码;开发时必须按“技能封装”方式落地。

7.1 技能模块划分

  1. script-normalizer-skill
    输入任意脚本文本,输出标准 JSON(9 段)

  2. nine-grid-detector-skill
    判断是否九宫格 + 透视校正 + 切片 + 质量评分

  3. tile-upscale-skill
    对小图按阈值走增强(复用现有 enhance 能力,先预留默认关闭)

  4. storyboard-mapper-skill
    将 9 图与 9 段脚本一一映射,生成每段视频 prompt

  5. video-sequencer-skill
    串行调度(10s)+ 重试 + 降级模型 + 状态更新

7.2 技能触发规则(必须)

仅在满足以下条件时触发九宫格技能链:

  1. 当前模式为视频生成,且选中模型 provider 为 ruxa-video
  2. 用户消息包含至少 1 张图片
  3. nine-grid-detector-skill 识别结果 isNineGrid=true
  4. confidence >= minGridConfidence(默认 0.85)

触发后的流程:

  1. 进入 script-normalizer-skill
  2. 再进入 nine-grid-detector-skill 切片
  3. 按开关决定是否进入 tile-upscale-skill
  4. 进入 storyboard-mapper-skill
  5. 最后进入 video-sequencer-skill

未触发时(任一条件不满足):

  • 直接走现有普通视频链路,不进入九宫格技能链

7.3 建议代码落点

  • lib/video-agent/skills/script-normalizer.ts
  • lib/video-agent/skills/nine-grid-detector.ts
  • lib/video-agent/skills/tile-upscaler.ts
  • lib/video-agent/skills/storyboard-mapper.ts
  • lib/video-agent/skills/video-sequencer.ts
  • lib/video-agent/pipeline/ruxa-nine-grid-pipeline.ts

聊天主链路只做路由:

  • 修改 /Users/lanmu/Desktop/ai-chatbot-main/app/(chat)/api/chat/route.ts
    • 当 provider=ruxa-video 且满足“技能触发规则”时调用 pipeline

8. 防切错设计(重点)

8.1 检测流程(四段式)

  1. 预检:宽高比接近 1:1 或 3:3 拼图常见比例;分辨率 > 最低阈值
  2. 网格线检测:行列投影 + 边缘峰值,识别 2 条纵线 + 2 条横线
  3. 几何校正:若轻微透视,先矫正再切片
  4. 切后复检:每格清晰度、边界截断、相邻差异、主体完整度评分

8.2 判定阈值建议

  • grid_confidence >= 0.85:自动进入九宫格流程
  • 0.65 ~ 0.85:进入“待确认”状态(Agent 提示用户确认)
  • < 0.65:走普通单图视频流程

8.3 输出结构建议

{
  "isNineGrid": true,
  "confidence": 0.92,
  "cropBoxes": [
    {"index": 1, "x": 0, "y": 0, "w": 342, "h": 342}
  ],
  "qualityScore": 0.88
}

9. 脚本归一化与分镜映射

9.1 脚本标准 JSON

{
  "language": "zh",
  "globalStyle": "写实电影感",
  "shots": [
    {
      "index": 1,
      "durationSec": 3,
      "action": "角色抬头看向镜头",
      "camera": "轻微推进",
      "mood": "期待",
      "negativePrompt": "抖动,畸变,低清"
    }
  ]
}

9.2 映射策略

  • 默认 shot[i] -> tile[i]
  • 若脚本中有显式编号(如“第3镜头”)优先按编号映射
  • 脚本不足 9 段:补全占位镜头(继承全局风格)
  • 脚本超过 9 段:截断并告知用户

10. 超分链路设计(复用现有能力)

当前已有增强接口:POST /api/enhance

建议:

  1. 抽出服务层(如 lib/image/enhance-service.ts),避免服务端内部再走 HTTP
  2. 增加特性开关 enableTileUpscale,默认 false(预留不启用)
  3. 仅当 enableTileUpscale=true 时,切片后按阈值触发超分(短边 < 768)
  4. 超分失败降级:保留原切片继续后续流程
  5. 记录 enhanceApplied/enhanceProvider/enhanceLatencyMs

11. 调度、重试、降级

11.1 串行调度规则

  • 一次任务 9 段,严格串行
  • 相邻请求间隔 10 秒
  • 任一段失败:指数退避(10s/20s/40s),最多 3 次

11.2 降级模型规则

从后台 AiModel 读取,不硬编码:

  1. 先用当前选中模型
  2. 失败后按 fallbackModelId1 -> fallbackModelId2
  3. 若仍失败,按同 provider 可用模型池挑选

12. 数据库扩展设计(建议新增)

新增任务主表:VideoStoryboardTask

  • id
  • userId
  • chatId
  • providerType(默认 ruxa-video)
  • sourceImageUrl
  • isNineGrid
  • detectionConfidence
  • normalizedScript (jsonb)
  • status(pending/running/partial_success/succeeded/failed/cancelled)
  • currentShot
  • totalShots(固定 9)
  • createdAt/updatedAt/completedAt

新增子任务表:VideoStoryboardShotTask

  • id
  • parentTaskId
  • shotIndex
  • tileImageUrl
  • upscaledImageUrl
  • prompt
  • modelId
  • fallbackChain (jsonb)
  • attemptCount
  • status
  • videoUrl
  • errorCode/errorMessage
  • startedAt/completedAt

13. API 设计(建议新增)

  1. POST /api/video/storyboard/create
    创建九宫格视频任务,返回 taskId

  2. GET /api/video/storyboard/tasks/:taskId
    获取任务与每段进度

  3. POST /api/video/storyboard/tasks/:taskId/cancel
    取消任务

  4. POST /api/jobs/video-storyboard-dispatch
    调度器轮询(可由 cron/pm2 定时触发)


14. 与现有聊天链路集成方式

在 /api/chat 增加分支:

  1. 当前 provider 是否 ruxa-video
  2. 用户是否上传图片
  3. 是否触发九宫格识别(可由配置开关控制)

若命中:

  • 先回 SSE 占位消息(“正在识别九宫格与解析分镜...”)
  • 创建 storyboard 任务
  • 前端按 taskId 轮询并展示 9 段进度
  • 最终输出 9 条视频或合并汇总消息

15. 前端改造点(建议)

  • components/video-params-bar.tsx
    • 新增“九宫格自动分镜”开关(RUXA 模式显示)
  • components/messages.tsx
    • 支持展示分段进度条(1/9 ~ 9/9)
  • components/chat.tsx / components/canvas/CanvasChatPanel.tsx
    • 扩展任务状态卡片(处理中、重试中、降级中)

16. 配置项设计(系统设置)

在系统设置新增 video_storyboard_config:

  • enabled:是否启用九宫格流程
  • providerWhitelist:默认仅 ruxa-video
  • minGridConfidence:默认 0.85
  • enableTileUpscale:是否启用切片超分(默认 false,预留)
  • sliceUpscaleMinEdge:默认 768
  • dispatchIntervalSec:默认 10
  • maxRetry:默认 3
  • enableFallback:默认 true

存储位置:SystemSettings


17. 监控与告警

建议埋点:

  • nine_grid_detect_success_rate
  • nine_grid_misdetect_rate
  • script_normalize_success_rate
  • shot_retry_rate
  • fallback_trigger_rate
  • storyboard_task_success_rate
  • avg_storyboard_total_latency

日志关键词建议统一:

  • [VideoStoryboard]
  • [NineGridDetector]
  • [ScriptNormalizer]
  • [TileUpscaler]
  • [VideoSequencer]

18. 测试与验收

18.1 单元测试

  • 九宫格检测:标准图、弱网格图、非九宫格图
  • 脚本归一:口语化、表格化、混合语言
  • 映射规则:缺段/超段/乱序编号
  • 重试降级:模拟 429、余额不足、超时

18.2 集成测试

  1. 上传九宫格 + 9段脚本 -> 全部成功
  2. 上传九宫格 + 混乱脚本 -> 归一成功
  3. 部分失败 -> 自动重试 + 降级成功
  4. 非九宫格 -> 正常走单图视频

18.3 验收标准

  • 切片正确率 ≥ 95%
  • 9 段任务可追踪、可重试、可取消
  • 不出现并发超限(严格 10 秒间隔)
  • 失败可降级且不丢任务状态

19. 发布计划(建议)

  1. Phase 1:先上“检测 + 归一 + 任务表 + 状态查询”
  2. Phase 2:接入“超分能力预留 + 串行调度”(超分开关保持关闭)
  3. Phase 3:接入降级链路与前端进度 UI
  4. Phase 4:灰度开关 + 指标监控 + 回归优化

20. 风险与规避

  1. 误判九宫格:加入置信度阈值与人工确认分支
  2. 成本过高:超分默认关闭,待效果验证后灰度开启
  3. 任务堆积:DB 队列 + 限流 + 可取消机制
  4. 外部 API 不稳定:重试 + fallback + 错误分级
  5. 多机部署一致性:调度基于 DB 状态机,不依赖内存队列

21. 当前实施状态标记

  • 聊天/画布/3D/AI详情/OSS迁移:已实现并在代码中可见
  • RUXA 九宫格视频技能链:本文档为待开发方案(尚未落地代码)

22. 运维与发布命令(项目现状)

  • 安装依赖:pnpm install --no-frozen-lockfile
  • 数据库迁移:pnpm db:migrate
  • 构建:pnpm build
  • 启动:pnpm start
  • PM2 重启:pm2 restart ai-chatbot || pm2 restart all

23. 附:本方案主要影响文件清单(开发阶段)

新增(建议):

  • lib/video-agent/pipeline/ruxa-nine-grid-pipeline.ts
  • lib/video-agent/skills/script-normalizer.ts
  • lib/video-agent/skills/nine-grid-detector.ts
  • lib/video-agent/skills/tile-upscaler.ts
  • lib/video-agent/skills/storyboard-mapper.ts
  • lib/video-agent/skills/video-sequencer.ts
  • app/api/video/storyboard/create/route.ts
  • app/api/video/storyboard/tasks/[taskId]/route.ts
  • app/api/jobs/video-storyboard-dispatch/route.ts
  • lib/db/migrations/00xx_add_video_storyboard_tasks.sql

修改(建议):

  • app/(chat)/api/chat/route.ts
  • lib/ai/providers/ruxa-video.ts
  • app/(admin)/settings/admin-settings-client.tsx
  • lib/db/schema.ts
  • lib/db/queries.ts