feat: add image upstream deadline
This commit is contained in:
@@ -290,6 +290,8 @@ def precharge_or_raise(**kwargs):
|
||||
def upstream_error(exc: Exception) -> ApiRequestError:
|
||||
if isinstance(exc, ApiRequestError):
|
||||
return exc
|
||||
if isinstance(exc, requests.Timeout):
|
||||
return ApiRequestError("upstream_timeout", "上游 AI 调用超时,已退回点数", status.HTTP_502_BAD_GATEWAY)
|
||||
if isinstance(exc, AiProviderError | requests.RequestException | OSError):
|
||||
return ApiRequestError("upstream_error", "上游 AI 调用失败,已退回点数", status.HTTP_502_BAD_GATEWAY)
|
||||
return ApiRequestError("upstream_error", "生成失败,已退回点数", status.HTTP_502_BAD_GATEWAY)
|
||||
|
||||
@@ -1514,6 +1514,37 @@ class GenerateApiTests(TestCase):
|
||||
1,
|
||||
)
|
||||
|
||||
def test_image_upstream_timeout_refunds_precharged_points_and_marks_call_failed(self):
|
||||
self.provider.image_error = requests.Timeout("image upstream deadline exceeded")
|
||||
|
||||
response = self.post_with_provider(
|
||||
"/api/v1/generate/image",
|
||||
{"prompt": "生成图片", "model": self.image_alias, "resolution": "1K"},
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 502)
|
||||
self.assertEqual(response.data["error"]["code"], "upstream_timeout")
|
||||
self.wallet.refresh_from_db()
|
||||
self.assertEqual(self.wallet.points_balance, 100)
|
||||
|
||||
call = CallRecord.objects.get(user=self.user)
|
||||
self.assertEqual(call.status, CallRecord.Status.FAILED)
|
||||
self.assertIn("image upstream deadline exceeded", call.error_message)
|
||||
self.assertEqual(
|
||||
PointsLedger.objects.filter(
|
||||
ref_call=call,
|
||||
change_type=PointsLedger.ChangeType.CONSUME,
|
||||
).count(),
|
||||
1,
|
||||
)
|
||||
self.assertEqual(
|
||||
PointsLedger.objects.filter(
|
||||
ref_call=call,
|
||||
change_type=PointsLedger.ChangeType.REFUND,
|
||||
).count(),
|
||||
1,
|
||||
)
|
||||
|
||||
def test_provider_capability_error_returns_400_and_refunds_points(self):
|
||||
self.provider.image_error = AiCapabilityError("input image is required")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user