Commit 8ef4f9e1 authored by alex yao's avatar alex yao

refactor(agent): 统一 DifyChat agent 返回类型

- 将 AnnualReportAgent 的 agent 方法返回类型从 String 改为 AgentResultEntity
- 在 AnnualReportServiceImpl 中使用 AgentResultEntity 接收代理结果
- 更新 DifyChatService 接口的 blockingChat 和 streamChat 方法返回类型为 AgentResultEntity
- 在 DifyChatServiceImpl 中实现 <think> 标签内容解析功能
- 将解析出的推理内容和消息分别存储到 AgentResultEntity 对象中
- 移除不再使用的 JsonUtils 和 AiDialoguesService 依赖
- 添加 SoftwareCopyRightAgent 中的 AgentResultEntity 导入声明
parent 3deea40c
......@@ -7,16 +7,16 @@ import java.util.List;
import java.util.Map;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.gsst.dify_client.model.chat.ChatMessageResponse;
import cn.com.poc.common.config.DifyConfigProperties;
import cn.com.poc.agent_application.entity.AgentResultEntity;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
import cn.com.poc.ai_software_copyright.domain.BaseInfo;
import cn.com.poc.ai_software_copyright.domain.GeneratedDoc;
import cn.com.poc.ai_software_copyright.domain.TechnicalContent;
import cn.com.poc.ai_software_copyright.factory.DocGenerationStrategyFactory;
import cn.com.poc.common.service.impl.DifyChatServiceImpl;
import cn.com.poc.ai_software_copyright.utils.SoftwareCopyRightUtils;
import cn.com.poc.common.config.DifyConfigProperties;
import cn.com.poc.common.pool.CommonThreadPoolExecutor;
import cn.com.poc.common.service.impl.DifyChatServiceImpl;
import cn.com.poc.common.utils.DateUtils;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.yict.framemax.core.exception.BusinessException;
......@@ -121,14 +121,14 @@ public class SoftwareCopyRightAgent {
String user = "user-technicalContent";
try {
ChatMessageResponse response = difyChatService.blockingChat(
AgentResultEntity response = difyChatService.blockingChat(
fileUrls,
query,
data,
user,
apiKey
);
return response.getAnswer();
return response.getMessage();
} catch (Exception e) {
logger.error("执行【技术内容】生成异常: {}", e.getMessage(), e);
throw new BusinessException("执行【技术内容】生成异常", e);
......
......@@ -3,6 +3,7 @@ package cn.com.poc.annual_eport.agent;
import java.util.List;
import java.util.Map;
import cn.com.poc.agent_application.entity.AgentResultEntity;
import cn.com.poc.ai_dialogues.constant.AiDialoguesTypeEnum;
import cn.com.poc.common.config.DifyConfigProperties;
import cn.com.poc.common.service.impl.DifyChatServiceImpl;
......@@ -24,7 +25,7 @@ public class AnnualReportAgent {
private DifyChatServiceImpl difyChatService;
public String agent(String dialoguesId, List<String> fileUrls, String question, Map<String, Object> data)
public AgentResultEntity agent(String dialoguesId, List<String> fileUrls, String question, Map<String, Object> data)
throws Exception {
String apiKey = difyConfigProperties.getApiKeys().get(AiDialoguesTypeEnum.ANNUAL_REPORT.getType());
return difyChatService.streamChat(
......
......@@ -5,15 +5,14 @@ import java.util.List;
import java.util.Map;
import cn.com.poc.agent_application.constant.AgentApplicationDialoguesRecordConstants;
import cn.com.poc.agent_application.entity.AgentResultEntity;
import cn.com.poc.agent_application.entity.BizAgentApplicationDialoguesRecordEntity;
import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService;
import cn.com.poc.ai_dialogues.aggregate.AiDialoguesService;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesService;
import cn.com.poc.annual_eport.agent.AnnualReportAgent;
import cn.com.poc.annual_eport.service.AnnualReportService;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
......@@ -41,7 +40,7 @@ public class AnnualReportServiceImpl implements AnnualReportService {
@Override
public void call(String input, List<String> fileUrls, String dialoguesId, Map<String, Object> data)
throws Exception {
String result = new String();
AgentResultEntity agentResultEntity = new AgentResultEntity();
long inputTimeStamp = System.currentTimeMillis();
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId);
......@@ -61,7 +60,7 @@ public class AnnualReportServiceImpl implements AnnualReportService {
bizAiDialoguesService.update(aiDialoguesEntity);
}
try {
result = annualReportAgent.agent(dialoguesId, fileUrls, input, data);
agentResultEntity = annualReportAgent.agent(dialoguesId, fileUrls, input, data);
} catch (Exception e) {
logger.error(e.getMessage());
throw new BusinessException("对话异常");
......@@ -83,8 +82,8 @@ public class AnnualReportServiceImpl implements AnnualReportService {
outputRecord.setDialogsId(dialoguesId);
outputRecord.setMemberId(null);
outputRecord.setTimestamp(System.currentTimeMillis());
outputRecord.setContent(result);
outputRecord.setReasoningContent(null);
outputRecord.setContent(agentResultEntity.getMessage());
outputRecord.setReasoningContent(agentResultEntity.getReasoningContent());
bizAgentApplicationDialoguesRecordService.save(outputRecord);
}
}
......
......@@ -5,7 +5,7 @@ import java.util.List;
import java.util.Map;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.gsst.dify_client.model.chat.ChatMessageResponse;
import cn.com.poc.agent_application.entity.AgentResultEntity;
/**
* @author alex.yao
......@@ -13,14 +13,14 @@ import cn.com.gsst.dify_client.model.chat.ChatMessageResponse;
*/
public interface DifyChatService {
ChatMessageResponse blockingChat(List<String> fileUrls,
AgentResultEntity blockingChat(List<String> fileUrls,
String question,
Map<String, Object> data,
String user,
String apiKey);
String streamChat(List<String> fileUrls,
AgentResultEntity streamChat(List<String> fileUrls,
String question,
Map<String, Object> data,
String user,
......
......@@ -21,6 +21,7 @@ import cn.com.gsst.dify_client.model.DifyConfig;
import cn.com.gsst.dify_client.model.chat.ChatMessage;
import cn.com.gsst.dify_client.model.chat.ChatMessageResponse;
import cn.com.gsst.dify_client.model.file.FileInfo;
import cn.com.poc.agent_application.entity.AgentResultEntity;
import cn.com.poc.common.config.DifyConfigProperties;
import cn.com.poc.common.service.DifyChatService;
import cn.com.poc.common.utils.JsonUtils;
......@@ -44,13 +45,17 @@ public class DifyChatServiceImpl implements DifyChatService {
private final Logger logger = LoggerFactory.getLogger(DifyChatServiceImpl.class);
private final String thinkStartTag = "<think>";
private final String thinkEndTag = "</think>";
@Autowired
private DifyConfigProperties difyConfigProperties;
/**
* 阻塞式聊天请求
*/
public ChatMessageResponse blockingChat(List<String> fileUrls,
public AgentResultEntity blockingChat(List<String> fileUrls,
String question,
Map<String, Object> data,
String user,
......@@ -81,7 +86,7 @@ public class DifyChatServiceImpl implements DifyChatService {
}
// 创建聊天消息
ChatMessage message = ChatMessage.builder()
ChatMessage chatMessage = ChatMessage.builder()
.query(question)
.user(user)
.files(files)
......@@ -91,8 +96,28 @@ public class DifyChatServiceImpl implements DifyChatService {
// 发送消息并获取响应
try {
ChatMessageResponse chatMessageResponse = chatClient.sendChatMessage(message);
return chatMessageResponse;
ChatMessageResponse chatMessageResponse = chatClient.sendChatMessage(chatMessage);
AgentResultEntity agentResultEntity = new AgentResultEntity();
String answer = chatMessageResponse.getAnswer();
int startIndex = answer.indexOf(thinkStartTag);
int endIndex = answer.indexOf(thinkEndTag);
if (startIndex != -1 && endIndex != -1 && endIndex > startIndex) {
// 提取<think>标签内的内容
String reasoningContent = answer.substring(startIndex + thinkStartTag.length(), endIndex);
agentResultEntity.setReasoningContent(reasoningContent.trim());
// 提取其余内容(去除<think>标签部分)
String message = answer.substring(0, startIndex) + answer.substring(endIndex + thinkEndTag.length());
agentResultEntity.setMessage(message);
} else {
// 如果没有找到<think>标签,将整个answer作为message
agentResultEntity.setMessage(answer);
agentResultEntity.setReasoningContent("");
}
return agentResultEntity;
} catch (IOException | DifyApiException e) {
logger.error("执行{}生成异常: {}", user, e.getMessage(), e);
throw new BusinessException("执行" + user + "生成异常");
......@@ -102,12 +127,15 @@ public class DifyChatServiceImpl implements DifyChatService {
/**
* 流式聊天请求
*/
public String streamChat(List<String> fileUrls,
public AgentResultEntity streamChat(List<String> fileUrls,
String question,
Map<String, Object> data,
String user,
String apiKey) throws IOException, DifyApiException, InterruptedException {
StringBuilder stringBuilder = new StringBuilder();
AgentResultEntity agentResultEntity = new AgentResultEntity();
StringBuilder messageBuilder = new StringBuilder();
StringBuilder reasoningContentBuilder = new StringBuilder();
// 从配置中获取API密钥,如果传入的apiKey为null或空,则从配置中查找
String actualApiKey = apiKey;
if (StringUtils.isEmpty(actualApiKey)) {
......@@ -146,15 +174,43 @@ public class DifyChatServiceImpl implements DifyChatService {
chatClient.sendChatMessageStream(message, new ChatStreamCallback() {
SSEUtil sseUtil = new SSEUtil(response);
boolean isThink = false;
private String think(String content) {
if (!isThink) {
if (content.contains(thinkStartTag)) {
isThink = true;
return content.replaceFirst(thinkStartTag, "");
}
return content;
} else {
if (content.contains(thinkEndTag)) {
isThink = false;
return content.replaceFirst(thinkEndTag, "");
}
return null;
}
}
@Override
public void onMessage(MessageEvent event) {
try {
if (StringUtils.isNotEmpty(event.getAnswer())) {
String think = think(event.getAnswer());
LargeModelDemandResult largeModelDemandResult = new LargeModelDemandResult();
largeModelDemandResult.setCode("0");
if (isThink || StringUtils.isNotBlank(think)) {
largeModelDemandResult.setReasoningContent(think);
reasoningContentBuilder.append(think);
} else if (!isThink || StringUtils.isNotBlank(think)) {
largeModelDemandResult.setMessage(think);
reasoningContentBuilder.append(think);
} else {
largeModelDemandResult.setMessage(event.getAnswer());
messageBuilder.append(event.getAnswer());
}
largeModelDemandResult.setCode("0");
sseUtil.send(JsonUtils.serialize(largeModelDemandResult));
stringBuilder.append(event.getAnswer());
}
} catch (Exception e) {
logger.error("发送SSE消息时出错: {}", e.getMessage(), e);
......@@ -173,11 +229,13 @@ public class DifyChatServiceImpl implements DifyChatService {
throw new RuntimeException(e);
} finally {
sseUtil.complete();
agentResultEntity.setMessage(messageBuilder.toString());
agentResultEntity.setReasoningContent(reasoningContentBuilder.toString());
}
countDownLatch.countDown();
}
});
countDownLatch.await(120, TimeUnit.SECONDS);
return stringBuilder.toString();
return agentResultEntity;
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment