Просмотр исходного кода

画风调整成可以为空,并优化画风使用细节

lh 19 часов назад
Родитель
Сommit
0aee8a0855

+ 2 - 2
app/Console/Anime/AnimeCheckImgUrlCommand.php

@@ -281,7 +281,7 @@ class AnimeCheckImgUrlCommand extends Command
                         //     // $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                         //     // $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                         //     $description = "主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                         //     $description = "主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                         // }
                         // }
-                        $description = "{$character_prefix}。\n主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+                        $description = buildStylePromptPrefix($character_prefix) . "主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
 
 
                         $params = [
                         $params = [
                             'prompt' => $description,
                             'prompt' => $description,
@@ -359,7 +359,7 @@ class AnimeCheckImgUrlCommand extends Command
                         //     // $description = "美术风格:\n{$art_style}\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                         //     // $description = "美术风格:\n{$art_style}\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                         //     $description = "场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                         //     $description = "场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                         // }
                         // }
-                        $description = "{$scene_prefix}。\n场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+                        $description = buildStylePromptPrefix($scene_prefix) . "场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
 
 
                         $params = [
                         $params = [
                             'prompt' => $description,
                             'prompt' => $description,

+ 2 - 4
app/Http/Controllers/Manage/ArtStyleController.php

@@ -76,7 +76,7 @@ class ArtStyleController extends BaseController
             'art_style'        => 'required|string|max:100',
             'art_style'        => 'required|string|max:100',
             'pic_url'          => 'required|string|max:500',
             'pic_url'          => 'required|string|max:500',
             'aliases'          => 'nullable',
             'aliases'          => 'nullable',
-            'prompt'           => 'required|string',
+            'prompt'           => 'nullable|string',
             'character_prefix' => 'nullable|string',
             'character_prefix' => 'nullable|string',
             'scene_prefix'     => 'nullable|string',
             'scene_prefix'     => 'nullable|string',
             'is_enabled'       => 'nullable|integer|in:0,1',
             'is_enabled'       => 'nullable|integer|in:0,1',
@@ -85,7 +85,6 @@ class ArtStyleController extends BaseController
             'art_style.max'      => '画风名称不能超过100个字符',
             'art_style.max'      => '画风名称不能超过100个字符',
             'pic_url.required'   => '请传入画风图片URL',
             'pic_url.required'   => '请传入画风图片URL',
             'pic_url.max'        => '画风图片URL不能超过500个字符',
             'pic_url.max'        => '画风图片URL不能超过500个字符',
-            'prompt.required'    => '请传入画风提示词prompt',
             'is_enabled.in'      => 'is_enabled仅支持0或1',
             'is_enabled.in'      => 'is_enabled仅支持0或1',
         ]);
         ]);
 
 
@@ -113,7 +112,7 @@ class ArtStyleController extends BaseController
             'pic_url'          => 'required|string|max:500',
             'pic_url'          => 'required|string|max:500',
             'art_style'        => 'nullable|string|max:100',
             'art_style'        => 'nullable|string|max:100',
             'aliases'          => 'nullable',
             'aliases'          => 'nullable',
-            'prompt'           => 'required|string',
+            'prompt'           => 'nullable|string',
             'character_prefix' => 'nullable|string',
             'character_prefix' => 'nullable|string',
             'scene_prefix'     => 'nullable|string',
             'scene_prefix'     => 'nullable|string',
             'is_enabled'       => 'nullable|integer|in:0,1',
             'is_enabled'       => 'nullable|integer|in:0,1',
@@ -124,7 +123,6 @@ class ArtStyleController extends BaseController
             'pic_url.required' => '请传入画风图片URL',
             'pic_url.required' => '请传入画风图片URL',
             'pic_url.max'      => '画风图片URL不能超过500个字符',
             'pic_url.max'      => '画风图片URL不能超过500个字符',
             'art_style.max'    => '画风名称不能超过100个字符',
             'art_style.max'    => '画风名称不能超过100个字符',
-            'prompt.required'  => '请传入画风提示词prompt',
             'is_enabled.in'    => 'is_enabled仅支持0或1',
             'is_enabled.in'    => 'is_enabled仅支持0或1',
         ]);
         ]);
 
 

+ 13 - 0
app/Libs/Helpers.php

@@ -5561,3 +5561,16 @@ function upgrade480pTo720p($videoSource, $prefix = 'video', $isContent = false,
         return $isContent ? '' : $videoSource;
         return $isContent ? '' : $videoSource;
     }
     }
 }
 }
