生图片、视频加入到任务 中心,添加风格数据

This commit is contained in:
小帅 2026-03-03 11:36:39 +08:00
parent af4cce8fb6
commit 3153b2b79d
21 changed files with 5640 additions and 226 deletions

1411
output.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -317,6 +317,10 @@ export default async (cells: { prompt: string }[], scriptId: number, projectId:
size: "4K", size: "4K",
aspectRatio: projectInfo?.videoRatio ? (projectInfo.videoRatio as any) : "16:9", aspectRatio: projectInfo?.videoRatio ? (projectInfo.videoRatio as any) : "16:9",
imageBase64: processedImages.map((buf) => buf.toString("base64")), imageBase64: processedImages.map((buf) => buf.toString("base64")),
taskClass: "分镜图生成",
name: `分镜图-${outline?.title || "未知剧集"}`,
describe: prompts,
projectId,
}, },
apiConfig, apiConfig,
); );

1411
src/lib/artStyle.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
import { Knex } from "knex"; import { Knex } from "knex";
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import { artStyle } from "./artStyle";
interface TableSchema { interface TableSchema {
name: string; name: string;
builder: (table: Knex.CreateTableBuilder) => void; builder: (table: Knex.CreateTableBuilder) => void;
@ -160,20 +161,6 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
table.unique(["id"]); table.unique(["id"]);
}, },
}, },
{
name: "t_taskList",
builder: (table) => {
table.integer("id").notNullable();
table.integer("projectName");
table.text("name");
table.text("prompt");
table.text("state");
table.text("startTime");
table.text("endTime");
table.primary(["id"]);
table.unique(["id"]);
},
},
{ {
name: "t_image", name: "t_image",
builder: (table) => { builder: (table) => {
@ -207,6 +194,35 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
}, },
initData: async (knex) => {}, initData: async (knex) => {},
}, },
{
name: "t_myTasks",
builder: (table) => {
table.integer("id").notNullable();
table.integer("projectId");
table.string("taskClass");
table.string("relatedObjects");
table.string("model");
table.text("describe");
table.string("state");
table.integer("startTime");
table.primary(["id"]);
table.unique(["id"]);
},
initData: async (knex) => {},
},
{
name: "t_artStyle",
builder: (table) => {
table.integer("id").notNullable();
table.string("name");
table.text("styles");
table.primary(["id"]);
table.unique(["id"]);
},
initData: async (knex) => {
await knex("t_artStyle").insert(artStyle.map((item, index) => ({ id: index + 1, name: item.name, styles: JSON.stringify(item.styles) })));
},
},
{ {
name: "t_videoConfig", name: "t_videoConfig",
builder: (table) => { builder: (table) => {

View File

@ -1,170 +1,174 @@
// @routes-hash c97cf72361299980ea4b0c43549a0de8 // @routes-hash b847c9a4378ca63b381628ce9b2ebc81
import { Express } from "express"; import { Express } from "express";
import route1 from "./routes/assets/addAssets"; import route1 from "./routes/artStyle/getArtStyle";
import route2 from "./routes/assets/delAssets"; import route2 from "./routes/assets/addAssets";
import route3 from "./routes/assets/delAssetsImage"; import route3 from "./routes/assets/delAssets";
import route4 from "./routes/assets/generateAssets"; import route4 from "./routes/assets/delAssetsImage";
import route5 from "./routes/assets/getAssets"; import route5 from "./routes/assets/generateAssets";
import route6 from "./routes/assets/getImage"; import route6 from "./routes/assets/getAssets";
import route7 from "./routes/assets/getStoryboard"; import route7 from "./routes/assets/getImage";
import route8 from "./routes/assets/polishPrompt"; import route8 from "./routes/assets/getStoryboard";
import route9 from "./routes/assets/saveAssets"; import route9 from "./routes/assets/polishPrompt";
import route10 from "./routes/assets/updateAssets"; import route10 from "./routes/assets/saveAssets";
import route11 from "./routes/index/index"; import route11 from "./routes/assets/updateAssets";
import route12 from "./routes/novel/addNovel"; import route12 from "./routes/index/index";
import route13 from "./routes/novel/delNovel"; import route13 from "./routes/novel/addNovel";
import route14 from "./routes/novel/getNovel"; import route14 from "./routes/novel/delNovel";
import route15 from "./routes/novel/updateNovel"; import route15 from "./routes/novel/getNovel";
import route16 from "./routes/other/clearDatabase"; import route16 from "./routes/novel/updateNovel";
import route17 from "./routes/other/deleteAllData"; import route17 from "./routes/other/clearDatabase";
import route18 from "./routes/other/getCaptcha"; import route18 from "./routes/other/deleteAllData";
import route19 from "./routes/other/login"; import route19 from "./routes/other/getCaptcha";
import route20 from "./routes/other/testAI"; import route20 from "./routes/other/login";
import route21 from "./routes/other/testImage"; import route21 from "./routes/other/testAI";
import route22 from "./routes/other/testVideo"; import route22 from "./routes/other/testImage";
import route23 from "./routes/outline/addOutline"; import route23 from "./routes/other/testVideo";
import route24 from "./routes/outline/agentsOutline"; import route24 from "./routes/outline/addOutline";
import route25 from "./routes/outline/delOutline"; import route25 from "./routes/outline/agentsOutline";
import route26 from "./routes/outline/getHistory"; import route26 from "./routes/outline/delOutline";
import route27 from "./routes/outline/getOutline"; import route27 from "./routes/outline/getHistory";
import route28 from "./routes/outline/getPartScript"; import route28 from "./routes/outline/getOutline";
import route29 from "./routes/outline/getStoryline"; import route29 from "./routes/outline/getPartScript";
import route30 from "./routes/outline/setHistory"; import route30 from "./routes/outline/getStoryline";
import route31 from "./routes/outline/updateOutline"; import route31 from "./routes/outline/setHistory";
import route32 from "./routes/outline/updateScript"; import route32 from "./routes/outline/updateOutline";
import route33 from "./routes/outline/updateStoryline"; import route33 from "./routes/outline/updateScript";
import route34 from "./routes/project/addProject"; import route34 from "./routes/outline/updateStoryline";
import route35 from "./routes/project/delProject"; import route35 from "./routes/project/addProject";
import route36 from "./routes/project/getProject"; import route36 from "./routes/project/delProject";
import route37 from "./routes/project/getProjectCount"; import route37 from "./routes/project/getProject";
import route38 from "./routes/project/getSingleProject"; import route38 from "./routes/project/getProjectCount";
import route39 from "./routes/project/updateProject"; import route39 from "./routes/project/getSingleProject";
import route40 from "./routes/prompt/getPrompts"; import route40 from "./routes/project/updateProject";
import route41 from "./routes/prompt/updatePrompt"; import route41 from "./routes/prompt/getPrompts";
import route42 from "./routes/script/generateScriptApi"; import route42 from "./routes/prompt/updatePrompt";
import route43 from "./routes/script/generateScriptSave"; import route43 from "./routes/script/generateScriptApi";
import route44 from "./routes/script/geScriptApi"; import route44 from "./routes/script/generateScriptSave";
import route45 from "./routes/setting/addModel"; import route45 from "./routes/script/geScriptApi";
import route46 from "./routes/setting/configurationModel"; import route46 from "./routes/setting/addModel";
import route47 from "./routes/setting/delModel"; import route47 from "./routes/setting/configurationModel";
import route48 from "./routes/setting/getAiModelList"; import route48 from "./routes/setting/delModel";
import route49 from "./routes/setting/getAiModelMap"; import route49 from "./routes/setting/getAiModelList";
import route50 from "./routes/setting/getLog"; import route50 from "./routes/setting/getAiModelMap";
import route51 from "./routes/setting/getSetting"; import route51 from "./routes/setting/getLog";
import route52 from "./routes/setting/getVideoModelDetail"; import route52 from "./routes/setting/getSetting";
import route53 from "./routes/setting/getVideoModelList"; import route53 from "./routes/setting/getVideoModelDetail";
import route54 from "./routes/setting/updateModel"; import route54 from "./routes/setting/getVideoModelList";
import route55 from "./routes/setting/updeteModel"; import route55 from "./routes/setting/updateModel";
import route56 from "./routes/storyboard/batchSuperScoreImage"; import route56 from "./routes/setting/updeteModel";
import route57 from "./routes/storyboard/chatStoryboard"; import route57 from "./routes/storyboard/batchSuperScoreImage";
import route58 from "./routes/storyboard/delStoryboard"; import route58 from "./routes/storyboard/chatStoryboard";
import route59 from "./routes/storyboard/generateShotImage"; import route59 from "./routes/storyboard/delStoryboard";
import route60 from "./routes/storyboard/generateStoryboardApi"; import route60 from "./routes/storyboard/generateShotImage";
import route61 from "./routes/storyboard/generateVideoPrompt"; import route61 from "./routes/storyboard/generateStoryboardApi";
import route62 from "./routes/storyboard/getStoryboard"; import route62 from "./routes/storyboard/generateVideoPrompt";
import route63 from "./routes/storyboard/keepStoryboard"; import route63 from "./routes/storyboard/getStoryboard";
import route64 from "./routes/storyboard/saveStoryboard"; import route64 from "./routes/storyboard/keepStoryboard";
import route65 from "./routes/storyboard/uploadImage"; import route65 from "./routes/storyboard/saveStoryboard";
import route66 from "./routes/task/getTaskApi"; import route66 from "./routes/storyboard/uploadImage";
import route67 from "./routes/task/taskDetails"; import route67 from "./routes/task/getMyTaskApi";
import route68 from "./routes/user/getUser"; import route68 from "./routes/task/getTaskCategories";
import route69 from "./routes/user/saveUser"; import route69 from "./routes/task/taskDetails";
import route70 from "./routes/video/addVideo"; import route70 from "./routes/user/getUser";
import route71 from "./routes/video/addVideoConfig"; import route71 from "./routes/user/saveUser";
import route72 from "./routes/video/deleteVideoConfig"; import route72 from "./routes/video/addVideo";
import route73 from "./routes/video/generatePrompt"; import route73 from "./routes/video/addVideoConfig";
import route74 from "./routes/video/generateVideo"; import route74 from "./routes/video/deleteVideoConfig";
import route75 from "./routes/video/getManufacturer"; import route75 from "./routes/video/generatePrompt";
import route76 from "./routes/video/getVideo"; import route76 from "./routes/video/generateVideo";
import route77 from "./routes/video/getVideoConfigs"; import route77 from "./routes/video/getManufacturer";
import route78 from "./routes/video/getVideoModel"; import route78 from "./routes/video/getVideo";
import route79 from "./routes/video/getVideoStoryboards"; import route79 from "./routes/video/getVideoConfigs";
import route80 from "./routes/video/reviseVideoStoryboards"; import route80 from "./routes/video/getVideoModel";
import route81 from "./routes/video/saveVideo"; import route81 from "./routes/video/getVideoStoryboards";
import route82 from "./routes/video/upDateVideoConfig"; import route82 from "./routes/video/reviseVideoStoryboards";
import route83 from "./routes/video/saveVideo";
import route84 from "./routes/video/upDateVideoConfig";
export default async (app: Express) => { export default async (app: Express) => {
app.use("/assets/addAssets", route1); app.use("/artStyle/getArtStyle", route1);
app.use("/assets/delAssets", route2); app.use("/assets/addAssets", route2);
app.use("/assets/delAssetsImage", route3); app.use("/assets/delAssets", route3);
app.use("/assets/generateAssets", route4); app.use("/assets/delAssetsImage", route4);
app.use("/assets/getAssets", route5); app.use("/assets/generateAssets", route5);
app.use("/assets/getImage", route6); app.use("/assets/getAssets", route6);
app.use("/assets/getStoryboard", route7); app.use("/assets/getImage", route7);
app.use("/assets/polishPrompt", route8); app.use("/assets/getStoryboard", route8);
app.use("/assets/saveAssets", route9); app.use("/assets/polishPrompt", route9);
app.use("/assets/updateAssets", route10); app.use("/assets/saveAssets", route10);
app.use("/index", route11); app.use("/assets/updateAssets", route11);
app.use("/novel/addNovel", route12); app.use("/index", route12);
app.use("/novel/delNovel", route13); app.use("/novel/addNovel", route13);
app.use("/novel/getNovel", route14); app.use("/novel/delNovel", route14);
app.use("/novel/updateNovel", route15); app.use("/novel/getNovel", route15);
app.use("/other/clearDatabase", route16); app.use("/novel/updateNovel", route16);
app.use("/other/deleteAllData", route17); app.use("/other/clearDatabase", route17);
app.use("/other/getCaptcha", route18); app.use("/other/deleteAllData", route18);
app.use("/other/login", route19); app.use("/other/getCaptcha", route19);
app.use("/other/testAI", route20); app.use("/other/login", route20);
app.use("/other/testImage", route21); app.use("/other/testAI", route21);
app.use("/other/testVideo", route22); app.use("/other/testImage", route22);
app.use("/outline/addOutline", route23); app.use("/other/testVideo", route23);
app.use("/outline/agentsOutline", route24); app.use("/outline/addOutline", route24);
app.use("/outline/delOutline", route25); app.use("/outline/agentsOutline", route25);
app.use("/outline/getHistory", route26); app.use("/outline/delOutline", route26);
app.use("/outline/getOutline", route27); app.use("/outline/getHistory", route27);
app.use("/outline/getPartScript", route28); app.use("/outline/getOutline", route28);
app.use("/outline/getStoryline", route29); app.use("/outline/getPartScript", route29);
app.use("/outline/setHistory", route30); app.use("/outline/getStoryline", route30);
app.use("/outline/updateOutline", route31); app.use("/outline/setHistory", route31);
app.use("/outline/updateScript", route32); app.use("/outline/updateOutline", route32);
app.use("/outline/updateStoryline", route33); app.use("/outline/updateScript", route33);
app.use("/project/addProject", route34); app.use("/outline/updateStoryline", route34);
app.use("/project/delProject", route35); app.use("/project/addProject", route35);
app.use("/project/getProject", route36); app.use("/project/delProject", route36);
app.use("/project/getProjectCount", route37); app.use("/project/getProject", route37);
app.use("/project/getSingleProject", route38); app.use("/project/getProjectCount", route38);
app.use("/project/updateProject", route39); app.use("/project/getSingleProject", route39);
app.use("/prompt/getPrompts", route40); app.use("/project/updateProject", route40);
app.use("/prompt/updatePrompt", route41); app.use("/prompt/getPrompts", route41);
app.use("/script/generateScriptApi", route42); app.use("/prompt/updatePrompt", route42);
app.use("/script/generateScriptSave", route43); app.use("/script/generateScriptApi", route43);
app.use("/script/geScriptApi", route44); app.use("/script/generateScriptSave", route44);
app.use("/setting/addModel", route45); app.use("/script/geScriptApi", route45);
app.use("/setting/configurationModel", route46); app.use("/setting/addModel", route46);
app.use("/setting/delModel", route47); app.use("/setting/configurationModel", route47);
app.use("/setting/getAiModelList", route48); app.use("/setting/delModel", route48);
app.use("/setting/getAiModelMap", route49); app.use("/setting/getAiModelList", route49);
app.use("/setting/getLog", route50); app.use("/setting/getAiModelMap", route50);
app.use("/setting/getSetting", route51); app.use("/setting/getLog", route51);
app.use("/setting/getVideoModelDetail", route52); app.use("/setting/getSetting", route52);
app.use("/setting/getVideoModelList", route53); app.use("/setting/getVideoModelDetail", route53);
app.use("/setting/updateModel", route54); app.use("/setting/getVideoModelList", route54);
app.use("/setting/updeteModel", route55); app.use("/setting/updateModel", route55);
app.use("/storyboard/batchSuperScoreImage", route56); app.use("/setting/updeteModel", route56);
app.use("/storyboard/chatStoryboard", route57); app.use("/storyboard/batchSuperScoreImage", route57);
app.use("/storyboard/delStoryboard", route58); app.use("/storyboard/chatStoryboard", route58);
app.use("/storyboard/generateShotImage", route59); app.use("/storyboard/delStoryboard", route59);
app.use("/storyboard/generateStoryboardApi", route60); app.use("/storyboard/generateShotImage", route60);
app.use("/storyboard/generateVideoPrompt", route61); app.use("/storyboard/generateStoryboardApi", route61);
app.use("/storyboard/getStoryboard", route62); app.use("/storyboard/generateVideoPrompt", route62);
app.use("/storyboard/keepStoryboard", route63); app.use("/storyboard/getStoryboard", route63);
app.use("/storyboard/saveStoryboard", route64); app.use("/storyboard/keepStoryboard", route64);
app.use("/storyboard/uploadImage", route65); app.use("/storyboard/saveStoryboard", route65);
app.use("/task/getTaskApi", route66); app.use("/storyboard/uploadImage", route66);
app.use("/task/taskDetails", route67); app.use("/task/getMyTaskApi", route67);
app.use("/user/getUser", route68); app.use("/task/getTaskCategories", route68);
app.use("/user/saveUser", route69); app.use("/task/taskDetails", route69);
app.use("/video/addVideo", route70); app.use("/user/getUser", route70);
app.use("/video/addVideoConfig", route71); app.use("/user/saveUser", route71);
app.use("/video/deleteVideoConfig", route72); app.use("/video/addVideo", route72);
app.use("/video/generatePrompt", route73); app.use("/video/addVideoConfig", route73);
app.use("/video/generateVideo", route74); app.use("/video/deleteVideoConfig", route74);
app.use("/video/getManufacturer", route75); app.use("/video/generatePrompt", route75);
app.use("/video/getVideo", route76); app.use("/video/generateVideo", route76);
app.use("/video/getVideoConfigs", route77); app.use("/video/getManufacturer", route77);
app.use("/video/getVideoModel", route78); app.use("/video/getVideo", route78);
app.use("/video/getVideoStoryboards", route79); app.use("/video/getVideoConfigs", route79);
app.use("/video/reviseVideoStoryboards", route80); app.use("/video/getVideoModel", route80);
app.use("/video/saveVideo", route81); app.use("/video/getVideoStoryboards", route81);
app.use("/video/upDateVideoConfig", route82); app.use("/video/reviseVideoStoryboards", route82);
app.use("/video/saveVideo", route83);
app.use("/video/upDateVideoConfig", route84);
} }

View File

@ -0,0 +1,19 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
name: z.string(),
}),
async (req, res) => {
const { name } = req.body;
const data = await u.db("t_artStyle").where("name", name).select("styles").first();
const styles = data?.styles ? JSON.parse(data.styles) : [];
res.status(200).send(success(styles));
},
);

View File

@ -123,8 +123,13 @@ export default router.post(
state: "生成中", state: "生成中",
assetsId: id, assetsId: id,
}); });
const apiConfig = await u.getPromptAi("assetsImage"); let taskClass = "";
if (type == "role") taskClass = "角色图生成";
if (type == "scene") taskClass = "场景图生成";
if (type == "props") taskClass = "道具图生成";
if (type == "storyboard") taskClass = "分镜图生成";
const apiConfig = await u.getPromptAi("assetsImage");
try { try {
const contentStr = await u.ai.image( const contentStr = await u.ai.image(
{ {
@ -133,6 +138,10 @@ export default router.post(
imageBase64: base64 ? [base64] : [], imageBase64: base64 ? [base64] : [],
size: "2K", size: "2K",
aspectRatio: "16:9", aspectRatio: "16:9",
taskClass: taskClass,
name: name,
describe: prompt,
projectId: projectId,
}, },
apiConfig, apiConfig,
); );
@ -171,7 +180,6 @@ export default router.post(
filePath: imagePath, filePath: imagePath,
type: insertType, type: insertType,
}); });
const path = await u.oss.getFileUrl(imagePath!); const path = await u.oss.getFileUrl(imagePath!);
// const state = await u.db("t_assets").where("id", id).select("state").first(); // const state = await u.db("t_assets").where("id", id).select("state").first();

