优化
This commit is contained in:
@@ -8,6 +8,7 @@ import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -62,8 +63,7 @@ public class DifyClient {
|
||||
.accept(MediaType.TEXT_EVENT_STREAM)
|
||||
.retrieve()
|
||||
.bodyToFlux(String.class)
|
||||
.map(this::parseSSEEvent)
|
||||
.filter(resp -> resp != null)
|
||||
.flatMap(event -> Mono.justOrEmpty(parseSSEEvent(event)))
|
||||
.doOnNext(resp -> {
|
||||
if (resp.getConversationId() != null) {
|
||||
responseConversationId.set(resp.getConversationId());
|
||||
@@ -83,59 +83,64 @@ public class DifyClient {
|
||||
* 解析 SSE 事件
|
||||
*/
|
||||
private DifyChatRespVO parseSSEEvent(String event) {
|
||||
if (event == null || event.isEmpty()) {
|
||||
if (event == null || !event.startsWith("data:")) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String jsonStr = event.substring(5).trim();
|
||||
if (jsonStr.isEmpty() || "[DONE]".equals(jsonStr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// 解析 SSE 事件格式
|
||||
// data: {"event": "message", "answer": "xxx", "conversation_id": "xxx"}
|
||||
if (event.startsWith("data:")) {
|
||||
String jsonStr = event.substring(5).trim();
|
||||
if (jsonStr.isEmpty() || jsonStr.equals("[DONE]")) {
|
||||
return null;
|
||||
}
|
||||
String eventType = extractJsonValue(jsonStr, "event");
|
||||
String answer = extractJsonValue(jsonStr, "answer");
|
||||
String conversationId = extractJsonValue(jsonStr, "conversation_id");
|
||||
|
||||
// 简单解析 JSON(实际项目建议使用 Jackson/Gson)
|
||||
String eventType = extractJsonValue(jsonStr, "event");
|
||||
String answer = extractJsonValue(jsonStr, "answer");
|
||||
String conversationId = extractJsonValue(jsonStr, "conversation_id");
|
||||
|
||||
if ("message".equals(eventType) || "agent_message".equals(eventType)) {
|
||||
return DifyChatRespVO.message(answer, conversationId);
|
||||
} else if ("workflow_finished".equals(eventType) || "message_end".equals(eventType)) {
|
||||
return DifyChatRespVO.done(conversationId, null);
|
||||
} else if ("error".equals(eventType)) {
|
||||
return DifyChatRespVO.error(answer);
|
||||
}
|
||||
}
|
||||
return switch (eventType) {
|
||||
case "message", "agent_message" -> DifyChatRespVO.message(answer, conversationId);
|
||||
case "workflow_finished", "message_end" -> DifyChatRespVO.done(conversationId, null);
|
||||
case "error" -> DifyChatRespVO.error(answer);
|
||||
default -> null;
|
||||
};
|
||||
} catch (Exception e) {
|
||||
log.warn("[parseSSEEvent] 解析 SSE 事件失败: {}", event, e);
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 简单提取 JSON 值
|
||||
* 简单提取 JSON 值(支持字符串和非字符串格式)
|
||||
*/
|
||||
private String extractJsonValue(String json, String key) {
|
||||
String pattern = "\"" + key + "\"\\s*:\\s*\"";
|
||||
int start = json.indexOf(pattern);
|
||||
if (start == -1) {
|
||||
// 尝试非字符串格式
|
||||
pattern = "\"" + key + "\"\\s*:\\s*";
|
||||
start = json.indexOf(pattern);
|
||||
if (start == -1) return null;
|
||||
start += pattern.length();
|
||||
int end = json.indexOf(",", start);
|
||||
if (end == -1) end = json.indexOf("}", start);
|
||||
if (end == -1) return null;
|
||||
return json.substring(start, end).trim();
|
||||
// 查找 "key": 后的位置,兼容带空格和不带空格的格式
|
||||
int keyStart = json.indexOf("\"" + key + "\":");
|
||||
if (keyStart == -1) {
|
||||
return null;
|
||||
}
|
||||
start += pattern.length();
|
||||
int end = json.indexOf("\"", start);
|
||||
if (end == -1) return null;
|
||||
return json.substring(start, end);
|
||||
|
||||
int valueStart = keyStart + key.length() + 3; // 跳过 "key":
|
||||
// 跳过空白字符
|
||||
while (valueStart < json.length() && Character.isWhitespace(json.charAt(valueStart))) {
|
||||
valueStart++;
|
||||
}
|
||||
if (valueStart >= json.length()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
char firstChar = json.charAt(valueStart);
|
||||
// 字符串值 "value"
|
||||
if (firstChar == '"') {
|
||||
int end = json.indexOf('"', valueStart + 1);
|
||||
return end != -1 ? json.substring(valueStart + 1, end) : null;
|
||||
}
|
||||
|
||||
// 非字符串值(数字、布尔等)
|
||||
int end = json.indexOf(',', valueStart);
|
||||
if (end == -1) {
|
||||
end = json.indexOf('}', valueStart);
|
||||
}
|
||||
return end != -1 ? json.substring(valueStart, end).trim() : null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ public interface MemberUserProfileMapper extends BaseMapperX<MemberUserProfileDO
|
||||
* @param points 扣减积分数量(正数)
|
||||
* @return 影响行数,0表示余额不足
|
||||
*/
|
||||
@Update("UPDATE muey_member_user_profile " +
|
||||
@Update("UPDATE muye_member_user_profile " +
|
||||
"SET remaining_points = remaining_points - #{points}, " +
|
||||
" used_points = used_points + #{points}, " +
|
||||
" update_time = NOW() " +
|
||||
|
||||
Reference in New Issue
Block a user