diff --git a/models/spring-ai-openai/pom.xml b/models/spring-ai-openai/pom.xml index b059ccff986..d09fc76c9c5 100644 --- a/models/spring-ai-openai/pom.xml +++ b/models/spring-ai-openai/pom.xml @@ -36,6 +36,10 @@ git@github.com:spring-projects/spring-ai.git + + false + + diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java index 73813b38306..952ad431404 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java @@ -132,7 +132,7 @@ public SpeechResponse call(SpeechPrompt speechPrompt) { var speech = speechEntity.getBody(); if (speech == null) { - this.logger.warn("No speech response returned for speechRequest: {}", speechRequest); + logger.warn("No speech response returned for speechRequest: {}", speechRequest); return new SpeechResponse(new Speech(new byte[0])); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java index 8aa43728b43..ec29b545454 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java @@ -118,7 +118,7 @@ public AudioTranscriptionResponse call(AudioTranscriptionPrompt transcriptionPro var transcription = transcriptionEntity.getBody(); if (transcription == null) { - this.logger.warn("No transcription returned for request: {}", audioResource); + logger.warn("No transcription returned for request: {}", audioResource); return new AudioTranscriptionResponse(null); } @@ -139,7 +139,7 @@ public AudioTranscriptionResponse call(AudioTranscriptionPrompt transcriptionPro var transcription = transcriptionEntity.getBody(); if (transcription == null) { - this.logger.warn("No transcription returned for request: {}", audioResource); + logger.warn("No transcription returned for request: {}", audioResource); return new AudioTranscriptionResponse(null); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java index 5a2045f9bba..9c0022fade8 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java @@ -122,37 +122,48 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } OpenAiAudioTranscriptionOptions other = (OpenAiAudioTranscriptionOptions) obj; if (this.model == null) { - if (other.model != null) + if (other.model != null) { return false; + } } - else if (!this.model.equals(other.model)) + else if (!this.model.equals(other.model)) { return false; + } if (this.prompt == null) { - if (other.prompt != null) + if (other.prompt != null) { return false; + } } - else if (!this.prompt.equals(other.prompt)) + else if (!this.prompt.equals(other.prompt)) { return false; + } if (this.language == null) { - if (other.language != null) + if (other.language != null) { return false; + } } - else if (!this.language.equals(other.language)) + else if (!this.language.equals(other.language)) { return false; + } if (this.responseFormat == null) { - if (other.responseFormat != null) + if (other.responseFormat != null) { return false; + } } - else if (!this.responseFormat.equals(other.responseFormat)) + else if (!this.responseFormat.equals(other.responseFormat)) { return false; + } return true; } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java index b60f1889956..f21a064ee6b 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java @@ -307,8 +307,7 @@ public Flux stream(Prompt prompt) { @SuppressWarnings("null") String id = chatCompletion2.id(); - List generations = chatCompletion2.choices().stream().map(choice -> {// @formatter:off - + List generations = chatCompletion2.choices().stream().map(choice -> { // @formatter:off if (choice.message().role() != null) { roleMap.putIfAbsent(id, choice.message().role().name()); } @@ -347,9 +346,7 @@ public Flux stream(Prompt prompt) { } }) .doOnError(observation::error) - .doFinally(s -> { - observation.stop(); - }) + .doFinally(s -> observation.stop()) .contextWrite(ctx -> ctx.put(ObservationThreadLocalAccessor.KEY, observation)); // @formatter:on @@ -454,10 +451,8 @@ else if (message.getMessageType() == MessageType.ASSISTANT) { else if (message.getMessageType() == MessageType.TOOL) { ToolResponseMessage toolMessage = (ToolResponseMessage) message; - toolMessage.getResponses().forEach(response -> { - Assert.isTrue(response.id() != null, "ToolResponseMessage must have an id"); - }); - + toolMessage.getResponses() + .forEach(response -> Assert.isTrue(response.id() != null, "ToolResponseMessage must have an id")); return toolMessage.getResponses() .stream() .map(tr -> new ChatCompletionMessage(tr.responseData(), ChatCompletionMessage.Role.TOOL, tr.name(), diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java index 1da5a9b8694..565822304f1 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java @@ -169,10 +169,11 @@ private ImageResponse convertResponse(ResponseEntity imageGenerationList = imageApiResponse.data().stream().map(entry -> { - return new ImageGeneration(new Image(entry.url(), entry.b64Json()), - new OpenAiImageGenerationMetadata(entry.revisedPrompt())); - }).toList(); + List imageGenerationList = imageApiResponse.data() + .stream() + .map(entry -> new ImageGeneration(new Image(entry.url(), entry.b64Json()), + new OpenAiImageGenerationMetadata(entry.revisedPrompt()))) + .toList(); ImageResponseMetadata openAiImageResponseMetadata = new ImageResponseMetadata(imageApiResponse.created()); return new ImageResponse(imageGenerationList, openAiImageResponseMetadata); diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageOptions.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageOptions.java index 1bab88096dd..c9b496ed35f 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageOptions.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageOptions.java @@ -234,7 +234,7 @@ public String toString() { + ", user='" + this.user + '\'' + '}'; } - public static class Builder { + public static final class Builder { private final OpenAiImageOptions options; diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java index f6719710c05..ca5fb319a05 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java @@ -106,7 +106,7 @@ private ModerationResponse convertResponse( OpenAiModerationApi.OpenAiModerationRequest openAiModerationRequest) { OpenAiModerationApi.OpenAiModerationResponse moderationApiResponse = moderationResponseEntity.getBody(); if (moderationApiResponse == null) { - this.logger.warn("No moderation response returned for request: {}", openAiModerationRequest); + logger.warn("No moderation response returned for request: {}", openAiModerationRequest); return new ModerationResponse(new Generation()); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationOptions.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationOptions.java index 49688231357..758dda9feea 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationOptions.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationOptions.java @@ -50,7 +50,7 @@ public void setModel(String model) { this.model = model; } - public static class Builder { + public static final class Builder { private final OpenAiModerationOptions options; diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/aot/OpenAiRuntimeHints.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/aot/OpenAiRuntimeHints.java index 3a4fe1fa5e2..36f3bc39e05 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/aot/OpenAiRuntimeHints.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/aot/OpenAiRuntimeHints.java @@ -48,12 +48,15 @@ private static Set eval(Set referenceSet) { @Override public void registerHints(@NonNull RuntimeHints hints, @Nullable ClassLoader classLoader) { var mcs = MemberCategory.values(); - for (var tr : eval(findJsonAnnotatedClassesInPackage(OpenAiApi.class))) + for (var tr : eval(findJsonAnnotatedClassesInPackage(OpenAiApi.class))) { hints.reflection().registerType(tr, mcs); - for (var tr : eval(findJsonAnnotatedClassesInPackage(OpenAiAudioApi.class))) + } + for (var tr : eval(findJsonAnnotatedClassesInPackage(OpenAiAudioApi.class))) { hints.reflection().registerType(tr, mcs); - for (var tr : eval(findJsonAnnotatedClassesInPackage(OpenAiImageApi.class))) + } + for (var tr : eval(findJsonAnnotatedClassesInPackage(OpenAiImageApi.class))) { hints.reflection().registerType(tr, mcs); + } } } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java index b4dd95d29fe..9567c51cf1d 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java @@ -172,7 +172,7 @@ public OpenAiApi(String baseUrl, String apiKey, MultiValueMap he this.webClient = webClientBuilder .baseUrl(baseUrl) .defaultHeaders(finalHeaders) - .build();// @formatter:on + .build(); // @formatter:on } public static String getTextContent(List content) { @@ -558,7 +558,8 @@ public enum Type { /** * Function tool type. */ - @JsonProperty("function") FUNCTION + @JsonProperty("function") + FUNCTION } /** @@ -588,7 +589,7 @@ public Function(String description, String name, String jsonSchema) { this(description, name, ModelOptionsUtils.jsonToMap(jsonSchema)); } } - }// @formatter:on + } // @formatter:on /** * Creates a model response for the given chat conversation. @@ -782,7 +783,7 @@ public static Object FUNCTION(String functionName) { @JsonInclude(Include.NON_NULL) public record ResponseFormat( @JsonProperty("type") Type type, - @JsonProperty("json_schema") JsonSchema jsonSchema ) { + @JsonProperty("json_schema") JsonSchema jsonSchema) { public ResponseFormat(Type type) { this(type, (JsonSchema) null); @@ -794,7 +795,7 @@ public ResponseFormat(Type type, String schema) { @ConstructorBinding public ResponseFormat(Type type, String name, String schema, Boolean strict) { - this(type, StringUtils.hasText(schema)? new JsonSchema(name, schema, strict): null); + this(type, StringUtils.hasText(schema) ? new JsonSchema(name, schema, strict) : null); } public enum Type { @@ -837,7 +838,7 @@ public JsonSchema(String name, String schema) { } public JsonSchema(String name, String schema, Boolean strict) { - this(StringUtils.hasText(name)? name : "custom_schema", ModelOptionsUtils.jsonToMap(schema), strict); + this(StringUtils.hasText(name) ? name : "custom_schema", ModelOptionsUtils.jsonToMap(schema), strict); } } @@ -856,7 +857,7 @@ public record StreamOptions( public static StreamOptions INCLUDE_USAGE = new StreamOptions(true); } - }// @formatter:on + } // @formatter:on /** * Message comprising the conversation. @@ -880,7 +881,7 @@ public record ChatCompletionMessage(// @formatter:off @JsonProperty("name") String name, @JsonProperty("tool_call_id") String toolCallId, @JsonProperty("tool_calls") List toolCalls, - @JsonProperty("refusal") String refusal) {// @formatter:on + @JsonProperty("refusal") String refusal) { // @formatter:on /** * Create a chat completion message with the given content and role. All other @@ -999,7 +1000,7 @@ public record ToolCall(// @formatter:off @JsonProperty("index") Integer index, @JsonProperty("id") String id, @JsonProperty("type") String type, - @JsonProperty("function") ChatCompletionFunction function) {// @formatter:on + @JsonProperty("function") ChatCompletionFunction function) { // @formatter:on public ToolCall(String id, String type, ChatCompletionFunction function) { this(null, id, type, function); @@ -1017,7 +1018,7 @@ public ToolCall(String id, String type, ChatCompletionFunction function) { @JsonInclude(Include.NON_NULL) public record ChatCompletionFunction(// @formatter:off @JsonProperty("name") String name, - @JsonProperty("arguments") String arguments) {// @formatter:on + @JsonProperty("arguments") String arguments) { // @formatter:on } } @@ -1046,7 +1047,7 @@ public record ChatCompletion(// @formatter:off @JsonProperty("model") String model, @JsonProperty("system_fingerprint") String systemFingerprint, @JsonProperty("object") String object, - @JsonProperty("usage") Usage usage) {// @formatter:on + @JsonProperty("usage") Usage usage) { // @formatter:on /** * Chat completion choice. @@ -1061,7 +1062,7 @@ public record Choice(// @formatter:off @JsonProperty("finish_reason") ChatCompletionFinishReason finishReason, @JsonProperty("index") Integer index, @JsonProperty("message") ChatCompletionMessage message, - @JsonProperty("logprobs") LogProbs logprobs) {// @formatter:on + @JsonProperty("logprobs") LogProbs logprobs) { // @formatter:on } @@ -1094,7 +1095,7 @@ public record Content(// @formatter:off @JsonProperty("token") String token, @JsonProperty("logprob") Float logprob, @JsonProperty("bytes") List probBytes, - @JsonProperty("top_logprobs") List topLogprobs) {// @formatter:on + @JsonProperty("top_logprobs") List topLogprobs) { // @formatter:on /** * The most likely tokens and their log probability, at this token position. @@ -1111,7 +1112,7 @@ public record Content(// @formatter:off public record TopLogProbs(// @formatter:off @JsonProperty("token") String token, @JsonProperty("logprob") Float logprob, - @JsonProperty("bytes") List probBytes) {// @formatter:on + @JsonProperty("bytes") List probBytes) { // @formatter:on } } @@ -1137,7 +1138,7 @@ public record Usage(// @formatter:off @JsonProperty("prompt_tokens") Integer promptTokens, @JsonProperty("total_tokens") Integer totalTokens, @JsonProperty("prompt_tokens_details") PromptTokensDetails promptTokensDetails, - @JsonProperty("completion_tokens_details") CompletionTokenDetails completionTokenDetails) {// @formatter:on + @JsonProperty("completion_tokens_details") CompletionTokenDetails completionTokenDetails) { // @formatter:on public Usage(Integer completionTokens, Integer promptTokens, Integer totalTokens) { this(completionTokens, promptTokens, totalTokens, null, null); @@ -1150,7 +1151,7 @@ public Usage(Integer completionTokens, Integer promptTokens, Integer totalTokens */ @JsonInclude(Include.NON_NULL) public record PromptTokensDetails(// @formatter:off - @JsonProperty("cached_tokens") Integer cachedTokens) {// @formatter:on + @JsonProperty("cached_tokens") Integer cachedTokens) { // @formatter:on } /** @@ -1160,7 +1161,7 @@ public record PromptTokensDetails(// @formatter:off */ @JsonInclude(Include.NON_NULL) public record CompletionTokenDetails(// @formatter:off - @JsonProperty("reasoning_tokens") Integer reasoningTokens) {// @formatter:on + @JsonProperty("reasoning_tokens") Integer reasoningTokens) { // @formatter:on } } @@ -1190,7 +1191,7 @@ public record ChatCompletionChunk(// @formatter:off @JsonProperty("model") String model, @JsonProperty("system_fingerprint") String systemFingerprint, @JsonProperty("object") String object, - @JsonProperty("usage") Usage usage) {// @formatter:on + @JsonProperty("usage") Usage usage) { // @formatter:on /** * Chat completion choice. @@ -1205,7 +1206,7 @@ public record ChunkChoice(// @formatter:off @JsonProperty("finish_reason") ChatCompletionFinishReason finishReason, @JsonProperty("index") Integer index, @JsonProperty("delta") ChatCompletionMessage delta, - @JsonProperty("logprobs") LogProbs logprobs) {// @formatter:on + @JsonProperty("logprobs") LogProbs logprobs) { // @formatter:on } } @@ -1222,7 +1223,7 @@ public record ChunkChoice(// @formatter:off public record Embedding(// @formatter:off @JsonProperty("index") Integer index, @JsonProperty("embedding") float[] embedding, - @JsonProperty("object") String object) {// @formatter:on + @JsonProperty("object") String object) { // @formatter:on /** * Create an embedding with the given index, embedding and object type set to @@ -1259,7 +1260,7 @@ public record EmbeddingRequest(// @formatter:off @JsonProperty("model") String model, @JsonProperty("encoding_format") String encodingFormat, @JsonProperty("dimensions") Integer dimensions, - @JsonProperty("user") String user) {// @formatter:on + @JsonProperty("user") String user) { // @formatter:on /** * Create an embedding request with the given input, model and encoding format set @@ -1296,7 +1297,7 @@ public record EmbeddingList(// @formatter:off @JsonProperty("object") String object, @JsonProperty("data") List data, @JsonProperty("model") String model, - @JsonProperty("usage") Usage usage) {// @formatter:on + @JsonProperty("usage") Usage usage) { // @formatter:on } } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java index a217026093f..38f99312d1d 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java @@ -256,11 +256,13 @@ public enum TtsModel { /** * The latest text to speech model, optimized for speed. */ - @JsonProperty("tts-1") TTS_1("tts-1"), + @JsonProperty("tts-1") + TTS_1("tts-1"), /** * The latest text to speech model, optimized for quality. */ - @JsonProperty("tts-1-hd") TTS_1_HD("tts-1-hd"); + @JsonProperty("tts-1-hd") + TTS_1_HD("tts-1-hd"); // @formatter:on public final String value; @@ -286,7 +288,8 @@ public String getValue() { public enum WhisperModel { // @formatter:off - @JsonProperty("whisper-1") WHISPER_1("whisper-1"); + @JsonProperty("whisper-1") + WHISPER_1("whisper-1"); // @formatter:on public final String value; @@ -308,11 +311,16 @@ public String getValue() { public enum TranscriptResponseFormat { // @formatter:off - @JsonProperty("json") JSON("json", StructuredResponse.class), - @JsonProperty("text") TEXT("text", String.class), - @JsonProperty("srt") SRT("srt", String.class), - @JsonProperty("verbose_json") VERBOSE_JSON("verbose_json", StructuredResponse.class), - @JsonProperty("vtt") VTT("vtt", String.class); + @JsonProperty("json") + JSON("json", StructuredResponse.class), + @JsonProperty("text") + TEXT("text", String.class), + @JsonProperty("srt") + SRT("srt", String.class), + @JsonProperty("verbose_json") + VERBOSE_JSON("verbose_json", StructuredResponse.class), + @JsonProperty("vtt") + VTT("vtt", String.class); // @formatter:on public final String value; @@ -373,17 +381,23 @@ public static Builder builder() { public enum Voice { // @formatter:off - @JsonProperty("alloy") ALLOY("alloy"), - @JsonProperty("echo") ECHO("echo"), - @JsonProperty("fable") FABLE("fable"), - @JsonProperty("onyx") ONYX("onyx"), - @JsonProperty("nova") NOVA("nova"), - @JsonProperty("shimmer") SHIMMER("shimmer"); + @JsonProperty("alloy") + ALLOY("alloy"), + @JsonProperty("echo") + ECHO("echo"), + @JsonProperty("fable") + FABLE("fable"), + @JsonProperty("onyx") + ONYX("onyx"), + @JsonProperty("nova") + NOVA("nova"), + @JsonProperty("shimmer") + SHIMMER("shimmer"); // @formatter:on public final String value; - private Voice(String value) { + Voice(String value) { this.value = value; } @@ -400,10 +414,14 @@ public String getValue() { public enum AudioResponseFormat { // @formatter:off - @JsonProperty("mp3") MP3("mp3"), - @JsonProperty("opus") OPUS("opus"), - @JsonProperty("aac") AAC("aac"), - @JsonProperty("flac") FLAC("flac"); + @JsonProperty("mp3") + MP3("mp3"), + @JsonProperty("opus") + OPUS("opus"), + @JsonProperty("aac") + AAC("aac"), + @JsonProperty("flac") + FLAC("flac"); // @formatter:on public final String value; @@ -511,8 +529,10 @@ public static Builder builder() { public enum GranularityType { // @formatter:off - @JsonProperty("word") WORD("word"), - @JsonProperty("segment") SEGMENT("segment"); + @JsonProperty("word") + WORD("word"), + @JsonProperty("segment") + SEGMENT("segment"); // @formatter:on public final String value; diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiImageApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiImageApi.java index c534054079e..bfb846c0510 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiImageApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiImageApi.java @@ -139,7 +139,7 @@ public String getValue() { // @formatter:off @JsonInclude(JsonInclude.Include.NON_NULL) - public record OpenAiImageRequest ( + public record OpenAiImageRequest( @JsonProperty("prompt") String prompt, @JsonProperty("model") String model, @JsonProperty("n") Integer n, diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiModerationApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiModerationApi.java index 02e2b3ca109..f4522dc0eab 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiModerationApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiModerationApi.java @@ -77,7 +77,7 @@ public ResponseEntity createModeration(OpenAiModeratio // @formatter:off @JsonInclude(JsonInclude.Include.NON_NULL) - public record OpenAiModerationRequest ( + public record OpenAiModerationRequest( @JsonProperty("input") String prompt, @JsonProperty("model") String model ) { diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiClientErrorException.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiClientErrorException.java index 7d5e961714b..57cc9913c1d 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiClientErrorException.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiClientErrorException.java @@ -31,4 +31,4 @@ public OpenAiApiClientErrorException(String message, Throwable cause) { super(message, cause); } -} \ No newline at end of file +} diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiConstants.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiConstants.java index 81051cf7b72..bc2e2ce4328 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiConstants.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/common/OpenAiApiConstants.java @@ -31,4 +31,8 @@ public final class OpenAiApiConstants { public static final String PROVIDER_NAME = AiProvider.OPENAI.value(); + private OpenAiApiConstants() { + + } + } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/audio/speech/StreamingSpeechModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/audio/speech/StreamingSpeechModel.java index 92dcfa3473a..6743637948d 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/audio/speech/StreamingSpeechModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/audio/speech/StreamingSpeechModel.java @@ -51,4 +51,4 @@ default Flux stream(String message) { @Override Flux stream(SpeechPrompt prompt); -} \ No newline at end of file +} diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java index 1d46556cc1e..7a4d344755d 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java @@ -47,10 +47,14 @@ * @author Christian Tzolov * @since 0.7.0 */ -public class OpenAiResponseHeaderExtractor { +public final class OpenAiResponseHeaderExtractor { private static final Logger logger = LoggerFactory.getLogger(OpenAiResponseHeaderExtractor.class); + private OpenAiResponseHeaderExtractor() { + + } + public static RateLimit extractAiResponseHeaders(ResponseEntity response) { Long requestsLimit = getHeaderAsLong(response, REQUESTS_LIMIT_HEADER.getName()); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java index 74ca86bef95..1bd7236319c 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java @@ -70,7 +70,7 @@ public void promptOptionsTools() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName(TOOL_FUNCTION_NAME) .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build()), false); @@ -97,7 +97,7 @@ public void defaultOptionsTools() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName(TOOL_FUNCTION_NAME) .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build()); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/aot/OpenAiRuntimeHintsTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/aot/OpenAiRuntimeHintsTests.java index 4b54d809c7a..e3d849898df 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/aot/OpenAiRuntimeHintsTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/aot/OpenAiRuntimeHintsTests.java @@ -25,8 +25,6 @@ import org.springframework.aot.hint.TypeReference; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.springframework.ai.aot.AiRuntimeHints.findJsonAnnotatedClassesInPackage; -import static org.springframework.aot.hint.predicate.RuntimeHintsPredicates.reflection; class OpenAiRuntimeHintsTests { @@ -36,9 +34,11 @@ void registerHints() { OpenAiRuntimeHints openAiRuntimeHints = new OpenAiRuntimeHints(); openAiRuntimeHints.registerHints(runtimeHints, null); - Set jsonAnnotatedClasses = findJsonAnnotatedClassesInPackage(OpenAiApi.class); + Set jsonAnnotatedClasses = org.springframework.ai.aot.AiRuntimeHints + .findJsonAnnotatedClassesInPackage(OpenAiApi.class); for (TypeReference jsonAnnotatedClass : jsonAnnotatedClasses) { - assertThat(runtimeHints).matches(reflection().onType(jsonAnnotatedClass)); + assertThat(runtimeHints).matches(org.springframework.aot.hint.predicate.RuntimeHintsPredicates.reflection() + .onType(jsonAnnotatedClass)); } } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/MockWeatherService.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/MockWeatherService.java index 88e5df176bc..2c3eb8bf0ea 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/MockWeatherService.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/MockWeatherService.java @@ -65,7 +65,7 @@ public enum Unit { */ public final String unitName; - private Unit(String text) { + Unit(String text) { this.unitName = text; } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java index b224fd61ea9..6a511e8fd68 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java @@ -138,7 +138,7 @@ public void toolFunctionCall() { ResponseEntity chatCompletion2 = this.completionApi .chatCompletionEntity(functionResponseRequest); - this.logger.info("Final response: " + chatCompletion2.getBody()); + logger.info("Final response: " + chatCompletion2.getBody()); assertThat(chatCompletion2.getBody().choices()).isNotEmpty(); @@ -147,11 +147,8 @@ public void toolFunctionCall() { .containsAnyOf("30.0°C", "30°C"); assertThat(chatCompletion2.getBody().choices().get(0).message().content()).contains("Tokyo") .containsAnyOf("10.0°C", "10°C"); - ; assertThat(chatCompletion2.getBody().choices().get(0).message().content()).contains("Paris") .containsAnyOf("15.0°C", "15°C"); - ; - } } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionModelWithTranscriptionResponseMetadataTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionModelWithTranscriptionResponseMetadataTests.java index a1b23b4a7bf..fa6af43a7ad 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionModelWithTranscriptionResponseMetadataTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionModelWithTranscriptionResponseMetadataTests.java @@ -130,24 +130,24 @@ private void prepareMock() { private String getJson() { return """ { - "id": "chatcmpl-123", - "object": "chat.completion", - "created": 1677652288, - "model": "gpt-3.5-turbo-0613", - "choices": [{ - "index": 0, - "message": { - "role": "assistant", - "content": "I surrender!" - }, - "finish_reason": "stop" - }], - "usage": { - "prompt_tokens": 9, - "completion_tokens": 12, - "total_tokens": 21 - } - } + "id": "chatcmpl-123", + "object": "chat.completion", + "created": 1677652288, + "model": "gpt-3.5-turbo-0613", + "choices": [{ + "index": 0, + "message": { + "role": "assistant", + "content": "I surrender!" + }, + "finish_reason": "stop" + }], + "usage": { + "prompt_tokens": 9, + "completion_tokens": 12, + "total_tokens": 21 + } + } """; } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/TranscriptionModelTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/TranscriptionModelTests.java index 1f93fe0f69b..46b07b4067f 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/TranscriptionModelTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/TranscriptionModelTests.java @@ -29,12 +29,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.doAnswer; +import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; /** * Unit Tests for {@link TranscriptionModel}. @@ -54,11 +53,11 @@ void transcrbeRequestReturnsResponseCorrectly() { // Create a mock Transcript AudioTranscription transcript = Mockito.mock(AudioTranscription.class); - when(transcript.getOutput()).thenReturn(mockTranscription); + given(transcript.getOutput()).willReturn(mockTranscription); // Create a mock TranscriptionResponse with the mock Transcript AudioTranscriptionResponse response = Mockito.mock(AudioTranscriptionResponse.class); - when(response.getResult()).thenReturn(transcript); + given(response.getResult()).willReturn(transcript); // Transcript transcript = spy(new Transcript(responseMessage)); // TranscriptionResponse response = spy(new @@ -66,16 +65,14 @@ void transcrbeRequestReturnsResponseCorrectly() { doCallRealMethod().when(mockClient).call(any(Resource.class)); - doAnswer(invocationOnMock -> { - - AudioTranscriptionPrompt transcriptionRequest = invocationOnMock.getArgument(0); + given(mockClient.call(any(AudioTranscriptionPrompt.class))).will(invocation -> { + AudioTranscriptionPrompt transcriptionRequest = invocation.getArgument(0); assertThat(transcriptionRequest).isNotNull(); assertThat(transcriptionRequest.getInstructions()).isEqualTo(mockAudioFile); return response; - - }).when(mockClient).call(any(AudioTranscriptionPrompt.class)); + }); assertThat(mockClient.call(mockAudioFile)).isEqualTo(mockTranscription); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java index 1fcb34af273..8b4ac894c58 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java @@ -44,7 +44,7 @@ import org.springframework.util.MultiValueMap; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.when; +import static org.mockito.BDDMockito.given; /** * @author Christian Tzolov @@ -65,7 +65,7 @@ public class MessageTypeContentTests { ArgumentCaptor> headersCaptor; Flux fluxResponse = Flux - .generate(() -> new ChatCompletionChunk("id", List.of(), 0l, "model", "fp", "object", null), (state, sink) -> { + .generate(() -> new ChatCompletionChunk("id", List.of(), 0L, "model", "fp", "object", null), (state, sink) -> { sink.next(state); sink.complete(); return state; @@ -79,8 +79,8 @@ public void beforeEach() { @Test public void systemMessageSimpleContentType() { - when(this.openAiApi.chatCompletionEntity(this.pomptCaptor.capture(), this.headersCaptor.capture())) - .thenReturn(Mockito.mock(ResponseEntity.class)); + given(this.openAiApi.chatCompletionEntity(this.pomptCaptor.capture(), this.headersCaptor.capture())) + .willReturn(Mockito.mock(ResponseEntity.class)); this.chatModel.call(new Prompt(List.of(new SystemMessage("test message")))); @@ -91,8 +91,8 @@ public void systemMessageSimpleContentType() { @Test public void userMessageSimpleContentType() { - when(this.openAiApi.chatCompletionEntity(this.pomptCaptor.capture(), this.headersCaptor.capture())) - .thenReturn(Mockito.mock(ResponseEntity.class)); + given(this.openAiApi.chatCompletionEntity(this.pomptCaptor.capture(), this.headersCaptor.capture())) + .willReturn(Mockito.mock(ResponseEntity.class)); this.chatModel.call(new Prompt(List.of(new UserMessage("test message")))); @@ -102,8 +102,8 @@ public void userMessageSimpleContentType() { @Test public void streamUserMessageSimpleContentType() { - when(this.openAiApi.chatCompletionStream(this.pomptCaptor.capture(), this.headersCaptor.capture())) - .thenReturn(this.fluxResponse); + given(this.openAiApi.chatCompletionStream(this.pomptCaptor.capture(), this.headersCaptor.capture())) + .willReturn(this.fluxResponse); this.chatModel.stream(new Prompt(List.of(new UserMessage("test message")))).subscribe(); @@ -122,8 +122,8 @@ private void validateStringContent(ChatCompletionRequest chatCompletionRequest) @Test public void userMessageWithMediaType() throws MalformedURLException { - when(this.openAiApi.chatCompletionEntity(this.pomptCaptor.capture(), this.headersCaptor.capture())) - .thenReturn(Mockito.mock(ResponseEntity.class)); + given(this.openAiApi.chatCompletionEntity(this.pomptCaptor.capture(), this.headersCaptor.capture())) + .willReturn(Mockito.mock(ResponseEntity.class)); URL mediaUrl = new URL("http://test"); this.chatModel.call(new Prompt( @@ -135,8 +135,8 @@ public void userMessageWithMediaType() throws MalformedURLException { @Test public void streamUserMessageWithMediaType() throws MalformedURLException { - when(this.openAiApi.chatCompletionStream(this.pomptCaptor.capture(), this.headersCaptor.capture())) - .thenReturn(this.fluxResponse); + given(this.openAiApi.chatCompletionStream(this.pomptCaptor.capture(), this.headersCaptor.capture())) + .willReturn(this.fluxResponse); URL mediaUrl = new URL("http://test"); this.chatModel diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModeAdditionalHttpHeadersIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModeAdditionalHttpHeadersIT.java index cce923b87f0..21c5b7e81b5 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModeAdditionalHttpHeadersIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModeAdditionalHttpHeadersIT.java @@ -33,7 +33,7 @@ import org.springframework.context.annotation.Bean; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertThrows; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; /** * @author Christian Tzolov @@ -48,9 +48,8 @@ public class OpenAiChatModeAdditionalHttpHeadersIT { @Test void additionalApiKeyHeader() { - assertThrows(NonTransientAiException.class, () -> { - this.openAiChatModel.call("Tell me a joke"); - }); + assertThatThrownBy(() -> this.openAiChatModel.call("Tell me a joke")) + .isInstanceOf(NonTransientAiException.class); // Use the additional headers to override the Api Key. // Mind that you have to prefix the Api Key with the "Bearer " prefix. diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java index 5caa848b964..281f86e4688 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java @@ -66,7 +66,7 @@ void functionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build()); } @@ -102,7 +102,7 @@ else if (request.location().contains("San Francisco")) { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(biFunction) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .withToolContext(Map.of("sessionId", "123")) .build()); @@ -128,7 +128,7 @@ void streamFunctionCallTest() { .withFunctionCallbacks(List.of((FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build()))) .build()); } @@ -163,7 +163,7 @@ else if (request.location().contains("San Francisco")) { .withFunctionCallbacks(List.of((FunctionCallbackWrapper.builder(biFunction) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build()))) .withToolContext(Map.of("sessionId", "123")) .build(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java index b12a10e61c8..14d92756927 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java @@ -121,9 +121,7 @@ void streamCompletenessTest() throws InterruptedException { }); chatResponseFlux.subscribe(); assertThat(latch.await(120, TimeUnit.SECONDS)).isTrue(); - IntStream.rangeClosed(1, 1000).forEach(n -> { - assertThat(answer).contains(String.valueOf(n)); - }); + IntStream.rangeClosed(1, 1000).forEach(n -> assertThat(answer).contains(String.valueOf(n))); } @Test @@ -333,7 +331,7 @@ void functionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); @@ -358,7 +356,7 @@ void streamFunctionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java index 63bf6a88a91..a9c9f2724e8 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java @@ -89,7 +89,7 @@ void jsonObject() throws JsonMappingException, JsonProcessingException { String content = response.getResult().getOutput().getContent(); - this.logger.info("Response content: {}", content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); } @@ -132,7 +132,7 @@ void jsonSchema() throws JsonMappingException, JsonProcessingException { String content = response.getResult().getOutput().getContent(); - this.logger.info("Response content: {}", content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); } @@ -172,7 +172,7 @@ record Items(@JsonProperty(required = true, value = "explanation") String explan String content = response.getResult().getOutput().getContent(); - this.logger.info("Response content: {}", content); + logger.info("Response content: {}", content); MathReasoning mathReasoning = outputConverter.convert(content); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelWithChatResponseMetadataTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelWithChatResponseMetadataTests.java index 2e6f6ddb687..ae598fcaad1 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelWithChatResponseMetadataTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelWithChatResponseMetadataTests.java @@ -143,23 +143,23 @@ private void prepareMock() { private String getJson() { return """ { - "id": "chatcmpl-123", - "object": "chat.completion", - "created": 1677652288, - "model": "gpt-3.5-turbo-0613", - "choices": [{ + "id": "chatcmpl-123", + "object": "chat.completion", + "created": 1677652288, + "model": "gpt-3.5-turbo-0613", + "choices": [{ "index": 0, "message": { - "role": "assistant", - "content": "I surrender!" + "role": "assistant", + "content": "I surrender!" }, "finish_reason": "stop" - }], - "usage": { + }], + "usage": { "prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21 - } + } } """; } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java index 10645ee562a..997fb02c3a7 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java @@ -52,8 +52,6 @@ static OpenAiChatOptions forModelName(String modelName) { return OpenAiChatOptions.builder().withModel(modelName).build(); } - ; - static Stream openAiCompatibleApis() { Stream.Builder builder = Stream.builder(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java index 97c38b13b9e..98a2892d182 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java @@ -155,19 +155,19 @@ public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvis } private AdvisedRequest before(AdvisedRequest request) { - this.logger.info("System text: \n" + request.systemText()); - this.logger.info("System params: " + request.systemParams()); - this.logger.info("User text: \n" + request.userText()); - this.logger.info("User params:" + request.userParams()); - this.logger.info("Function names: " + request.functionNames()); + logger.info("System text: \n" + request.systemText()); + logger.info("System params: " + request.systemParams()); + logger.info("User text: \n" + request.userText()); + logger.info("User params:" + request.userParams()); + logger.info("Function names: " + request.functionNames()); - this.logger.info("Options: " + request.chatOptions().toString()); + logger.info("Options: " + request.chatOptions().toString()); return request; } private void observeAfter(AdvisedResponse advisedResponse) { - this.logger.info("Response: " + advisedResponse.response()); + logger.info("Response: " + advisedResponse.response()); } } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java index 9b9e28e4383..24019db9f69 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java @@ -72,7 +72,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.when; +import static org.mockito.BDDMockito.given; /** * @author Christian Tzolov @@ -124,13 +124,13 @@ public void openAiChatTransientError() { var choice = new ChatCompletion.Choice(ChatCompletionFinishReason.STOP, 0, new ChatCompletionMessage("Response", Role.ASSISTANT), null); - ChatCompletion expectedChatCompletion = new ChatCompletion("id", List.of(choice), 666l, "model", null, null, + ChatCompletion expectedChatCompletion = new ChatCompletion("id", List.of(choice), 666L, "model", null, null, new OpenAiApi.Usage(10, 10, 10)); - when(this.openAiApi.chatCompletionEntity(isA(ChatCompletionRequest.class), any())) - .thenThrow(new TransientAiException("Transient Error 1")) - .thenThrow(new TransientAiException("Transient Error 2")) - .thenReturn(ResponseEntity.of(Optional.of(expectedChatCompletion))); + given(this.openAiApi.chatCompletionEntity(isA(ChatCompletionRequest.class), any())) + .willThrow(new TransientAiException("Transient Error 1")) + .willThrow(new TransientAiException("Transient Error 2")) + .willReturn(ResponseEntity.of(Optional.of(expectedChatCompletion))); var result = this.chatModel.call(new Prompt("text")); @@ -142,8 +142,8 @@ public void openAiChatTransientError() { @Test public void openAiChatNonTransientError() { - when(this.openAiApi.chatCompletionEntity(isA(ChatCompletionRequest.class), any())) - .thenThrow(new RuntimeException("Non Transient Error")); + given(this.openAiApi.chatCompletionEntity(isA(ChatCompletionRequest.class), any())) + .willThrow(new RuntimeException("Non Transient Error")); assertThrows(RuntimeException.class, () -> this.chatModel.call(new Prompt("text"))); } @@ -153,13 +153,13 @@ public void openAiChatStreamTransientError() { var choice = new ChatCompletionChunk.ChunkChoice(ChatCompletionFinishReason.STOP, 0, new ChatCompletionMessage("Response", Role.ASSISTANT), null); - ChatCompletionChunk expectedChatCompletion = new ChatCompletionChunk("id", List.of(choice), 666l, "model", null, + ChatCompletionChunk expectedChatCompletion = new ChatCompletionChunk("id", List.of(choice), 666L, "model", null, null, null); - when(this.openAiApi.chatCompletionStream(isA(ChatCompletionRequest.class), any())) - .thenThrow(new TransientAiException("Transient Error 1")) - .thenThrow(new TransientAiException("Transient Error 2")) - .thenReturn(Flux.just(expectedChatCompletion)); + given(this.openAiApi.chatCompletionStream(isA(ChatCompletionRequest.class), any())) + .willThrow(new TransientAiException("Transient Error 1")) + .willThrow(new TransientAiException("Transient Error 2")) + .willReturn(Flux.just(expectedChatCompletion)); var result = this.chatModel.stream(new Prompt("text")); @@ -172,8 +172,8 @@ public void openAiChatStreamTransientError() { @Test @Disabled("Currently stream() does not implmement retry") public void openAiChatStreamNonTransientError() { - when(this.openAiApi.chatCompletionStream(isA(ChatCompletionRequest.class), any())) - .thenThrow(new RuntimeException("Non Transient Error")); + given(this.openAiApi.chatCompletionStream(isA(ChatCompletionRequest.class), any())) + .willThrow(new RuntimeException("Non Transient Error")); assertThrows(RuntimeException.class, () -> this.chatModel.stream(new Prompt("text")).subscribe()); } @@ -183,10 +183,10 @@ public void openAiEmbeddingTransientError() { EmbeddingList expectedEmbeddings = new EmbeddingList<>("list", List.of(new Embedding(0, new float[] { 9.9f, 8.8f })), "model", new OpenAiApi.Usage(10, 10, 10)); - when(this.openAiApi.embeddings(isA(EmbeddingRequest.class))) - .thenThrow(new TransientAiException("Transient Error 1")) - .thenThrow(new TransientAiException("Transient Error 2")) - .thenReturn(ResponseEntity.of(Optional.of(expectedEmbeddings))); + given(this.openAiApi.embeddings(isA(EmbeddingRequest.class))) + .willThrow(new TransientAiException("Transient Error 1")) + .willThrow(new TransientAiException("Transient Error 2")) + .willReturn(ResponseEntity.of(Optional.of(expectedEmbeddings))); var result = this.embeddingModel .call(new org.springframework.ai.embedding.EmbeddingRequest(List.of("text1", "text2"), null)); @@ -199,8 +199,8 @@ public void openAiEmbeddingTransientError() { @Test public void openAiEmbeddingNonTransientError() { - when(this.openAiApi.embeddings(isA(EmbeddingRequest.class))) - .thenThrow(new RuntimeException("Non Transient Error")); + given(this.openAiApi.embeddings(isA(EmbeddingRequest.class))) + .willThrow(new RuntimeException("Non Transient Error")); assertThrows(RuntimeException.class, () -> this.embeddingModel .call(new org.springframework.ai.embedding.EmbeddingRequest(List.of("text1", "text2"), null))); } @@ -210,10 +210,10 @@ public void openAiAudioTranscriptionTransientError() { var expectedResponse = new StructuredResponse("nl", 6.7f, "Transcription Text", List.of(), List.of()); - when(this.openAiAudioApi.createTranscription(isA(TranscriptionRequest.class), isA(Class.class))) - .thenThrow(new TransientAiException("Transient Error 1")) - .thenThrow(new TransientAiException("Transient Error 2")) - .thenReturn(ResponseEntity.of(Optional.of(expectedResponse))); + given(this.openAiAudioApi.createTranscription(isA(TranscriptionRequest.class), isA(Class.class))) + .willThrow(new TransientAiException("Transient Error 1")) + .willThrow(new TransientAiException("Transient Error 2")) + .willReturn(ResponseEntity.of(Optional.of(expectedResponse))); AudioTranscriptionResponse result = this.audioTranscriptionModel .call(new AudioTranscriptionPrompt(new ClassPathResource("speech/jfk.flac"))); @@ -226,8 +226,8 @@ public void openAiAudioTranscriptionTransientError() { @Test public void openAiAudioTranscriptionNonTransientError() { - when(this.openAiAudioApi.createTranscription(isA(TranscriptionRequest.class), isA(Class.class))) - .thenThrow(new RuntimeException("Transient Error 1")); + given(this.openAiAudioApi.createTranscription(isA(TranscriptionRequest.class), isA(Class.class))) + .willThrow(new RuntimeException("Transient Error 1")); assertThrows(RuntimeException.class, () -> this.audioTranscriptionModel .call(new AudioTranscriptionPrompt(new ClassPathResource("speech/jfk.flac")))); } @@ -235,12 +235,12 @@ public void openAiAudioTranscriptionNonTransientError() { @Test public void openAiImageTransientError() { - var expectedResponse = new OpenAiImageResponse(678l, List.of(new Data("url678", "b64", "prompt"))); + var expectedResponse = new OpenAiImageResponse(678L, List.of(new Data("url678", "b64", "prompt"))); - when(this.openAiImageApi.createImage(isA(OpenAiImageRequest.class))) - .thenThrow(new TransientAiException("Transient Error 1")) - .thenThrow(new TransientAiException("Transient Error 2")) - .thenReturn(ResponseEntity.of(Optional.of(expectedResponse))); + given(this.openAiImageApi.createImage(isA(OpenAiImageRequest.class))) + .willThrow(new TransientAiException("Transient Error 1")) + .willThrow(new TransientAiException("Transient Error 2")) + .willReturn(ResponseEntity.of(Optional.of(expectedResponse))); var result = this.imageModel.call(new ImagePrompt(List.of(new ImageMessage("Image Message")))); @@ -252,8 +252,8 @@ public void openAiImageTransientError() { @Test public void openAiImageNonTransientError() { - when(this.openAiImageApi.createImage(isA(OpenAiImageRequest.class))) - .thenThrow(new RuntimeException("Transient Error 1")); + given(this.openAiImageApi.createImage(isA(OpenAiImageRequest.class))) + .willThrow(new RuntimeException("Transient Error 1")); assertThrows(RuntimeException.class, () -> this.imageModel.call(new ImagePrompt(List.of(new ImageMessage("Image Message"))))); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java index 6a35872525d..3c8a724a063 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java @@ -121,7 +121,8 @@ void listOutputConverterString() { .user(u -> u.text("List five {subject}") .param("subject", "ice cream flavors")) .call() - .entity(new ParameterizedTypeReference>() {}); + .entity(new ParameterizedTypeReference>() { + }); // @formatter:on logger.info(collection.toString()); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java index e8a4fbb17c5..6ba1682e1d5 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java @@ -190,8 +190,8 @@ else if (request.location().contains("San Francisco")) { // @formatter:off String response = ChatClient.builder(this.chatModel) .defaultFunction("getCurrentWeather", "Get the weather in location", biFunction) - .defaultUser(u -> u.text("What's the weather like in San Francisco, Tokyo, and Paris?")) - .build() + .defaultUser(u -> u.text("What's the weather like in San Francisco, Tokyo, and Paris?")) + .build() .prompt() .toolContext(Map.of("sessionId", "123")) .call().content(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java index 00e12633498..578827fb024 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java @@ -253,7 +253,7 @@ void functionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); @@ -276,7 +276,7 @@ void streamFunctionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java index 51d29144d1b..80ec34b995b 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java @@ -254,7 +254,7 @@ void functionCallTest(String modelName) { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); @@ -279,7 +279,7 @@ void streamFunctionCallTest(String modelName) { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java index 4c5ad7bc376..4bbe60e6889 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java @@ -249,7 +249,7 @@ void functionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); @@ -272,7 +272,7 @@ void streamFunctionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java index 523a3fa6481..ef7aa97a114 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java @@ -272,7 +272,7 @@ void functionCallTest(String modelName) { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); @@ -296,7 +296,7 @@ void streamFunctionCallTest() { .withFunctionCallbacks(List.of(FunctionCallbackWrapper.builder(new MockWeatherService()) .withName("getCurrentWeather") .withDescription("Get the weather in location") - .withResponseConverter((response) -> "" + response.temp() + response.unit()) + .withResponseConverter(response -> "" + response.temp() + response.unit()) .build())) .build(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/embedding/EmbeddingIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/embedding/EmbeddingIT.java index ae3f4dbb0b1..7035405c038 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/embedding/EmbeddingIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/embedding/EmbeddingIT.java @@ -78,11 +78,11 @@ void embeddingBatchDocuments() throws Exception { void embeddingBatchDocumentsThatExceedTheLimit() throws Exception { assertThat(this.embeddingModel).isNotNull(); String contentAsString = this.resource.getContentAsString(StandardCharsets.UTF_8); - assertThatThrownBy(() -> { - this.embeddingModel.embed(List.of(new Document("Hello World"), new Document(contentAsString)), - OpenAiEmbeddingOptions.builder().withModel(OpenAiApi.DEFAULT_EMBEDDING_MODEL).build(), - new TokenCountBatchingStrategy()); - }).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy( + () -> this.embeddingModel.embed(List.of(new Document("Hello World"), new Document(contentAsString)), + OpenAiEmbeddingOptions.builder().withModel(OpenAiApi.DEFAULT_EMBEDDING_MODEL).build(), + new TokenCountBatchingStrategy())) + .isInstanceOf(IllegalArgumentException.class); } @Test diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/image/OpenAiImageModelWithImageResponseMetadataTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/image/OpenAiImageModelWithImageResponseMetadataTests.java index 47f8b60e516..a331daef690 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/image/OpenAiImageModelWithImageResponseMetadataTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/image/OpenAiImageModelWithImageResponseMetadataTests.java @@ -113,17 +113,17 @@ private void prepareMock() { private String getJson() { return """ - { - "created": 1589478378, - "data": [ + { + "created": 1589478378, + "data": [ { - "url": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Mini_Golden_Doodle.jpg" + "url": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Mini_Golden_Doodle.jpg" }, { - "url": "https://upload.wikimedia.org/wikipedia/commons/8/85/Goldendoodle_puppy_Marty.jpg" + "url": "https://upload.wikimedia.org/wikipedia/commons/8/85/Goldendoodle_puppy_Marty.jpg" } - ] - } + ] + } """; } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/moderation/OpenAiModerationModelTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/moderation/OpenAiModerationModelTests.java index 30d2a9c2700..ca5e91ca984 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/moderation/OpenAiModerationModelTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/moderation/OpenAiModerationModelTests.java @@ -139,40 +139,40 @@ private void prepareMock() { private String getJson() { return """ - { - "id": "modr-XXXXX", - "model": "text-moderation-005", - "results": [ - { - "flagged": true, - "categories": { - "sexual": false, - "hate": false, - "harassment": false, - "self-harm": false, - "sexual/minors": false, - "hate/threatening": false, - "violence/graphic": false, - "self-harm/intent": false, - "self-harm/instructions": false, - "harassment/threatening": true, - "violence": true - }, - "category_scores": { - "sexual": 1.2282071e-06, - "hate": 0.010696256, - "harassment": 0.29842457, - "self-harm": 1.5236925e-08, - "sexual/minors": 5.7246268e-08, - "hate/threatening": 0.0060676364, - "violence/graphic": 4.435014e-06, - "self-harm/intent": 8.098441e-10, - "self-harm/instructions": 2.8498655e-11, - "harassment/threatening": 0.63055265, - "violence": 0.99011886 - } - } - ] + { + "id": "modr-XXXXX", + "model": "text-moderation-005", + "results": [ + { + "flagged": true, + "categories": { + "sexual": false, + "hate": false, + "harassment": false, + "self-harm": false, + "sexual/minors": false, + "hate/threatening": false, + "violence/graphic": false, + "self-harm/intent": false, + "self-harm/instructions": false, + "harassment/threatening": true, + "violence": true + }, + "category_scores": { + "sexual": 1.2282071e-06, + "hate": 0.010696256, + "harassment": 0.29842457, + "self-harm": 1.5236925e-08, + "sexual/minors": 5.7246268e-08, + "hate/threatening": 0.0060676364, + "violence/graphic": 4.435014e-06, + "self-harm/intent": 8.098441e-10, + "self-harm/instructions": 2.8498655e-11, + "harassment/threatening": 0.63055265, + "violence": 0.99011886 + } + } + ] } """; } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java index 09d7c42f70f..e12bb25c49e 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java @@ -112,4 +112,4 @@ protected void evaluateQuestionAndAnswer(String question, ChatResponse response, } } -} \ No newline at end of file +} diff --git a/src/checkstyle/checkstyle.xml b/src/checkstyle/checkstyle.xml index 0a224dabb03..5bb11d3320f 100644 --- a/src/checkstyle/checkstyle.xml +++ b/src/checkstyle/checkstyle.xml @@ -100,7 +100,7 @@ + value="org.springframework.ai.aot.AiRuntimeHints.*, org.springframework.ai.openai.metadata.support.OpenAiApiResponseHeaders.*, org.springframework.ai.image.observation.ImageModelObservationDocumentation.*, org.springframework.ai.embedding.observation.EmbeddingModelObservationDocumentation.*, org.springframework.aot.hint.predicate.RuntimeHintsPredicates.*, org.springframework.ai.vectorstore.filter.Filter.ExpressionType.*, org.springframework.ai.chat.observation.ChatModelObservationDocumentation.*, org.assertj.core.api.AssertionsForClassTypes.*, org.junit.jupiter.api.Assertions.*, org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.mockito.ArgumentMatchers.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo, org.springframework.test.web.client.match.MockRestRequestMatchers.*, org.springframework.test.web.client.response.MockRestResponseCreators.*, org.springframework.web.reactive.function.server.RequestPredicates.*, org.springframework.web.reactive.function.server.RouterFunctions.*, org.springframework.test.web.servlet.setup.MockMvcBuilders.*" />