diff --git a/data/web/index.html b/data/web/index.html index def3966..3bc5ab4 100644 --- a/data/web/index.html +++ b/data/web/index.html @@ -5,37 +5,37 @@ Toonflow - - + `),IDs=/enable|requires|diagnostic/,y2n=new RegExp("[_\\p{XID_Start}]\\p{XID_Continue}*","u"),iF="variable.predefined",MDs={tokenPostfix:".wgsl",defaultToken:"invalid",unicode:!0,atoms:SDs,keywords:LDs,reserved:xDs,predeclared_enums:EDs,predeclared_types:TDs,predeclared_type_generators:QDs,predeclared_type_aliases:DDs,predeclared_intrinsics:BDs,operators:RDs,symbols:/[!%&*+\-\.\/:;<=>^|_~,]+/,tokenizer:{root:[[IDs,"keyword","@directive"],[y2n,{cases:{"@atoms":iF,"@keywords":"keyword","@reserved":"invalid","@predeclared_enums":iF,"@predeclared_types":iF,"@predeclared_type_generators":iF,"@predeclared_type_aliases":iF,"@predeclared_intrinsics":iF,"@default":"identifier"}}],{include:"@commentOrSpace"},{include:"@numbers"},[/[{}()\[\]]/,"@brackets"],["@","annotation","@attribute"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/./,"invalid"]],commentOrSpace:[[/\s+/,"white"],[/\/\*/,"comment","@blockComment"],[/\/\/.*$/,"comment"]],blockComment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],attribute:[{include:"@commentOrSpace"},[/\w+/,"annotation","@pop"]],directive:[{include:"@commentOrSpace"},[/[()]/,"@brackets"],[/,/,"delimiter"],[y2n,"meta.content"],[/;/,"delimiter","@pop"]],numbers:[[/0[fh]/,"number.float"],[/[1-9][0-9]*[fh]/,"number.float"],[/[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+[eE][+-]?[0-9]+[fh]?/,"number.float"],[/0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?/,"number.hex"],[/0[xX][0-9a-fA-F]+[iu]?/,"number.hex"],[/[1-9][0-9]*[iu]?/,"number"],[/0[iu]?/,"number"]]}},PDs=Object.freeze(Object.defineProperty({__proto__:null,conf:_Ds,language:MDs},Symbol.toStringTag,{value:"Module"})),FDs={comments:{blockComment:["\x3C!--","-->"]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:Et.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:Et.IndentAction.Indent}}]},NDs={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/\x3C!--/,{token:"comment",next:"@comment"}]],comment:[[/[^<\-]+/,"comment.content"],[/-->/,{token:"comment",next:"@pop"}],[/\x3C!--/,"comment.content.invalid"],[/[<\-]/,"comment.content"]]}},UDs=Object.freeze(Object.defineProperty({__proto__:null,conf:FDs,language:NDs},Symbol.toStringTag,{value:"Module"})),jDs={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:Et.IndentAction.Indent}}]},WDs={tokenPostfix:".yaml",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["true","True","TRUE","false","False","FALSE","null","Null","Null","~"],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/%[^ ]+.*$/,"meta.directive"],[/---/,"operators.directivesEnd"],[/\.{3}/,"operators.documentEnd"],[/[-?:](?= )/,"operators"],{include:"@anchor"},{include:"@tagHandle"},{include:"@flowCollections"},{include:"@blockStyle"},[/@numberInteger(?![ \t]*\S+)/,"number"],[/@numberFloat(?![ \t]*\S+)/,"number.float"],[/@numberOctal(?![ \t]*\S+)/,"number.octal"],[/@numberHex(?![ \t]*\S+)/,"number.hex"],[/@numberInfinity(?![ \t]*\S+)/,"number.infinity"],[/@numberNaN(?![ \t]*\S+)/,"number.nan"],[/@numberDate(?![ \t]*\S+)/,"number.date"],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,["type","white","operators","white"]],{include:"@flowScalars"},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":"keyword","@default":"string"}}]],object:[{include:"@whitespace"},{include:"@comment"},[/\}/,"@brackets","@pop"],[/,/,"delimiter.comma"],[/:(?= )/,"operators"],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,"type"],{include:"@flowCollections"},{include:"@flowScalars"},{include:"@tagHandle"},{include:"@anchor"},{include:"@flowNumber"},[/[^\},]+/,{cases:{"@keywords":"keyword","@default":"string"}}]],array:[{include:"@whitespace"},{include:"@comment"},[/\]/,"@brackets","@pop"],[/,/,"delimiter.comma"],{include:"@flowCollections"},{include:"@flowScalars"},{include:"@tagHandle"},{include:"@anchor"},{include:"@flowNumber"},[/[^\],]+/,{cases:{"@keywords":"keyword","@default":"string"}}]],multiString:[[/^( +).+$/,"string","@multiStringContinued.$1"]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":"string","@default":{token:"@rematch",next:"@popall"}}}]],whitespace:[[/[ \t\r\n]+/,"white"]],comment:[[/#.*$/,"comment"]],flowCollections:[[/\[/,"@brackets","@array"],[/\{/,"@brackets","@object"]],flowScalars:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'[^']*'/,"string"],[/"/,"string","@doubleQuotedString"]],doubleQuotedString:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],blockStyle:[[/[>|][0-9]*[+-]?$/,"operators","@multiString"]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,"number"],[/@numberFloat(?=[ \t]*[,\]\}])/,"number.float"],[/@numberOctal(?=[ \t]*[,\]\}])/,"number.octal"],[/@numberHex(?=[ \t]*[,\]\}])/,"number.hex"],[/@numberInfinity(?=[ \t]*[,\]\}])/,"number.infinity"],[/@numberNaN(?=[ \t]*[,\]\}])/,"number.nan"],[/@numberDate(?=[ \t]*[,\]\}])/,"number.date"]],tagHandle:[[/\![^ ]*/,"tag"]],anchor:[[/[&*][^ ]+/,"namespace"]]}},VDs=Object.freeze(Object.defineProperty({__proto__:null,conf:jDs,language:WDs},Symbol.toStringTag,{value:"Module"})); +
diff --git a/package.json b/package.json index c887e15..d6b6451 100644 --- a/package.json +++ b/package.json @@ -91,5 +91,10 @@ "nodemon": "^3.1.11", "tsx": "^4.21.0", "typescript": "^5.9.3" + }, + "overrides": { + "@rmp135/sql-ts": { + "better-sqlite3": "^12.8.0" + } } } diff --git a/scripts/main.ts b/scripts/main.ts index e9cf636..7f08dfb 100644 --- a/scripts/main.ts +++ b/scripts/main.ts @@ -164,6 +164,10 @@ app.whenReady().then(async () => { windowismaximized: () => ({ maximized: mainWindow?.isMaximized() ?? false, }), + openDevTool: () => { + mainWindow?.webContents.openDevTools(); + return { ok: true }; + }, }; const handler = handlers[pathname]; const responseData = handler ? handler() : { error: "未知接口" }; diff --git a/src/lib/initDB.ts b/src/lib/initDB.ts index b6c3863..764c0b0 100644 --- a/src/lib/initDB.ts +++ b/src/lib/initDB.ts @@ -159,6 +159,10 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => key: "modelDtype", value: "fp16", }, + { + key: "switchAiDevTool", + value: "0", + }, ]); }, }, @@ -371,26 +375,10 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => { name: "o_vendorConfig", builder: (table) => { - table.integer("id").notNullable(); + table.string("id").notNullable(); + table.text("author"); + table.text("description"); 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("inputs"); // 输入项配置 JSON table.text("inputValues"); // 输入项值 JSON diff --git a/src/router.ts b/src/router.ts index 1b7fe3f..cd26f7a 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,4 +1,4 @@ -// @routes-hash 9559cc3a8cb0291f04970e9ba299265f +// @routes-hash 57463134da0d81d65d10c163ee8a2b26 import { Express } from "express"; 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 route74 from "./routes/setting/agentDeploy/getAgentDeploy"; import route75 from "./routes/setting/dbConfig/clearData"; -import route76 from "./routes/setting/fileManagement/openFolder"; -import route77 from "./routes/setting/getTextModel"; -import route78 from "./routes/setting/loginConfig/getUser"; -import route79 from "./routes/setting/loginConfig/updateUserPwd"; -import route80 from "./routes/setting/memoryConfig/delAllMemory"; -import route81 from "./routes/setting/memoryConfig/getMemory"; -import route82 from "./routes/setting/memoryConfig/sureMemory"; -import route83 from "./routes/setting/skillManagement/addSkill"; -import route84 from "./routes/setting/skillManagement/deleteSkill"; -import route85 from "./routes/setting/skillManagement/embeddingSkill"; -import route86 from "./routes/setting/skillManagement/generateDescription"; -import route87 from "./routes/setting/skillManagement/getSkillList"; -import route88 from "./routes/setting/skillManagement/scanSkills"; -import route89 from "./routes/setting/skillManagement/updateSkill"; -import route90 from "./routes/setting/vendorConfig/addVendor"; -import route91 from "./routes/setting/vendorConfig/deleteVendor"; -import route92 from "./routes/setting/vendorConfig/getVendorList"; -import route93 from "./routes/setting/vendorConfig/modelTest"; -import route94 from "./routes/setting/vendorConfig/updateVendor"; -import route95 from "./routes/task/getProject"; -import route96 from "./routes/task/getTaskApi"; -import route97 from "./routes/task/getTaskCategories"; -import route98 from "./routes/task/taskDetails"; -import route99 from "./routes/test/test"; +import route76 from "./routes/setting/dev/getSwitchAiDevTool"; +import route77 from "./routes/setting/dev/updateSwitchAiDevTool"; +import route78 from "./routes/setting/fileManagement/openFolder"; +import route79 from "./routes/setting/getTextModel"; +import route80 from "./routes/setting/loginConfig/getUser"; +import route81 from "./routes/setting/loginConfig/updateUserPwd"; +import route82 from "./routes/setting/memoryConfig/delAllMemory"; +import route83 from "./routes/setting/memoryConfig/getMemory"; +import route84 from "./routes/setting/memoryConfig/sureMemory"; +import route85 from "./routes/setting/skillManagement/addSkill"; +import route86 from "./routes/setting/skillManagement/deleteSkill"; +import route87 from "./routes/setting/skillManagement/embeddingSkill"; +import route88 from "./routes/setting/skillManagement/generateDescription"; +import route89 from "./routes/setting/skillManagement/getSkillList"; +import route90 from "./routes/setting/skillManagement/scanSkills"; +import route91 from "./routes/setting/skillManagement/updateSkill"; +import route92 from "./routes/setting/vendorConfig/addVendor"; +import route93 from "./routes/setting/vendorConfig/deleteVendor"; +import route94 from "./routes/setting/vendorConfig/getVendorList"; +import route95 from "./routes/setting/vendorConfig/modelTest"; +import route96 from "./routes/setting/vendorConfig/updateVendor"; +import route97 from "./routes/task/getProject"; +import route98 from "./routes/task/getTaskApi"; +import route99 from "./routes/task/getTaskCategories"; +import route100 from "./routes/task/taskDetails"; +import route101 from "./routes/test/test"; export default async (app: Express) => { 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/getAgentDeploy", route74); app.use("/api/setting/dbConfig/clearData", route75); - app.use("/api/setting/fileManagement/openFolder", route76); - app.use("/api/setting/getTextModel", route77); - app.use("/api/setting/loginConfig/getUser", route78); - app.use("/api/setting/loginConfig/updateUserPwd", route79); - app.use("/api/setting/memoryConfig/delAllMemory", route80); - app.use("/api/setting/memoryConfig/getMemory", route81); - app.use("/api/setting/memoryConfig/sureMemory", route82); - app.use("/api/setting/skillManagement/addSkill", route83); - app.use("/api/setting/skillManagement/deleteSkill", route84); - app.use("/api/setting/skillManagement/embeddingSkill", route85); - app.use("/api/setting/skillManagement/generateDescription", route86); - app.use("/api/setting/skillManagement/getSkillList", route87); - app.use("/api/setting/skillManagement/scanSkills", route88); - app.use("/api/setting/skillManagement/updateSkill", route89); - app.use("/api/setting/vendorConfig/addVendor", route90); - app.use("/api/setting/vendorConfig/deleteVendor", route91); - app.use("/api/setting/vendorConfig/getVendorList", route92); - app.use("/api/setting/vendorConfig/modelTest", route93); - app.use("/api/setting/vendorConfig/updateVendor", route94); - app.use("/api/task/getProject", route95); - app.use("/api/task/getTaskApi", route96); - app.use("/api/task/getTaskCategories", route97); - app.use("/api/task/taskDetails", route98); - app.use("/api/test/test", route99); + app.use("/api/setting/dev/getSwitchAiDevTool", route76); + app.use("/api/setting/dev/updateSwitchAiDevTool", route77); + app.use("/api/setting/fileManagement/openFolder", route78); + app.use("/api/setting/getTextModel", route79); + app.use("/api/setting/loginConfig/getUser", route80); + app.use("/api/setting/loginConfig/updateUserPwd", route81); + app.use("/api/setting/memoryConfig/delAllMemory", route82); + app.use("/api/setting/memoryConfig/getMemory", route83); + app.use("/api/setting/memoryConfig/sureMemory", route84); + app.use("/api/setting/skillManagement/addSkill", route85); + app.use("/api/setting/skillManagement/deleteSkill", route86); + app.use("/api/setting/skillManagement/embeddingSkill", route87); + app.use("/api/setting/skillManagement/generateDescription", route88); + app.use("/api/setting/skillManagement/getSkillList", route89); + app.use("/api/setting/skillManagement/scanSkills", route90); + app.use("/api/setting/skillManagement/updateSkill", route91); + app.use("/api/setting/vendorConfig/addVendor", route92); + app.use("/api/setting/vendorConfig/deleteVendor", route93); + app.use("/api/setting/vendorConfig/getVendorList", route94); + app.use("/api/setting/vendorConfig/modelTest", route95); + app.use("/api/setting/vendorConfig/updateVendor", route96); + app.use("/api/task/getProject", route97); + app.use("/api/task/getTaskApi", route98); + app.use("/api/task/getTaskCategories", route99); + app.use("/api/task/taskDetails", route100); + app.use("/api/test/test", route101); } diff --git a/src/routes/production/getFlowData.ts b/src/routes/production/getFlowData.ts index 8492a9b..ffa25b5 100644 --- a/src/routes/production/getFlowData.ts +++ b/src/routes/production/getFlowData.ts @@ -88,7 +88,6 @@ export default router.post( } else { try { const storyboardData = await u.db("o_storyboard").where("scriptId", episodesId); - console.log("%c Line:90 🍡 storyboardData", "background:#ed9ec7", storyboardData.length); await Promise.all( storyboardData.map(async (i) => { if (i.filePath) { @@ -165,6 +164,7 @@ export default router.post( const buildStoryboardItem = (i: (typeof storyboardData)[number], existing: any = {}) => ({ ...existing, id: i.id, + index: i.index, title: i.title, description: i.description, camera: i.camera, @@ -199,8 +199,7 @@ export default router.post( orderedStoryboard.push(buildStoryboardItem(i)); } }); - - flowData.storyboard = orderedStoryboard; + flowData.storyboard = orderedStoryboard.sort((a, b) => (a.index ?? 0) - (b.index ?? 0)); res.status(200).send(success(flowData)); } catch (err) { res.status(400).send(error()); diff --git a/src/routes/production/getProductionData.ts b/src/routes/production/getProductionData.ts index d8a166d..ec29f64 100644 --- a/src/routes/production/getProductionData.ts +++ b/src/routes/production/getProductionData.ts @@ -13,7 +13,7 @@ export default router.post( 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( storyboards.map(async (item) => { diff --git a/src/routes/production/getStoryboardData.ts b/src/routes/production/getStoryboardData.ts index eb8af34..b307380 100644 --- a/src/routes/production/getStoryboardData.ts +++ b/src/routes/production/getStoryboardData.ts @@ -12,7 +12,7 @@ export default router.post( }), async (req, res) => { 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( storyboardData.map(async (i) => { return { @@ -83,7 +83,6 @@ export default router.post( }; }), ); - res.status(200).send(success(result)); }, ); diff --git a/src/routes/setting/dev/getSwitchAiDevTool.ts b/src/routes/setting/dev/getSwitchAiDevTool.ts new file mode 100644 index 0000000..6d1d07c --- /dev/null +++ b/src/routes/setting/dev/getSwitchAiDevTool.ts @@ -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")); +}); diff --git a/src/routes/setting/dev/updateSwitchAiDevTool.ts b/src/routes/setting/dev/updateSwitchAiDevTool.ts new file mode 100644 index 0000000..3237b29 --- /dev/null +++ b/src/routes/setting/dev/updateSwitchAiDevTool.ts @@ -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("保存设置成功")); + }, +); diff --git a/src/routes/setting/vendorConfig/addVendor.ts b/src/routes/setting/vendorConfig/addVendor.ts index 185bf93..ae93482 100644 --- a/src/routes/setting/vendorConfig/addVendor.ts +++ b/src/routes/setting/vendorConfig/addVendor.ts @@ -8,9 +8,11 @@ import { transform } from "sucrase"; const router = express.Router(); const vendorConfigSchema = z.object({ - version: z.number(), - icon: z.string().optional(), + id: z.string(), + author: z.string(), + description: z.string().optional(), name: z.string(), + icon: z.string().optional(), inputs: z.array( z.object({ key: z.string(), @@ -41,16 +43,19 @@ 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", + "audioReference", + "videoReference", + ]), + z.array(z.enum(["video", "image", "audio", "text"])), ]), ), audio: z.union([z.literal("optional"), z.boolean()]), @@ -87,12 +92,14 @@ export default router.post( return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`)); } await u.db("o_vendorConfig").insert({ + id: vendor.id, + author: vendor.author, + description: vendor.description || "", name: vendor.name, - version: vendor.version.toString(), icon: vendor.icon || "", - inputs: JSON.stringify(vendor.inputs), - inputValues: JSON.stringify(vendor.inputValues), - models: JSON.stringify(vendor.models), + inputs: JSON.stringify(vendor.inputs ?? []), + inputValues: JSON.stringify(vendor.inputValues ?? {}), + models: JSON.stringify(vendor.models ?? []), code: tsCode, createTime: Date.now(), }); diff --git a/src/routes/setting/vendorConfig/deleteVendor.ts b/src/routes/setting/vendorConfig/deleteVendor.ts index d74d870..a899c66 100644 --- a/src/routes/setting/vendorConfig/deleteVendor.ts +++ b/src/routes/setting/vendorConfig/deleteVendor.ts @@ -7,7 +7,7 @@ const router = express.Router(); export default router.post( "/", validateFields({ - id: z.number(), + id: z.string(), }), async (req, res) => { const { id } = req.body; diff --git a/src/routes/setting/vendorConfig/modelTest.ts b/src/routes/setting/vendorConfig/modelTest.ts index fc8f7a6..e16f1eb 100644 --- a/src/routes/setting/vendorConfig/modelTest.ts +++ b/src/routes/setting/vendorConfig/modelTest.ts @@ -11,12 +11,11 @@ export default router.post( "/", validateFields({ modelName: z.string(), - apiKey: z.string(), type: z.enum(["text", "video", "image"]), - id: z.number(), + id: z.string(), }), async (req, res) => { - const { modelName, apiKey, type, id } = req.body; + const { modelName, type, id } = req.body; try { const requestFn: Record = { @@ -69,12 +68,16 @@ export default router.post( }); if (type == "text") { - const resTextData = await u.Ai.Text(`${id}:${modelName}`).invoke({ + const { textStream } = await u.Ai.Text(`${id}:${modelName}`).stream({ prompt: "请调用工具获取火星的天气,并回答我多少气温", tools: { getWeatherTool }, }); - - res.status(200).send(success(resTextData.text)); + let fullResponse = ""; + for await (const chunk of textStream) { + fullResponse += chunk; + } + console.log("%c Line:78 🥝 fullResponse", "background:#ea7e5c", fullResponse); + res.status(200).send(success(fullResponse)); } else { const aiTypeFn = { image: "Image", diff --git a/src/routes/setting/vendorConfig/updateVendor.ts b/src/routes/setting/vendorConfig/updateVendor.ts index 67d23a5..d9073f8 100644 --- a/src/routes/setting/vendorConfig/updateVendor.ts +++ b/src/routes/setting/vendorConfig/updateVendor.ts @@ -7,9 +7,11 @@ import { transform } from "sucrase"; const router = express.Router(); const vendorConfigSchema = z.object({ - version: z.number(), - icon: z.string().optional(), + id: z.string(), + author: z.string(), + description: z.string().optional(), name: z.string(), + icon: z.string().optional(), inputs: z.array( z.object({ key: z.string(), @@ -41,8 +43,18 @@ const vendorConfigSchema = z.object({ type: z.literal("video"), mode: z.array( z.union([ - z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]), - z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])), + z.enum([ + "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()]), @@ -60,9 +72,8 @@ const vendorConfigSchema = z.object({ export default router.post( "/", validateFields({ - id: z.number(), + id: z.string(), tsCode: z.string(), - icon: z.string().optional(), inputValues: z.record(z.string(), z.string()), inputs: z.array( z.object({ @@ -108,11 +119,9 @@ export default router.post( }), ]), ), - name: z.string().optional(), - version: z.string().optional(), }), 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 exports = u.vm(jsCode); @@ -158,9 +167,6 @@ export default router.post( }; 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, "inputValues", JSON.stringify(inputValues ?? vendor.inputValues, null, 2)); updatedTsCode = replaceBlockValue(updatedTsCode, "models", JSON.stringify(models ?? vendor.models, null, 2)); @@ -169,9 +175,6 @@ export default router.post( .db("o_vendorConfig") .where("id", id) .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), inputValues: inputValues ? JSON.stringify(inputValues) : JSON.stringify(vendor.inputValues), models: models ? JSON.stringify(models) : JSON.stringify(vendor.models), diff --git a/src/types/database.d.ts b/src/types/database.d.ts index bf2ee8f..c3a5bd3 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -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 { 'content': string; 'createTime': number; @@ -215,15 +185,16 @@ export interface o_user { 'password'?: string | null; } export interface o_vendorConfig { + 'author'?: string | null; 'code'?: string | null; 'createTime'?: number | null; + 'description'?: string | null; 'icon'?: string | null; - 'id'?: number; + 'id'?: string; 'inputs'?: string | null; 'inputValues'?: string | null; 'models'?: string | null; 'name'?: string | null; - 'version'?: string | null; } export interface o_video { 'errorReason'?: string | null; @@ -250,8 +221,6 @@ export interface o_videoConfig { } export interface DB { - "_o_project_old_20260326": _o_project_old_20260326; - "_o_storyboard_old_20260325": _o_storyboard_old_20260325; "memories": memories; "o_agentDeploy": o_agentDeploy; "o_agentWorkData": o_agentWorkData; diff --git a/src/utils/ai.ts b/src/utils/ai.ts index 7b8b8a3..d98dfce 100644 --- a/src/utils/ai.ts +++ b/src/utils/ai.ts @@ -8,7 +8,7 @@ type AiType = "scriptAgent" | "productionAgent" | "universalAgent"; type FnName = "textRequest" | "imageRequest" | "videoRequest" | "ttsRequest"; 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)) { const agentDeployData = await u.db("o_agentDeploy").where("key", value).first(); if (!agentDeployData?.modelName) throw new Error(`${value}模型未配置`); @@ -17,7 +17,7 @@ async function resolveModelName(value: AiType | `${number}:${string}`): Promise< 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 vendorConfigData = await u.db("o_vendorConfig").where("id", id).first(); if (!vendorConfigData) throw new Error(`未找到供应商配置 id=${id}`); @@ -37,7 +37,7 @@ async function withTaskRecord( describe: string, relatedObjects: string, projectId: number, - fn: (modelName: `${number}:${string}`) => Promise, + fn: (modelName: `${string}:${string}`) => Promise, ): Promise { const modelName = await resolveModelName(modelKey); const [id, model] = modelName.split(":"); @@ -59,27 +59,38 @@ async function urlToBase64(url: string): Promise { } class AiText { - private AiType: AiType | `${number}:${string}`; - constructor(AiType: AiType | `${number}:${string}`) { + private AiType: AiType | `${string}:${string}`; + constructor(AiType: AiType | `${string}:${string}`) { this.AiType = AiType; } async invoke(input: Omit[0], "model">) { + const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first(); const modelName = await resolveModelName(this.AiType); return generateText({ ...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }), ...input, - model: await getVendorTemplateFn("textRequest", modelName), + model: + switchAiDevTool?.value === "1" + ? wrapLanguageModel({ + model: await getVendorTemplateFn("textRequest", modelName), + middleware: devToolsMiddleware(), + }) + : await getVendorTemplateFn("textRequest", modelName), } as Parameters[0]); } async stream(input: Omit[0], "model">) { + const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first(); const modelName = await resolveModelName(this.AiType); return streamText({ ...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }), ...input, - model: wrapLanguageModel({ - model: await getVendorTemplateFn("textRequest", modelName), - middleware: devToolsMiddleware(), - }), + model: + switchAiDevTool?.value == "1" + ? wrapLanguageModel({ + model: await getVendorTemplateFn("textRequest", modelName), + middleware: devToolsMiddleware(), + }) + : await getVendorTemplateFn("textRequest", modelName), } as Parameters[0]); } } @@ -168,7 +179,7 @@ class AiAudio { } 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), Video: (key: `${number}:${string}`) => new AiVideo(key), Audio: (key: `${number}:${string}`) => new AiAudio(key), diff --git a/src/utils/vm.ts b/src/utils/vm.ts index 3d6ab27..a5fa566 100644 --- a/src/utils/vm.ts +++ b/src/utils/vm.ts @@ -34,6 +34,7 @@ export default function runCode(code: string) { exports, axios, FormData, + logger, }, compiler: "javascript", eval: false, @@ -44,6 +45,10 @@ export default function runCode(code: string) { return exports as Record; } + +export function logger(logstring: string) { + console.log("【VM】" + logstring); +} /** * 压缩图片,目标字节数不高于 size */