# keveri-cloud
**Repository Path**: S_Yang/keveri-cloud
## Basic Information
- **Project Name**: keveri-cloud
- **Description**: 校招项目准备
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://book.keveri.cloud
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2024-05-22
- **Last Updated**: 2024-05-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Keveri Cloud
云开发基底(自己业余瞎玩的~~)
# Keveri Cloud
24校招准备的小项目,v1.0 发布,其中组件均已上传 Maven 大家可凭坐标检索,后续教程会更新到Keveri 的春招之路。全部免费!!!!!!
这里面都是一些日常开发的一些基础组件,当然也可能是作者有病(造轮子的病哈哈,还有仿照轮子,主打一个学习~~~(骗面试官))
**项目中网关部分来自对 Shenyu 网关的拆解**
## Chat4j
### 概述
1. 可复用多厂商 API (未来会逐渐支持)
2. 支持设置代理地址
3. 支持 SSE
4. 多厂商静态加载
### 接入 API
多厂商抽象不容易、慢慢来哈
- 对话问答
- 图片生成
### 如何使用?
#### 导入依赖
```xml
cloud.keveri.dev
keveri-chat4j-spring-boot-starter
latest-version
```
#### 使用案例
##### 配置
```yaml
server:
port: 8080
chat:
read-timeout: 4300
write-timeout: 4300
connect-timeout: 4300
retry-count: 0
provider:
chatgpt:
key: sk-LIoETxxxxxxxxxxxxxxxxxxxxxxx
# 如果使用代理则需要配置如下
isProxy: true
proxyUrl: https://proxy.openai.com/
```
#### API 使用
```java
package cloud.keveri.example.chat4j.interfaces;
import cloud.keveri.chat4j.api.ChatBlender;
import cloud.keveri.chat4j.api.Response;
import cloud.keveri.chat4j.api.entity.chat.CompletionRequest;
import cloud.keveri.chat4j.api.entity.chat.Message;
import cloud.keveri.chat4j.api.entity.image.ImageRequest;
import cloud.keveri.chat4j.core.factory.ChatFactory;
import cloud.keveri.chat4j.provider.SupplierType;
import cloud.keveri.chat4j.provider.chatgpt.listener.DefaultChatgptEventSourceListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* 测试处理器
*
* 作者:沈自在
**/
@RestController
public class TestController {
@PostMapping("/api/chatgpt/completion/not")
public Response chatgpt_completion_not_stream() {
ChatBlender chatBlender = ChatFactory.acquireChatBlender(SupplierType.CHATGPT);
Message message = new Message("user", "讲个笑话吧");
List messages = new ArrayList<>();
messages.add(message);
CompletionRequest request = CompletionRequest.builder()
.messages(messages)
.build();
Response response = chatBlender.completions(request);
System.out.println("response = " + response);
return response;
}
@GetMapping("/api/chatgpt/completion/sse")
public ResponseBodyEmitter sseEmitter(String question, HttpServletResponse response) {
// 1. 准备请求
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache");
Message message = Message.of(question);
List messages = new ArrayList<>();
messages.add(message);
CompletionRequest request = CompletionRequest.builder()
.messages(messages)
.stream(true)
.build();
// 2. sse
ResponseBodyEmitter emitter = new ResponseBodyEmitter(3 * 60 * 1000L);
DefaultChatgptEventSourceListener listener = new DefaultChatgptEventSourceListener(emitter);
//ConsoleChatgptEventSourceListener listener = new ConsoleChatgptEventSourceListener();
// 3. sdk
ChatBlender chatBlender = ChatFactory.acquireChatBlender(SupplierType.CHATGPT);
chatBlender.completions(request, listener);
return emitter;
}
@GetMapping("/api/chatgpt/image")
public Response image(String prompt) {
ChatBlender chatBlender = ChatFactory.acquireChatBlender(SupplierType.CHATGPT);
ImageRequest request = ImageRequest.builder()
.prompt(prompt)
.build();
return chatBlender.generateImage(request);
}
}
```
## Response4j
### 概述
提供简化的响应包装 starter,现支持:
1. 响应包装
2. 跳过注解,并支持跳过逻辑注入
3. 自定义响应内容
### 如何使用
#### 导入依赖
```xml
cloud.keveri.dev
keveri-response4j-spring-boot-starter
latest version
```
#### 使用案例
##### 配置
##### 代码实现
###### 跳过逻辑
```java
@Component
public class CustomSkip implements SkipWrapCheckFunction {
@Override
public boolean isSkip(@NonNull MethodParameter methodParameter,
@NonNull Class extends HttpMessageConverter>> converterType) {
Method method = methodParameter.getMethod();
assert method != null;
Class> returnType = method.getReturnType();
return returnType == TestController.User.class;
}
}
```
###### 测试接口
```java
@Controller
@RequestMapping("/response4j/test")
public class TestController {
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class User {
String name = "沈自在";
Integer age = 18;
}
/**
*
*/
@GetMapping
public String hello() {
return "你好";
}
/**
*
*/
@GetMapping("/user01")
@ResponseBody
public User user01() {
return new User();
}
@GetMapping("/user02")
@ResponseBody
@SkipWrap
public User user02() {
return new User("田浩然", 23);
}
}
```
## Keveri-Gateway
这是一个学习项目,后续教程更新到 Keveri 的春招之路