Merge branch '108' of https://github.com/HBAI-Ltd/Toonflow-app into 108
# Conflicts: # src/router.ts
This commit is contained in:
commit
ab0db069b5
2910
data/web/index.html
2910
data/web/index.html
File diff suppressed because one or more lines are too long
@ -91,5 +91,10 @@
|
|||||||
"nodemon": "^3.1.11",
|
"nodemon": "^3.1.11",
|
||||||
"tsx": "^4.21.0",
|
"tsx": "^4.21.0",
|
||||||
"typescript": "^5.9.3"
|
"typescript": "^5.9.3"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"@rmp135/sql-ts": {
|
||||||
|
"better-sqlite3": "^12.8.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -164,6 +164,10 @@ app.whenReady().then(async () => {
|
|||||||
windowismaximized: () => ({
|
windowismaximized: () => ({
|
||||||
maximized: mainWindow?.isMaximized() ?? false,
|
maximized: mainWindow?.isMaximized() ?? false,
|
||||||
}),
|
}),
|
||||||
|
openDevTool: () => {
|
||||||
|
mainWindow?.webContents.openDevTools();
|
||||||
|
return { ok: true };
|
||||||
|
},
|
||||||
};
|
};
|
||||||
const handler = handlers[pathname];
|
const handler = handlers[pathname];
|
||||||
const responseData = handler ? handler() : { error: "未知接口" };
|
const responseData = handler ? handler() : { error: "未知接口" };
|
||||||
|
|||||||
@ -159,6 +159,10 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
|
|||||||
key: "modelDtype",
|
key: "modelDtype",
|
||||||
value: "fp16",
|
value: "fp16",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: "switchAiDevTool",
|
||||||
|
value: "0",
|
||||||
|
},
|
||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -371,26 +375,10 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
|
|||||||
{
|
{
|
||||||
name: "o_vendorConfig",
|
name: "o_vendorConfig",
|
||||||
builder: (table) => {
|
builder: (table) => {
|
||||||
table.integer("id").notNullable();
|
table.string("id").notNullable();
|
||||||
|
table.text("author");
|
||||||
|
table.text("description");
|
||||||
table.text("name");
|
table.text("name");
|
||||||
table.text("version");
|
|
||||||
table.text("icon");
|
|
||||||
table.text("inputs"); // 输入项配置 JSON
|
|
||||||
table.text("inputValues"); // 输入项值 JSON
|
|
||||||
table.text("models"); // 模型配置 JSON
|
|
||||||
table.text("code"); // 模型配置 JSON
|
|
||||||
table.integer("createTime");
|
|
||||||
table.primary(["id"]);
|
|
||||||
table.unique(["id"]);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
//供应商配置表
|
|
||||||
{
|
|
||||||
name: "o_vendorConfig",
|
|
||||||
builder: (table) => {
|
|
||||||
table.integer("id").notNullable();
|
|
||||||
table.text("name");
|
|
||||||
table.text("version");
|
|
||||||
table.text("icon");
|
table.text("icon");
|
||||||
table.text("inputs"); // 输入项配置 JSON
|
table.text("inputs"); // 输入项配置 JSON
|
||||||
table.text("inputValues"); // 输入项值 JSON
|
table.text("inputValues"); // 输入项值 JSON
|
||||||
|
|||||||
102
src/router.ts
102
src/router.ts
@ -1,4 +1,4 @@
|
|||||||
// @routes-hash 9559cc3a8cb0291f04970e9ba299265f
|
// @routes-hash 57463134da0d81d65d10c163ee8a2b26
|
||||||
import { Express } from "express";
|
import { Express } from "express";
|
||||||
|
|
||||||
import route1 from "./routes/agents/clearMemory";
|
import route1 from "./routes/agents/clearMemory";
|
||||||
@ -76,30 +76,32 @@ import route72 from "./routes/setting/agentDeploy/agentSetKey";
|
|||||||
import route73 from "./routes/setting/agentDeploy/deployAgentModel";
|
import route73 from "./routes/setting/agentDeploy/deployAgentModel";
|
||||||
import route74 from "./routes/setting/agentDeploy/getAgentDeploy";
|
import route74 from "./routes/setting/agentDeploy/getAgentDeploy";
|
||||||
import route75 from "./routes/setting/dbConfig/clearData";
|
import route75 from "./routes/setting/dbConfig/clearData";
|
||||||
import route76 from "./routes/setting/fileManagement/openFolder";
|
import route76 from "./routes/setting/dev/getSwitchAiDevTool";
|
||||||
import route77 from "./routes/setting/getTextModel";
|
import route77 from "./routes/setting/dev/updateSwitchAiDevTool";
|
||||||
import route78 from "./routes/setting/loginConfig/getUser";
|
import route78 from "./routes/setting/fileManagement/openFolder";
|
||||||
import route79 from "./routes/setting/loginConfig/updateUserPwd";
|
import route79 from "./routes/setting/getTextModel";
|
||||||
import route80 from "./routes/setting/memoryConfig/delAllMemory";
|
import route80 from "./routes/setting/loginConfig/getUser";
|
||||||
import route81 from "./routes/setting/memoryConfig/getMemory";
|
import route81 from "./routes/setting/loginConfig/updateUserPwd";
|
||||||
import route82 from "./routes/setting/memoryConfig/sureMemory";
|
import route82 from "./routes/setting/memoryConfig/delAllMemory";
|
||||||
import route83 from "./routes/setting/skillManagement/addSkill";
|
import route83 from "./routes/setting/memoryConfig/getMemory";
|
||||||
import route84 from "./routes/setting/skillManagement/deleteSkill";
|
import route84 from "./routes/setting/memoryConfig/sureMemory";
|
||||||
import route85 from "./routes/setting/skillManagement/embeddingSkill";
|
import route85 from "./routes/setting/skillManagement/addSkill";
|
||||||
import route86 from "./routes/setting/skillManagement/generateDescription";
|
import route86 from "./routes/setting/skillManagement/deleteSkill";
|
||||||
import route87 from "./routes/setting/skillManagement/getSkillList";
|
import route87 from "./routes/setting/skillManagement/embeddingSkill";
|
||||||
import route88 from "./routes/setting/skillManagement/scanSkills";
|
import route88 from "./routes/setting/skillManagement/generateDescription";
|
||||||
import route89 from "./routes/setting/skillManagement/updateSkill";
|
import route89 from "./routes/setting/skillManagement/getSkillList";
|
||||||
import route90 from "./routes/setting/vendorConfig/addVendor";
|
import route90 from "./routes/setting/skillManagement/scanSkills";
|
||||||
import route91 from "./routes/setting/vendorConfig/deleteVendor";
|
import route91 from "./routes/setting/skillManagement/updateSkill";
|
||||||
import route92 from "./routes/setting/vendorConfig/getVendorList";
|
import route92 from "./routes/setting/vendorConfig/addVendor";
|
||||||
import route93 from "./routes/setting/vendorConfig/modelTest";
|
import route93 from "./routes/setting/vendorConfig/deleteVendor";
|
||||||
import route94 from "./routes/setting/vendorConfig/updateVendor";
|
import route94 from "./routes/setting/vendorConfig/getVendorList";
|
||||||
import route95 from "./routes/task/getProject";
|
import route95 from "./routes/setting/vendorConfig/modelTest";
|
||||||
import route96 from "./routes/task/getTaskApi";
|
import route96 from "./routes/setting/vendorConfig/updateVendor";
|
||||||
import route97 from "./routes/task/getTaskCategories";
|
import route97 from "./routes/task/getProject";
|
||||||
import route98 from "./routes/task/taskDetails";
|
import route98 from "./routes/task/getTaskApi";
|
||||||
import route99 from "./routes/test/test";
|
import route99 from "./routes/task/getTaskCategories";
|
||||||
|
import route100 from "./routes/task/taskDetails";
|
||||||
|
import route101 from "./routes/test/test";
|
||||||
|
|
||||||
export default async (app: Express) => {
|
export default async (app: Express) => {
|
||||||
app.use("/api/agents/clearMemory", route1);
|
app.use("/api/agents/clearMemory", route1);
|
||||||
@ -177,28 +179,30 @@ export default async (app: Express) => {
|
|||||||
app.use("/api/setting/agentDeploy/deployAgentModel", route73);
|
app.use("/api/setting/agentDeploy/deployAgentModel", route73);
|
||||||
app.use("/api/setting/agentDeploy/getAgentDeploy", route74);
|
app.use("/api/setting/agentDeploy/getAgentDeploy", route74);
|
||||||
app.use("/api/setting/dbConfig/clearData", route75);
|
app.use("/api/setting/dbConfig/clearData", route75);
|
||||||
app.use("/api/setting/fileManagement/openFolder", route76);
|
app.use("/api/setting/dev/getSwitchAiDevTool", route76);
|
||||||
app.use("/api/setting/getTextModel", route77);
|
app.use("/api/setting/dev/updateSwitchAiDevTool", route77);
|
||||||
app.use("/api/setting/loginConfig/getUser", route78);
|
app.use("/api/setting/fileManagement/openFolder", route78);
|
||||||
app.use("/api/setting/loginConfig/updateUserPwd", route79);
|
app.use("/api/setting/getTextModel", route79);
|
||||||
app.use("/api/setting/memoryConfig/delAllMemory", route80);
|
app.use("/api/setting/loginConfig/getUser", route80);
|
||||||
app.use("/api/setting/memoryConfig/getMemory", route81);
|
app.use("/api/setting/loginConfig/updateUserPwd", route81);
|
||||||
app.use("/api/setting/memoryConfig/sureMemory", route82);
|
app.use("/api/setting/memoryConfig/delAllMemory", route82);
|
||||||
app.use("/api/setting/skillManagement/addSkill", route83);
|
app.use("/api/setting/memoryConfig/getMemory", route83);
|
||||||
app.use("/api/setting/skillManagement/deleteSkill", route84);
|
app.use("/api/setting/memoryConfig/sureMemory", route84);
|
||||||
app.use("/api/setting/skillManagement/embeddingSkill", route85);
|
app.use("/api/setting/skillManagement/addSkill", route85);
|
||||||
app.use("/api/setting/skillManagement/generateDescription", route86);
|
app.use("/api/setting/skillManagement/deleteSkill", route86);
|
||||||
app.use("/api/setting/skillManagement/getSkillList", route87);
|
app.use("/api/setting/skillManagement/embeddingSkill", route87);
|
||||||
app.use("/api/setting/skillManagement/scanSkills", route88);
|
app.use("/api/setting/skillManagement/generateDescription", route88);
|
||||||
app.use("/api/setting/skillManagement/updateSkill", route89);
|
app.use("/api/setting/skillManagement/getSkillList", route89);
|
||||||
app.use("/api/setting/vendorConfig/addVendor", route90);
|
app.use("/api/setting/skillManagement/scanSkills", route90);
|
||||||
app.use("/api/setting/vendorConfig/deleteVendor", route91);
|
app.use("/api/setting/skillManagement/updateSkill", route91);
|
||||||
app.use("/api/setting/vendorConfig/getVendorList", route92);
|
app.use("/api/setting/vendorConfig/addVendor", route92);
|
||||||
app.use("/api/setting/vendorConfig/modelTest", route93);
|
app.use("/api/setting/vendorConfig/deleteVendor", route93);
|
||||||
app.use("/api/setting/vendorConfig/updateVendor", route94);
|
app.use("/api/setting/vendorConfig/getVendorList", route94);
|
||||||
app.use("/api/task/getProject", route95);
|
app.use("/api/setting/vendorConfig/modelTest", route95);
|
||||||
app.use("/api/task/getTaskApi", route96);
|
app.use("/api/setting/vendorConfig/updateVendor", route96);
|
||||||
app.use("/api/task/getTaskCategories", route97);
|
app.use("/api/task/getProject", route97);
|
||||||
app.use("/api/task/taskDetails", route98);
|
app.use("/api/task/getTaskApi", route98);
|
||||||
app.use("/api/test/test", route99);
|
app.use("/api/task/getTaskCategories", route99);
|
||||||
|
app.use("/api/task/taskDetails", route100);
|
||||||
|
app.use("/api/test/test", route101);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -88,7 +88,6 @@ export default router.post(
|
|||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
const storyboardData = await u.db("o_storyboard").where("scriptId", episodesId);
|
const storyboardData = await u.db("o_storyboard").where("scriptId", episodesId);
|
||||||
console.log("%c Line:90 🍡 storyboardData", "background:#ed9ec7", storyboardData.length);
|
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
storyboardData.map(async (i) => {
|
storyboardData.map(async (i) => {
|
||||||
if (i.filePath) {
|
if (i.filePath) {
|
||||||
@ -165,6 +164,7 @@ export default router.post(
|
|||||||
const buildStoryboardItem = (i: (typeof storyboardData)[number], existing: any = {}) => ({
|
const buildStoryboardItem = (i: (typeof storyboardData)[number], existing: any = {}) => ({
|
||||||
...existing,
|
...existing,
|
||||||
id: i.id,
|
id: i.id,
|
||||||
|
index: i.index,
|
||||||
title: i.title,
|
title: i.title,
|
||||||
description: i.description,
|
description: i.description,
|
||||||
camera: i.camera,
|
camera: i.camera,
|
||||||
@ -199,8 +199,7 @@ export default router.post(
|
|||||||
orderedStoryboard.push(buildStoryboardItem(i));
|
orderedStoryboard.push(buildStoryboardItem(i));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
flowData.storyboard = orderedStoryboard.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
||||||
flowData.storyboard = orderedStoryboard;
|
|
||||||
res.status(200).send(success(flowData));
|
res.status(200).send(success(flowData));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
res.status(400).send(error());
|
res.status(400).send(error());
|
||||||
|
|||||||
@ -13,7 +13,7 @@ export default router.post(
|
|||||||
const { scriptId } = req.body;
|
const { scriptId } = req.body;
|
||||||
|
|
||||||
//查询分镜数据
|
//查询分镜数据
|
||||||
const storyboards = await u.db("o_storyboard").where("o_storyboard.scriptId", scriptId).select("*").orderBy("o_storyboard.createTime", "asc");
|
const storyboards = await u.db("o_storyboard").where("o_storyboard.scriptId", scriptId).select("*").orderBy("index", "asc");
|
||||||
|
|
||||||
const storyboardsList = await Promise.all(
|
const storyboardsList = await Promise.all(
|
||||||
storyboards.map(async (item) => {
|
storyboards.map(async (item) => {
|
||||||
|
|||||||
@ -12,7 +12,7 @@ export default router.post(
|
|||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { scriptId } = req.body;
|
const { scriptId } = req.body;
|
||||||
const storyboardData = await u.db("o_storyboard").where({ scriptId });
|
const storyboardData = await u.db("o_storyboard").where({ scriptId }).orderBy("index", "asc");
|
||||||
const data = await Promise.all(
|
const data = await Promise.all(
|
||||||
storyboardData.map(async (i) => {
|
storyboardData.map(async (i) => {
|
||||||
return {
|
return {
|
||||||
@ -83,7 +83,6 @@ export default router.post(
|
|||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
res.status(200).send(success(result));
|
res.status(200).send(success(result));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
11
src/routes/setting/dev/getSwitchAiDevTool.ts
Normal file
11
src/routes/setting/dev/getSwitchAiDevTool.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import express from "express";
|
||||||
|
import { success, error } from "@/lib/responseFormat";
|
||||||
|
import u from "@/utils";
|
||||||
|
import initDB from "@/lib/initDB";
|
||||||
|
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
export default router.get("/", async (req, res) => {
|
||||||
|
const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first();
|
||||||
|
res.status(200).send(success(switchAiDevTool?.value || "0"));
|
||||||
|
});
|
||||||
20
src/routes/setting/dev/updateSwitchAiDevTool.ts
Normal file
20
src/routes/setting/dev/updateSwitchAiDevTool.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
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({
|
||||||
|
switchAiDevTool: z.string(),
|
||||||
|
}),
|
||||||
|
async (req, res) => {
|
||||||
|
const { switchAiDevTool } = req.body;
|
||||||
|
await u.db("o_setting").where("key", "switchAiDevTool").update({
|
||||||
|
value: switchAiDevTool,
|
||||||
|
});
|
||||||
|
res.status(200).send(success("保存设置成功"));
|
||||||
|
},
|
||||||
|
);
|
||||||
@ -8,9 +8,11 @@ import { transform } from "sucrase";
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
const vendorConfigSchema = z.object({
|
const vendorConfigSchema = z.object({
|
||||||
version: z.number(),
|
id: z.string(),
|
||||||
icon: z.string().optional(),
|
author: z.string(),
|
||||||
|
description: z.string().optional(),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
|
icon: z.string().optional(),
|
||||||
inputs: z.array(
|
inputs: z.array(
|
||||||
z.object({
|
z.object({
|
||||||
key: z.string(),
|
key: z.string(),
|
||||||
@ -41,16 +43,19 @@ const vendorConfigSchema = z.object({
|
|||||||
modelName: z.string(),
|
modelName: z.string(),
|
||||||
type: z.literal("video"),
|
type: z.literal("video"),
|
||||||
mode: z.array(
|
mode: z.array(
|
||||||
z.enum([
|
z.union([
|
||||||
"singleImage",
|
z.enum([
|
||||||
"multiImage",
|
"singleImage",
|
||||||
"gridImage",
|
"multiImage",
|
||||||
"startEndRequired",
|
"gridImage",
|
||||||
"endFrameOptional",
|
"startEndRequired",
|
||||||
"startFrameOptional",
|
"endFrameOptional",
|
||||||
"text",
|
"startFrameOptional",
|
||||||
"audioReference",
|
"text",
|
||||||
"videoReference",
|
"audioReference",
|
||||||
|
"videoReference",
|
||||||
|
]),
|
||||||
|
z.array(z.enum(["video", "image", "audio", "text"])),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
audio: z.union([z.literal("optional"), z.boolean()]),
|
audio: z.union([z.literal("optional"), z.boolean()]),
|
||||||
@ -87,12 +92,14 @@ export default router.post(
|
|||||||
return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`));
|
return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`));
|
||||||
}
|
}
|
||||||
await u.db("o_vendorConfig").insert({
|
await u.db("o_vendorConfig").insert({
|
||||||
|
id: vendor.id,
|
||||||
|
author: vendor.author,
|
||||||
|
description: vendor.description || "",
|
||||||
name: vendor.name,
|
name: vendor.name,
|
||||||
version: vendor.version.toString(),
|
|
||||||
icon: vendor.icon || "",
|
icon: vendor.icon || "",
|
||||||
inputs: JSON.stringify(vendor.inputs),
|
inputs: JSON.stringify(vendor.inputs ?? []),
|
||||||
inputValues: JSON.stringify(vendor.inputValues),
|
inputValues: JSON.stringify(vendor.inputValues ?? {}),
|
||||||
models: JSON.stringify(vendor.models),
|
models: JSON.stringify(vendor.models ?? []),
|
||||||
code: tsCode,
|
code: tsCode,
|
||||||
createTime: Date.now(),
|
createTime: Date.now(),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -7,7 +7,7 @@ const router = express.Router();
|
|||||||
export default router.post(
|
export default router.post(
|
||||||
"/",
|
"/",
|
||||||
validateFields({
|
validateFields({
|
||||||
id: z.number(),
|
id: z.string(),
|
||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { id } = req.body;
|
const { id } = req.body;
|
||||||
|
|||||||
@ -11,12 +11,11 @@ export default router.post(
|
|||||||
"/",
|
"/",
|
||||||
validateFields({
|
validateFields({
|
||||||
modelName: z.string(),
|
modelName: z.string(),
|
||||||
apiKey: z.string(),
|
|
||||||
type: z.enum(["text", "video", "image"]),
|
type: z.enum(["text", "video", "image"]),
|
||||||
id: z.number(),
|
id: z.string(),
|
||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { modelName, apiKey, type, id } = req.body;
|
const { modelName, type, id } = req.body;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const requestFn: Record<string, { fnName: string; modelData?: any }> = {
|
const requestFn: Record<string, { fnName: string; modelData?: any }> = {
|
||||||
@ -69,12 +68,16 @@ export default router.post(
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (type == "text") {
|
if (type == "text") {
|
||||||
const resTextData = await u.Ai.Text(`${id}:${modelName}`).invoke({
|
const { textStream } = await u.Ai.Text(`${id}:${modelName}`).stream({
|
||||||
prompt: "请调用工具获取火星的天气,并回答我多少气温",
|
prompt: "请调用工具获取火星的天气,并回答我多少气温",
|
||||||
tools: { getWeatherTool },
|
tools: { getWeatherTool },
|
||||||
});
|
});
|
||||||
|
let fullResponse = "";
|
||||||
res.status(200).send(success(resTextData.text));
|
for await (const chunk of textStream) {
|
||||||
|
fullResponse += chunk;
|
||||||
|
}
|
||||||
|
console.log("%c Line:78 🥝 fullResponse", "background:#ea7e5c", fullResponse);
|
||||||
|
res.status(200).send(success(fullResponse));
|
||||||
} else {
|
} else {
|
||||||
const aiTypeFn = {
|
const aiTypeFn = {
|
||||||
image: "Image",
|
image: "Image",
|
||||||
|
|||||||
@ -7,9 +7,11 @@ import { transform } from "sucrase";
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
const vendorConfigSchema = z.object({
|
const vendorConfigSchema = z.object({
|
||||||
version: z.number(),
|
id: z.string(),
|
||||||
icon: z.string().optional(),
|
author: z.string(),
|
||||||
|
description: z.string().optional(),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
|
icon: z.string().optional(),
|
||||||
inputs: z.array(
|
inputs: z.array(
|
||||||
z.object({
|
z.object({
|
||||||
key: z.string(),
|
key: z.string(),
|
||||||
@ -41,8 +43,18 @@ const vendorConfigSchema = z.object({
|
|||||||
type: z.literal("video"),
|
type: z.literal("video"),
|
||||||
mode: z.array(
|
mode: z.array(
|
||||||
z.union([
|
z.union([
|
||||||
z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]),
|
z.enum([
|
||||||
z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])),
|
"singleImage",
|
||||||
|
"multiImage",
|
||||||
|
"gridImage",
|
||||||
|
"startEndRequired",
|
||||||
|
"endFrameOptional",
|
||||||
|
"startFrameOptional",
|
||||||
|
"text",
|
||||||
|
"audioReference",
|
||||||
|
"videoReference",
|
||||||
|
]),
|
||||||
|
z.array(z.enum(["video", "image", "audio", "text"])),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
audio: z.union([z.literal("optional"), z.boolean()]),
|
audio: z.union([z.literal("optional"), z.boolean()]),
|
||||||
@ -60,9 +72,8 @@ const vendorConfigSchema = z.object({
|
|||||||
export default router.post(
|
export default router.post(
|
||||||
"/",
|
"/",
|
||||||
validateFields({
|
validateFields({
|
||||||
id: z.number(),
|
id: z.string(),
|
||||||
tsCode: z.string(),
|
tsCode: z.string(),
|
||||||
icon: z.string().optional(),
|
|
||||||
inputValues: z.record(z.string(), z.string()),
|
inputValues: z.record(z.string(), z.string()),
|
||||||
inputs: z.array(
|
inputs: z.array(
|
||||||
z.object({
|
z.object({
|
||||||
@ -108,11 +119,9 @@ export default router.post(
|
|||||||
}),
|
}),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
name: z.string().optional(),
|
|
||||||
version: z.string().optional(),
|
|
||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { id, tsCode, name, version, models, inputs, inputValues, icon } = req.body;
|
const { id, tsCode, name, models, inputs, inputValues, icon } = req.body;
|
||||||
|
|
||||||
const jsCode = transform(tsCode, { transforms: ["typescript"] }).code;
|
const jsCode = transform(tsCode, { transforms: ["typescript"] }).code;
|
||||||
const exports = u.vm(jsCode);
|
const exports = u.vm(jsCode);
|
||||||
@ -158,9 +167,6 @@ export default router.post(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let updatedTsCode = tsCode;
|
let updatedTsCode = tsCode;
|
||||||
updatedTsCode = replacePrimitiveValue(updatedTsCode, "name", name ?? vendor.name);
|
|
||||||
updatedTsCode = replacePrimitiveValue(updatedTsCode, "version", version ? Number(version) : vendor.version);
|
|
||||||
updatedTsCode = replacePrimitiveValue(updatedTsCode, "icon", icon ?? vendor.icon ?? "");
|
|
||||||
updatedTsCode = replaceBlockValue(updatedTsCode, "inputs", JSON.stringify(inputs ?? vendor.inputs, null, 2));
|
updatedTsCode = replaceBlockValue(updatedTsCode, "inputs", JSON.stringify(inputs ?? vendor.inputs, null, 2));
|
||||||
updatedTsCode = replaceBlockValue(updatedTsCode, "inputValues", JSON.stringify(inputValues ?? vendor.inputValues, null, 2));
|
updatedTsCode = replaceBlockValue(updatedTsCode, "inputValues", JSON.stringify(inputValues ?? vendor.inputValues, null, 2));
|
||||||
updatedTsCode = replaceBlockValue(updatedTsCode, "models", JSON.stringify(models ?? vendor.models, null, 2));
|
updatedTsCode = replaceBlockValue(updatedTsCode, "models", JSON.stringify(models ?? vendor.models, null, 2));
|
||||||
@ -169,9 +175,6 @@ export default router.post(
|
|||||||
.db("o_vendorConfig")
|
.db("o_vendorConfig")
|
||||||
.where("id", id)
|
.where("id", id)
|
||||||
.update({
|
.update({
|
||||||
name: name ? name : vendor.name,
|
|
||||||
version: version ? version.toString() : vendor.version.toString(),
|
|
||||||
icon: icon ? icon : vendor.icon || "",
|
|
||||||
inputs: inputs ? JSON.stringify(inputs) : JSON.stringify(vendor.inputs),
|
inputs: inputs ? JSON.stringify(inputs) : JSON.stringify(vendor.inputs),
|
||||||
inputValues: inputValues ? JSON.stringify(inputValues) : JSON.stringify(vendor.inputValues),
|
inputValues: inputValues ? JSON.stringify(inputValues) : JSON.stringify(vendor.inputValues),
|
||||||
models: models ? JSON.stringify(models) : JSON.stringify(vendor.models),
|
models: models ? JSON.stringify(models) : JSON.stringify(vendor.models),
|
||||||
|
|||||||
39
src/types/database.d.ts
vendored
39
src/types/database.d.ts
vendored
@ -1,36 +1,6 @@
|
|||||||
// @db-hash 579a004cc745580469a24ee71f5f51c3
|
// @db-hash 0041ea9843a4bb46f03412c516ec323b
|
||||||
//该文件由脚本自动生成,请勿手动修改
|
//该文件由脚本自动生成,请勿手动修改
|
||||||
|
|
||||||
export interface _o_project_old_20260326 {
|
|
||||||
'artStyle'?: string | null;
|
|
||||||
'createTime'?: number | null;
|
|
||||||
'id'?: number | null;
|
|
||||||
'intro'?: string | null;
|
|
||||||
'name'?: string | null;
|
|
||||||
'projectType'?: string | null;
|
|
||||||
'type'?: string | null;
|
|
||||||
'userId'?: number | null;
|
|
||||||
'videoRatio'?: string | null;
|
|
||||||
}
|
|
||||||
export interface _o_storyboard_old_20260325 {
|
|
||||||
'camera'?: string | null;
|
|
||||||
'createTime'?: number | null;
|
|
||||||
'description'?: string | null;
|
|
||||||
'duration'?: string | null;
|
|
||||||
'filePath'?: string | null;
|
|
||||||
'frameMode'?: string | null;
|
|
||||||
'id'?: number;
|
|
||||||
'lines'?: string | null;
|
|
||||||
'mode'?: string | null;
|
|
||||||
'model'?: string | null;
|
|
||||||
'prompt'?: string | null;
|
|
||||||
'reason'?: string | null;
|
|
||||||
'resolution'?: string | null;
|
|
||||||
'scriptId'?: number | null;
|
|
||||||
'sound'?: string | null;
|
|
||||||
'state'?: string | null;
|
|
||||||
'title'?: string | null;
|
|
||||||
}
|
|
||||||
export interface memories {
|
export interface memories {
|
||||||
'content': string;
|
'content': string;
|
||||||
'createTime': number;
|
'createTime': number;
|
||||||
@ -215,15 +185,16 @@ export interface o_user {
|
|||||||
'password'?: string | null;
|
'password'?: string | null;
|
||||||
}
|
}
|
||||||
export interface o_vendorConfig {
|
export interface o_vendorConfig {
|
||||||
|
'author'?: string | null;
|
||||||
'code'?: string | null;
|
'code'?: string | null;
|
||||||
'createTime'?: number | null;
|
'createTime'?: number | null;
|
||||||
|
'description'?: string | null;
|
||||||
'icon'?: string | null;
|
'icon'?: string | null;
|
||||||
'id'?: number;
|
'id'?: string;
|
||||||
'inputs'?: string | null;
|
'inputs'?: string | null;
|
||||||
'inputValues'?: string | null;
|
'inputValues'?: string | null;
|
||||||
'models'?: string | null;
|
'models'?: string | null;
|
||||||
'name'?: string | null;
|
'name'?: string | null;
|
||||||
'version'?: string | null;
|
|
||||||
}
|
}
|
||||||
export interface o_video {
|
export interface o_video {
|
||||||
'errorReason'?: string | null;
|
'errorReason'?: string | null;
|
||||||
@ -250,8 +221,6 @@ export interface o_videoConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface DB {
|
export interface DB {
|
||||||
"_o_project_old_20260326": _o_project_old_20260326;
|
|
||||||
"_o_storyboard_old_20260325": _o_storyboard_old_20260325;
|
|
||||||
"memories": memories;
|
"memories": memories;
|
||||||
"o_agentDeploy": o_agentDeploy;
|
"o_agentDeploy": o_agentDeploy;
|
||||||
"o_agentWorkData": o_agentWorkData;
|
"o_agentWorkData": o_agentWorkData;
|
||||||
|
|||||||
@ -8,7 +8,7 @@ type AiType = "scriptAgent" | "productionAgent" | "universalAgent";
|
|||||||
type FnName = "textRequest" | "imageRequest" | "videoRequest" | "ttsRequest";
|
type FnName = "textRequest" | "imageRequest" | "videoRequest" | "ttsRequest";
|
||||||
|
|
||||||
const AiTypeValues: AiType[] = ["scriptAgent", "productionAgent", "universalAgent"];
|
const AiTypeValues: AiType[] = ["scriptAgent", "productionAgent", "universalAgent"];
|
||||||
async function resolveModelName(value: AiType | `${number}:${string}`): Promise<`${number}:${string}`> {
|
async function resolveModelName(value: AiType | `${string}:${string}`): Promise<`${string}:${string}`> {
|
||||||
if (AiTypeValues.includes(value as AiType)) {
|
if (AiTypeValues.includes(value as AiType)) {
|
||||||
const agentDeployData = await u.db("o_agentDeploy").where("key", value).first();
|
const agentDeployData = await u.db("o_agentDeploy").where("key", value).first();
|
||||||
if (!agentDeployData?.modelName) throw new Error(`${value}模型未配置`);
|
if (!agentDeployData?.modelName) throw new Error(`${value}模型未配置`);
|
||||||
@ -17,7 +17,7 @@ async function resolveModelName(value: AiType | `${number}:${string}`): Promise<
|
|||||||
return value as `${number}:${string}`;
|
return value as `${number}:${string}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getVendorTemplateFn(fnName: FnName, modelName: `${number}:${string}`) {
|
async function getVendorTemplateFn(fnName: FnName, modelName: `${string}:${string}`) {
|
||||||
const [id, name] = modelName.split(":");
|
const [id, name] = modelName.split(":");
|
||||||
const vendorConfigData = await u.db("o_vendorConfig").where("id", id).first();
|
const vendorConfigData = await u.db("o_vendorConfig").where("id", id).first();
|
||||||
if (!vendorConfigData) throw new Error(`未找到供应商配置 id=${id}`);
|
if (!vendorConfigData) throw new Error(`未找到供应商配置 id=${id}`);
|
||||||
@ -37,7 +37,7 @@ async function withTaskRecord<T>(
|
|||||||
describe: string,
|
describe: string,
|
||||||
relatedObjects: string,
|
relatedObjects: string,
|
||||||
projectId: number,
|
projectId: number,
|
||||||
fn: (modelName: `${number}:${string}`) => Promise<T>,
|
fn: (modelName: `${string}:${string}`) => Promise<T>,
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
const modelName = await resolveModelName(modelKey);
|
const modelName = await resolveModelName(modelKey);
|
||||||
const [id, model] = modelName.split(":");
|
const [id, model] = modelName.split(":");
|
||||||
@ -59,27 +59,38 @@ async function urlToBase64(url: string): Promise<string> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AiText {
|
class AiText {
|
||||||
private AiType: AiType | `${number}:${string}`;
|
private AiType: AiType | `${string}:${string}`;
|
||||||
constructor(AiType: AiType | `${number}:${string}`) {
|
constructor(AiType: AiType | `${string}:${string}`) {
|
||||||
this.AiType = AiType;
|
this.AiType = AiType;
|
||||||
}
|
}
|
||||||
async invoke(input: Omit<Parameters<typeof generateText>[0], "model">) {
|
async invoke(input: Omit<Parameters<typeof generateText>[0], "model">) {
|
||||||
|
const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first();
|
||||||
const modelName = await resolveModelName(this.AiType);
|
const modelName = await resolveModelName(this.AiType);
|
||||||
return generateText({
|
return generateText({
|
||||||
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }),
|
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }),
|
||||||
...input,
|
...input,
|
||||||
model: await getVendorTemplateFn("textRequest", modelName),
|
model:
|
||||||
|
switchAiDevTool?.value === "1"
|
||||||
|
? wrapLanguageModel({
|
||||||
|
model: await getVendorTemplateFn("textRequest", modelName),
|
||||||
|
middleware: devToolsMiddleware(),
|
||||||
|
})
|
||||||
|
: await getVendorTemplateFn("textRequest", modelName),
|
||||||
} as Parameters<typeof generateText>[0]);
|
} as Parameters<typeof generateText>[0]);
|
||||||
}
|
}
|
||||||
async stream(input: Omit<Parameters<typeof streamText>[0], "model">) {
|
async stream(input: Omit<Parameters<typeof streamText>[0], "model">) {
|
||||||
|
const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first();
|
||||||
const modelName = await resolveModelName(this.AiType);
|
const modelName = await resolveModelName(this.AiType);
|
||||||
return streamText({
|
return streamText({
|
||||||
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }),
|
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }),
|
||||||
...input,
|
...input,
|
||||||
model: wrapLanguageModel({
|
model:
|
||||||
model: await getVendorTemplateFn("textRequest", modelName),
|
switchAiDevTool?.value == "1"
|
||||||
middleware: devToolsMiddleware(),
|
? wrapLanguageModel({
|
||||||
}),
|
model: await getVendorTemplateFn("textRequest", modelName),
|
||||||
|
middleware: devToolsMiddleware(),
|
||||||
|
})
|
||||||
|
: await getVendorTemplateFn("textRequest", modelName),
|
||||||
} as Parameters<typeof streamText>[0]);
|
} as Parameters<typeof streamText>[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -168,7 +179,7 @@ class AiAudio {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
Text: (AiType: AiType | `${number}:${string}`) => new AiText(AiType),
|
Text: (AiType: AiType | `${string}:${string}`) => new AiText(AiType),
|
||||||
Image: (key: `${number}:${string}`) => new AiImage(key),
|
Image: (key: `${number}:${string}`) => new AiImage(key),
|
||||||
Video: (key: `${number}:${string}`) => new AiVideo(key),
|
Video: (key: `${number}:${string}`) => new AiVideo(key),
|
||||||
Audio: (key: `${number}:${string}`) => new AiAudio(key),
|
Audio: (key: `${number}:${string}`) => new AiAudio(key),
|
||||||
|
|||||||
@ -34,6 +34,7 @@ export default function runCode(code: string) {
|
|||||||
exports,
|
exports,
|
||||||
axios,
|
axios,
|
||||||
FormData,
|
FormData,
|
||||||
|
logger,
|
||||||
},
|
},
|
||||||
compiler: "javascript",
|
compiler: "javascript",
|
||||||
eval: false,
|
eval: false,
|
||||||
@ -44,6 +45,10 @@ export default function runCode(code: string) {
|
|||||||
|
|
||||||
return exports as Record<string, any>;
|
return exports as Record<string, any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function logger(logstring: string) {
|
||||||
|
console.log("【VM】" + logstring);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 压缩图片,目标字节数不高于 size
|
* 压缩图片,目标字节数不高于 size
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user