fix: 增强嵌入式错误的状态码提取与处理

- ParsedResponse 新增 embedded_status_code 字段存储嵌套状态码
- 新增 _extract_embedded_status_code 函数支持从多种格式提取状态码
- 非流式响应增加嵌套错误检测逻辑
- 统一使用 embedded_status_code 替代从 error_type 解析数字的方式
- fallback_orchestrator 使用嵌入式状态码进行错误记录
This commit is contained in:
fawney19
2026-01-16 11:01:05 +08:00
parent adc82532eb
commit e6a31a61db
7 changed files with 102 additions and 14 deletions

View File

@@ -358,6 +358,8 @@ class FallbackOrchestrator:
# 需要检查错误消息是否为客户端错误(如 prompt is too long这类错误不应重试
if isinstance(cause, EmbeddedErrorException):
error_message = cause.error_message or ""
# 使用嵌入式状态码(如果有),否则默认 200
embedded_status = cause.error_code or 200
if self._error_classifier.is_client_error(error_message):
logger.warning(
f" [{request_id}] 嵌入式客户端错误,停止重试: {error_message[:200]}"
@@ -366,7 +368,7 @@ class FallbackOrchestrator:
client_error = UpstreamClientException(
message=error_message or "请求无效",
provider_name=str(provider.name),
status_code=200, # 嵌入式错误的 HTTP 状态码通常是 200
status_code=embedded_status,
upstream_error=error_message,
)
RequestCandidateService.mark_candidate_failed(
@@ -374,7 +376,7 @@ class FallbackOrchestrator:
candidate_id=candidate_record_id,
error_type="UpstreamClientException",
error_message=error_message,
status_code=200,
status_code=embedded_status,
latency_ms=elapsed_ms,
concurrent_requests=captured_key_concurrent,
)
@@ -396,7 +398,7 @@ class FallbackOrchestrator:
candidate_id=candidate_record_id,
error_type="EmbeddedErrorException",
error_message=error_message,
status_code=200,
status_code=embedded_status,
latency_ms=elapsed_ms,
concurrent_requests=captured_key_concurrent,
)