diff --git a/api/src/main/java/com/theokanning/openai/assistants/run_step/StepDetails.java b/api/src/main/java/com/theokanning/openai/assistants/run_step/StepDetails.java index 646f2bf..f12b5d1 100644 --- a/api/src/main/java/com/theokanning/openai/assistants/run_step/StepDetails.java +++ b/api/src/main/java/com/theokanning/openai/assistants/run_step/StepDetails.java @@ -2,8 +2,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.theokanning.openai.assistants.run.MessageCreation; import com.theokanning.openai.assistants.run.ToolCall; import lombok.AllArgsConstructor; @@ -18,8 +16,6 @@ @NoArgsConstructor @AllArgsConstructor public class StepDetails { - - /** * message_creation/tool_calls */ @@ -33,11 +29,4 @@ public class StepDetails { @JsonInclude(JsonInclude.Include.NON_NULL) private List toolCalls; - public String toPrettyString() { - try { - return new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } } diff --git a/api/src/main/java/com/theokanning/openai/completion/chat/ChatFunctionCallArgumentsSerializerAndDeserializer.java b/api/src/main/java/com/theokanning/openai/completion/chat/ChatFunctionCallArgumentsSerializerAndDeserializer.java index 960a4c5..5b86971 100644 --- a/api/src/main/java/com/theokanning/openai/completion/chat/ChatFunctionCallArgumentsSerializerAndDeserializer.java +++ b/api/src/main/java/com/theokanning/openai/completion/chat/ChatFunctionCallArgumentsSerializerAndDeserializer.java @@ -4,12 +4,13 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.node.JsonNodeType; import com.fasterxml.jackson.databind.node.TextNode; +import com.theokanning.openai.utils.JsonUtil; import java.io.IOException; public class ChatFunctionCallArgumentsSerializerAndDeserializer { - private final static ObjectMapper MAPPER = new ObjectMapper(); + private final static ObjectMapper MAPPER = JsonUtil.getInstance(); private ChatFunctionCallArgumentsSerializerAndDeserializer() { } @@ -30,7 +31,6 @@ public void serialize(JsonNode value, JsonGenerator gen, SerializerProvider seri } public static class Deserializer extends JsonDeserializer { - private Deserializer() { } @@ -46,26 +46,20 @@ public JsonNode deserialize(JsonParser p, DeserializationContext ctxt) throws IO json = MAPPER.writeValueAsString(json); } + JsonNode node = null; try { - JsonNode node = null; - try { - node = MAPPER.readTree(json); - } catch (JsonParseException ignored) { - } - if (node == null || node.getNodeType() == JsonNodeType.MISSING) { - node = MAPPER.readTree(p); - } - return node; - } catch (Exception ex) { - ex.printStackTrace(); - return null; + node = MAPPER.readTree(json); + } catch (JsonParseException ignored) { + } + if (node == null || node.getNodeType() == JsonNodeType.MISSING) { + node = MAPPER.readTree(p); } + return node; } private boolean isValidJson(String jsonString) { - ObjectMapper objectMapper = new ObjectMapper(); try { - JsonNode tree = objectMapper.readTree(jsonString); + JsonNode tree = MAPPER.readTree(jsonString); return tree != null && (tree.isObject() || tree.isArray()); } catch (JsonProcessingException e) { return false; diff --git a/api/src/main/java/com/theokanning/openai/function/FunctionExecutorManager.java b/api/src/main/java/com/theokanning/openai/function/FunctionExecutorManager.java index 8e10c68..4fc46f9 100644 --- a/api/src/main/java/com/theokanning/openai/function/FunctionExecutorManager.java +++ b/api/src/main/java/com/theokanning/openai/function/FunctionExecutorManager.java @@ -5,6 +5,7 @@ import com.theokanning.openai.assistants.run.SubmitToolOutputRequestItem; import com.theokanning.openai.completion.chat.FunctionMessage; import com.theokanning.openai.completion.chat.ToolMessage; +import com.theokanning.openai.utils.JsonUtil; import lombok.Getter; import java.util.*; @@ -24,11 +25,11 @@ public class FunctionExecutorManager { private final ExecutorService executorService; public FunctionExecutorManager() { - this(new ObjectMapper(), Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), Collections.emptyList()); + this(JsonUtil.getInstance(), Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), Collections.emptyList()); } public FunctionExecutorManager(List functionDefinitionList) { - this(new ObjectMapper(), Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), functionDefinitionList); + this(JsonUtil.getInstance(), Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), functionDefinitionList); } public FunctionExecutorManager(ObjectMapper mapper, ExecutorService executorService) { diff --git a/api/src/main/java/com/theokanning/openai/function/FunctionParametersSerializer.java b/api/src/main/java/com/theokanning/openai/function/FunctionParametersSerializer.java index 4f23770..93afeac 100644 --- a/api/src/main/java/com/theokanning/openai/function/FunctionParametersSerializer.java +++ b/api/src/main/java/com/theokanning/openai/function/FunctionParametersSerializer.java @@ -2,19 +2,18 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.node.ObjectNode; import com.kjetland.jackson.jsonSchema.JsonSchemaConfig; import com.kjetland.jackson.jsonSchema.JsonSchemaGenerator; +import com.theokanning.openai.utils.JsonUtil; import java.io.IOException; public class FunctionParametersSerializer extends JsonSerializer { - - private final ObjectMapper mapper = new ObjectMapper(); private final JsonSchemaConfig config = JsonSchemaConfig.vanillaJsonSchemaDraft4(); - private final JsonSchemaGenerator jsonSchemaGenerator = new JsonSchemaGenerator(mapper, config); + + private final JsonSchemaGenerator jsonSchemaGenerator = new JsonSchemaGenerator(JsonUtil.getInstance(), config); @Override public void serialize(FunctionDefinition value, JsonGenerator gen, SerializerProvider serializers) throws IOException { @@ -27,10 +26,10 @@ public void serialize(FunctionDefinition value, JsonGenerator gen, SerializerPro parameterSchema.remove("$schema"); parameterSchema.remove("title"); parameterSchema.remove("additionalProperties"); - gen.writeRawValue(mapper.writeValueAsString(parameterSchema)); + gen.writeRawValue(JsonUtil.writeValueAsString(parameterSchema)); } else { gen.writeFieldName("parameters"); - gen.writeRawValue(mapper.writeValueAsString(value.getParametersDefinition())); + gen.writeRawValue(JsonUtil.writeValueAsString(value.getParametersDefinition())); } gen.writeEndObject(); } diff --git a/api/src/main/java/com/theokanning/openai/utils/JsonUtil.java b/api/src/main/java/com/theokanning/openai/utils/JsonUtil.java new file mode 100644 index 0000000..3ef2d5a --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/utils/JsonUtil.java @@ -0,0 +1,38 @@ +package com.theokanning.openai.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * @author LiangTao + * @date 2024年05月24 15:02 + **/ +public class JsonUtil { + private static final ObjectMapper mapper = ObjectMapperHolder.mapper; + + public static ObjectMapper getInstance() { + return mapper; + } + + public static String writeValueAsString(Object value) { + try { + return mapper.writeValueAsString(value); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static T readValue(String content, Class valueType) { + try { + return mapper.readValue(content, valueType); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + private static class ObjectMapperHolder { + private static final ObjectMapper mapper = new ObjectMapper(); + } + + +} diff --git a/service/src/main/java/com/theokanning/openai/service/ChatFunctionParametersSerializer.java b/service/src/main/java/com/theokanning/openai/service/ChatFunctionParametersSerializer.java index 5f340c7..e512351 100644 --- a/service/src/main/java/com/theokanning/openai/service/ChatFunctionParametersSerializer.java +++ b/service/src/main/java/com/theokanning/openai/service/ChatFunctionParametersSerializer.java @@ -7,13 +7,14 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.kjetland.jackson.jsonSchema.JsonSchemaConfig; import com.kjetland.jackson.jsonSchema.JsonSchemaGenerator; +import com.theokanning.openai.utils.JsonUtil; import java.io.IOException; @Deprecated public class ChatFunctionParametersSerializer extends JsonSerializer> { - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = JsonUtil.getInstance(); private final JsonSchemaConfig config = JsonSchemaConfig.vanillaJsonSchemaDraft4(); private final JsonSchemaGenerator jsonSchemaGenerator = new JsonSchemaGenerator(mapper, config); diff --git a/service/src/main/java/com/theokanning/openai/service/FunctionExecutor.java b/service/src/main/java/com/theokanning/openai/service/FunctionExecutor.java index 6e8cb5b..a2c1a5e 100644 --- a/service/src/main/java/com/theokanning/openai/service/FunctionExecutor.java +++ b/service/src/main/java/com/theokanning/openai/service/FunctionExecutor.java @@ -10,6 +10,7 @@ import com.theokanning.openai.completion.chat.ChatFunctionCall; import com.theokanning.openai.completion.chat.FunctionMessage; import com.theokanning.openai.completion.chat.ToolMessage; +import com.theokanning.openai.utils.JsonUtil; import java.util.*; @@ -20,7 +21,7 @@ @Deprecated public class FunctionExecutor { - private ObjectMapper MAPPER = new ObjectMapper(); + private ObjectMapper MAPPER = JsonUtil.getInstance(); private final Map FUNCTIONS = new HashMap<>(); public FunctionExecutor(List functions) { diff --git a/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantSSE.java b/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantSSE.java index 2614969..a54118b 100644 --- a/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantSSE.java +++ b/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantSSE.java @@ -1,8 +1,7 @@ package com.theokanning.openai.service.assistant_stream; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.theokanning.openai.assistants.StreamEvent; +import com.theokanning.openai.utils.JsonUtil; import lombok.Getter; /** @@ -14,9 +13,6 @@ public class AssistantSSE { private StreamEvent event; private String data; - private static final ObjectMapper mapper = new ObjectMapper(); - - public AssistantSSE(StreamEvent event, String data) { this.event = event; this.data = data; @@ -28,11 +24,7 @@ public boolean isDone() { } public T getPojo() { - try { - return (T) mapper.readValue(data, event.dataClass); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + return (T) JsonUtil.readValue(data, event.dataClass); } @Override diff --git a/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantStreamManager.java b/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantStreamManager.java index 9558bf4..b73b4db 100644 --- a/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantStreamManager.java +++ b/service/src/main/java/com/theokanning/openai/service/assistant_stream/AssistantStreamManager.java @@ -11,6 +11,7 @@ import com.theokanning.openai.assistants.run.ToolCallFunction; import com.theokanning.openai.assistants.run_step.RunStep; import com.theokanning.openai.assistants.run_step.RunStepDelta; +import com.theokanning.openai.utils.JsonUtil; import io.reactivex.Flowable; import io.reactivex.disposables.Disposable; import lombok.Getter; @@ -35,7 +36,7 @@ public class AssistantStreamManager { private final List msgDeltas; private final List runStepDeltas; private final List eventMsgsHolder; - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = JsonUtil.getInstance(); private MessageDelta accumulatedMessageDelta; private RunStepDelta accumulatedRsd; diff --git a/service/src/main/java/com/theokanning/openai/service/assistant_stream/DeltaUtil.java b/service/src/main/java/com/theokanning/openai/service/assistant_stream/DeltaUtil.java index 4c445e7..ffcfd1d 100644 --- a/service/src/main/java/com/theokanning/openai/service/assistant_stream/DeltaUtil.java +++ b/service/src/main/java/com/theokanning/openai/service/assistant_stream/DeltaUtil.java @@ -11,6 +11,7 @@ import com.theokanning.openai.assistants.run.ToolCallFunction; import com.theokanning.openai.assistants.run_step.RunStepDelta; import com.theokanning.openai.assistants.run_step.StepDetails; +import com.theokanning.openai.utils.JsonUtil; import lombok.SneakyThrows; import java.util.List; @@ -21,7 +22,7 @@ * @date 2024年05月02 15:56 **/ public class DeltaUtil { - private static final ObjectMapper mapper = new ObjectMapper(); + private static final ObjectMapper mapper = JsonUtil.getInstance(); /** * merge delta msg to accumulated delta msg