From b05f094ac51dce91eb8c00235226d54a04658c6d Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期一, 23 三月 2026 15:51:17 +0800
Subject: [PATCH] #ai 页面优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/chat/AiToolObservationService.java |  104 +++++++++++++++-------------------------------------
 1 files changed, 30 insertions(+), 74 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/chat/AiToolObservationService.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/chat/AiToolObservationService.java
index 82d2019..72b6385 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/chat/AiToolObservationService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/chat/AiToolObservationService.java
@@ -1,7 +1,6 @@
 package com.vincent.rsf.server.ai.service.impl.chat;
 
 import com.vincent.rsf.framework.exception.CoolException;
-import com.vincent.rsf.server.ai.dto.AiChatToolEventDto;
 import com.vincent.rsf.server.ai.service.AiCallLogService;
 import com.vincent.rsf.server.ai.service.MountedToolCallback;
 import com.vincent.rsf.server.ai.store.AiCachedToolResult;
@@ -11,7 +10,6 @@
 import org.springframework.ai.tool.ToolCallback;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -21,15 +19,14 @@
 @RequiredArgsConstructor
 public class AiToolObservationService {
 
-    private final AiSseEventPublisher aiSseEventPublisher;
     private final AiToolResultStore aiToolResultStore;
     private final AiCallLogService aiCallLogService;
 
-    public ToolCallback[] wrapToolCallbacks(ToolCallback[] toolCallbacks, SseEmitter emitter, String requestId,
+    public ToolCallback[] wrapToolCallbacks(ToolCallback[] toolCallbacks, String requestId,
                                             Long sessionId, AtomicLong toolCallSequence,
                                             AtomicLong toolSuccessCount, AtomicLong toolFailureCount,
                                             Long callLogId, Long userId, Long tenantId,
-                                            AiThinkingTraceEmitter thinkingTraceEmitter) {
+                                            AiChatTraceEmitter traceEmitter) {
         if (toolCallbacks == null || toolCallbacks.length == 0) {
             return toolCallbacks;
         }
@@ -38,8 +35,8 @@
             if (callback == null) {
                 continue;
             }
-            wrappedCallbacks.add(new ObservableToolCallback(callback, emitter, requestId, sessionId, toolCallSequence,
-                    toolSuccessCount, toolFailureCount, callLogId, userId, tenantId, thinkingTraceEmitter));
+            wrappedCallbacks.add(new ObservableToolCallback(callback, requestId, sessionId, toolCallSequence,
+                    toolSuccessCount, toolFailureCount, callLogId, userId, tenantId, traceEmitter));
         }
         return wrappedCallbacks.toArray(new ToolCallback[0]);
     }
@@ -58,7 +55,6 @@
     private class ObservableToolCallback implements ToolCallback {
 
         private final ToolCallback delegate;
-        private final SseEmitter emitter;
         private final String requestId;
         private final Long sessionId;
         private final AtomicLong toolCallSequence;
@@ -67,15 +63,14 @@
         private final Long callLogId;
         private final Long userId;
         private final Long tenantId;
-        private final AiThinkingTraceEmitter thinkingTraceEmitter;
+        private final AiChatTraceEmitter traceEmitter;
 
-        private ObservableToolCallback(ToolCallback delegate, SseEmitter emitter, String requestId,
+        private ObservableToolCallback(ToolCallback delegate, String requestId,
                                        Long sessionId, AtomicLong toolCallSequence,
                                        AtomicLong toolSuccessCount, AtomicLong toolFailureCount,
                                        Long callLogId, Long userId, Long tenantId,
-                                       AiThinkingTraceEmitter thinkingTraceEmitter) {
+                                       AiChatTraceEmitter traceEmitter) {
             this.delegate = delegate;
-            this.emitter = emitter;
             this.requestId = requestId;
             this.sessionId = sessionId;
             this.toolCallSequence = toolCallSequence;
@@ -84,7 +79,7 @@
             this.callLogId = callLogId;
             this.userId = userId;
             this.tenantId = tenantId;
-            this.thinkingTraceEmitter = thinkingTraceEmitter;
+            this.traceEmitter = traceEmitter;
         }
 
         @Override
@@ -108,95 +103,56 @@
             String mountName = delegate instanceof MountedToolCallback ? ((MountedToolCallback) delegate).getMountName() : null;
             String toolCallId = requestId + "-tool-" + toolCallSequence.incrementAndGet();
             long startedAt = System.currentTimeMillis();
+            String inputSummary = summarizeToolPayload(toolInput, 400);
             AiCachedToolResult cachedToolResult = aiToolResultStore.getToolResult(tenantId, requestId, toolName, toolInput);
             if (cachedToolResult != null) {
-                aiSseEventPublisher.emitSafely(emitter, "tool_result", AiChatToolEventDto.builder()
-                        .requestId(requestId)
-                        .sessionId(sessionId)
-                        .toolCallId(toolCallId)
-                        .toolName(toolName)
-                        .mountName(mountName)
-                        .status(cachedToolResult.isSuccess() ? "COMPLETED" : "FAILED")
-                        .inputSummary(summarizeToolPayload(toolInput, 400))
-                        .outputSummary(summarizeToolPayload(cachedToolResult.getOutput(), 600))
-                        .errorMessage(cachedToolResult.getErrorMessage())
-                        .durationMs(0L)
-                        .timestamp(System.currentTimeMillis())
-                        .build());
-                if (thinkingTraceEmitter != null) {
-                    thinkingTraceEmitter.onToolResult(toolName, toolCallId, !cachedToolResult.isSuccess());
+                String outputSummary = summarizeToolPayload(cachedToolResult.getOutput(), 600);
+                String errorMessage = cachedToolResult.getErrorMessage();
+                if (traceEmitter != null) {
+                    traceEmitter.onToolResult(toolName, mountName, toolCallId, inputSummary, outputSummary,
+                            errorMessage, 0L, System.currentTimeMillis(), !cachedToolResult.isSuccess());
                 }
                 if (cachedToolResult.isSuccess()) {
                     toolSuccessCount.incrementAndGet();
                     aiCallLogService.saveMcpCallLog(callLogId, requestId, sessionId, toolCallId, mountName, toolName,
-                            "COMPLETED", summarizeToolPayload(toolInput, 400), summarizeToolPayload(cachedToolResult.getOutput(), 600),
+                            "COMPLETED", inputSummary, outputSummary,
                             null, 0L, userId, tenantId);
                     return cachedToolResult.getOutput();
                 }
                 toolFailureCount.incrementAndGet();
                 aiCallLogService.saveMcpCallLog(callLogId, requestId, sessionId, toolCallId, mountName, toolName,
-                        "FAILED", summarizeToolPayload(toolInput, 400), null, cachedToolResult.getErrorMessage(),
+                        "FAILED", inputSummary, null, errorMessage,
                         0L, userId, tenantId);
-                throw new CoolException(cachedToolResult.getErrorMessage());
+                throw new CoolException(errorMessage);
             }
-            if (thinkingTraceEmitter != null) {
-                thinkingTraceEmitter.onToolStart(toolName, toolCallId);
+            if (traceEmitter != null) {
+                traceEmitter.onToolStart(toolName, mountName, toolCallId, inputSummary, startedAt);
             }
-            aiSseEventPublisher.emitSafely(emitter, "tool_start", AiChatToolEventDto.builder()
-                    .requestId(requestId)
-                    .sessionId(sessionId)
-                    .toolCallId(toolCallId)
-                    .toolName(toolName)
-                    .mountName(mountName)
-                    .status("STARTED")
-                    .inputSummary(summarizeToolPayload(toolInput, 400))
-                    .timestamp(startedAt)
-                    .build());
             try {
                 String output = toolContext == null ? delegate.call(toolInput) : delegate.call(toolInput, toolContext);
                 long durationMs = System.currentTimeMillis() - startedAt;
-                aiSseEventPublisher.emitSafely(emitter, "tool_result", AiChatToolEventDto.builder()
-                        .requestId(requestId)
-                        .sessionId(sessionId)
-                        .toolCallId(toolCallId)
-                        .toolName(toolName)
-                        .mountName(mountName)
-                        .status("COMPLETED")
-                        .inputSummary(summarizeToolPayload(toolInput, 400))
-                        .outputSummary(summarizeToolPayload(output, 600))
-                        .durationMs(durationMs)
-                        .timestamp(System.currentTimeMillis())
-                        .build());
-                if (thinkingTraceEmitter != null) {
-                    thinkingTraceEmitter.onToolResult(toolName, toolCallId, false);
+                String outputSummary = summarizeToolPayload(output, 600);
+                if (traceEmitter != null) {
+                    traceEmitter.onToolResult(toolName, mountName, toolCallId, inputSummary, outputSummary,
+                            null, durationMs, System.currentTimeMillis(), false);
                 }
                 aiToolResultStore.cacheToolResult(tenantId, requestId, toolName, toolInput, true, output, null);
                 toolSuccessCount.incrementAndGet();
                 aiCallLogService.saveMcpCallLog(callLogId, requestId, sessionId, toolCallId, mountName, toolName,
-                        "COMPLETED", summarizeToolPayload(toolInput, 400), summarizeToolPayload(output, 600),
+                        "COMPLETED", inputSummary, outputSummary,
                         null, durationMs, userId, tenantId);
                 return output;
             } catch (RuntimeException e) {
                 long durationMs = System.currentTimeMillis() - startedAt;
-                aiSseEventPublisher.emitSafely(emitter, "tool_error", AiChatToolEventDto.builder()
-                        .requestId(requestId)
-                        .sessionId(sessionId)
-                        .toolCallId(toolCallId)
-                        .toolName(toolName)
-                        .mountName(mountName)
-                        .status("FAILED")
-                        .inputSummary(summarizeToolPayload(toolInput, 400))
-                        .errorMessage(e.getMessage())
-                        .durationMs(durationMs)
-                        .timestamp(System.currentTimeMillis())
-                        .build());
-                if (thinkingTraceEmitter != null) {
-                    thinkingTraceEmitter.onToolResult(toolName, toolCallId, true);
+                String errorMessage = e.getMessage();
+                if (traceEmitter != null) {
+                    traceEmitter.onToolResult(toolName, mountName, toolCallId, inputSummary, null,
+                            errorMessage, durationMs, System.currentTimeMillis(), true);
                 }
-                aiToolResultStore.cacheToolResult(tenantId, requestId, toolName, toolInput, false, null, e.getMessage());
+                aiToolResultStore.cacheToolResult(tenantId, requestId, toolName, toolInput, false, null, errorMessage);
                 toolFailureCount.incrementAndGet();
                 aiCallLogService.saveMcpCallLog(callLogId, requestId, sessionId, toolCallId, mountName, toolName,
-                        "FAILED", summarizeToolPayload(toolInput, 400), null, e.getMessage(),
+                        "FAILED", inputSummary, null, errorMessage,
                         durationMs, userId, tenantId);
                 throw e;
             }

--
Gitblit v1.9.1