接入视频

This commit is contained in:
小帅 2026-03-20 22:46:26 +08:00
parent b989085ef5
commit 92c0bc7e52
5 changed files with 183 additions and 106 deletions

View File

@ -1,4 +1,4 @@
// @routes-hash 45e23a536a13265ff62fe92b1cb71fe3
// @routes-hash ee45dd26b9149e6eabf834c1fb5cfbb6
import { Express } from "express";
import route1 from "./routes/agents/clearMemory";
@ -36,33 +36,34 @@ import route32 from "./routes/novel/updateNovel";
import route33 from "./routes/other/deleteAllData";
import route34 from "./routes/other/getCaptcha";
import route35 from "./routes/production/getProductionData";
import route36 from "./routes/production/workbench/getVideoModelDetail";
import route37 from "./routes/project/addProject";
import route38 from "./routes/project/delProject";
import route39 from "./routes/project/editProject";
import route40 from "./routes/project/getProject";
import route41 from "./routes/script/addScript";
import route42 from "./routes/script/delScript";
import route43 from "./routes/script/getScrptApi";
import route44 from "./routes/script/updateScript";
import route45 from "./routes/setting/agentDeploy/deployAgentModel";
import route46 from "./routes/setting/agentDeploy/getAgentDeploy";
import route47 from "./routes/setting/agentDeploy/updateKey";
import route48 from "./routes/setting/dbConfig/clearData";
import route49 from "./routes/setting/getTextModel";
import route50 from "./routes/setting/loginConfig/getUser";
import route51 from "./routes/setting/loginConfig/updateUserPwd";
import route52 from "./routes/setting/memoryConfig/getMemory";
import route53 from "./routes/setting/memoryConfig/sureMemory";
import route54 from "./routes/setting/vendorConfig/addVendor";
import route55 from "./routes/setting/vendorConfig/deleteVendor";
import route56 from "./routes/setting/vendorConfig/getVendorList";
import route57 from "./routes/setting/vendorConfig/modelTest";
import route58 from "./routes/setting/vendorConfig/updateVendor";
import route59 from "./routes/task/getMyTaskApi";
import route60 from "./routes/task/getTaskCategories";
import route61 from "./routes/task/taskDetails";
import route62 from "./routes/test/test";
import route36 from "./routes/production/workbench/generateVideo";
import route37 from "./routes/production/workbench/getVideoModelDetail";
import route38 from "./routes/project/addProject";
import route39 from "./routes/project/delProject";
import route40 from "./routes/project/editProject";
import route41 from "./routes/project/getProject";
import route42 from "./routes/script/addScript";
import route43 from "./routes/script/delScript";
import route44 from "./routes/script/getScrptApi";
import route45 from "./routes/script/updateScript";
import route46 from "./routes/setting/agentDeploy/deployAgentModel";
import route47 from "./routes/setting/agentDeploy/getAgentDeploy";
import route48 from "./routes/setting/agentDeploy/updateKey";
import route49 from "./routes/setting/dbConfig/clearData";
import route50 from "./routes/setting/getTextModel";
import route51 from "./routes/setting/loginConfig/getUser";
import route52 from "./routes/setting/loginConfig/updateUserPwd";
import route53 from "./routes/setting/memoryConfig/getMemory";
import route54 from "./routes/setting/memoryConfig/sureMemory";
import route55 from "./routes/setting/vendorConfig/addVendor";
import route56 from "./routes/setting/vendorConfig/deleteVendor";
import route57 from "./routes/setting/vendorConfig/getVendorList";
import route58 from "./routes/setting/vendorConfig/modelTest";
import route59 from "./routes/setting/vendorConfig/updateVendor";
import route60 from "./routes/task/getMyTaskApi";
import route61 from "./routes/task/getTaskCategories";
import route62 from "./routes/task/taskDetails";
import route63 from "./routes/test/test";
export default async (app: Express) => {
app.use("/api/agents/clearMemory", route1);
@ -100,31 +101,32 @@ export default async (app: Express) => {
app.use("/api/other/deleteAllData", route33);
app.use("/api/other/getCaptcha", route34);
app.use("/api/production/getProductionData", route35);
app.use("/api/production/workbench/getVideoModelDetail", route36);
app.use("/api/project/addProject", route37);
app.use("/api/project/delProject", route38);
app.use("/api/project/editProject", route39);
app.use("/api/project/getProject", route40);
app.use("/api/script/addScript", route41);
app.use("/api/script/delScript", route42);
app.use("/api/script/getScrptApi", route43);
app.use("/api/script/updateScript", route44);
app.use("/api/setting/agentDeploy/deployAgentModel", route45);
app.use("/api/setting/agentDeploy/getAgentDeploy", route46);
app.use("/api/setting/agentDeploy/updateKey", route47);
app.use("/api/setting/dbConfig/clearData", route48);
app.use("/api/setting/getTextModel", route49);
app.use("/api/setting/loginConfig/getUser", route50);
app.use("/api/setting/loginConfig/updateUserPwd", route51);
app.use("/api/setting/memoryConfig/getMemory", route52);
app.use("/api/setting/memoryConfig/sureMemory", route53);
app.use("/api/setting/vendorConfig/addVendor", route54);
app.use("/api/setting/vendorConfig/deleteVendor", route55);
app.use("/api/setting/vendorConfig/getVendorList", route56);
app.use("/api/setting/vendorConfig/modelTest", route57);
app.use("/api/setting/vendorConfig/updateVendor", route58);
app.use("/api/task/getMyTaskApi", route59);
app.use("/api/task/getTaskCategories", route60);
app.use("/api/task/taskDetails", route61);
app.use("/api/test/test", route62);
app.use("/api/production/workbench/generateVideo", route36);
app.use("/api/production/workbench/getVideoModelDetail", route37);
app.use("/api/project/addProject", route38);
app.use("/api/project/delProject", route39);
app.use("/api/project/editProject", route40);
app.use("/api/project/getProject", route41);
app.use("/api/script/addScript", route42);
app.use("/api/script/delScript", route43);
app.use("/api/script/getScrptApi", route44);
app.use("/api/script/updateScript", route45);
app.use("/api/setting/agentDeploy/deployAgentModel", route46);
app.use("/api/setting/agentDeploy/getAgentDeploy", route47);
app.use("/api/setting/agentDeploy/updateKey", route48);
app.use("/api/setting/dbConfig/clearData", route49);
app.use("/api/setting/getTextModel", route50);
app.use("/api/setting/loginConfig/getUser", route51);
app.use("/api/setting/loginConfig/updateUserPwd", route52);
app.use("/api/setting/memoryConfig/getMemory", route53);
app.use("/api/setting/memoryConfig/sureMemory", route54);
app.use("/api/setting/vendorConfig/addVendor", route55);
app.use("/api/setting/vendorConfig/deleteVendor", route56);
app.use("/api/setting/vendorConfig/getVendorList", route57);
app.use("/api/setting/vendorConfig/modelTest", route58);
app.use("/api/setting/vendorConfig/updateVendor", route59);
app.use("/api/task/getMyTaskApi", route60);
app.use("/api/task/getTaskCategories", route61);
app.use("/api/task/taskDetails", route62);
app.use("/api/test/test", route63);
}

View File

@ -6,34 +6,38 @@ import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
type: z.enum(["text", "image", "video", "all"]),
}),
async (req, res) => {
const { type } = req.body;
const data = await u.db("o_vendorConfig").select("id", "models", "name").first();
if (!data) {
return res.status(404).send({ error: "模型未找到" });
}
const models = JSON.parse(data.models!);
if (type === "all") {
const allData = models.filter((item: { type: string }) => item.type !== "video").map((item: { name: string; modelName: string; type: string }) => ({
id: data.id,
label: item.name,
value: item.modelName,
type: item.type,
name: data.name,
}));
return res.status(200).send(success(allData));
}
const filteredData = models.filter((item: { type: string }) => item.type === type).map((item: { name: string; modelName: string; type: string }) => ({
id: data.id,
label: item.name,
value: item.modelName,
type: item.type,
name: data.name,
}));
res.status(200).send(success(filteredData));
"/",
validateFields({
type: z.enum(["text", "image", "video", "all"]),
}),
async (req, res) => {
const { type } = req.body;
const data = await u.db("o_vendorConfig").select("id", "models", "name").first();
if (!data) {
return res.status(404).send({ error: "模型未找到" });
}
const models = JSON.parse(data.models!);
if (type === "all") {
const allData = models
.filter((item: { type: string }) => item.type !== "video")
.map((item: { name: string; modelName: string; type: string }) => ({
id: data.id,
label: item.name,
value: item.modelName,
type: item.type,
name: data.name,
}));
return res.status(200).send(success(allData));
}
const filteredData = models
.filter((item: { type: string }) => item.type === type)
.map((item: { name: string; modelName: string; type: string }) => ({
id: data.id,
label: item.name,
value: item.modelName,
type: item.type,
name: data.name,
}));
res.status(200).send(success(filteredData));
},
);