View File

@ -24,6 +24,10 @@ export default router.post(
imageBase64: [], imageBase64: [],
aspectRatio: "16:9", aspectRatio: "16:9",
size: "1K", size: "1K",
taskClass: "测试任务",
name: "测试图片生成",
describe: "测试语言模型生成图片",
projectId: 0,
}, },
{ {
model: modelName, model: modelName,

View File

@ -28,6 +28,10 @@ export default router.post(
aspectRatio: "16:9", aspectRatio: "16:9",
audio: false, audio: false,
mode: "single", mode: "single",
taskClass: "测试视频生成",
name: "测试视频生成",
describe: "测试视频生成",
projectId: 0,
}, },
{ {
model: modelName, model: modelName,

View File

@ -27,6 +27,10 @@ async function superResolutionAndSave(src: string, projectId: number, videoRatio
systemPrompt: "你的核心任务是将所给的图片超分到 1K ,不改变图片任何内容,仅改变分辨率", systemPrompt: "你的核心任务是将所给的图片超分到 1K ,不改变图片任何内容,仅改变分辨率",
prompt: "你的核心任务是将所给的图片超分到 1K ,不改变图片任何内容,仅改变分辨率", prompt: "你的核心任务是将所给的图片超分到 1K ,不改变图片任何内容,仅改变分辨率",
imageBase64: [await urlToBase64(src)], imageBase64: [await urlToBase64(src)],
taskClass: "分镜图超分",
name: `分镜图超分-${v4()}`,
describe: `原始图片链接: ${src}`,
projectId,
}, },
apiConfig, apiConfig,
); );