+
+/**
+ * 拼接画风前缀;前缀为空时返回空字符串,避免提示词以句号开头
+ *
+ * @param mixed $prefix
+ * @return string
+ */
+function buildStylePromptPrefix($prefix): string
+{
+    $prefix = trim((string)$prefix);
+
+    return $prefix === '' ? '' : $prefix . "。\n";
+}

+ 4 - 4
app/Services/Anime/AnimeService.php

@@ -332,7 +332,7 @@ class AnimeService
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($role, 'description');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($role, 'description');
             
             
             // if ($art_style) $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
             // if ($art_style) $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
-            $description = "{$character_prefix}。\n主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+            $description = buildStylePromptPrefix($character_prefix) . "主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
             // 参考图地址
             // 参考图地址
             $ref_img_url = getProp($role, 'url');
             $ref_img_url = getProp($role, 'url');
             if ($ref_img_url) continue;     // 已有图片则跳过
             if ($ref_img_url) continue;     // 已有图片则跳过
@@ -405,7 +405,7 @@ class AnimeService
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($scene, 'description');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($scene, 'description');
             
             
             // if ($art_style) $description = "美术风格:\n{$art_style}\n\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
             // if ($art_style) $description = "美术风格:\n{$art_style}\n\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
-            $description = "{$scene_prefix}。\n场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+            $description = buildStylePromptPrefix($scene_prefix) . "场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
             // 参考图地址
             // 参考图地址
             $ref_img_url = getProp($scene, 'url');
             $ref_img_url = getProp($scene, 'url');
             if ($ref_img_url) continue;     // 已有图片则跳过
             if ($ref_img_url) continue;     // 已有图片则跳过
@@ -6646,7 +6646,7 @@ class AnimeService
                     //     // $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                     //     // $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                     //     $description = "主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                     //     $description = "主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                     // }
                     // }
