feat: OAuth Token 自动刷新调度、OAuth 对话框优化及 OpenAI CLI normalizer 重构

- 系统设置新增 OAuth Token 自动刷新任务开关,支持动态调度
- OAuth 授权对话框简化步骤布局,移除编号圆圈样式
- 重构 OpenAI CLI normalizer:将 if-else 链替换为事件处理器映射表,
  将 stream_event_from_internal 拆分为独立方法
- 维护调度器在禁用刷新时移除已调度的 job
- .gitignore 新增 CLIProxyAPI/ 和 sub2api/ 排除项
- 补充 noop/unknown 事件处理器的测试覆盖
This commit is contained in:
fawney19
2026-02-05 01:07:47 +08:00
parent ba4d88e8ce
commit 9a8f25d1a9
7 changed files with 609 additions and 513 deletions

View File

@@ -17,6 +17,7 @@ from src.core.api_format.conversion.normalizers.gemini_cli import GeminiCliNorma
from src.core.api_format.conversion.normalizers.openai import OpenAINormalizer
from src.core.api_format.conversion.normalizers.openai_cli import OpenAICliNormalizer
from src.core.api_format.conversion.registry import FormatConversionRegistry
from src.core.api_format.conversion.stream_events import UnknownStreamEvent
from src.core.api_format.conversion.stream_state import StreamState
@@ -309,6 +310,36 @@ def test_stream_openai_cli_in_progress_event() -> None:
assert events2 == []
def test_stream_openai_cli_noop_and_unknown_events() -> None:
"""覆盖 OpenAI CLI noop/unknown 事件处理器"""
normalizer = OpenAICliNormalizer()
state = StreamState()
# 先触发 message_start 初始化
normalizer.stream_chunk_to_internal(
{"type": "response.created", "response": {"id": "resp_789", "model": "gpt-5"}}, state
)
# noop 事件不应产生内部事件
assert (
normalizer.stream_chunk_to_internal({"type": "response.function_call_arguments.done"}, state)
== []
)
assert (
normalizer.stream_chunk_to_internal({"type": "response.content_part.added"}, state) == []
)
assert (
normalizer.stream_chunk_to_internal({"type": "response.content_part.done"}, state) == []
)
# unknown 事件应返回 UnknownStreamEvent
events = normalizer.stream_chunk_to_internal(
{"type": "response.reasoning_summary_text.delta"}, state
)
assert len(events) == 1
assert isinstance(events[0], UnknownStreamEvent)
def test_stream_openai_cli_function_call_events() -> None:
"""测试 OpenAI CLI 流式 function_call 相关事件"""
reg = _make_registry_with_cli()