From 787aa3df766e046e1cf9dc856ce4c2799181f37f Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Tue, 11 Mar 2025 13:52:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E4=BF=AE=E5=A4=8D=20orm=20cr?= =?UTF-8?q?iteria=20=E7=9A=84=20OR=20=E6=9F=A5=E8=AF=A2=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/chat/Chat.vue | 25 ++- .../service/AnythingllmService.java | 4 - .../service/impl/AnythingllmServiceImpl.java | 6 - .../support/workspaces/StreamChatApi.java | 86 -------- .../{ollama/OllamaApi.java => api/AiApi.java} | 17 +- .../ai/{ollama => api}/MessageWrapper.java | 6 +- .../sc/platform/ai/api/ServiceProvider.java | 19 ++ .../ai/api/controller/ApiWebController.java | 18 ++ .../api/service/ApiConfigurationService.java | 42 ++++ .../platform/ai/api/service/ApiService.java | 8 + .../impl/ApiConfigurationServiceImpl.java | 53 +++++ .../ai/api/service/impl/ApiServiceImpl.java | 30 +++ .../ai/ollama/service/OllamaService.java | 13 -- .../service/impl/OllamaServiceImpl.java | 69 ------- .../service/support/blobs/BlobsApi.java | 11 - .../ai/ollama/service/support/chat/Tool.java | 4 - .../service/support/copy/OllamaCopyApi.java | 11 - .../support/create/OllamaCreateApi.java | 11 - .../support/delete/OllamaDeleteApi.java | 11 - .../service/support/embed/OllamaEmbedApi.java | 11 - .../embeddings/OllamaEmbeddingsApi.java | 11 - .../support/generate/OllamaGenerateApi.java | 11 - .../service/support/ps/OllamaPsApi.java | 11 - .../service/support/pull/OllamaPullApi.java | 11 - .../service/support/push/OllamaPushApi.java | 11 - .../service/support/show/OllamaShowApi.java | 11 - .../support/version/OllamaVersionApi.java | 11 - .../anythingllm/api/AnythingllmApi.java | 20 ++ .../service/AnythingllmService.java | 16 ++ .../service/impl/AnythingllmServiceImpl.java | 34 ++++ .../support/workspace/streamchat/ChatApi.java | 87 ++++++++ .../workspace/streamchat/ChatCallback.java} | 22 +- .../streamchat/request/Attachment.java | 31 +++ .../streamchat/request/ChatRequest.java | 46 +++++ .../streamchat/response/Message.java | 64 ++++++ .../workspace/streamchat/response/Source.java | 7 + .../workspace/workspaces/WorkspacesApi.java | 71 +++++++ .../workspace/workspaces/response/Thread.java | 37 ++++ .../workspaces/response/Workspace.java | 189 ++++++++++++++++++ .../response/WorkspacesResponse.java | 18 ++ .../controller/OllamaWebController.java | 8 +- .../ollama/service/OllamaService.java | 14 ++ .../service/impl/OllamaServiceImpl.java | 58 ++++++ .../service/support/blobs/BlobsApi.java | 10 + .../ollama/service/support/chat/ChatApi.java | 16 +- .../service/support/chat/ChatCallback.java | 3 +- .../service/support/chat/vo}/ChatRequest.java | 2 +- .../support/chat/vo}/ChatResponse.java | 2 +- .../service/support/chat/vo}/Message.java | 2 +- .../ollama/service/support/chat/vo/Tool.java | 4 + .../ollama/service/support/copy/CopyApi.java | 10 + .../service/support/create/CreateApi.java | 10 + .../service/support/delete/DeleteApi.java | 10 + .../service/support/embed/EmbedApi.java | 12 ++ .../support/embeddings/EmbeddingsApi.java | 12 ++ .../service/support/generate/GenerateApi.java | 12 ++ .../ollama/service/support/ps/PsApi.java | 12 ++ .../ollama/service/support/pull/PullApi.java | 12 ++ .../ollama/service/support/push/PushApi.java | 12 ++ .../ollama/service/support/show/ShowApi.java | 12 ++ .../ollama/service/support/tags/Details.java | 2 +- .../ollama/service/support/tags/Model.java | 2 +- .../ollama/service/support/tags/TagsApi.java | 12 +- .../service/support/tags/TagsResponse.java | 2 +- .../service/support/version/VersionApi.java | 12 ++ .../META-INF/platform/plugins/components.json | 10 +- .../META-INF/platform/plugins/parameters.json | 31 ++- .../sc/platform/ai/i18n/parameters.properties | 12 +- .../ai/i18n/parameters_tw_CN.properties | 12 +- .../ai/i18n/parameters_zh_CN.properties | 12 +- .../src/views/testcase/ai/Ai.vue | 2 +- .../orm/service/support/criteria/impl/Or.java | 1 + .../src/views/parameter/Parameter.vue | 1 + .../controller/ParameterWebController.java | 70 ++++--- 74 files changed, 1188 insertions(+), 400 deletions(-) delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/AnythingllmService.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/impl/AnythingllmServiceImpl.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatApi.java rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ollama/OllamaApi.java => api/AiApi.java} (77%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ollama => api}/MessageWrapper.java (79%) create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/ServiceProvider.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/controller/ApiWebController.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiConfigurationService.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiService.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiConfigurationServiceImpl.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiServiceImpl.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/OllamaService.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/impl/OllamaServiceImpl.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/blobs/BlobsApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Tool.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/copy/OllamaCopyApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/create/OllamaCreateApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/delete/OllamaDeleteApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embed/OllamaEmbedApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embeddings/OllamaEmbeddingsApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/generate/OllamaGenerateApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/ps/OllamaPsApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/pull/OllamaPullApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/push/OllamaPushApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/show/OllamaShowApi.java delete mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/version/OllamaVersionApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/api/AnythingllmApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/AnythingllmService.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/impl/AnythingllmServiceImpl.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatApi.java rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{anythingllm/service/support/workspaces/StreamChatCallback.java => provider/anythingllm/support/workspace/streamchat/ChatCallback.java} (58%) create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/Attachment.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/ChatRequest.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Message.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Source.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/WorkspacesApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Thread.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Workspace.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/WorkspacesResponse.java rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/controller/OllamaWebController.java (76%) create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/OllamaService.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/impl/OllamaServiceImpl.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/blobs/BlobsApi.java rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/service/support/chat/ChatApi.java (84%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/service/support/chat/ChatCallback.java (91%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ollama/service/support/chat => provider/ollama/service/support/chat/vo}/ChatRequest.java (96%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ollama/service/support/chat => provider/ollama/service/support/chat/vo}/ChatResponse.java (97%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ollama/service/support/chat => provider/ollama/service/support/chat/vo}/Message.java (94%) create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Tool.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/copy/CopyApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/create/CreateApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/delete/DeleteApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embed/EmbedApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embeddings/EmbeddingsApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/generate/GenerateApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/ps/PsApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/pull/PullApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/push/PushApi.java create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/show/ShowApi.java rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/service/support/tags/Details.java (95%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/service/support/tags/Model.java (95%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/service/support/tags/TagsApi.java (79%) rename io.sc.platform.ai/src/main/java/io/sc/platform/ai/{ => provider}/ollama/service/support/tags/TagsResponse.java (85%) create mode 100644 io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/version/VersionApi.java diff --git a/io.sc.platform.ai.frontend/src/views/chat/Chat.vue b/io.sc.platform.ai.frontend/src/views/chat/Chat.vue index 88760671..645efaee 100644 --- a/io.sc.platform.ai.frontend/src/views/chat/Chat.vue +++ b/io.sc.platform.ai.frontend/src/views/chat/Chat.vue @@ -45,7 +45,16 @@ - + @@ -58,10 +67,12 @@ import { $t, axios, Environment, Tools, Fetch } from 'platform-core'; const $q = useQuasar(); const splitterHeightRef = ref(0); //右边部分的总高度 +const textareaRef = ref(); const questionRef = ref(); const questionHistoryRef = ref([]); const showThinkRef = ref(true); const messagesRef = reactive(new Map()); +const imeRef = ref(false); /** * 当可垂直扩展的布局的高度发生变化时, 修改右边部分的总高度 @@ -71,6 +82,9 @@ const sizeChanged = (args: any) => { }; const sendMessage = (event: any) => { + if (imeRef.value) { + return; + } if (($q.platform.is.mac && event.metaKey) || ($q.platform.is.win && event.ctrlKey)) { questionRef.value = questionRef.value + '\n'; return; @@ -99,7 +113,7 @@ const doSendMessage = async (message: string) => { }); // 准备发出请求 - const url = Environment.apiContextPath('/api/ai/ollama/chat'); + const url = Environment.apiContextPath('/api/ai/chat'); // 设置请求头 const headers = Fetch.buildHeaders(); if (!Fetch.isAuthorization(url)) { @@ -181,6 +195,13 @@ const newSession = () => { }; onMounted(() => { + const textarea = textareaRef.value.getNativeElement(); + textarea.addEventListener('compositionstart', (event: any) => { + imeRef.value = true; + }); + textarea.addEventListener('compositionend', (event: any) => { + imeRef.value = false; + }); newSession(); }); diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/AnythingllmService.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/AnythingllmService.java deleted file mode 100644 index 5a4cd87e..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/AnythingllmService.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.sc.platform.ai.anythingllm.service; - -public interface AnythingllmService { -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/impl/AnythingllmServiceImpl.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/impl/AnythingllmServiceImpl.java deleted file mode 100644 index 6c3bec81..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/impl/AnythingllmServiceImpl.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.sc.platform.ai.anythingllm.service.impl; - -import io.sc.platform.ai.anythingllm.service.AnythingllmService; - -public class AnythingllmServiceImpl implements AnythingllmService { -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatApi.java deleted file mode 100644 index de60523c..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatApi.java +++ /dev/null @@ -1,86 +0,0 @@ -package io.sc.platform.ai.anythingllm.service.support.workspaces; - -import com.fasterxml.jackson.core.JsonProcessingException; -import io.sc.platform.ai.ollama.MessageWrapper; -import io.sc.platform.ai.ollama.OllamaApi; -import io.sc.platform.ai.ollama.service.support.chat.ChatRequest; -import io.sc.platform.ai.ollama.service.support.chat.Message; -import io.sc.platform.util.CollectionUtil; -import io.sc.platform.util.ObjectMapperUtil; -import okhttp3.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; - -import java.util.List; - -public class StreamChatApi extends OllamaApi { - private static final Logger log = LoggerFactory.getLogger(StreamChatApi.class); - - public StreamChatApi(String baseUrl){ - super("/api/chat","POST"); - this.baseUrl =baseUrl; - } - - public ResponseBodyEmitter execute(MessageWrapper chatRequest) { - ChatRequest chatCompletion =createChatCompletion(chatRequest); - if(chatCompletion==null) { return null; } - Call call =createRequestCall(chatCompletion); - if(call==null) { return null; } - - ResponseBodyEmitter emitter =new ResponseBodyEmitter(); - call.enqueue(new StreamChatCallback(emitter)); - return emitter; - } - - private ChatRequest createChatCompletion(MessageWrapper chatRequest) { - if(chatRequest==null) { return null; } - - String model =chatRequest.getModel(); - if(!StringUtils.hasText(model)) { return null; } - - List questions =chatRequest.getQuestions(); - if(!CollectionUtil.hasElements(questions)){ return null; } - - ChatRequest chatCompletion =new ChatRequest(); - chatCompletion.setModel(model); - - chatCompletion.addMessage(new Message("user", "使用中文回答")); - for(String question : questions){ - chatCompletion.addMessage(new Message("user",question)); - } - return chatCompletion; - } - - private Call createRequestCall(ChatRequest chatCompletion) { - if(chatCompletion==null) { return null; } - - OkHttpClient client = new OkHttpClient.Builder() - .connectTimeout(this.connectTimeout) - .readTimeout(this.readTimeout) - .writeTimeout(this.writeTimeout) - .build(); - - Headers headers = new Headers.Builder() - .set("Content-Type", "application/json") - .set("Accept", "text/event-stream") - .build(); - String json =""; - try { - json = ObjectMapperUtil.json().writeValueAsString(chatCompletion); - } catch (JsonProcessingException e){ - log.error("",e); - return null; - } - RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8")); - okhttp3.Request request = new okhttp3.Request.Builder() - .url(this.baseUrl + this.url) - .headers(headers) - .post(body) - .build(); - - Call call = client.newCall(request); - return call; - } -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/OllamaApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/AiApi.java similarity index 77% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/OllamaApi.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/AiApi.java index 1fa6ca53..e4b96ab5 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/OllamaApi.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/AiApi.java @@ -1,29 +1,20 @@ -package io.sc.platform.ai.ollama; +package io.sc.platform.ai.api; import java.time.Duration; -public class OllamaApi { - protected String baseUrl ="http://localhost:11434"; +public class AiApi { protected String url; protected String method; protected Duration connectTimeout =Duration.ofMinutes(2); protected Duration readTimeout =Duration.ofMinutes(2); protected Duration writeTimeout =Duration.ofMinutes(2); - public OllamaApi(){} - public OllamaApi(String url,String method){ + public AiApi(){} + public AiApi(String url, String method){ this.url =url; this.method =method; } - public String getBaseUrl() { - return baseUrl; - } - - public void setBaseUrl(String baseUrl) { - this.baseUrl = baseUrl; - } - public String getUrl() { return url; } diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/MessageWrapper.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/MessageWrapper.java similarity index 79% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/MessageWrapper.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/MessageWrapper.java index 4ec117bc..d8902d88 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/MessageWrapper.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/MessageWrapper.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama; +package io.sc.platform.ai.api; import java.util.ArrayList; import java.util.List; @@ -7,6 +7,10 @@ public class MessageWrapper { private String model; private List questions =new ArrayList<>(); + public void addQuestion(String question){ + this.questions.add(question); + } + public String getModel() { return model; } diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/ServiceProvider.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/ServiceProvider.java new file mode 100644 index 00000000..801a9ee0 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/ServiceProvider.java @@ -0,0 +1,19 @@ +package io.sc.platform.ai.api; + +/** + * 服务提供商名称枚举 + */ +public enum ServiceProvider { + ANYTHING_LLM("AnythingLLM"), + OLLAMA("Ollama"); + + private String value; + + ServiceProvider(String value){ + this.value =value; + } + + public String value(){ + return this.value; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/controller/ApiWebController.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/controller/ApiWebController.java new file mode 100644 index 00000000..22f191bd --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/controller/ApiWebController.java @@ -0,0 +1,18 @@ +package io.sc.platform.ai.api.controller; + +import io.sc.platform.ai.api.service.ApiService; +import io.sc.platform.ai.api.MessageWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +@RestController("io.sc.platform.ai.api.controller.ApiWebController") +@RequestMapping("/api/ai") +public class ApiWebController { + @Autowired private ApiService apiService; + + @PostMapping("/chat") + public ResponseBodyEmitter chat(@RequestBody MessageWrapper wrapper){ + return apiService.chat(wrapper); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiConfigurationService.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiConfigurationService.java new file mode 100644 index 00000000..0a6a3149 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiConfigurationService.java @@ -0,0 +1,42 @@ +package io.sc.platform.ai.api.service; + +/** + * API 配置服务接口 + */ +public interface ApiConfigurationService { + /** + * 获取默认服务提供商名称 + * @return 默认服务提供商名称 + */ + public String getDefaultServiceProvider(); + + /** + * 获取 ollama api base url + * @return ollama api base url + */ + public String getOllamaApiBaseUrl(); + + /** + * 获取 ollama 默认模型名称 + * @return ollama 默认模型名称 + */ + public String getOllamaDefaultModelName(); + + /** + * 获取 AnythingLLM api base url + * @return AnythingLLM api base url + */ + public String getAnythingllmApiBaseUrl(); + + /** + * 获取 AnythingLLM api 秘钥 + * @return AnythingLLM api 秘钥 + */ + public String getAnythingllmApiKey(); + + /** + * 获取 AnythingLLM 默认工作空间 + * @return AnythingLLM 默认工作空间 + */ + public String getAnythingllmDefaultWorkspace(); +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiService.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiService.java new file mode 100644 index 00000000..022595fa --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/ApiService.java @@ -0,0 +1,8 @@ +package io.sc.platform.ai.api.service; + +import io.sc.platform.ai.api.MessageWrapper; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +public interface ApiService { + public ResponseBodyEmitter chat(MessageWrapper wrapper); +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiConfigurationServiceImpl.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiConfigurationServiceImpl.java new file mode 100644 index 00000000..2b3d6065 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiConfigurationServiceImpl.java @@ -0,0 +1,53 @@ +package io.sc.platform.ai.api.service.impl; + +import io.sc.platform.ai.api.service.ApiConfigurationService; +import io.sc.platform.mvc.service.SystemParameterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service("io.sc.platform.ai.api.service.impl.ApiConfigurationServiceImpl") +public class ApiConfigurationServiceImpl implements ApiConfigurationService { + // default service provider + private static final String KEY_DEFAULT_SERVICE_PROVIDER ="parameter.ai.provider.default"; + + // Ollama config + private static final String KEY_OLLAMA_API_BASE_URL ="parameter.ai.provider.ollama.apiUrl"; + private static final String KEY_OLLAMA_DEFAULT_MODEL_NAME ="parameter.ai.provider.ollama.defaultModelName"; + + // AnythingLLM config + private static final String KEY_ANYTHINGLLM_API_BASE_URL ="parameter.ai.provider.anythingllm.apiUrl"; + private static final String KEY_ANYTHINGLLM_API_KEY ="parameter.ai.provider.anythingllm.apiKey"; + private static final String KEY_ANYTHINGLLM_DEFAULT_WORKSPACE_KEY ="parameter.ai.provider.anythingllm.defaultWorkspace"; + + @Autowired private SystemParameterService systemParameterService; + + @Override + public String getDefaultServiceProvider() { + return systemParameterService.getParameter(KEY_DEFAULT_SERVICE_PROVIDER); + } + + @Override + public String getOllamaApiBaseUrl() { + return systemParameterService.getParameter(KEY_OLLAMA_API_BASE_URL); + } + + @Override + public String getOllamaDefaultModelName() { + return systemParameterService.getParameter(KEY_OLLAMA_DEFAULT_MODEL_NAME); + } + + @Override + public String getAnythingllmApiBaseUrl() { + return systemParameterService.getParameter(KEY_ANYTHINGLLM_API_BASE_URL); + } + + @Override + public String getAnythingllmApiKey() { + return systemParameterService.getParameter(KEY_ANYTHINGLLM_API_KEY); + } + + @Override + public String getAnythingllmDefaultWorkspace() { + return systemParameterService.getParameter(KEY_ANYTHINGLLM_DEFAULT_WORKSPACE_KEY); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiServiceImpl.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiServiceImpl.java new file mode 100644 index 00000000..d7b7e112 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/api/service/impl/ApiServiceImpl.java @@ -0,0 +1,30 @@ +package io.sc.platform.ai.api.service.impl; + +import io.sc.platform.ai.api.ServiceProvider; +import io.sc.platform.ai.api.service.ApiConfigurationService; +import io.sc.platform.ai.api.service.ApiService; +import io.sc.platform.ai.provider.anythingllm.service.AnythingllmService; +import io.sc.platform.ai.api.MessageWrapper; +import io.sc.platform.ai.provider.ollama.service.OllamaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +@Service("io.sc.platform.ai.api.service.impl.ApiServiceImpl") +public class ApiServiceImpl implements ApiService { + @Autowired private ApiConfigurationService apiConfigurationService; + + @Autowired private AnythingllmService anythingllmService; + @Autowired private OllamaService ollamaService; + + @Override + public ResponseBodyEmitter chat(MessageWrapper wrapper) { + String provider =apiConfigurationService.getDefaultServiceProvider(); + if(ServiceProvider.ANYTHING_LLM.value().equals(provider)){ + return anythingllmService.chat(wrapper); + }else if(ServiceProvider.OLLAMA.value().equals(provider)){ + return ollamaService.chat(wrapper); + } + return null; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/OllamaService.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/OllamaService.java deleted file mode 100644 index 31661581..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/OllamaService.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.sc.platform.ai.ollama.service; - -import io.sc.platform.ai.ollama.MessageWrapper; -import io.sc.platform.ai.ollama.service.support.tags.TagsResponse; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; - -import java.util.List; - -public interface OllamaService { - public ResponseBodyEmitter chat(MessageWrapper wrapper); - public TagsResponse tags(); - public List modelNames(); -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/impl/OllamaServiceImpl.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/impl/OllamaServiceImpl.java deleted file mode 100644 index abcac5b5..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/impl/OllamaServiceImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -package io.sc.platform.ai.ollama.service.impl; - -import io.sc.platform.ai.ollama.MessageWrapper; -import io.sc.platform.ai.ollama.service.OllamaService; -import io.sc.platform.ai.ollama.service.support.chat.ChatApi; -import io.sc.platform.ai.ollama.service.support.tags.Model; -import io.sc.platform.ai.ollama.service.support.tags.TagsApi; -import io.sc.platform.ai.ollama.service.support.tags.TagsResponse; -import io.sc.platform.mvc.service.SystemParameterService; -import io.sc.platform.util.CollectionUtil; -import io.sc.platform.util.StringUtil; -import io.sc.platform.util.support.NumberStringComparator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -@Service("io.sc.platform.ai.service.impl.OllamaServiceImpl") -public class OllamaServiceImpl implements OllamaService { - private static final String KEY_API_URL ="parameter.ai.provider.ollama.apiUrl"; - private static final String KEY_DEFAULT_MODEL_NAME ="parameter.ai.provider.ollama.defaultModelName"; - - @Autowired private SystemParameterService systemParameterService; - - @Override - public ResponseBodyEmitter chat(MessageWrapper wrapper) { - Map parameters =getParameters(); - if(!StringUtil.hasText(wrapper.getModel())){ - wrapper.setModel(parameters.get(KEY_DEFAULT_MODEL_NAME)); - } - ChatApi api =new ChatApi(parameters.get(KEY_API_URL)); - return api.execute(wrapper); - } - - @Override - public TagsResponse tags() { - Map parameters =getParameters(); - TagsApi api =new TagsApi(parameters.get(KEY_API_URL)); - return api.execute(); - } - - @Override - public List modelNames() { - Map parameters =getParameters(); - TagsApi api =new TagsApi(parameters.get(KEY_API_URL)); - TagsResponse response =api.execute(); - if(response==null){ - return Collections.emptyList(); - } - List models =response.getModels(); - if(!CollectionUtil.hasElements(models)){ - return Collections.emptyList(); - } - List result =new ArrayList<>(); - for(Model model : models){ - result.add(model.getModel()); - } - Collections.sort(result, new NumberStringComparator()); - return result; - } - - private Map getParameters(){ - return systemParameterService.getParameters(new String[]{KEY_API_URL,KEY_DEFAULT_MODEL_NAME}); - } -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/blobs/BlobsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/blobs/BlobsApi.java deleted file mode 100644 index 4f32b3f5..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/blobs/BlobsApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.blobs; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class BlobsApi extends OllamaApi { - public BlobsApi(){ - super("/api/blobs/","HEAD"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Tool.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Tool.java deleted file mode 100644 index 6a869bdb..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Tool.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.chat; - -public class Tool { -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/copy/OllamaCopyApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/copy/OllamaCopyApi.java deleted file mode 100644 index dd829b77..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/copy/OllamaCopyApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.copy; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaCopyApi extends OllamaApi { - public OllamaCopyApi(){ - super("/api/copy","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/create/OllamaCreateApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/create/OllamaCreateApi.java deleted file mode 100644 index 4219aae7..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/create/OllamaCreateApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.create; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaCreateApi extends OllamaApi { - public OllamaCreateApi(){ - super("/api/create","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/delete/OllamaDeleteApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/delete/OllamaDeleteApi.java deleted file mode 100644 index a1a3ad17..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/delete/OllamaDeleteApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.delete; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaDeleteApi extends OllamaApi { - public OllamaDeleteApi(){ - super("/api/delete","DELETE"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embed/OllamaEmbedApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embed/OllamaEmbedApi.java deleted file mode 100644 index 440255fc..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embed/OllamaEmbedApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.embed; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaEmbedApi extends OllamaApi { - public OllamaEmbedApi(){ - super("/api/embed","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embeddings/OllamaEmbeddingsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embeddings/OllamaEmbeddingsApi.java deleted file mode 100644 index 0d2d2cb6..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/embeddings/OllamaEmbeddingsApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.embeddings; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaEmbeddingsApi extends OllamaApi { - public OllamaEmbeddingsApi(){ - super("/api/embeddings","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/generate/OllamaGenerateApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/generate/OllamaGenerateApi.java deleted file mode 100644 index a8bba44d..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/generate/OllamaGenerateApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.generate; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaGenerateApi extends OllamaApi { - public OllamaGenerateApi(){ - super("/api/generate","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/ps/OllamaPsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/ps/OllamaPsApi.java deleted file mode 100644 index b2f7fd2c..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/ps/OllamaPsApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.ps; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaPsApi extends OllamaApi { - public OllamaPsApi(){ - super("/api/ps","GET"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/pull/OllamaPullApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/pull/OllamaPullApi.java deleted file mode 100644 index 88afbc86..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/pull/OllamaPullApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.pull; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaPullApi extends OllamaApi { - public OllamaPullApi(){ - super("/api/pull","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/push/OllamaPushApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/push/OllamaPushApi.java deleted file mode 100644 index 05b0398f..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/push/OllamaPushApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.push; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaPushApi extends OllamaApi { - public OllamaPushApi(){ - super("/api/push","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/show/OllamaShowApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/show/OllamaShowApi.java deleted file mode 100644 index 738c7d92..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/show/OllamaShowApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.show; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaShowApi extends OllamaApi { - public OllamaShowApi(){ - super("/api/show","POST"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/version/OllamaVersionApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/version/OllamaVersionApi.java deleted file mode 100644 index 7a453f91..00000000 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/version/OllamaVersionApi.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.sc.platform.ai.ollama.service.support.version; - -import io.sc.platform.ai.ollama.OllamaApi; - -public class OllamaVersionApi extends OllamaApi { - public OllamaVersionApi(){ - super("/api/version","GET"); - } - - -} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/api/AnythingllmApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/api/AnythingllmApi.java new file mode 100644 index 00000000..7f7c68ee --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/api/AnythingllmApi.java @@ -0,0 +1,20 @@ +package io.sc.platform.ai.provider.anythingllm.api; + +import io.sc.platform.ai.api.AiApi; + +public class AnythingllmApi extends AiApi { + protected String apiKey; + + public AnythingllmApi(String url,String method,String apiKey) { + super(url,method); + this.apiKey =apiKey; + } + + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/AnythingllmService.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/AnythingllmService.java new file mode 100644 index 00000000..50ffea63 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/AnythingllmService.java @@ -0,0 +1,16 @@ +package io.sc.platform.ai.provider.anythingllm.service; + +import io.sc.platform.ai.api.MessageWrapper; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +import java.util.List; + +public interface AnythingllmService { + public ResponseBodyEmitter chat(MessageWrapper wrapper); + + /** + * 获取所有工作空间名称列表 + * @return 所有工作空间名称列表 + */ + public List workspaceNames(); +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/impl/AnythingllmServiceImpl.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/impl/AnythingllmServiceImpl.java new file mode 100644 index 00000000..63198600 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/service/impl/AnythingllmServiceImpl.java @@ -0,0 +1,34 @@ +package io.sc.platform.ai.provider.anythingllm.service.impl; + +import io.sc.platform.ai.api.service.ApiConfigurationService; +import io.sc.platform.ai.provider.anythingllm.service.AnythingllmService; +import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.ChatApi; +import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.WorkspacesApi; +import io.sc.platform.ai.api.MessageWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +import java.util.List; + +@Service("io.sc.platform.ai.provider.anythingllm.service.impl.AnythingllmServiceImpl") +public class AnythingllmServiceImpl implements AnythingllmService { + @Autowired private ApiConfigurationService apiConfigurationService; + + @Override + public ResponseBodyEmitter chat(MessageWrapper wrapper) { + String baseUrl =apiConfigurationService.getAnythingllmApiBaseUrl(); + String apiKey =apiConfigurationService.getAnythingllmApiKey(); + String defaultWorkspace=apiConfigurationService.getAnythingllmDefaultWorkspace(); + ChatApi api =new ChatApi(baseUrl,apiKey,defaultWorkspace); + return api.execute(wrapper); + } + + @Override + public List workspaceNames() { + String baseUrl =apiConfigurationService.getAnythingllmApiBaseUrl(); + String apiKey =apiConfigurationService.getAnythingllmApiKey(); + WorkspacesApi api =new WorkspacesApi(baseUrl,apiKey); + return api.workspaceNames(); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatApi.java new file mode 100644 index 00000000..d032e134 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatApi.java @@ -0,0 +1,87 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat; + +import com.fasterxml.jackson.core.JsonProcessingException; +import io.sc.platform.ai.api.MessageWrapper; +import io.sc.platform.ai.provider.anythingllm.api.AnythingllmApi; +import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.request.ChatRequest; +import io.sc.platform.security.util.SecurityUtil; +import io.sc.platform.util.CollectionUtil; +import io.sc.platform.util.ObjectMapperUtil; +import io.sc.platform.util.UrlUtil; +import okhttp3.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +import java.util.List; + +public class ChatApi extends AnythingllmApi { + private static final Logger log = LoggerFactory.getLogger(ChatApi.class); + + public ChatApi(String baseUrl, String apiKey,String workspace){ + super(UrlUtil.concatUrl(baseUrl,"/api/v1/workspace/" + workspace + "/stream-chat"),"POST",apiKey); + this.apiKey =apiKey; + } + + public ResponseBodyEmitter execute(MessageWrapper wrapper) { + ChatRequest chatRequest =createChatRequest(wrapper); + if(chatRequest==null) { return null; } + Call call =createRequestCall(chatRequest); + if(call==null) { return null; } + + ResponseBodyEmitter emitter =new ResponseBodyEmitter(); + call.enqueue(new ChatCallback(emitter)); + return emitter; + } + + private ChatRequest createChatRequest(MessageWrapper wrapper) { + if(wrapper==null) { return null; } + + List questions =wrapper.getQuestions(); + if(!CollectionUtil.hasElements(questions)){ return null; } + + StringBuilder sb =new StringBuilder(); + for(String question : questions){ + sb.append(question).append("\n"); + } + ChatRequest request =new ChatRequest(); + request.setMode("chat"); + request.setMessage(sb.toString()); + request.setSessionId(SecurityUtil.getUserId()); + return request; + } + + private Call createRequestCall(ChatRequest chatRequest) { + if(chatRequest==null) { return null; } + + OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(this.connectTimeout) + .readTimeout(this.readTimeout) + .writeTimeout(this.writeTimeout) + .build(); + + Headers headers = new Headers.Builder() + .add("Content-Type: application/json") + .add("Accept: text/event-stream") + .add("Authorization: Bearer " + apiKey) + .build(); + String json =""; + try { + json = ObjectMapperUtil.json().writeValueAsString(chatRequest); + } catch (JsonProcessingException e){ + log.error("",e); + return null; + } + RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8")); + log.info("[" + this.getMethod() + "]: " + this.url); + log.info(json); + okhttp3.Request request = new okhttp3.Request.Builder() + .url(this.url) + .headers(headers) + .post(body) + .build(); + + Call call = client.newCall(request); + return call; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatCallback.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatCallback.java similarity index 58% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatCallback.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatCallback.java index 0d07453f..aaccbed2 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/anythingllm/service/support/workspaces/StreamChatCallback.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/ChatCallback.java @@ -1,6 +1,9 @@ -package io.sc.platform.ai.anythingllm.service.support.workspaces; +package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat; -import io.sc.platform.ai.ollama.service.support.chat.ChatResponse; +import com.fasterxml.jackson.core.type.TypeReference; +import io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response.Message; +import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatResponse; +import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.ObjectMapperUtil; import okhttp3.Call; import okhttp3.Callback; @@ -8,14 +11,17 @@ import okhttp3.Response; import okhttp3.ResponseBody; import okio.BufferedSource; import org.jetbrains.annotations.NotNull; +import org.springframework.util.StringUtils; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import java.io.IOException; +import java.util.Collections; +import java.util.List; -public class StreamChatCallback implements Callback { +public class ChatCallback implements Callback { private ResponseBodyEmitter emitter; - public StreamChatCallback(ResponseBodyEmitter emitter){ + public ChatCallback(ResponseBodyEmitter emitter){ this.emitter =emitter; } @@ -31,8 +37,12 @@ public class StreamChatCallback implements Callback { BufferedSource bufferedSource = body.source(); while (!bufferedSource.exhausted()) { String line = bufferedSource.readUtf8Line(); - ChatResponse responseObject =ObjectMapperUtil.json().readValue(line, ChatResponse.class); - emitter.send(responseObject.getMessage().getContent()); + if(!StringUtils.hasText(line)){ + continue; + } + line =line.substring(5); + Message message =ObjectMapperUtil.json().readValue(line, Message.class); + emitter.send(message.getTextResponse()); } emitter.complete(); } catch (Exception e) { diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/Attachment.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/Attachment.java new file mode 100644 index 00000000..6b66ffd2 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/Attachment.java @@ -0,0 +1,31 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.request; + +public class Attachment { + private String name; + private String mime; + private String contentString; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMime() { + return mime; + } + + public void setMime(String mime) { + this.mime = mime; + } + + public String getContentString() { + return contentString; + } + + public void setContentString(String contentString) { + this.contentString = contentString; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/ChatRequest.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/ChatRequest.java new file mode 100644 index 00000000..b263284d --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/request/ChatRequest.java @@ -0,0 +1,46 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.request; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.ArrayList; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class ChatRequest { + private String message; + private String mode; + private String sessionId; + private List attachments =new ArrayList<>(); + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public List getAttachments() { + return attachments; + } + + public void setAttachments(List attachments) { + this.attachments = attachments; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Message.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Message.java new file mode 100644 index 00000000..e194fd30 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Message.java @@ -0,0 +1,64 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.ArrayList; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Message { + private String id; + private String type; + private String textResponse; + private List sources =new ArrayList<>(); + private boolean close; + private String error; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTextResponse() { + return textResponse; + } + + public void setTextResponse(String textResponse) { + this.textResponse = textResponse; + } + + public List getSources() { + return sources; + } + + public void setSources(List sources) { + this.sources = sources; + } + + public boolean isClose() { + return close; + } + + public void setClose(boolean close) { + this.close = close; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Source.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Source.java new file mode 100644 index 00000000..907e2787 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/streamchat/response/Source.java @@ -0,0 +1,7 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.streamchat.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Source { +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/WorkspacesApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/WorkspacesApi.java new file mode 100644 index 00000000..4ad72d8e --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/WorkspacesApi.java @@ -0,0 +1,71 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces; + +import io.sc.platform.ai.provider.anythingllm.api.AnythingllmApi; +import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response.Workspace; +import io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response.WorkspacesResponse; +import io.sc.platform.util.CollectionUtil; +import io.sc.platform.util.ObjectMapperUtil; +import io.sc.platform.util.UrlUtil; +import okhttp3.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class WorkspacesApi extends AnythingllmApi { + + public WorkspacesApi(String baseUrl, String apiKey){ + super(UrlUtil.concatUrl(baseUrl,"/api/v1/workspaces"),"GET",apiKey); + this.apiKey =apiKey; + } + + public WorkspacesResponse execute() { + Call call =createRequestCall(); + if(call==null) { return null; } + try { + Response response = call.execute(); + ResponseBody body =response.body(); + WorkspacesResponse workspacesResponse = ObjectMapperUtil.json().readValue(body.source().readUtf8(), WorkspacesResponse.class); + return workspacesResponse; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public List workspaceNames() { + WorkspacesResponse workspacesResponse =execute(); + if(workspacesResponse==null) { return Collections.emptyList(); } + List workspaces =workspacesResponse.getWorkspaces(); + if(!CollectionUtil.hasElements(workspaces)) { return Collections.emptyList(); } + List result =new ArrayList<>(); + for(Workspace workspace : workspacesResponse.getWorkspaces()){ + result.add(workspace.getName()); + } + return result; + } + + private Call createRequestCall() { + OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(this.connectTimeout) + .readTimeout(this.readTimeout) + .writeTimeout(this.writeTimeout) + .build(); + Request request = new Request.Builder() + .url(this.url) + .header("Authorization","Bearer " + apiKey) + .get() + .build(); + + Call call = client.newCall(request); + return call; + } + + public static void main(String[] args) { + WorkspacesApi api =new WorkspacesApi("http://localhost:3001","8X0N9TN-HQ3MTVK-M4NM8BQ-W6EYE8A"); + WorkspacesResponse workspacesResponse =api.execute(); + for(Workspace workspace : workspacesResponse.getWorkspaces()){ + System.out.println(workspace.getName()); + } + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Thread.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Thread.java new file mode 100644 index 00000000..db6a4104 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Thread.java @@ -0,0 +1,37 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Thread { + @JsonProperty("user_id") + private String userId; + + private String slug; + private String name; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getSlug() { + return slug; + } + + public void setSlug(String slug) { + this.slug = slug; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Workspace.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Workspace.java new file mode 100644 index 00000000..5be319ba --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/Workspace.java @@ -0,0 +1,189 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Workspace { + private long id; + private String name; + private String slug; + private String vectorTag; + private String createdAt; + private String openAiTemp; + private long openAiHistory; + private String lastUpdatedAt; + private String openAiPrompt; + private double similarityThreshold; + private String chatProvider; + private String chatModel; + private int topN; + private String chatMode; + private String pfpFilename; + private String agentProvider; + private String agentModel; + private String queryRefusalResponse; + private String vectorSearchMode; + private List threads; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSlug() { + return slug; + } + + public void setSlug(String slug) { + this.slug = slug; + } + + public String getVectorTag() { + return vectorTag; + } + + public void setVectorTag(String vectorTag) { + this.vectorTag = vectorTag; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getOpenAiTemp() { + return openAiTemp; + } + + public void setOpenAiTemp(String openAiTemp) { + this.openAiTemp = openAiTemp; + } + + public long getOpenAiHistory() { + return openAiHistory; + } + + public void setOpenAiHistory(long openAiHistory) { + this.openAiHistory = openAiHistory; + } + + public String getLastUpdatedAt() { + return lastUpdatedAt; + } + + public void setLastUpdatedAt(String lastUpdatedAt) { + this.lastUpdatedAt = lastUpdatedAt; + } + + public String getOpenAiPrompt() { + return openAiPrompt; + } + + public void setOpenAiPrompt(String openAiPrompt) { + this.openAiPrompt = openAiPrompt; + } + + public double getSimilarityThreshold() { + return similarityThreshold; + } + + public void setSimilarityThreshold(double similarityThreshold) { + this.similarityThreshold = similarityThreshold; + } + + public String getChatProvider() { + return chatProvider; + } + + public void setChatProvider(String chatProvider) { + this.chatProvider = chatProvider; + } + + public String getChatModel() { + return chatModel; + } + + public void setChatModel(String chatModel) { + this.chatModel = chatModel; + } + + public int getTopN() { + return topN; + } + + public void setTopN(int topN) { + this.topN = topN; + } + + public String getChatMode() { + return chatMode; + } + + public void setChatMode(String chatMode) { + this.chatMode = chatMode; + } + + public String getPfpFilename() { + return pfpFilename; + } + + public void setPfpFilename(String pfpFilename) { + this.pfpFilename = pfpFilename; + } + + public String getAgentProvider() { + return agentProvider; + } + + public void setAgentProvider(String agentProvider) { + this.agentProvider = agentProvider; + } + + public String getAgentModel() { + return agentModel; + } + + public void setAgentModel(String agentModel) { + this.agentModel = agentModel; + } + + public String getQueryRefusalResponse() { + return queryRefusalResponse; + } + + public void setQueryRefusalResponse(String queryRefusalResponse) { + this.queryRefusalResponse = queryRefusalResponse; + } + + public String getVectorSearchMode() { + return vectorSearchMode; + } + + public void setVectorSearchMode(String vectorSearchMode) { + this.vectorSearchMode = vectorSearchMode; + } + + public List getThreads() { + return threads; + } + + public void setThreads(List threads) { + this.threads = threads; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/WorkspacesResponse.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/WorkspacesResponse.java new file mode 100644 index 00000000..f800c625 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/anythingllm/support/workspace/workspaces/response/WorkspacesResponse.java @@ -0,0 +1,18 @@ +package io.sc.platform.ai.provider.anythingllm.support.workspace.workspaces.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class WorkspacesResponse { + private List workspaces; + + public List getWorkspaces() { + return workspaces; + } + + public void setWorkspaces(List workspaces) { + this.workspaces = workspaces; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/controller/OllamaWebController.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/controller/OllamaWebController.java similarity index 76% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/controller/OllamaWebController.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/controller/OllamaWebController.java index 37d22ceb..505366e9 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/controller/OllamaWebController.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/controller/OllamaWebController.java @@ -1,8 +1,8 @@ -package io.sc.platform.ai.ollama.controller; +package io.sc.platform.ai.provider.ollama.controller; -import io.sc.platform.ai.ollama.MessageWrapper; -import io.sc.platform.ai.ollama.service.OllamaService; -import io.sc.platform.ai.ollama.service.support.tags.TagsResponse; +import io.sc.platform.ai.api.MessageWrapper; +import io.sc.platform.ai.provider.ollama.service.OllamaService; +import io.sc.platform.ai.provider.ollama.service.support.tags.TagsResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/OllamaService.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/OllamaService.java new file mode 100644 index 00000000..622fe71d --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/OllamaService.java @@ -0,0 +1,14 @@ +package io.sc.platform.ai.provider.ollama.service; + +import io.sc.platform.ai.api.MessageWrapper; +import io.sc.platform.ai.api.service.ApiService; +import io.sc.platform.ai.provider.ollama.service.support.tags.TagsResponse; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +import java.util.List; + +public interface OllamaService { + public ResponseBodyEmitter chat(MessageWrapper wrapper); + public TagsResponse tags(); + public List modelNames(); +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/impl/OllamaServiceImpl.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/impl/OllamaServiceImpl.java new file mode 100644 index 00000000..23a50392 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/impl/OllamaServiceImpl.java @@ -0,0 +1,58 @@ +package io.sc.platform.ai.provider.ollama.service.impl; + +import io.sc.platform.ai.api.service.ApiConfigurationService; +import io.sc.platform.ai.api.MessageWrapper; +import io.sc.platform.ai.provider.ollama.service.OllamaService; +import io.sc.platform.ai.provider.ollama.service.support.chat.ChatApi; +import io.sc.platform.ai.provider.ollama.service.support.tags.Model; +import io.sc.platform.ai.provider.ollama.service.support.tags.TagsApi; +import io.sc.platform.ai.provider.ollama.service.support.tags.TagsResponse; +import io.sc.platform.util.CollectionUtil; +import io.sc.platform.util.StringUtil; +import io.sc.platform.util.support.NumberStringComparator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Service("io.sc.platform.ai.provider.ollama.service.impl.OllamaServiceImpl") +public class OllamaServiceImpl implements OllamaService { + @Autowired private ApiConfigurationService apiConfigurationService; + + @Override + public ResponseBodyEmitter chat(MessageWrapper wrapper) { + if(!StringUtil.hasText(wrapper.getModel())){ + wrapper.setModel(apiConfigurationService.getOllamaDefaultModelName()); + } + ChatApi api =new ChatApi(apiConfigurationService.getOllamaApiBaseUrl()); + return api.execute(wrapper); + } + + @Override + public TagsResponse tags() { + TagsApi api =new TagsApi(apiConfigurationService.getOllamaApiBaseUrl()); + return api.execute(); + } + + @Override + public List modelNames() { + TagsApi api =new TagsApi(apiConfigurationService.getOllamaApiBaseUrl()); + TagsResponse response =api.execute(); + if(response==null){ + return Collections.emptyList(); + } + List models =response.getModels(); + if(!CollectionUtil.hasElements(models)){ + return Collections.emptyList(); + } + List result =new ArrayList<>(); + for(Model model : models){ + result.add(model.getModel()); + } + Collections.sort(result, new NumberStringComparator()); + return result; + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/blobs/BlobsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/blobs/BlobsApi.java new file mode 100644 index 00000000..e0098141 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/blobs/BlobsApi.java @@ -0,0 +1,10 @@ +package io.sc.platform.ai.provider.ollama.service.support.blobs; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class BlobsApi extends AiApi { + public BlobsApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/blobs/"),"HEAD"); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatApi.java similarity index 84% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatApi.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatApi.java index ff6c7fbc..6b43735f 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatApi.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatApi.java @@ -1,10 +1,13 @@ -package io.sc.platform.ai.ollama.service.support.chat; +package io.sc.platform.ai.provider.ollama.service.support.chat; import com.fasterxml.jackson.core.JsonProcessingException; -import io.sc.platform.ai.ollama.MessageWrapper; -import io.sc.platform.ai.ollama.OllamaApi; +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.ai.api.MessageWrapper; +import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatRequest; +import io.sc.platform.ai.provider.ollama.service.support.chat.vo.Message; import io.sc.platform.util.CollectionUtil; import io.sc.platform.util.ObjectMapperUtil; +import io.sc.platform.util.UrlUtil; import okhttp3.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,12 +16,11 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter import java.util.List; -public class ChatApi extends OllamaApi { +public class ChatApi extends AiApi { private static final Logger log = LoggerFactory.getLogger(ChatApi.class); public ChatApi(String baseUrl){ - super("/api/chat","POST"); - this.baseUrl =baseUrl; + super(UrlUtil.concatUrl(baseUrl,"/api/chat"),"POST"); } public ResponseBodyEmitter execute(MessageWrapper wrapper) { @@ -73,7 +75,7 @@ public class ChatApi extends OllamaApi { } RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8")); okhttp3.Request request = new okhttp3.Request.Builder() - .url(this.baseUrl + this.url) + .url(this.url) .headers(headers) .post(body) .build(); diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatCallback.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatCallback.java similarity index 91% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatCallback.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatCallback.java index 407029da..ac8ed6ab 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatCallback.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/ChatCallback.java @@ -1,5 +1,6 @@ -package io.sc.platform.ai.ollama.service.support.chat; +package io.sc.platform.ai.provider.ollama.service.support.chat; +import io.sc.platform.ai.provider.ollama.service.support.chat.vo.ChatResponse; import io.sc.platform.util.ObjectMapperUtil; import okhttp3.Call; import okhttp3.Callback; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatRequest.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/ChatRequest.java similarity index 96% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatRequest.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/ChatRequest.java index cc66b358..5efa831f 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatRequest.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/ChatRequest.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama.service.support.chat; +package io.sc.platform.ai.provider.ollama.service.support.chat.vo; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatResponse.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/ChatResponse.java similarity index 97% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatResponse.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/ChatResponse.java index a0040e35..d5e619a6 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/ChatResponse.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/ChatResponse.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama.service.support.chat; +package io.sc.platform.ai.provider.ollama.service.support.chat.vo; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Message.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Message.java similarity index 94% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Message.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Message.java index 097d5ded..4307b83c 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/chat/Message.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Message.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama.service.support.chat; +package io.sc.platform.ai.provider.ollama.service.support.chat.vo; import java.util.ArrayList; import java.util.List; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Tool.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Tool.java new file mode 100644 index 00000000..6dcad1c2 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/chat/vo/Tool.java @@ -0,0 +1,4 @@ +package io.sc.platform.ai.provider.ollama.service.support.chat.vo; + +public class Tool { +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/copy/CopyApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/copy/CopyApi.java new file mode 100644 index 00000000..b9f9f632 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/copy/CopyApi.java @@ -0,0 +1,10 @@ +package io.sc.platform.ai.provider.ollama.service.support.copy; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class CopyApi extends AiApi { + public CopyApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/copy"),"POST"); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/create/CreateApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/create/CreateApi.java new file mode 100644 index 00000000..aeba22a3 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/create/CreateApi.java @@ -0,0 +1,10 @@ +package io.sc.platform.ai.provider.ollama.service.support.create; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class CreateApi extends AiApi { + public CreateApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/create"),"POST"); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/delete/DeleteApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/delete/DeleteApi.java new file mode 100644 index 00000000..324e5c32 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/delete/DeleteApi.java @@ -0,0 +1,10 @@ +package io.sc.platform.ai.provider.ollama.service.support.delete; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class DeleteApi extends AiApi { + public DeleteApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/delete"),"DELETE"); + } +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embed/EmbedApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embed/EmbedApi.java new file mode 100644 index 00000000..444f6df0 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embed/EmbedApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.embed; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class EmbedApi extends AiApi { + public EmbedApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/embed"),"POST"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embeddings/EmbeddingsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embeddings/EmbeddingsApi.java new file mode 100644 index 00000000..3d9c64e9 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/embeddings/EmbeddingsApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.embeddings; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class EmbeddingsApi extends AiApi { + public EmbeddingsApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/embeddings"),"POST"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/generate/GenerateApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/generate/GenerateApi.java new file mode 100644 index 00000000..1fa45e1a --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/generate/GenerateApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.generate; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class GenerateApi extends AiApi { + public GenerateApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/generate"),"POST"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/ps/PsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/ps/PsApi.java new file mode 100644 index 00000000..f3be2105 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/ps/PsApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.ps; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class PsApi extends AiApi { + public PsApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/ps"),"GET"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/pull/PullApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/pull/PullApi.java new file mode 100644 index 00000000..e2e0414f --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/pull/PullApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.pull; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class PullApi extends AiApi { + public PullApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/pull"),"POST"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/push/PushApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/push/PushApi.java new file mode 100644 index 00000000..13a8c4cd --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/push/PushApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.push; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class PushApi extends AiApi { + public PushApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/push"),"POST"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/show/ShowApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/show/ShowApi.java new file mode 100644 index 00000000..9b4de366 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/show/ShowApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.show; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class ShowApi extends AiApi { + public ShowApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/show"),"POST"); + } + + +} diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/Details.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/Details.java similarity index 95% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/Details.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/Details.java index e7f3b9f0..5a20038f 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/Details.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/Details.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama.service.support.tags; +package io.sc.platform.ai.provider.ollama.service.support.tags; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/Model.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/Model.java similarity index 95% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/Model.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/Model.java index c4efcf96..aa0ae833 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/Model.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/Model.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama.service.support.tags; +package io.sc.platform.ai.provider.ollama.service.support.tags; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/TagsApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsApi.java similarity index 79% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/TagsApi.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsApi.java index e2e5ac66..8b821aee 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/TagsApi.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsApi.java @@ -1,15 +1,15 @@ -package io.sc.platform.ai.ollama.service.support.tags; +package io.sc.platform.ai.provider.ollama.service.support.tags; -import io.sc.platform.ai.ollama.OllamaApi; +import io.sc.platform.ai.api.AiApi; import io.sc.platform.util.ObjectMapperUtil; +import io.sc.platform.util.UrlUtil; import okhttp3.*; import java.io.IOException; -public class TagsApi extends OllamaApi { +public class TagsApi extends AiApi { public TagsApi(String baseUrl){ - super("/api/tags","GET"); - this.baseUrl =baseUrl; + super(UrlUtil.concatUrl(baseUrl,"/api/tags"),"GET"); } public TagsResponse execute() { @@ -32,7 +32,7 @@ public class TagsApi extends OllamaApi { .writeTimeout(this.writeTimeout) .build(); Request request = new Request.Builder() - .url(this.baseUrl + this.url) + .url(this.url) .get() .build(); diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/TagsResponse.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsResponse.java similarity index 85% rename from io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/TagsResponse.java rename to io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsResponse.java index 9d335f8b..a1128c1d 100644 --- a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/ollama/service/support/tags/TagsResponse.java +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/tags/TagsResponse.java @@ -1,4 +1,4 @@ -package io.sc.platform.ai.ollama.service.support.tags; +package io.sc.platform.ai.provider.ollama.service.support.tags; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/version/VersionApi.java b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/version/VersionApi.java new file mode 100644 index 00000000..3bb520f2 --- /dev/null +++ b/io.sc.platform.ai/src/main/java/io/sc/platform/ai/provider/ollama/service/support/version/VersionApi.java @@ -0,0 +1,12 @@ +package io.sc.platform.ai.provider.ollama.service.support.version; + +import io.sc.platform.ai.api.AiApi; +import io.sc.platform.util.UrlUtil; + +public class VersionApi extends AiApi { + public VersionApi(String baseUrl){ + super(UrlUtil.concatUrl(baseUrl,"/api/version"),"GET"); + } + + +} diff --git a/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/components.json b/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/components.json index fbfe8232..23aef8fc 100644 --- a/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/components.json +++ b/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/components.json @@ -9,8 +9,14 @@ { "includes":[ - "io.sc.platform.ai.ollama.controller", - "io.sc.platform.ai.ollama.service.impl" + "io.sc.platform.ai.api.controller", + "io.sc.platform.ai.api.service.impl", + + "io.sc.platform.ai.provider.anythingllm.controller", + "io.sc.platform.ai.provider.anythingllm.service.impl", + + "io.sc.platform.ai.provider.ollama.controller", + "io.sc.platform.ai.provider.ollama.service.impl" ], "excludes":[] } diff --git a/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/parameters.json b/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/parameters.json index a0f17490..b292e9d4 100644 --- a/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/parameters.json +++ b/io.sc.platform.ai/src/main/resources/META-INF/platform/plugins/parameters.json @@ -29,10 +29,11 @@ "id" :"parameter.ai.provider.default", "parentId" :"parameter.ai", "code" :"parameter.ai.provider.default", - "defaultValue" :"ollama", + "defaultValue" :"Ollama", "order" : 200, "options" : { - "ollama" : "parameter.ai.provider.default.options.ollama" + "Ollama" : "parameter.ai.provider.default.options.ollama", + "AnythingLLM" : "parameter.ai.provider.default.options.anythingllm" } }, //AI 服务器/服务提供者 @@ -63,5 +64,31 @@ "deepseek-r1:70b" : "deepseek-r1:70b", "deepseek-r1:671b" : "deepseek-r1:671b" } + }, + //AI 服务器/服务提供者/AnythingLLM + {"id":"parameter.ai.provider.anythingllm", "parentId":"parameter.ai.provider", "order":200}, + //AI 服务器/服务提供者/AnythingLLM/api url + { + "id" :"parameter.ai.provider.anythingllm.apiUrl", + "parentId" :"parameter.ai.provider.anythingllm", + "code" :"parameter.ai.provider.anythingllm.apiUrl", + "defaultValue" :"http://localhost:3001", + "order" : 100 + }, + //AI 服务器/服务提供者/AnythingLLM/api 秘钥 + { + "id" :"parameter.ai.provider.anythingllm.apiKey", + "parentId" :"parameter.ai.provider.anythingllm", + "code" :"parameter.ai.provider.anythingllm.apiKey", + "defaultValue" :"", + "order" : 200 + }, + //AI 服务器/服务提供者/AnythingLLM/默认工作空间 + { + "id" :"parameter.ai.provider.anythingllm.defaultWorkspace", + "parentId" :"parameter.ai.provider.anythingllm", + "code" :"parameter.ai.provider.anythingllm.defaultWorkspace", + "defaultValue" :"", + "order" : 300 } ] diff --git a/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters.properties b/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters.properties index 11b92d1d..e34abe5c 100644 --- a/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters.properties +++ b/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters.properties @@ -3,10 +3,16 @@ parameter.ai.chat.enable=AI Chat Enable parameter.ai.chat.enable.options.enable=Enable parameter.ai.chat.enable.options.disable=Disable -parameter.ai.provider.default=Model Provider (default) +parameter.ai.provider.default=Service Provider (default) +parameter.ai.provider.default.options.anythingllm=Anything LLM parameter.ai.provider.default.options.ollama=Ollama -parameter.ai.provider=Model Providers +parameter.ai.provider=Service Providers parameter.ai.provider.ollama=Ollama parameter.ai.provider.ollama.apiUrl=Api URL -parameter.ai.provider.ollama.defaultModelName=Default Model Name \ No newline at end of file +parameter.ai.provider.ollama.defaultModelName=Default Model Name + +parameter.ai.provider.anythingllm=AnythingLLM +parameter.ai.provider.anythingllm.apiUrl=Api URL +parameter.ai.provider.anythingllm.apiKey=Api Key +parameter.ai.provider.anythingllm.defaultWorkspace=Default Workspace \ No newline at end of file diff --git a/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_tw_CN.properties b/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_tw_CN.properties index 755c59ec..9e2fac71 100644 --- a/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_tw_CN.properties +++ b/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_tw_CN.properties @@ -3,10 +3,16 @@ parameter.ai.chat.enable=\u662F\u5426\u958B\u555F\u667A\u80FD\u5C0D\u8A71 parameter.ai.chat.enable.options.enable=\u958B\u555F parameter.ai.chat.enable.options.disable=\u95DC\u9589 -parameter.ai.provider.default=\u9ED8\u8A8D\u6A21\u578B\u63D0\u4F9B\u5546 +parameter.ai.provider.default=\u9ED8\u8A8D\u670D\u52D9\u63D0\u4F9B\u5546 +parameter.ai.provider.default.options.anythingllm=Anything LLM parameter.ai.provider.default.options.ollama=Ollama -parameter.ai.provider=\u6A21\u578B\u63D0\u4F9B\u5546 +parameter.ai.provider=\u670D\u52D9\u63D0\u4F9B\u5546 parameter.ai.provider.ollama=Ollama parameter.ai.provider.ollama.apiUrl=Api URL -parameter.ai.provider.ollama.defaultModelName=\u9ED8\u8A8D\u6A21\u578B\u540D\u7A31 \ No newline at end of file +parameter.ai.provider.ollama.defaultModelName=\u9ED8\u8A8D\u6A21\u578B\u540D\u7A31 + +parameter.ai.provider.anythingllm=AnythingLLM +parameter.ai.provider.anythingllm.apiUrl=Api URL +parameter.ai.provider.anythingllm.apiKey=Api \u79D8\u9470 +parameter.ai.provider.anythingllm.defaultWorkspace=\u9ED8\u8A8D\u5DE5\u4F5C\u7A7A\u9593 \ No newline at end of file diff --git a/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_zh_CN.properties b/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_zh_CN.properties index 4cbc5b93..8565dd8c 100644 --- a/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_zh_CN.properties +++ b/io.sc.platform.ai/src/main/resources/io/sc/platform/ai/i18n/parameters_zh_CN.properties @@ -4,10 +4,16 @@ parameter.ai.chat.enable=\u662F\u5426\u5F00\u542F\u667A\u80FD\u5BF9\u8BDD parameter.ai.chat.enable.options.enable=\u5F00\u542F parameter.ai.chat.enable.options.disable=\u5173\u95ED -parameter.ai.provider.default=\u9ED8\u8BA4\u6A21\u578B\u63D0\u4F9B\u5546 +parameter.ai.provider.default=\u9ED8\u8BA4\u670D\u52A1\u63D0\u4F9B\u5546 +parameter.ai.provider.default.options.anythingllm=Anything LLM parameter.ai.provider.default.options.ollama=Ollama -parameter.ai.provider=\u6A21\u578B\u63D0\u4F9B\u5546 +parameter.ai.provider=\u670D\u52A1\u63D0\u4F9B\u5546 parameter.ai.provider.ollama=Ollama parameter.ai.provider.ollama.apiUrl=Api URL -parameter.ai.provider.ollama.defaultModelName=\u9ED8\u8BA4\u6A21\u578B\u540D\u79F0 \ No newline at end of file +parameter.ai.provider.ollama.defaultModelName=\u9ED8\u8BA4\u6A21\u578B\u540D\u79F0 + +parameter.ai.provider.anythingllm=AnythingLLM +parameter.ai.provider.anythingllm.apiUrl=Api URL +parameter.ai.provider.anythingllm.apiKey=Api \u79D8\u94A5 +parameter.ai.provider.anythingllm.defaultWorkspace=\u9ED8\u8BA4\u5DE5\u4F5C\u7A7A\u95F4 \ No newline at end of file diff --git a/io.sc.platform.core.frontend/src/views/testcase/ai/Ai.vue b/io.sc.platform.core.frontend/src/views/testcase/ai/Ai.vue index ab7628dd..7c165eee 100644 --- a/io.sc.platform.core.frontend/src/views/testcase/ai/Ai.vue +++ b/io.sc.platform.core.frontend/src/views/testcase/ai/Ai.vue @@ -99,7 +99,7 @@ const doSendMessage = async (message: string) => { }); // 准备发出请求 - const url = Environment.apiContextPath('/api/ai/ollama/chat'); + const url = Environment.apiContextPath('/api/ai/chat'); // 设置请求头 const headers = Fetch.buildHeaders(); if (!Fetch.isAuthorization(url)) { diff --git a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/criteria/impl/Or.java b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/criteria/impl/Or.java index ebc53876..372ef018 100644 --- a/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/criteria/impl/Or.java +++ b/io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/criteria/impl/Or.java @@ -20,6 +20,7 @@ public class Or extends Criteria { List predicates =new ArrayList<>(); for(Criteria _criteria : criteria){ _criteria.setConversionService(conversionService); + _criteria.setRepositories(repositories); predicates.add(_criteria.getPredicate(root, query, builder)); } return builder.or(predicates.toArray(new Predicate[]{})); diff --git a/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue b/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue index 416dc298..94aede6d 100644 --- a/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue +++ b/io.sc.platform.system.frontend/src/views/parameter/Parameter.vue @@ -193,6 +193,7 @@ const changeOptions = () => { const isExistsOptions = () => { const row = treeGridRef.value.getSelectedRow(); + console.log(row); if (row) { return row.options && Object.keys(row.options).length > 0; } diff --git a/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/controller/ParameterWebController.java b/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/controller/ParameterWebController.java index 362b8831..9ef4195c 100644 --- a/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/controller/ParameterWebController.java +++ b/io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/controller/ParameterWebController.java @@ -14,10 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @RestController("io.sc.platform.system.parameter.controller.ParameterWebController") @RequestMapping("api/system/parameter") @@ -27,30 +24,51 @@ public class ParameterWebController extends RestCrudController page =super.query(request, response, queryParameter); List vos =page.getContent(); if(vos!=null && !vos.isEmpty()){ - List parameters = PluginManager.getInstance().getParameters(); - if(parameters!=null && !parameters.isEmpty()){ - Map parameterMap =new HashMap<>(parameters.size()); - for(Parameter parameter : parameters){ - parameterMap.put(parameter.getCode(),parameter); - } - for(ParameterVo vo : vos){ - Parameter parameter =parameterMap.get(vo.getCode()); - if(parameter!=null) { - vo.setDefaultValue(parameter.getDefaultValue()); - if("parameter.system.homePage".equals(parameter.getCode())){ - Map homeMap =new LinkedHashMap<>(); - homeMap.put("/home","home.default"); - homeMap.putAll(PluginManager.getInstance().getFrontEndRouteHomeMap()); - vo.setOptions(homeMap); - }else { - if (parameter.getOptions() != null) { - vo.setOptions(parameter.getOptions()); - } - } - } - } + Map parameterMap =getParameterPlugins(); + for(ParameterVo vo : vos){ + Parameter parameter =parameterMap.get(vo.getCode()); + mergeProperties(vo,parameter); } } return page; } + + @Override + protected ParameterVo update(HttpServletRequest request, HttpServletResponse response, String s, ParameterEntity entity) throws Exception { + ParameterVo vo =super.update(request, response, s, entity); + if(vo!=null){ + Map parameterMap =getParameterPlugins(); + Parameter parameter =parameterMap.get(vo.getCode()); + mergeProperties(vo,parameter); + } + return vo; + } + + private Map getParameterPlugins(){ + List parameters = PluginManager.getInstance().getParameters(); + if(parameters!=null && !parameters.isEmpty()) { + Map parameterMap = new HashMap<>(parameters.size()); + for (Parameter parameter : parameters) { + parameterMap.put(parameter.getCode(), parameter); + } + return parameterMap; + } + return Collections.emptyMap(); + } + + private void mergeProperties(ParameterVo vo,Parameter parameter){ + if(parameter!=null) { + vo.setDefaultValue(parameter.getDefaultValue()); + if("parameter.system.homePage".equals(parameter.getCode())){ + Map homeMap =new LinkedHashMap<>(); + homeMap.put("/home","home.default"); + homeMap.putAll(PluginManager.getInstance().getFrontEndRouteHomeMap()); + vo.setOptions(homeMap); + }else { + if (parameter.getOptions() != null) { + vo.setOptions(parameter.getOptions()); + } + } + } + } }