Explorar o código

调整对话接口中出现问题直接保存记录并返回,而不是报错

lh hai 3 meses
pai
achega
af14b21776
Modificáronse 1 ficheiros con 182 adicións e 30 borrados
  1. 182 30
      app/Services/DeepSeek/DeepSeekService.php

+ 182 - 30
app/Services/DeepSeek/DeepSeekService.php

@@ -2463,16 +2463,64 @@ class DeepSeekService
         }
         }
 
 
         dLog('deepseek')->info('完整内容: '.$fullContent);
         dLog('deepseek')->info('完整内容: '.$fullContent);
+        logDB('deepseek', 'info', '完整内容', ['content' => $fullContent, 'anime_id' => $anime_id]);
 
 
         // 处理完整内容并返回最终结果
         // 处理完整内容并返回最终结果
         $script_arr = [];
         $script_arr = [];
         if ($fullContent) {
         if ($fullContent) {
             $script_arr = handleScriptContent($fullContent);
             $script_arr = handleScriptContent($fullContent);
             dLog('deepseek')->info('解析内容', $script_arr);
             dLog('deepseek')->info('解析内容', $script_arr);
+            logDB('deepseek', 'info', '解析内容', $script_arr);
         }
         }
 
 
         if (empty($script_arr['roles'])) {
         if (empty($script_arr['roles'])) {
-            Utils::throwError('20003:未生成剧本相关的内容');
+            // 未生成剧本相关内容,保存对话记录并返回提示
+            dLog('deepseek')->info('未生成剧本相关的内容');
+            try {
+                DB::beginTransaction();
+                $now = date('Y-m-d H:i:s');
+                
+                // 保存对话记录
+                $records = [
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => 0,
+                        'role'      => 'user',
+                        'content'   => "用户问题:\n
+                        {$prompt}\n\n
+                        以下是文档内容:\n
+                        {$content}",
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ],
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => 0,
+                        'role'      => 'assistant',
+                        'content'   => $fullContent,
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ]
+                ];
+                DB::table('mp_anime_records')->insert($records);
+                DB::commit();
+            } catch (\Exception $e) {
+                DB::rollBack();
+                dLog('deepseek')->error('保存对话记录失败', ['error' => $e->getMessage()]);
+            }
+            
+            yield [
+                'type'  => 'done',
+                'script' => [],
+                'episode' => [],
+                'answer' => $fullContent,
+                'reasoning' => $fullReasoningContent,
+                'usage' => $usage,
+                'error' => '未生成剧本相关的内容,请调整提示词再试'
+            ];
+            return;
         }
         }
 
 
         // 如果需要生成原文内容,从script_arr中提取
         // 如果需要生成原文内容,从script_arr中提取
@@ -2491,15 +2539,53 @@ class DeepSeekService
         // 新建动漫
         // 新建动漫
         $anime_name = getProp($script_arr, 'script_name');
         $anime_name = getProp($script_arr, 'script_name');
         if (!$anime_name) {
         if (!$anime_name) {
-            Utils::throwError('20003:未能识别到剧本名称,请确认内容是否符合要求');
-            // yield [
-            //     'type'  => 'done',
-            //     'answer' => $fullContent,
-            //     'reasoning' => $fullReasoningContent,
-            //     'usage' => $usage,
-            //     'error' => '未能识别到剧本名称,请确认内容是否符合要求'
-            // ];
-            // return;
+            // 未识别到剧本名,保存对话记录并返回提示
+            dLog('deepseek')->info('未能识别到剧本名称');
+            try {
+                DB::beginTransaction();
+                $now = date('Y-m-d H:i:s');
+                
+                // 保存对话记录
+                $records = [
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => 0,
+                        'role'      => 'user',
+                        'content'   => "用户问题:\n
+                        {$prompt}\n\n
+                        以下是文档内容:\n
+                        {$content}",
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ],
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => 0,
+                        'role'      => 'assistant',
+                        'content'   => $fullContent,
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ]
+                ];
+                DB::table('mp_anime_records')->insert($records);
+                DB::commit();
+            } catch (\Exception $e) {
+                DB::rollBack();
+                dLog('deepseek')->error('保存对话记录失败', ['error' => $e->getMessage()]);
+            }
+            
+            yield [
+                'type'  => 'done',
+                'script' => [],
+                'episode' => [],
+                'answer' => $fullContent,
+                'reasoning' => $fullReasoningContent,
+                'usage' => $usage,
+                'error' => '未能识别到剧本名称,请调整提示词再试'
+            ];
+            return;
         }
         }
 
 
         // 确认对话名称唯一性
         // 确认对话名称唯一性
