diff --git a/pom.xml b/pom.xml index bfc5764..8552533 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,12 @@ spring-boot-starter-web + + cn.hutool + hutool-all + 5.8.0.M2 + + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionChunk.java b/src/main/java/xyz/wbsite/achat/chat/ChatCompletionChunk.java similarity index 99% rename from src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionChunk.java rename to src/main/java/xyz/wbsite/achat/chat/ChatCompletionChunk.java index bca4c3e..62dabdc 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionChunk.java +++ b/src/main/java/xyz/wbsite/achat/chat/ChatCompletionChunk.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import java.util.ArrayList; diff --git a/src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionRequest.java b/src/main/java/xyz/wbsite/achat/chat/ChatCompletionRequest.java similarity index 82% rename from src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionRequest.java rename to src/main/java/xyz/wbsite/achat/chat/ChatCompletionRequest.java index 2977a2e..26b9640 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionRequest.java +++ b/src/main/java/xyz/wbsite/achat/chat/ChatCompletionRequest.java @@ -1,4 +1,6 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; + +import xyz.wbsite.achat.chat.tool.Tool; import java.util.List; @@ -22,6 +24,9 @@ public class ChatCompletionRequest { private Double frequency_penalty; private Object logit_bias; private String user; + // 工具调用相关字段 + private List tools; + private String tool_choice; public String getModel() { return model; @@ -118,4 +123,20 @@ public class ChatCompletionRequest { public void setUser(String user) { this.user = user; } + + public List getTools() { + return tools; + } + + public void setTools(List tools) { + this.tools = tools; + } + + public String getTool_choice() { + return tool_choice; + } + + public void setTool_choice(String tool_choice) { + this.tool_choice = tool_choice; + } } \ No newline at end of file diff --git a/src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionResponse.java b/src/main/java/xyz/wbsite/achat/chat/ChatCompletionResponse.java similarity index 99% rename from src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionResponse.java rename to src/main/java/xyz/wbsite/achat/chat/ChatCompletionResponse.java index 738668d..e8e0fdc 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/ChatCompletionResponse.java +++ b/src/main/java/xyz/wbsite/achat/chat/ChatCompletionResponse.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/chat/ChatService.java b/src/main/java/xyz/wbsite/achat/chat/ChatService.java similarity index 70% rename from src/main/java/xyz/wbsite/achat/core/chat/ChatService.java rename to src/main/java/xyz/wbsite/achat/chat/ChatService.java index 17fdf73..03314b3 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/ChatService.java +++ b/src/main/java/xyz/wbsite/achat/chat/ChatService.java @@ -1,8 +1,8 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import xyz.wbsite.achat.core.embed.EmbeddingsRequest; -import xyz.wbsite.achat.core.embed.EmbeddingsResponse; +import xyz.wbsite.achat.embed.EmbeddingsRequest; +import xyz.wbsite.achat.embed.EmbeddingsResponse; public interface ChatService { diff --git a/src/main/java/xyz/wbsite/achat/core/chat/ChatServiceSampleImpl.java b/src/main/java/xyz/wbsite/achat/chat/ChatServiceSampleImpl.java similarity index 97% rename from src/main/java/xyz/wbsite/achat/core/chat/ChatServiceSampleImpl.java rename to src/main/java/xyz/wbsite/achat/chat/ChatServiceSampleImpl.java index fc5552e..d6e5395 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/ChatServiceSampleImpl.java +++ b/src/main/java/xyz/wbsite/achat/chat/ChatServiceSampleImpl.java @@ -1,9 +1,9 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import xyz.wbsite.achat.core.embed.EmbeddingsRequest; -import xyz.wbsite.achat.core.embed.EmbeddingsResponse; +import xyz.wbsite.achat.embed.EmbeddingsRequest; +import xyz.wbsite.achat.embed.EmbeddingsResponse; import javax.annotation.Resource; import java.util.Collections; diff --git a/src/main/java/xyz/wbsite/achat/core/chat/CompletionRequest.java b/src/main/java/xyz/wbsite/achat/chat/CompletionRequest.java similarity index 96% rename from src/main/java/xyz/wbsite/achat/core/chat/CompletionRequest.java rename to src/main/java/xyz/wbsite/achat/chat/CompletionRequest.java index 939c369..6855967 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/CompletionRequest.java +++ b/src/main/java/xyz/wbsite/achat/chat/CompletionRequest.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; /** * 文本补全请求 diff --git a/src/main/java/xyz/wbsite/achat/core/chat/CompletionResponse.java b/src/main/java/xyz/wbsite/achat/chat/CompletionResponse.java similarity index 99% rename from src/main/java/xyz/wbsite/achat/core/chat/CompletionResponse.java rename to src/main/java/xyz/wbsite/achat/chat/CompletionResponse.java index 23318ca..a10882e 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/CompletionResponse.java +++ b/src/main/java/xyz/wbsite/achat/chat/CompletionResponse.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/chat/Message.java b/src/main/java/xyz/wbsite/achat/chat/Message.java similarity index 52% rename from src/main/java/xyz/wbsite/achat/core/chat/Message.java rename to src/main/java/xyz/wbsite/achat/chat/Message.java index 6da9f16..24e09c8 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/Message.java +++ b/src/main/java/xyz/wbsite/achat/chat/Message.java @@ -1,4 +1,9 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; + +import xyz.wbsite.achat.chat.tool.ToolCall; + +import java.util.ArrayList; +import java.util.List; /** * 消息 @@ -11,6 +16,8 @@ public class Message { private Role role; private String content; private String name; + private List tool_calls; + private String tool_call_id; public Message() { } @@ -19,6 +26,8 @@ public class Message { this.role = builder.role; this.content = builder.content; this.name = builder.name; + this.tool_calls = builder.tool_calls; + this.tool_call_id = builder.tool_call_id; } public Role getRole() { @@ -45,7 +54,22 @@ public class Message { this.name = name; } - // 静态builder方法,返回Builder实例 + public List getTool_calls() { + return tool_calls; + } + + public void setTool_calls(List function_call) { + this.tool_calls = function_call; + } + + public String getTool_call_id() { + return tool_call_id; + } + + public void setTool_call_id(String tool_call_id) { + this.tool_call_id = tool_call_id; + } + public static Builder builder() { return new Builder(); } @@ -54,6 +78,8 @@ public class Message { private Role role; private String content; private String name; + private List tool_calls = new ArrayList<>(); + private String tool_call_id; public Builder role(Role role) { this.role = role; @@ -70,7 +96,21 @@ public class Message { return this; } - // 构建Message对象 + public Builder tool_calls(List tool_calls) { + this.tool_calls = tool_calls; + return this; + } + + public Builder tool_call_id(String tool_call_id) { + this.tool_call_id = tool_call_id; + return this; + } + + public Builder withFunctionCall(java.util.function.Consumer> choicesConsumer) { + choicesConsumer.accept(this.tool_calls); + return this; + } + public Message build() { return new Message(this); } diff --git a/src/main/java/xyz/wbsite/achat/core/chat/Role.java b/src/main/java/xyz/wbsite/achat/chat/Role.java similarity index 85% rename from src/main/java/xyz/wbsite/achat/core/chat/Role.java rename to src/main/java/xyz/wbsite/achat/chat/Role.java index af6ae0e..c6e643a 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/Role.java +++ b/src/main/java/xyz/wbsite/achat/chat/Role.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import com.fasterxml.jackson.annotation.JsonValue; @@ -23,13 +23,11 @@ public enum Role { this.value = value; } - // 序列化时返回小写字符串 @JsonValue public String getValue() { return value; } - // 反序列化时根据字符串匹配枚举 public static Role fromValue(String value) { for (Role role : Role.values()) { if (role.value.equalsIgnoreCase(value)) { @@ -38,4 +36,9 @@ public enum Role { } throw new IllegalArgumentException("Invalid Role value: " + value); } + + @Override + public String toString() { + return this.value; + } } diff --git a/src/main/java/xyz/wbsite/achat/core/chat/Status.java b/src/main/java/xyz/wbsite/achat/chat/Status.java similarity index 86% rename from src/main/java/xyz/wbsite/achat/core/chat/Status.java rename to src/main/java/xyz/wbsite/achat/chat/Status.java index 2fbe72e..e08e75a 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/Status.java +++ b/src/main/java/xyz/wbsite/achat/chat/Status.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; /** * 消息状态枚举 diff --git a/src/main/java/xyz/wbsite/achat/core/chat/StreamEmitter.java b/src/main/java/xyz/wbsite/achat/chat/StreamEmitter.java similarity index 99% rename from src/main/java/xyz/wbsite/achat/core/chat/StreamEmitter.java rename to src/main/java/xyz/wbsite/achat/chat/StreamEmitter.java index 472c6ce..f8f8a33 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/StreamEmitter.java +++ b/src/main/java/xyz/wbsite/achat/chat/StreamEmitter.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; import org.springframework.util.StringUtils; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; diff --git a/src/main/java/xyz/wbsite/achat/core/chat/Usage.java b/src/main/java/xyz/wbsite/achat/chat/Usage.java similarity index 98% rename from src/main/java/xyz/wbsite/achat/core/chat/Usage.java rename to src/main/java/xyz/wbsite/achat/chat/Usage.java index 447d54c..7786355 100644 --- a/src/main/java/xyz/wbsite/achat/core/chat/Usage.java +++ b/src/main/java/xyz/wbsite/achat/chat/Usage.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.chat; +package xyz.wbsite.achat.chat; /** * 令牌使用统计 diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/Arg.java b/src/main/java/xyz/wbsite/achat/chat/tool/Arg.java new file mode 100644 index 0000000..a464dc6 --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/Arg.java @@ -0,0 +1,37 @@ +package xyz.wbsite.achat.chat.tool; + +/** + * 参数 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Arg { + + /** + * 参数类型 + */ + private String type; + + /** + * 参数描述 + */ + private String description; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/Function.java b/src/main/java/xyz/wbsite/achat/chat/tool/Function.java new file mode 100644 index 0000000..f3fbd0e --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/Function.java @@ -0,0 +1,77 @@ +package xyz.wbsite.achat.chat.tool; + + +/** + * 工具函数定义 - 符合OpenAI官方API规范 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Function { + private String name; + private String description; + private Parameters parameters; + + public Function() { + } + + private Function(Builder builder) { + this.name = builder.name; + this.description = builder.description; + this.parameters = builder.parameters; + } + + public static Builder builder() { + return new Builder(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Parameters getParameters() { + return parameters; + } + + public void setParameters(Parameters parameters) { + this.parameters = parameters; + } + + public static class Builder { + private String name; + private String description; + private Parameters parameters; + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder parameters(Parameters parameters) { + this.parameters = parameters; + return this; + } + + public Function build() { + return new Function(this); + } + } +} \ No newline at end of file diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/FunctionCall.java b/src/main/java/xyz/wbsite/achat/chat/tool/FunctionCall.java new file mode 100644 index 0000000..c15d9f8 --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/FunctionCall.java @@ -0,0 +1,70 @@ +package xyz.wbsite.achat.chat.tool; + +/** + * 函数调用 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class FunctionCall { + + /** + * 函数名称 + */ + private String name; + + /** + * 函数参数 + *

+ * 例如:{\"arg0\":\"泰州\"} + */ + private String arguments; + + public FunctionCall() { + } + + private FunctionCall(Builder builder) { + this.name = builder.name; + this.arguments = builder.arguments; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getArguments() { + return arguments; + } + + public void setArguments(String arguments) { + this.arguments = arguments; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private String name; + private String arguments; + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder arguments(String arguments) { + this.arguments = arguments; + return this; + } + + public FunctionCall build() { + return new FunctionCall(this); + } + } +} diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/Parameters.java b/src/main/java/xyz/wbsite/achat/chat/tool/Parameters.java new file mode 100644 index 0000000..ab81de0 --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/Parameters.java @@ -0,0 +1,51 @@ +package xyz.wbsite.achat.chat.tool; + +import java.util.List; + +/** + * 参数 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ + +/** + * 参数 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Parameters { + + private String type; + + private List required; + + private Properties properties; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getRequired() { + return required; + } + + public void setRequired(List required) { + this.required = required; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } +} diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/Properties.java b/src/main/java/xyz/wbsite/achat/chat/tool/Properties.java new file mode 100644 index 0000000..47e9f01 --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/Properties.java @@ -0,0 +1,15 @@ +package xyz.wbsite.achat.chat.tool; + + +import java.util.TreeMap; + +/** + * 参数 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Properties extends TreeMap { + +} diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/Tool.java b/src/main/java/xyz/wbsite/achat/chat/tool/Tool.java new file mode 100644 index 0000000..9799797 --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/Tool.java @@ -0,0 +1,60 @@ +package xyz.wbsite.achat.chat.tool; + +/** + * 工具定义 - 符合OpenAI官方API规范 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class Tool { + private String type; + private Function function; + + public Tool() { + } + + private Tool(Builder builder) { + this.type = builder.type; + this.function = builder.function; + } + + public static Builder builder() { + return new Builder(); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Function getFunction() { + return function; + } + + public void setFunction(Function function) { + this.function = function; + } + + public static class Builder { + private String type; + private Function function; + + public Builder type(String type) { + this.type = type; + return this; + } + + public Builder function(Function function) { + this.function = function; + return this; + } + + public Tool build() { + return new Tool(this); + } + } +} \ No newline at end of file diff --git a/src/main/java/xyz/wbsite/achat/chat/tool/ToolCall.java b/src/main/java/xyz/wbsite/achat/chat/tool/ToolCall.java new file mode 100644 index 0000000..6931c46 --- /dev/null +++ b/src/main/java/xyz/wbsite/achat/chat/tool/ToolCall.java @@ -0,0 +1,83 @@ +package xyz.wbsite.achat.chat.tool; + +import cn.hutool.core.util.RandomUtil; + +/** + * 工具调用请求 - 符合OpenAI官方API规范 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class ToolCall { + private final String id = "call_" + RandomUtil.randomNumbers(8); + private int index; + private String type; + private FunctionCall function; + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public FunctionCall getFunction() { + return function; + } + + public void setFunction(FunctionCall function) { + this.function = function; + } + + private ToolCall(String id, int index, String type, FunctionCall function) { + this.index = index; + this.type = type; + this.function = function; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private String id; + private int index; + private String type; + private FunctionCall function; + + // 链式设置id(可选,不设置则使用默认值) + public Builder id(String id) { + this.id = id; + return this; + } + + public Builder index(int index) { + this.index = index; + return this; + } + + public Builder type(String type) { + this.type = type; + return this; + } + + public Builder function(FunctionCall function) { + this.function = function; + return this; + } + + public ToolCall build() { + return new ToolCall(id, index, type, function); + } + } +} diff --git a/src/main/java/xyz/wbsite/achat/config/WebConfig.java b/src/main/java/xyz/wbsite/achat/config/WebConfig.java deleted file mode 100644 index 4a60dfb..0000000 --- a/src/main/java/xyz/wbsite/achat/config/WebConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package xyz.wbsite.achat.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * Web相关配置(跨域配置,序列化配置). - * - * @author wangbing - * @version 0.0.1 - * @since 1.8 - */ -@Configuration -public class WebConfig implements WebMvcConfigurer { - - /** - * 跨域配置 - * - * @param registry - */ - @Override - public void addCorsMappings(CorsRegistry registry) { - // 注意,如果授权认认证未通过会直接返回,此跨域配置则不会生效,前端仍然会提示跨域 - registry.addMapping("/**") - //允许的域,不要写*,否则cookie就无法使用了 - .allowedOriginPatterns("http://localhost:5173") - .allowedHeaders("*") - //是否发送Cookie - .allowCredentials(true) - .allowedMethods("GET", "POST", "DELETE", "PUT") - .exposedHeaders("*") - .maxAge(3600); - } -} diff --git a/src/main/java/xyz/wbsite/achat/core/embed/EmbeddingsRequest.java b/src/main/java/xyz/wbsite/achat/embed/EmbeddingsRequest.java similarity index 97% rename from src/main/java/xyz/wbsite/achat/core/embed/EmbeddingsRequest.java rename to src/main/java/xyz/wbsite/achat/embed/EmbeddingsRequest.java index 630eddb..099cc86 100644 --- a/src/main/java/xyz/wbsite/achat/core/embed/EmbeddingsRequest.java +++ b/src/main/java/xyz/wbsite/achat/embed/EmbeddingsRequest.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.embed; +package xyz.wbsite.achat.embed; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/embed/EmbeddingsResponse.java b/src/main/java/xyz/wbsite/achat/embed/EmbeddingsResponse.java similarity index 98% rename from src/main/java/xyz/wbsite/achat/core/embed/EmbeddingsResponse.java rename to src/main/java/xyz/wbsite/achat/embed/EmbeddingsResponse.java index 38ba9c8..c931f6f 100644 --- a/src/main/java/xyz/wbsite/achat/core/embed/EmbeddingsResponse.java +++ b/src/main/java/xyz/wbsite/achat/embed/EmbeddingsResponse.java @@ -1,6 +1,6 @@ -package xyz.wbsite.achat.core.embed; +package xyz.wbsite.achat.embed; -import xyz.wbsite.achat.core.chat.Usage; +import xyz.wbsite.achat.chat.Usage; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/model/Model.java b/src/main/java/xyz/wbsite/achat/model/Model.java similarity index 98% rename from src/main/java/xyz/wbsite/achat/core/model/Model.java rename to src/main/java/xyz/wbsite/achat/model/Model.java index d77d74d..7792173 100644 --- a/src/main/java/xyz/wbsite/achat/core/model/Model.java +++ b/src/main/java/xyz/wbsite/achat/model/Model.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.model; +package xyz.wbsite.achat.model; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/model/ModelListResponse.java b/src/main/java/xyz/wbsite/achat/model/ModelListResponse.java similarity index 92% rename from src/main/java/xyz/wbsite/achat/core/model/ModelListResponse.java rename to src/main/java/xyz/wbsite/achat/model/ModelListResponse.java index 9024d8f..ae7a3ff 100644 --- a/src/main/java/xyz/wbsite/achat/core/model/ModelListResponse.java +++ b/src/main/java/xyz/wbsite/achat/model/ModelListResponse.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.model; +package xyz.wbsite.achat.model; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/session/Message.java b/src/main/java/xyz/wbsite/achat/session/Message.java similarity index 81% rename from src/main/java/xyz/wbsite/achat/core/session/Message.java rename to src/main/java/xyz/wbsite/achat/session/Message.java index b1f38fb..abdffec 100644 --- a/src/main/java/xyz/wbsite/achat/core/session/Message.java +++ b/src/main/java/xyz/wbsite/achat/session/Message.java @@ -1,9 +1,9 @@ -package xyz.wbsite.achat.core.session; +package xyz.wbsite.achat.session; /** * */ -public class Message extends xyz.wbsite.achat.core.chat.Message { +public class Message extends xyz.wbsite.achat.chat.Message { private String id; private String uid; private String sid; diff --git a/src/main/java/xyz/wbsite/achat/core/session/Result.java b/src/main/java/xyz/wbsite/achat/session/Result.java similarity index 98% rename from src/main/java/xyz/wbsite/achat/core/session/Result.java rename to src/main/java/xyz/wbsite/achat/session/Result.java index 2c1cb04..d562b63 100644 --- a/src/main/java/xyz/wbsite/achat/core/session/Result.java +++ b/src/main/java/xyz/wbsite/achat/session/Result.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.session; +package xyz.wbsite.achat.session; /** * 接口响应结果基类 diff --git a/src/main/java/xyz/wbsite/achat/core/session/Session.java b/src/main/java/xyz/wbsite/achat/session/Session.java similarity index 98% rename from src/main/java/xyz/wbsite/achat/core/session/Session.java rename to src/main/java/xyz/wbsite/achat/session/Session.java index cde66ff..bb4dcc9 100644 --- a/src/main/java/xyz/wbsite/achat/core/session/Session.java +++ b/src/main/java/xyz/wbsite/achat/session/Session.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.session; +package xyz.wbsite.achat.session; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/session/SessionService.java b/src/main/java/xyz/wbsite/achat/session/SessionService.java similarity index 92% rename from src/main/java/xyz/wbsite/achat/core/session/SessionService.java rename to src/main/java/xyz/wbsite/achat/session/SessionService.java index 93d7fd5..ff10b6d 100644 --- a/src/main/java/xyz/wbsite/achat/core/session/SessionService.java +++ b/src/main/java/xyz/wbsite/achat/session/SessionService.java @@ -1,6 +1,4 @@ -package xyz.wbsite.achat.core.session; - -import xyz.wbsite.achat.core.chat.Message; +package xyz.wbsite.achat.session; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/core/session/SessionServiceMemoryImpl.java b/src/main/java/xyz/wbsite/achat/session/SessionServiceMemoryImpl.java similarity index 99% rename from src/main/java/xyz/wbsite/achat/core/session/SessionServiceMemoryImpl.java rename to src/main/java/xyz/wbsite/achat/session/SessionServiceMemoryImpl.java index 7057d1d..b436228 100644 --- a/src/main/java/xyz/wbsite/achat/core/session/SessionServiceMemoryImpl.java +++ b/src/main/java/xyz/wbsite/achat/session/SessionServiceMemoryImpl.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.core.session; +package xyz.wbsite.achat.session; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/xyz/wbsite/achat/config/ChatConfig.java b/src/main/java/xyz/wbsite/config/ChatConfig.java similarity index 68% rename from src/main/java/xyz/wbsite/achat/config/ChatConfig.java rename to src/main/java/xyz/wbsite/config/ChatConfig.java index 854bb68..e582bc7 100644 --- a/src/main/java/xyz/wbsite/achat/config/ChatConfig.java +++ b/src/main/java/xyz/wbsite/config/ChatConfig.java @@ -1,12 +1,12 @@ -package xyz.wbsite.achat.config; +package xyz.wbsite.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import xyz.wbsite.achat.core.chat.ChatService; -import xyz.wbsite.achat.core.chat.ChatServiceSampleImpl; -import xyz.wbsite.achat.core.session.SessionService; -import xyz.wbsite.achat.core.session.SessionServiceMemoryImpl; +import xyz.wbsite.achat.chat.ChatService; +import xyz.wbsite.achat.chat.ChatServiceSampleImpl; +import xyz.wbsite.achat.session.SessionService; +import xyz.wbsite.achat.session.SessionServiceMemoryImpl; /** * 对话配置 diff --git a/src/main/java/xyz/wbsite/achat/config/PoolConfig.java b/src/main/java/xyz/wbsite/config/PoolConfig.java similarity index 98% rename from src/main/java/xyz/wbsite/achat/config/PoolConfig.java rename to src/main/java/xyz/wbsite/config/PoolConfig.java index ba79bb5..8704b16 100644 --- a/src/main/java/xyz/wbsite/achat/config/PoolConfig.java +++ b/src/main/java/xyz/wbsite/config/PoolConfig.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat.config; +package xyz.wbsite.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/xyz/wbsite/config/WebConfig.java b/src/main/java/xyz/wbsite/config/WebConfig.java new file mode 100644 index 0000000..93aa6c7 --- /dev/null +++ b/src/main/java/xyz/wbsite/config/WebConfig.java @@ -0,0 +1,82 @@ +package xyz.wbsite.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * Web相关配置(跨域配置,序列化配置). + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Value("${cfg.api.key}") + private String key; + + /** + * 跨域配置 + * + * @param registry + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + // 注意,如果授权认认证未通过会直接返回,此跨域配置则不会生效,前端仍然会提示跨域 + registry.addMapping("/**") + //允许的域,不要写*,否则cookie就无法使用了 + .allowedOriginPatterns("http://localhost:5173") + .allowedHeaders("*") + //是否发送Cookie + .allowCredentials(true) + .allowedMethods("GET", "POST", "DELETE", "PUT") + .exposedHeaders("*") + .maxAge(3600); + } + + + + /** + * 增加全局拦截器 + * + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 自定义拦截器 + InterceptorRegistration interceptorRegistration = registry.addInterceptor(new HandlerInterceptor() { + //处理器运行之前执行 + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String authorization = request.getHeader("authorization"); + if (authorization == null || !authorization.equals("Bearer " + key)){ + response.setHeader("Content-Type", MediaType.APPLICATION_JSON.toString()); + try { + PrintWriter writer = response.getWriter(); + writer.print("{\"error\":\"Incorrect API key\",\"code\":401}"); + writer.flush(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + return true; + } + }); + + interceptorRegistration.addPathPatterns("/**"); + } +} diff --git a/src/main/java/xyz/wbsite/achat/HelloController.java b/src/main/java/xyz/wbsite/openai/HelloController.java similarity index 93% rename from src/main/java/xyz/wbsite/achat/HelloController.java rename to src/main/java/xyz/wbsite/openai/HelloController.java index c46ac18..c31310e 100644 --- a/src/main/java/xyz/wbsite/achat/HelloController.java +++ b/src/main/java/xyz/wbsite/openai/HelloController.java @@ -1,4 +1,4 @@ -package xyz.wbsite.achat; +package xyz.wbsite.openai; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/xyz/wbsite/achat/OpenAiController.java b/src/main/java/xyz/wbsite/openai/OpenAiController.java similarity index 75% rename from src/main/java/xyz/wbsite/achat/OpenAiController.java rename to src/main/java/xyz/wbsite/openai/OpenAiController.java index 0bc004a..9308b9a 100644 --- a/src/main/java/xyz/wbsite/achat/OpenAiController.java +++ b/src/main/java/xyz/wbsite/openai/OpenAiController.java @@ -1,18 +1,19 @@ -package xyz.wbsite.achat; +package xyz.wbsite.openai; +import cn.hutool.json.JSONUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import xyz.wbsite.achat.core.chat.ChatCompletionRequest; -import xyz.wbsite.achat.core.chat.CompletionRequest; -import xyz.wbsite.achat.core.chat.CompletionResponse; -import xyz.wbsite.achat.core.embed.EmbeddingsRequest; -import xyz.wbsite.achat.core.embed.EmbeddingsResponse; -import xyz.wbsite.achat.core.model.ModelListResponse; -import xyz.wbsite.achat.core.chat.ChatService; +import xyz.wbsite.achat.chat.ChatCompletionRequest; +import xyz.wbsite.achat.chat.ChatService; +import xyz.wbsite.achat.chat.CompletionRequest; +import xyz.wbsite.achat.chat.CompletionResponse; +import xyz.wbsite.achat.embed.EmbeddingsRequest; +import xyz.wbsite.achat.embed.EmbeddingsResponse; +import xyz.wbsite.achat.model.ModelListResponse; import javax.annotation.Resource; @@ -72,7 +73,12 @@ public class OpenAiController { * POST /v1/chat/completions */ @PostMapping("/chat/completions") - public Object createChatCompletion(@RequestBody ChatCompletionRequest request) { + public Object createChatCompletion(@RequestBody String ss) { + System.out.println("原始请求"); + System.out.println(ss); + ChatCompletionRequest request = JSONUtil.toBean(ss, ChatCompletionRequest.class); + System.out.println("转换后请求"); + System.out.println(JSONUtil.toJsonStr(request)); if (Boolean.TRUE.equals(request.getStream())) { // 流式响应处理 return chatService.streamChat(request); diff --git a/src/main/java/xyz/wbsite/achat/SessionController.java b/src/main/java/xyz/wbsite/openai/SessionController.java similarity index 93% rename from src/main/java/xyz/wbsite/achat/SessionController.java rename to src/main/java/xyz/wbsite/openai/SessionController.java index a216028..0c4f1f0 100644 --- a/src/main/java/xyz/wbsite/achat/SessionController.java +++ b/src/main/java/xyz/wbsite/openai/SessionController.java @@ -1,13 +1,13 @@ -package xyz.wbsite.achat; +package xyz.wbsite.openai; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; -import xyz.wbsite.achat.core.session.Result; -import xyz.wbsite.achat.core.session.Session; -import xyz.wbsite.achat.core.session.SessionService; +import xyz.wbsite.achat.session.Result; +import xyz.wbsite.achat.session.Session; +import xyz.wbsite.achat.session.SessionService; import javax.annotation.Resource; import java.util.List; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 132a9e5..eb047aa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,3 @@ server.port=8080 spring.application.name=achat +cfg.api.key=qazwsxedc741852963