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

+ 191 - 64
app/Services/DeepSeek/DeepSeekService.php

@@ -2945,32 +2945,75 @@ class DeepSeekService
         $fullReasoningContent = '';
         $usage = [];
         
-        if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
-            // DeepSeek 官方模型使用 DeepSeek API
-            $streamGenerator = $this->deepSeekStreamResponse($post_data);
-        } else {
-            // 其他模型使用火山引擎API
-            $streamGenerator = $this->volcEngineChatCompletion($post_data);
-        }
+        try {
+            if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
+                // DeepSeek 官方模型使用 DeepSeek API
+                $streamGenerator = $this->deepSeekStreamResponse($post_data);
+            } else {
+                // 其他模型使用火山引擎API
+                $streamGenerator = $this->volcEngineChatCompletion($post_data);
+            }
 
-        // 处理流式输出
-        if (!is_iterable($streamGenerator)) {
-            dLog('deepseek')->error('addChat流式生成器无效', ['generator_type' => gettype($streamGenerator)]);
-            Utils::throwError('20003:接口返回数据异常,请重新请求');
-        }
-        
-        foreach ($streamGenerator as $chunk) {
-            if (isset($chunk['type'])) {
-                if ($chunk['type'] === 'done') {
-                    // 最终结果
-                    $fullContent = $chunk['full_content'];
-                    $fullReasoningContent = $chunk['full_reasoning'];
-                    $usage = isset($chunk['usage']) ? $chunk['usage'] : [];
-                } else {
-                    // 逐块yield数据
-                    yield $chunk;
+            // 验证返回值类型
+            if (!is_iterable($streamGenerator)) {
+                $errorType = is_object($streamGenerator) ? get_class($streamGenerator) : gettype($streamGenerator);
+                dLog('deepseek')->error('addChat流式生成器无效', [
+                    'generator_type' => $errorType,
+                    'model' => $model,
+                    'anime_id' => $anime_id
+                ]);
+                logDB('deepseek', 'error', 'addChat流式生成器类型错误', [
+                    'type' => $errorType,
+                    'model' => $model
+                ]);
+                
+                yield [
+                    'type' => 'error',
+                    'script' => [],
+                    'episode' => [],
+                    'answer' => '',
+                    'reasoning' => '',
+                    'usage' => [],
+                    'error' => '接口返回数据异常,请重新请求'
+                ];
+                return;
+            }
+            
+            // 处理流式输出
+            foreach ($streamGenerator as $chunk) {
+                if (isset($chunk['type'])) {
+                    if ($chunk['type'] === 'done') {
+                        // 最终结果
+                        $fullContent = $chunk['full_content'];
+                        $fullReasoningContent = $chunk['full_reasoning'];
+                        $usage = isset($chunk['usage']) ? $chunk['usage'] : [];
+                    } else {
+                        // 逐块yield数据
+                        yield $chunk;
+                    }
                 }
             }
+        } catch (\Exception $e) {
+            dLog('deepseek')->error('addChat流式处理异常: ' . $e->getMessage(), [
+                'model' => $model,
+                'anime_id' => $anime_id,
+                'trace' => $e->getTraceAsString()
+            ]);
+            logDB('deepseek', 'error', 'addChat流式处理失败', [
+                'error' => $e->getMessage(),
+                'model' => $model
+            ]);
+            
+            yield [
+                'type' => 'error',
+                'script' => [],
+                'episode' => [],
+                'answer' => '',
+                'reasoning' => '',
+                'usage' => [],
+                'error' => '处理请求时发生异常: ' . $e->getMessage()
+            ];
+            return;
         }
 
         dLog('deepseek')->info('完整内容: '.$fullContent);
@@ -3674,27 +3717,68 @@ class DeepSeekService
         
         // dd($post_data);
         // dLog('deepseek')->info('请求参数: '.json_encode($post_data, 256));
-        if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
-            // DeepSeek 官方模型使用 DeepSeek API
-            $streamGenerator = $this->deepSeekStreamResponse($post_data);
-        } else {
-            // 其他模型使用火山引擎API
-            $streamGenerator = $this->volcEngineChatCompletion($post_data);
-        }
+        try {
+            if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
+                $streamGenerator = $this->deepSeekStreamResponse($post_data);
+            } else {
+                $streamGenerator = $this->volcEngineChatCompletion($post_data);
+            }
 
-        // 处理流式输出
-        foreach ($streamGenerator as $chunk) {
-            if (isset($chunk['type'])) {
-                if ($chunk['type'] === 'done') {
-                    // 最终结果
-                    $fullContent = $chunk['full_content'];
-                    $fullReasoningContent = $chunk['full_reasoning'];
-                    $usage = isset($chunk['usage']) ? $chunk['usage'] : [];
-                } else {
-                    // 逐块yield数据
-                    yield $chunk;
+            // 验证返回值类型
+            if (!is_iterable($streamGenerator)) {
+                $errorType = is_object($streamGenerator) ? get_class($streamGenerator) : gettype($streamGenerator);
+                dLog('deepseek')->error('方法名流式生成器无效', [
+                    'generator_type' => $errorType,
+                    'model' => $model,
+                    // 添加其他上下文信息
+                ]);
+                logDB('deepseek', 'error', '方法名流式生成器类型错误', [
+                    'type' => $errorType,
+                    'model' => $model
+                ]);
+                
+                yield [
+                    'type' => 'error',
+                    // 根据方法返回相应的空数据结构
+                    'answer' => '',
+                    'reasoning' => '',
+                    'usage' => [],
+                    'error' => '接口返回数据异常,请重新请求'
+                ];
+                return;
+            }
+            
+            // 处理流式输出
+            foreach ($streamGenerator as $chunk) {
+                if (isset($chunk['type'])) {
+                    if ($chunk['type'] === 'done') {
+                        $fullContent = $chunk['full_content'];
+                        $fullReasoningContent = $chunk['full_reasoning'];
+                        $usage = isset($chunk['usage']) ? $chunk['usage'] : [];
+                    } else {
+                        yield $chunk;
+                    }
                 }
             }
+        } catch (\Exception $e) {
+            dLog('deepseek')->error('方法名流式处理异常: ' . $e->getMessage(), [
+                'model' => $model,
+                'trace' => $e->getTraceAsString()
+            ]);
+            logDB('deepseek', 'error', '方法名流式处理失败', [
+                'error' => $e->getMessage(),
+                'model' => $model
+            ]);
+            
+            yield [
+                'type' => 'error',
+                // 根据方法返回相应的空数据结构
+                'answer' => '',
+                'reasoning' => '',
+                'usage' => [],
+                'error' => '处理请求时发生异常: ' . $e->getMessage()
+            ];
+            return;
         }
 
         dLog('deepseek')->info('完整内容: '.$fullContent);
@@ -4241,32 +4325,75 @@ class DeepSeekService
         $fullReasoningContent = '';
         $usage = [];
         
-        if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
-            // DeepSeek 官方模型使用 DeepSeek API
-            $streamGenerator = $this->deepSeekStreamResponse($post_data);
-        } else {
-            // 其他模型使用火山引擎API
-            $streamGenerator = $this->volcEngineChatCompletion($post_data);
-        }
+        try {
+            if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
+                // DeepSeek 官方模型使用 DeepSeek API
+                $streamGenerator = $this->deepSeekStreamResponse($post_data);
+            } else {
+                // 其他模型使用火山引擎API
+                $streamGenerator = $this->volcEngineChatCompletion($post_data);
+            }
 
-        // 处理流式输出
-        if (!is_iterable($streamGenerator)) {
-            dLog('deepseek')->error('chat流式生成器无效', ['generator_type' => gettype($streamGenerator)]);
-            Utils::throwError('20003:接口返回数据异常,请重新请求');
-        }
-        
-        foreach ($streamGenerator as $chunk) {
-            if (isset($chunk['type'])) {
-                if ($chunk['type'] === 'done') {
-                    // 最终结果
-                    $fullContent = $chunk['full_content'];
-                    $fullReasoningContent = $chunk['full_reasoning'];
-                    $usage = isset($chunk['usage']) ? $chunk['usage'] : [];
-                } else {
-                    // 逐块yield数据
-                    yield $chunk;
+            // 验证返回值类型
+            if (!is_iterable($streamGenerator)) {
+                $errorType = is_object($streamGenerator) ? get_class($streamGenerator) : gettype($streamGenerator);
+                dLog('deepseek')->error('chat流式生成器无效', [
+                    'generator_type' => $errorType,
+                    'model' => $model,
+                    'anime_id' => $anime_id,
+                    'episode_number' => $episode_number
+                ]);
+                logDB('deepseek', 'error', 'chat流式生成器类型错误', [
+                    'type' => $errorType,
+                    'model' => $model
+                ]);
+                
+                yield [
+                    'type' => 'error',
+                    'episode' => [],
+                    'answer' => '',
+                    'reasoning' => '',
+                    'usage' => [],
+                    'error' => '接口返回数据异常,请重新请求'
+                ];
+                return;
+            }
+            
+            // 处理流式输出
+            foreach ($streamGenerator as $chunk) {
+                if (isset($chunk['type'])) {
+                    if ($chunk['type'] === 'done') {
+                        // 最终结果
+                        $fullContent = $chunk['full_content'];
+                        $fullReasoningContent = $chunk['full_reasoning'];
+                        $usage = isset($chunk['usage']) ? $chunk['usage'] : [];
+                    } else {
+                        // 逐块yield数据
+                        yield $chunk;
+                    }
                 }
             }
+        } catch (\Exception $e) {
+            dLog('deepseek')->error('chat流式处理异常: ' . $e->getMessage(), [
+                'model' => $model,
+                'anime_id' => $anime_id,
+                'episode_number' => $episode_number,
+                'trace' => $e->getTraceAsString()
+            ]);
+            logDB('deepseek', 'error', 'chat流式处理失败', [
+                'error' => $e->getMessage(),
+                'model' => $model
+            ]);
+            
+            yield [
+                'type' => 'error',
+                'episode' => [],
+                'answer' => '',
+                'reasoning' => '',
+                'usage' => [],
+                'error' => '处理请求时发生异常: ' . $e->getMessage()
+            ];
+            return;
         }
 
         dLog('deepseek')->info('完整内容: '.$fullContent);