mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-07-29 18:53:12 +08:00
Merge branch 'chat2db:dev' into dev
This commit is contained in:
@ -20,6 +20,7 @@ import ai.chat2db.server.web.api.controller.ai.azure.model.AzureChatRole;
|
||||
import ai.chat2db.server.web.api.controller.ai.baichuan.client.BaichuanAIClient;
|
||||
import ai.chat2db.server.web.api.controller.ai.baichuan.listener.BaichuanChatAIEventSourceListener;
|
||||
import ai.chat2db.server.web.api.controller.ai.chat2db.client.Chat2dbAIClient;
|
||||
import ai.chat2db.server.web.api.controller.ai.chat2db.listener.Chat2dbAIEventSourceListener;
|
||||
import ai.chat2db.server.web.api.controller.ai.claude.client.ClaudeAIClient;
|
||||
import ai.chat2db.server.web.api.controller.ai.claude.listener.ClaudeAIEventSourceListener;
|
||||
import ai.chat2db.server.web.api.controller.ai.claude.model.ClaudeChatCompletionsOptions;
|
||||
@ -321,7 +322,7 @@ public class ChatController {
|
||||
messages.add(currentMessage);
|
||||
buildSseEmitter(sseEmitter, uid);
|
||||
|
||||
OpenAIEventSourceListener openAIEventSourceListener = new OpenAIEventSourceListener(sseEmitter);
|
||||
Chat2dbAIEventSourceListener openAIEventSourceListener = new Chat2dbAIEventSourceListener(sseEmitter);
|
||||
Chat2dbAIClient.getInstance().streamCompletions(messages, openAIEventSourceListener);
|
||||
LocalCache.CACHE.put(uid, JSONUtil.toJsonStr(messages), LocalCache.TIMEOUT);
|
||||
return sseEmitter;
|
||||
|
@ -3,17 +3,13 @@ package ai.chat2db.server.web.api.controller.ai.baichuan.client;
|
||||
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
|
||||
import ai.chat2db.server.web.api.controller.ai.baichuan.interceptor.BaichuanHeaderAuthorizationInterceptor;
|
||||
import ai.chat2db.server.web.api.controller.ai.baichuan.model.BaichuanChatCompletionsOptions;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.interceptor.FastChatHeaderAuthorizationInterceptor;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.model.FastChatCompletionsOptions;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.model.FastChatMessage;
|
||||
import cn.hutool.http.ContentType;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.*;
|
||||
import okhttp3.sse.EventSource;
|
||||
import okhttp3.sse.EventSourceListener;
|
||||
import okhttp3.sse.EventSources;
|
||||
import okio.BufferedSource;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@ -1,13 +1,17 @@
|
||||
package ai.chat2db.server.web.api.controller.ai.chat2db.client;
|
||||
|
||||
import ai.chat2db.server.domain.api.enums.AiSqlSourceEnum;
|
||||
import ai.chat2db.server.domain.api.model.Config;
|
||||
import ai.chat2db.server.domain.api.service.ConfigService;
|
||||
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
||||
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
|
||||
import ai.chat2db.server.web.api.controller.ai.chat2db.interceptor.Chat2dbHeaderAuthorizationInterceptor;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.client.FastChatOpenAiApi;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.embeddings.FastChatEmbedding;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.embeddings.FastChatEmbeddingResponse;
|
||||
import ai.chat2db.server.web.api.util.ApplicationContextUtil;
|
||||
import cn.hutool.http.ContentType;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.unfbx.chatgpt.entity.chat.ChatCompletion;
|
||||
import com.unfbx.chatgpt.entity.chat.Message;
|
||||
import com.unfbx.chatgpt.interceptor.HeaderAuthorizationInterceptor;
|
||||
@ -192,7 +196,6 @@ public class Chat2DBAIStreamClient {
|
||||
log.error("param error:ChatEventSourceListener cannot be empty");
|
||||
throw new ParamBusinessException();
|
||||
}
|
||||
log.info("Chat AI, prompt:{}", chatMessages.get(chatMessages.size() - 1).getContent());
|
||||
try {
|
||||
ChatCompletion chatCompletion = ChatCompletion.builder()
|
||||
.messages(chatMessages)
|
||||
|
@ -0,0 +1,129 @@
|
||||
package ai.chat2db.server.web.api.controller.ai.chat2db.listener;
|
||||
|
||||
import ai.chat2db.server.domain.api.enums.AiSqlSourceEnum;
|
||||
import ai.chat2db.server.domain.api.model.Config;
|
||||
import ai.chat2db.server.domain.api.service.ConfigService;
|
||||
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
||||
import ai.chat2db.server.web.api.controller.ai.baichuan.model.BaichuanChatCompletions;
|
||||
import ai.chat2db.server.web.api.controller.ai.baichuan.model.BaichuanChatMessage;
|
||||
import ai.chat2db.server.web.api.controller.ai.chat2db.client.Chat2dbAIClient;
|
||||
import ai.chat2db.server.web.api.controller.ai.fastchat.model.FastChatMessage;
|
||||
import ai.chat2db.server.web.api.controller.ai.response.ChatCompletionResponse;
|
||||
import ai.chat2db.server.web.api.controller.ai.zhipu.model.ZhipuChatCompletions;
|
||||
import ai.chat2db.server.web.api.util.ApplicationContextUtil;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.unfbx.chatgpt.entity.chat.Message;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
import okhttp3.sse.EventSource;
|
||||
import okhttp3.sse.EventSourceListener;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 描述:Chat2dbAIEventSourceListener
|
||||
*
|
||||
* @author https:www.unfbx.com
|
||||
* @date 2023-02-22
|
||||
*/
|
||||
@Slf4j
|
||||
public class Chat2dbAIEventSourceListener extends EventSourceListener {
|
||||
|
||||
private SseEmitter sseEmitter;
|
||||
|
||||
public Chat2dbAIEventSourceListener(SseEmitter sseEmitter) {
|
||||
this.sseEmitter = sseEmitter;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void onOpen(EventSource eventSource, Response response) {
|
||||
log.info("Chat2db AI 建立sse连接...");
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public void onEvent(EventSource eventSource, String id, String type, String data) {
|
||||
log.info("Chat2db AI 返回数据:{}", data);
|
||||
if (data.equals("[DONE]")) {
|
||||
log.info("Chat2db AI 返回数据结束了");
|
||||
sseEmitter.send(SseEmitter.event()
|
||||
.id("[DONE]")
|
||||
.data("[DONE]")
|
||||
.reconnectTime(3000));
|
||||
sseEmitter.complete();
|
||||
return;
|
||||
}
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class);
|
||||
String text = completionResponse.getChoices().get(0).getDelta() == null
|
||||
? completionResponse.getChoices().get(0).getText()
|
||||
: completionResponse.getChoices().get(0).getDelta().getContent();
|
||||
String completionId = completionResponse.getId();
|
||||
|
||||
Message message = new Message();
|
||||
if (text != null) {
|
||||
message.setContent(text);
|
||||
sseEmitter.send(SseEmitter.event()
|
||||
.id(completionId)
|
||||
.data(message)
|
||||
.reconnectTime(3000));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClosed(EventSource eventSource) {
|
||||
sseEmitter.complete();
|
||||
log.info("Chat2db AI 关闭sse连接...");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(EventSource eventSource, Throwable t, Response response) {
|
||||
try {
|
||||
if (Objects.isNull(response)) {
|
||||
String message = t.getMessage();
|
||||
Message sseMessage = new Message();
|
||||
sseMessage.setContent(message);
|
||||
sseEmitter.send(SseEmitter.event()
|
||||
.id("[ERROR]")
|
||||
.data(sseMessage));
|
||||
sseEmitter.send(SseEmitter.event()
|
||||
.id("[DONE]")
|
||||
.data("[DONE]"));
|
||||
sseEmitter.complete();
|
||||
return;
|
||||
}
|
||||
ResponseBody body = response.body();
|
||||
String bodyString = null;
|
||||
if (Objects.nonNull(body)) {
|
||||
bodyString = body.string();
|
||||
log.error("Chat2db AI sse连接异常data:{}", bodyString, t);
|
||||
} else {
|
||||
log.error("Chat2db AI sse连接异常data:{}", response, t);
|
||||
}
|
||||
eventSource.cancel();
|
||||
Message message = new Message();
|
||||
message.setContent("Chat2db AI Error:" + bodyString);
|
||||
sseEmitter.send(SseEmitter.event()
|
||||
.id("[ERROR]")
|
||||
.data(message));
|
||||
sseEmitter.send(SseEmitter.event()
|
||||
.id("[DONE]")
|
||||
.data("[DONE]"));
|
||||
sseEmitter.complete();
|
||||
} catch (Exception exception) {
|
||||
log.error("发送数据异常:", exception);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,11 @@
|
||||
package ai.chat2db.server.web.api.controller.operation.log.vo;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* @author moji
|
||||
* @version DdlVO.java, v 0.1 2022年09月18日 11:06 moji Exp $
|
||||
@ -16,6 +19,18 @@ public class OperationLogVO {
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime gmtCreate;
|
||||
|
||||
/**
|
||||
* 修改时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime gmtModified;
|
||||
|
||||
/**
|
||||
* 文件别名
|
||||
*/
|
||||
|
@ -110,7 +110,7 @@ public class RdbDmlController {
|
||||
//connection.commit();
|
||||
return DataResult.of(resultVOS.get(0));
|
||||
}else {
|
||||
connection.rollback();
|
||||
//connection.rollback();
|
||||
return DataResult.of(executeResult);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -9,6 +9,7 @@ import ai.chat2db.server.web.api.controller.rdb.request.TriggerDetailRequest;
|
||||
import ai.chat2db.server.web.api.controller.rdb.request.TriggerPageRequest;
|
||||
import ai.chat2db.spi.model.Trigger;
|
||||
import jakarta.validation.Valid;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
@ -25,8 +26,9 @@ public class TriggerController {
|
||||
@GetMapping("/list")
|
||||
public WebPageResult<Trigger> list(@Valid TriggerPageRequest request) {
|
||||
ListResult<Trigger> listResult = triggerService.triggers(request.getDatabaseName(), request.getSchemaName());
|
||||
return WebPageResult.of(listResult.getData(), Long.valueOf(listResult.getData().size()), 1,
|
||||
listResult.getData().size());
|
||||
Long total = CollectionUtils.isNotEmpty(listResult.getData()) ? Long.valueOf(listResult.getData().size()) : 0L;
|
||||
return WebPageResult.of(listResult.getData(), total, 1,
|
||||
listResult.getData().size());
|
||||
}
|
||||
|
||||
@GetMapping("/detail")
|
||||
|
@ -3,7 +3,7 @@ package ai.chat2db.server.web.api.controller.rdb.request;
|
||||
import ai.chat2db.server.domain.api.param.SelectResultOperation;
|
||||
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
|
||||
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceConsoleRequestInfo;
|
||||
import ai.chat2db.server.web.api.controller.rdb.vo.HeaderVO;
|
||||
import ai.chat2db.spi.model.Header;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
@ -16,7 +16,7 @@ public class SelectResultUpdateRequest extends DataSourceBaseRequest implements
|
||||
/**
|
||||
* 展示头的列表
|
||||
*/
|
||||
private List<HeaderVO> headerList;
|
||||
private List<Header> headerList;
|
||||
|
||||
/**
|
||||
* 修改后数据的列表
|
||||
|
@ -3,6 +3,7 @@ package ai.chat2db.server.web.api.controller.rdb.vo;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
import ai.chat2db.spi.model.Header;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
@ -46,7 +47,7 @@ public class ExecuteResultVO {
|
||||
/**
|
||||
* 展示头的列表
|
||||
*/
|
||||
private List<HeaderVO> headerList;
|
||||
private List<Header> headerList;
|
||||
|
||||
/**
|
||||
* 数据的列表
|
||||
|
@ -1,31 +0,0 @@
|
||||
package ai.chat2db.server.web.api.controller.rdb.vo;
|
||||
|
||||
import ai.chat2db.spi.enums.DataTypeEnum;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* 单元格头
|
||||
*
|
||||
* @author Jiaju Zhuang
|
||||
*/
|
||||
@Data
|
||||
@SuperBuilder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class HeaderVO {
|
||||
/**
|
||||
* 单元格类型
|
||||
*
|
||||
* @see DataTypeEnum
|
||||
*/
|
||||
private String dataType;
|
||||
|
||||
/**
|
||||
* 展示的名字
|
||||
*/
|
||||
private String name;
|
||||
}
|
Reference in New Issue
Block a user