| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.core.annotations.ManagerAuth; |
| | | import com.core.common.R; |
| | | import com.zy.ai.entity.AiAutoTuneJob; |
| | | import com.zy.ai.entity.AiChatSession; |
| | | import com.zy.ai.entity.AiTokenUsage; |
| | | import com.zy.ai.entity.LlmCallLog; |
| | | import com.zy.ai.entity.LlmRouteConfig; |
| | | import com.zy.ai.enums.AiPromptScene; |
| | | import com.zy.ai.mapper.AiChatSessionMapper; |
| | | import com.zy.ai.mapper.AiTokenUsageMapper; |
| | | import com.zy.ai.service.AiAutoTuneJobService; |
| | | import com.zy.ai.service.LlmCallLogService; |
| | | import com.zy.ai.service.LlmRouteConfigService; |
| | | import com.zy.asrs.entity.*; |
| | |
| | | @Autowired |
| | | private LlmCallLogService llmCallLogService; |
| | | @Autowired |
| | | private AiAutoTuneJobService aiAutoTuneJobService; |
| | | @Autowired |
| | | private AiChatSessionMapper aiChatSessionMapper; |
| | | @Autowired |
| | | private AiTokenUsageMapper aiTokenUsageMapper; |
| | | @Autowired |
| | | private DevicePingFileStorageService devicePingFileStorageService; |
| | | |
| | |
| | | private Map<String, Object> buildAiStats() { |
| | | Map<String, Object> result = new LinkedHashMap<>(); |
| | | |
| | | // 从独立累计表读取 token 统计 |
| | | long tokenTotal = 0L; |
| | | long promptTokenTotal = 0L; |
| | | long completionTokenTotal = 0L; |
| | | long llmCallCountTotal = 0L; |
| | | try { |
| | | AiTokenUsage tokenUsage = aiTokenUsageMapper.selectById(1); |
| | | if (tokenUsage != null) { |
| | | promptTokenTotal = safeCount(tokenUsage.getPromptTokens()); |
| | | completionTokenTotal = safeCount(tokenUsage.getCompletionTokens()); |
| | | tokenTotal = safeCount(tokenUsage.getTotalTokens()); |
| | | llmCallCountTotal = safeCount(tokenUsage.getLlmCallCount()); |
| | | } |
| | | } catch (Exception e) { |
| | | log.warn("dashboard ai token usage load failed: {}", safeMessage(e)); |
| | | } |
| | | |
| | | // 会话统计(保留用于显示会话数和提问轮次) |
| | | long askCount = 0L; |
| | | long sessionCount = 0L; |
| | | try { |
| | | List<AiChatSession> sessions = aiChatSessionMapper.selectList(new QueryWrapper<AiChatSession>() |
| | | .select("id", "sum_prompt_tokens", "sum_completion_tokens", "sum_total_tokens", "ask_count")); |
| | | .select("id", "ask_count")); |
| | | sessionCount = sessions == null ? 0L : sessions.size(); |
| | | if (sessions != null) { |
| | | for (AiChatSession session : sessions) { |
| | | promptTokenTotal += safeCount(session == null ? null : session.getSumPromptTokens()); |
| | | completionTokenTotal += safeCount(session == null ? null : session.getSumCompletionTokens()); |
| | | tokenTotal += safeCount(session == null ? null : session.getSumTotalTokens()); |
| | | askCount += safeCount(session == null ? null : session.getAskCount()); |
| | | } |
| | | } |
| | |
| | | overview.put("tokenTotal", tokenTotal); |
| | | overview.put("promptTokenTotal", promptTokenTotal); |
| | | overview.put("completionTokenTotal", completionTokenTotal); |
| | | overview.put("llmCallCountTotal", llmCallCountTotal); |
| | | overview.put("askCount", askCount); |
| | | overview.put("sessionCount", sessionCount); |
| | | overview.put("routeTotal", routeTotal); |