Merge branch 'chat2db:dev' into dev

This commit is contained in:
Zhuoyuan1
2023-11-04 09:32:38 +08:00
committed by GitHub
84 changed files with 2286 additions and 542 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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 errorChatEventSourceListener cannot be empty");
throw new ParamBusinessException();
}
log.info("Chat AI, prompt:{}", chatMessages.get(chatMessages.size() - 1).getContent());
try {
ChatCompletion chatCompletion = ChatCompletion.builder()
.messages(chatMessages)

View File

@ -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);
}
}
}

View File

@ -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;
/**
* 文件别名
*/

View File

@ -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) {

View File

@ -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")

View File

@ -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;
/**
* 修改后数据的列表

View File

@ -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;
/**
* 数据的列表

View File

@ -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;
}