View File

@ -0,0 +1,70 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { v4 as uuidv4 } from "uuid";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
scriptId: z.number(),
projectId: z.number(),
storyboardId: z.number(),
prompt: z.string(),
imageData: z.array(z.string()).optional(),
model: z.string(),
duration: z.number(),
resolution: z.string(),
audio: z.boolean().optional(),
modeData: z.string(),
}),
async (req, res) => {
const { scriptId, projectId, storyboardId, prompt, imageData, model, duration, resolution, audio, modeData } = req.body;
console.log("%c Line:24 🍡 req.body", "background:#b03734", req.body);
try {
const relatedObjects = {
id: storyboardId,
projectId,
type: "视频",
};
const systemPrompt = `你是一个专业的视频生成引擎,能够根据用户提供的提示词、图片和参数生成高质量的视频内容。请严格按照用户的需求进行视频创作,确保输出的视频符合以下要求:
1.
2.
3.
4.
5. `;
const videoPath = `/${projectId}/video/${uuidv4()}.mp4`;
const aiVideo = u.Ai.Video(model);
await aiVideo.run({
systemPrompt, // 系统提示词
projectId: projectId,
storyboardId: storyboardId,
prompt: prompt,
imageData: imageData,
modeData: modeData,
duration: duration,
resolution: resolution,
audio: audio,
taskClass: "视频生成",
describe: "根据提示词生成视频",
relatedObjects: JSON.stringify(relatedObjects),
});
await aiVideo.save(videoPath); // 保存视频
//保存视频信息到数据库
// await u.db("o_video").insert({
// resolution,
// prompt,
// filePath: videoPath,
// model,
// time: new Date(),
// state: "生成成功",
// scriptId: scriptId,
// });
res.status(200).send(success("视频生成成功"));
} catch (error) {
res.status(500).send({ error: "视频生成失败" });
}
},
);

