refactor: Antigravity/Codex 服务重构为插件化适配器架构

- 将 Antigravity 和 Codex 从独立模块迁移至 src/services/provider/adapters/ 插件体系
- 新增 provider_types 和 oauth_token 模块,移除 maintenance_scheduler 中的 OAuth 定时刷新
- 增强 admin API:扩展 keys 和 provider_query 端点,新增 dashboard 路由
- 大幅增强 ProviderDetailDrawer 组件,新增 AntigravityQuotaDialog
- 改进 handler 基类(chat/cli)和错误分类器
- 优化 fetch_scheduler 和 upstream_fetcher
- 前端 UI 组件清理和优化
- 更新测试以匹配新模块结构
This commit is contained in:
fawney19
2026-02-06 16:37:06 +08:00
parent e01dfee41d
commit b88fb6273b
112 changed files with 5193 additions and 1992 deletions

View File

@@ -1,12 +1,15 @@
from __future__ import annotations
import src.services.antigravity.url_availability as ua_mod
from src.services.antigravity.constants import (
from typing import Any
import src.services.provider.adapters.antigravity.url_availability as ua_mod
from src.services.provider.adapters.antigravity.constants import (
DAILY_BASE_URL,
PROD_BASE_URL,
SANDBOX_BASE_URL,
URL_UNAVAILABLE_TTL_SECONDS,
)
from src.services.antigravity.url_availability import url_availability
from src.services.provider.adapters.antigravity.url_availability import url_availability
def _reset_state() -> None:
@@ -31,11 +34,13 @@ def test_mark_unavailable_filters_url() -> None:
url_availability.mark_unavailable(DAILY_BASE_URL)
ordered = url_availability.get_ordered_urls(prefer_daily=True)
assert ordered[0] == PROD_BASE_URL
# Sandbox → ProdDaily 被标记为不可用,应被过滤掉)
assert ordered[0] == SANDBOX_BASE_URL
assert DAILY_BASE_URL not in ordered
assert url_availability.is_available(DAILY_BASE_URL) is False
def test_ttl_recovery(monkeypatch) -> None:
def test_ttl_recovery(monkeypatch: Any) -> None:
_reset_state()
t0 = 1000.0
@@ -50,9 +55,10 @@ def test_ttl_recovery(monkeypatch) -> None:
def test_all_unavailable_fallback_returns_base_order() -> None:
_reset_state()
url_availability.mark_unavailable(PROD_BASE_URL)
url_availability.mark_unavailable(SANDBOX_BASE_URL)
url_availability.mark_unavailable(DAILY_BASE_URL)
url_availability.mark_unavailable(PROD_BASE_URL)
ordered = url_availability.get_ordered_urls(prefer_daily=True)
assert ordered == [DAILY_BASE_URL, PROD_BASE_URL]
# 全部不可用时仍返回基础顺序(允许继续尝试,等 TTL 恢复)
assert ordered == [SANDBOX_BASE_URL, DAILY_BASE_URL, PROD_BASE_URL]