# 系统全链路开发文档(基于当前项目) > 项目:`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 输出结构建议 ```json { "isNineGrid": true, "confidence": 0.92, "cropBoxes": [ {"index": 1, "x": 0, "y": 0, "w": 342, "h": 342} ], "qualityScore": 0.88 } ``` --- ## 9. 脚本归一化与分镜映射 ## 9.1 脚本标准 JSON ```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`