Commit eb4dca4f by 王一诺

代码重构 优化模型选择机制

parent 8c659b87
Showing with 323 additions and 380 deletions
<component name="InspectionProjectProfileManager"> <component name="InspectionProjectProfileManager">
<profile version="1.0"> <profile version="1.0">
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="AlibabaUseRightCaseForDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
</profile> </profile>
</component> </component>
\ No newline at end of file
...@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
/** /**
...@@ -18,4 +19,13 @@ public class LLMApiApplication { ...@@ -18,4 +19,13 @@ public class LLMApiApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(LLMApiApplication.class, args); SpringApplication.run(LLMApiApplication.class, args);
} }
@Bean
public RestTemplate getRestTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(10000);
factory.setReadTimeout(30000);
return new RestTemplate(factory);
}
} }
package com.coolook.llm.api.remote; package com.coolook.llm.api.remote;
import com.alibaba.fastjson2.JSONObject;
import com.coolook.common.llm.dto.ModelsDto; import com.coolook.common.llm.dto.ModelsDto;
import com.coolook.common.llm.request.base.BaseRequest;
import com.coolook.common.llm.request.text.TextRequest; import com.coolook.common.llm.request.text.TextRequest;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
...@@ -19,9 +22,12 @@ import java.util.List; ...@@ -19,9 +22,12 @@ import java.util.List;
@FeignClient("service-llm") @FeignClient("service-llm")
public interface ServiceLLMClient { public interface ServiceLLMClient {
@RequestMapping(method = RequestMethod.POST, value ="/text/v1/chat/completions") @RequestMapping(method = RequestMethod.POST, value ="/v1/chat/completions")
public ResponseEntity<String> chat(@RequestBody TextRequest content); public Object chat(@RequestBody BaseRequest content);
@RequestMapping(method = RequestMethod.GET, value ="/text/v1/models") @RequestMapping(method = RequestMethod.GET, value ="/v1/models")
public HttpEntity<List<ModelsDto>> getAvailableModelList(); public HttpEntity<List<ModelsDto>> getAvailableModelList();
@RequestMapping(method = RequestMethod.POST, value = "/for-app-chat")
public ResponseEntity<JSONObject> forAppChat(@RequestBody BaseRequest content);
} }
...@@ -6,6 +6,8 @@ import com.alibaba.fastjson2.JSONObject; ...@@ -6,6 +6,8 @@ import com.alibaba.fastjson2.JSONObject;
import com.coolook.common.llm.constant.AiStatus; import com.coolook.common.llm.constant.AiStatus;
import com.coolook.common.llm.dto.Message; import com.coolook.common.llm.dto.Message;
import com.coolook.common.llm.dto.ModelsDto; import com.coolook.common.llm.dto.ModelsDto;
import com.coolook.common.llm.request.base.BaseMessage;
import com.coolook.common.llm.request.base.BaseRequest;
import com.coolook.common.llm.request.text.TextRequest; import com.coolook.common.llm.request.text.TextRequest;
import com.coolook.common.llm.request.text.TextMessage; import com.coolook.common.llm.request.text.TextMessage;
import com.coolook.common.llm.response.ResponseResult; import com.coolook.common.llm.response.ResponseResult;
...@@ -21,6 +23,8 @@ import lombok.extern.slf4j.Slf4j; ...@@ -21,6 +23,8 @@ import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
/** /**
* @author: WangYinuo * @author: WangYinuo
...@@ -74,16 +78,16 @@ public class AiServiceImpl implements IAiService { ...@@ -74,16 +78,16 @@ public class AiServiceImpl implements IAiService {
String decryptStr = SecurityUtils.aesDecrypt(cipherText, hexKey, ivStr); String decryptStr = SecurityUtils.aesDecrypt(cipherText, hexKey, ivStr);
msg.setAiQuestion(decryptStr); msg.setAiQuestion(decryptStr);
// String encryptStr = SecurityUtils.aesEncrypt("我收到了:" + decryptStr , hexKey, ivStr);
// msg.setAiAnswer(ivStr + encryptStr);
// msg.setStatus(AiStatus.SUCCESS);
// return BaseResponse.success(msg);
HttpEntity<List<ModelsDto>> availableModelEntity = serviceLlmClient.getAvailableModelList(); HttpEntity<List<ModelsDto>> availableModelEntity = serviceLlmClient.getAvailableModelList();
List<ModelsDto> textModelList = availableModelEntity.getBody(); List<ModelsDto> textModelList = availableModelEntity.getBody();
TextRequest openAiTextRequest = new TextRequest(); BaseRequest openAiTextRequest = new BaseRequest();
openAiTextRequest.setModel(textModelList.get(0).getId()); Random random = new Random();
List<TextMessage> messageList = new ArrayList(); int index = random.nextInt(textModelList.size());
openAiTextRequest.setModel(textModelList.get(index).getId());
openAiTextRequest.setStream(false);
List<BaseMessage> messageList = new ArrayList();
TextMessage textMessage = new TextMessage(); TextMessage textMessage = new TextMessage();
textMessage.setContent(msg.getAiQuestion()); textMessage.setContent(msg.getAiQuestion());
...@@ -92,7 +96,8 @@ public class AiServiceImpl implements IAiService { ...@@ -92,7 +96,8 @@ public class AiServiceImpl implements IAiService {
openAiTextRequest.setMessages(messageList); openAiTextRequest.setMessages(messageList);
ResponseEntity<String> responseMsg = serviceLlmClient.chat(openAiTextRequest); ResponseEntity<JSONObject> responseMsg = serviceLlmClient.forAppChat(openAiTextRequest);
String content = parseResponseEntity(responseMsg.getBody()); String content = parseResponseEntity(responseMsg.getBody());
log.info("responseMsg:{}", responseMsg); log.info("responseMsg:{}", responseMsg);
...@@ -117,8 +122,8 @@ public class AiServiceImpl implements IAiService { ...@@ -117,8 +122,8 @@ public class AiServiceImpl implements IAiService {
return ResponseResult.success(failedMsg); return ResponseResult.success(failedMsg);
} }
public String parseResponseEntity(String responseBody) { public String parseResponseEntity(JSONObject jsonObject) {
JSONObject jsonObject = JSONObject.parseObject(responseBody); //JSONObject jsonObject = JSONObject.parseObject(responseBody);
try { try {
if (jsonObject.containsKey("choices")) { if (jsonObject.containsKey("choices")) {
JSONArray choices = jsonObject.getJSONArray("choices"); JSONArray choices = jsonObject.getJSONArray("choices");
......
...@@ -19,4 +19,8 @@ public class ModelConstant { ...@@ -19,4 +19,8 @@ public class ModelConstant {
public static final int MODEL_IS_ACTIVE = 1; public static final int MODEL_IS_ACTIVE = 1;
public static final int MODEL_IS_NOT_ACTIVE = -1; public static final int MODEL_IS_NOT_ACTIVE = -1;
public static final int MODEL_NOT_AVAILABLE = 0; public static final int MODEL_NOT_AVAILABLE = 0;
public final static int PAGE_SIZE = 1000;
} }
\ No newline at end of file
...@@ -16,5 +16,4 @@ public class TextRequest { ...@@ -16,5 +16,4 @@ public class TextRequest {
private String model; private String model;
private Boolean stream; private Boolean stream;
private List<TextMessage> messages; private List<TextMessage> messages;
} }
2025-03-17 15:42:47.566 [main] WARN [o.s.c.l.c.LoadBalancerCacheAutoConfiguration$LoadBalancerCaffeineWarnLogger] - Spring Cloud LoadBalancer is currently working with the default cache. You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.
2025-03-17 15:43:57.200 [http-nio-8900-exec-2] WARN [o.s.c.l.core.ServiceInstanceListSupplierBuilder] - LoadBalancerCacheManager not available, returning delegate without caching.
2025-03-17 15:51:59.248 [boundedElastic-4] WARN [o.s.cloud.loadbalancer.core.RoundRobinLoadBalancer] - No servers available for service: service-llm
2025-03-17 15:51:59.249 [http-nio-8900-exec-5] WARN [o.s.c.o.l.FeignBlockingLoadBalancerClient] - Load balancer does not contain an instance for the service service-llm
2025-03-14 17:33:11.576 [Thread-10] WARN [com.alibaba.nacos.common.notify.NotifyCenter] - [NotifyCenter] Start destroying Publisher
2025-03-14 17:33:11.576 [Thread-4] WARN [com.alibaba.nacos.common.http.HttpClientBeanHolder] - [HttpClientBeanHolder] Start destroying common HttpClient
2025-03-14 17:33:11.576 [Thread-10] WARN [com.alibaba.nacos.common.notify.NotifyCenter] - [NotifyCenter] Destruction of the end
2025-03-14 17:33:11.576 [Thread-4] WARN [com.alibaba.nacos.common.http.HttpClientBeanHolder] - [HttpClientBeanHolder] Destruction of the end
2025-03-14 19:03:40.857 [Thread-10] WARN [com.alibaba.nacos.common.notify.NotifyCenter] - [NotifyCenter] Start destroying Publisher
2025-03-14 19:03:40.857 [Thread-4] WARN [com.alibaba.nacos.common.http.HttpClientBeanHolder] - [HttpClientBeanHolder] Start destroying common HttpClient
2025-03-14 19:03:40.857 [Thread-10] WARN [com.alibaba.nacos.common.notify.NotifyCenter] - [NotifyCenter] Destruction of the end
2025-03-14 19:03:40.857 [Thread-4] WARN [com.alibaba.nacos.common.http.HttpClientBeanHolder] - [HttpClientBeanHolder] Destruction of the end
2025-03-14 20:02:26.260 [Thread-10] WARN [com.alibaba.nacos.common.notify.NotifyCenter] - [NotifyCenter] Start destroying Publisher
2025-03-14 20:02:26.260 [Thread-4] WARN [com.alibaba.nacos.common.http.HttpClientBeanHolder] - [HttpClientBeanHolder] Start destroying common HttpClient
2025-03-14 20:02:26.260 [Thread-10] WARN [com.alibaba.nacos.common.notify.NotifyCenter] - [NotifyCenter] Destruction of the end
2025-03-14 20:02:26.260 [Thread-4] WARN [com.alibaba.nacos.common.http.HttpClientBeanHolder] - [HttpClientBeanHolder] Destruction of the end
package com.coolook.service.llm.config;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingResponseWrapper;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: Wang Yinuo
* @create: 2025-03-14:PM10:31
*/
public class AddContentLengthFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ContentCachingResponseWrapper cacheResponseWrapper;
if (!(response instanceof ContentCachingResponseWrapper)) {
cacheResponseWrapper = new ContentCachingResponseWrapper(response);
} else {
cacheResponseWrapper = (ContentCachingResponseWrapper) response;
}
filterChain.doFilter(request, cacheResponseWrapper);
cacheResponseWrapper.copyBodyToResponse();
}
}
package com.coolook.service.llm.config;
import com.google.common.collect.Lists;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* @author: Wang Yinuo
* @create: 2025-03-14:PM10:31
*/
@Configuration
public class FilterConfig {
/**
* 给特定接口加content-length返回
* @return FilterRegistrationBean
*/
@Bean
public FilterRegistrationBean contentLengthFilterRegistrationBean() {
FilterRegistrationBean filterBean = new FilterRegistrationBean();
filterBean.setFilter(new AddContentLengthFilter());
filterBean.setFilter(new RemoveKeepAliveHeaderFilter());
filterBean.addUrlPatterns("/"); // Apply to all URLs
List<String> urls = Lists.newArrayList();
// 只针对指定接口类型返回content-length
urls.add("/app/clientApi");
filterBean.setUrlPatterns(urls);
return filterBean;
}
}
package com.coolook.service.llm.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @author: Wang Yinuo
* @create: 2025-02-26:AM11:19
*/
// 反序列化
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return LocalDateTime.parse(p.getText(), formatter);
}
}
package com.coolook.service.llm.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @author: Wang Yinuo
* @create: 2025-02-26:AM11:18
*/
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(formatter));
}
}
package com.coolook.service.llm.config;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author: Wang Yinuo
* @create: 2025-03-17:AM11:33
*/
@WebFilter("/*") // This will apply to all requests
public class RemoveKeepAliveHeaderFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// Remove Keep-Alive and Connection headers
httpServletResponse.setHeader("Connection", "close");
httpServletResponse.setHeader("Keep-Alive", "timeout=0");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
\ No newline at end of file
...@@ -3,7 +3,6 @@ package com.coolook.service.llm.config; ...@@ -3,7 +3,6 @@ package com.coolook.service.llm.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
......
...@@ -16,15 +16,15 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -16,15 +16,15 @@ import org.springframework.web.bind.annotation.RestController;
public class ConfigController { public class ConfigController {
@Autowired @Autowired
private ConfigService searchConfigService; private ConfigService configService;
@GetMapping("/get-search-config") @GetMapping("/get-search-config")
public ResponseResult getSearchConfig() { public ResponseResult getSearchConfig() {
return searchConfigService.getSearchConfig(); return configService.getSearchConfig();
} }
@GetMapping("/set-search-config/{value}") @GetMapping("/set-search-config/{value}")
public ResponseResult setSearchConfig(@PathVariable("value") Boolean value) { public ResponseResult setSearchConfig(@PathVariable("value") Boolean value) {
return searchConfigService.setSearchConfig(value); return configService.setSearchConfig(value);
} }
} }
package com.coolook.service.llm.controller; package com.coolook.service.llm.controller;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.coolook.common.llm.dto.ModelsDto;
import com.coolook.common.llm.request.base.BaseMessage; import com.coolook.common.llm.request.base.BaseMessage;
import com.coolook.common.llm.request.base.BaseRequest; import com.coolook.common.llm.request.base.BaseRequest;
import com.coolook.common.llm.request.image.ImageContent; import com.coolook.common.llm.request.image.ImageContent;
...@@ -12,12 +13,11 @@ import com.coolook.service.llm.service.IImageModelService; ...@@ -12,12 +13,11 @@ import com.coolook.service.llm.service.IImageModelService;
import com.coolook.service.llm.service.ITextModelService; import com.coolook.service.llm.service.ITextModelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
...@@ -41,15 +41,42 @@ public class ModelController { ...@@ -41,15 +41,42 @@ public class ModelController {
@GetMapping("/v1/models") @GetMapping("/v1/models")
public ResponseEntity<?> getAvailableModelList() { public ResponseEntity<?> getAvailableModelList() {
List textModelList = textModelService.getTextModelList(); List<ModelsDto> textModelList = textModelService.getTextModelList();
List pictureModelList = imageModelService.getPictureModelList(); List<ModelsDto> pictureModelList = imageModelService.getPictureModelList();
ArrayList<Object> modelList = new ArrayList<>(); List<ModelsDto> modelList = new ArrayList<ModelsDto>();
modelList.add(textModelList); modelList.addAll(textModelList);
modelList.add(pictureModelList); modelList.addAll(pictureModelList);
return ResponseEntity.ok(modelList); return ResponseEntity.ok(modelList);
} }
@PostMapping("/for-app-chat")
public ResponseEntity<JSONObject> forAppChat(@RequestBody BaseRequest content) {
if (content.getMessages().get(0).getContent() instanceof String) {
TextRequest textRequest = new TextRequest();
textRequest.setModel(content.getModel());
textRequest.setStream(content.getStream());
List<BaseMessage> messages = content.getMessages();
List<TextMessage> textMessages = messages.stream().map(message -> {
TextMessage textMessage = new TextMessage();
textMessage.setRole(message.getRole());
textMessage.setContent((String) message.getContent());
return textMessage;
}).collect(Collectors.toList());
textRequest.setMessages(textMessages);
log.info("textRequest: {}", textRequest);
return textModelService.chatAndReturnJson(textRequest);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("error", "error");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(jsonObject);
}
@PostMapping("/v1/chat/completions") @PostMapping("/v1/chat/completions")
public Object chat(@RequestBody BaseRequest content) { public Object chat(@RequestBody BaseRequest content) {
if (content.getMessages().get(0).getContent() instanceof String) { if (content.getMessages().get(0).getContent() instanceof String) {
...@@ -96,7 +123,6 @@ public class ModelController { ...@@ -96,7 +123,6 @@ public class ModelController {
return imageModelService.pictureAndReturnJson(imageRequest); return imageModelService.pictureAndReturnJson(imageRequest);
} }
} }
return null; return null;
} }
...@@ -105,7 +131,7 @@ public class ModelController { ...@@ -105,7 +131,7 @@ public class ModelController {
SseEmitter emitter = new SseEmitter(0L); SseEmitter emitter = new SseEmitter(0L);
executorService.submit(() -> { executorService.submit(() -> {
try { try {
log.info("data: {}", chat + "\n\n"); log.info("data: {}", chat);
emitter.send(chat.toString()); emitter.send(chat.toString());
emitter.send("[DONE]\n\n"); emitter.send("[DONE]\n\n");
emitter.complete(); emitter.complete();
...@@ -121,7 +147,7 @@ public class ModelController { ...@@ -121,7 +147,7 @@ public class ModelController {
SseEmitter emitter = new SseEmitter(0L); SseEmitter emitter = new SseEmitter(0L);
executorService.submit(() -> { executorService.submit(() -> {
try { try {
log.info("data: {}", pic + "\n\n"); log.info("data: {}", pic);
emitter.send(pic.toString()); emitter.send(pic.toString());
emitter.send("[DONE]\n\n"); emitter.send("[DONE]\n\n");
emitter.complete(); emitter.complete();
......
package com.coolook.service.llm.controller; package com.coolook.service.llm.controller;
import com.coolook.common.llm.dto.Url;
import com.coolook.common.llm.response.ResponseResult; import com.coolook.common.llm.response.ResponseResult;
import com.coolook.common.llm.request.ModelsRequest; import com.coolook.common.llm.request.ModelsRequest;
import com.coolook.common.llm.request.UrlRequest; import com.coolook.common.llm.request.UrlRequest;
import com.coolook.service.llm.service.ModelDataService; import com.coolook.service.llm.service.ModelDataService;
import com.coolook.service.llm.service.UrlService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -22,11 +24,6 @@ public class ModelManagerController { ...@@ -22,11 +24,6 @@ public class ModelManagerController {
@Autowired @Autowired
private ModelDataService modelDataService; private ModelDataService modelDataService;
@GetMapping("/get-url-list/{pageNum}")
public ResponseResult getUrlList(@PathVariable("pageNum")int pageNum) {
return modelDataService.getUrlList(pageNum);
}
@GetMapping("/get-model-list/{pageNum}") @GetMapping("/get-model-list/{pageNum}")
public ResponseResult getModelList(@PathVariable("pageNum")int pageNum) { public ResponseResult getModelList(@PathVariable("pageNum")int pageNum) {
return modelDataService.getModelList(pageNum); return modelDataService.getModelList(pageNum);
...@@ -38,12 +35,6 @@ public class ModelManagerController { ...@@ -38,12 +35,6 @@ public class ModelManagerController {
return modelDataService.saveOrUpdateModels(modelsRequestList); return modelDataService.saveOrUpdateModels(modelsRequestList);
} }
@PostMapping("/update-url")
public ResponseResult updateUrl(@RequestBody List<UrlRequest> urlRequestList) {
log.info("updateUrl: {}", urlRequestList);
return modelDataService.saveOrUpdateUrl(urlRequestList);
}
@PostMapping("/add-model") @PostMapping("/add-model")
public ResponseResult addModel(@RequestBody ModelsRequest[] content) { public ResponseResult addModel(@RequestBody ModelsRequest[] content) {
return modelDataService.addModel(content); return modelDataService.addModel(content);
......
package com.coolook.service.llm.controller;
import com.coolook.common.llm.request.UrlRequest;
import com.coolook.common.llm.response.ResponseResult;
import com.coolook.service.llm.service.UrlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author: Wang Yinuo
* @create: 2025-03-21:AM10:59
*/
@RestController
public class UrlController {
@Autowired
private UrlService urlService;
@GetMapping("/get-url-list/{pageNum}")
public ResponseResult getUrlList(@PathVariable("pageNum")int pageNum) {
return urlService.getUrlList(pageNum);
}
@PostMapping("/update-url")
public ResponseResult updateUrl(@RequestBody List<UrlRequest> urlRequestList) {
return urlService.saveOrUpdateUrl(urlRequestList);
}
}
...@@ -124,11 +124,14 @@ public class LLMClient { ...@@ -124,11 +124,14 @@ public class LLMClient {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(requestBody); String jsonBody = objectMapper.writeValueAsString(requestBody);
log.info("body:{}", jsonBody);
// 创建 HttpEntity // 创建 HttpEntity
HttpEntity<String> requestEntity = new HttpEntity<>(jsonBody, headers); HttpEntity<String> requestEntity = new HttpEntity<>(jsonBody, headers);
long start = System.currentTimeMillis();
ResponseEntity<String> response = restTemplate.postForEntity(sb.toString(), requestEntity, String.class); ResponseEntity<String> response = restTemplate.postForEntity(sb.toString(), requestEntity, String.class);
long end = System.currentTimeMillis();
log.info("body:{}", response.getBody()); log.info("body:{}, time:{}", response.getBody(), end - start);
JSONObject jsonObject = JSONObject.parseObject(response.getBody()); JSONObject jsonObject = JSONObject.parseObject(response.getBody());
return jsonObject; return jsonObject;
...@@ -158,10 +161,12 @@ public class LLMClient { ...@@ -158,10 +161,12 @@ public class LLMClient {
log.info("body:{}", jsonBody); log.info("body:{}", jsonBody);
// 创建 HttpEntity // 创建 HttpEntity
HttpEntity<String> requestEntity = new HttpEntity<>(jsonBody, headers); HttpEntity<String> requestEntity = new HttpEntity<>(jsonBody, headers);
long start = System.currentTimeMillis();
ResponseEntity<String> response = restTemplate.postForEntity(sb.toString(), requestEntity, String.class); ResponseEntity<String> response = restTemplate.postForEntity(sb.toString(), requestEntity, String.class);
// return ResponseResult.success(response); long end = System.currentTimeMillis();
log.info("body:{}", response.getBody());
log.info("body:{}, time:{}", response.getBody(), end - start);
return JSONObject.parseObject(response.getBody()); return JSONObject.parseObject(response.getBody());
} catch (Exception e) { } catch (Exception e) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
......
...@@ -7,7 +7,7 @@ import org.springframework.stereotype.Service; ...@@ -7,7 +7,7 @@ import org.springframework.stereotype.Service;
/** /**
* @author: Wang Yinuo * @author: Wang Yinuo
* @create: 2025-03-05:AM10:40 * @create: 2025-03-21:AM11:02
*/ */
@Service @Service
...@@ -24,5 +24,4 @@ public class ConfigService { ...@@ -24,5 +24,4 @@ public class ConfigService {
searchConfig.setValue(value); searchConfig.setValue(value);
return ResponseResult.success(); return ResponseResult.success();
} }
} }
package com.coolook.service.llm.service; package com.coolook.service.llm.service;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.coolook.common.llm.dto.ModelsDto;
import com.coolook.common.llm.request.image.ImageRequest; import com.coolook.common.llm.request.image.ImageRequest;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -14,7 +15,7 @@ import java.util.List; ...@@ -14,7 +15,7 @@ import java.util.List;
public interface IImageModelService { public interface IImageModelService {
public List getPictureModelList(); public List<ModelsDto> getPictureModelList();
public JSONObject pictureAndReturnStream(ImageRequest content); public JSONObject pictureAndReturnStream(ImageRequest content);
public ResponseEntity pictureAndReturnJson(ImageRequest content); public ResponseEntity pictureAndReturnJson(ImageRequest content);
} }
package com.coolook.service.llm.service; package com.coolook.service.llm.service;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.coolook.common.llm.dto.ModelsDto;
import com.coolook.common.llm.request.text.TextRequest; import com.coolook.common.llm.request.text.TextRequest;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -14,7 +15,7 @@ import java.util.List; ...@@ -14,7 +15,7 @@ import java.util.List;
public interface ITextModelService { public interface ITextModelService {
public List getTextModelList(); public List<ModelsDto> getTextModelList();
public JSONObject chatAndReturnStream(TextRequest content); public JSONObject chatAndReturnStream(TextRequest content);
public ResponseEntity chatAndReturnJson(TextRequest content); public ResponseEntity<JSONObject> chatAndReturnJson(TextRequest content);
} }
package com.coolook.service.llm.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.coolook.common.llm.constant.ModelConstant;
import com.coolook.common.llm.dto.Models;
import com.coolook.common.llm.dto.Url;
import com.coolook.common.llm.utils.RedisUtil;
import com.coolook.service.llm.mapper.ModelMapper;
import com.coolook.service.llm.remote.LLMClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import org.springframework.core.task.TaskExecutor;
/**
* @author: WangYinuo
* @create: 2024-11-04:14:42
*/
@Slf4j
@Service
@EnableScheduling
public class InitTaskService {
@Autowired
private ModelMapper modelMapper;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private LLMClient llmClient;
@Autowired
private TaskExecutor taskExecutor;
public void syncRedis() {
QueryWrapper<Models> textModelQueryWrapper = new QueryWrapper<Models>();
textModelQueryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE);
textModelQueryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_TEXT);
textModelQueryWrapper.orderByAsc("latest_speed");
textModelQueryWrapper.orderByDesc("last_checked_at");
textModelQueryWrapper.last("LIMIT 500");
List<Models> textModelList = modelMapper.selectList(textModelQueryWrapper);
QueryWrapper<Models> picModelQueryWrapper = new QueryWrapper<Models>();
picModelQueryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE);
picModelQueryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_IMAGE);
picModelQueryWrapper.orderByAsc("latest_speed");
picModelQueryWrapper.orderByDesc("last_checked_at");
picModelQueryWrapper.last("LIMIT 20");
List<Models> pictureModelList = modelMapper.selectList(picModelQueryWrapper);
redisTemplate.opsForValue().set(RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_TEXT), textModelList, 1, TimeUnit.HOURS);
redisTemplate.opsForValue().set(RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_IMAGE), pictureModelList, 1, TimeUnit.HOURS);
}
@Scheduled(cron = "0 0 * * * ?")
public void syncTask() {
log.info("<<<<< start sync >>>>>");
syncRedis();
log.info("<<<<< end sync >>>>>");
}
@PostConstruct
public void initTask() {
log.info("<<<<< start initTask >>>>>");
//syncDatabase();
syncRedis();
log.info("<<<<< end initTask >>>>>");
}
public void syncDatabase() {
int pageNum = 1;
int pageSize = 100;
long total = 0;
do {
Page<Models> page = new Page<>(pageNum, pageSize);
modelMapper.selectPage(page, null);
List<Models> records = page.getRecords();
total = page.getTotal();
if (records.isEmpty()) {
break;
}
syncDBTask(records);
pageNum++;
} while ((pageNum - 1) * pageSize < total);
}
//
public void syncDBTask(List<Models> modelsList) {
List<CompletableFuture<Url>> futures = new ArrayList<>();
for (Models models : modelsList) {
CompletableFuture<Url> future = CompletableFuture.supplyAsync(() -> {
Models checkedModel = llmClient.checkModelAvailable(models);
modelMapper.update(checkedModel, new UpdateWrapper<Models>()
.eq("url", checkedModel.getUrl())
.eq("model", checkedModel.getModel()));
return null;
}, taskExecutor);
futures.add(future);
}
}
}
\ No newline at end of file
package com.coolook.service.llm.service; package com.coolook.service.llm.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.coolook.common.llm.constant.ModelConstant; import com.coolook.common.llm.constant.ModelConstant;
import com.coolook.common.llm.dto.Models; import com.coolook.common.llm.dto.Models;
import com.coolook.common.llm.response.ResponseResult; import com.coolook.common.llm.response.ResponseResult;
import com.coolook.common.llm.dto.Url; import com.coolook.common.llm.dto.Url;
import com.coolook.common.llm.request.ModelsRequest; import com.coolook.common.llm.request.ModelsRequest;
import com.coolook.common.llm.request.UrlRequest;
import com.coolook.common.llm.response.PageResponse; import com.coolook.common.llm.response.PageResponse;
import com.coolook.common.llm.utils.RedisUtil;
import com.coolook.service.llm.mapper.ModelMapper; import com.coolook.service.llm.mapper.ModelMapper;
import com.coolook.service.llm.mapper.UrlMapper; import com.coolook.service.llm.remote.LLMClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import static com.coolook.common.llm.constant.ModelConstant.PAGE_SIZE;
/** /**
...@@ -26,24 +37,20 @@ import java.util.List; ...@@ -26,24 +37,20 @@ import java.util.List;
@Service @Service
@Slf4j @Slf4j
@EnableScheduling
public class ModelDataService { public class ModelDataService {
@Autowired @Autowired
private UrlMapper urlMapper; private ModelMapper modelMapper;
@Autowired @Autowired
private ModelMapper modelMapper; private RedisTemplate redisTemplate;
private final static int PAGE_SIZE = 1000; @Autowired
private LLMClient llmClient;
public ResponseResult getUrlList(int pageNum) { @Autowired
Page<Url> page = new Page<>(pageNum, PAGE_SIZE); private TaskExecutor taskExecutor;
Page<Url> urlPage = urlMapper.selectPage(page, null);
PageResponse pageResponse = new PageResponse();
pageResponse.setList(urlPage.getRecords());
pageResponse.setTotalPage(urlPage.getPages());
return ResponseResult.success(pageResponse);
}
public ResponseResult getModelList(int pageNum) { public ResponseResult getModelList(int pageNum) {
Page<Models> page = new Page<>(pageNum, PAGE_SIZE); Page<Models> page = new Page<>(pageNum, PAGE_SIZE);
...@@ -99,44 +106,6 @@ public class ModelDataService { ...@@ -99,44 +106,6 @@ public class ModelDataService {
return ResponseResult.success(); return ResponseResult.success();
} }
public ResponseResult saveOrUpdateUrl(List<UrlRequest> urlRequestList) {
if (urlRequestList == null || urlRequestList.isEmpty()) {
return ResponseResult.fail("error");
}
LocalDateTime now = LocalDateTime.now();
for (UrlRequest request : urlRequestList) {
if (request.getId() == null || request.getId() == 0) {
Url url = new Url();
url.setUrl(request.getUrl());
url.setCountryCode(request.getCountryCode());
url.setCountryName(request.getCountryName());
url.setLastCheckedAt(now);
url.setCreateAt(now);
url.setRegion(request.getRegion());
url.setCity(request.getCity());
url.setConsecutiveFailure(0);
url.setLongitude(request.getLongitude());
url.setLatitude(request.getLatitude());
url.setIsActive(request.getIsActive());
urlMapper.insert(url);
} else {
Url dbUrl = urlMapper.selectById(request.getId());
dbUrl.setLastCheckedAt(now);
dbUrl.setIsActive(request.getIsActive());
if (dbUrl.getIsActive() == ModelConstant.MODEL_IS_ACTIVE) {
dbUrl.setConsecutiveFailure(0);
} else {
dbUrl.setConsecutiveFailure(dbUrl.getConsecutiveFailure() + 1);
}
urlMapper.updateById(dbUrl);
}
}
return ResponseResult.success();
}
public ResponseResult addModel(ModelsRequest[] content) { public ResponseResult addModel(ModelsRequest[] content) {
List<Models> modelList = new ArrayList<>(); List<Models> modelList = new ArrayList<>();
for (ModelsRequest modelRequest : content) { for (ModelsRequest modelRequest : content) {
...@@ -158,4 +127,78 @@ public class ModelDataService { ...@@ -158,4 +127,78 @@ public class ModelDataService {
modelMapper.insertModelList(modelList); modelMapper.insertModelList(modelList);
return ResponseResult.success(); return ResponseResult.success();
} }
@Scheduled(cron = "0 0 * * * ?")
public void syncTask() {
log.info("<<<<< start sync >>>>>");
syncRedis();
log.info("<<<<< end sync >>>>>");
}
@PostConstruct
public void initTask() {
log.info("<<<<< start initTask >>>>>");
// syncDatabase();
syncRedis();
log.info("<<<<< end initTask >>>>>");
}
public void syncRedis() {
QueryWrapper<Models> textModelQueryWrapper = new QueryWrapper<Models>();
textModelQueryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE);
textModelQueryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_TEXT);
textModelQueryWrapper.orderByAsc("latest_speed");
textModelQueryWrapper.orderByDesc("last_checked_at");
textModelQueryWrapper.last("LIMIT 200");
List<Models> textModelList = modelMapper.selectList(textModelQueryWrapper);
QueryWrapper<Models> picModelQueryWrapper = new QueryWrapper<Models>();
picModelQueryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE);
picModelQueryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_IMAGE);
picModelQueryWrapper.orderByAsc("latest_speed");
picModelQueryWrapper.orderByDesc("last_checked_at");
picModelQueryWrapper.last("LIMIT 20");
List<Models> pictureModelList = modelMapper.selectList(picModelQueryWrapper);
redisTemplate.opsForValue().set(RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_TEXT), textModelList, 1, TimeUnit.HOURS);
redisTemplate.opsForValue().set(RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_IMAGE), pictureModelList, 1, TimeUnit.HOURS);
}
public void syncDatabase() {
int pageNum = 1;
int pageSize = 100;
long total = 0;
do {
Page<Models> page = new Page<>(pageNum, pageSize);
modelMapper.selectPage(page, null);
List<Models> records = page.getRecords();
total = page.getTotal();
if (records.isEmpty()) {
break;
}
syncDBTask(records);
pageNum++;
} while ((pageNum - 1) * pageSize < total);
}
public void syncDBTask(List<Models> modelsList) {
List<CompletableFuture<Url>> futures = new ArrayList<>();
for (Models models : modelsList) {
CompletableFuture<Url> future = CompletableFuture.supplyAsync(() -> {
Models checkedModel = llmClient.checkModelAvailable(models);
modelMapper.update(checkedModel, new UpdateWrapper<Models>()
.eq("url", checkedModel.getUrl())
.eq("model", checkedModel.getModel()));
return null;
}, taskExecutor);
futures.add(future);
}
}
} }
package com.coolook.service.llm.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.coolook.common.llm.constant.ModelConstant;
import com.coolook.common.llm.dto.Url;
import com.coolook.common.llm.request.UrlRequest;
import com.coolook.common.llm.response.PageResponse;
import com.coolook.common.llm.response.ResponseResult;
import com.coolook.service.llm.mapper.UrlMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import static com.coolook.common.llm.constant.ModelConstant.PAGE_SIZE;
/**
* @author: Wang Yinuo
* @create: 2025-03-21:AM10:57
*/
@Service
@Slf4j
public class UrlService {
@Autowired
private UrlMapper urlMapper;
public ResponseResult getUrlList(int pageNum) {
Page<Url> page = new Page<>(pageNum, PAGE_SIZE);
Page<Url> urlPage = urlMapper.selectPage(page, null);
PageResponse pageResponse = new PageResponse();
pageResponse.setList(urlPage.getRecords());
pageResponse.setTotalPage(urlPage.getPages());
return ResponseResult.success(pageResponse);
}
public ResponseResult saveOrUpdateUrl(List<UrlRequest> urlRequestList) {
if (urlRequestList == null || urlRequestList.isEmpty()) {
return ResponseResult.fail("error");
}
LocalDateTime now = LocalDateTime.now();
for (UrlRequest request : urlRequestList) {
if (request.getId() == null || request.getId() == 0) {
Url url = new Url();
url.setUrl(request.getUrl());
url.setCountryCode(request.getCountryCode());
url.setCountryName(request.getCountryName());
url.setLastCheckedAt(now);
url.setCreateAt(now);
url.setRegion(request.getRegion());
url.setCity(request.getCity());
url.setConsecutiveFailure(0);
url.setLongitude(request.getLongitude());
url.setLatitude(request.getLatitude());
url.setIsActive(request.getIsActive());
urlMapper.insert(url);
} else {
Url dbUrl = urlMapper.selectById(request.getId());
dbUrl.setLastCheckedAt(now);
dbUrl.setIsActive(request.getIsActive());
if (dbUrl.getIsActive() == ModelConstant.MODEL_IS_ACTIVE) {
dbUrl.setConsecutiveFailure(0);
} else {
dbUrl.setConsecutiveFailure(dbUrl.getConsecutiveFailure() + 1);
}
urlMapper.updateById(dbUrl);
}
}
return ResponseResult.success();
}
}
...@@ -54,7 +54,7 @@ public class ImageModelServiceImpl implements IImageModelService { ...@@ -54,7 +54,7 @@ public class ImageModelServiceImpl implements IImageModelService {
private static Map<String, Object> unavailableModel = new ConcurrentHashMap<>(); private static Map<String, Object> unavailableModel = new ConcurrentHashMap<>();
@Override @Override
public List getPictureModelList() { public List<ModelsDto> getPictureModelList() {
String redisKey = RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_IMAGE); String redisKey = RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_IMAGE);
List<ModelsDto> nameList = new ArrayList<>(); List<ModelsDto> nameList = new ArrayList<>();
...@@ -64,7 +64,9 @@ public class ImageModelServiceImpl implements IImageModelService { ...@@ -64,7 +64,9 @@ public class ImageModelServiceImpl implements IImageModelService {
QueryWrapper<Models> queryWrapper = new QueryWrapper<>(); QueryWrapper<Models> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_IMAGE); queryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_IMAGE);
queryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE); queryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE);
queryWrapper.last("LIMIT 10"); queryWrapper.orderByAsc("latest_speed");
queryWrapper.orderByDesc("last_checked_at");
queryWrapper.last("LIMIT 20");
List<Models> list = modelMapper.selectList(queryWrapper); List<Models> list = modelMapper.selectList(queryWrapper);
log.info("redis list:{}", list); log.info("redis list:{}", list);
obj = list; obj = list;
......
...@@ -65,7 +65,9 @@ public class TextModelServiceImpl implements ITextModelService { ...@@ -65,7 +65,9 @@ public class TextModelServiceImpl implements ITextModelService {
QueryWrapper<Models> queryWrapper = new QueryWrapper<>(); QueryWrapper<Models> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_TEXT); queryWrapper.eq("model_type", ModelConstant.MODEL_TYPE_TEXT);
queryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE); queryWrapper.eq("is_active", ModelConstant.MODEL_IS_ACTIVE);
queryWrapper.last("LIMIT 500"); queryWrapper.orderByAsc("latest_speed");
queryWrapper.orderByDesc("last_checked_at");
queryWrapper.last("LIMIT 200");
List<Models> list = modelMapper.selectList(queryWrapper); List<Models> list = modelMapper.selectList(queryWrapper);
obj = list; obj = list;
redisTemplate.opsForValue().set(RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_TEXT), list, 1, TimeUnit.HOURS); redisTemplate.opsForValue().set(RedisUtil.getRedisKey(ModelConstant.MODEL_TYPE_TEXT), list, 1, TimeUnit.HOURS);
...@@ -128,7 +130,7 @@ public class TextModelServiceImpl implements ITextModelService { ...@@ -128,7 +130,7 @@ public class TextModelServiceImpl implements ITextModelService {
} }
@Override @Override
public ResponseEntity chatAndReturnJson(TextRequest content) { public ResponseEntity<JSONObject> chatAndReturnJson(TextRequest content) {
JSONObject chat = chat(content); JSONObject chat = chat(content);
return ResponseEntity.ok(chat); return ResponseEntity.ok(chat);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment