feat: 新增 Kiro 适配器、OAuth 改进与多项功能增强

- 新增 Kiro provider 适配器(EventStream 协议解析、令牌管理、用量追踪)
- 重构 OAuth 账户管理与统一配额机制
- 重构 Handler 基类(CLI adapter/handler、请求构建器、流处理器)
- 增强缓存监控后端 API 与前端可视化
- 改进 Gemini 格式标准化器与请求头处理
- Antigravity/Codex 适配器更新,移除旧 metadata_collector
- 新增数据库迁移:proxy provider API keys
- 前端 UI 多项优化

Co-Authored-By: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
fawney19
2026-02-09 01:05:48 +08:00
parent e324ffdcd6
commit b34dd12863
82 changed files with 6498 additions and 840 deletions

View File

@@ -21,12 +21,13 @@ from src.core.api_format.metadata import (
get_protected_keys_for_endpoint,
)
from src.core.api_format.signature import EndpointSignature, parse_signature_key
from src.core.logger import logger
# =============================================================================
# 头部常量定义
# =============================================================================
# 转发给上游时需要剔除的头部(系统管理 + 认证替换)
# 转发给上游时需要剔除的头部(系统管理 + 认证替换 + 客户端/代理元数据
UPSTREAM_DROP_HEADERS: frozenset[str] = frozenset(
{
# 认证头 - 会被替换为 Provider 的认证
@@ -40,6 +41,13 @@ UPSTREAM_DROP_HEADERS: frozenset[str] = frozenset(
"connection",
# 编码头 - 避免客户端请求 brotli/zstd 但 httpx 不支持
"accept-encoding",
# 反向代理 / 网关注入的头部 - 属于本站基础设施,不应泄露给上游
"x-real-ip",
"x-real-proto",
"x-forwarded-for",
"x-forwarded-proto",
"x-forwarded-host",
"x-forwarded-port",
}
)
@@ -324,8 +332,23 @@ class HeaderBuilder:
return self
def build(self) -> dict[str, str]:
"""构建最终的头部字典"""
return {original_key: value for original_key, value in self._headers.values()}
"""构建最终的头部字典
Safety net: 跳过值中包含非 ASCII 字符的头部并记录警告,
防止 httpx 发送时抛出 ``UnicodeEncodeError``。
"""
result: dict[str, str] = {}
for original_key, value in self._headers.values():
try:
value.encode("ascii")
except (UnicodeEncodeError, UnicodeDecodeError):
logger.warning(
"Dropping non-ASCII header before upstream request: {}",
original_key,
)
continue
result[original_key] = value
return result
def build_upstream_headers_for_endpoint(
@@ -565,3 +588,18 @@ def get_extra_headers_from_endpoint(endpoint: Any) -> dict[str, str] | None:
"""
header_rules = getattr(endpoint, "header_rules", None)
return extract_set_headers_from_rules(header_rules)
# =============================================================================
# 请求头辅助工具
# =============================================================================
def set_accept_if_absent(headers: dict[str, str], value: str = "text/event-stream") -> None:
"""Set the ``Accept`` header only if not already present (case-insensitive check).
Used by stream handlers to request SSE format from upstream without overriding
provider-specific Accept headers (e.g. Kiro's ``application/vnd.amazon.eventstream``).
"""
if not any(k.lower() == "accept" for k in headers):
headers["Accept"] = value