-                    $description = "{$character_prefix}。\n主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+                    $description = buildStylePromptPrefix($character_prefix) . "主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
                     
                     
                     $params = [
                     $params = [
                         'prompt' => $description,
                         'prompt' => $description,
@@ -6724,7 +6724,7 @@ class AnimeService
                     //     // $description = "美术风格:\n{$art_style}\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                     //     // $description = "美术风格:\n{$art_style}\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                     //     $description = "场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                     //     $description = "场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                     // }
                     // }
-                    $description = "{$scene_prefix}。\n场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+                    $description = buildStylePromptPrefix($scene_prefix) . "场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
                     
                     
                     $params = [
                     $params = [
                         'prompt' => $description,
                         'prompt' => $description,

+ 36 - 23
app/Services/DeepSeek/DeepSeekService.php

@@ -3100,30 +3100,39 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             return '';
             return '';
         }
         }
 
 
-        return $this->getArtStylePromptMappings($normalizedInput);
-
-        // foreach ($this->getArtStylePromptMappings() as $mapping) {
-        //     foreach ($mapping['aliases'] as $alias) {
-        //         $normalizedAlias = $this->normalizeArtStyleInput($alias);
-        //         if ($normalizedAlias === '') {
-        //             continue;
-        //         }
-
-        //         if (strpos($normalizedInput, $normalizedAlias) !== false || strpos($normalizedAlias, $normalizedInput) !== false) {
-        //             return $mapping['prompt'];
-        //         }
-        //     }
-        // }
+        // 按归一化画风名匹配(去除中英文空格等差异),表数据与内置映射通用
+        $mappings = $this->getArtStylePromptMappings();
+        if (!is_array($mappings)) {
+            return '';
+        }
+
+        foreach ($mappings as $artStyleName => $mapping) {
+            if ($this->normalizeArtStyleInput($artStyleName) === $normalizedInput) {
+                return (string)getProp($mapping, 'prompt', '');
+            }
+        }
 
 
         return '';
         return '';
     }
     }
 
 
     public function getArtStyleShortPromptByInput($inputArtStyle) {
     public function getArtStyleShortPromptByInput($inputArtStyle) {
-        // 优先从画风表读取;character_prefix/scene_prefix 缺失时用通用 prompt 兜底,均缺失则返回空数组
-        $row = DB::table('mp_art_styles')
-            ->where('art_style', $inputArtStyle)
+        $normalizedInput = $this->normalizeArtStyleInput($inputArtStyle);
+        if ($normalizedInput === '') {
+            return [];
+        }
+
+        // 优先从画风表读取(按归一化画风名匹配,停用画风保持可用);
+        // character_prefix/scene_prefix 缺失时用通用 prompt 兜底,均缺失则返回空数组
+        $row = null;
+        $dbRows = DB::table('mp_art_styles')
             ->where('is_deleted', 0)
             ->where('is_deleted', 0)
-            ->first(['character_prefix', 'scene_prefix', 'prompt']);
+            ->get(['art_style', 'character_prefix', 'scene_prefix', 'prompt']);
+        foreach ($dbRows as $dbRow) {
+            if ($this->normalizeArtStyleInput($dbRow->art_style) === $normalizedInput) {
+                $row = $dbRow;
+                break;
+            }
+        }
         if ($row) {
         if ($row) {
             $prompt = (string)$row->prompt;
             $prompt = (string)$row->prompt;
             $result = [
             $result = [
@@ -3215,8 +3224,12 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             ]
             ]
         ];
         ];
 
 
-        if (isset($stylePrefixes[$inputArtStyle])) {
-            $item = $stylePrefixes[$inputArtStyle];
+        // 内置映射同样按归一化画风名匹配
+        foreach ($stylePrefixes as $artStyleName => $item) {
+            if ($this->normalizeArtStyleInput($artStyleName) !== $normalizedInput) {
+                continue;
+            }
+
             $prompt = (string)($item['prompt'] ?? '');
             $prompt = (string)($item['prompt'] ?? '');
             // 前缀缺失时用通用 prompt 兜底
             // 前缀缺失时用通用 prompt 兜底
             $result = [
             $result = [
@@ -15557,7 +15570,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             $pic_prompt = getProp($role, 'pic_prompt');
             $pic_prompt = getProp($role, 'pic_prompt');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($role, 'description');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($role, 'description');
             
             
-            $description = "{$character_prefix}。\n主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+            $description = buildStylePromptPrefix($character_prefix) . "主体描述:{$description}\n超高清,高细节,主体突出,构图合理,画面干净,无场景或背景,单人物,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
             
             
             $update_flag = true;
             $update_flag = true;
             
             
@@ -15649,7 +15662,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             $pic_prompt = getProp($scene, 'pic_prompt');
             $pic_prompt = getProp($scene, 'pic_prompt');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($scene, 'description');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($scene, 'description');
             
             
-            $description = "{$scene_prefix}。\n场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+            $description = buildStylePromptPrefix($scene_prefix) . "场景描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
             
             
             $update_flag = true;
             $update_flag = true;
             
             
@@ -15741,7 +15754,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             $pic_prompt = getProp($prop, 'pic_prompt');
             $pic_prompt = getProp($prop, 'pic_prompt');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($prop, 'description');
             $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($prop, 'description');
             
             
-            $description = "{$prop_prefix}。\n道具描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
+            $description = buildStylePromptPrefix($prop_prefix) . "道具描述:{$description}\n无人物,超高清,高细节,主体突出,构图合理,画面干净,无文字,无水印,无字幕,电影级光影,视觉焦点明确";
             
             
             $update_flag = true;
             $update_flag = true;
             
             

+ 0 - 7
app/Services/Manage/ArtStyleService.php

@@ -59,9 +59,6 @@ class ArtStyleService
         if ($picUrl === '') {
         if ($picUrl === '') {
             Utils::throwError('1002:请传入画风图片URL');
             Utils::throwError('1002:请传入画风图片URL');
         }
         }
-        if (trim((string)getProp($params, 'prompt', '')) === '') {
-            Utils::throwError('1002:请传入画风提示词prompt');
-        }
         if (DB::table('mp_art_styles')->where('art_style', $artStyle)->where('is_deleted', 0)->exists()) {
         if (DB::table('mp_art_styles')->where('art_style', $artStyle)->where('is_deleted', 0)->exists()) {
             Utils::throwError('1002:画风名称已存在');
             Utils::throwError('1002:画风名称已存在');
         }
         }
@@ -123,11 +120,7 @@ class ArtStyleService
         }
         }
         $update['pic_url'] = $picUrl;
         $update['pic_url'] = $picUrl;
 
 
-        // prompt 必填(非空)
         $prompt = trim((string)getProp($params, 'prompt', ''));
         $prompt = trim((string)getProp($params, 'prompt', ''));
-        if ($prompt === '') {
-            Utils::throwError('1002:请传入画风提示词prompt');
-        }
         $update['prompt'] = $prompt;
         $update['prompt'] = $prompt;
 
 
         // aliases 不传时默认使用画风名(新画风名优先,未改则沿用原画风名)
         // aliases 不传时默认使用画风名(新画风名优先,未改则沿用原画风名)