View File

@ -4,50 +4,45 @@ import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware"; import { validateFields } from "@/middleware/middleware";
import { number, z } from "zod"; import { number, z } from "zod";
const router = express.Router(); const router = express.Router();
export default router.post(
export default router.get(
"/", "/",
validateFields({ validateFields({
projectName: z.string(), state: z.string().optional().nullable(),
taskName: z.string(), taskClass: z.string().optional().nullable(),
state: z.string(),
page: z.number(), page: z.number(),
limit: z.number(), limit: z.number(),
projectId: z.number(),
}), }),
async (req, res) => { async (req, res) => {
const { projectName, taskName, state, page = 1, limit = 10 }: any = req.query; const { taskClass, state, page = 1, limit = 10, projectId }: any = req.body;
const offset = (page - 1) * limit; const offset = (page - 1) * limit;
const data = await u const data = await u
.db("t_taskList") .db("t_myTasks")
.where("projectId", projectId)
.andWhere((qb) => { .andWhere((qb) => {
if (projectName) { if (taskClass) {
qb.andWhere("t_taskList.projectName", projectName); qb.andWhere("t_myTasks.taskClass", taskClass);
}
if (taskName) {
qb.andWhere("t_taskList.name", taskName);
} }
if (state) { if (state) {
qb.andWhere("t_taskList.state", state); qb.andWhere("t_myTasks.state", state);
} }
}) })
.select("*") .select("*")
.offset(offset) .offset(offset)
.limit(limit); .limit(limit);
const totalQuery = (await u const totalQuery = (await u
.db("t_taskList") .db("t_myTasks")
.where("projectId", projectId)
.andWhere((qb) => { .andWhere((qb) => {
if (projectName) { if (taskClass) {
qb.andWhere("t_taskList.projectName", projectName); qb.andWhere("t_myTasks.taskClass", taskClass);
}
if (taskName) {
qb.andWhere("t_taskList.name", taskName);
} }
if (state) { if (state) {
qb.andWhere("t_taskList.state", state); qb.andWhere("t_myTasks.state", state);
} }
}) })
.count("* as total") .count("* as total")
.first()) as any; .first()) as any;
res.status(200).send(success({ data, total: totalQuery?.total })); res.status(200).send(success({ data, total: totalQuery?.total }));
} },
); );

