# 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> 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 的春招之路