feat: 扩展 Rust gateway 全功能模块,新增 billing/crypto/wallet crate 及完整数据层

- 新增 aether-billing、aether-crypto、aether-wallet 独立 crate
- aether-data 扩展 repository 层:announcements、auth_modules、billing、
  candidate_selection、gemini_file_mappings、global_models、management_tokens、
  oauth_providers、proxy_nodes、quota、users、wallet 等模块
- aether-gateway 新增 api/auth/billing/control/middleware/scheduler/usage/
  video_tasks/hooks/maintenance/model_fetch/provider_transport 等功能模块
- 重构 executor decision 和 gateway state 为模块目录结构
- 新增 gateway router、frontdoor 路由层及对应测试
- Python 侧 API 路由重构,新增 compat/support 模块
- 前端 Logo 组件更新及 Provider 管理页面调整
This commit is contained in:
fawney19
2026-03-31 19:19:04 +08:00
parent b5a0070023
commit ddf18fed9a
690 changed files with 235087 additions and 16301 deletions

View File

@@ -0,0 +1,920 @@
from __future__ import annotations
from starlette.routing import Match
from src.api.announcements import router as python_announcement_router
from src.api.admin import python_admin_router
from src.api.auth import router as python_auth_router
from src.api.dashboard import router as python_dashboard_router
import src.api.internal as internal_module
from src.api.internal.gateway import router as legacy_gateway_bridge_router
from src.api.monitoring import router as python_monitoring_router
from src.api.payment import router as python_payment_router
from src.api.public import frontdoor_compat_router, router as python_public_router
from src.api.user_me import router as python_user_me_router
from src.api.wallet import router as python_wallet_router
import src.main as main_module
LEGACY_GATEWAY_BRIDGE_PATH_PREFIX = "/api/internal/gateway"
RUST_OWNED_ADMIN_PATHS = {
"/api/admin/modules/status",
"/api/admin/modules/status/{module_name}",
"/api/admin/modules/status/{module_name}/enabled",
"/api/admin/system/version",
"/api/admin/system/check-update",
"/api/admin/system/aws-regions",
"/api/admin/system/stats",
"/api/admin/system/settings",
"/api/admin/system/config/export",
"/api/admin/system/users/export",
"/api/admin/system/config/import",
"/api/admin/system/users/import",
"/api/admin/system/smtp/test",
"/api/admin/system/cleanup",
"/api/admin/system/purge/config",
"/api/admin/system/purge/users",
"/api/admin/system/purge/usage",
"/api/admin/system/purge/audit-logs",
"/api/admin/system/purge/request-bodies",
"/api/admin/system/purge/stats",
"/api/admin/system/configs",
"/api/admin/system/configs/{key}",
"/api/admin/system/api-formats",
"/api/admin/system/email/templates",
"/api/admin/system/email/templates/{template_type}",
"/api/admin/providers/",
"/api/admin/providers/summary",
"/api/admin/providers/{provider_id}",
"/api/admin/providers/{provider_id}/summary",
"/api/admin/providers/{provider_id}/health-monitor",
"/api/admin/providers/{provider_id}/mapping-preview",
"/api/admin/providers/{provider_id}/delete-task/{task_id}",
"/api/admin/providers/{provider_id}/pool-status",
"/api/admin/providers/{provider_id}/pool/clear-cooldown/{key_id}",
"/api/admin/providers/{provider_id}/pool/reset-cost/{key_id}",
"/api/admin/providers/{provider_id}/models",
"/api/admin/providers/{provider_id}/models/{model_id}",
"/api/admin/providers/{provider_id}/models/batch",
"/api/admin/providers/{provider_id}/available-source-models",
"/api/admin/providers/{provider_id}/assign-global-models",
"/api/admin/providers/{provider_id}/import-from-upstream",
"/api/admin/endpoints/providers/{provider_id}/endpoints",
"/api/admin/endpoints/defaults/{api_format}/body-rules",
"/api/admin/endpoints/{endpoint_id}",
"/api/admin/endpoints/keys/{key_id}",
"/api/admin/endpoints/keys/grouped-by-format",
"/api/admin/endpoints/keys/{key_id}/reveal",
"/api/admin/endpoints/keys/{key_id}/export",
"/api/admin/endpoints/keys/batch-delete",
"/api/admin/endpoints/keys/{key_id}/clear-oauth-invalid",
"/api/admin/endpoints/providers/{provider_id}/keys",
"/api/admin/endpoints/providers/{provider_id}/refresh-quota",
"/api/admin/endpoints/rpm/key/{key_id}",
"/api/admin/endpoints/health/summary",
"/api/admin/endpoints/health/status",
"/api/admin/endpoints/health/api-formats",
"/api/admin/endpoints/health/key/{key_id}",
"/api/admin/endpoints/health/keys/{key_id}",
"/api/admin/endpoints/health/keys",
"/api/admin/provider-oauth/supported-types",
"/api/admin/provider-oauth/keys/{key_id}/start",
"/api/admin/provider-oauth/keys/{key_id}/complete",
"/api/admin/provider-oauth/keys/{key_id}/refresh",
"/api/admin/provider-oauth/providers/{provider_id}/start",
"/api/admin/provider-oauth/providers/{provider_id}/complete",
"/api/admin/provider-oauth/providers/{provider_id}/import-refresh-token",
"/api/admin/provider-oauth/providers/{provider_id}/device-authorize",
"/api/admin/provider-oauth/providers/{provider_id}/device-poll",
"/api/admin/provider-oauth/providers/{provider_id}/batch-import",
"/api/admin/provider-oauth/providers/{provider_id}/batch-import/tasks",
"/api/admin/provider-oauth/providers/{provider_id}/batch-import/tasks/{task_id}",
"/api/admin/adaptive/keys",
"/api/admin/adaptive/keys/{key_id}/mode",
"/api/admin/adaptive/keys/{key_id}/stats",
"/api/admin/adaptive/keys/{key_id}/learning",
"/api/admin/adaptive/keys/{key_id}/limit",
"/api/admin/adaptive/summary",
"/api/admin/provider-ops/architectures",
"/api/admin/provider-ops/architectures/{architecture_id}",
"/api/admin/provider-ops/providers/{provider_id}/status",
"/api/admin/provider-ops/providers/{provider_id}/config",
"/api/admin/provider-ops/providers/{provider_id}/connect",
"/api/admin/provider-ops/providers/{provider_id}/disconnect",
"/api/admin/provider-ops/providers/{provider_id}/verify",
"/api/admin/provider-ops/providers/{provider_id}/actions/{action_type}",
"/api/admin/provider-ops/providers/{provider_id}/balance",
"/api/admin/provider-ops/providers/{provider_id}/checkin",
"/api/admin/provider-ops/batch/balance",
"/api/admin/billing/presets",
"/api/admin/billing/presets/apply",
"/api/admin/billing/rules",
"/api/admin/billing/rules/{rule_id}",
"/api/admin/billing/collectors",
"/api/admin/billing/collectors/{collector_id}",
"/api/admin/provider-strategy/providers/{provider_id}/billing",
"/api/admin/provider-strategy/providers/{provider_id}/stats",
"/api/admin/provider-strategy/strategies",
"/api/admin/provider-strategy/providers/{provider_id}/quota",
"/api/admin/provider-query/models",
"/api/admin/provider-query/test-model",
"/api/admin/provider-query/test-model-failover",
"/api/admin/payments/orders",
"/api/admin/payments/orders/{order_id}",
"/api/admin/payments/orders/{order_id}/expire",
"/api/admin/payments/orders/{order_id}/credit",
"/api/admin/payments/orders/{order_id}/fail",
"/api/admin/payments/callbacks",
"/api/admin/security/ip/blacklist",
"/api/admin/security/ip/blacklist/{ip_address}",
"/api/admin/security/ip/blacklist/stats",
"/api/admin/security/ip/whitelist",
"/api/admin/security/ip/whitelist/{ip_address}",
"/api/admin/security/ip/whitelist",
"/api/admin/stats/providers/quota-usage",
"/api/admin/stats/comparison",
"/api/admin/stats/errors/distribution",
"/api/admin/stats/performance/percentiles",
"/api/admin/stats/cost/forecast",
"/api/admin/stats/cost/savings",
"/api/admin/stats/leaderboard/api-keys",
"/api/admin/stats/leaderboard/models",
"/api/admin/stats/leaderboard/users",
"/api/admin/stats/time-series",
"/api/admin/monitoring/audit-logs",
"/api/admin/monitoring/system-status",
"/api/admin/monitoring/suspicious-activities",
"/api/admin/monitoring/user-behavior/{user_id}",
"/api/admin/monitoring/resilience-status",
"/api/admin/monitoring/resilience/circuit-history",
"/api/admin/monitoring/resilience/error-stats",
"/api/admin/monitoring/trace/{request_id}",
"/api/admin/monitoring/trace/stats/provider/{provider_id}",
"/api/admin/monitoring/cache/stats",
"/api/admin/monitoring/cache/affinity/{user_identifier}",
"/api/admin/monitoring/cache/affinities",
"/api/admin/monitoring/cache/users/{user_identifier}",
"/api/admin/monitoring/cache/affinity/{affinity_key}/{endpoint_id}/{model_id}/{api_format}",
"/api/admin/monitoring/cache",
"/api/admin/monitoring/cache/providers/{provider_id}",
"/api/admin/monitoring/cache/config",
"/api/admin/monitoring/cache/metrics",
"/api/admin/monitoring/cache/model-mapping/stats",
"/api/admin/monitoring/cache/model-mapping",
"/api/admin/monitoring/cache/model-mapping/{model_name}",
"/api/admin/monitoring/cache/model-mapping/provider/{provider_id}/{global_model_id}",
"/api/admin/monitoring/cache/redis-keys",
"/api/admin/monitoring/cache/redis-keys/{category}",
"/api/admin/usage/aggregation/stats",
"/api/admin/usage/stats",
"/api/admin/usage/heatmap",
"/api/admin/usage/records",
"/api/admin/usage/active",
"/api/admin/usage/cache-affinity/hit-analysis",
"/api/admin/usage/cache-affinity/interval-timeline",
"/api/admin/usage/cache-affinity/ttl-analysis",
"/api/admin/usage/{usage_id}/curl",
"/api/admin/usage/{usage_id}",
"/api/admin/usage/{usage_id}/replay",
"/api/admin/video-tasks",
"/api/admin/video-tasks/stats",
"/api/admin/video-tasks/{task_id}",
"/api/admin/video-tasks/{task_id}/cancel",
"/api/admin/video-tasks/{task_id}/video",
"/api/admin/wallets",
"/api/admin/wallets/ledger",
"/api/admin/wallets/refund-requests",
"/api/admin/wallets/{wallet_id}",
"/api/admin/wallets/{wallet_id}/transactions",
"/api/admin/wallets/{wallet_id}/refunds",
"/api/admin/wallets/{wallet_id}/adjust",
"/api/admin/wallets/{wallet_id}/recharge",
"/api/admin/wallets/{wallet_id}/refunds/{refund_id}/process",
"/api/admin/wallets/{wallet_id}/refunds/{refund_id}/complete",
"/api/admin/wallets/{wallet_id}/refunds/{refund_id}/fail",
"/api/admin/api-keys",
"/api/admin/api-keys/{key_id}",
"/api/admin/users",
"/api/admin/users/{user_id}",
"/api/admin/users/{user_id}/sessions",
"/api/admin/users/{user_id}/sessions/{session_id}",
"/api/admin/users/{user_id}/api-keys",
"/api/admin/users/{user_id}/api-keys/{key_id}",
"/api/admin/users/{user_id}/api-keys/{key_id}/lock",
"/api/admin/users/{user_id}/api-keys/{key_id}/full-key",
"/api/admin/pool/overview",
"/api/admin/pool/scheduling-presets",
"/api/admin/pool/{provider_id}/keys",
"/api/admin/pool/{provider_id}/keys/batch-delete-task/{task_id}",
"/api/admin/pool/{provider_id}/keys/batch-action",
"/api/admin/pool/{provider_id}/keys/batch-import",
"/api/admin/pool/{provider_id}/keys/cleanup-banned",
"/api/admin/pool/{provider_id}/keys/resolve-selection",
"/api/admin/proxy-nodes",
"/api/admin/proxy-nodes/register",
"/api/admin/proxy-nodes/heartbeat",
"/api/admin/proxy-nodes/unregister",
"/api/admin/proxy-nodes/manual",
"/api/admin/proxy-nodes/upgrade",
"/api/admin/proxy-nodes/test-url",
"/api/admin/proxy-nodes/{node_id}",
"/api/admin/proxy-nodes/{node_id}/test",
"/api/admin/proxy-nodes/{node_id}/config",
"/api/admin/proxy-nodes/{node_id}/events",
"/api/admin/models/catalog",
"/api/admin/models/external",
"/api/admin/models/external/cache",
"/api/admin/models/global",
"/api/admin/models/global/{global_model_id}",
"/api/admin/models/global/batch-delete",
"/api/admin/models/global/{global_model_id}/assign-to-providers",
"/api/admin/models/global/{global_model_id}/providers",
"/api/admin/models/global/{global_model_id}/routing",
}
def _route_paths(router: object) -> set[str]:
return {route.path for route in getattr(router, "routes", [])}
def _app_matches_http_route(path: str, method: str) -> bool:
scope = {
"type": "http",
"path": path,
"method": method,
"root_path": "",
}
return any(route.matches(scope)[0] is Match.FULL for route in main_module.app.routes)
def _router_matches_http_route(router: object, path: str, method: str) -> bool:
scope = {
"type": "http",
"path": path,
"method": method,
"root_path": "",
}
return any(route.matches(scope)[0] is Match.FULL for route in getattr(router, "routes", []))
def test_python_host_app_exposes_loopback_internal_gateway_bridge_routes() -> None:
host_route_paths = _route_paths(main_module.app)
legacy_bridge_paths = _route_paths(legacy_gateway_bridge_router)
assert "/api/internal/gateway/resolve" in legacy_bridge_paths
assert "/api/internal/gateway/auth-context" in legacy_bridge_paths
assert "/api/internal/gateway/decision-sync" in legacy_bridge_paths
assert "/api/internal/gateway/decision-stream" in legacy_bridge_paths
assert hasattr(internal_module, "legacy_gateway_bridge_router") is False
assert hasattr(internal_module, "LEGACY_GATEWAY_BRIDGE_PATH_PREFIXES") is False
assert not legacy_bridge_paths.issubset(host_route_paths)
assert not any(path.startswith(LEGACY_GATEWAY_BRIDGE_PATH_PREFIX) for path in host_route_paths)
def test_python_host_app_exposes_no_api_routes() -> None:
host_route_paths = _route_paths(main_module.app)
api_route_paths = sorted(path for path in host_route_paths if path.startswith("/api/"))
assert api_route_paths == []
def test_python_internal_router_excludes_gateway_bridge() -> None:
internal_route_paths = _route_paths(internal_module.python_internal_router)
assert not any(
path.startswith(LEGACY_GATEWAY_BRIDGE_PATH_PREFIX)
for path in internal_route_paths
)
assert not any(path.startswith("/api/internal/hub") for path in internal_route_paths)
def test_python_host_app_surface_keeps_shell_routes_and_rejects_removed_edges() -> None:
host_route_paths = _route_paths(main_module.app)
compat_route_paths = _route_paths(frontdoor_compat_router)
python_public_route_paths = _route_paths(python_public_router)
python_auth_route_paths = _route_paths(python_auth_router)
python_dashboard_route_paths = _route_paths(python_dashboard_router)
python_monitoring_route_paths = _route_paths(python_monitoring_router)
python_payment_route_paths = _route_paths(python_payment_router)
python_user_me_route_paths = _route_paths(python_user_me_router)
python_wallet_route_paths = _route_paths(python_wallet_router)
python_admin_route_paths = _route_paths(python_admin_router)
python_announcement_route_paths = _route_paths(python_announcement_router)
assert "/v1/chat/completions" in compat_route_paths
assert "/v1/messages" in compat_route_paths
assert "/v1beta/models/{model}:generateContent" in compat_route_paths
assert "/v1/videos" in compat_route_paths
assert "/v1beta/files" in compat_route_paths
assert "/v1/chat/completions" not in python_public_route_paths
assert "/v1/messages" not in python_public_route_paths
assert "/v1beta/models/{model}:generateContent" not in python_public_route_paths
assert "/v1/videos" not in python_public_route_paths
assert "/v1beta/files" not in python_public_route_paths
assert "/v1/models" not in python_public_route_paths
assert "/api/public/site-info" not in python_public_route_paths
assert "/api/public/providers" not in python_public_route_paths
assert "/api/public/models" not in python_public_route_paths
assert "/api/public/search/models" not in python_public_route_paths
assert "/api/public/stats" not in python_public_route_paths
assert "/api/public/global-models" not in python_public_route_paths
assert "/api/public/health/api-formats" not in python_public_route_paths
assert "/api/modules/auth-status" not in python_public_route_paths
assert "/api/capabilities" not in python_public_route_paths
assert "/api/capabilities/user-configurable" not in python_public_route_paths
assert "/api/capabilities/model/{model_name}" not in python_public_route_paths
assert "/api/auth/registration-settings" not in python_auth_route_paths
assert "/api/auth/settings" not in python_auth_route_paths
assert "/api/auth/login" not in python_auth_route_paths
assert "/api/auth/refresh" not in python_auth_route_paths
assert "/api/auth/register" not in python_auth_route_paths
assert "/api/auth/me" not in python_auth_route_paths
assert "/api/auth/logout" not in python_auth_route_paths
assert "/api/auth/send-verification-code" not in python_auth_route_paths
assert "/api/auth/verify-email" not in python_auth_route_paths
assert "/api/auth/verification-status" not in python_auth_route_paths
assert "/api/dashboard/stats" not in python_dashboard_route_paths
assert "/api/dashboard/recent-requests" not in python_dashboard_route_paths
assert "/api/dashboard/provider-status" not in python_dashboard_route_paths
assert "/api/dashboard/daily-stats" not in python_dashboard_route_paths
assert "/api/monitoring/my-audit-logs" not in python_monitoring_route_paths
assert "/api/monitoring/rate-limit-status" not in python_monitoring_route_paths
assert "/api/payment/callback/{payment_method}" not in python_payment_route_paths
assert "/api/wallet/balance" not in python_wallet_route_paths
assert "/api/wallet/transactions" not in python_wallet_route_paths
assert "/api/wallet/flow" not in python_wallet_route_paths
assert "/api/wallet/today-cost" not in python_wallet_route_paths
assert "/api/wallet/recharge" not in python_wallet_route_paths
assert "/api/wallet/recharge/{order_id}" not in python_wallet_route_paths
assert "/api/wallet/refunds" not in python_wallet_route_paths
assert "/api/wallet/refunds/{refund_id}" not in python_wallet_route_paths
assert "/api/users/me" not in python_user_me_route_paths
assert "/api/users/me/password" not in python_user_me_route_paths
assert "/api/users/me/sessions" not in python_user_me_route_paths
assert "/api/users/me/sessions/others" not in python_user_me_route_paths
assert "/api/users/me/sessions/{session_id}" not in python_user_me_route_paths
assert "/api/users/me/api-keys" not in python_user_me_route_paths
assert "/api/users/me/api-keys/{key_id}" not in python_user_me_route_paths
assert "/api/users/me/usage" not in python_user_me_route_paths
assert "/api/users/me/usage/active" not in python_user_me_route_paths
assert "/api/users/me/usage/interval-timeline" not in python_user_me_route_paths
assert "/api/users/me/usage/heatmap" not in python_user_me_route_paths
assert "/api/users/me/providers" not in python_user_me_route_paths
assert "/api/users/me/available-models" not in python_user_me_route_paths
assert "/api/users/me/endpoint-status" not in python_user_me_route_paths
assert "/api/users/me/api-keys/{api_key_id}/providers" not in python_user_me_route_paths
assert "/api/users/me/api-keys/{api_key_id}/capabilities" not in python_user_me_route_paths
assert "/api/users/me/preferences" not in python_user_me_route_paths
assert "/api/users/me/model-capabilities" not in python_user_me_route_paths
assert not (RUST_OWNED_ADMIN_PATHS & python_admin_route_paths)
assert not _router_matches_http_route(
python_announcement_router, "/api/announcements", "GET"
)
assert not _router_matches_http_route(
python_announcement_router, "/api/announcements/active", "GET"
)
assert not _router_matches_http_route(
python_announcement_router, "/api/announcements", "POST"
)
assert not _router_matches_http_route(
python_announcement_router, "/api/announcements/announcement-1", "PUT"
)
assert not _router_matches_http_route(
python_announcement_router, "/api/announcements/announcement-1", "DELETE"
)
assert not _router_matches_http_route(
python_announcement_router,
"/api/announcements/users/me/unread-count",
"GET",
)
assert not _router_matches_http_route(
python_announcement_router,
"/api/announcements/announcement-1/read-status",
"PATCH",
)
assert "/v1/chat/completions" not in host_route_paths
assert "/v1/messages" not in host_route_paths
assert "/v1beta/models/{model}:generateContent" not in host_route_paths
assert "/v1/videos" not in host_route_paths
assert "/v1beta/files" not in host_route_paths
assert "/v1/models" not in host_route_paths
assert "/v1/providers" not in host_route_paths
assert "/v1/test-connection" not in host_route_paths
assert "/api/public/site-info" not in host_route_paths
assert "/api/public/providers" not in host_route_paths
assert "/api/public/models" not in host_route_paths
assert "/api/public/search/models" not in host_route_paths
assert "/api/public/stats" not in host_route_paths
assert not _app_matches_http_route("/api/announcements", "GET")
assert not _app_matches_http_route("/api/announcements/active", "GET")
assert not _app_matches_http_route("/api/announcements", "POST")
assert not _app_matches_http_route("/api/announcements/announcement-1", "PUT")
assert not _app_matches_http_route("/api/announcements/announcement-1", "DELETE")
assert "/api/public/global-models" not in host_route_paths
assert "/api/public/health/api-formats" not in host_route_paths
assert "/api/modules/auth-status" not in host_route_paths
assert "/api/capabilities" not in host_route_paths
assert "/api/capabilities/user-configurable" not in host_route_paths
assert "/api/capabilities/model/{model_name}" not in host_route_paths
assert "/api/auth/registration-settings" not in host_route_paths
assert "/api/auth/settings" not in host_route_paths
assert "/api/auth/login" not in host_route_paths
assert "/api/auth/refresh" not in host_route_paths
assert "/api/auth/register" not in host_route_paths
assert "/api/auth/me" not in host_route_paths
assert "/api/auth/logout" not in host_route_paths
assert "/api/auth/send-verification-code" not in host_route_paths
assert "/api/auth/verify-email" not in host_route_paths
assert "/api/auth/verification-status" not in host_route_paths
assert "/api/dashboard/stats" not in host_route_paths
assert "/api/dashboard/recent-requests" not in host_route_paths
assert "/api/dashboard/provider-status" not in host_route_paths
assert "/api/dashboard/daily-stats" not in host_route_paths
assert "/api/monitoring/my-audit-logs" not in host_route_paths
assert "/api/monitoring/rate-limit-status" not in host_route_paths
assert "/api/payment/callback/{payment_method}" not in host_route_paths
assert "/api/wallet/balance" not in host_route_paths
assert "/api/wallet/transactions" not in host_route_paths
assert "/api/wallet/flow" not in host_route_paths
assert "/api/wallet/today-cost" not in host_route_paths
assert "/api/wallet/recharge" not in host_route_paths
assert "/api/wallet/recharge/{order_id}" not in host_route_paths
assert "/api/wallet/refunds" not in host_route_paths
assert "/api/wallet/refunds/{refund_id}" not in host_route_paths
assert not (RUST_OWNED_ADMIN_PATHS & host_route_paths)
assert "/health" not in host_route_paths
assert "/v1/health" not in host_route_paths
assert "/" not in host_route_paths
assert "/test-connection" not in host_route_paths
assert "/readyz" not in host_route_paths
assert _app_matches_http_route("/v1/chat/completions", "POST") is False
assert _app_matches_http_route("/v1/messages", "POST") is False
assert _app_matches_http_route("/v1beta/models/gemini-2.5-pro:generateContent", "POST") is False
assert _app_matches_http_route("/v1/videos", "POST") is False
assert _app_matches_http_route("/v1beta/files", "GET") is False
assert _app_matches_http_route("/v1/models", "GET") is False
assert _app_matches_http_route("/v1/providers", "GET") is False
assert _app_matches_http_route("/v1/test-connection", "GET") is False
assert _app_matches_http_route("/api/public/site-info", "GET") is False
assert _app_matches_http_route("/api/public/providers", "GET") is False
assert _app_matches_http_route("/api/public/models", "GET") is False
assert _app_matches_http_route("/api/public/search/models", "GET") is False
assert _app_matches_http_route("/api/public/stats", "GET") is False
assert _app_matches_http_route("/api/public/global-models", "GET") is False
assert _app_matches_http_route("/api/public/health/api-formats", "GET") is False
assert _app_matches_http_route("/api/modules/auth-status", "GET") is False
assert _app_matches_http_route("/api/capabilities", "GET") is False
assert _app_matches_http_route("/api/capabilities/user-configurable", "GET") is False
assert _app_matches_http_route("/api/capabilities/model/gpt-5", "GET") is False
assert _app_matches_http_route("/api/auth/registration-settings", "GET") is False
assert _app_matches_http_route("/api/auth/login", "POST") is False
assert _app_matches_http_route("/api/auth/refresh", "POST") is False
assert _app_matches_http_route("/api/auth/register", "POST") is False
assert _app_matches_http_route("/api/auth/me", "GET") is False
assert _app_matches_http_route("/api/auth/logout", "POST") is False
assert _app_matches_http_route("/api/auth/send-verification-code", "POST") is False
assert _app_matches_http_route("/api/auth/verify-email", "POST") is False
assert _app_matches_http_route("/api/auth/verification-status", "POST") is False
assert _app_matches_http_route("/api/admin/stats/comparison", "GET") is False
assert _app_matches_http_route("/api/admin/stats/errors/distribution", "GET") is False
assert _app_matches_http_route("/api/admin/stats/performance/percentiles", "GET") is False
assert _app_matches_http_route("/api/admin/stats/cost/forecast", "GET") is False
assert _app_matches_http_route("/api/admin/stats/time-series", "GET") is False
assert _app_matches_http_route("/api/admin/stats/leaderboard/users", "GET") is False
assert _app_matches_http_route("/api/auth/settings", "GET") is False
assert _app_matches_http_route("/api/dashboard/stats", "GET") is False
assert _app_matches_http_route("/api/dashboard/recent-requests", "GET") is False
assert _app_matches_http_route("/api/dashboard/provider-status", "GET") is False
assert _app_matches_http_route("/api/dashboard/daily-stats", "GET") is False
assert _app_matches_http_route("/api/monitoring/my-audit-logs", "GET") is False
assert _app_matches_http_route("/api/monitoring/rate-limit-status", "GET") is False
assert _app_matches_http_route("/api/payment/callback/alipay", "POST") is False
assert _app_matches_http_route("/api/wallet/balance", "GET") is False
assert _app_matches_http_route("/api/wallet/transactions", "GET") is False
assert _app_matches_http_route("/api/wallet/flow", "GET") is False
assert _app_matches_http_route("/api/wallet/today-cost", "GET") is False
assert _app_matches_http_route("/api/wallet/recharge", "GET") is False
assert _app_matches_http_route("/api/wallet/recharge", "POST") is False
assert _app_matches_http_route("/api/wallet/recharge/order-1", "GET") is False
assert _app_matches_http_route("/api/wallet/refunds", "GET") is False
assert _app_matches_http_route("/api/wallet/refunds", "POST") is False
assert _app_matches_http_route("/api/wallet/refunds/refund-1", "GET") is False
assert _app_matches_http_route("/api/users/me", "GET") is False
assert _app_matches_http_route("/api/users/me", "PUT") is False
assert _app_matches_http_route("/api/users/me/password", "PATCH") is False
assert _app_matches_http_route("/api/users/me/sessions", "GET") is False
assert _app_matches_http_route("/api/users/me/sessions/others", "DELETE") is False
assert _app_matches_http_route("/api/users/me/sessions/session-1", "PATCH") is False
assert _app_matches_http_route("/api/users/me/sessions/session-1", "DELETE") is False
assert _app_matches_http_route("/api/users/me/api-keys", "GET") is False
assert _app_matches_http_route("/api/users/me/api-keys", "POST") is False
assert _app_matches_http_route("/api/users/me/api-keys/key-1", "GET") is False
assert _app_matches_http_route("/api/users/me/api-keys/key-1", "DELETE") is False
assert _app_matches_http_route("/api/users/me/api-keys/key-1", "PUT") is False
assert _app_matches_http_route("/api/users/me/api-keys/key-1", "PATCH") is False
assert _app_matches_http_route("/api/users/me/usage", "GET") is False
assert _app_matches_http_route("/api/users/me/usage/active", "GET") is False
assert _app_matches_http_route("/api/users/me/usage/interval-timeline", "GET") is False
assert _app_matches_http_route("/api/users/me/usage/heatmap", "GET") is False
assert _app_matches_http_route("/api/users/me/providers", "GET") is False
assert _app_matches_http_route("/api/users/me/available-models", "GET") is False
assert _app_matches_http_route("/api/users/me/endpoint-status", "GET") is False
assert _app_matches_http_route("/api/users/me/api-keys/key-1/providers", "PUT") is False
assert _app_matches_http_route("/api/users/me/api-keys/key-1/capabilities", "PUT") is False
assert _app_matches_http_route("/api/users/me/preferences", "GET") is False
assert _app_matches_http_route("/api/users/me/preferences", "PUT") is False
assert _app_matches_http_route("/api/users/me/model-capabilities", "GET") is False
assert _app_matches_http_route("/api/users/me/model-capabilities", "PUT") is False
assert _app_matches_http_route("/api/announcements/announcement-1", "GET") is False
assert _app_matches_http_route("/api/announcements/users/me/unread-count", "GET") is False
assert (
_app_matches_http_route("/api/announcements/announcement-1/read-status", "PATCH")
is False
)
assert _app_matches_http_route("/api/admin/system/version", "GET") is False
assert _app_matches_http_route("/api/admin/system/settings", "GET") is False
assert _app_matches_http_route("/api/admin/system/config/export", "GET") is False
assert _app_matches_http_route("/api/admin/system/configs", "GET") is False
assert _app_matches_http_route("/api/admin/system/configs/smtp_password", "GET") is False
assert _app_matches_http_route("/api/admin/modules/status", "GET") is False
assert _app_matches_http_route("/api/admin/modules/status/auth", "GET") is False
assert _app_matches_http_route("/api/admin/modules/status/auth/enabled", "PUT") is False
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/connect",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/disconnect",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/actions/query_balance",
"POST",
)
is False
)
assert _app_matches_http_route("/api/admin/provider-strategy/strategies", "GET") is False
assert (
_app_matches_http_route(
"/api/admin/provider-strategy/providers/provider-openai/billing",
"PUT",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-strategy/providers/provider-openai/stats",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-strategy/providers/provider-openai/quota",
"DELETE",
)
is False
)
assert _app_matches_http_route("/api/admin/stats/providers/quota-usage", "GET") is False
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/verify",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/balance",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/balance",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/checkin",
"POST",
)
is False
)
assert _app_matches_http_route("/api/admin/provider-ops/batch/balance", "POST") is False
assert _app_matches_http_route("/api/admin/billing/presets", "GET") is False
assert _app_matches_http_route("/api/admin/billing/presets/apply", "POST") is False
assert _app_matches_http_route("/api/admin/billing/rules", "GET") is False
assert _app_matches_http_route("/api/admin/billing/rules/rule-1", "GET") is False
assert _app_matches_http_route("/api/admin/billing/rules", "POST") is False
assert _app_matches_http_route("/api/admin/billing/rules/rule-1", "PUT") is False
assert _app_matches_http_route("/api/admin/billing/collectors", "GET") is False
assert _app_matches_http_route("/api/admin/billing/collectors/collector-1", "GET") is False
assert _app_matches_http_route("/api/admin/billing/collectors", "POST") is False
assert _app_matches_http_route("/api/admin/billing/collectors/collector-1", "PUT") is False
assert _app_matches_http_route("/api/admin/provider-query/models", "POST") is False
assert _app_matches_http_route("/api/admin/provider-query/test-model", "POST") is False
assert (
_app_matches_http_route("/api/admin/provider-query/test-model-failover", "POST")
is False
)
assert _app_matches_http_route("/api/admin/payments/orders", "GET") is False
assert _app_matches_http_route("/api/admin/payments/orders/order-1", "GET") is False
assert _app_matches_http_route("/api/admin/payments/orders/order-1/expire", "POST") is False
assert _app_matches_http_route("/api/admin/payments/orders/order-1/credit", "POST") is False
assert _app_matches_http_route("/api/admin/payments/orders/order-1/fail", "POST") is False
assert _app_matches_http_route("/api/admin/payments/callbacks", "GET") is False
assert _app_matches_http_route("/api/admin/usage/aggregation/stats", "GET") is False
assert _app_matches_http_route("/api/admin/usage/stats", "GET") is False
assert _app_matches_http_route("/api/admin/usage/heatmap", "GET") is False
assert _app_matches_http_route("/api/admin/usage/records", "GET") is False
assert _app_matches_http_route("/api/admin/usage/active", "GET") is False
assert _app_matches_http_route("/api/admin/usage/usage-1/curl", "GET") is False
assert _app_matches_http_route("/api/admin/usage/usage-1", "GET") is False
assert _app_matches_http_route("/api/admin/usage/usage-1/replay", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes", "GET") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/register", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/heartbeat", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/unregister", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/manual", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/upgrade", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/test-url", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/node-1", "PATCH") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/node-1", "DELETE") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/node-1/test", "POST") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/node-1/config", "PUT") is False
assert _app_matches_http_route("/api/admin/proxy-nodes/node-1/events", "GET") is False
assert _app_matches_http_route("/api/admin/wallets", "GET") is False
assert _app_matches_http_route("/api/admin/wallets/ledger", "GET") is False
assert _app_matches_http_route("/api/admin/wallets/refund-requests", "GET") is False
assert _app_matches_http_route("/api/admin/wallets/wallet-1", "GET") is False
assert _app_matches_http_route("/api/admin/wallets/wallet-1/transactions", "GET") is False
assert _app_matches_http_route("/api/admin/wallets/wallet-1/refunds", "GET") is False
assert _app_matches_http_route("/api/admin/api-keys", "GET") is False
assert _app_matches_http_route("/api/admin/api-keys", "POST") is False
assert _app_matches_http_route("/api/admin/api-keys/key-1", "GET") is False
assert _app_matches_http_route("/api/admin/api-keys/key-1", "PUT") is False
assert _app_matches_http_route("/api/admin/api-keys/key-1", "PATCH") is False
assert _app_matches_http_route("/api/admin/api-keys/key-1", "DELETE") is False
assert _app_matches_http_route("/api/admin/users", "GET") is False
assert _app_matches_http_route("/api/admin/users", "POST") is False
assert _app_matches_http_route("/api/admin/users/user-1", "GET") is False
assert _app_matches_http_route("/api/admin/users/user-1", "PUT") is False
assert _app_matches_http_route("/api/admin/users/user-1", "DELETE") is False
assert _app_matches_http_route("/api/admin/users/user-1/sessions", "GET") is False
assert _app_matches_http_route("/api/admin/users/user-1/sessions", "DELETE") is False
assert _app_matches_http_route("/api/admin/users/user-1/sessions/session-1", "DELETE") is False
assert _app_matches_http_route("/api/admin/users/user-1/api-keys", "GET") is False
assert _app_matches_http_route("/api/admin/users/user-1/api-keys", "POST") is False
assert _app_matches_http_route("/api/admin/users/user-1/api-keys/key-1", "DELETE") is False
assert _app_matches_http_route("/api/admin/users/user-1/api-keys/key-1", "PUT") is False
assert _app_matches_http_route("/api/admin/users/user-1/api-keys/key-1/lock", "PATCH") is False
assert _app_matches_http_route("/api/admin/users/user-1/api-keys/key-1/full-key", "GET") is False
assert _app_matches_http_route("/api/admin/system/email/templates", "GET") is False
assert _app_matches_http_route("/api/admin/system/email/templates/verification", "GET") is False
assert _app_matches_http_route("/api/admin/providers/", "GET") is False
assert _app_matches_http_route("/api/admin/providers/", "POST") is False
assert _app_matches_http_route("/api/admin/providers/provider-openai", "PATCH") is False
assert _app_matches_http_route("/api/admin/providers/provider-openai/summary", "GET") is False
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/health-monitor",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/mapping-preview",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/delete-task/task-1",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/pool-status",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/models/model-1",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/models/batch",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/assign-global-models",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/providers/provider-openai/import-from-upstream",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/endpoints/providers/provider-openai/endpoints",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/endpoints/defaults/openai:responses/body-rules",
"GET",
)
is False
)
assert _app_matches_http_route("/api/admin/endpoints/endpoint-1", "GET") is False
assert _app_matches_http_route("/api/admin/endpoints/keys/key-1/export", "GET") is False
assert _app_matches_http_route("/api/admin/endpoints/keys/key-1/reveal", "GET") is False
assert (
_app_matches_http_route(
"/api/admin/endpoints/providers/provider-openai/keys",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/endpoints/providers/provider-openai/refresh-quota",
"POST",
)
is False
)
assert _app_matches_http_route("/api/admin/endpoints/keys/batch-delete", "POST") is False
assert _app_matches_http_route("/api/admin/endpoints/rpm/key/key-1", "GET") is False
assert _app_matches_http_route("/api/admin/endpoints/health/status", "GET") is False
assert _app_matches_http_route("/api/admin/endpoints/health/key/key-1", "GET") is False
assert _app_matches_http_route("/api/admin/endpoints/health/keys/key-1", "PATCH") is False
assert _app_matches_http_route("/api/admin/provider-oauth/supported-types", "GET") is False
assert _app_matches_http_route("/api/admin/provider-oauth/keys/key-1/start", "POST") is False
assert (
_app_matches_http_route(
"/api/admin/provider-oauth/providers/provider-kiro/device-authorize",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-oauth/providers/provider-kiro/device-poll",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-oauth/providers/provider-codex/import-refresh-token",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-oauth/providers/provider-codex/batch-import",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-oauth/providers/provider-codex/batch-import/tasks",
"POST",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-oauth/providers/provider-codex/batch-import/tasks/task-1",
"GET",
)
is False
)
assert _app_matches_http_route("/api/admin/provider-ops/architectures", "GET") is False
assert (
_app_matches_http_route(
"/api/admin/provider-ops/architectures/generic_api",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/status",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/config",
"GET",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/config",
"PUT",
)
is False
)
assert (
_app_matches_http_route(
"/api/admin/provider-ops/providers/provider-openai/config",
"DELETE",
)
is False
)
assert _app_matches_http_route("/api/admin/video-tasks", "GET") is False
assert _app_matches_http_route("/api/admin/video-tasks/stats", "GET") is False
assert _app_matches_http_route("/api/admin/video-tasks/task-1", "GET") is False
assert _app_matches_http_route("/api/admin/video-tasks/task-1/cancel", "POST") is False
assert _app_matches_http_route("/api/admin/video-tasks/task-1/video", "GET") is False
assert _app_matches_http_route("/api/admin/adaptive/keys", "GET") is False
assert _app_matches_http_route("/api/admin/adaptive/keys/key-1/mode", "PATCH") is False
assert _app_matches_http_route("/api/admin/adaptive/keys/key-1/stats", "GET") is False
assert _app_matches_http_route("/api/admin/adaptive/keys/key-1/learning", "DELETE") is False
assert _app_matches_http_route("/api/admin/adaptive/keys/key-1/limit", "PATCH") is False
assert _app_matches_http_route("/api/admin/adaptive/summary", "GET") is False
assert _app_matches_http_route("/api/admin/models/catalog", "GET") is False
assert _app_matches_http_route("/api/admin/models/external", "GET") is False
assert _app_matches_http_route("/api/admin/models/external/cache", "DELETE") is False
assert _app_matches_http_route("/api/admin/models/global", "GET") is False
assert _app_matches_http_route("/api/admin/models/global", "POST") is False
assert _app_matches_http_route("/api/admin/models/global/test-id", "GET") is False
assert _app_matches_http_route("/api/admin/models/global/test-id", "PATCH") is False
assert _app_matches_http_route("/api/admin/models/global/test-id", "DELETE") is False
assert _app_matches_http_route("/api/admin/models/global/batch-delete", "POST") is False
assert (
_app_matches_http_route(
"/api/admin/models/global/test-id/assign-to-providers",
"POST",
)
is False
)
assert _app_matches_http_route("/api/admin/models/global/test-id/providers", "GET") is False
assert _app_matches_http_route("/api/admin/models/global/test-id/routing", "GET") is False
assert _app_matches_http_route("/health", "GET") is False
assert _app_matches_http_route("/v1/health", "GET") is False
assert _app_matches_http_route("/", "GET") is False
assert _app_matches_http_route("/test-connection", "GET") is False
assert _app_matches_http_route("/api/internal/gateway/auth-context", "POST") is False
assert _app_matches_http_route("/api/internal/gateway/resolve", "POST") is False
assert _app_matches_http_route("/api/internal/gateway/decision-sync", "POST") is False
assert _app_matches_http_route("/api/internal/hub/heartbeat", "POST") is False
assert _app_matches_http_route("/api/internal/hub/node-status", "POST") is False
assert _app_matches_http_route("/readyz", "GET") is False
tags = {tag.get("name") for tag in main_module.app.openapi().get("tags", [])}
assert "OpenAI API" not in tags
assert "Claude API" not in tags
assert "Gemini API" not in tags
assert "Gemini Files API" not in tags
assert "System Catalog" not in tags
def test_python_payment_host_surface_is_single_dynamic_callback_route() -> None:
host_route_paths = _route_paths(main_module.app)
assert "/api/payment/callback/{payment_method}" not in host_route_paths
assert "/api/payment/callback/alipay" not in host_route_paths
assert "/api/payment/callback/wechat" not in host_route_paths
assert _app_matches_http_route("/api/payment/callback/alipay", "POST") is False
assert _app_matches_http_route("/api/payment/callback/wechat", "POST") is False