@@ -3062,24 +3148,58 @@ class DeepSeekService
         }
         }
 
 
         dLog('deepseek')->info('完整内容: '.$fullContent);
         dLog('deepseek')->info('完整内容: '.$fullContent);
+        logDB('deepseek', 'info', '完整内容', ['content' => $fullContent, 'anime_id' => $anime_id]);
 
 
         // 处理完整内容并返回最终结果
         // 处理完整内容并返回最终结果
         $script_arr = [];
         $script_arr = [];
         if ($fullContent) {
         if ($fullContent) {
             $script_arr = handleScriptContent($fullContent);
             $script_arr = handleScriptContent($fullContent);
+            dLog('deepseek')->info('解析内容', $script_arr);
+            logDB('deepseek', 'info', '解析内容', $script_arr);
         }
         }
 
 
         if (empty($script_arr['roles'])) {
         if (empty($script_arr['roles'])) {
-            Utils::throwError('20003:未生成剧本相关的内容');
-            // dLog('deepseek')->info('未生成剧本相关的内容');
-            // yield [
-            //     'type' => 'error',
-            //     'episode' => [],
-            //     'answer' => $fullContent,
-            //     'reasoning' => $fullReasoningContent,
-            //     'usage' => $usage
-            // ];
-            // return;
+            // 未生成剧本相关内容,保存对话记录并返回提示
+            dLog('deepseek')->info('未生成剧本相关的内容');
+            try {
+                $now = date('Y-m-d H:i:s');
+                
+                // 保存对话记录
+                $records = [
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => 0,
+                        'role'      => 'user',
+                        'content'   => $prompt,
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ],
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => 0,
+                        'role'      => 'assistant',
+                        'content'   => $fullContent,
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ]
+                ];
+                DB::table('mp_anime_records')->insert($records);
+            } catch (\Exception $e) {
+                dLog('deepseek')->error('保存对话记录失败', ['error' => $e->getMessage()]);
+            }
+            
+            yield [
+                'type'  => 'done',
+                'script' => [],
+                'episode' => [],
+                'answer' => $fullContent,
+                'reasoning' => $fullReasoningContent,
+                'usage' => $usage,
+                'error' => '未生成剧本相关的内容,请调整提示词再试'
+            ];
+            return;
         }
         }
 
 
         // 替换美术风格
         // 替换美术风格
@@ -3557,19 +3677,51 @@ class DeepSeekService
         }
         }
 
 
         dLog('deepseek')->info('完整内容: '.$fullContent);
         dLog('deepseek')->info('完整内容: '.$fullContent);
+        logDB('deepseek', 'info', '完整内容', ['content' => $fullContent, 'anime_id' => $anime_id]);
         // 处理完整内容并返回最终结果
         // 处理完整内容并返回最终结果
         $episode_arr = handleEpisodeContent($fullContent);
         $episode_arr = handleEpisodeContent($fullContent);
+        logDB('deepseek', 'info', '解析内容', $episode_arr);
         if (empty($episode_arr['acts'])) {
         if (empty($episode_arr['acts'])) {
-            Utils::throwError('20003:未生成分镜剧本相关的内容!');
-            // dLog('deepseek')->info('未生成分镜剧本相关的内容');
-            // yield [
-            //     'type' => 'done',
-            //     'episode' => [],
-            //     'answer' => $fullContent,
-            //     'reasoning' => $fullReasoningContent,
-            //     'usage' => $usage
-            // ];
-            // return;
+            // 未生成剧本相关内容,保存对话记录并返回提示
+            dLog('deepseek')->info('未生成分镜剧本相关的内容');
+            try {
+                $now = date('Y-m-d H:i:s');
+                
+                // 保存对话记录
+                $records = [
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => $episode_number,
+                        'role'      => 'user',
+                        'content'   => $prompt,
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ],
+                    [
+                        'uid'       => $uid,
+                        'anime_id'  => $anime_id,
+                        'sequence'  => $episode_number,
+                        'role'      => 'assistant',
+                        'content'   => $fullContent,
+                        'created_at' => $now,
+                        'updated_at' => $now
+                    ]
+                ];
+                DB::table('mp_anime_records')->insert($records);
+            } catch (\Exception $e) {
+                dLog('deepseek')->error('保存对话记录失败', ['error' => $e->getMessage()]);
+            }
+            
+            yield [
+                'type'  => 'done',
+                'episode' => [],
+                'answer' => $fullContent,
+                'reasoning' => $fullReasoningContent,
+                'usage' => $usage,
+                'error' => '未生成分镜剧本相关的内容,请调整提示词再试'
+            ];
+            return;
         }
         }
 
 
         $existing_roles = $base_episode ? json_decode((string)getProp($base_episode, 'roles'), true) : [];
         $existing_roles = $base_episode ? json_decode((string)getProp($base_episode, 'roles'), true) : [];