From 5c60627fb6654e6632706ff58150255c905c2ef2 Mon Sep 17 00:00:00 2001 From: SmartUp Developer Date: Sun, 17 May 2026 11:56:49 +0800 Subject: [PATCH] fix: Vite type declaration, non-idempotent retry, hardcoded test IP - Add frontend/src/vite-env.d.ts (reference vite/client) to fix vue-tsc build - Restrict axios-retry to GET/HEAD/OPTIONS only (avoid replaying mutations) - Convert test_upstream.py to accept URL via CLI args instead of hardcoded IP --- backend/test_upstream.py | 15 +++++++++++---- frontend/src/api/index.ts | 9 ++++++--- frontend/src/vite-env.d.ts | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 frontend/src/vite-env.d.ts diff --git a/backend/test_upstream.py b/backend/test_upstream.py index 46ec497..80d6a68 100644 --- a/backend/test_upstream.py +++ b/backend/test_upstream.py @@ -6,11 +6,18 @@ from app.services.upstream_client import UpstreamClient logging.basicConfig(level=logging.DEBUG) def main(): + # Usage: python test_upstream.py [api_prefix] [auth_type] [token] + # Example: python test_upstream.py http://localhost:8000 "" bearer "sk-xxx" + import sys + base_url = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:8000" + api_prefix = sys.argv[2] if len(sys.argv) > 2 else "" + auth_type = sys.argv[3] if len(sys.argv) > 3 else "bearer" + token = sys.argv[4] if len(sys.argv) > 4 else "" with UpstreamClient( - base_url="http://170.106.100.210:55555", - api_prefix="", - auth_type="bearer", - auth_config={"token": ""}, # We don't have token, but /api/group/ in some new-api may be open, or fail with 401 + base_url=base_url, + api_prefix=api_prefix, + auth_type=auth_type, + auth_config={"token": token}, timeout=10.0, ) as client: try: diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 5c92036..359a3ec 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -11,14 +11,17 @@ export const api = axios.create({ axiosRetry(api, { retries: 3, retryDelay: axiosRetry.exponentialDelay, + onRetry: (_retryCount, _err, _requestConfig) => { + // no-op — could log in dev + }, + // Only retry idempotent methods — never retry POST/PUT/PATCH/DELETE retryCondition: (err) => { + const method = (err.config?.method ?? '').toUpperCase() + if (!['GET', 'HEAD', 'OPTIONS'].includes(method)) return false // Retry on network errors or 5xx, but never on 401/403/404/4xx if (!err.response) return true return err.response.status >= 500 && err.response.status < 600 }, - onRetry: (_retryCount, _err, _requestConfig) => { - // no-op — could log in dev - }, }) api.interceptors.response.use( diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +///