From ca8a2824ed79fa9159ef0c0070dbe713ffbe2f66 Mon Sep 17 00:00:00 2001 From: Soby Chacko Date: Thu, 12 Dec 2024 17:54:15 -0500 Subject: [PATCH] Typesense vector store builder refactoring --- ...TypesenseVectorStoreAutoConfiguration.java | 20 +- .../TypesenseVectorStoreProperties.java | 2 +- .../TypesenseFilterExpressionConverter.java | 2 +- .../{ => typesense}/TypesenseVectorStore.java | 195 +++++++++++++++--- .../{ => typesense}/TypesenseImage.java | 2 +- .../TypesenseVectorStoreIT.java | 16 +- .../TypesenseVectorStoreObservationIT.java | 20 +- 7 files changed, 199 insertions(+), 58 deletions(-) rename vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/{ => typesense}/TypesenseFilterExpressionConverter.java (97%) rename vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/{ => typesense}/TypesenseVectorStore.java (66%) rename vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/{ => typesense}/TypesenseImage.java (94%) rename vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/{ => typesense}/TypesenseVectorStoreIT.java (96%) rename vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/{ => typesense}/TypesenseVectorStoreObservationIT.java (93%) diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreAutoConfiguration.java index 233fed9bd71..9d259a274d2 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreAutoConfiguration.java @@ -28,8 +28,8 @@ import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.TokenCountBatchingStrategy; -import org.springframework.ai.vectorstore.TypesenseVectorStore; -import org.springframework.ai.vectorstore.TypesenseVectorStore.TypesenseVectorStoreConfig; +import org.springframework.ai.vectorstore.typesense.TypesenseVectorStore; +import org.springframework.ai.vectorstore.typesense.TypesenseVectorStore.TypesenseVectorStoreConfig; import org.springframework.ai.vectorstore.observation.VectorStoreObservationConvention; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -70,14 +70,16 @@ public TypesenseVectorStore vectorStore(Client typesenseClient, EmbeddingModel e ObjectProvider customObservationConvention, BatchingStrategy batchingStrategy) { - TypesenseVectorStoreConfig config = TypesenseVectorStoreConfig.builder() - .withCollectionName(properties.getCollectionName()) - .withEmbeddingDimension(properties.getEmbeddingDimension()) + return TypesenseVectorStore.builder() + .client(typesenseClient) + .embeddingModel(embeddingModel) + .collectionName(properties.getCollectionName()) + .embeddingDimension(properties.getEmbeddingDimension()) + .initializeSchema(properties.isInitializeSchema()) + .observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)) + .customObservationConvention(customObservationConvention.getIfAvailable(() -> null)) + .batchingStrategy(batchingStrategy) .build(); - - return new TypesenseVectorStore(typesenseClient, embeddingModel, config, properties.isInitializeSchema(), - observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP), - customObservationConvention.getIfAvailable(() -> null), batchingStrategy); } @Bean diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreProperties.java index 44c24d1ea65..6c49bfa8a05 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/typesense/TypesenseVectorStoreProperties.java @@ -17,7 +17,7 @@ package org.springframework.ai.autoconfigure.vectorstore.typesense; import org.springframework.ai.autoconfigure.vectorstore.CommonVectorStoreProperties; -import org.springframework.ai.vectorstore.TypesenseVectorStore; +import org.springframework.ai.vectorstore.typesense.TypesenseVectorStore; import org.springframework.boot.context.properties.ConfigurationProperties; /** diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseFilterExpressionConverter.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java similarity index 97% rename from vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseFilterExpressionConverter.java rename to vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java index 8c0a2140bd5..f1d1ae3fb0d 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseFilterExpressionConverter.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseFilterExpressionConverter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.typesense; import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.filter.converter.AbstractFilterExpressionConverter; diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java similarity index 66% rename from vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java rename to vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java index 9bcfaa5edda..a62acf32e20 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.typesense; import java.util.HashMap; import java.util.List; @@ -45,6 +45,8 @@ import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; +import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; +import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; @@ -86,39 +88,83 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme private final Client client; - private final EmbeddingModel embeddingModel; - + @Deprecated(forRemoval = true, since = "1.0.0-M5") private final TypesenseVectorStoreConfig config; private final boolean initializeSchema; private final BatchingStrategy batchingStrategy; + private final String collectionName; + + private final int embeddingDimension; + + /** + * @deprecated Use {@link #builder()} instead + */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public TypesenseVectorStore(Client client, EmbeddingModel embeddingModel) { this(client, embeddingModel, TypesenseVectorStoreConfig.defaultConfig(), false); } + /** + * @deprecated Use {@link #builder()} instead + */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public TypesenseVectorStore(Client client, EmbeddingModel embeddingModel, TypesenseVectorStoreConfig config, boolean initializeSchema) { - this(client, embeddingModel, config, initializeSchema, ObservationRegistry.NOOP, null, new TokenCountBatchingStrategy()); } + /** + * @deprecated Use {@link #builder()} instead + */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public TypesenseVectorStore(Client client, EmbeddingModel embeddingModel, TypesenseVectorStoreConfig config, boolean initializeSchema, ObservationRegistry observationRegistry, VectorStoreObservationConvention customObservationConvention, BatchingStrategy batchingStrategy) { - super(observationRegistry, customObservationConvention); + this(builder().client(client) + .embeddingModel(embeddingModel) + .collectionName(config.collectionName) + .embeddingDimension(config.embeddingDimension) + .initializeSchema(initializeSchema) + .observationRegistry(observationRegistry) + .customObservationConvention(customObservationConvention) + .batchingStrategy(batchingStrategy)); + } + + /** + * Protected constructor for creating a TypesenseVectorStore instance using the + * builder pattern. This constructor initializes the vector store with the configured + * settings from the builder and performs necessary validations. + * @param builder the {@link TypesenseBuilder} containing all configuration settings + * @throws IllegalArgumentException if the client is null + * @throws IllegalArgumentException if the embeddingModel is null + * @see TypesenseBuilder + * @since 1.0.0 + */ + protected TypesenseVectorStore(TypesenseBuilder builder) { + super(builder); - Assert.notNull(client, "Typesense must not be null"); - Assert.notNull(embeddingModel, "EmbeddingModel must not be null"); + Assert.notNull(builder.client, "Typesense must not be null"); - this.client = client; - this.embeddingModel = embeddingModel; - this.config = config; - this.initializeSchema = initializeSchema; - this.batchingStrategy = batchingStrategy; + this.client = builder.client; + this.initializeSchema = builder.initializeSchema; + this.batchingStrategy = builder.batchingStrategy; + this.collectionName = builder.collectionName; + this.embeddingDimension = builder.embeddingDimension; + this.config = null; + } + + /** + * Creates a new TypesenseBuilder instance. This is the recommended way to instantiate + * a TypesenseVectorStore. + * @return a new TypesenseBuilder instance + */ + public static TypesenseBuilder builder() { + return new TypesenseBuilder(); } @Override @@ -142,9 +188,7 @@ public void doAdd(List documents) { importDocumentsParameters.action("upsert"); try { - this.client.collections(this.config.collectionName) - .documents() - .import_(documentList, importDocumentsParameters); + this.client.collections(this.collectionName).documents().import_(documentList, importDocumentsParameters); logger.info("Added {} documents", documentList.size()); } @@ -159,7 +203,7 @@ public Optional doDelete(List idList) { deleteDocumentsParameters.filterBy(DOC_ID_FIELD_NAME + ":=[" + String.join(",", idList) + "]"); try { - int deletedDocs = (Integer) this.client.collections(this.config.collectionName) + int deletedDocs = (Integer) this.client.collections(this.collectionName) .documents() .delete(deleteDocumentsParameters) .getOrDefault("num_deleted", 0); @@ -188,7 +232,7 @@ public List doSimilaritySearch(SearchRequest request) { float[] embedding = this.embeddingModel.embed(request.getQuery()); MultiSearchCollectionParameters multiSearchCollectionParameters = new MultiSearchCollectionParameters(); - multiSearchCollectionParameters.collection(this.config.collectionName); + multiSearchCollectionParameters.collection(this.collectionName); multiSearchCollectionParameters.q("*"); Stream floatStream = IntStream.range(0, embedding.length).mapToObj(i -> embedding[i]); @@ -235,8 +279,8 @@ public List doSimilaritySearch(SearchRequest request) { } int embeddingDimensions() { - if (this.config.embeddingDimension != INVALID_EMBEDDING_DIMENSION) { - return this.config.embeddingDimension; + if (this.embeddingDimension != INVALID_EMBEDDING_DIMENSION) { + return this.embeddingDimension; } try { int embeddingDimensions = this.embeddingModel.dimensions(); @@ -246,7 +290,7 @@ int embeddingDimensions() { } catch (Exception e) { logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.config.embeddingDimension, e); + + this.embeddingDimension, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } @@ -263,7 +307,7 @@ public void afterPropertiesSet() { private boolean hasCollection() { try { - this.client.collections(this.config.collectionName).retrieve(); + this.client.collections(this.collectionName).retrieve(); return true; } catch (Exception e) { @@ -273,13 +317,13 @@ private boolean hasCollection() { void createCollection() { if (this.hasCollection()) { - logger.info("Collection {} already exists", this.config.collectionName); + logger.info("Collection {} already exists", this.collectionName); return; } CollectionSchema collectionSchema = new CollectionSchema(); - collectionSchema.name(this.config.collectionName) + collectionSchema.name(this.collectionName) .addFieldsItem(new Field().name(DOC_ID_FIELD_NAME).type(FieldTypes.STRING).optional(false)) .addFieldsItem(new Field().name(CONTENT_FIELD_NAME).type(FieldTypes.STRING).optional(false)) .addFieldsItem(new Field().name(METADATA_FIELD_NAME).type(FieldTypes.OBJECT).optional(true)) @@ -291,31 +335,31 @@ void createCollection() { try { this.client.collections().create(collectionSchema); - logger.info("Collection {} created", this.config.collectionName); + logger.info("Collection {} created", this.collectionName); } catch (Exception e) { - logger.error("Failed to create collection {}", this.config.collectionName, e); + logger.error("Failed to create collection {}", this.collectionName, e); } } void dropCollection() { if (!this.hasCollection()) { - logger.info("Collection {} does not exist", this.config.collectionName); + logger.info("Collection {} does not exist", this.collectionName); return; } try { - this.client.collections(this.config.collectionName).delete(); - logger.info("Collection {} dropped", this.config.collectionName); + this.client.collections(this.collectionName).delete(); + logger.info("Collection {} dropped", this.collectionName); } catch (Exception e) { - logger.error("Failed to drop collection {}", this.config.collectionName, e); + logger.error("Failed to drop collection {}", this.collectionName, e); } } Map getCollectionInfo() { try { - CollectionResponse retrievedCollection = this.client.collections(this.config.collectionName).retrieve(); + CollectionResponse retrievedCollection = this.client.collections(this.collectionName).retrieve(); return Map.of("name", retrievedCollection.getName(), "num_documents", retrievedCollection.getNumDocuments()); } @@ -331,17 +375,100 @@ public VectorStoreObservationContext.Builder createObservationContextBuilder(Str return VectorStoreObservationContext.builder(VectorStoreProvider.TYPESENSE.value(), operationName) .withDimensions(this.embeddingModel.dimensions()) - .withCollectionName(this.config.collectionName) + .withCollectionName(this.collectionName) .withFieldName(EMBEDDING_FIELD_NAME) .withSimilarityMetric(VectorStoreSimilarityMetric.COSINE.value()); } + public static final class TypesenseBuilder extends AbstractVectorStoreBuilder { + + private String collectionName = DEFAULT_COLLECTION_NAME; + + private int embeddingDimension = INVALID_EMBEDDING_DIMENSION; + + private Client client; + + private boolean initializeSchema = false; + + private BatchingStrategy batchingStrategy = new TokenCountBatchingStrategy(); + + /** + * Configures the Typesense client. + * @param client the client for Typesense operations + * @return this builder instance + * @throws IllegalArgumentException if client is null + */ + public TypesenseBuilder client(Client client) { + Assert.notNull(client, "client must not be null"); + this.client = client; + return this; + } + + /** + * Configures the collection name. + * @param collectionName the collection name to use + * @return this builder instance + * @throws IllegalArgumentException if collectionName is null or empty + */ + public TypesenseBuilder collectionName(String collectionName) { + Assert.hasText(collectionName, "collectionName must not be empty"); + this.collectionName = collectionName; + return this; + } + + /** + * Configures the dimension size of the embedding vectors. + * @param embeddingDimension The dimension of the embedding + * @return this builder instance + * @throws IllegalArgumentException if dimension is invalid + */ + public TypesenseBuilder embeddingDimension(int embeddingDimension) { + Assert.isTrue(embeddingDimension > 0, "Embedding dimension must be greater than 0"); + this.embeddingDimension = embeddingDimension; + return this; + } + + /** + * Configures whether to initialize the collection schema automatically. + * @param initializeSchema true to initialize schema automatically + * @return this builder instance + */ + public TypesenseBuilder initializeSchema(boolean initializeSchema) { + this.initializeSchema = initializeSchema; + return this; + } + + /** + * Configures the strategy for batching operations. + * @param batchingStrategy the batching strategy to use + * @return this builder instance + * @throws IllegalArgumentException if batchingStrategy is null + */ + public TypesenseBuilder batchingStrategy(BatchingStrategy batchingStrategy) { + Assert.notNull(batchingStrategy, "batchingStrategy must not be null"); + this.batchingStrategy = batchingStrategy; + return this; + } + + @Override + public TypesenseVectorStore build() { + validate(); + return new TypesenseVectorStore(this); + } + + } + + /** + * @deprecated Use {@link TypesenseVectorStore#builder()} instead + */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public static class TypesenseVectorStoreConfig { private final String collectionName; private final int embeddingDimension; + @Deprecated(forRemoval = true, since = "1.0.0-M5") public TypesenseVectorStoreConfig(String collectionName, int embeddingDimension) { this.collectionName = collectionName; this.embeddingDimension = embeddingDimension; @@ -355,6 +482,7 @@ private TypesenseVectorStoreConfig(Builder builder) { /** * {@return the default config} */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public static TypesenseVectorStoreConfig defaultConfig() { return builder().build(); } @@ -363,11 +491,13 @@ public static TypesenseVectorStoreConfig defaultConfig() { * Start building a new configuration. * @return The entry point for creating a new configuration. */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public static Builder builder() { return new Builder(); } + @Deprecated(forRemoval = true, since = "1.0.0-M5") public static class Builder { private String collectionName; @@ -379,6 +509,7 @@ public static class Builder { * @param collectionName The collection name. * @return The builder. */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public Builder withCollectionName(String collectionName) { this.collectionName = collectionName; return this; @@ -389,6 +520,7 @@ public Builder withCollectionName(String collectionName) { * @param embeddingDimension The embedding dimension. * @return The builder. */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public Builder withEmbeddingDimension(int embeddingDimension) { this.embeddingDimension = embeddingDimension; return this; @@ -398,6 +530,7 @@ public Builder withEmbeddingDimension(int embeddingDimension) { * Build the configuration. * @return The configuration. */ + @Deprecated(forRemoval = true, since = "1.0.0-M5") public TypesenseVectorStoreConfig build() { return new TypesenseVectorStoreConfig(this); } diff --git a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseImage.java b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseImage.java similarity index 94% rename from vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseImage.java rename to vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseImage.java index 8e7bc24d59a..365731a15c1 100644 --- a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseImage.java +++ b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseImage.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.typesense; import org.testcontainers.utility.DockerImageName; diff --git a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseVectorStoreIT.java b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStoreIT.java similarity index 96% rename from vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseVectorStoreIT.java rename to vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStoreIT.java index 6d05a17fab9..6cd76c8fd59 100644 --- a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseVectorStoreIT.java +++ b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStoreIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.typesense; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -37,7 +37,8 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.transformers.TransformersEmbeddingModel; -import org.springframework.ai.vectorstore.TypesenseVectorStore.TypesenseVectorStoreConfig; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -241,12 +242,13 @@ public static class TestApplication { @Bean public VectorStore vectorStore(Client client, EmbeddingModel embeddingModel) { - TypesenseVectorStoreConfig config = TypesenseVectorStoreConfig.builder() - .withCollectionName("test_vector_store") - .withEmbeddingDimension(embeddingModel.dimensions()) + return TypesenseVectorStore.builder() + .client(client) + .embeddingModel(embeddingModel) + .collectionName("test_vector_store") + .embeddingDimension(embeddingModel.dimensions()) + .initializeSchema(true) .build(); - - return new TypesenseVectorStore(client, embeddingModel, config, true); } @Bean diff --git a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseVectorStoreObservationIT.java b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStoreObservationIT.java similarity index 93% rename from vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseVectorStoreObservationIT.java rename to vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStoreObservationIT.java index fefde3d3eb5..86223036cf4 100644 --- a/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/TypesenseVectorStoreObservationIT.java +++ b/vector-stores/spring-ai-typesense-store/src/test/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStoreObservationIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.typesense; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -41,7 +41,8 @@ import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.transformers.TransformersEmbeddingModel; -import org.springframework.ai.vectorstore.TypesenseVectorStore.TypesenseVectorStoreConfig; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.observation.DefaultVectorStoreObservationConvention; import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.HighCardinalityKeyNames; import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.LowCardinalityKeyNames; @@ -169,13 +170,16 @@ public TestObservationRegistry observationRegistry() { public VectorStore vectorStore(Client client, EmbeddingModel embeddingModel, ObservationRegistry observationRegistry) { - TypesenseVectorStoreConfig config = TypesenseVectorStoreConfig.builder() - .withCollectionName(TEST_COLLECTION_NAME) - .withEmbeddingDimension(embeddingModel.dimensions()) + return TypesenseVectorStore.builder() + .client(client) + .embeddingModel(embeddingModel) + .collectionName(TEST_COLLECTION_NAME) + .embeddingDimension(embeddingModel.dimensions()) + .initializeSchema(true) + .observationRegistry(observationRegistry) + .customObservationConvention(null) + .batchingStrategy(new TokenCountBatchingStrategy()) .build(); - - return new TypesenseVectorStore(client, embeddingModel, config, true, observationRegistry, null, - new TokenCountBatchingStrategy()); } @Bean