From d85dd67163b6fb9df303c00e6c3f369636aa42f5 Mon Sep 17 00:00:00 2001 From: Zhenyi Wang Date: Tue, 14 Apr 2026 17:25:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E8=BE=93=E5=87=BA=E9=80=9F=E5=BA=A6=20(token?= =?UTF-8?q?s/s)=20=E8=AE=A1=E7=AE=97=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table/usage-logs/UsageLogsColumnDefs.jsx | 32 +++++++++++++++++++ web/src/hooks/usage-logs/useUsageLogsData.jsx | 7 ++++ web/src/i18n/locales/en.json | 2 ++ web/src/i18n/locales/fr.json | 2 ++ web/src/i18n/locales/ja.json | 2 ++ web/src/i18n/locales/ru.json | 2 ++ web/src/i18n/locales/vi.json | 2 ++ web/src/i18n/locales/zh-CN.json | 2 ++ web/src/i18n/locales/zh-TW.json | 2 ++ 9 files changed, 53 insertions(+) diff --git a/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx b/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx index d5243afc6ed..efa3e94d740 100644 --- a/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx +++ b/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx @@ -832,6 +832,38 @@ export const getLogsColumns = ({ ); }, }, + { + key: COLUMN_KEYS.SPEED, + title: ( +
+ {t('速度')} + + + +
+ ), + dataIndex: 'speed', + render: (text, record, index) => { + if ( + !( + record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 + ) + ) { + return <>; + } + if (!text || text <= 0) { + return -; + } + return <>{text.toFixed(1)}; + }, + }, { key: COLUMN_KEYS.COST, title: t('花费'), diff --git a/web/src/hooks/usage-logs/useUsageLogsData.jsx b/web/src/hooks/usage-logs/useUsageLogsData.jsx index e406b2ab8f7..3cae955c9c2 100644 --- a/web/src/hooks/usage-logs/useUsageLogsData.jsx +++ b/web/src/hooks/usage-logs/useUsageLogsData.jsx @@ -57,6 +57,7 @@ export const useLogsData = () => { USE_TIME: 'use_time', PROMPT: 'prompt', COMPLETION: 'completion', + SPEED: 'speed', COST: 'cost', RETRY: 'retry', IP: 'ip', @@ -120,6 +121,7 @@ export const useLogsData = () => { [COLUMN_KEYS.USE_TIME]: true, [COLUMN_KEYS.PROMPT]: true, [COLUMN_KEYS.COMPLETION]: true, + [COLUMN_KEYS.SPEED]: true, [COLUMN_KEYS.COST]: true, [COLUMN_KEYS.RETRY]: isAdminUser, [COLUMN_KEYS.IP]: true, @@ -380,6 +382,11 @@ export const useLogsData = () => { logs[i].timestamp2string = timestamp2string(logs[i].created_at); logs[i].key = logs[i].id; let other = getLogOther(logs[i].other); + const useTime = logs[i].use_time; + const frtSec = (other?.frt || 0) / 1000; + const genTime = useTime - frtSec; + const ct = logs[i].completion_tokens || 0; + logs[i].speed = genTime > 0 && ct > 0 ? ct / genTime : 0; let expandDataLocal = []; if (isAdminUser && (logs[i].type === 0 || logs[i].type === 2 || logs[i].type === 6)) { diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index eade595e55d..9158993b950 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -2304,6 +2304,8 @@ "用户账户创建成功!": "User account created successfully!", "用户账户管理": "User account management", "用时/首字": "Time/first word", + "速度": "Speed", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "Output speed (tokens/s) = output tokens / (total time - time to first token)", "由全站货币展示设置统一控制": "Controlled by the site-wide currency display settings", "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Deducted by subscription", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index fed6b191310..7a5a1f406ce 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -2279,6 +2279,8 @@ "用户账户创建成功!": "Compte utilisateur créé avec succès !", "用户账户管理": "Comptes utilisateurs", "用时/首字": "Temps/premier mot", + "速度": "Vitesse", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "Vitesse de sortie (tokens/s) = tokens de sortie / (temps total - temps du premier token)", "由全站货币展示设置统一控制": "Contrôlé par les paramètres globaux d'affichage des devises", "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Déduit par l'abonnement", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 61641dfbfcf..c52d180e471 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -2262,6 +2262,8 @@ "用户账户创建成功!": "ユーザーアカウントの作成に成功しました", "用户账户管理": "ユーザーアカウント管理", "用时/首字": "所要時間 / 初回トークン", + "速度": "速度", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "出力速度 (tokens/s) = 出力 tokens / (合計時間 - 初回トークン時間)", "由全站货币展示设置统一控制": "サイト全体の通貨表示設定で統一して管理", "由管理员分配,决定用户身份等级(如 default、vip)。": "管理者が割り当て、ユーザーの等級を決定します(例:default、vip)。", "由订阅抵扣": "サブスクリプションで相殺", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 0986d3360df..db4fddb7a08 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -2291,6 +2291,8 @@ "用户账户创建成功!": "Аккаунт пользователя создан успешно!", "用户账户管理": "Управление аккаунтами пользователей", "用时/首字": "Время/первый символ", + "速度": "Скорость", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "Скорость вывода (tokens/s) = токены вывода / (общее время - время до первого токена)", "由全站货币展示设置统一控制": "Управляется глобальными настройками отображения валюты", "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Списано по подписке", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index 266fab5fb8b..d7ab2568087 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -2444,6 +2444,8 @@ "用户额度": "Hạn ngạch người dùng", "用户额度设置": "Cài đặt hạn ngạch người dùng", "用时/首字": "Thời gian/từ đầu tiên", + "速度": "Tốc độ", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "Tốc độ đầu ra (tokens/s) = tokens đầu ra / (tổng thời gian - thời gian token đầu tiên)", "用途": "Mục đích", "由全站货币展示设置统一控制": "Được điều khiển bởi cài đặt hiển thị tiền tệ toàn site", "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index 80f1a962ab5..8ab7c15ac68 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -1710,6 +1710,8 @@ "用户账户创建成功!": "用户账户创建成功!", "用户账户管理": "用户账户管理", "用时/首字": "用时/首字", + "速度": "速度", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)", "留空则使用账号绑定的邮箱": "留空则使用账号绑定的邮箱", "留空则使用默认端点;支持 {path, method}": "留空则使用默认端点;支持 {path, method}", "留空则默认使用服务器地址,注意不能携带http://或者https://": "留空则默认使用服务器地址,注意不能携带http://或者https://", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index aaf6d33c2e5..b9a4bd5d7a0 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -2031,6 +2031,8 @@ "用户账户创建成功!": "使用者帳號建立成功!", "用户账户管理": "使用者帳號管理", "用时/首字": "用時/首字", + "速度": "速度", + "输出速度 (tokens/s) = 输出 tokens / (总耗时 - 首字耗时)": "輸出速度 (tokens/s) = 輸出 tokens / (總耗時 - 首字耗時)", "由全站货币展示设置统一控制": "由全站貨幣展示設定統一控制", "由管理员分配,决定用户身份等级(如 default、vip)。": "由管理員分配,決定使用者身份等級(如 default、vip)。", "由订阅抵扣": "由訂閱抵扣",