From 96cf49d3b7a7436973b3f4dda5b9db9f8b9df899 Mon Sep 17 00:00:00 2001 From: Zephyr Date: Mon, 1 Sep 2025 22:13:08 +0800 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89API=E5=89=8D=E7=BC=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 VITE_API_BASE_PREFIX 环境变量支持 - 教程页面优先使用自定义前缀,未配置时使用浏览器访问地址 - 更新 .env.example 添加配置说明 --- web/admin-spa/.env.example | 8 ++++++++ web/admin-spa/src/views/TutorialView.vue | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/web/admin-spa/.env.example b/web/admin-spa/.env.example index e0f33e8b..d0bd7a97 100644 --- a/web/admin-spa/.env.example +++ b/web/admin-spa/.env.example @@ -23,6 +23,14 @@ VITE_APP_TITLE=Claude Relay Service - 管理后台 # 格式:http://proxy-host:port #VITE_HTTP_PROXY=http://127.0.0.1:7890 +# ========== 教程页面配置 ========== + +# API 基础前缀(可选) +# 用于教程页面显示的自定义 API 前缀 +# 如果不配置,则使用当前浏览器访问地址 +# 示例:https://api.example.com 或 https://relay.mysite.com +# VITE_API_BASE_PREFIX=https://api.example.com + # ========== 使用说明 ========== # 1. 复制此文件为 .env.local 进行本地配置 # 2. .env.local 文件不会被提交到版本控制 diff --git a/web/admin-spa/src/views/TutorialView.vue b/web/admin-spa/src/views/TutorialView.vue index b1d98e7c..76be3a98 100644 --- a/web/admin-spa/src/views/TutorialView.vue +++ b/web/admin-spa/src/views/TutorialView.vue @@ -1639,7 +1639,7 @@ diff --git a/web/admin-spa/src/views/ApiStatsView.vue b/web/admin-spa/src/views/ApiStatsView.vue index 0de3ed13..3d4a4cf9 100644 --- a/web/admin-spa/src/views/ApiStatsView.vue +++ b/web/admin-spa/src/views/ApiStatsView.vue @@ -123,7 +123,10 @@
- + + + +
@@ -153,6 +156,7 @@ import ApiKeyInput from '@/components/apistats/ApiKeyInput.vue' import StatsOverview from '@/components/apistats/StatsOverview.vue' import TokenDistribution from '@/components/apistats/TokenDistribution.vue' import LimitConfig from '@/components/apistats/LimitConfig.vue' +import AggregatedStatsCard from '@/components/apistats/AggregatedStatsCard.vue' import ModelUsageStats from '@/components/apistats/ModelUsageStats.vue' import TutorialView from './TutorialView.vue' @@ -175,7 +179,8 @@ const { error, statsPeriod, statsData, - oemSettings + oemSettings, + multiKeyMode } = storeToRefs(apiStatsStore) const { queryStats, switchPeriod, loadStatsWithApiId, loadOemSettings, reset } = apiStatsStore From 941cfacea9cd4c571216f72b3abab7148b9d28f6 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 3 Sep 2025 10:29:12 +0800 Subject: [PATCH 10/13] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=A4=9Akey?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=B4=B9=E7=94=A8=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/apiStats.js | 4 ++- .../apistats/AggregatedStatsCard.vue | 29 +++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/routes/apiStats.js b/src/routes/apiStats.js index 21efa7be..271d95df 100644 --- a/src/routes/apiStats.js +++ b/src/routes/apiStats.js @@ -561,7 +561,9 @@ router.post('/api/batch-stats', async (req, res) => { apiId: stats.apiId, name: stats.name, isActive: true, - usage: stats.usage + usage: stats.usage, + dailyUsage: stats.dailyStats, + monthlyUsage: stats.monthlyStats }) } }) diff --git a/web/admin-spa/src/components/apistats/AggregatedStatsCard.vue b/web/admin-spa/src/components/apistats/AggregatedStatsCard.vue index deb6ff04..5b857f8e 100644 --- a/web/admin-spa/src/components/apistats/AggregatedStatsCard.vue +++ b/web/admin-spa/src/components/apistats/AggregatedStatsCard.vue @@ -33,8 +33,8 @@
- {{ formatNumber(stat.usage?.requests || 0) }}次 - {{ stat.usage?.formattedCost || '$0.00' }} + {{ formatNumber(getStatUsage(stat)?.requests || 0) }}次 + {{ getStatUsage(stat)?.formattedCost || '$0.00' }}
@@ -76,12 +76,27 @@ import { useApiStatsStore } from '@/stores/apistats' const apiStatsStore = useApiStatsStore() const { aggregatedStats, individualStats, statsPeriod, multiKeyMode } = storeToRefs(apiStatsStore) +// 获取当前时间段的使用数据 +const getStatUsage = (stat) => { + if (!stat) return null + + if (statsPeriod.value === 'daily') { + return stat.dailyUsage || stat.usage + } else { + return stat.monthlyUsage || stat.usage + } +} + // 获取TOP Keys(最多显示5个) const topKeys = computed(() => { if (!individualStats.value || individualStats.value.length === 0) return [] return [...individualStats.value] - .sort((a, b) => (b.usage?.cost || 0) - (a.usage?.cost || 0)) + .sort((a, b) => { + const aUsage = getStatUsage(a) + const bUsage = getStatUsage(b) + return (bUsage?.cost || 0) - (aUsage?.cost || 0) + }) .slice(0, 5) }) @@ -95,7 +110,10 @@ const otherKeysCount = computed(() => { const otherPercentage = computed(() => { if (!individualStats.value || !aggregatedStats.value) return 0 - const topKeysCost = topKeys.value.reduce((sum, stat) => sum + (stat.usage?.cost || 0), 0) + const topKeysCost = topKeys.value.reduce((sum, stat) => { + const usage = getStatUsage(stat) + return sum + (usage?.cost || 0) + }, 0) const totalCost = statsPeriod.value === 'daily' ? aggregatedStats.value.dailyUsage?.cost || 0 @@ -116,7 +134,8 @@ const calculatePercentage = (stat) => { : aggregatedStats.value.monthlyUsage?.cost || 0 if (totalCost === 0) return 0 - const percentage = ((stat.usage?.cost || 0) / totalCost) * 100 + const usage = getStatUsage(stat) + const percentage = ((usage?.cost || 0) / totalCost) * 100 return Math.round(percentage) } From b158a90b728d6e3b232119be35daf23b13b1277d Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 3 Sep 2025 10:54:11 +0800 Subject: [PATCH 11/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DAPI=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=92=8COpenAI=E8=B7=AF=E7=94=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/apiStats.js | 10 ++++++++-- src/routes/openaiRoutes.js | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/routes/apiStats.js b/src/routes/apiStats.js index 271d95df..cac72503 100644 --- a/src/routes/apiStats.js +++ b/src/routes/apiStats.js @@ -562,8 +562,14 @@ router.post('/api/batch-stats', async (req, res) => { name: stats.name, isActive: true, usage: stats.usage, - dailyUsage: stats.dailyStats, - monthlyUsage: stats.monthlyStats + dailyUsage: { + ...stats.dailyStats, + formattedCost: CostCalculator.formatCost(stats.dailyStats.cost || 0) + }, + monthlyUsage: { + ...stats.monthlyStats, + formattedCost: CostCalculator.formatCost(stats.monthlyStats.cost || 0) + } }) } }) diff --git a/src/routes/openaiRoutes.js b/src/routes/openaiRoutes.js index 9efb2981..b0a1178c 100644 --- a/src/routes/openaiRoutes.js +++ b/src/routes/openaiRoutes.js @@ -153,7 +153,7 @@ router.post('/responses', authenticateApiKey, async (req, res) => { headers['host'] = 'chatgpt.com' headers['accept'] = isStream ? 'text/event-stream' : 'application/json' headers['content-type'] = 'application/json' - req.body['store'] = false + req.body['store'] = true // 创建代理 agent const proxyAgent = createProxyAgent(proxy) From aeace0c5f02e38cea7b331243fd0c3da68bfbaf9 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 3 Sep 2025 14:32:11 +0800 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20codex=E8=BD=AC=E5=8F=91store?= =?UTF-8?q?=E9=BB=98=E8=AE=A4false?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/openaiRoutes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/openaiRoutes.js b/src/routes/openaiRoutes.js index b0a1178c..9efb2981 100644 --- a/src/routes/openaiRoutes.js +++ b/src/routes/openaiRoutes.js @@ -153,7 +153,7 @@ router.post('/responses', authenticateApiKey, async (req, res) => { headers['host'] = 'chatgpt.com' headers['accept'] = isStream ? 'text/event-stream' : 'application/json' headers['content-type'] = 'application/json' - req.body['store'] = true + req.body['store'] = false // 创建代理 agent const proxyAgent = createProxyAgent(proxy) From a5361c15a1381e9423368b6dbf7eb78d38a29491 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 3 Sep 2025 06:38:38 +0000 Subject: [PATCH 13/13] chore: sync VERSION file with release v1.1.126 [skip ci] --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 599d6ff7..5bd0c3a6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.125 +1.1.126