feature: modify dify chat liistner

This commit is contained in:
leven.chen
2023-12-23 11:39:55 +08:00
parent 45a3a8f068
commit 0d8b0891af
4 changed files with 57 additions and 4 deletions

View File

@ -1,5 +1,6 @@
package ai.chat2db.server.web.api.controller.ai.chat2db.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Map;
@ -21,12 +22,14 @@ public class DifyChatCompletionsOptions {
* blocking 阻塞型,等待执行完毕后返回结果。(请求若流程较长可能会被中断)
* streaming 流式返回。基于 SSEServer-Sent Events实现流式返回。
*/
private String response_mode = "blocking";
@JsonProperty("response_mode")
private String responseMode = "blocking";
/**
* (必填)‼️ 会话标识符,首次对话为 conversation_id: "" ‼️,如果要继续对话请传入上下文返回的 conversation_id
*/
private String conversation_id;
@JsonProperty("conversation_id")
private String conversationId;
/**
* 用户标识,由开发者定义规则,需保证用户标识在应用内唯一。

View File

@ -134,8 +134,8 @@ public class DifyChatAiStreamClient {
try {
DifyChatCompletionsOptions chatCompletionsOptions = new DifyChatCompletionsOptions();
chatCompletionsOptions.setQuery(lastMessage);
chatCompletionsOptions.setResponse_mode("streaming");
chatCompletionsOptions.setConversation_id(conversationId);
chatCompletionsOptions.setResponseMode("streaming");
//chatCompletionsOptions.setConversationId(conversationId);
chatCompletionsOptions.setUser(uid);
EventSource.Factory factory = EventSources.createFactory(this.okHttpClient);
@ -148,6 +148,7 @@ public class DifyChatAiStreamClient {
String url = this.apiHost + "v1/chat-messages";
Request request = new Request.Builder()
.url(url)
.header("Authorization","Bearer "+apiKey)
.post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody))
.build();
//创建事件

View File

@ -1,10 +1,16 @@
package ai.chat2db.server.web.api.controller.ai.dify.listener;
import ai.chat2db.server.web.api.controller.ai.azure.model.AzureChatChoice;
import ai.chat2db.server.web.api.controller.ai.azure.model.AzureChatCompletions;
import ai.chat2db.server.web.api.controller.ai.azure.model.AzureChatMessage;
import ai.chat2db.server.web.api.controller.ai.azure.model.AzureCompletionsUsage;
import ai.chat2db.server.web.api.controller.ai.dify.model.DifyChatStreamEvent;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.unfbx.chatgpt.entity.chat.Message;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Response;
import okhttp3.ResponseBody;
@ -23,6 +29,9 @@ public class DifyChatAIEventSourceListener extends EventSourceListener {
private SseEmitter sseEmitter;
private ObjectMapper mapper = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
public DifyChatAIEventSourceListener(SseEmitter sseEmitter) {
this.sseEmitter = sseEmitter;
}
@ -41,8 +50,27 @@ public class DifyChatAIEventSourceListener extends EventSourceListener {
}
@Override
@SneakyThrows
public void onEvent(@NotNull EventSource eventSource, @Nullable String id, @Nullable String type, @NotNull String data) {
log.info("DifyChatAI{}", data);
DifyChatStreamEvent event = mapper.readValue(data, DifyChatStreamEvent.class);
if ("message_end".equals(event.getEvent())) {
log.info("DifyChatAI返回数据结束了");
sseEmitter.send(SseEmitter.event()
.id("[DONE]")
.data("[DONE]")
.reconnectTime(3000));
return;
}
String text = event.getAnswer();
log.info("Model ID={} is created at {}.", event.getId(), event.getCreatedAt());
Message message = new Message();
message.setContent(text);
sseEmitter.send(SseEmitter.event()
.id(null)
.data(message)
.reconnectTime(3000));
}

View File

@ -0,0 +1,21 @@
package ai.chat2db.server.web.api.controller.ai.dify.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class DifyChatStreamEvent {
private String event;
@JsonProperty("task_id")
private String taskId;
private String id;
private String answer;
@JsonProperty("created_at")
private long createdAt;
@JsonProperty("conversation_id")
private String conversationId;
}