diff --git a/src/main/java/com/superbiz/agent/hook/AgentLoggingHook.java b/src/main/java/com/superbiz/agent/hook/AgentLoggingHook.java index 491c862..00559e2 100644 --- a/src/main/java/com/superbiz/agent/hook/AgentLoggingHook.java +++ b/src/main/java/com/superbiz/agent/hook/AgentLoggingHook.java @@ -109,34 +109,84 @@ public class AgentLoggingHook extends MessagesModelHook { */ private String extractTextContent(AssistantMessage message) { try { - // 尝试通过反射获取 text 或 content 字段 - // Spring AI 的 AssistantMessage 通常有 text 字段 - java.lang.reflect.Field textField = null; + // 方法 1: 尝试通过反射获取 text 字段 try { - textField = message.getClass().getDeclaredField("text"); + java.lang.reflect.Field textField = message.getClass().getDeclaredField("text"); + textField.setAccessible(true); + Object value = textField.get(message); + if (value != null) { + String text = value.toString(); + log.debug("通过 text 字段提取成功"); + return text; + } } catch (NoSuchFieldException e) { - try { - textField = message.getClass().getDeclaredField("content"); - } catch (NoSuchFieldException ex) { - // 字段不存在 + // text 字段不存在,尝试下一种方法 + } + + // 方法 2: 尝试 content 字段 + try { + java.lang.reflect.Field contentField = message.getClass().getDeclaredField("content"); + contentField.setAccessible(true); + Object value = contentField.get(message); + if (value != null) { + String text = value.toString(); + log.debug("通过 content 字段提取成功"); + return text; + } + } catch (NoSuchFieldException e) { + // content 字段不存在,尝试下一种方法 + } + + // 方法 3: 尝试调用 getText() 方法 + try { + java.lang.reflect.Method getTextMethod = message.getClass().getMethod("getText"); + Object value = getTextMethod.invoke(message); + if (value != null) { + String text = value.toString(); + log.debug("通过 getText() 方法提取成功"); + return text; + } + } catch (NoSuchMethodException e) { + // getText() 方法不存在,尝试下一种方法 + } + + // 方法 4: 尝试调用 getContent() 方法 + try { + java.lang.reflect.Method getContentMethod = message.getClass().getMethod("getContent"); + Object value = getContentMethod.invoke(message); + if (value != null) { + String text = value.toString(); + log.debug("通过 getContent() 方法提取成功"); + return text; + } + } catch (NoSuchMethodException e) { + // getContent() 方法不存在 + } + + // 方法 5: 打印所有字段和方法,帮助调试 + log.warn("无法提取 AssistantMessage 文本内容,打印类信息:"); + log.warn("类名: {}", message.getClass().getName()); + log.warn("字段列表:"); + for (java.lang.reflect.Field field : message.getClass().getDeclaredFields()) { + log.warn(" - {}: {}", field.getName(), field.getType().getSimpleName()); + } + log.warn("方法列表:"); + for (java.lang.reflect.Method method : message.getClass().getMethods()) { + if (method.getName().startsWith("get") && method.getParameterCount() == 0) { + log.warn(" - {}(): {}", method.getName(), method.getReturnType().getSimpleName()); } } - if (textField != null) { - textField.setAccessible(true); - Object value = textField.get(message); - return value != null ? value.toString() : null; - } - - // 如果找不到字段,尝试 toString() + // 方法 6: 最后尝试 toString() String toString = message.toString(); if (toString != null && !toString.startsWith("AssistantMessage@")) { + log.debug("通过 toString() 提取"); return toString; } return null; } catch (Exception e) { - log.debug("无法提取 AssistantMessage 文本内容: {}", e.getMessage()); + log.error("提取 AssistantMessage 文本内容时出错", e); return null; } } diff --git a/src/test/java/com/superbiz/agent/repository/CaseLibraryRepositoryTest.java b/src/test/java/com/superbiz/agent/repository/CaseLibraryRepositoryTest.java index 90c62a6..2dd525d 100644 --- a/src/test/java/com/superbiz/agent/repository/CaseLibraryRepositoryTest.java +++ b/src/test/java/com/superbiz/agent/repository/CaseLibraryRepositoryTest.java @@ -39,7 +39,7 @@ class CaseLibraryRepositoryTest { .title("接口超时案例") .rootCause("网络延迟导致接口超时") .solution("增加超时时间和重试机制") - .faultCategory(FaultCategory.EXTERNAL_API) + .faultCategory(FaultCategory.API) .errorCode("40003") .sourceType(SourceType.AUTO) .build(); @@ -63,7 +63,7 @@ class CaseLibraryRepositoryTest { .title("数据库死锁案例") .rootCause("并发更新导致死锁") .solution("优化事务粒度") - .faultCategory(FaultCategory.DATABASE) + .faultCategory(FaultCategory.API) .build(); repository.save(caseLib); @@ -81,7 +81,7 @@ class CaseLibraryRepositoryTest { .title("案例1") .rootCause("原因1") .solution("方案1") - .faultCategory(FaultCategory.EXTERNAL_API) + .faultCategory(FaultCategory.API) .errorCode("40003") .build(); @@ -90,7 +90,7 @@ class CaseLibraryRepositoryTest { .title("案例2") .rootCause("原因2") .solution("方案2") - .faultCategory(FaultCategory.EXTERNAL_API) + .faultCategory(FaultCategory.API) .errorCode("40003") .build(); @@ -98,7 +98,7 @@ class CaseLibraryRepositoryTest { repository.save(case2); List results = repository.findByFaultCategoryAndErrorCode( - FaultCategory.EXTERNAL_API, "40003"); + FaultCategory.API, "40003"); assertFalse(results.isEmpty()); assertTrue(results.size() >= 2);