mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
fix: user stats again x4
This commit is contained in:
@@ -137,24 +137,43 @@ router.get('/api-keys', authenticateUser, async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const apiKeys = await apiKeyService.getUserApiKeys(req.user.id)
|
const apiKeys = await apiKeyService.getUserApiKeys(req.user.id)
|
||||||
|
|
||||||
// 移除敏感信息
|
// 移除敏感信息并格式化usage数据
|
||||||
const safeApiKeys = apiKeys.map((key) => ({
|
const safeApiKeys = apiKeys.map((key) => {
|
||||||
id: key.id,
|
// Flatten usage structure for frontend compatibility
|
||||||
name: key.name,
|
let flatUsage = {
|
||||||
description: key.description,
|
requests: 0,
|
||||||
tokenLimit: key.tokenLimit,
|
inputTokens: 0,
|
||||||
isActive: key.isActive,
|
outputTokens: 0,
|
||||||
createdAt: key.createdAt,
|
totalCost: 0
|
||||||
lastUsedAt: key.lastUsedAt,
|
}
|
||||||
expiresAt: key.expiresAt,
|
|
||||||
usage: key.usage,
|
if (key.usage && key.usage.total) {
|
||||||
dailyCost: key.dailyCost,
|
flatUsage = {
|
||||||
dailyCostLimit: key.dailyCostLimit,
|
requests: key.usage.total.requests || 0,
|
||||||
// 不返回实际的key值,只返回前缀和后几位
|
inputTokens: key.usage.total.inputTokens || 0,
|
||||||
keyPreview: key.key
|
outputTokens: key.usage.total.outputTokens || 0,
|
||||||
? `${key.key.substring(0, 8)}...${key.key.substring(key.key.length - 4)}`
|
totalCost: key.totalCost || 0
|
||||||
: null
|
}
|
||||||
}))
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: key.id,
|
||||||
|
name: key.name,
|
||||||
|
description: key.description,
|
||||||
|
tokenLimit: key.tokenLimit,
|
||||||
|
isActive: key.isActive,
|
||||||
|
createdAt: key.createdAt,
|
||||||
|
lastUsedAt: key.lastUsedAt,
|
||||||
|
expiresAt: key.expiresAt,
|
||||||
|
usage: flatUsage,
|
||||||
|
dailyCost: key.dailyCost,
|
||||||
|
dailyCostLimit: key.dailyCostLimit,
|
||||||
|
// 不返回实际的key值,只返回前缀和后几位
|
||||||
|
keyPreview: key.key
|
||||||
|
? `${key.key.substring(0, 8)}...${key.key.substring(key.key.length - 4)}`
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
success: true,
|
success: true,
|
||||||
|
|||||||
@@ -500,16 +500,6 @@ class ApiKeyService {
|
|||||||
const dailyCost = (await redis.getDailyCost(key.id)) || 0
|
const dailyCost = (await redis.getDailyCost(key.id)) || 0
|
||||||
const costStats = await redis.getCostStats(key.id)
|
const costStats = await redis.getCostStats(key.id)
|
||||||
|
|
||||||
logger.debug(`🔍 getUserApiKeys: Key ${key.id} (${key.name}) usage:`, {
|
|
||||||
keyId: key.id,
|
|
||||||
keyName: key.name,
|
|
||||||
userId: key.userId,
|
|
||||||
rawUsage: usage,
|
|
||||||
dailyCost,
|
|
||||||
costStats,
|
|
||||||
lastUsedAt: key.lastUsedAt
|
|
||||||
})
|
|
||||||
|
|
||||||
userKeysWithUsage.push({
|
userKeysWithUsage.push({
|
||||||
id: key.id,
|
id: key.id,
|
||||||
name: key.name,
|
name: key.name,
|
||||||
@@ -673,11 +663,12 @@ class ApiKeyService {
|
|||||||
// 汇总所有API Key的统计数据
|
// 汇总所有API Key的统计数据
|
||||||
for (const keyId of keyIds) {
|
for (const keyId of keyIds) {
|
||||||
const keyStats = await redis.getUsageStats(keyId)
|
const keyStats = await redis.getUsageStats(keyId)
|
||||||
if (keyStats) {
|
const costStats = await redis.getCostStats(keyId)
|
||||||
stats.totalRequests += keyStats.requests || 0
|
if (keyStats && keyStats.total) {
|
||||||
stats.totalInputTokens += keyStats.inputTokens || 0
|
stats.totalRequests += keyStats.total.requests || 0
|
||||||
stats.totalOutputTokens += keyStats.outputTokens || 0
|
stats.totalInputTokens += keyStats.total.inputTokens || 0
|
||||||
stats.totalCost += keyStats.totalCost || 0
|
stats.totalOutputTokens += keyStats.total.outputTokens || 0
|
||||||
|
stats.totalCost += costStats?.total || 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,10 +150,6 @@ class UserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const apiKey of userApiKeys) {
|
for (const apiKey of userApiKeys) {
|
||||||
logger.debug(`🔍 Processing API key ${apiKey.id} (${apiKey.name}) for user ${userId}:`, {
|
|
||||||
hasUsage: !!apiKey.usage,
|
|
||||||
usage: apiKey.usage
|
|
||||||
})
|
|
||||||
if (apiKey.usage && apiKey.usage.total) {
|
if (apiKey.usage && apiKey.usage.total) {
|
||||||
totalUsage.requests += apiKey.usage.total.requests || 0
|
totalUsage.requests += apiKey.usage.total.requests || 0
|
||||||
totalUsage.inputTokens += apiKey.usage.total.inputTokens || 0
|
totalUsage.inputTokens += apiKey.usage.total.inputTokens || 0
|
||||||
|
|||||||
Reference in New Issue
Block a user