From 68f2c62c46c936295f6715dfad6423a2bd78bbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ACT=E4=B8=B6=E6=B5=81=E6=98=9F=E9=9B=A8?= <1340145680@qq.com> Date: Mon, 30 Mar 2026 17:35:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=BB=E5=8F=96skill?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/web/index.html | 2088 ++++++++--------- package.json | 1 + src/agents/productionAgent/index.ts | 13 +- src/agents/productionAgent/tools.ts | 38 +- .../assets/batchGenerateAssetsImage.ts | 1 - src/utils/agent/skillsTools.ts | 4 +- yarn.lock | 12 + 7 files changed, 1053 insertions(+), 1104 deletions(-) diff --git a/data/web/index.html b/data/web/index.html index 5bdb86b..73fbb89 100644 --- a/data/web/index.html +++ b/data/web/index.html @@ -5,74 +5,74 @@ Toonflow - - + `),JDs=/enable|requires|diagnostic/,b2n=new RegExp("[_\\p{XID_Start}]\\p{XID_Continue}*","u"),JP="variable.predefined",eBs={tokenPostfix:".wgsl",defaultToken:"invalid",unicode:!0,atoms:zDs,keywords:HDs,reserved:$Ds,predeclared_enums:XDs,predeclared_types:GDs,predeclared_type_generators:YDs,predeclared_type_aliases:ZDs,predeclared_intrinsics:qDs,operators:KDs,symbols:/[!%&*+\-\.\/:;<=>^|_~,]+/,tokenizer:{root:[[JDs,"keyword","@directive"],[b2n,{cases:{"@atoms":JP,"@keywords":"keyword","@reserved":"invalid","@predeclared_enums":JP,"@predeclared_types":JP,"@predeclared_type_generators":JP,"@predeclared_type_aliases":JP,"@predeclared_intrinsics":JP,"@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"],[b2n,"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"]]}},tBs=Object.freeze(Object.defineProperty({__proto__:null,conf:VDs,language:eBs},Symbol.toStringTag,{value:"Module"})),nBs={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}}]},iBs={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"]]}},rBs=Object.freeze(Object.defineProperty({__proto__:null,conf:nBs,language:iBs},Symbol.toStringTag,{value:"Module"})),oBs={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}}]},sBs={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"]]}},aBs=Object.freeze(Object.defineProperty({__proto__:null,conf:oBs,language:sBs},Symbol.toStringTag,{value:"Module"})); +
diff --git a/package.json b/package.json index 715e75a..741b792 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "knex": "^3.2.5", "lodash": "^4.17.23", "morgan": "^1.10.1", + "p-limit": "^7.3.0", "qwen-ai-provider-v5": "^2.1.0", "serialize-error": "^13.0.1", "sharp": "^0.34.5", diff --git a/src/agents/productionAgent/index.ts b/src/agents/productionAgent/index.ts index af036e1..431f91a 100644 --- a/src/agents/productionAgent/index.ts +++ b/src/agents/productionAgent/index.ts @@ -51,7 +51,7 @@ export async function decisionAI(ctx: AgentContext) { const { textStream } = await u.Ai.Text("productionAgent").stream({ messages: [ { role: "system", content: prompt }, - { role: "system", content: mem }, + { role: "assistant", content: mem }, { role: "user", content: text }, ], abortSignal, @@ -174,8 +174,8 @@ function createSubAgent(parentCtx: AgentContext) { } async function createArtSkills(artName: string) { - const path = u.getPath(["skills", "art_prompts", artName, "driector_skills"]); - const skillList = await scanSkills(path + "/*.md"); + const workerPath = u.getPath(["skills", "art_prompts", artName, "driector_skills"]); + const skillList = await scanSkills(workerPath + "/*.md"); const mainSkills: { path: string; name: string; description: string }[] = []; for (const skillPath of skillList) { if (!fs.existsSync(skillPath)) throw new Error(`主技能文件不存在: ${skillPath}`); @@ -183,8 +183,9 @@ async function createArtSkills(artName: string) { const parsed = parseFrontmatter(content); mainSkills.push({ path: skillPath, ...parsed }); } - return { + const res = { prompt: buildSkillPrompt(mainSkills), - tools: createSkillTools(mainSkills, { mainSkill: mainSkills, secondarySkills: [], tertiarySkills: [] }), + tools: createSkillTools(mainSkills, { mainSkill: mainSkills, secondarySkills: [], tertiarySkills: [] },workerPath), }; -} + return res +} \ No newline at end of file diff --git a/src/agents/productionAgent/tools.ts b/src/agents/productionAgent/tools.ts index 386378d..dfb66ef 100644 --- a/src/agents/productionAgent/tools.ts +++ b/src/agents/productionAgent/tools.ts @@ -53,7 +53,7 @@ const posterItemSchema = z.object({ id: z.number().describe("海报ID"), image: z.string().describe("海报图片路径"), }); -const flowDataSchema = z.object({ +export const flowDataSchema = z.object({ script: z.string().describe("剧本内容"), scriptPlan: z.string().describe("拍摄计划"), assets: z.array(assetItemSchema).describe("衍生资产"), @@ -148,42 +148,6 @@ export default (toolCpnfig: ToolConfig) => { return res ?? "删除成功"; }, }), - - add_storyboard: tool({ - description: "新增或更新分镜面板", - inputSchema: z.object({ - id: z.number().nullable().describe("分镜面板ID,如果新增则为空"), - title: z.string().describe("分镜面板名称"), - desc: z.string().describe("分镜面板描述"), - group: z.number().describe("分镜面板分组,根据这个字段 对分镜图片,进行同时生成视频,例如 同一分组的两张图片会被用于首尾帧生成视频"), - }), - execute: async (storyboard) => { - const thinking = msg.thinking("正在操作资产..."); - const { projectId, scriptId } = resTool.data; - const createTime = Date.now(); - console.log("%c Line:161 🍤 storyboard", "background:#e41a6a", storyboard); - - const data = { - id: storyboard.id ?? undefined, - title: storyboard.title, - description: storyboard.desc, - createTime, - scriptId, - }; - if (storyboard.id) { - await u.db("o_storyboard").where("id", storyboard.id).update(data); - thinking.appendText(`已更新分镜面板,ID: ${storyboard.id}\n`); - } else { - const [insertedId] = await u.db("o_storyboard").insert(data); - data.id = insertedId; - thinking.appendText(`已新增分镜面板,ID: ${insertedId}\n`); - } - const res = await new Promise((resolve) => socket.emit("addStoryboard", data, (res: any) => resolve(res))); - thinking.updateTitle("分镜面板操作完成"); - thinking.complete(); - return res ?? "操作成功"; - }, - }), generate_deriveAsset: tool({ description: "生成衍生资产", inputSchema: z.object({ diff --git a/src/routes/production/assets/batchGenerateAssetsImage.ts b/src/routes/production/assets/batchGenerateAssetsImage.ts index 79d5b0f..346119b 100644 --- a/src/routes/production/assets/batchGenerateAssetsImage.ts +++ b/src/routes/production/assets/batchGenerateAssetsImage.ts @@ -41,7 +41,6 @@ export default router.post( }, ], }); - console.log("%c Line:35 🎂 text", "background:#3f7cff", text); const repeloadObj = { prompt: text, diff --git a/src/utils/agent/skillsTools.ts b/src/utils/agent/skillsTools.ts index adb845c..f5ae0be 100644 --- a/src/utils/agent/skillsTools.ts +++ b/src/utils/agent/skillsTools.ts @@ -177,9 +177,9 @@ ${skillEntries} `; } -export function createSkillTools(skills: { name: string; description: string }[], skillPaths: SkillPaths) { +export function createSkillTools(skills: { name: string; description: string }[], skillPaths: SkillPaths, rootDir: string = getPath("skills")) { const activated = new Set(); // 已激活技能集合,防止重复加载 - const skillsRootDir = path.resolve(getPath("skills")); + const skillsRootDir = path.resolve(rootDir); const skillNames = skills.map((s) => s.name); const skillMap = new Map(skillPaths.mainSkill.map((s) => [s.name, s])); return { diff --git a/yarn.lock b/yarn.lock index ea73d45..11531ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4022,6 +4022,13 @@ p-cancelable@^2.0.0: dependencies: yocto-queue "^0.1.0" +p-limit@^7.3.0: + version "7.3.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-7.3.0.tgz#821398d91491c6b6a1340ecd09cdc402a9c8d0ee" + integrity sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw== + dependencies: + yocto-queue "^1.2.1" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -5536,6 +5543,11 @@ yocto-queue@^0.1.0: resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.2.1: + version "1.2.2" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" + integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== + zhipu-ai-provider@^0.2.2: version "0.2.2" resolved "https://registry.npmmirror.com/zhipu-ai-provider/-/zhipu-ai-provider-0.2.2.tgz#cbee428475b1c2fca446f273ac09006ef86f6f00"