From 149d89a3d8811824812ff3463fcaa8898d75fede Mon Sep 17 00:00:00 2001 From: Lany798 Date: Tue, 3 Feb 2026 08:45:19 +0800 Subject: [PATCH 1/3] feat: add auth_index column to monitor request logs - Add authIndex field to LogEntry interface - Display auth_index in request logs table - Shows which account/credential was used for each request --- src/components/monitor/RequestLogs.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/monitor/RequestLogs.tsx b/src/components/monitor/RequestLogs.tsx index 6aa22f6..1846cf7 100644 --- a/src/components/monitor/RequestLogs.tsx +++ b/src/components/monitor/RequestLogs.tsx @@ -41,6 +41,7 @@ interface LogEntry { inputTokens: number; outputTokens: number; totalTokens: number; + authIndex: string; } interface ChannelModelRequest { @@ -283,6 +284,7 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide inputTokens: detail.tokens.input_tokens || 0, outputTokens: detail.tokens.output_tokens || 0, totalTokens: detail.tokens.total_tokens || 0, + authIndex: detail.auth_index || '', }); }); }); @@ -412,6 +414,9 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide return ( <> + + {entry.authIndex || '-'} + {maskSecret(entry.apiKey)} @@ -580,6 +585,7 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide + From 259bf88f818c63e14ff298aeea1cc4f3ebc6f424 Mon Sep 17 00:00:00 2001 From: Lany798 Date: Tue, 3 Feb 2026 08:52:49 +0800 Subject: [PATCH 2/3] feat: display auth file name instead of index in request logs - Load auth files to build authIndex -> fileName mapping - Display actual auth file name in the Auth Index column - Fallback to index number if mapping not found --- src/components/monitor/RequestLogs.tsx | 33 +++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/components/monitor/RequestLogs.tsx b/src/components/monitor/RequestLogs.tsx index 1846cf7..f7fef65 100644 --- a/src/components/monitor/RequestLogs.tsx +++ b/src/components/monitor/RequestLogs.tsx @@ -2,7 +2,7 @@ import { useMemo, useState, useEffect, useRef, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { useVirtualizer } from '@tanstack/react-virtual'; import { Card } from '@/components/ui/Card'; -import { usageApi } from '@/services/api'; +import { usageApi, authFilesApi } from '@/services/api'; import { useDisableModel } from '@/hooks'; import { TimeRangeSelector, formatTimeRangeCaption, type TimeRange } from './TimeRangeSelector'; import { DisableModelModal } from './DisableModelModal'; @@ -93,6 +93,9 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide const [logLoading, setLogLoading] = useState(false); const [isFirstLoad, setIsFirstLoad] = useState(true); + // 认证文件索引到名称的映射 + const [authIndexMap, setAuthIndexMap] = useState>({}); + // 使用禁用模型 Hook const { disableState, @@ -125,6 +128,28 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide } }, [parentLoading, data]); + // 加载认证文件映射(authIndex -> 文件名) + const loadAuthIndexMap = useCallback(async () => { + try { + const response = await authFilesApi.list(); + const files = response?.files || []; + const map: Record = {}; + files.forEach((file) => { + if (file.authIndex !== undefined && file.authIndex !== null) { + map[String(file.authIndex)] = file.name; + } + }); + setAuthIndexMap(map); + } catch (err) { + console.warn('Failed to load auth files for index mapping:', err); + } + }, []); + + // 初始加载认证文件映射 + useEffect(() => { + loadAuthIndexMap(); + }, [loadAuthIndexMap]); + // 独立获取日志数据 const fetchLogData = useCallback(async () => { setLogLoading(true); @@ -411,11 +436,13 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide const stats = getStats(entry); const rateValue = parseFloat(stats.successRate); const disabled = isModelDisabled(entry.source, entry.model); + // 将 authIndex 映射为文件名 + const authDisplayName = entry.authIndex ? (authIndexMap[entry.authIndex] || entry.authIndex) : '-'; return ( <> -
{t('monitor.logs.header_auth')} {t('monitor.logs.header_api')} {t('monitor.logs.header_request_type')} {t('monitor.logs.header_model')} - {entry.authIndex || '-'} + + {authDisplayName} {maskSecret(entry.apiKey)} From ee60be6f0a20b83ba0565198098934321efd7182 Mon Sep 17 00:00:00 2001 From: Lany798 Date: Tue, 3 Feb 2026 08:57:51 +0800 Subject: [PATCH 3/3] fix: use auth_index field from API response for auth file mapping - API returns 'auth_index' not 'authIndex' - Support both field names for compatibility - Properly map hash-based auth_index to file name --- src/components/monitor/RequestLogs.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/monitor/RequestLogs.tsx b/src/components/monitor/RequestLogs.tsx index f7fef65..93f433c 100644 --- a/src/components/monitor/RequestLogs.tsx +++ b/src/components/monitor/RequestLogs.tsx @@ -135,8 +135,13 @@ export function RequestLogs({ data, loading: parentLoading, providerMap, provide const files = response?.files || []; const map: Record = {}; files.forEach((file) => { - if (file.authIndex !== undefined && file.authIndex !== null) { - map[String(file.authIndex)] = file.name; + // 兼容 auth_index 和 authIndex 两种字段名(API 返回的是 auth_index) + const rawAuthIndex = (file as Record)['auth_index'] ?? file.authIndex; + if (rawAuthIndex !== undefined && rawAuthIndex !== null) { + const authIndexKey = String(rawAuthIndex).trim(); + if (authIndexKey) { + map[authIndexKey] = file.name; + } } }); setAuthIndexMap(map);