Merge branch '108' of https://github.com/HBAI-Ltd/Toonflow-app into 108
This commit is contained in:
commit
73ce27c55d
@ -14,8 +14,9 @@ export default router.post(
|
|||||||
const { ids } = req.body;
|
const { ids } = req.body;
|
||||||
const data = await u
|
const data = await u
|
||||||
.db("o_assets")
|
.db("o_assets")
|
||||||
.leftJoin("o_image", "o_assets.id", "o_image.assetsId")
|
.leftJoin("o_image", "o_assets.imageId", "o_image.id")
|
||||||
.whereIn("o_assets.id", ids)
|
.whereIn("o_assets.id", ids)
|
||||||
|
.whereNot("o_image.state", "生成中")
|
||||||
.select("o_image.state", "o_assets.id", "o_image.filePath");
|
.select("o_image.state", "o_assets.id", "o_image.filePath");
|
||||||
const result = await Promise.all(
|
const result = await Promise.all(
|
||||||
data.map(async (item: any) => ({
|
data.map(async (item: any) => ({
|
||||||
|
|||||||
@ -12,7 +12,7 @@ export default router.post(
|
|||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { ids } = req.body;
|
const { ids } = req.body;
|
||||||
const data = await u.db("o_assets").whereIn("id", ids).select("*");
|
const data = await u.db("o_assets").whereIn("id", ids).whereNot("promptState", "生成中").select("*");
|
||||||
res.status(200).send(success(data));
|
res.status(200).send(success(data));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -88,21 +88,18 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
|
|||||||
state: "生成中",
|
state: "生成中",
|
||||||
assetsId: item.id,
|
assetsId: item.id,
|
||||||
});
|
});
|
||||||
|
await u.db("o_assets").where("id", item.id).update({ imageId });
|
||||||
totalNovelId.push(imageId);
|
totalNovelId.push(imageId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 按并发数限制并发生成
|
// 3. 后台异步并发生成,不阻塞响应
|
||||||
const limit = pLimit(concurrentCount ?? 1);
|
const limit = pLimit(concurrentCount ?? 1);
|
||||||
const results: { assetsId: number; success: boolean; path?: string; message?: string }[] = [];
|
|
||||||
|
|
||||||
const tasks = items.map((item: { id: number; type: string; name: string; prompt: string; base64: string | null | undefined }, index: number) =>
|
const tasks = items.map((item: { id: number; type: string; name: string; prompt: string; base64: string | null | undefined }, index: number) =>
|
||||||
limit(async () => {
|
limit(async () => {
|
||||||
const imageId = totalNovelId[index];
|
const imageId = totalNovelId[index];
|
||||||
const cfg = assetTypeConfig[item.type as AssetType];
|
const cfg = assetTypeConfig[item.type as AssetType];
|
||||||
if (!cfg) {
|
if (!cfg) return;
|
||||||
results.push({ assetsId: item.id, success: false, message: `不支持的类型: ${item.type}` });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await u.db("o_assets").where("id", item.id).update({ imageId });
|
await u.db("o_assets").where("id", item.id).update({ imageId });
|
||||||
|
|
||||||
@ -126,10 +123,7 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
|
|||||||
aiImage.save(imagePath);
|
aiImage.save(imagePath);
|
||||||
|
|
||||||
const imageData = await u.db("o_image").where("id", imageId).select("*").first();
|
const imageData = await u.db("o_image").where("id", imageId).select("*").first();
|
||||||
if (!imageData) {
|
if (!imageData) return;
|
||||||
results.push({ assetsId: item.id, success: false, message: "资产已被删除" });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await u
|
await u
|
||||||
.db("o_image")
|
.db("o_image")
|
||||||
@ -142,28 +136,15 @@ export default router.post("/", validateFields(requestSchema), async (req, res)
|
|||||||
resolution,
|
resolution,
|
||||||
});
|
});
|
||||||
|
|
||||||
const path = await u.oss.getFileUrl(imagePath);
|
|
||||||
await u.db("o_assets").where("id", item.id).update({ imageId });
|
await u.db("o_assets").where("id", item.id).update({ imageId });
|
||||||
|
|
||||||
results.push({ assetsId: item.id, success: true, path });
|
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
await u.db("o_image").where("id", imageId).update({ state: "生成失败" });
|
await u.db("o_image").where("id", imageId).update({ state: "生成失败" });
|
||||||
results.push({ assetsId: item.id, success: false, message: u.error(e).message || "图片生成失败" });
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
await Promise.all(tasks);
|
// 后台执行,不等待结果
|
||||||
|
Promise.all(tasks).catch(() => {});
|
||||||
|
|
||||||
const successCount = results.filter((r) => r.success).length;
|
return res.status(200).send(success({ total: items.length }));
|
||||||
const failCount = results.filter((r) => !r.success).length;
|
|
||||||
|
|
||||||
return res.status(200).send(
|
|
||||||
success({
|
|
||||||
total: items.length,
|
|
||||||
successCount,
|
|
||||||
failCount,
|
|
||||||
results,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -99,17 +99,13 @@ export default router.post(
|
|||||||
const assetsIds = items.map((item: { assetsId: number }) => item.assetsId);
|
const assetsIds = items.map((item: { assetsId: number }) => item.assetsId);
|
||||||
await u.db("o_assets").whereIn("id", assetsIds).update({ promptState: "生成中" });
|
await u.db("o_assets").whereIn("id", assetsIds).update({ promptState: "生成中" });
|
||||||
|
|
||||||
// 按并发数限制并发生成
|
// 后台异步并发生成,不阻塞响应
|
||||||
const limit = pLimit(concurrentCount ?? 1);
|
const limit = pLimit(concurrentCount ?? 1);
|
||||||
const results: { assetsId: number; success: boolean; prompt?: string; message?: string }[] = [];
|
|
||||||
|
|
||||||
const tasks = items.map((item: { assetsId: number; type: string; name: string; describe: string }) =>
|
const tasks = items.map((item: { assetsId: number; type: string; name: string; describe: string }) =>
|
||||||
limit(async () => {
|
limit(async () => {
|
||||||
const config = typeConfig[item.type];
|
const config = typeConfig[item.type];
|
||||||
if (!config) {
|
if (!config) return;
|
||||||
results.push({ assetsId: item.assetsId, success: false, message: "不支持的类型" });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
findItemByName(result, item.name, config.itemType);
|
findItemByName(result, item.name, config.itemType);
|
||||||
|
|
||||||
@ -137,25 +133,20 @@ export default router.post(
|
|||||||
})) as any;
|
})) as any;
|
||||||
|
|
||||||
if (!_output) {
|
if (!_output) {
|
||||||
results.push({ assetsId: item.assetsId, success: false, message: "生成结果为空" });
|
|
||||||
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
|
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await u.db("o_assets").where("id", item.assetsId).update({ prompt: _output, promptState: "已完成" });
|
await u.db("o_assets").where("id", item.assetsId).update({ prompt: _output, promptState: "已完成" });
|
||||||
results.push({ assetsId: item.assetsId, success: true, prompt: _output });
|
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
|
await u.db("o_assets").where("id", item.assetsId).update({ promptState: "生成失败" });
|
||||||
results.push({ assetsId: item.assetsId, success: false, message: e?.data?.error?.message ?? e?.message ?? "生成失败" });
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
await Promise.all(tasks);
|
// 后台执行,不等待结果
|
||||||
|
Promise.all(tasks).catch(() => {});
|
||||||
|
|
||||||
const successCount = results.filter((r) => r.success).length;
|
return res.status(200).send(success({ total: items.length }));
|
||||||
const failCount = results.filter((r) => !r.success).length;
|
|
||||||
|
|
||||||
return res.status(200).send(success({ total: items.length, successCount, failCount, results }));
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -90,7 +90,8 @@ export default router.post(
|
|||||||
const errorMsg = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join("; ");
|
const errorMsg = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join("; ");
|
||||||
return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`));
|
return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`));
|
||||||
}
|
}
|
||||||
if (vendor.id.include(":")) return res.status(400).send(error("id不能包含英文冒号"));
|
|
||||||
|
if ((vendor.id as string).includes(":")) return res.status(400).send(error("id不能包含英文冒号"));
|
||||||
await u.db("o_vendorConfig").insert({
|
await u.db("o_vendorConfig").insert({
|
||||||
id: vendor.id,
|
id: vendor.id,
|
||||||
author: vendor.author,
|
author: vendor.author,
|
||||||
|
|||||||
8
src/types/database.d.ts
vendored
8
src/types/database.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
// @db-hash 8e5f2b7a28d4494b291d802b055b6399
|
// @db-hash 05ecfd675f848d88631c1a546996caea
|
||||||
//该文件由脚本自动生成,请勿手动修改
|
//该文件由脚本自动生成,请勿手动修改
|
||||||
|
|
||||||
export interface memories {
|
export interface memories {
|
||||||
@ -7,7 +7,6 @@ export interface memories {
|
|||||||
'embedding'?: string | null;
|
'embedding'?: string | null;
|
||||||
'id'?: string;
|
'id'?: string;
|
||||||
'isolationKey': string;
|
'isolationKey': string;
|
||||||
'name'?: string | null;
|
|
||||||
'relatedMessageIds'?: string | null;
|
'relatedMessageIds'?: string | null;
|
||||||
'role'?: string | null;
|
'role'?: string | null;
|
||||||
'summarized'?: number | null;
|
'summarized'?: number | null;
|
||||||
@ -47,6 +46,7 @@ export interface o_assets {
|
|||||||
'name'?: string | null;
|
'name'?: string | null;
|
||||||
'projectId'?: number | null;
|
'projectId'?: number | null;
|
||||||
'prompt'?: string | null;
|
'prompt'?: string | null;
|
||||||
|
'promptState'?: string | null;
|
||||||
'remark'?: string | null;
|
'remark'?: string | null;
|
||||||
'scriptId'?: number | null;
|
'scriptId'?: number | null;
|
||||||
'startTime'?: number | null;
|
'startTime'?: number | null;
|
||||||
@ -121,11 +121,13 @@ export interface o_project {
|
|||||||
export interface o_prompt {
|
export interface o_prompt {
|
||||||
'id'?: number;
|
'id'?: number;
|
||||||
'name'?: string | null;
|
'name'?: string | null;
|
||||||
'rompt'?: string | null;
|
'prompt'?: string | null;
|
||||||
}
|
}
|
||||||
export interface o_script {
|
export interface o_script {
|
||||||
'content'?: string | null;
|
'content'?: string | null;
|
||||||
'createTime'?: number | null;
|
'createTime'?: number | null;
|
||||||
|
'errorReason'?: string | null;
|
||||||
|
'extractState'?: number | null;
|
||||||
'id'?: number;
|
'id'?: number;
|
||||||
'name'?: string | null;
|
'name'?: string | null;
|
||||||
'projectId'?: number | null;
|
'projectId'?: number | null;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user