diff --git a/electrmangnetic/pom.xml b/electrmangnetic/pom.xml
index d9d638e..18e7476 100644
--- a/electrmangnetic/pom.xml
+++ b/electrmangnetic/pom.xml
@@ -111,6 +111,27 @@
jaxb-impl
2.3.3
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.ai
+ spring-ai-elasticsearch-store-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-ollama-spring-boot-starter
+
+
+ co.elastic.clients
+ elasticsearch-java
+ 8.13.4
+
+
+ org.springframework.ai
+ spring-ai-pdf-document-reader
+
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/ServiceAspect.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/ServiceAspect.java
index cddebc9..6b183b3 100644
--- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/ServiceAspect.java
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/aop/ServiceAspect.java
@@ -13,6 +13,8 @@ import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
import java.util.Objects;
@@ -26,7 +28,7 @@ public class ServiceAspect {
*/
@Around("execution(* com.electromagnetic.industry.software.manage.controller..*.*(..)))")
public Object process(ProceedingJoinPoint jp) throws Throwable {
- String methodInfo = jp.getTarget().getClass().getSimpleName() + "."
+ String methodInfo = jp.getTarget().getClass().getSimpleName() + "."
+ jp.getSignature().getName();
Object[] args = jp.getArgs();
String[] argNames = ((MethodSignature) jp.getSignature()).getParameterNames();
@@ -41,12 +43,13 @@ public class ServiceAspect {
}
UserThreadLocal.setReqArgs(paramInfo);
Object rvt = jp.proceed();
- if (rvt instanceof ResponseEntity) {
+ String returnInfo = "";
+ if (rvt instanceof ResponseEntity || rvt instanceof Flux) {
UserThreadLocal.setRes(ElectromagneticResultUtil.success(""));
- return rvt;
+ } else {
+ UserThreadLocal.setRes((ElectromagneticResult) rvt);
+ returnInfo = JSONUtil.toJsonStr(rvt);
}
- UserThreadLocal.setRes((ElectromagneticResult) rvt);
- String returnInfo = JSONUtil.toJsonStr(rvt);
log.info("请求接口结束:{},返回参数:{},接口耗时:{}", methodInfo, returnInfo, (System.currentTimeMillis() - startTime) + "毫秒");
stopwatch.stop();
log.debug(stopwatch.prettyPrint());
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/AiAdvisor.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/AiAdvisor.java
new file mode 100644
index 0000000..d475b11
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/AiAdvisor.java
@@ -0,0 +1,27 @@
+package com.electromagnetic.industry.software.manage.config;
+
+import jakarta.annotation.Resource;
+import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
+import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
+import org.springframework.ai.chat.memory.InMemoryChatMemory;
+import org.springframework.ai.vectorstore.VectorStore;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AiAdvisor {
+
+ @Resource
+ private VectorStore vectorStore;
+
+ @Bean
+ public QuestionAnswerAdvisor questionAnswerAdvisor() {
+ return new QuestionAnswerAdvisor(vectorStore);
+ }
+
+ @Bean
+ public MessageChatMemoryAdvisor messageChatMemoryAdvisor() {
+ return new MessageChatMemoryAdvisor(new InMemoryChatMemory());
+ }
+
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java
index 89342ef..8fc7b42 100644
--- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java
@@ -62,14 +62,6 @@ public class ElePropertyConfig {
@Value("${backup.mysql.path}")
private String sqlDirs;
- @Getter
- @Value("${ai.remote.host}")
- private String aiRemoteHost;
-
- @Getter
- @Value("${ai.remote.port}")
- private String aiRemotePort;
-
public String getEleTmpPath() {
if (EleCommonUtil.isWinOs()) {
return winPrefix + eleTmpPath;
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/AiChatController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/AiChatController.java
deleted file mode 100644
index 2d698b4..0000000
--- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/AiChatController.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.electromagnetic.industry.software.manage.controller;
-
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.StrUtil;
-import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
-import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
-import com.electromagnetic.industry.software.manage.pojo.req.ChatQueryDTO;
-import com.electromagnetic.industry.software.manage.service.serviceimpl.AiChatService;
-import jakarta.annotation.Resource;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-
-@RestController
-@RequestMapping("/data/ed/ai/")
-public class AiChatController {
-
- @Resource
- private AiChatService aiChatService;
-
- @RequestMapping(value = "chat")
- public ElectromagneticResult> chat(@RequestBody ChatQueryDTO chatQueryDTO) {
- return aiChatService.chat(chatQueryDTO.getQuestion());
- }
-
- @RequestMapping(value = "addKnowledge")
- public ElectromagneticResult> addKnowledge(@RequestParam("file") MultipartFile file) throws IOException {
- String fileType = FileUtil.extName(file.getOriginalFilename());
- if (!StrUtil.equals(fileType, "pdf")) {
- return ElectromagneticResultUtil.fail("-1", "当前仅支持pdf格式文件");
- }
- return aiChatService.addKnowledge(file);
- }
-
-}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/AiController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/AiController.java
new file mode 100644
index 0000000..e820c04
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/AiController.java
@@ -0,0 +1,59 @@
+package com.electromagnetic.industry.software.manage.controller;
+
+import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
+import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
+import com.electromagnetic.industry.software.manage.pojo.req.QueryDTO;
+import com.electromagnetic.industry.software.manage.service.serviceimpl.ChatService;
+import com.electromagnetic.industry.software.manage.tasks.ChatTaskThread1;
+import com.electromagnetic.industry.software.manage.tasks.ChatTaskThread2;
+import com.electromagnetic.industry.software.manage.tasks.ChatTaskThread3;
+import com.electromagnetic.industry.software.manage.tasks.ThreadUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.ai.chat.model.ChatResponse;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import reactor.core.publisher.Flux;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+@Slf4j
+@RestController
+@RequestMapping("/data/ed/ai")
+public class AiController {
+
+ @Resource
+ private ChatService chatService;
+
+ @RequestMapping("/upload")
+ public ElectromagneticResult> upload(@RequestParam("file") MultipartFile file) throws Exception {
+ return chatService.addFromUpload(file);
+ }
+
+ @PostMapping("/chat")
+ public ElectromagneticResult chat(@RequestBody QueryDTO queryDTO) throws Exception {
+ log.info("question is --->" + queryDTO.getMsg());
+ ChatTaskThread1 chatTaskThread = new ChatTaskThread1(chatService, queryDTO);
+ Future future = ThreadUtil.getThreadPool().submit(chatTaskThread);
+ String res = future.get();
+ log.info("answer is --->" + res);
+ return ElectromagneticResultUtil.success(res);
+ }
+
+ @PostMapping(path = "/chatStreamStr", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+ public Flux chatStreamStr(@RequestBody QueryDTO queryDTO) throws ExecutionException, InterruptedException {
+ ChatTaskThread2 chatTaskThread = new ChatTaskThread2(chatService, queryDTO);
+ Future> future = ThreadUtil.getThreadPool().submit(chatTaskThread);
+ return future.get();
+ }
+
+ @PostMapping(path = "/chatStreamResp", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+ public Flux chatStreamResp(@RequestBody QueryDTO queryDTO) throws ExecutionException, InterruptedException {
+ ChatTaskThread3 chatTaskThread = new ChatTaskThread3(chatService, queryDTO);
+ Future> future = ThreadUtil.getThreadPool().submit(chatTaskThread);
+ return future.get();
+ }
+
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/QueryDTO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/QueryDTO.java
new file mode 100644
index 0000000..0077343
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/QueryDTO.java
@@ -0,0 +1,11 @@
+package com.electromagnetic.industry.software.manage.pojo.req;
+
+import lombok.Data;
+
+@Data
+public class QueryDTO {
+
+ private String msg;
+
+// private String userId;
+}
\ No newline at end of file
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UploadDTO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UploadDTO.java
new file mode 100644
index 0000000..120c93f
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UploadDTO.java
@@ -0,0 +1,10 @@
+package com.electromagnetic.industry.software.manage.pojo.req;
+
+import lombok.Data;
+
+@Data
+public class UploadDTO {
+
+ private String content;
+
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/AiChatService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/AiChatService.java
deleted file mode 100644
index f7a0b0a..0000000
--- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/AiChatService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.electromagnetic.industry.software.manage.service.serviceimpl;
-
-import cn.hutool.core.text.StrFormatter;
-import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONUtil;
-import com.electromagnetic.industry.software.common.parse.PdfParse;
-import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
-import com.electromagnetic.industry.software.manage.config.ElePropertyConfig;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-@Slf4j
-@Service
-public class AiChatService {
-
- @Resource
- private ElePropertyConfig elePropertyConfig;
-
- public ElectromagneticResult> chat(String message) {
- Map map = new HashMap<>();
- String url = StrFormatter.format("http://{}:{}/data/ed/ai/chat", elePropertyConfig.getAiRemoteHost(), elePropertyConfig.getAiRemotePort());
- String res = HttpUtil.post(url, JSONUtil.toJsonStr(map), 5 * 60 * 1000);
- ElectromagneticResult> result = JSONUtil.toBean(res, ElectromagneticResult.class);
- return result;
- }
-
- public ElectromagneticResult> addKnowledge(MultipartFile file) throws IOException {
- String content = new PdfParse().parseAllText(file.getInputStream(), "pdf");
- Map map = new HashMap<>();
- map.put("content", content);
- String url = StrFormatter.format("http://{}:{}/data/ed/ai/upload", elePropertyConfig.getAiRemoteHost(), elePropertyConfig.getAiRemotePort());
- String res = HttpUtil.post(url, JSONUtil.toJsonStr(map));
- return JSONUtil.toBean(res, ElectromagneticResult.class);
- }
-}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ChatService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ChatService.java
new file mode 100644
index 0000000..2a2febc
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ChatService.java
@@ -0,0 +1,109 @@
+package com.electromagnetic.industry.software.manage.service.serviceimpl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+
+import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
+import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
+import com.electromagnetic.industry.software.manage.pojo.req.QueryDTO;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.*;
+import org.springframework.ai.chat.messages.UserMessage;
+import org.springframework.ai.chat.model.ChatResponse;
+import org.springframework.ai.chat.prompt.Prompt;
+import org.springframework.ai.document.Document;
+import org.springframework.ai.ollama.OllamaChatModel;
+import org.springframework.ai.reader.pdf.PagePdfDocumentReader;
+import org.springframework.ai.vectorstore.VectorStore;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.codec.ServerSentEvent;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.multipart.MultipartFile;
+import reactor.core.publisher.Flux;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+@Service
+public class ChatService {
+
+ @Resource
+ private VectorStore vectorStore;
+
+ @Resource
+ private OllamaChatModel model;
+
+ @Resource
+ private MessageChatMemoryAdvisor messageChatMemoryAdvisor;
+
+ @Resource
+ private QuestionAnswerAdvisor questionAnswerAdvisor;
+
+ @Value("file.md5RecordPath")
+ private String uploadFileMd5RecordPath;
+
+ @PostMapping
+ public void init() {
+ if (!FileUtil.exist(uploadFileMd5RecordPath)) {
+ FileUtil.touch(uploadFileMd5RecordPath);
+ }
+ }
+
+ public void add(String content) {
+ List documents = Stream.of(content).map(Document::new).collect(Collectors.toList());
+ vectorStore.write(documents);
+ }
+
+ public ElectromagneticResult> addFromUpload(MultipartFile file) throws Exception{
+ String fileType = FileUtil.extName(file.getOriginalFilename());
+ if (!StrUtil.equals(fileType, "pdf")) {
+ return ElectromagneticResultUtil.fail("-1", "当前仅支持pdf格式文件");
+ }
+ String fileMd5 = DigestUtil.md5Hex(file.getInputStream());
+ List lines = FileUtil.readLines(uploadFileMd5RecordPath, Charset.defaultCharset());
+ if (lines.contains(fileMd5)) {
+ return ElectromagneticResultUtil.success(fileMd5);
+ }
+ String pdfTmpPath = FileUtil.getParent(uploadFileMd5RecordPath, 1) + File.separator + IdUtil.fastSimpleUUID() + "." + fileType;
+ FileUtil.writeFromStream(file.getInputStream(), pdfTmpPath);
+
+ PagePdfDocumentReader pagePdfDocumentReader = new PagePdfDocumentReader(pdfTmpPath);
+ List documents = pagePdfDocumentReader.read();
+ vectorStore.write(documents);
+ lines.add(fileMd5);
+ FileUtil.writeLines(lines, uploadFileMd5RecordPath, Charset.defaultCharset());
+ FileUtil.del(pdfTmpPath);
+ return ElectromagneticResultUtil.success(fileMd5);
+ }
+
+ public String chat(QueryDTO queryDTO) {
+
+ log.info("Start call model to answer");
+
+ return ChatClient.builder(model).defaultAdvisors(messageChatMemoryAdvisor, questionAnswerAdvisor).build().prompt()
+ .user(queryDTO.getMsg())
+ .advisors(advisorSpec -> advisorSpec
+// .param(CHAT_MEMORY_CONVERSATION_ID_KEY, queryDTO.getUserId())
+ .param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
+ .call()
+ .content();
+ }
+
+ public Flux chatStreamStr(String msg) {
+ return ChatClient.builder(model).defaultAdvisors(messageChatMemoryAdvisor, questionAnswerAdvisor).build().prompt(msg).stream().content();
+ }
+
+ public Flux chatStreamResponse(String msg) {
+ ChatClient.StreamResponseSpec stream = ChatClient.builder(model).defaultAdvisors(messageChatMemoryAdvisor, questionAnswerAdvisor).build().prompt(new Prompt(new UserMessage(msg))).stream();
+ return stream.chatResponse();
+ }
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread1.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread1.java
new file mode 100644
index 0000000..e5b13f2
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread1.java
@@ -0,0 +1,21 @@
+package com.electromagnetic.industry.software.manage.tasks;
+
+import com.electromagnetic.industry.software.manage.pojo.req.QueryDTO;
+import com.electromagnetic.industry.software.manage.service.serviceimpl.ChatService;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+import java.util.concurrent.Callable;
+
+@NoArgsConstructor
+@AllArgsConstructor
+public class ChatTaskThread1 implements Callable {
+
+ private ChatService chatService;
+ private QueryDTO queryDTO;
+
+ @Override
+ public String call() throws Exception {
+ return chatService.chat(queryDTO);
+ }
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread2.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread2.java
new file mode 100644
index 0000000..eba0025
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread2.java
@@ -0,0 +1,21 @@
+package com.electromagnetic.industry.software.manage.tasks;
+
+import com.electromagnetic.industry.software.manage.pojo.req.QueryDTO;
+import com.electromagnetic.industry.software.manage.service.serviceimpl.ChatService;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import reactor.core.publisher.Flux;
+
+import java.util.concurrent.Callable;
+
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChatTaskThread2 implements Callable> {
+ private ChatService chatService;
+ private QueryDTO queryDTO;
+
+ @Override
+ public Flux call() throws Exception {
+ return chatService.chatStreamStr(queryDTO.getMsg());
+ }
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread3.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread3.java
new file mode 100644
index 0000000..7d39b50
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ChatTaskThread3.java
@@ -0,0 +1,23 @@
+package com.electromagnetic.industry.software.manage.tasks;
+
+import com.electromagnetic.industry.software.manage.pojo.req.QueryDTO;
+import com.electromagnetic.industry.software.manage.service.serviceimpl.ChatService;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import org.springframework.ai.chat.model.ChatResponse;
+import reactor.core.publisher.Flux;
+
+import java.util.concurrent.Callable;
+
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChatTaskThread3 implements Callable> {
+
+ private ChatService chatService;
+ private QueryDTO queryDTO;
+
+ @Override
+ public Flux call() throws Exception {
+ return chatService.chatStreamResponse(queryDTO.getMsg());
+ }
+}
diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ThreadUtil.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ThreadUtil.java
new file mode 100644
index 0000000..a987b06
--- /dev/null
+++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/tasks/ThreadUtil.java
@@ -0,0 +1,13 @@
+package com.electromagnetic.industry.software.manage.tasks;
+
+import java.util.concurrent.*;
+
+public final class ThreadUtil {
+
+ private static final ExecutorService THREAD_POOL = new ThreadPoolExecutor(1, 1, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy());
+
+ public static ExecutorService getThreadPool() {
+ return THREAD_POOL;
+ }
+
+}
diff --git a/electrmangnetic/src/main/resources/application.properties b/electrmangnetic/src/main/resources/application.properties
index 8f75033..1e4c5f6 100644
--- a/electrmangnetic/src/main/resources/application.properties
+++ b/electrmangnetic/src/main/resources/application.properties
@@ -9,6 +9,21 @@ spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.jackson.time-zone=GMT+8
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=500MB
+spring.mvc.async.request-timeout=3600000
+# es
+spring.elasticsearch.password=_oO*of_l-b+4mrzXo6B0
+spring.elasticsearch.username=elastic
+spring.elasticsearch.uris=http://139.196.179.195:9200
+#ai
+spring.ai.ollama.base-url=http://localhost:11434
+spring.ai.ollama.chat.options.model=gemma3:latest
+spring.ai.ollama.chat.options.num-g-p-u=1
+spring.ai.ollama.embedding.enabled=true
+spring.ai.ollama.embedding.model=nomic-embed-text
+spring.ai.vectorstore.elasticsearch.initialize-schema=true
+spring.ai.vectorstore.elasticsearch.index-name=rag
+spring.ai.vectorstore.elasticsearch.dimensions=768
+spring.ai.vectorstore.elasticsearch.similarity=cosine
# mybatis
mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@@ -36,8 +51,4 @@ tmp.file.store.hour=48
backup.remote.host=127.0.0.1
backup.remote.port=1111
backup.mysql.path=/workspace/mysqlbak/test
-backup.mysql.script.path=/workspace/mysqlbak/back_dev.sh
-
-# ai options
-ai.remote.host=127.0.0.1
-ai.remote.port=8186
\ No newline at end of file
+backup.mysql.script.path=/workspace/mysqlbak/back_dev.sh
\ No newline at end of file