Mistral AI improvements

- add AOT support.
 - move the org.springframework.ai.mistral package into org.springframework.ai.mistralai.
This commit is contained in:
Christian Tzolov
2024-02-28 14:46:06 +01:00
parent 65c7ee62fa
commit a81a99ff9d
17 changed files with 103 additions and 37 deletions

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mistral;
package org.springframework.ai.mistralai;
import java.time.Duration;
import java.util.List;
@@ -31,7 +31,7 @@ import org.springframework.ai.chat.StreamingChatClient;
import org.springframework.ai.chat.metadata.ChatGenerationMetadata;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.mistral.api.MistralAiApi;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.springframework.ai.mistral;
package org.springframework.ai.mistralai;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;

View File

@@ -14,15 +14,15 @@
* limitations under the License.
*/
package org.springframework.ai.mistral;
package org.springframework.ai.mistralai;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.MetadataMode;
import org.springframework.ai.embedding.*;
import org.springframework.ai.mistral.api.MistralAiApi;
import org.springframework.ai.mistral.api.MistralAiApi.MistralAiApiException;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.ai.mistralai.api.MistralAiApi.MistralAiApiException;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.springframework.ai.mistral;
package org.springframework.ai.mistralai;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

View File

@@ -0,0 +1,43 @@
/*
* Copyright 2024-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mistralai.aot;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import static org.springframework.ai.aot.AiRuntimeHints.findJsonAnnotatedClassesInPackage;
/**
* The MistralAiRuntimeHints class is responsible for registering runtime hints for
* Mistral AI API classes.
*
* @author Christian Tzolov
* @since 0.8.1
*/
public class MistralAiRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(@NonNull RuntimeHints hints, @Nullable ClassLoader classLoader) {
var mcs = MemberCategory.values();
for (var tr : findJsonAnnotatedClassesInPackage(MistralAiApi.class))
hints.reflection().registerType(tr, mcs);
}
}

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.springframework.ai.mistral.api;
package org.springframework.ai.mistralai.api;
import java.io.IOException;
import java.util.List;

View File

@@ -0,0 +1,2 @@
org.springframework.aot.hint.RuntimeHintsRegistrar=\
org.springframework.ai.mistralai.aot.MistralAiRuntimeHints

View File

@@ -14,10 +14,14 @@
* limitations under the License.
*/
package org.springframework.ai.mistral;
package org.springframework.ai.mistralai;
import org.springframework.ai.embedding.EmbeddingClient;
import org.springframework.ai.mistral.api.MistralAiApi;
import org.springframework.ai.mistralai.MistralAiChatClient;
import org.springframework.ai.mistralai.MistralAiChatOptions;
import org.springframework.ai.mistralai.MistralAiEmbeddingClient;
import org.springframework.ai.mistralai.MistralAiEmbeddingOptions;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.util.StringUtils;

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.springframework.ai.mistral.chat;
package org.springframework.ai.mistralai.chat;
import java.util.Arrays;
import java.util.List;
@@ -36,7 +36,7 @@ import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.ai.mistral.MistralAiTestConfiguration;
import org.springframework.ai.mistralai.MistralAiTestConfiguration;
import org.springframework.ai.parser.BeanOutputParser;
import org.springframework.ai.parser.ListOutputParser;
import org.springframework.ai.parser.MapOutputParser;

View File

