chore: 升级到 Python 3.14 并现代化代码

- 升级 Docker 基础镜像从 Python 3.12 到 3.14
- 更新 pyproject.toml 支持 Python 3.13/3.14
- 移除 Python 3.8/3.9/3.10/3.11 分类器
- 更新 black 和 mypy 配置目标版本
- 将 get_event_loop() 替换为 get_running_loop() 加上 RuntimeError 处理
- 简化 compute_cost_sync 中的 asyncio.run 使用
- Dict/List/Tuple/Set → dict/list/tuple/set (PEP 585)
- Optional[T] → T | None (PEP 604)
- Union[A, B] → A | B (PEP 604)
- 移除废弃的 typing 导入
- 移除不必要的字符串引号注解
This commit is contained in:
AAEE86
2026-01-30 03:10:21 +08:00
parent 3e75bc8964
commit 24d24f6829
255 changed files with 4062 additions and 4173 deletions

View File

@@ -9,7 +9,6 @@ CliMessageHandlerBase._convert_sse_line 单元测试
"""
import json
from typing import Any, Dict, List, Optional
from unittest.mock import MagicMock, patch
import pytest
@@ -27,7 +26,7 @@ class MockCliHandler:
ctx: StreamContext,
line: str,
events: list,
) -> List[str]:
) -> list[str]:
"""复制自 CliMessageHandlerBase._convert_sse_line"""
from src.core.api_format.conversion import (
format_conversion_registry,

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, Optional
from typing import Any
from src.api.handlers.base.response_parser import ParsedChunk, ParsedResponse, ResponseParser, StreamStats
from src.api.handlers.base.stream_context import StreamContext
@@ -7,16 +7,16 @@ from src.utils.sse_parser import SSEEventParser
class DummyParser(ResponseParser):
def parse_sse_line(self, line: str, stats: StreamStats) -> Optional[ParsedChunk]:
def parse_sse_line(self, line: str, stats: StreamStats) -> ParsedChunk | None:
return None
def parse_response(self, response: Dict[str, Any], status_code: int) -> ParsedResponse:
def parse_response(self, response: dict[str, Any], status_code: int) -> ParsedResponse:
return ParsedResponse(raw_response=response, status_code=status_code)
def extract_usage_from_response(self, response: Dict[str, Any]) -> Dict[str, int]:
def extract_usage_from_response(self, response: dict[str, Any]) -> dict[str, int]:
return {}
def extract_text_content(self, response: Dict[str, Any]) -> str:
def extract_text_content(self, response: dict[str, Any]) -> str:
return ""

View File

@@ -1,5 +1,5 @@
import json
from typing import Any, Dict, Optional
from typing import Any
from unittest.mock import AsyncMock
import pytest
@@ -11,16 +11,16 @@ from src.core.api_format.conversion import register_default_normalizers
class DummyParser(ResponseParser):
def parse_sse_line(self, line: str, stats: StreamStats) -> Optional[Any]: # noqa: ANN401
def parse_sse_line(self, line: str, stats: StreamStats) -> Any | None: # noqa: ANN401
return None
def parse_response(self, response: Dict[str, Any], status_code: int) -> ParsedResponse:
def parse_response(self, response: dict[str, Any], status_code: int) -> ParsedResponse:
return ParsedResponse(raw_response=response, status_code=status_code)
def extract_usage_from_response(self, response: Dict[str, Any]) -> Dict[str, int]:
def extract_usage_from_response(self, response: dict[str, Any]) -> dict[str, int]:
return {}
def extract_text_content(self, response: Dict[str, Any]) -> str:
def extract_text_content(self, response: dict[str, Any]) -> str:
return ""