From 64d0b13896e362a6fb56594e6d0591c99ad3f551 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Sat, 22 Jun 2024 11:53:48 -0400 Subject: [PATCH] Remove PaLM Model support --- models/spring-ai-vertex-ai-palm2/README.md | 4 - models/spring-ai-vertex-ai-palm2/pom.xml | 60 -- .../palm2/VertexAiPaLm2ChatModel.java | 113 ---- .../palm2/VertexAiPaLm2ChatOptions.java | 139 ---- .../palm2/VertexAiPaLm2EmbeddingModel.java | 55 -- .../palm2/aot/VertexRuntimeHints.java | 42 -- .../vertexai/palm2/api/VertexAiPaLm2Api.java | 599 ------------------ .../resources/META-INF/spring/aot.factories | 2 - .../VertexAiPaLm2ChatGenerationClientIT.java | 145 ----- .../palm2/VertexAiPaLm2ChatRequestTests.java | 88 --- .../palm2/VertexAiPaLm2EmbeddingModelIT.java | 77 --- .../palm2/aot/VertexRuntimeHintsTests.java | 43 -- .../palm2/api/VertexAiPaLm2ApiIT.java | 124 ---- .../palm2/api/VertexAiPaLm2ApiTests.java | 149 ----- .../Google Generative AI - PaLM2 REST API.jpg | Bin 238914 -> 0 bytes .../test/resources/prompts/system-message.st | 4 - pom.xml | 2 - .../src/main/antora/modules/ROOT/nav.adoc | 1 - .../pages/api/chat/vertexai-palm2-chat.adoc | 222 ------- .../palm2/VertexAiPalm2AutoConfiguration.java | 68 -- .../VertexAiPalm2ConnectionProperties.java | 53 -- .../VertexAiPalm2EmbeddingProperties.java | 52 -- .../palm2/VertexAiPlam2ChatProperties.java | 71 --- .../VertexAiPaLm2AutoConfigurationIT.java | 118 ---- .../spring-ai-starter-vertex-ai-palm2/pom.xml | 42 -- vector-stores/spring-ai-milvus-store/pom.xml | 7 - 26 files changed, 2280 deletions(-) delete mode 100644 models/spring-ai-vertex-ai-palm2/README.md delete mode 100644 models/spring-ai-vertex-ai-palm2/pom.xml delete mode 100644 models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatModel.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatOptions.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModel.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHints.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2Api.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/main/resources/META-INF/spring/aot.factories delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatGenerationClientIT.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatRequestTests.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModelIT.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHintsTests.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiIT.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiTests.java delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/resources/Google Generative AI - PaLM2 REST API.jpg delete mode 100644 models/spring-ai-vertex-ai-palm2/src/test/resources/prompts/system-message.st delete mode 100644 spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/vertexai-palm2-chat.adoc delete mode 100644 spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2AutoConfiguration.java delete mode 100644 spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2ConnectionProperties.java delete mode 100644 spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2EmbeddingProperties.java delete mode 100644 spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPlam2ChatProperties.java delete mode 100644 spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPaLm2AutoConfigurationIT.java delete mode 100644 spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2/pom.xml diff --git a/models/spring-ai-vertex-ai-palm2/README.md b/models/spring-ai-vertex-ai-palm2/README.md deleted file mode 100644 index 59a1315fb..000000000 --- a/models/spring-ai-vertex-ai-palm2/README.md +++ /dev/null @@ -1,4 +0,0 @@ -[VertexAI PaLM2 Chat Documentation](https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/api/chat/vertexai-palm2-chat.html) - -[VertexAI PaLM2 Embedding Documentation](https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/api/embeddings/vertexai-embeddings.html) - diff --git a/models/spring-ai-vertex-ai-palm2/pom.xml b/models/spring-ai-vertex-ai-palm2/pom.xml deleted file mode 100644 index 448a3143f..000000000 --- a/models/spring-ai-vertex-ai-palm2/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - - org.springframework.ai - spring-ai - 1.0.0-SNAPSHOT - ../../pom.xml - - spring-ai-vertex-ai-palm2 - jar - Spring AI Model - Vertex AI PaLM2 - Vertex AI PaLM2 models support - https://github.com/spring-projects/spring-ai - - - https://github.com/spring-projects/spring-ai - git://github.com/spring-projects/spring-ai.git - git@github.com:spring-projects/spring-ai.git - - - - - - - org.springframework.ai - spring-ai-core - ${project.parent.version} - - - - org.springframework - spring-web - ${spring-framework.version} - - - - - - org.springframework - spring-context-support - - - - org.springframework.boot - spring-boot-starter-logging - - - - - org.springframework.ai - spring-ai-test - ${project.version} - test - - - - - diff --git a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatModel.java b/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatModel.java deleted file mode 100644 index db22e132f..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatModel.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2; - -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.ai.chat.model.ChatModel; -import org.springframework.ai.chat.prompt.ChatOptions; -import org.springframework.ai.chat.model.ChatResponse; -import org.springframework.ai.chat.model.Generation; -import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageRequest; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageResponse; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.MessagePrompt; -import org.springframework.ai.chat.messages.MessageType; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; - -/** - * @author Christian Tzolov - */ -public class VertexAiPaLm2ChatModel implements ChatModel { - - private final VertexAiPaLm2Api vertexAiApi; - - private final VertexAiPaLm2ChatOptions defaultOptions; - - public VertexAiPaLm2ChatModel(VertexAiPaLm2Api vertexAiApi) { - this(vertexAiApi, - VertexAiPaLm2ChatOptions.builder().withTemperature(0.7f).withCandidateCount(1).withTopK(20).build()); - } - - public VertexAiPaLm2ChatModel(VertexAiPaLm2Api vertexAiApi, VertexAiPaLm2ChatOptions defaultOptions) { - Assert.notNull(defaultOptions, "Default options must not be null!"); - Assert.notNull(vertexAiApi, "VertexAiPaLm2Api must not be null!"); - - this.vertexAiApi = vertexAiApi; - this.defaultOptions = defaultOptions; - } - - @Override - public ChatResponse call(Prompt prompt) { - - GenerateMessageRequest request = createRequest(prompt); - - GenerateMessageResponse response = this.vertexAiApi.generateMessage(request); - - List generations = response.candidates() - .stream() - .map(vmsg -> new Generation(vmsg.content())) - .toList(); - - return new ChatResponse(generations); - } - - /** - * Accessible for testing. - */ - GenerateMessageRequest createRequest(Prompt prompt) { - - String vertexContext = prompt.getInstructions() - .stream() - .filter(m -> m.getMessageType() == MessageType.SYSTEM) - .map(m -> m.getContent()) - .collect(Collectors.joining(System.lineSeparator())); - - List vertexMessages = prompt.getInstructions() - .stream() - .filter(m -> m.getMessageType() == MessageType.USER || m.getMessageType() == MessageType.ASSISTANT) - .map(m -> new VertexAiPaLm2Api.Message(m.getMessageType().getValue(), m.getContent())) - .toList(); - - Assert.isTrue(!CollectionUtils.isEmpty(vertexMessages), "No user or assistant messages found in the prompt!"); - - var vertexPrompt = new MessagePrompt(vertexContext, vertexMessages); - - GenerateMessageRequest request = new GenerateMessageRequest(vertexPrompt); - - if (this.defaultOptions != null) { - request = ModelOptionsUtils.merge(request, this.defaultOptions, GenerateMessageRequest.class); - } - - if (prompt.getOptions() != null) { - VertexAiPaLm2ChatOptions updatedRuntimeOptions = ModelOptionsUtils.copyToTarget(prompt.getOptions(), - ChatOptions.class, VertexAiPaLm2ChatOptions.class); - request = ModelOptionsUtils.merge(updatedRuntimeOptions, request, GenerateMessageRequest.class); - } - - return request; - } - - @Override - public ChatOptions getDefaultOptions() { - return VertexAiPaLm2ChatOptions.fromOptions(this.defaultOptions); - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatOptions.java b/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatOptions.java deleted file mode 100644 index 55742ff05..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatOptions.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; - -import org.springframework.ai.chat.prompt.ChatOptions; - -/** - * @author Christian Tzolov - */ -@JsonInclude(Include.NON_NULL) -public class VertexAiPaLm2ChatOptions implements ChatOptions { - - // @formatter:off - /** - * Controls the randomness of the output. Values can range over [0.0,1.0], inclusive. - * A value closer to 1.0 will produce responses that are more varied, while a value - * closer to 0.0 will typically result in less surprising responses from the - * generative. This value specifies default to be used by the backend while making the - * call to the generative. - */ - private @JsonProperty("temperature") Float temperature; - - /** - * The number of generated response messages to return. This value must be between [1, - * 8], inclusive. Defaults to 1. - */ - private @JsonProperty("candidateCount") Integer candidateCount; - - /** - * The maximum cumulative probability of tokens to consider when sampling. The - * generative uses combined Top-k and nucleus sampling. Nucleus sampling considers the - * smallest set of tokens whose probability sum is at least topP. - */ - private @JsonProperty("topP") Float topP; - - /** - * The maximum number of tokens to consider when sampling. The generative uses - * combined Top-k and nucleus sampling. Top-k sampling considers the set of topK most - * probable tokens. - */ - private @JsonProperty("topK") Integer topK; - // @formatter:on - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private VertexAiPaLm2ChatOptions options = new VertexAiPaLm2ChatOptions(); - - public Builder withTemperature(Float temperature) { - this.options.temperature = temperature; - return this; - } - - public Builder withCandidateCount(Integer candidateCount) { - this.options.candidateCount = candidateCount; - return this; - } - - public Builder withTopP(Float topP) { - this.options.topP = topP; - return this; - } - - public Builder withTopK(Integer topK) { - this.options.topK = topK; - return this; - } - - public VertexAiPaLm2ChatOptions build() { - return this.options; - } - - } - - @Override - public Float getTemperature() { - return this.temperature; - } - - public void setTemperature(Float temperature) { - this.temperature = temperature; - } - - public Integer getCandidateCount() { - return this.candidateCount; - } - - public void setCandidateCount(Integer candidateCount) { - this.candidateCount = candidateCount; - } - - @Override - public Float getTopP() { - return this.topP; - } - - public void setTopP(Float topP) { - this.topP = topP; - } - - @Override - public Integer getTopK() { - return this.topK; - } - - public void setTopK(Integer topK) { - this.topK = topK; - } - - public static VertexAiPaLm2ChatOptions fromOptions(VertexAiPaLm2ChatOptions fromOptions) { - return VertexAiPaLm2ChatOptions.builder() - .withTemperature(fromOptions.getTemperature()) - .withCandidateCount(fromOptions.getCandidateCount()) - .withTopP(fromOptions.getTopP()) - .withTopK(fromOptions.getTopK()) - .build(); - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModel.java b/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModel.java deleted file mode 100644 index 59ee71cd1..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModel.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.springframework.ai.document.Document; -import org.springframework.ai.embedding.AbstractEmbeddingModel; -import org.springframework.ai.embedding.Embedding; -import org.springframework.ai.embedding.EmbeddingRequest; -import org.springframework.ai.embedding.EmbeddingResponse; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; - -/** - * @author Christian Tzolov - */ -public class VertexAiPaLm2EmbeddingModel extends AbstractEmbeddingModel { - - private final VertexAiPaLm2Api vertexAiApi; - - public VertexAiPaLm2EmbeddingModel(VertexAiPaLm2Api vertexAiApi) { - this.vertexAiApi = vertexAiApi; - } - - @Override - public List embed(Document document) { - return embed(document.getContent()); - } - - @Override - public EmbeddingResponse call(EmbeddingRequest request) { - List vertexEmbeddings = this.vertexAiApi.batchEmbedText(request.getInstructions()); - AtomicInteger indexCounter = new AtomicInteger(0); - List embeddings = vertexEmbeddings.stream() - .map(vm -> new Embedding(vm.value(), indexCounter.getAndIncrement())) - .toList(); - return new EmbeddingResponse(embeddings); - - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHints.java b/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHints.java deleted file mode 100644 index 65a8952c6..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHints.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2.aot; - -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.aot.hint.MemberCategory; -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.RuntimeHintsRegistrar; - -import static org.springframework.ai.aot.AiRuntimeHints.findJsonAnnotatedClassesInPackage; - -/** - * The VertexRuntimeHints class is responsible for registering runtime hints for Vertex AI - * API classes. - * - * @author Josh Long - * @author Christian Tzolov - * @author Mark Pollack - */ -public class VertexRuntimeHints implements RuntimeHintsRegistrar { - - @Override - public void registerHints(RuntimeHints hints, ClassLoader classLoader) { - var mcs = MemberCategory.values(); - for (var tr : findJsonAnnotatedClassesInPackage(VertexAiPaLm2Api.class)) - hints.reflection().registerType(tr, mcs); - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2Api.java b/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2Api.java deleted file mode 100644 index 94e7c3295..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2Api.java +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2.api; - -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.Assert; -import org.springframework.web.client.ResponseErrorHandler; -import org.springframework.web.client.RestClient; - -// @formatter:off -/** - * Vertex AI API client for the Generative Language model. - * https://developers.generativeai.google/api/rest/generativelanguage - * https://cloud.google.com/vertex-ai/docs/generative-ai/learn/streaming - * - * Provides methods to generate a response from the model given an input - * https://developers.generativeai.google/api/rest/generativelanguage/models/generateMessage - * - * as well as to generate embeddings for the input text: - * https://developers.generativeai.google/api/rest/generativelanguage/models/embedText - * - * - * Supported models: - * - *
- * 		name=models/chat-bison-001,
- * 		version=001,
- * 		displayName=Chat Bison,
- * 		description=Chat-optimized generative language model.,
- * 		inputTokenLimit=4096,
- * 		outputTokenLimit=1024,
- * 		supportedGenerationMethods=[generateMessage, countMessageTokens],
- * 		temperature=0.25,
- * 		topP=0.95,
- *		topK=40
- *
- * 		name=models/text-bison-001,
- *		version=001,
- *		displayName=Text Bison,
- *		description=Model targeted for text generation.,
- * 		inputTokenLimit=8196,
- *		outputTokenLimit=1024,
- *		supportedGenerationMethods=[generateText, countTextTokens, createTunedTextModel],
- *		temperature=0.7,
- *		topP=0.95,
- *		topK=40
- *
- * 		name=models/embedding-gecko-001,
- * 		version=001,
- * 		displayName=Embedding Gecko, description=Obtain a distributed representation of a text.,
- * 		inputTokenLimit=1024,
- * 		outputTokenLimit=1,
- * 		supportedGenerationMethods=[embedText, countTextTokens],
- * 		temperature=null,
- * 		topP=null,
- * 		topK=null
- * 
- * - * https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models - * - * https://ai.google.dev/api/rest#rest-resource:-v1.models - * - * @author Christian Tzolov - */ -public class VertexAiPaLm2Api { - - /** - * The default generation model. This model is used to generate responses for the - * input text. - */ - public static final String DEFAULT_GENERATE_MODEL = "chat-bison-001"; - - /** - * The default embedding model. This model is used to generate embeddings for the - * input text. - */ - public static final String DEFAULT_EMBEDDING_MODEL = "embedding-gecko-001"; - - /** - * The default base URL for accessing the Vertex AI API. - */ - public static final String DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com/v1beta3"; - - private final RestClient restClient; - - private final String apiKey; - - private final String chatModel; - - private final String embeddingModel; - - /** - * Create a new chat completion api. - * @param apiKey vertex apiKey. - */ - public VertexAiPaLm2Api(String apiKey) { - this(DEFAULT_BASE_URL, apiKey, DEFAULT_GENERATE_MODEL, DEFAULT_EMBEDDING_MODEL, RestClient.builder()); - } - - /** - * Create a new chat completion api. - * @param baseUrl api base URL. - * @param apiKey vertex apiKey. - * @param model vertex model. - * @param embeddingModel vertex embedding model. - * @param restClientBuilder RestClient builder. - */ - public VertexAiPaLm2Api(String baseUrl, String apiKey, String model, String embeddingModel, - RestClient.Builder restClientBuilder) { - - this.chatModel = model; - this.embeddingModel = embeddingModel; - this.apiKey = apiKey; - - Consumer jsonContentHeaders = headers -> { - headers.setAccept(List.of(MediaType.APPLICATION_JSON)); - headers.setContentType(MediaType.APPLICATION_JSON); - }; - - ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() { - @Override - public boolean hasError(ClientHttpResponse response) throws IOException { - return response.getStatusCode().isError(); - } - - @Override - public void handleError(ClientHttpResponse response) throws IOException { - if (response.getStatusCode().isError()) { - throw new RuntimeException(String.format("%s - %s", response.getStatusCode().value(), - new ObjectMapper().readValue(response.getBody(), ResponseError.class))); - } - } - }; - - this.restClient = restClientBuilder.baseUrl(baseUrl) - .defaultHeaders(jsonContentHeaders) - .defaultStatusHandler(responseErrorHandler) - .build(); - } - - /** - * Generates a response from the model given an input. - * @param request Request body. - * @return Response body. - */ - @SuppressWarnings("null") - public GenerateMessageResponse generateMessage(GenerateMessageRequest request) { - Assert.notNull(request, "The request body can not be null."); - - return this.restClient.post() - .uri("/models/{model}:generateMessage?key={apiKey}", this.chatModel, this.apiKey) - .body(request) - .retrieve() - .body(GenerateMessageResponse.class); - } - - /** - * Generates a response from the model given an input. - * @param text Text to embed. - * @return Embedding response. - */ - public Embedding embedText(String text) { - Assert.hasText(text, "The text can not be null or empty."); - - @JsonInclude(Include.NON_NULL) - record EmbeddingResponse(Embedding embedding) { - } - - EmbeddingResponse response = this.restClient.post() - .uri("/models/{model}:embedText?key={apiKey}", this.embeddingModel, this.apiKey) - .body(Map.of("text", text)) - .retrieve() - .body(EmbeddingResponse.class); - - return response != null ? response.embedding() : null; - } - - @JsonInclude(Include.NON_NULL) - record BatchEmbeddingResponse(List embeddings) { - } - - /** - * Generates a response from the model given an input. - * @param texts List of texts to embed. - * @return Embedding response containing a list of embeddings. - */ - public List batchEmbedText(List texts) { - Assert.notNull(texts, "The texts can not be null."); - - - BatchEmbeddingResponse response = this.restClient.post() - .uri("/models/{model}:batchEmbedText?key={apiKey}", this.embeddingModel, this.apiKey) - // https://developers.generativeai.google/api/rest/generativelanguage/models/batchEmbedText#request-body - .body(Map.of("texts", texts)) - .retrieve() - .body(BatchEmbeddingResponse.class); - - return response != null ? response.embeddings() : null; - } - - /** - * Returns the number of tokens in the message prompt. - * @param prompt Message prompt to count tokens for. - * @return Number of tokens in the message prompt. - */ - public Integer countMessageTokens(MessagePrompt prompt) { - - Assert.notNull(prompt, "The message prompt can not be null."); - - record TokenCount(@JsonProperty("tokenCount") Integer tokenCount) { - } - - TokenCount tokenCountResponse = this.restClient.post() - .uri("/models/{model}:countMessageTokens?key={apiKey}", this.chatModel, this.apiKey) - .body(Map.of("prompt", prompt)) - .retrieve() - .body(TokenCount.class); - - return tokenCountResponse != null ? tokenCountResponse.tokenCount() : null; - } - - /** - * Returns the list of models available for use. - * @return List of models available for use. - */ - public List listModels() { - - @JsonInclude(Include.NON_NULL) - record ModelList(@JsonProperty("models") List models) { - record ModelName(String name) { - } - } - - - ModelList modelList = this.restClient.get() - .uri("/models?key={apiKey}", this.apiKey) - .retrieve() - .body(ModelList.class); - - return modelList == null ? List.of() : - modelList.models().stream() - .map(ModelList.ModelName::name) - .toList(); - } - - /** - * Returns the model details. - * @param modelName Name of the model to get details for. - * @return Model details. - */ - public Model getModel(String modelName) { - - Assert.hasText(modelName, "The model name can not be null or empty."); - - if (modelName.startsWith("models/")) { - modelName = modelName.substring("models/".length()); - } - - return this.restClient.get() - .uri("/models/{model}?key={apiKey}", modelName, this.apiKey) - .retrieve() - .body(Model.class); - } - - /** - * API error response. - * - * @param error Error details. - */ - @JsonInclude(Include.NON_NULL) - public record ResponseError( - @JsonProperty("error") Error error) { - - /** - * Error details. - * - * @param message Error message. - * @param code Error code. - * @param status Error status. - */ - @JsonInclude(Include.NON_NULL) - public record Error( - @JsonProperty("message") String message, - @JsonProperty("code") String code, - @JsonProperty("status") String status) { - } - } - - /** - * Information about a Generative Language Model. - * - * @param name The resource name of the Model. Format: `models/{model} with a {model} - * naming convention of:` - * - *
-	 * {baseModelId}-{version}
-	 * 
- * @param baseModelId The name of the base model, pass this to the generation request. - * @param version The version of the model. This represents the major version. - * @param displayName The human-readable name of the model. E.g. "Chat Bison". The - * name can be up to 128 characters long and can consist of any UTF-8 characters. - * @param description A short description of the model. - * @param inputTokenLimit Maximum number of input tokens allowed for this model. - * @param outputTokenLimit Maximum number of output tokens allowed for this model. - * @param supportedGenerationMethods List of supported generation methods for this - * model. The method names are defined as Pascal case strings, such as generateMessage - * which correspond to API methods. - * @param temperature Controls the randomness of the output. Values can range over - * [0.0,1.0], inclusive. A value closer to 1.0 will produce responses that are more - * varied, while a value closer to 0.0 will typically result in less surprising - * responses from the model. This value specifies default to be used by the backend - * while making the call to the model. - * @param topP For Nucleus sampling. Nucleus sampling considers the smallest set of - * tokens whose probability sum is at least topP. This value specifies default to be - * used by the backend while making the call to the model. - * @param topK For Top-k sampling. Top-k sampling considers the set of topK most - * probable tokens. This value specifies default to be used by the backend while - * making the call to the model. - */ - @JsonInclude(Include.NON_NULL) - public record Model( - @JsonProperty("name") String name, - @JsonProperty("baseModelId") String baseModelId, - @JsonProperty("version") String version, - @JsonProperty("displayName") String displayName, - @JsonProperty("description") String description, - @JsonProperty("inputTokenLimit") Integer inputTokenLimit, - @JsonProperty("outputTokenLimit") Integer outputTokenLimit, - @JsonProperty("supportedGenerationMethods") List supportedGenerationMethods, - @JsonProperty("temperature") Float temperature, - @JsonProperty("topP") Float topP, - @JsonProperty("topK") Integer topK) { - } - - /** - * A list of floats representing the embedding. - * - * @param value The embedding values. - */ - @JsonInclude(Include.NON_NULL) - public record Embedding( - @JsonProperty("value") List value) { - - } - - /** - * The base unit of structured text. A Message includes an author and the content of - * the Message. The author is used to tag messages when they are fed to the model as - * text. - * - * @param author (optional) Author of the message. This serves as a key for tagging - * the content of this Message when it is fed to the model as text.The author can be - * any alphanumeric string. - * @param content The text content of the structured Message. - * @param citationMetadata (output only) Citation information for model-generated - * content in this Message. If this Message was generated as output from the model, - * this field may be populated with attribution information for any text included in - * the content. This field is used only on output. - */ - @JsonInclude(Include.NON_NULL) - public record Message( - @JsonProperty("author") String author, - @JsonProperty("content") String content, - @JsonProperty("citationMetadata") CitationMetadata citationMetadata) { - - /** - * Short-hand constructor for a message without citation metadata. - * @param author (optional) Author of the message. - * @param content The text content of the structured Message. - */ - public Message(String author, String content) { - this(author, content, null); - } - - /** - * A collection of source attributions for a piece of content. - * - * Citations to sources for a specific response. - */ - @JsonInclude(Include.NON_NULL) - public record CitationMetadata( - @JsonProperty("citationSources") List citationSources) { - } - - /** - * A citation to a source for a portion of a specific response. - * - * @param startIndex (optional) Start of segment of the response that is - * attributed to this source. Index indicates the start of the segment, measured - * in bytes. - * @param endIndex (optional) End of the attributed segment, exclusive. - * @param uri (optional) URI that is attributed as a source for a portion of the - * text. - * @param license (optional) License for the GitHub project that is attributed as - * a source for segment.License info is required for code citations. - */ - @JsonInclude(Include.NON_NULL) - public record CitationSource( - @JsonProperty("startIndex") Integer startIndex, - @JsonProperty("endIndex") Integer endIndex, - @JsonProperty("uri") String uri, - @JsonProperty("license") String license) { - } - } - - /** - * All of the structured input text passed to the model as a prompt. - * - * A MessagePrompt contains a structured set of fields that provide context for the - * conversation, examples of user input/model output message pairs that prime the - * model to respond in different ways, and the conversation history or list of - * messages representing the alternating turns of the conversation between the user - * and the model. - * - * @param context (optional) Text that should be provided to the model first to ground - * the response. If not empty, this context will be given to the model first before - * the examples and messages. When using a context be sure to provide it with every - * request to maintain continuity. This field can be a description of your prompt to - * the model to help provide context and guide the responses. Examples: "Translate the - * phrase from English to French." or "Given a statement, classify the sentiment as - * happy, sad or neutral." Anything included in this field will take precedence over - * message history if the total input size exceeds the model's inputTokenLimit and the - * input request is truncated. - * @param examples (optional) Examples of what the model should generate. This - * includes both user input and the response that the model should emulate. These - * examples are treated identically to conversation messages except that they take - * precedence over the history in messages: If the total input size exceeds the - * model's inputTokenLimit the input will be truncated. Items will be dropped from - * messages before examples. - * @param messages (optional) A snapshot of the recent conversation history sorted - * chronologically. Turns alternate between two authors. If the total input size - * exceeds the model's inputTokenLimit the input will be truncated: The oldest items - * will be dropped from messages. - */ - @JsonInclude(Include.NON_NULL) - public record MessagePrompt( - @JsonProperty("context") String context, - @JsonProperty("examples") List examples, - @JsonProperty("messages") List messages) { - - /** - * Shortcut constructor for a message prompt without context. - * @param messages The conversation history used by the model. - */ - public MessagePrompt(List messages) { - this(null, null, messages); - } - - /** - * Shortcut constructor for a message prompt without context. - * @param context An input/output example used to instruct the Model. It - * demonstrates how the model should respond or format its response. - * @param messages The conversation history used by the model. - */ - public MessagePrompt(String context, List messages) { - this(context, null, messages); - } - - /** - * An input/output example used to instruct the Model. It demonstrates how the - * model should respond or format its response. - * - * @param input An example of an input Message from the user. - * @param output An example of an output Message from the model. - */ - @JsonInclude(Include.NON_NULL) - public record Example( - @JsonProperty("input") Message input, - @JsonProperty("output") Message output) { - } - } - - /** - * Message generation request body. - * - * @param prompt The structured textual input given to the model as a prompt. Given a - * prompt, the model will return what it predicts is the next message in the - * discussion. - * @param temperature (optional) Controls the randomness of the output. Values can - * range over [0.0,1.0], inclusive. A value closer to 1.0 will produce responses that - * are more varied, while a value closer to 0.0 will typically result in less - * surprising responses from the model. - * @param candidateCount (optional) The number of generated response messages to - * return. This value must be between [1, 8], inclusive. If unset, this will default - * to 1. - * @param topP (optional) The maximum cumulative probability of tokens to consider - * when sampling. The model uses combined Top-k and nucleus sampling. Nucleus sampling - * considers the smallest set of tokens whose probability sum is at least topP. - * @param topK (optional) The maximum number of tokens to consider when sampling. The - * model uses combined Top-k and nucleus sampling. Top-k sampling considers the set of - * topK most probable tokens. - */ - @JsonInclude(Include.NON_NULL) - public record GenerateMessageRequest( - @JsonProperty("prompt") MessagePrompt prompt, - @JsonProperty("temperature") Float temperature, - @JsonProperty("candidateCount") Integer candidateCount, - @JsonProperty("topP") Float topP, - @JsonProperty("topK") Integer topK) { - - /** - * Shortcut constructor to create a GenerateMessageRequest with only the prompt - * parameter. - * @param prompt The structured textual input given to the model as a prompt. - */ - public GenerateMessageRequest(MessagePrompt prompt) { - this(prompt, null, null, null, null); - } - - /** - * Shortcut constructor to create a GenerateMessageRequest with only the prompt - * and temperature parameters. - * @param prompt The structured textual input given to the model as a prompt. - * @param temperature (optional) Controls the randomness of the output. - * @param topK (optional) The maximum number of tokens to consider when sampling. - */ - public GenerateMessageRequest(MessagePrompt prompt, Float temperature, Integer topK) { - this(prompt, temperature, null, null, topK); - } - } - - /** - * The response from the model. This includes candidate messages and conversation - * history in the form of chronologically-ordered messages. - * - * @param candidates Candidate response messages from the model. - * @param messages The conversation history used by the model. - * @param filters A set of content filtering metadata for the prompt and response - * text. This indicates which SafetyCategory(s) blocked a candidate from this - * response, the lowest HarmProbability that triggered a block, and the HarmThreshold - * setting for that category. - */ - @JsonInclude(Include.NON_NULL) - public record GenerateMessageResponse( - @JsonProperty("candidates") List candidates, - @JsonProperty("messages") List messages, - @JsonProperty("filters") List filters) { - - /** - * Content filtering metadata associated with processing a single request. It - * contains a reason and an optional supporting string. The reason may be - * unspecified. - * - * @param reason The reason content was blocked during request processing. - * @param message A string that describes the filtering behavior in more detail. - */ - @JsonInclude(Include.NON_NULL) - public record ContentFilter( - @JsonProperty("reason") BlockedReason reason, - @JsonProperty("message") String message) { - - /** - * Reasons why content may have been blocked. - */ - public enum BlockedReason { - - /** - * A blocked reason was not specified. - */ - BLOCKED_REASON_UNSPECIFIED, - /** - * Content was blocked by safety settings. - */ - SAFETY, - /** - * Content was blocked, but the reason is uncategorized. - */ - OTHER - - } - } - } -} -// @formatter:on \ No newline at end of file diff --git a/models/spring-ai-vertex-ai-palm2/src/main/resources/META-INF/spring/aot.factories b/models/spring-ai-vertex-ai-palm2/src/main/resources/META-INF/spring/aot.factories deleted file mode 100644 index b5d460db1..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/main/resources/META-INF/spring/aot.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.aot.hint.RuntimeHintsRegistrar=\ - org.springframework.ai.vertexai.palm2.aot.VertexRuntimeHints \ No newline at end of file diff --git a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatGenerationClientIT.java b/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatGenerationClientIT.java deleted file mode 100644 index 3a98497cb..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatGenerationClientIT.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - -import org.springframework.ai.chat.model.ChatResponse; -import org.springframework.ai.chat.model.Generation; -import org.springframework.ai.chat.messages.Message; -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.converter.BeanOutputConverter; -import org.springframework.ai.converter.ListOutputConverter; -import org.springframework.ai.converter.MapOutputConverter; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; -import org.springframework.core.convert.support.DefaultConversionService; -import org.springframework.core.io.Resource; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest -@EnabledIfEnvironmentVariable(named = "PALM_API_KEY", matches = ".*") -class VertexAiPaLm2ChatGenerationClientIT { - - @Autowired - private VertexAiPaLm2ChatModel chatModel; - - @Value("classpath:/prompts/system-message.st") - private Resource systemResource; - - @Test - void roleTest() { - String request = "Tell me about 3 famous pirates from the Golden Age of Piracy and why they did."; - String name = "Bob"; - String voice = "pirate"; - UserMessage userMessage = new UserMessage(request); - SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource); - Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice)); - Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); - ChatResponse response = chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Bartholomew"); - } - - // @Test - void listOutputConverter() { - DefaultConversionService conversionService = new DefaultConversionService(); - ListOutputConverter outputConverter = new ListOutputConverter(conversionService); - - String format = outputConverter.getFormat(); - String template = """ - List five {subject} - {format} - """; - PromptTemplate promptTemplate = new PromptTemplate(template, - Map.of("subject", "ice cream flavors.", "format", format)); - Prompt prompt = new Prompt(promptTemplate.createMessage()); - Generation generation = this.chatModel.call(prompt).getResult(); - - List list = outputConverter.convert(generation.getOutput().getContent()); - assertThat(list).hasSize(5); - - } - - // @Test - void mapOutputConverter() { - MapOutputConverter outputConverter = new MapOutputConverter(); - - String format = outputConverter.getFormat(); - String template = """ - Provide me a List of {subject} - {format} - """; - PromptTemplate promptTemplate = new PromptTemplate(template, - Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format)); - Prompt prompt = new Prompt(promptTemplate.createMessage()); - Generation generation = chatModel.call(prompt).getResult(); - - Map result = outputConverter.convert(generation.getOutput().getContent()); - assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); - - } - - record ActorsFilmsRecord(String actor, List movies) { - } - - // @Test - void beanOutputConverterRecords() { - - BeanOutputConverter outputConverter = new BeanOutputConverter<>(ActorsFilmsRecord.class); - - String format = outputConverter.getFormat(); - String template = """ - Generate the filmography of 5 movies for Tom Hanks. - {format} - """; - PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format)); - Prompt prompt = new Prompt(promptTemplate.createMessage()); - Generation generation = chatModel.call(prompt).getResult(); - - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); - assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); - assertThat(actorsFilms.movies()).hasSize(5); - } - - @SpringBootConfiguration - public static class TestConfiguration { - - @Bean - public VertexAiPaLm2Api vertexAiApi() { - return new VertexAiPaLm2Api(System.getenv("PALM_API_KEY")); - } - - @Bean - public VertexAiPaLm2ChatModel vertexAiEmbedding(VertexAiPaLm2Api vertexAiApi) { - return new VertexAiPaLm2ChatModel(vertexAiApi); - } - - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatRequestTests.java b/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatRequestTests.java deleted file mode 100644 index 81a07a150..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatRequestTests.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2; - -import org.junit.jupiter.api.Test; - -import org.springframework.ai.chat.prompt.ChatOptions; -import org.springframework.ai.chat.prompt.ChatOptionsBuilder; -import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Christian Tzolov - */ -public class VertexAiPaLm2ChatRequestTests { - - VertexAiPaLm2ChatModel chatModel = new VertexAiPaLm2ChatModel(new VertexAiPaLm2Api("bla")); - - @Test - public void createRequestWithDefaultOptions() { - - var request = chatModel.createRequest(new Prompt("Test message content")); - - assertThat(request.prompt().messages()).hasSize(1); - - assertThat(request.candidateCount()).isEqualTo(1); - assertThat(request.temperature()).isEqualTo(0.7f); - assertThat(request.topK()).isEqualTo(20); - assertThat(request.topP()).isNull(); - } - - @Test - public void createRequestWithPromptVertexAiOptions() { - - // Runtime options should override the default options. - VertexAiPaLm2ChatOptions promptOptions = VertexAiPaLm2ChatOptions.builder() - .withTemperature(0.8f) - .withTopP(0.5f) - .withTopK(99) - // .withCandidateCount(2) - .build(); - - var request = chatModel.createRequest(new Prompt("Test message content", promptOptions)); - - assertThat(request.prompt().messages()).hasSize(1); - - assertThat(request.candidateCount()).isEqualTo(1); - assertThat(request.temperature()).isEqualTo(0.8f); - assertThat(request.topK()).isEqualTo(99); - assertThat(request.topP()).isEqualTo(0.5f); - } - - @Test - public void createRequestWithPromptPortableChatOptions() { - - // runtime options. - ChatOptions portablePromptOptions = ChatOptionsBuilder.builder() - .withTemperature(0.9f) - .withTopK(100) - .withTopP(0.6f) - .build(); - - var request = chatModel.createRequest(new Prompt("Test message content", portablePromptOptions)); - - assertThat(request.prompt().messages()).hasSize(1); - - assertThat(request.candidateCount()).isEqualTo(1); - assertThat(request.temperature()).isEqualTo(0.9f); - assertThat(request.topK()).isEqualTo(100); - assertThat(request.topP()).isEqualTo(0.6f); - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModelIT.java b/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModelIT.java deleted file mode 100644 index 2e05dbfd1..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2EmbeddingModelIT.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2; - -import java.util.List; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - -import org.springframework.ai.embedding.EmbeddingResponse; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest -@EnabledIfEnvironmentVariable(named = "PALM_API_KEY", matches = ".*") -class VertexAiPaLm2EmbeddingModelIT { - - @Autowired - private VertexAiPaLm2EmbeddingModel embeddingModel; - - @Test - void simpleEmbedding() { - assertThat(embeddingModel).isNotNull(); - EmbeddingResponse embeddingResponse = embeddingModel.embedForResponse(List.of("Hello World")); - assertThat(embeddingResponse.getResults()).hasSize(1); - assertThat(embeddingResponse.getResults().get(0).getOutput()).isNotEmpty(); - assertThat(embeddingModel.dimensions()).isEqualTo(768); - } - - @Test - void batchEmbedding() { - assertThat(embeddingModel).isNotNull(); - EmbeddingResponse embeddingResponse = embeddingModel - .embedForResponse(List.of("Hello World", "World is big and salvation is near")); - assertThat(embeddingResponse.getResults()).hasSize(2); - assertThat(embeddingResponse.getResults().get(0).getOutput()).isNotEmpty(); - assertThat(embeddingResponse.getResults().get(0).getIndex()).isEqualTo(0); - assertThat(embeddingResponse.getResults().get(1).getOutput()).isNotEmpty(); - assertThat(embeddingResponse.getResults().get(1).getIndex()).isEqualTo(1); - - assertThat(embeddingModel.dimensions()).isEqualTo(768); - } - - @SpringBootConfiguration - public static class TestConfiguration { - - @Bean - public VertexAiPaLm2Api vertexAiApi() { - return new VertexAiPaLm2Api(System.getenv("PALM_API_KEY")); - } - - @Bean - public VertexAiPaLm2EmbeddingModel vertexAiEmbedding(VertexAiPaLm2Api vertexAiApi) { - return new VertexAiPaLm2EmbeddingModel(vertexAiApi); - } - - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHintsTests.java b/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHintsTests.java deleted file mode 100644 index 5ed21d464..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/aot/VertexRuntimeHintsTests.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2.aot; - -import org.junit.jupiter.api.Test; - -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.TypeReference; - -import java.util.Set; - -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 VertexRuntimeHintsTests { - - @Test - void registerHints() { - RuntimeHints runtimeHints = new RuntimeHints(); - VertexRuntimeHints vertexRuntimeHints = new VertexRuntimeHints(); - vertexRuntimeHints.registerHints(runtimeHints, null); - Set jsonAnnotatedClasses = findJsonAnnotatedClassesInPackage(VertexAiPaLm2Api.class); - for (TypeReference jsonAnnotatedClass : jsonAnnotatedClasses) { - assertThat(runtimeHints).matches(reflection().onType(jsonAnnotatedClass)); - } - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiIT.java b/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiIT.java deleted file mode 100644 index d820d4952..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiIT.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2.api; - -import java.util.List; -import java.util.stream.Collectors; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.Embedding; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageRequest; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageResponse; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.MessagePrompt; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration tests for {@link VertexAiPaLm2Api}. Requires a valid API key to be set via - * the {@code PALM_API_KEY} environment and at the moment Google enables is it only in the - * US region (so use VPN for testing). - * - * @author Christian Tzolov - */ -@EnabledIfEnvironmentVariable(named = "PALM_API_KEY", matches = ".*") -public class VertexAiPaLm2ApiIT { - - VertexAiPaLm2Api vertexAiPaLm2Api = new VertexAiPaLm2Api(System.getenv("PALM_API_KEY")); - - @Test - public void generateMessage() { - - var prompt = new MessagePrompt(List.of(new VertexAiPaLm2Api.Message("0", "Hello, how are you?"))); - - GenerateMessageRequest request = new GenerateMessageRequest(prompt); - - GenerateMessageResponse response = vertexAiPaLm2Api.generateMessage(request); - - assertThat(response).isNotNull(); - - // Vertex returns the prompt messages in the response's messages list. - assertThat(response.messages()).hasSize(1); - assertThat(response.messages().get(0)).isEqualTo(prompt.messages().get(0)); - - // Vertex returns the answer in the response's candidates list. - assertThat(response.candidates()).hasSize(1); - assertThat(response.candidates().get(0).author()).isNotBlank(); - assertThat(response.candidates().get(0).content()).isNotBlank(); - } - - @Test - public void embedText() { - - var text = "Hello, how are you?"; - - Embedding response = vertexAiPaLm2Api.embedText(text); - - assertThat(response).isNotNull(); - assertThat(response.value()).hasSize(768); - } - - @Test - public void batchEmbedText() { - - var text = List.of("Hello, how are you?", "I am fine, thank you!"); - - List response = vertexAiPaLm2Api.batchEmbedText(text); - - assertThat(response).isNotNull(); - assertThat(response).hasSize(2); - assertThat(response.get(0).value()).hasSize(768); - assertThat(response.get(1).value()).hasSize(768); - } - - @Test - public void countMessageTokens() { - - var text = "Hello, how are you?"; - - var prompt = new MessagePrompt(List.of(new VertexAiPaLm2Api.Message("0", text))); - int response = vertexAiPaLm2Api.countMessageTokens(prompt); - - assertThat(response).isEqualTo(17); - } - - @Test - public void listModels() { - - List response = vertexAiPaLm2Api.listModels(); - - assertThat(response).isNotNull(); - assertThat(response).hasSizeGreaterThan(0); - assertThat(response).contains("models/chat-bison-001", "models/text-bison-001", "models/embedding-gecko-001"); - - System.out.println(" - " + response.stream() - .map(vertexAiPaLm2Api::getModel) - .map(VertexAiPaLm2Api.Model::toString) - .collect(Collectors.joining("\n - "))); - } - - @Test - public void getModel() { - - VertexAiPaLm2Api.Model model = vertexAiPaLm2Api.getModel("models/chat-bison-001"); - - System.out.println(model); - assertThat(model).isNotNull(); - assertThat(model.displayName()).isEqualTo("PaLM 2 Chat (Legacy)"); - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiTests.java b/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiTests.java deleted file mode 100644 index aedce410c..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2ApiTests.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2023 - 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.vertexai.palm2.api; - -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.Embedding; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageRequest; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageResponse; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.MessagePrompt; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api.GenerateMessageResponse.ContentFilter.BlockedReason; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.test.web.client.MockRestServiceServer; -import org.springframework.web.client.RestClient; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.content; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestToUriTemplate; -import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; - -/** - * @author Christian Tzolov - */ -@RestClientTest(VertexAiPaLm2ApiTests.Config.class) -public class VertexAiPaLm2ApiTests { - - private final static String TEST_API_KEY = "test-api-key"; - - @Autowired - private VertexAiPaLm2Api client; - - @Autowired - private MockRestServiceServer server; - - @Autowired - private ObjectMapper objectMapper; - - @AfterEach - void resetMockServer() { - server.reset(); - } - - @Test - public void generateMessage() throws JsonProcessingException { - - GenerateMessageRequest request = new GenerateMessageRequest( - new MessagePrompt(List.of(new VertexAiPaLm2Api.Message("0", "Hello, how are you?")))); - - GenerateMessageResponse expectedResponse = new GenerateMessageResponse( - List.of(new VertexAiPaLm2Api.Message("1", "Hello, how are you?")), - List.of(new VertexAiPaLm2Api.Message("0", "I'm fine, thank you.")), - List.of(new VertexAiPaLm2Api.GenerateMessageResponse.ContentFilter(BlockedReason.SAFETY, "reason"))); - - server - .expect(requestToUriTemplate("/models/{generative}:generateMessage?key={apiKey}", - VertexAiPaLm2Api.DEFAULT_GENERATE_MODEL, TEST_API_KEY)) - .andExpect(method(HttpMethod.POST)) - .andExpect(content().json(objectMapper.writeValueAsString(request))) - .andRespond(withSuccess(objectMapper.writeValueAsString(expectedResponse), MediaType.APPLICATION_JSON)); - - GenerateMessageResponse response = client.generateMessage(request); - - assertThat(response).isEqualTo(expectedResponse); - - server.verify(); - } - - @Test - public void embedText() throws JsonProcessingException { - - String text = "Hello, how are you?"; - - Embedding expectedEmbedding = new Embedding(List.of(0.1, 0.2, 0.3)); - - server - .expect(requestToUriTemplate("/models/{generative}:embedText?key={apiKey}", - VertexAiPaLm2Api.DEFAULT_EMBEDDING_MODEL, TEST_API_KEY)) - .andExpect(method(HttpMethod.POST)) - .andExpect(content().json(objectMapper.writeValueAsString(Map.of("text", text)))) - .andRespond(withSuccess(objectMapper.writeValueAsString(Map.of("embedding", expectedEmbedding)), - MediaType.APPLICATION_JSON)); - - Embedding embedding = client.embedText(text); - - assertThat(embedding).isEqualTo(expectedEmbedding); - - server.verify(); - } - - @Test - public void batchEmbedText() throws JsonProcessingException { - - List texts = List.of("Hello, how are you?", "I'm fine, thank you."); - - List expectedEmbeddings = List.of(new Embedding(List.of(0.1, 0.2, 0.3)), - new Embedding(List.of(0.4, 0.5, 0.6))); - - server - .expect(requestToUriTemplate("/models/{generative}:batchEmbedText?key={apiKey}", - VertexAiPaLm2Api.DEFAULT_EMBEDDING_MODEL, TEST_API_KEY)) - .andExpect(method(HttpMethod.POST)) - .andExpect(content().json(objectMapper.writeValueAsString(Map.of("texts", texts)))) - .andRespond(withSuccess(objectMapper.writeValueAsString(Map.of("embeddings", expectedEmbeddings)), - MediaType.APPLICATION_JSON)); - - List embeddings = client.batchEmbedText(texts); - - assertThat(embeddings).isEqualTo(expectedEmbeddings); - - server.verify(); - } - - @SpringBootConfiguration - static class Config { - - @Bean - public VertexAiPaLm2Api audioApi(RestClient.Builder builder) { - return new VertexAiPaLm2Api("", TEST_API_KEY, VertexAiPaLm2Api.DEFAULT_GENERATE_MODEL, - VertexAiPaLm2Api.DEFAULT_EMBEDDING_MODEL, builder); - } - - } - -} diff --git a/models/spring-ai-vertex-ai-palm2/src/test/resources/Google Generative AI - PaLM2 REST API.jpg b/models/spring-ai-vertex-ai-palm2/src/test/resources/Google Generative AI - PaLM2 REST API.jpg deleted file mode 100644 index dba271cf42398a1d86ee56d9b72b38732f67a639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238914 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 diff --git a/models/spring-ai-vertex-ai-palm2/src/test/resources/prompts/system-message.st b/models/spring-ai-vertex-ai-palm2/src/test/resources/prompts/system-message.st deleted file mode 100644 index dc2cf2dcd..000000000 --- a/models/spring-ai-vertex-ai-palm2/src/test/resources/prompts/system-message.st +++ /dev/null @@ -1,4 +0,0 @@ -"You are a helpful AI assistant. Your name is {name}. -You are an AI assistant that helps people find information. -Your name is {name} -You should reply to the user's request with your name and also in the style of a {voice}. \ No newline at end of file diff --git a/pom.xml b/pom.xml index e4faa155b..8960ed984 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,6 @@ models/spring-ai-stability-ai models/spring-ai-transformers models/spring-ai-vertex-ai-gemini - models/spring-ai-vertex-ai-palm2 models/spring-ai-watsonx-ai models/spring-ai-zhipuai models/spring-ai-moonshot @@ -89,7 +88,6 @@ spring-ai-spring-boot-starters/spring-ai-starter-stability-ai spring-ai-spring-boot-starters/spring-ai-starter-transformers spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-gemini - spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2 spring-ai-spring-boot-starters/spring-ai-starter-watsonx-ai spring-ai-spring-boot-starters/spring-ai-starter-zhipuai spring-ai-spring-boot-starters/spring-ai-starter-moonshot diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc index 7bb124bd3..67bb63247 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc @@ -18,7 +18,6 @@ **** xref:api/chat/bedrock/bedrock-jurassic2.adoc[Jurassic2] *** xref:api/chat/huggingface.adoc[Hugging Face] *** xref:api/chat/google-vertexai.adoc[Google VertexAI] -**** xref:api/chat/vertexai-palm2-chat.adoc[VertexAI PaLM2 ] **** xref:api/chat/vertexai-gemini-chat.adoc[VertexAI Gemini] ***** xref:api/chat/functions/vertexai-gemini-chat-functions.adoc[Function Calling] *** xref:api/chat/mistralai-chat.adoc[Mistral AI] diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/vertexai-palm2-chat.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/vertexai-palm2-chat.adoc deleted file mode 100644 index d5f935713..000000000 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/vertexai-palm2-chat.adoc +++ /dev/null @@ -1,222 +0,0 @@ -= VertexAI PaLM2 Chat - -WARNING: - -> https://ai.google.dev/palm_docs/deprecation[As of February 15, 2024, the PaLM2 API for use with Google AI services and tooling is deprecated]. -In 6 months, the PaLM API will be decommissioned, meaning that users won't be able to use a PaLM model in a prompt, tune a new PaLM model, or run inference on PaLM-tuned models. - -The link:https://developers.generativeai.google/api/rest/generativelanguage[Generative Language] PaLM API allows developers to build generative AI applications using the PaLM model. Large Language Models (LLMs) are a powerful, versatile type of machine learning model that enables computers to comprehend and generate natural language through a series of prompts. The PaLM API is based on Google's next generation LLM, PaLM. It excels at a variety of different tasks like code generation, reasoning, and writing. You can use the PaLM API to build generative AI applications for use cases like content generation, dialogue agents, summarization and classification systems, and more. - -Based on the link:https://developers.generativeai.google/api/rest/generativelanguage/models[Models REST API]. - -== Prerequisites - -To access the PaLM2 REST API you need to obtain an access API KEY form link:https://makersuite.google.com/app/apikey[makersuite]. - -NOTE: Currently the PaLM API it is not available outside US, but you can use VPN for testing. - -The Spring AI project defines a configuration property named `spring.ai.vertex.ai.api-key` that you should set to the value of the `API Key` obtained. -Exporting an environment variable is one way to set that configuration property: - -[source,shell] ----- -export SPRING_AI_VERTEX_AI_API_KEY= ----- - -=== Add Repositories and BOM - -Spring AI artifacts are published in Spring Milestone and Snapshot repositories. Refer to the xref:getting-started.adoc#repositories[Repositories] section to add these repositories to your build system. - -To help with dependency management, Spring AI provides a BOM (bill of materials) to ensure that a consistent version of Spring AI is used throughout the entire project. Refer to the xref:getting-started.adoc#dependency-management[Dependency Management] section to add the Spring AI BOM to your build system. - - -== Auto-configuration - -Spring AI provides Spring Boot auto-configuration for the VertexAI Chat Client. -To enable it add the following dependency to your project's Maven `pom.xml` file: - -[source, xml] ----- - - org.springframework.ai - spring-ai-vertex-ai-palm2-spring-boot-starter - ----- - -or to your Gradle `build.gradle` build file. - -[source,groovy] ----- -dependencies { - implementation 'org.springframework.ai:spring-ai-vertex-ai-palm2-spring-boot-starter' -} ----- - -TIP: Refer to the xref:getting-started.adoc#dependency-management[Dependency Management] section to add the Spring AI BOM to your build file. - -=== Chat Properties - -The prefix `spring.ai.vertex.ai` is used as the property prefix that lets you connect to VertexAI. - -[cols="3,5,1"] -|==== -| Property | Description | Default - -| spring.ai.vertex.ai.ai.base-url | The URL to connect to | https://generativelanguage.googleapis.com/v1beta3 -| spring.ai.vertex.ai.api-key | The API Key | - -|==== - -The prefix `spring.ai.vertex.ai.chat` is the property prefix that lets you configure the chat model implementation for VertexAI Chat. - -[cols="3,5,1"] -|==== -| Property | Description | Default - -| spring.ai.vertex.ai.chat.enabled | Enable Vertex AI PaLM API chat model. | true -| spring.ai.vertex.ai.chat.model | This is the https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/text-chat[Vertex Chat model] to use | chat-bison-001 -| spring.ai.vertex.ai.chat.options.temperature | Controls the randomness of the output. Values can range over [0.0,1.0], inclusive. A value closer to 1.0 will produce responses that are more varied, while a value closer to 0.0 will typically result in less surprising responses from the generative. This value specifies default to be used by the backend while making the call to the generative. | 0.7 -| spring.ai.vertex.ai.chat.options.topK | The maximum number of tokens to consider when sampling. The generative uses combined Top-k and nucleus sampling. Top-k sampling considers the set of topK most probable tokens. | 20 -| spring.ai.vertex.ai.chat.options.topP | The maximum cumulative probability of tokens to consider when sampling. The generative uses combined Top-k and nucleus sampling. Nucleus sampling considers the smallest set of tokens whose probability sum is at least topP. | - -| spring.ai.vertex.ai.chat.options.candidateCount | The number of generated response messages to return. This value must be between [1, 8], inclusive. Defaults to 1. | 1 -|==== - -TIP: All properties prefixed with `spring.ai.vertex.ai.chat.options` can be overridden at runtime by adding a request specific <> to the `Prompt` call. - -== Runtime Options [[chat-options]] - -The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-vertex-ai-palm2/src/main/java/org/springframework/ai/vertexai/palm2/VertexAiPaLm2ChatOptions.java[VertexAiPaLm2ChatOptions.java] provides model configurations, such as the temperature, the topK, etc. - -On start-up, the default options can be configured with the `VertexAiPaLm2ChatModel(api, options)` constructor or the `spring.ai.vertex.ai.chat.options.*` properties. - -At run-time you can override the default options by adding new, request specific, options to the `Prompt` call. -For example to override the default temperature for a specific request: - -[source,java] ----- -ChatResponse response = chatModel.call( - new Prompt( - "Generate the names of 5 famous pirates.", - VertexAiPaLm2ChatOptions.builder() - .withTemperature(0.4) - .build() - )); ----- - -TIP: In addition to the model specific `VertexAiPaLm2ChatOptions` you can use a portable https://github.com/spring-projects/spring-ai/blob/main/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java[ChatOptions] instance, created with the https://github.com/spring-projects/spring-ai/blob/main/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatOptionsBuilder.java[ChatOptionsBuilder#builder()]. - -== Sample Controller - -https://start.spring.io/[Create] a new Spring Boot project and add the `spring-ai-vertex-ai-palm2-spring-boot-starter` to your pom (or gradle) dependencies. - -Add a `application.properties` file, under the `src/main/resources` directory, to enable and configure the VertexAi chat model: - -[source,application.properties] ----- -spring.ai.vertex.ai.api-key=YOUR_API_KEY -spring.ai.vertex.ai.chat.model=chat-bison-001 -spring.ai.vertex.ai.chat.options.temperature=0.5 ----- - -TIP: replace the `api-key` with your VertexAI credentials. - -This will create a `VertexAiPaLm2ChatModel` implementation that you can inject into your class. -Here is an example of a simple `@Controller` class that uses the chat model for text generations. - -[source,java] ----- -@RestController -public class ChatController { - - private final VertexAiPaLm2ChatModel chatModel; - - @Autowired - public ChatController(VertexAiPaLm2ChatModel chatModel) { - this.chatModel = chatModel; - } - - @GetMapping("/ai/generate") - public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - return Map.of("generation", chatModel.call(message)); - } - - @GetMapping("/ai/generateStream") - public Flux generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - Prompt prompt = new Prompt(new UserMessage(message)); - return chatModel.stream(prompt); - } -} ----- - -== Manual Configuration - -The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/main/java/org/springframework/ai/vertexai/paml2/VertexAiPaLm2ChatModel.java[VertexAiPaLm2ChatModel] implements the `ChatModel` and uses the <> to connect to the VertexAI service. - -Add the `spring-ai-vertex-ai-palm2` dependency to your project's Maven `pom.xml` file: - -[source, xml] ----- - - org.springframework.ai - spring-ai-vertex-ai-palm2 - ----- - -or to your Gradle `build.gradle` build file. - -[source,groovy] ----- -dependencies { - implementation 'org.springframework.ai:spring-ai-vertex-ai-palm' -} ----- - -TIP: Refer to the xref:getting-started.adoc#dependency-management[Dependency Management] section to add the Spring AI BOM to your build file. - -Next, create a `VertexAiPaLm2ChatModel` and use it for text generations: - -[source,java] ----- -VertexAiPaLm2Api vertexAiApi = new VertexAiPaLm2Api(< YOUR PALM_API_KEY>); - -var chatModel = new VertexAiPaLm2ChatModel(vertexAiApi, - VertexAiPaLm2ChatOptions.builder() - .withTemperature(0.4) - .build()); - -ChatResponse response = chatModel.call( - new Prompt("Generate the names of 5 famous pirates.")); ----- - -The `VertexAiPaLm2ChatOptions` provides the configuration information for the chat requests. -The `VertexAiPaLm2ChatOptions.Builder` is fluent options builder. - -=== Low-level VertexAiPaLm2Api Client [[low-level-api]] - -The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-vertex-aipalm2/src/main/java/org/springframework/ai/vertexai/palm2/api/VertexAiPaLm2Api.java[VertexAiPaLm2Api] provides is lightweight Java client for VertexAiPaLm2Api Chat API. - -Following class diagram illustrates the `VertexAiPaLm2Api` chat interfaces and building blocks: - -image::vertex-ai-chat-low-level-api.jpg[w=800,align="center"] - -Here is a simple snippet how to use the api programmatically: - -[source,java] ----- -VertexAiPaLm2Api vertexAiApi = new VertexAiPaLm2Api(< YOUR PALM_API_KEY>); - -// Generate -var prompt = new MessagePrompt(List.of(new Message("0", "Hello, how are you?"))); - -GenerateMessageRequest request = new GenerateMessageRequest(prompt); - -GenerateMessageResponse response = vertexAiApi.generateMessage(request); - -// Embed text -Embedding embedding = vertexAiApi.embedText("Hello, how are you?"); - -// Batch embedding -List embeddings = vertexAiApi.batchEmbedText(List.of("Hello, how are you?", "I am fine, thank you!")); ----- - - - diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2AutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2AutoConfiguration.java deleted file mode 100644 index 4899f7a52..000000000 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2AutoConfiguration.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2023 - 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.autoconfigure.vertexai.palm2; - -import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; -import org.springframework.ai.vertexai.palm2.VertexAiPaLm2ChatModel; -import org.springframework.ai.vertexai.palm2.VertexAiPaLm2EmbeddingModel; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; -import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.web.client.RestClient; - -@AutoConfiguration(after = RestClientAutoConfiguration.class) -@ConditionalOnClass(VertexAiPaLm2Api.class) -@EnableConfigurationProperties({ VertexAiPalm2ConnectionProperties.class, VertexAiPlam2ChatProperties.class, - VertexAiPalm2EmbeddingProperties.class }) -@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class, - WebClientAutoConfiguration.class }) -public class VertexAiPalm2AutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public VertexAiPaLm2Api vertexAiApi(VertexAiPalm2ConnectionProperties connectionProperties, - VertexAiPalm2EmbeddingProperties embeddingAiProperties, VertexAiPlam2ChatProperties chatProperties, - RestClient.Builder restClientBuilder) { - - return new VertexAiPaLm2Api(connectionProperties.getBaseUrl(), connectionProperties.getApiKey(), - chatProperties.getModel(), embeddingAiProperties.getModel(), restClientBuilder); - } - - @Bean - @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = VertexAiPlam2ChatProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", - matchIfMissing = true) - public VertexAiPaLm2ChatModel vertexAiChatModel(VertexAiPaLm2Api vertexAiApi, - VertexAiPlam2ChatProperties chatProperties) { - return new VertexAiPaLm2ChatModel(vertexAiApi, chatProperties.getOptions()); - } - - @Bean - @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = VertexAiPalm2EmbeddingProperties.CONFIG_PREFIX, name = "enabled", - havingValue = "true", matchIfMissing = true) - public VertexAiPaLm2EmbeddingModel vertexAiEmbeddingModel(VertexAiPaLm2Api vertexAiApi) { - return new VertexAiPaLm2EmbeddingModel(vertexAiApi); - } - -} diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2ConnectionProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2ConnectionProperties.java deleted file mode 100644 index 6c4ae48fb..000000000 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2ConnectionProperties.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2023 - 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.autoconfigure.vertexai.palm2; - -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(VertexAiPalm2ConnectionProperties.CONFIG_PREFIX) -public class VertexAiPalm2ConnectionProperties { - - public static final String CONFIG_PREFIX = "spring.ai.vertex.ai"; - - /** - * Vertex AI PaLM API access key. - */ - private String apiKey; - - /** - * Vertex AI PaLM API base URL. Defaults to - * https://generativelanguage.googleapis.com/v1beta3 - */ - private String baseUrl = VertexAiPaLm2Api.DEFAULT_BASE_URL; - - public String getApiKey() { - return this.apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } - - public String getBaseUrl() { - return this.baseUrl; - } - - public void setBaseUrl(String baseUrl) { - this.baseUrl = baseUrl; - } - -} diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2EmbeddingProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2EmbeddingProperties.java deleted file mode 100644 index 0dc079b03..000000000 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPalm2EmbeddingProperties.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2023 - 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.autoconfigure.vertexai.palm2; - -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(VertexAiPalm2EmbeddingProperties.CONFIG_PREFIX) -public class VertexAiPalm2EmbeddingProperties { - - public static final String CONFIG_PREFIX = "spring.ai.vertex.ai.embedding"; - - /** - * Enable Vertex AI PaLM API embedding model. - */ - private boolean enabled = true; - - /** - * Vertex AI PaLM API embedding generative name. Defaults to embedding-gecko-001. - */ - private String model = VertexAiPaLm2Api.DEFAULT_EMBEDDING_MODEL; - - public String getModel() { - return this.model; - } - - public void setModel(String model) { - this.model = model; - } - - public boolean isEnabled() { - return this.enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - -} diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPlam2ChatProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPlam2ChatProperties.java deleted file mode 100644 index d966f9d7e..000000000 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPlam2ChatProperties.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2023 - 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.autoconfigure.vertexai.palm2; - -import org.springframework.ai.vertexai.palm2.VertexAiPaLm2ChatOptions; -import org.springframework.ai.vertexai.palm2.api.VertexAiPaLm2Api; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(VertexAiPlam2ChatProperties.CONFIG_PREFIX) -public class VertexAiPlam2ChatProperties { - - public static final String CONFIG_PREFIX = "spring.ai.vertex.ai.chat"; - - /** - * Enable Vertex AI PaLM API chat model - */ - private boolean enabled = true; - - /** - * Vertex AI PaLM API generative name. Defaults to chat-bison-001 - */ - private String model = VertexAiPaLm2Api.DEFAULT_GENERATE_MODEL; - - /** - * Vertex AI PaLM API generative options. - */ - private VertexAiPaLm2ChatOptions options = VertexAiPaLm2ChatOptions.builder() - .withTemperature(0.7f) - .withTopP(null) - .withCandidateCount(1) - .withTopK(20) - .build(); - - public String getModel() { - return this.model; - } - - public void setModel(String model) { - this.model = model; - } - - public VertexAiPaLm2ChatOptions getOptions() { - return this.options; - } - - public void setOptions(VertexAiPaLm2ChatOptions options) { - this.options = options; - } - - public boolean isEnabled() { - return this.enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - -} diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPaLm2AutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPaLm2AutoConfigurationIT.java deleted file mode 100644 index 5634da8ad..000000000 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/palm2/VertexAiPaLm2AutoConfigurationIT.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2023 - 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.autoconfigure.vertexai.palm2; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; -import org.springframework.ai.embedding.EmbeddingResponse; -import org.springframework.ai.vertexai.palm2.VertexAiPaLm2ChatModel; -import org.springframework.ai.vertexai.palm2.VertexAiPaLm2EmbeddingModel; -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; - -// NOTE: works only with US location. Use VPN if you are outside US. -@EnabledIfEnvironmentVariable(named = "PALM_API_KEY", matches = ".*") -public class VertexAiPaLm2AutoConfigurationIT { - - private static final Log logger = LogFactory.getLog(VertexAiPaLm2AutoConfigurationIT.class); - - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withPropertyValues("spring.ai.vertex.ai.baseUrl=https://generativelanguage.googleapis.com/v1beta3", - "spring.ai.vertex.ai.apiKey=" + System.getenv("PALM_API_KEY"), - "spring.ai.vertex.ai.chat.model=chat-bison-001", "spring.ai.vertex.ai.chat.options.temperature=0.8", - "spring.ai.vertex.ai.embedding.model=embedding-gecko-001") - .withConfiguration(AutoConfigurations.of(VertexAiPalm2AutoConfiguration.class)); - - @Test - void generate() { - contextRunner.run(context -> { - VertexAiPaLm2ChatModel chatModel = context.getBean(VertexAiPaLm2ChatModel.class); - - String response = chatModel.call("Hello"); - - assertThat(response).isNotEmpty(); - logger.info("Response: " + response); - }); - } - - @Test - void embedding() { - contextRunner.run(context -> { - VertexAiPaLm2EmbeddingModel embeddingModel = context.getBean(VertexAiPaLm2EmbeddingModel.class); - - EmbeddingResponse embeddingResponse = embeddingModel - .embedForResponse(List.of("Hello World", "World is big and salvation is near")); - assertThat(embeddingResponse.getResults()).hasSize(2); - assertThat(embeddingResponse.getResults().get(0).getOutput()).isNotEmpty(); - assertThat(embeddingResponse.getResults().get(0).getIndex()).isEqualTo(0); - assertThat(embeddingResponse.getResults().get(1).getOutput()).isNotEmpty(); - assertThat(embeddingResponse.getResults().get(1).getIndex()).isEqualTo(1); - - assertThat(embeddingModel.dimensions()).isEqualTo(768); - }); - } - - @Test - public void embeddingActivation() { - - // Disable the embedding auto-configuration. - contextRunner.withPropertyValues("spring.ai.vertex.ai.embedding.enabled=false").run(context -> { - assertThat(context.getBeansOfType(VertexAiPalm2EmbeddingProperties.class)).isNotEmpty(); - assertThat(context.getBeansOfType(VertexAiPaLm2EmbeddingModel.class)).isEmpty(); - }); - - // The embedding auto-configuration is enabled by default. - contextRunner.run(context -> { - assertThat(context.getBeansOfType(VertexAiPalm2EmbeddingProperties.class)).isNotEmpty(); - assertThat(context.getBeansOfType(VertexAiPaLm2EmbeddingModel.class)).isNotEmpty(); - }); - - // Explicitly enable the embedding auto-configuration. - contextRunner.withPropertyValues("spring.ai.vertex.ai.embedding.enabled=true").run(context -> { - assertThat(context.getBeansOfType(VertexAiPalm2EmbeddingProperties.class)).isNotEmpty(); - assertThat(context.getBeansOfType(VertexAiPaLm2EmbeddingModel.class)).isNotEmpty(); - }); - } - - @Test - public void chatActivation() { - - // Disable the chat auto-configuration. - contextRunner.withPropertyValues("spring.ai.vertex.ai.chat.enabled=false").run(context -> { - assertThat(context.getBeansOfType(VertexAiPlam2ChatProperties.class)).isNotEmpty(); - assertThat(context.getBeansOfType(VertexAiPaLm2ChatModel.class)).isEmpty(); - }); - - // The chat auto-configuration is enabled by default. - contextRunner.run(context -> { - assertThat(context.getBeansOfType(VertexAiPlam2ChatProperties.class)).isNotEmpty(); - assertThat(context.getBeansOfType(VertexAiPaLm2ChatModel.class)).isNotEmpty(); - }); - - // Explicitly enable the chat auto-configuration. - contextRunner.withPropertyValues("spring.ai.vertex.ai.chat.enabled=true").run(context -> { - assertThat(context.getBeansOfType(VertexAiPlam2ChatProperties.class)).isNotEmpty(); - assertThat(context.getBeansOfType(VertexAiPaLm2ChatModel.class)).isNotEmpty(); - }); - } - -} diff --git a/spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2/pom.xml b/spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2/pom.xml deleted file mode 100644 index eec7a61c0..000000000 --- a/spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - - org.springframework.ai - spring-ai - 1.0.0-SNAPSHOT - ../../pom.xml - - spring-ai-vertex-ai-palm2-spring-boot-starter - jar - Spring AI Starter - VertexAI PaLM2 - Spring AI VertexAI PaLM2 Auto Configuration - https://github.com/spring-projects/spring-ai - - - https://github.com/spring-projects/spring-ai - git://github.com/spring-projects/spring-ai.git - git@github.com:spring-projects/spring-ai.git - - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.ai - spring-ai-spring-boot-autoconfigure - ${project.parent.version} - - - - org.springframework.ai - spring-ai-vertex-ai-palm2 - ${project.parent.version} - - - - diff --git a/vector-stores/spring-ai-milvus-store/pom.xml b/vector-stores/spring-ai-milvus-store/pom.xml index 798ef5be0..dae07c303 100644 --- a/vector-stores/spring-ai-milvus-store/pom.xml +++ b/vector-stores/spring-ai-milvus-store/pom.xml @@ -34,13 +34,6 @@ - - org.springframework.ai - spring-ai-vertex-ai-palm2 - ${parent.version} - test - - org.springframework.ai spring-ai-openai