@@ -14,15 +14,15 @@
* limitations under the License.
*/
package org.springframework.ai.mistral.chat;
package org.springframework.ai.mistralai.chat;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.mistral.MistralAiChatClient;
import org.springframework.ai.mistral.MistralAiChatOptions;
import org.springframework.ai.mistral.api.MistralAiApi;
import org.springframework.ai.mistralai.MistralAiChatClient;
import org.springframework.ai.mistralai.MistralAiChatOptions;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.springframework.ai.mistral.chat.api;
package org.springframework.ai.mistralai.chat.api;
import java.util.List;
@@ -22,14 +22,14 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import reactor.core.publisher.Flux;
import org.springframework.ai.mistral.api.MistralAiApi;
import org.springframework.ai.mistral.api.MistralAiApi.ChatCompletionMessage.Role;
import org.springframework.ai.mistral.api.MistralAiApi.ChatCompletionRequest;
import org.springframework.ai.mistral.api.MistralAiApi.Embedding;
import org.springframework.ai.mistral.api.MistralAiApi.EmbeddingList;
import org.springframework.ai.mistral.api.MistralAiApi.ChatCompletion;
import org.springframework.ai.mistral.api.MistralAiApi.ChatCompletionChunk;
import org.springframework.ai.mistral.api.MistralAiApi.ChatCompletionMessage;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionChunk;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionMessage;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest;
import org.springframework.ai.mistralai.api.MistralAiApi.Embedding;
import org.springframework.ai.mistralai.api.MistralAiApi.EmbeddingList;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionMessage.Role;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;

View File

@@ -13,14 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mistral.embedding;
package org.springframework.ai.mistralai.embedding;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.mistral.MistralAiEmbeddingClient;
import org.springframework.ai.mistral.MistralAiEmbeddingOptions;
import org.springframework.ai.mistralai.MistralAiEmbeddingClient;
import org.springframework.ai.mistralai.MistralAiEmbeddingOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

View File

@@ -1,9 +1,26 @@
/*
* Copyright 2024-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.openai.aot;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import static org.springframework.ai.aot.AiRuntimeHints.findJsonAnnotatedClassesInPackage;
@@ -18,7 +35,7 @@ import static org.springframework.ai.aot.AiRuntimeHints.findJsonAnnotatedClasses
public class OpenAiRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
public void registerHints(@NonNull RuntimeHints hints, @Nullable ClassLoader classLoader) {
var mcs = MemberCategory.values();
for (var tr : findJsonAnnotatedClassesInPackage(OpenAiApi.class))
hints.reflection().registerType(tr, mcs);

View File

@@ -17,9 +17,9 @@
package org.springframework.ai.autoconfigure.mistralai;
import org.springframework.ai.embedding.EmbeddingClient;
import org.springframework.ai.mistral.MistralAiChatClient;
import org.springframework.ai.mistral.MistralAiEmbeddingClient;
import org.springframework.ai.mistral.api.MistralAiApi;
import org.springframework.ai.mistralai.MistralAiChatClient;
import org.springframework.ai.mistralai.MistralAiEmbeddingClient;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -46,7 +46,7 @@ public class MistralAiAutoConfiguration {
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = MistralAiEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",
matchIfMissing = true)
public EmbeddingClient mistralAiEmbeddingClient(MistralAiCommonProperties commonProperties,
public MistralAiEmbeddingClient mistralAiEmbeddingClient(MistralAiCommonProperties commonProperties,
MistralAiEmbeddingProperties embeddingProperties, RestClient.Builder restClientBuilder) {
var mistralAiApi = mistralAiApi(embeddingProperties.getApiKey(), commonProperties.getApiKey(),

View File

@@ -16,7 +16,7 @@
package org.springframework.ai.autoconfigure.mistralai;
import org.springframework.ai.mistral.MistralAiChatOptions;
import org.springframework.ai.mistralai.MistralAiChatOptions;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

View File

@@ -17,7 +17,7 @@
package org.springframework.ai.autoconfigure.mistralai;
import org.springframework.ai.document.MetadataMode;
import org.springframework.ai.mistral.MistralAiEmbeddingOptions;
import org.springframework.ai.mistralai.MistralAiEmbeddingOptions;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

View File

@@ -29,8 +29,8 @@ import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.mistral.MistralAiChatClient;
import org.springframework.ai.mistral.MistralAiEmbeddingClient;
import org.springframework.ai.mistralai.MistralAiChatClient;
import org.springframework.ai.mistralai.MistralAiEmbeddingClient;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;