feat: 新增 Thinking 整流器处理跨 Provider 签名错误 (#115)

当 Provider A 生成的 thinking 块被发送到 Provider B 时,签名验证会失败。
本次更新实现了自动整流机制,在遇到签名错误时自动清洗 thinking 块后重试。

主要更改:
- 新增 ThinkingRectifier 整流器,移除 thinking 块和 signature 字段
- 新增 ThinkingSignatureException 异常类型
- ErrorClassifier 新增 Thinking 错误模式检测
- FallbackOrchestrator 支持整流后在当前候选重试
- Handler 层传递 request_body_ref 容器支持请求体动态修改
- Usage API 新增 has_rectified 字段标识整流过的请求
- 新增 THINKING_RECTIFIER_ENABLED 配置项控制功能开关

其他改进:
- CacheAwareScheduler 支持 exact/convertible 候选分组排序
- StreamProcessor 预读阶段新增格式转换试验
- ProviderAPIKey.api_formats 改为可空(None 表示支持所有格式)
- Dockerfile 修复 entrypoint.sh 换行符问题

Closes #115
Co-Authored-By: FredericMN <FredericMN@users.noreply.github.com>
This commit is contained in:
fawney19
2026-01-22 14:17:59 +08:00
parent cc5db20c58
commit af1828dd32
19 changed files with 1211 additions and 45 deletions

View File

@@ -17,9 +17,9 @@ import httpx
from fastapi import HTTPException, status
from fastapi.responses import JSONResponse
from ..config import config
from src.core.logger import logger
from ..config import config
# Pydantic 错误消息中英文翻译映射
PYDANTIC_ERROR_TRANSLATIONS = {
@@ -139,7 +139,6 @@ def translate_pydantic_errors(errors: List[Dict[str, Any]]) -> str:
return "; ".join(translated)
# 延迟导入韧性管理器,避免循环导入
def get_resilience_manager():
try:
@@ -530,6 +529,26 @@ class UpstreamClientException(ProxyException):
)
class ThinkingSignatureException(UpstreamClientException):
"""Thinking 块签名验证失败异常"""
def __init__(
self,
message: str,
provider_name: Optional[str] = None,
upstream_error: Optional[str] = None,
request_metadata: Any = None,
):
super().__init__(
message=message,
provider_name=provider_name,
status_code=400,
error_type="thinking_signature_error",
upstream_error=upstream_error,
request_metadata=request_metadata,
)
class ErrorResponse:
"""统一的错误响应格式化器"""