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

1.全能模式生成分段剧本重试机制兼容无强制资产列表情况2.生成的剧本名去除两边的符号

lh 1 месяц назад
Родитель
Сommit
6ab876686a
1 измененных файлов с 53 добавлено и 4 удалено
  1. 53 4
      app/Services/DeepSeek/DeepSeekService.php

+ 53 - 4
app/Services/DeepSeek/DeepSeekService.php

@@ -5104,7 +5104,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
 
         // 新建动漫
         if ($user_anime_name == '新剧本策划') {
-            $anime_name = getProp($script_arr, 'script_name');
+            $anime_name = trim((string)getProp($script_arr, 'script_name'));
+            $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
             // if (!$anime_name) {
             //     // 未识别到剧本名,保存对话记录并返回提示
             //     dLog('deepseek')->info('未能识别到剧本名称');
@@ -5927,7 +5928,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         }
 
         if ($user_anime_name != '新剧本策划') {
-            $anime_name = isset($script_arr['script_name']) ? $script_arr['script_name'] : '';
+            $anime_name = trim((string)getProp($script_arr, 'script_name'));
+            $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
             // 确认对话名称唯一性
             if ($anime_name && $id = DB::table('mp_animes')->where('anime_name', $anime_name)->value('id')) {
                 if ($id != $anime_id) $anime_name = $anime_name . '_' . date('YmdHis');
@@ -7576,7 +7578,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
 
         // 新建动漫
         if ($user_anime_name == '新剧本策划') {
-            $anime_name = getProp($script_arr, 'script_name');
+            $anime_name = trim((string)getProp($script_arr, 'script_name'));
+            $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
             // if (!$anime_name) {
             //     // 未识别到剧本名,保存对话记录并返回提示
             //     dLog('deepseek')->info('未能识别到剧本名称');
@@ -8573,7 +8576,8 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         }
 
         if ($user_anime_name != '新剧本策划') {
-            $anime_name = isset($script_arr['script_name']) ? $script_arr['script_name'] : '';
+            $anime_name = trim((string)getProp($script_arr, 'script_name'));
+            $anime_name = preg_replace('/^[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+|[\s\x{3000}*《》〈〉「」『』【】\[\][]{}()()]+$/u', '', $anime_name) ?? $anime_name;
             // 确认对话名称唯一性
             if ($anime_name && $id = DB::table('mp_animes')->where('anime_name', $anime_name)->value('id')) {
                 if ($id != $anime_id) $anime_name = $anime_name . '_' . date('YmdHis');
@@ -9815,6 +9819,25 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             }
         }
 
+        // 最后一次重试仍校验失败时,兼容合并非强制列表中的资产,保证可以保存并返回 episodes
+        if ($validation_failed && $retry_count >= $max_retries) {
+            dLog('deepseek')->info('最后一次重试仍校验失败,合并非强制列表资产后继续保存', [
+                'retry_count' => $retry_count,
+                'last_error' => $validation_error_msg
+            ]);
+            logDB('deepseek', 'info', '最后一次重试校验失败,合并非强制资产', [
+                'error' => $validation_error_msg,
+                'anime_id' => $anime_id
+            ]);
+
+            $extra_roles = $this->mergeGeneratedResources($episode_arr['roles'] ?? [], $extra_roles, 'role');
+            $extra_scenes = $this->mergeGeneratedResources($episode_arr['scenes'] ?? [], $extra_scenes, 'scene');
+            $extra_props = $this->mergeGeneratedResources($episode_arr['props'] ?? [], $extra_props, 'prop');
+
+            $validation_failed = false;
+            $validation_error_msg = '';
+        }
+
         // 如果重试后仍然失败
         if ($validation_failed) {
             dLog('deepseek')->error('达到最大重试次数,仍未生成有效内容', [
@@ -10277,6 +10300,32 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
     }
 
     /**
+     * 将生成内容中不在强制列表中的资源合并进强制列表
+     * 用于最后一次重试仍校验失败时,兼容剧情需要的新资产
+     *
+     * @param array $generated 生成内容中的资源列表
+     * @param array $forced 强制资源列表(key为资源名称)
+     * @param string $type 资源类型:role、scene、prop
+     * @return array
+     */
+    private function mergeGeneratedResources(array $generated, array $forced, string $type): array
+    {
+        foreach ($generated as $item) {
+            $name = getProp($item, $type === 'role' ? 'role' : ($type === 'scene' ? 'scene' : 'prop'));
+            if ($name === null || $name === '') {
+                continue;
+            }
+            if ($name === '旁白') {
+                continue;
+            }
+            if (!isset($forced[$name])) {
+                $forced[$name] = $item;
+            }
+        }
+        return $forced;
+    }
+
+    /**
      * 智能匹配并替换主体和场景名称
      * 如果生成的主体或场景名称是强制设定名称的子串,则自动替换为完整名称
      *