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

视频生成任务失败时记录完整响应体

lh 4 недель назад
Родитель
Сommit
9fbd1fd469
1 измененных файлов с 55 добавлено и 17 удалено
  1. 55 17
      app/Services/AIGeneration/AIVideoGenerationService.php

+ 55 - 17
app/Services/AIGeneration/AIVideoGenerationService.php

@@ -209,8 +209,11 @@ class AIVideoGenerationService
             }
         } catch (\Exception $e) {
             // 记录错误
+            $error = $this->buildGatewayErrorPayload($e);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
-                'error_message' => 'API请求失败: ' . $e->getMessage()
+                'error_message' => $error['error_message'],
+                'result_json' => $error['payload'],
+                'extra_params' => array_merge($task->extra_params, ['api_response' => $error['payload']])
             ]);
             Utils::throwError('1001:'.$e->getMessage());
         }
@@ -851,14 +854,45 @@ class AIVideoGenerationService
             }
         } catch (\Exception $e) {
             // 记录错误
+            $error = $this->buildGatewayErrorPayload($e);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
-                'error_message' => 'API请求失败: ' . $e->getMessage()
+                'error_message' => $error['error_message'],
+                'result_json' => $error['payload'],
+                'extra_params' => array_merge($task->extra_params, ['api_response' => $error['payload']])
             ]);
             Utils::throwError('1001:'.$e->getMessage());
         }
     }
 
     /**
+     * 提取网关请求异常的响应体,尽量完整记录到 result_json
+     *
+     * @param \Exception $e
+     * @return array ['error_message' => string, 'payload' => array]
+     */
+    private function buildGatewayErrorPayload(\Exception $e): array
+    {
+        $errorBody = '';
+        if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
+            try {
+                $errorBody = (string)$e->getResponse()->getBody();
+            } catch (\Throwable $ignored) {
+            }
+        }
+
+        $payload = ['exception' => $e->getMessage()];
+        if ($errorBody !== '') {
+            $decoded = json_decode($errorBody, true);
+            $payload['response_body'] = (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) ? $decoded : $errorBody;
+        }
+
+        return [
+            'error_message' => 'API请求失败: ' . $e->getMessage() . ($errorBody !== '' ? ' 响应: ' . mb_substr($errorBody, 0, 500) : ''),
+            'payload' => $payload,
+        ];
+    }
+
+    /**
      * 创建快快AI Seedance 2.0/2.5 视频生成任务
      * 接口:POST {KUAIKUAI_AI_BASE_URL}/v1/video/generations(火山豆包格式)
      * 根据入参自动选择场景:多模态参考生视频 > 首尾帧 > 首帧 > 文生视频(API地址一致,仅入参兼容)
@@ -992,8 +1026,11 @@ class AIVideoGenerationService
                 ]);
             }
         } catch (\Exception $e) {
+            $error = $this->buildGatewayErrorPayload($e);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
-                'error_message' => 'API请求失败: ' . $e->getMessage()
+                'error_message' => $error['error_message'],
+                'result_json' => $error['payload'],
+                'extra_params' => array_merge($task->extra_params, ['api_response' => $error['payload']])
             ]);
             Utils::throwError('1001:' . $e->getMessage());
         }
@@ -3616,9 +3653,12 @@ class AIVideoGenerationService
             }
         } catch (\Exception $e) {
             // 记录错误
+            $error = $this->buildGatewayErrorPayload($e);
             logDB('generate', 'error', '可灵AI Omni任务异常', ['id' => $task->id, 'error' => $e->getMessage()]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
-                'error_message' => 'API请求失败: ' . $e->getMessage()
+                'error_message' => $error['error_message'],
+                'result_json' => $error['payload'],
+                'extra_params' => array_merge($task->extra_params, ['api_response' => $error['payload']])
             ]);
             dLog('generate')->error('可灵AI Omni API请求异常: ' . $e->getMessage());
         }
@@ -4862,23 +4902,20 @@ class AIVideoGenerationService
                 ]);
             }
         } catch (\GuzzleHttp\Exception\RequestException $e) {
-            $errorMsg = 'API请求失败';
-            if ($e->hasResponse()) {
-                $errorResponse = json_decode($e->getResponse()->getBody()->getContents(), true);
-                $errorMsg .= ': ' . ($errorResponse['message'] ?? $e->getMessage());
-                logDB('generate', 'error', '统一API请求失败', ['id' => $task->id, 'error' => $errorResponse]);
-            } else {
-                $errorMsg .= ': ' . $e->getMessage();
-                logDB('generate', 'error', '统一API请求失败', ['id' => $task->id, 'error' => $e->getMessage()]);
-            }
-            
+            $error = $this->buildGatewayErrorPayload($e);
+            logDB('generate', 'error', '统一API请求失败', ['id' => $task->id, 'error' => $error['payload']]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
-                'error_message' => $errorMsg
+                'error_message' => $error['error_message'],
+                'result_json' => $error['payload'],
+                'extra_params' => array_merge($task->extra_params, ['api_response' => $error['payload']])
             ]);
         } catch (\Exception $e) {
+            $error = $this->buildGatewayErrorPayload($e);
             logDB('generate', 'error', '统一API任务提交异常', ['id' => $task->id, 'error' => $e->getMessage()]);
             $task->updateStatus(MpGenerateVideoTask::STATUS_FAILED, [
-                'error_message' => 'API请求失败: ' . $e->getMessage()
+                'error_message' => $error['error_message'],
+                'result_json' => $error['payload'],
+                'extra_params' => array_merge($task->extra_params, ['api_response' => $error['payload']])
             ]);
         }
     }
@@ -5817,7 +5854,8 @@ class AIVideoGenerationService
                 return [
                     'status' => 'failed',
                     'error_message' => isset($responseData['error']) ? 
-                        ($responseData['error']['message'] ?? '查询失败') : '查询失败'
+                        ($responseData['error']['message'] ?? '查询失败') : '查询失败',
+                    'result_json' => $responseData ?? []
                 ];
             }