|
|
@@ -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 ?? []
|
|
|
];
|
|
|
}
|
|
|
|