diff --git a/CHANGELOG.md b/CHANGELOG.md
index a1eb2ec..ce15cf7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,10 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## vNext
+## v2.1.3
Add:
+- Added `IBatchEmbeddingsGenerator` and `.AddTextsAsync` to support batch adding of texts to database.
+- Added OpenAI support for `IBatchEmbeddingsGenerator`
- Added `IVectorTextResultItem.Similarity` and marked `IVectorTextResultItem.VectorComparison` obsolete. `VectorComparison` will be removed in the future.
- Added more comment metadata to code
diff --git a/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj b/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj
index 840abfb..ad68927 100644
--- a/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj
+++ b/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj
@@ -9,7 +9,7 @@
Build5Nines.SharpVector.OpenAI
https://sharpvector.build5nines.com
https://github.com/Build5Nines/SharpVector
- 2.0.3
+ 2.0.4
Lightweight In-memory Vector Database to embed in any .NET Applications that integrates with OpenAI Embedding model for vector generation.
Copyright (c) 2025 Build5Nines LLC
README.md
@@ -25,7 +25,7 @@
-
+
diff --git a/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs b/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs
index 2d2eb7f..1267715 100644
--- a/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs
+++ b/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs
@@ -5,7 +5,7 @@
namespace Build5Nines.SharpVector.OpenAI.Embeddings;
-public class OpenAIEmbeddingsGenerator : IEmbeddingsGenerator //IBatchEmbeddingsGenerator
+public class OpenAIEmbeddingsGenerator : IBatchEmbeddingsGenerator
{
protected EmbeddingClient EmbeddingClient { get; private set; }
diff --git a/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj b/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj
index c50589d..5434a26 100644
--- a/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj
+++ b/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs b/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs
index 5e8b285..66e2949 100644
--- a/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs
+++ b/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs
@@ -39,6 +39,23 @@ public void Setup()
It.IsAny(),
It.IsAny()))
.ReturnsAsync(clientResult);
+
+ _mockEmbeddingClient
+ .Setup(c => c.GenerateEmbeddingsAsync(
+ It.IsAny>(),
+ It.IsAny(),
+ It.IsAny()))
+ .ReturnsAsync((List inputs, EmbeddingGenerationOptions? options, CancellationToken token) =>
+ {
+ // return OpenAIEmbeddingCollection with same embedding for each input
+ var embeddings = new List();
+ for (int i = 0; i < inputs.Count; i++)
+ {
+ embeddings.Add(OpenAIEmbeddingsModelFactory.OpenAIEmbedding(index: i, vector: embeddingVector));
+ }
+ var collection = OpenAIEmbeddingsModelFactory.OpenAIEmbeddingCollection(embeddings);
+ return ClientResult.FromValue(collection, new TestPipelineResponse());
+ });
_database = new BasicOpenAIMemoryVectorDatabase(_mockEmbeddingClient.Object);
}
@@ -135,5 +152,35 @@ public async Task Test_SaveLoad_TestIds_02()
Assert.AreEqual("222", texts[1].Metadata);
Assert.AreEqual("333", texts[2].Metadata);
}
+
+ [TestMethod]
+ public async Task Test_SaveLoad_TestIds_Batch_02()
+ {
+ await _database.AddTextsAsync(new (string text, string? metadata)[]
+ {
+ ("Sample text for testing IDs.", "111"),
+ ("Another sample text for testing IDs.", "222")
+ });
+
+ var results = _database.Search("testing IDs");
+ Assert.AreEqual(2, results.Texts.Count());
+
+ var filename = "openai_test_saveload_testids_batch_02.b59vdb";
+#pragma warning disable CS8604 // Possible null reference argument.
+ await _database.SaveToFileAsync(filename);
+#pragma warning restore CS8604 // Possible null reference argument.
+
+ var newdb = new BasicOpenAIMemoryVectorDatabase(_mockEmbeddingClient.Object);
+ await newdb.LoadFromFileAsync(filename);
+
+ newdb.AddText("A new text after loading to check ID assignment.", "333");
+
+ var newResults = newdb.Search("testing IDs");
+ Assert.AreEqual(3, newResults.Texts.Count());
+ var texts = newResults.Texts.OrderBy(x => x.Metadata).ToArray();
+ Assert.AreEqual("111", texts[0].Metadata);
+ Assert.AreEqual("222", texts[1].Metadata);
+ Assert.AreEqual("333", texts[2].Metadata);
+ }
}
}
\ No newline at end of file