1. 优化/适配生图包
This commit is contained in:
lq1405 2025-05-20 12:53:48 +08:00
parent 4f61785cb0
commit 50900d3465
6 changed files with 45 additions and 13 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "laitool", "name": "laitool",
"version": "3.3.6", "version": "3.3.8",
"description": "An AI tool for image processing, video processing, and other functions.", "description": "An AI tool for image processing, video processing, and other functions.",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": "laitool.cn", "author": "laitool.cn",

Binary file not shown.

View File

@ -103,7 +103,7 @@ export const gptDefine = {
画面元素每一个分镜画面输出时都要重新联系<上下文>文本并结合提取出来的<环境>进行联想分析提取当前句子最终呈现的画面中会出现的2种物品或建筑物严格执行数量为2地点是皇宫画面元素是龙椅玉台阶画面元素严禁出现出境角色名称人物名字和人称画面元素严格严禁出现灯光的描写严格严禁出现情绪气氛情感的描述严禁出现地点同上背景不变某人的特写严格禁止输出等内容 画面元素每一个分镜画面输出时都要重新联系<上下文>文本并结合提取出来的<环境>进行联想分析提取当前句子最终呈现的画面中会出现的2种物品或建筑物严格执行数量为2地点是皇宫画面元素是龙椅玉台阶画面元素严禁出现出境角色名称人物名字和人称画面元素严格严禁出现灯光的描写严格严禁出现情绪气氛情感的描述严禁出现地点同上背景不变某人的特写严格禁止输出等内容
输出格式 输出格式
直接输出每个编号对应的完整提示词字符串格式为 一定不要输出提示词中的内部元素的名称只需要输出提示词中的内容直接输出对应的完整提示词字符串即可
提示词内部元素顺序若存在 提示词内部元素顺序若存在
出镜角色角色性别, 角色年龄角色表情角色穿着肢体动作角色特效环境布局画面特效视觉效果拍摄角度画面元素 出镜角色角色性别, 角色年龄角色表情角色穿着肢体动作角色特效环境布局画面特效视觉效果拍摄角度画面元素
如果是纯环境描写格式为 如果是纯环境描写格式为
@ -151,7 +151,7 @@ export const gptDefine = {
Skills: 文本分析角色设定信息精确引用视觉叙事场景设计表情动作捕捉元素描绘提示词格式化输出 Skills: 文本分析角色设定信息精确引用视觉叙事场景设计表情动作捕捉元素描绘提示词格式化输出
Goals: 将用户提供的带编号小说文本逐句拆分严格依据<角色设定>引用描述若是当前内容包含人物但是在<角色设定>中未找到则用主角表示结合<Background>规则分析提取画面元素最终为每个编号输出一句格式为 "提示词" 的完整字符串 Goals: 将用户提供的带编号小说文本逐句拆分严格依据<角色设定>引用描述若是当前内容包含人物但是在<角色设定>中未找到则用主角表示结合<Background>规则分析提取画面元素最终为每个编号输出一句格式为 "提示词" 的完整字符串
Constrains: 分镜描述需忠实原文必须直接使用<角色设定>中的角色描述输出格式严格遵守 "提示词" 格式提示词内部用逗号分隔 Constrains: 分镜描述需忠实原文必须直接使用<角色设定>中的角色描述输出格式严格遵守 "提示词" 格式提示词内部用逗号分隔
OutputFormat: 纯文本提示词字符串每行一个例如 "xxxx, yyyy, zzzz"内部元素用中文逗号分隔 OutputFormat: 只输出纯文本提示词字符串一定不要输出提示词内部元素顺序只输出按照指定的元素顺序拼接好的提示词字符串
Workflow: Workflow:
1.接收用户提供的带编号小说文本和<角色设定> 1.接收用户提供的带编号小说文本和<角色设定>
@ -231,7 +231,7 @@ export const gptDefine = {
画面元素每一个分镜画面输出时都要重新联系<上下文>文本并结合提取出来的<环境>进行联想分析提取当前句子最终呈现的画面中会出现的2种物品或建筑物...后续描述不变需进行违禁词检查与替换 画面元素每一个分镜画面输出时都要重新联系<上下文>文本并结合提取出来的<环境>进行联想分析提取当前句子最终呈现的画面中会出现的2种物品或建筑物...后续描述不变需进行违禁词检查与替换
输出格式 输出格式
直接输出小说文本对应的完整提示词字符串 一定不要输出提示词中的内部元素的名称只需要输出提示词中的内容直接输出对应的完整提示词字符串即可
提示词内部元素顺序若存在 提示词内部元素顺序若存在
出镜角色角色表情角色穿着肢体动作角色特效(如果适用)环境布局画面特效(如果适用)视觉效果(如果适用)拍摄角度画面元素 出镜角色角色表情角色穿着肢体动作角色特效(如果适用)环境布局画面特效(如果适用)视觉效果(如果适用)拍摄角度画面元素
注意出镜角色现在会包含强制的性别信息若适用和非人类物种类型若适用特效项仅在玄幻/都市异能时出现 注意出镜角色现在会包含强制的性别信息若适用和非人类物种类型若适用特效项仅在玄幻/都市异能时出现
@ -291,7 +291,7 @@ export const gptDefine = {
Skills: 文本分析小说类型判断角色性别强制补充非人类物种识别与添加角色设定信息精确引用视觉叙事场景设计表情动作捕捉元素描绘条件化特效生成提示词格式化输出 Skills: 文本分析小说类型判断角色性别强制补充非人类物种识别与添加角色设定信息精确引用视觉叙事场景设计表情动作捕捉元素描绘条件化特效生成提示词格式化输出
Goals: 将用户提供的小说文本首先更具上下文判断小说故事类型和时代背景或者是直接通过角色设定中包含的小说故事类型或者是故事背景然后严格依据<角色设定>引用描述基础结合<Background>规则分析提取画面元素确保角色描述包含性别和物种信息特效项根据小说类型条件性添加最终输出完整的提示词信息 Goals: 将用户提供的小说文本首先更具上下文判断小说故事类型和时代背景或者是直接通过角色设定中包含的小说故事类型或者是故事背景然后严格依据<角色设定>引用描述基础结合<Background>规则分析提取画面元素确保角色描述包含性别和物种信息特效项根据小说类型条件性添加最终输出完整的提示词信息
Constrains: 分镜描述需忠实原文必须为出镜角色添加性别推断或默认和非人类物种类型若适用必须直接使用<角色设定>中的角色描述作为基础提示词内部用中文逗号分隔特效相关描述仅在识别为玄幻都市异能小说时添加 Constrains: 分镜描述需忠实原文必须为出镜角色添加性别推断或默认和非人类物种类型若适用必须直接使用<角色设定>中的角色描述作为基础提示词内部用中文逗号分隔特效相关描述仅在识别为玄幻都市异能小说时添加
OutputFormat: 纯文本提示词字符串内部元素用中文逗号分隔角色描述将包含强制的性别和物种信息根据小说类型特效相关元素可能被省略 OutputFormat: 只输出纯文本提示词字符串一定不要输出提示词内部元素顺序只输出按照指定的元素顺序拼接好的提示词字符串角色描述将包含强制的性别和物种信息根据小说类型特效相关元素可能被省略
Workflow: Workflow:
1.接收用户提供的小说文本上下文和<角色设定> 1.接收用户提供的小说文本上下文和<角色设定>

View File

@ -610,20 +610,39 @@ export class MJOpt {
}); });
// 下载图片 // 下载图片
let imagePath = path.join(book.bookFolderPath, `data\\MJOriginalImage\\${task_res.messageId}.png`); let imagePath = path.join(book.bookFolderPath, `data\\MJOriginalImage\\${task_res.messageId}.png`);
let batchImages = []
// 判断是不是生图包是的话需要替换图片的baseurl // 判断是不是生图包是的话需要替换图片的baseurl
if (this.mj_globalSetting.mj_simpleSetting.type == MJImageType.PACKAGE_MJ) { if (this.mj_globalSetting.mj_simpleSetting.type == MJImageType.PACKAGE_MJ) {
let imageBaseUrl = this.mj_globalSetting.mj_imagePackageSetting.selectedProxy; // let imageBaseUrl = this.mj_globalSetting.mj_imagePackageSetting.selectedProxy;
if (imageBaseUrl != "empty" && imageBaseUrl && imageBaseUrl != '') { // if (imageBaseUrl != "empty" && imageBaseUrl && imageBaseUrl != '') {
task_res.imageClick = task_res.imageClick.replace(/https?:\/\/[^/]+/, 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 CheckFolderExistsOrCreate(path.dirname(imagePath))
if (batchImages.length <= 0) {
await this.tools.downloadFileUrl(task_res.imageClick, imagePath) await this.tools.downloadFileUrl(task_res.imageClick, imagePath)
// 进行图片裁剪 // 进行图片裁剪
let imageRes = await ImageSplit(imagePath, bookTaskDetail.name, path.join(book.bookFolderPath, 'data\\MJOriginalImage')); imageRes = await ImageSplit(imagePath, bookTaskDetail.name, path.join(book.bookFolderPath, 'data\\MJOriginalImage'));
if (imageRes && imageRes.length < 4) { if (imageRes && imageRes.length < 4) {
throw new Error("图片裁剪失败") 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)
}
}
// 修改数据库数据,将图片保存到对应的文件夹中 // 修改数据库数据,将图片保存到对应的文件夹中
let firstImage = imageRes[0]; let firstImage = imageRes[0];

View File

@ -278,6 +278,19 @@ class MJApi {
message: resData.failReason, message: resData.failReason,
mjApiUrl: this.fetchTaskUrl, mjApiUrl: this.fetchTaskUrl,
} as MJ.MJResponseToFront } 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 return resObj
} catch (error) { } catch (error) {
throw error throw error