View File

@ -0,0 +1,17 @@
import express from "express";
import u from "@/utils";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import { number, z } from "zod";
const router = express.Router();
export default router.post(
"/",
validateFields({
projectId: z.number(),
}),
async (req, res) => {
const data = await u.db("t_myTasks").where("projectId", req.body.projectId).select("taskClass").groupBy("taskClass");
res.status(200).send(success(data));
},
);

View File

@ -177,6 +177,10 @@ ${prompt}
resolution: resolution as any, resolution: resolution as any,
audio: audioEnabled, audio: audioEnabled,
mode: mode as any, mode: mode as any,
taskClass: "视频生成",
name: `视频生成-${videoId}`,
describe: `视频生成,时长${duration}秒,分辨率${resolution}`,
projectId,
}, },
{ {
baseURL: aiConfigData?.baseUrl!, baseURL: aiConfigData?.baseUrl!,

View File

@ -1,4 +1,4 @@
// @db-hash 0f9789bd5ad2eebd79bd502988efcb4e // @db-hash 4073740ecb78a07f69489a53512e9b4d
//该文件由脚本自动生成,请勿手动修改 //该文件由脚本自动生成,请勿手动修改
export interface t_aiModelMap { export interface t_aiModelMap {
@ -7,6 +7,11 @@ export interface t_aiModelMap {
'key'?: string | null; 'key'?: string | null;
'name'?: string | null; 'name'?: string | null;
} }
export interface t_artStyle {
'id'?: number;
'name'?: string | null;
'styles'?: string | null;
}
export interface t_assets { export interface t_assets {
'duration'?: string | null; 'duration'?: string | null;
'episode'?: string | null; 'episode'?: string | null;
@ -59,6 +64,16 @@ export interface t_imageModel {
'model'?: string | null; 'model'?: string | null;
'type'?: string | null; 'type'?: string | null;
} }
export interface t_myTasks {
'describe'?: string | null;
'id'?: number;
'model'?: string | null;
'projectId'?: number | null;
'relatedObjects'?: string | null;
'startTime'?: number | null;
'state'?: string | null;
'taskClass'?: string | null;
}
export interface t_novel { export interface t_novel {
'chapter'?: string | null; 'chapter'?: string | null;
'chapterData'?: string | null; 'chapterData'?: string | null;
@ -115,15 +130,6 @@ export interface t_storyline {
'novelIds'?: string | null; 'novelIds'?: string | null;
'projectId'?: number | null; 'projectId'?: number | null;
} }
export interface t_taskList {
'endTime'?: string | null;
'id'?: number;
'name'?: string | null;
'projectName'?: number | null;
'prompt'?: string | null;
'startTime'?: string | null;
'state'?: string | null;
}
export interface t_textModel { export interface t_textModel {
'id'?: number; 'id'?: number;
'image'?: number | null; 'image'?: number | null;
@ -183,11 +189,13 @@ export interface t_videoModel {
export interface DB { export interface DB {
"t_aiModelMap": t_aiModelMap; "t_aiModelMap": t_aiModelMap;
"t_artStyle": t_artStyle;
"t_assets": t_assets; "t_assets": t_assets;
"t_chatHistory": t_chatHistory; "t_chatHistory": t_chatHistory;
"t_config": t_config; "t_config": t_config;
"t_image": t_image; "t_image": t_image;
"t_imageModel": t_imageModel; "t_imageModel": t_imageModel;
"t_myTasks": t_myTasks;
"t_novel": t_novel; "t_novel": t_novel;
"t_outline": t_outline; "t_outline": t_outline;
"t_project": t_project; "t_project": t_project;
@ -195,7 +203,6 @@ export interface DB {
"t_script": t_script; "t_script": t_script;
"t_setting": t_setting; "t_setting": t_setting;
"t_storyline": t_storyline; "t_storyline": t_storyline;
"t_taskList": t_taskList;
"t_textModel": t_textModel; "t_textModel": t_textModel;
"t_user": t_user; "t_user": t_user;
"t_video": t_video; "t_video": t_video;

View File

@ -12,6 +12,7 @@ import other from "./owned/other";
import gemini from "./owned/gemini"; import gemini from "./owned/gemini";
import modelScope from "./owned/modelScope"; import modelScope from "./owned/modelScope";
import grsai from "./owned/grsai"; import grsai from "./owned/grsai";
import { tr } from "zod/locales";
const urlToBase64 = async (url: string): Promise<string> => { const urlToBase64 = async (url: string): Promise<string> => {
const res = await axios.get(url, { responseType: "arraybuffer" }); const res = await axios.get(url, { responseType: "arraybuffer" });
@ -29,20 +30,31 @@ const modelInstance = {
// apimart: apimart, // apimart: apimart,
modelScope, modelScope,
other, other,
grsai grsai,
} as const; } as const;
export default async (input: ImageConfig, config: AIConfig) => { export default async (input: ImageConfig, config: AIConfig) => {
const { model, apiKey, baseURL, manufacturer } = { ...config }; const { model, apiKey, baseURL, manufacturer } = { ...config };
if (!config || !config?.model || !config?.apiKey || !config?.manufacturer) throw new Error("请检查模型配置是否正确"); if (!config || !config?.model || !config?.apiKey || !config?.manufacturer) throw new Error("请检查模型配置是否正确");
const manufacturerFn = modelInstance[manufacturer as keyof typeof modelInstance]; const manufacturerFn = modelInstance[manufacturer as keyof typeof modelInstance];
if (!manufacturerFn) if (!manufacturerFn) throw new Error("不支持的图片厂商"); if (!manufacturerFn) if (!manufacturerFn) throw new Error("不支持的图片厂商");
// if (manufacturer !== "other") { // if (manufacturer !== "other") {
// const owned = modelList.find((m) => m.model === model); // const owned = modelList.find((m) => m.model === model);
// if (!owned) throw new Error("不支持的模型"); // if (!owned) throw new Error("不支持的模型");
// } // }
//添加到任务中心
const [taskId] = await u.db("t_myTasks").insert({
taskClass: input.taskClass,
relatedObjects: input.name,
model: config?.model ? config.model : "未知模型",
describe: input.describe ? input.describe : "无",
state: "进行中",
startTime: Date.now(),
projectId: input.projectId,
});
// 补充图片的 base64 内容类型字符串 // 补充图片的 base64 内容类型字符串
if (input.imageBase64 && input.imageBase64.length > 0) { if (input.imageBase64 && input.imageBase64.length > 0) {
input.imageBase64 = input.imageBase64.map((img) => { input.imageBase64 = input.imageBase64.map((img) => {
@ -66,9 +78,18 @@ export default async (input: ImageConfig, config: AIConfig) => {
return `data:image/png;base64,${img}`; return `data:image/png;base64,${img}`;
}); });
} }
try {
let imageUrl = await manufacturerFn(input, { model, apiKey, baseURL }); let imageUrl = await manufacturerFn(input, { model, apiKey, baseURL });
if (!input.resType) input.resType = "b64"; if (!input.resType) input.resType = "b64";
if (input.resType === "b64" && imageUrl.startsWith("http")) imageUrl = await urlToBase64(imageUrl); if (input.resType === "b64" && imageUrl.startsWith("http")) imageUrl = await urlToBase64(imageUrl);
return imageUrl; await u.db("t_myTasks").where("id", taskId).update({
state: "已完成",
});
return imageUrl;
} catch (error) {
await u.db("t_myTasks").where("id", taskId).update({
state: "生成失败",
});
throw error;
}
}; };

View File

@ -5,6 +5,10 @@ interface ImageConfig {
size: "1K" | "2K" | "4K"; size: "1K" | "2K" | "4K";
aspectRatio: string; aspectRatio: string;
resType?: "url" | "b64"; resType?: "url" | "b64";
taskClass: string;
name: string;
describe: string;
projectId: number;
} }
interface AIConfig { interface AIConfig {

View File

@ -21,7 +21,7 @@ const modelInstance = {
runninghub: runninghub, runninghub: runninghub,
apimart: apimart, apimart: apimart,
other: other, other: other,
grsai:grsai grsai: grsai,
} as const; } as const;
export default async (input: VideoConfig, config?: AIConfig) => { export default async (input: VideoConfig, config?: AIConfig) => {
@ -32,7 +32,16 @@ export default async (input: VideoConfig, config?: AIConfig) => {
if (!manufacturerFn) if (!manufacturerFn) throw new Error("不支持的视频厂商"); if (!manufacturerFn) if (!manufacturerFn) throw new Error("不支持的视频厂商");
// const owned = modelList.find((m) => m.model === model); // const owned = modelList.find((m) => m.model === model);
// if (!owned) throw new Error("不支持的模型"); // if (!owned) throw new Error("不支持的模型");
//添加到任务中心
const [taskId] = await u.db("t_myTasks").insert({
taskClass: input.taskClass,
relatedObjects: input.name,
model: config?.model ? config.model : "未知模型",
describe: input.describe ? input.describe : "无",
state: "进行中",
startTime: Date.now(),
projectId: input.projectId,
});
// 补充图片的 base64 内容类型字符串 // 补充图片的 base64 内容类型字符串
if (input.imageBase64 && input.imageBase64.length > 0) { if (input.imageBase64 && input.imageBase64.length > 0) {
input.imageBase64 = input.imageBase64.map((img) => { input.imageBase64 = input.imageBase64.map((img) => {
@ -59,9 +68,19 @@ export default async (input: VideoConfig, config?: AIConfig) => {
let videoUrl = await manufacturerFn(input, { model, apiKey, baseURL }); let videoUrl = await manufacturerFn(input, { model, apiKey, baseURL });
if (videoUrl) { if (videoUrl) {
const response = await axios.get(videoUrl, { responseType: "stream" }); try {
await u.oss.writeFile(input.savePath, response.data); const response = await axios.get(videoUrl, { responseType: "stream" });
return input.savePath; await u.oss.writeFile(input.savePath, response.data);
await u.db("t_myTasks").where("id", taskId).update({
state: "已完成",
});
return input.savePath;
} catch (err) {
await u.db("t_myTasks").where("id", taskId).update({
state: "生成失败",
});
return videoUrl;
}
} }
return videoUrl; return videoUrl;
}; };

View File

@ -7,6 +7,10 @@ interface VideoConfig {
imageBase64?: string[]; imageBase64?: string[];
audio?: boolean; audio?: boolean;
mode: "startEnd" | "multi" | "single" | "text"; mode: "startEnd" | "multi" | "single" | "text";
taskClass: string;
name: string;
projectId: number;
describe?: string;
} }
interface AIConfig { interface AIConfig {

View File

@ -88,6 +88,10 @@ export default async (images: Record<string, string>, directive: string, project
imageBase64: base64Images, imageBase64: base64Images,
aspectRatio: aspectRatio ? aspectRatio : "16:9", aspectRatio: aspectRatio ? aspectRatio : "16:9",
size: "1K", size: "1K",
taskClass: "图片编辑",
name: `图片编辑-${uuid()}`,
describe: `编辑指令: ${directive}`,
projectId,
}, },
apiConfig, apiConfig,
); );

File diff suppressed because it is too large Load Diff