View File

@ -40,16 +40,9 @@ const vendorConfigSchema = z.object({
modelName: z.string(),
type: z.literal("video"),
mode: z.array(
z.enum([
"singleImage",
"multiImage",
"gridImage",
"startEndRequired",
"endFrameOptional",
"startFrameOptional",
"text",
"audioReference",
"videoReference",
z.union([
z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]),
z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])),
]),
),
audio: z.union([z.literal("optional"), z.boolean()]),
@ -100,16 +93,9 @@ export default router.post(
modelName: z.string(),
type: z.literal("video"),
mode: z.array(
z.enum([
"singleImage",
"multiImage",
"gridImage",
"startEndRequired",
"endFrameOptional",
"startFrameOptional",
"text",
"audioReference",
"videoReference",
z.union([
z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]),
z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])),
]),
),
audio: z.union([z.literal("optional"), z.boolean()]),

View File

@ -112,13 +112,28 @@ class AiImage {
return this;
}
}
interface VideoConfig {
projectId: number; // 项目ID
storyboardId: number; // 关联的分镜ID
systemPrompt?: string; // 系统提示词
prompt: string; //视频提示词
imageData: string[]; //输入的图片提示词
modeData: string; //模式
duration: number; // 视频时长,单位秒
resolution: string; // 视频分辨率
audio: boolean; // 是否需要配音
taskClass: string; // 任务分类
describe: string; // 任务描述
relatedObjects: string; // 相关对象信息,便于后续分析和追踪
}
class AiVideo {
private key: `${number}:${string}`;
private result: string = "";
constructor(key: `${number}:${string}`) {
this.key = key;
}
async run(input: ImageConfig) {
async run(input: VideoConfig) {
return withTaskRecord(this.key, input.taskClass, input.describe, input.relatedObjects, input.projectId, async (modelName) => {
const fn = await getVendorTemplateFn("videoRequest", modelName);
this.result = await fn(input);
@ -137,7 +152,7 @@ class AiAudio {
constructor(key: `${number}:${string}`) {
this.key = key;
}
async run(input: ImageConfig) {
async run(input: VideoConfig) {
return withTaskRecord(this.key, input.taskClass, input.describe, input.relatedObjects, input.projectId, async (modelName) => {
const fn = await getVendorTemplateFn("ttsRequest", modelName);
this.result = await fn(input);