From 82624affb0251b75b62b35567d3eb260c06efe78 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期一, 23 三月 2026 12:48:07 +0800
Subject: [PATCH] #ai 代码优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiCallLogServiceImpl.java |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiCallLogServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiCallLogServiceImpl.java
index d3827a6..60e3964 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiCallLogServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiCallLogServiceImpl.java
@@ -8,6 +8,7 @@
 import com.vincent.rsf.server.ai.entity.AiMcpCallLog;
 import com.vincent.rsf.server.ai.mapper.AiCallLogMapper;
 import com.vincent.rsf.server.ai.mapper.AiMcpCallLogMapper;
+import com.vincent.rsf.server.ai.store.AiObserveStatsStore;
 import com.vincent.rsf.server.ai.service.AiCallLogService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -26,6 +27,7 @@
     private static final Pattern BEARER_PATTERN = Pattern.compile("(?i)(bearer\\s+)([a-z0-9._-]+)");
 
     private final AiMcpCallLogMapper aiMcpCallLogMapper;
+    private final AiObserveStatsStore aiObserveStatsStore;
 
     @Override
     public AiCallLog startCallLog(String requestId, Long sessionId, Long userId, Long tenantId, String promptCode,
@@ -51,6 +53,7 @@
                 .setCreateTime(now)
                 .setUpdateTime(now);
         this.save(callLog);
+        aiObserveStatsStore.recordObserveCallStarted(tenantId);
         return callLog;
     }
 
@@ -73,6 +76,10 @@
                 .set(AiCallLog::getToolFailureCount, (int) toolFailureCount)
                 .set(AiCallLog::getToolCallCount, (int) (toolSuccessCount + toolFailureCount))
                 .set(AiCallLog::getUpdateTime, new Date()));
+        AiCallLog latest = this.getById(callLogId);
+        if (latest != null) {
+            aiObserveStatsStore.recordObserveCallFinished(latest.getTenantId(), status, elapsedMs, firstTokenLatencyMs, totalTokens);
+        }
     }
 
     @Override
@@ -93,6 +100,10 @@
                 .set(AiCallLog::getToolFailureCount, (int) toolFailureCount)
                 .set(AiCallLog::getToolCallCount, (int) (toolSuccessCount + toolFailureCount))
                 .set(AiCallLog::getUpdateTime, new Date()));
+        AiCallLog latest = this.getById(callLogId);
+        if (latest != null) {
+            aiObserveStatsStore.recordObserveCallFinished(latest.getTenantId(), status, elapsedMs, firstTokenLatencyMs, null);
+        }
     }
 
     @Override
@@ -117,10 +128,16 @@
                 .setUserId(userId)
                 .setTenantId(tenantId)
                 .setCreateTime(new Date()));
+        aiObserveStatsStore.recordObserveToolCall(tenantId, toolName, status);
     }
 
     @Override
     public AiObserveStatsDto getObserveStats(Long tenantId) {
+        return aiObserveStatsStore.getObserveStats(tenantId, () -> loadObserveStatsFromDatabase(tenantId));
+    }
+
+    private AiObserveStatsDto loadObserveStatsFromDatabase(Long tenantId) {
+        // 鏁版嵁搴撹仛鍚堝彧浣滀负 Redis 鍐峰惎鍔ㄥ厹搴曪紝姝e父鎯呭喌涓嬬湅鏉垮簲鐩存帴娑堣垂瀹炴椂璁℃暟銆�
         List<AiCallLog> callLogs = this.list(new LambdaQueryWrapper<AiCallLog>()
                 .eq(AiCallLog::getTenantId, tenantId)
                 .eq(AiCallLog::getDeleted, 0)

--
Gitblit v1.9.1