From 50900d34654cde50cf25f06820748c39104f3c4a Mon Sep 17 00:00:00 2001 From: lq1405 <2769838458@qq.com> Date: Tue, 20 May 2025 12:53:48 +0800 Subject: [PATCH] =?UTF-8?q?V3.3.8=201.=20=E4=BC=98=E5=8C=96/=E9=80=82?= =?UTF-8?q?=E9=85=8D=E7=94=9F=E5=9B=BE=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- resources/scripts/db/book.realm.lock | Bin 1416 -> 1416 bytes resources/scripts/db/software.realm.lock | Bin 1416 -> 1416 bytes src/define/gptDefine.js | 8 +++--- src/main/Service/MJ/mj.ts | 35 +++++++++++++++++------ src/main/Service/MJ/mjApi.ts | 13 +++++++++ 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index de0e5ec..6dc73fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "laitool", - "version": "3.3.6", + "version": "3.3.8", "description": "An AI tool for image processing, video processing, and other functions.", "main": "./out/main/index.js", "author": "laitool.cn", diff --git a/resources/scripts/db/book.realm.lock b/resources/scripts/db/book.realm.lock index e524c2df040db50ca50fd063f9c24dcde67efc42..ebd8bf37196192623404ecaf4a0b3beeceffccb8 100644 GIT binary patch literal 1416 zcmZQ%v0RWS;1^NI0 literal 1416 zcmZQ%vH(?pFgBooCWx>X;uej=>|hljHz9)( axceaLKIpO{OOLWgLtr!nMnho8g#Z9w76cUl diff --git a/src/define/gptDefine.js b/src/define/gptDefine.js index 83d564d..1bd04d0 100644 --- a/src/define/gptDefine.js +++ b/src/define/gptDefine.js @@ -103,7 +103,7 @@ export const gptDefine = { 【画面元素】:(每一个分镜画面输出时,都要重新联系<上下文>文本,并结合提取出来的<环境>进行联想,分析提取当前句子最终呈现的画面中会出现的2种物品或建筑物(严格执行数量为2),(如:地点是皇宫,画面元素是龙椅,玉台阶),画面元素严禁出现出境角色名称,人物名字和人称。画面元素严格严禁出现灯光的描写,严格严禁出现情绪、气氛、情感的描述,严禁出现“地点同上“,“背景不变“,某人的特写,严格禁止输出“无“字。等内容) 输出格式 - 直接输出每个编号对应的完整提示词字符串,格式为: + 一定不要输出提示词中的内部元素的名称,只需要输出提示词中的内容,直接输出对应的完整提示词字符串即可。 提示词内部元素顺序(若存在): 【出镜角色】,【角色性别】, 【角色年龄】,【角色表情】,【角色穿着】,【肢体动作】,【角色特效】,【环境布局】,【画面特效】,【视觉效果】,【拍摄角度】,【画面元素】 如果是纯环境描写,格式为: @@ -151,7 +151,7 @@ export const gptDefine = { Skills: 文本分析、角色设定信息精确引用、视觉叙事、场景设计、表情动作捕捉、元素描绘、提示词格式化输出。 Goals: 将用户提供的带编号小说文本逐句(段)拆分,严格依据<角色设定>引用描述,若是当前内容包含人物,但是在<角色设定>中未找到,则用主角表示,结合规则分析提取画面元素,最终为每个编号输出一句格式为 "提示词" 的完整字符串。 Constrains: 分镜描述需忠实原文,必须直接使用<角色设定>中的角色描述,输出格式严格遵守 "提示词" 格式,提示词内部用逗号分隔。 - OutputFormat: 纯文本提示词字符串,每行一个(例如 "xxxx, yyyy, zzzz"),内部元素用中文逗号分隔。 + OutputFormat: 只输出纯文本提示词字符串,一定不要输出提示词内部元素顺序,只输出按照指定的元素顺序拼接好的提示词字符串。 Workflow: 1.接收用户提供的带编号小说文本和<角色设定>。 @@ -231,7 +231,7 @@ export const gptDefine = { 【画面元素】:(每一个分镜画面输出时,都要重新联系<上下文>文本,并结合提取出来的<环境>进行联想,分析提取当前句子最终呈现的画面中会出现的2种物品或建筑物...(后续描述不变))。(需进行违禁词检查与替换) 输出格式 - 直接输出小说文本对应的完整提示词字符串 + 一定不要输出提示词中的内部元素的名称,只需要输出提示词中的内容,直接输出对应的完整提示词字符串即可。 提示词内部元素顺序(若存在): 【出镜角色】,【角色表情】,【角色穿着】,【肢体动作】,【角色特效】(如果适用),【环境布局】,【画面特效】(如果适用),【视觉效果】(如果适用),【拍摄角度】,【画面元素】 注意:【出镜角色】现在会包含强制的性别信息(若适用)和非人类物种类型(若适用)。特效项仅在玄幻/都市异能时出现。 @@ -291,7 +291,7 @@ export const gptDefine = { Skills: 文本分析、小说类型判断、角色性别强制补充、非人类物种识别与添加、角色设定信息精确引用、视觉叙事、场景设计、表情动作捕捉、元素描绘、条件化特效生成、提示词格式化输出。 Goals: 将用户提供的小说文本,首先更具【上下文】判断小说故事类型和时代背景或者是直接通过【角色设定】中包含的小说故事类型或者是故事背景,然后严格依据<角色设定>引用描述基础,结合规则分析提取画面元素(确保角色描述包含性别和物种信息,特效项根据小说类型条件性添加),最终输出完整的提示词信息。 Constrains: 分镜描述需忠实原文,必须为出镜角色添加性别(推断或默认)和非人类物种类型(若适用),必须直接使用<角色设定>中的角色描述作为基础,提示词内部用中文逗号分隔。特效相关描述仅在识别为【玄幻】或【都市异能】小说时添加。 - OutputFormat: 纯文本提示词字符串,内部元素用中文逗号分隔。角色描述将包含强制的性别和物种信息。根据小说类型,特效相关元素可能被省略。 + OutputFormat: 只输出纯文本提示词字符串,一定不要输出提示词内部元素顺序,只输出按照指定的元素顺序拼接好的提示词字符串。角色描述将包含强制的性别和物种信息。根据小说类型,特效相关元素可能被省略。 Workflow:, 1.接收用户提供的小说文本,上下文和<角色设定>。 diff --git a/src/main/Service/MJ/mj.ts b/src/main/Service/MJ/mj.ts index 9c1ecb7..851b4d4 100644 --- a/src/main/Service/MJ/mj.ts +++ b/src/main/Service/MJ/mj.ts @@ -610,19 +610,38 @@ export class MJOpt { }); // 下载图片 let imagePath = path.join(book.bookFolderPath, `data\\MJOriginalImage\\${task_res.messageId}.png`); + let batchImages = [] // 判断是不是生图包,是的话需要替换图片的baseurl if (this.mj_globalSetting.mj_simpleSetting.type == MJImageType.PACKAGE_MJ) { - let imageBaseUrl = this.mj_globalSetting.mj_imagePackageSetting.selectedProxy; - if (imageBaseUrl != "empty" && imageBaseUrl && imageBaseUrl != '') { - task_res.imageClick = task_res.imageClick.replace(/https?:\/\/[^/]+/, imageBaseUrl) + // let imageBaseUrl = this.mj_globalSetting.mj_imagePackageSetting.selectedProxy; + // if (imageBaseUrl != "empty" && imageBaseUrl && imageBaseUrl != '') { + // task_res.imageClick = task_res.imageClick.replace(/https?:\/\/[^/]+/, imageBaseUrl) + // } + + // 判断是不是有批量的图片 + if (task_res.subImagePath.length > 0) { + batchImages = [...task_res.subImagePath] } + } + let imageRes: string[] = [] await CheckFolderExistsOrCreate(path.dirname(imagePath)) - await this.tools.downloadFileUrl(task_res.imageClick, imagePath) - // 进行图片裁剪 - let imageRes = await ImageSplit(imagePath, bookTaskDetail.name, path.join(book.bookFolderPath, 'data\\MJOriginalImage')); - if (imageRes && imageRes.length < 4) { - throw new Error("图片裁剪失败") + if (batchImages.length <= 0) { + await this.tools.downloadFileUrl(task_res.imageClick, imagePath) + // 进行图片裁剪 + imageRes = await ImageSplit(imagePath, bookTaskDetail.name, path.join(book.bookFolderPath, 'data\\MJOriginalImage')); + if (imageRes && imageRes.length < 4) { + throw new Error("图片裁剪失败") + } + } else { + // 下载每一个 + // let imagePath = path.join(book.bookFolderPath, `data\\MJOriginalImage\\${task_res.messageId}.png`); + for (let i = 0; i < batchImages.length; i++) { + const element = batchImages[i]; + let tempPath = path.join(book.bookFolderPath, `data\\MJOriginalImage\\${task_res.messageId}_${i}.png`); + await this.tools.downloadFileUrl(element, tempPath) + imageRes.push(tempPath) + } } // 修改数据库数据,将图片保存到对应的文件夹中 diff --git a/src/main/Service/MJ/mjApi.ts b/src/main/Service/MJ/mjApi.ts index 2b36300..45d6c1b 100644 --- a/src/main/Service/MJ/mjApi.ts +++ b/src/main/Service/MJ/mjApi.ts @@ -278,6 +278,19 @@ class MJApi { message: resData.failReason, mjApiUrl: this.fetchTaskUrl, } as MJ.MJResponseToFront + + // 生图包的处理 + + if (resData.isYouChuan && resData.youChuanTaskId && resData.youChuanTaskInfo && resData.youChuanTaskInfo.imgUrls && resData.youChuanTaskInfo.imgUrls.length == 4) { + + // 满足指定条件的数据才能返回 + + let tempRes = resData.youChuanTaskInfo.imgUrls + .filter(item => item.status == 'ok') + .map(item => item.url); + resObj.subImagePath = tempRes + } + return resObj } catch (error) { throw error