diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 9744266..0a1674e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,15 +5,19 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -25,37 +29,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- {
+ "keyToString": {
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "TODO_SCOPE": "All Places",
+ "WebServerToolWindowFactoryState": "false",
+ "git-widget-placeholder": "main",
+ "jdk.selected.JAVA_MODULE": "openjdk-20",
+ "last_opened_file_path": "/Users/javier/projects/eLLMental",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "preferences.pluginManager",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -70,7 +97,7 @@
-
+
@@ -111,6 +138,8 @@
+
+
diff --git a/core/src/main/java/com/theagilemonkeys/ellmental/core/schema/Embedding.java b/core/src/main/java/com/theagilemonkeys/ellmental/core/schema/Embedding.java
index e845f13..c4a638f 100644
--- a/core/src/main/java/com/theagilemonkeys/ellmental/core/schema/Embedding.java
+++ b/core/src/main/java/com/theagilemonkeys/ellmental/core/schema/Embedding.java
@@ -1,12 +1,14 @@
package com.theagilemonkeys.ellmental.core.schema;
import java.util.List;
-
-public class Embedding {
-
- public Embedding(List vector) {
- this.vector = vector;
- }
- public List vector;
-
-}
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Embeddings represent a point in the embeddings space, representing the semantics of a given text.
+ */
+public record Embedding(
+ UUID id,
+ List vector,
+ Map metadata
+) {}
diff --git a/docs-site/docs/03_components/01_core_abstractions.md b/docs-site/docs/03_components/01_core_abstractions.md
index 9327987..732d4c7 100644
--- a/docs-site/docs/03_components/01_core_abstractions.md
+++ b/docs-site/docs/03_components/01_core_abstractions.md
@@ -1,6 +1,23 @@
# Core Abstractions
-eLLMental uses different 3rd party components and APIs and provides a unified interface. To ensure extensibility and avoid tight coupling with any specific API, the library provides a series of abstract classes that define the expected interface for these components to work with eLLMental. To use eLLMental, you can provide your own implementation or use one of the built-in concrete implementations.
+eLLMental uses different 3rd party components and APIs and provides a unified interface. To ensure extensibility and avoid tight coupling with any specific API, the library provides a series of abstract classes that define the expected interface for these components to work with eLLMental. To use eLLMental, you can provide your own implementation or use one of the built-in concrete implementations.
+
+## `Embedding` object
+
+In eLLMental embeddings are represented by the `Embedding` record, which has the following attributes:
+
+- `id`: An unique identifier of the embedding.
+- `vector`: A numeric vector that represents the semantic location of the text.
+- `metadata`: Additional information associated with the embedding. It can be used to store the original text, the model used to generate the embedding, or any other information you may find useful.
+
+```java
+public record Embedding(
+ UUID id,
+ List vector,
+ Map metadata
+) {}
+
+```
## `EmbeddingsGenerationModel`
@@ -17,19 +34,22 @@ public abstract class EmbeddingsGenerationModel {
eLLMental provides an implementation to use [OpenAI's embeddings model](https://platform.openai.com/docs/guides/embeddings). This model is only accessible via API, so you'll need to initialize it with a valid OpenAI API key.
```java
+// You can explicitly initialize the model with your API key, or use the constructor without parameters and set the `OPENAI_API_KEY` environment variable.
EmbeddingsGenerationModel openAIModel = new OpenAIEmbeddingsGenerationModel("YOUR_OPENAI_API_KEY");
-// You'll rarely need to interact directly with the `openAIModel`, but you can use it to generate an embedding:
-openAIModel.generateEmbedding("Sample string");
+// You'll rarely need to interact directly with the `openAIModel`, but you can use it to generate an embedding object:
+Embedding embedding = openAIModel.generateEmbedding("Sample string");
```
+The OpenAI embeddings generator will automatically include the original text, the timestamp and the model used to generate the embedding in the metadata.
+
## `EmbeddingsStore`
This abstract class defines the expected interface for a persistence mechanism capable of storing and querying embeddings:
```java
public abstract class EmbeddingsStore {
- public abstract void store(Embedding embedding, Metadata metadata);
+ public abstract void store(Embedding embedding);
public abstract List similaritySearch(Embedding reference, int limit);
}
```
@@ -39,9 +59,10 @@ public abstract class EmbeddingsStore {
eLLMental provides a concrete implementation for Pinecone, which requires defining an URL, an API Key and a space.
```java
-EmbeddingsStore pineconeStore = new PineconeEmbeddingsStore("YOUR_PINECONE_URL", "YOUR_PINECONE_API_KEY", "YOUR_PINECONE_SPACE");
+// You can explicitly initialize the store with your credentials, or use the constructor with no parameters and set the `PINECONE_URL`, `PINECONE_API_KEY` and `PINECONE_NAMESPACE` environment variables.
+EmbeddingsStore pineconeStore = new PineconeEmbeddingsStore("YOUR_PINECONE_URL", "YOUR_PINECONE_API_KEY", "YOUR_PINECONE_NAMESPACE");
-// You can insert or perform similarity searches using this object. Metadata is optional.
-pineconeStore.store(someEmbedding, someMetadata);
+// You can now insert or perform similarity searches using the pineconeStore instance:
+pineconeStore.store(someEmbedding);
List similarEmbeddings = pineconeStore.similaritySearch(referenceEmbedding, 5);
```
\ No newline at end of file
diff --git a/docs-site/docs/03_components/02_embeddings_space.md b/docs-site/docs/03_components/02_embeddings_space.md
index cc267f4..285b6e2 100644
--- a/docs-site/docs/03_components/02_embeddings_space.md
+++ b/docs-site/docs/03_components/02_embeddings_space.md
@@ -11,26 +11,6 @@ Leveraging the power of embeddings models, this component allows you to represen
[//]: # (TODO: Highlight this as a warning message in Docusaurus)
> **Warning**: The current version supports the [OpenAI embeddings model](https://platform.openai.com/docs/guides/embeddings) and [Pinecone](https://www.pinecone.io) for storage. Please provide the necessary credentials for these services. Note: these services may involve costs, always review their pricing details before use.
-## `Embedding` object
-
-In eLLMental embeddings are represented by the `Embedding` class, which has the following attributes:
-
-- `id`: The unique identifier of the embedding.
-- `embedding`: The numeric representation of the text.
-- `metadata`: Additional information associated with the embedding.
-- `createdAt`: The timestamp of the embedding creation.
-- `modelId`: The identifier of the embeddings model used to generate the embedding.
-
-```java
-public class Embedding {
- private final String id;
- private final float[] embedding;
- private final Map metadata;
- private final Instant createdAt;
- private final String modelId;
-}
-```
-
The `EmbeddingsSpaceComponent` interface defines the following methods:
## Constructor
diff --git a/examples/simplejava/src/main/java/com/theagilemonkeys/ellmental/helloworld/Main.java b/examples/simplejava/src/main/java/com/theagilemonkeys/ellmental/helloworld/Main.java
index af457b8..2dc7e4f 100644
--- a/examples/simplejava/src/main/java/com/theagilemonkeys/ellmental/helloworld/Main.java
+++ b/examples/simplejava/src/main/java/com/theagilemonkeys/ellmental/helloworld/Main.java
@@ -16,10 +16,7 @@ public static void main(String[] args) {
// Step 2: save the generated embeddings to a store (Pinecone in this case)
EmbeddingsStore embeddingStore = new PineconeEmbeddingsStore();
- Map metadata = new HashMap<>();
- metadata.put("key1", "value1");
- metadata.put("key2", "value2");
- embeddingStore.store(embedding, metadata);
+ embeddingStore.store(embedding);
// Step 3: search for the embedding in the store
List searchEmbeddings = embeddingStore.similaritySearch(embedding, 5);
diff --git a/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/EmbeddingsGenerationModel.java b/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/EmbeddingsGenerationModel.java
index 0eddceb..c3c47a9 100644
--- a/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/EmbeddingsGenerationModel.java
+++ b/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/EmbeddingsGenerationModel.java
@@ -3,6 +3,9 @@
import com.theagilemonkeys.ellmental.core.schema.Embedding;
+/**
+ * Abstract class that defines the interface expected by eLLMental for a valid embeddings generation model.
+ */
public abstract class EmbeddingsGenerationModel {
public abstract Embedding generateEmbedding(String text);
}
\ No newline at end of file
diff --git a/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModel.java b/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModel.java
index 54a9e2c..7ddeac3 100644
--- a/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModel.java
+++ b/modules/embeddingsgeneration/src/main/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModel.java
@@ -11,30 +11,52 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+/**
+ * OpenAI `EmbeddingsGenerationModel` implementation.
+ */
public class OpenAIEmbeddingsModel extends EmbeddingsGenerationModel {
- private static OpenAiService service;
+ private static String openAIKey;
+ private static OpenAiService cachedService;
public static String embeddingOpenAiModel = "text-embedding-ada-002";
+ /**
+ * Constructor that initializes the OpenAI embeddings model.
+ * It will try to load the API key from the environment variable `OPEN_AI_API_KEY`.
+ */
public OpenAIEmbeddingsModel() {
- var dotenv = Dotenv
- .configure()
- .ignoreIfMissing()
- .ignoreIfMalformed()
- .load();
- String openAIKey = dotenv.get("OPEN_AI_API_KEY");
- if (openAIKey == null) {
- throw new EnvironmentVariableNotDeclaredException("Environment variable OPEN_AI_API_KEY is not declared.");
- }
- service = new OpenAiService(openAIKey);
+ this(null);
+ }
+ /**
+ * Constructor that initializes the OpenAI embeddings model with an explicit API Key.
+ *
+ * @param openAIKey OpenAI API key.
+ */
+ public OpenAIEmbeddingsModel(String APIKey) {
+ if (APIKey != null) {
+ openAIKey = APIKey;
+ } else { // Tries to load it from the environment variable
+ var dotenv = Dotenv
+ .configure()
+ .ignoreIfMissing()
+ .ignoreIfMalformed()
+ .load();
+ openAIKey = dotenv.get("OPEN_AI_API_KEY");
+ }
}
+ /**
+ * Generates an embedding for the given input string.
+ *
+ * @param inputString Input string to generate the embedding for.
+ * @return An embedding object for the given text.
+ */
public Embedding generateEmbedding(String inputString) {
-
- // TODO: the embeddings function from the library uses an array as input. We are
- // only using a length 1 array.
- // Check if we should implement an array option.
+ /* TODO: the embeddings function from the library uses an array as input.
+ We are only using a length 1 array. Should implement an array option? */
List embeddingsInput = new ArrayList<>();
embeddingsInput.add(inputString);
@@ -43,8 +65,27 @@ public Embedding generateEmbedding(String inputString) {
.input(embeddingsInput)
.build();
- List embedding = service.createEmbeddings(embeddingRequest).getData().get(0).getEmbedding();
+ List vector = getService()
+ .createEmbeddings(embeddingRequest)
+ .getData()
+ .get(0)
+ .getEmbedding();
- return new Embedding(embedding);
+ Map metadata = new java.util.HashMap<>();
+ metadata.put("input", inputString);
+ metadata.put("source", "OpenAI");
+ metadata.put("model", embeddingOpenAiModel);
+ metadata.put("createdAt", java.time.LocalDateTime.now().toString());
+ return new Embedding(UUID.randomUUID(), vector, metadata);
+ }
+
+ private OpenAiService getService() {
+ if (cachedService == null) {
+ if (openAIKey == null) {
+ throw new EnvironmentVariableNotDeclaredException("Environment variable OPEN_AI_API_KEY is required.");
+ }
+ cachedService = new OpenAiService(openAIKey);
+ }
+ return cachedService;
}
}
diff --git a/modules/embeddingsgeneration/src/test/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModelTest.java b/modules/embeddingsgeneration/src/test/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModelTest.java
index eb0be69..affae64 100644
--- a/modules/embeddingsgeneration/src/test/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModelTest.java
+++ b/modules/embeddingsgeneration/src/test/java/com/theagilemonkeys/ellmental/embeddingsgeneration/openai/OpenAIEmbeddingsModelTest.java
@@ -15,8 +15,8 @@ public void testGenerateEmbedding(){
Embedding embedding = openAI.generateEmbedding("The Agile Monkeys rule!");
TestValues testValues = new TestValues();
- assertEquals(embedding.vector.size(), testValues.testGenerateEmbeddingExpectedValue.size());
- assertArrayEquals(embedding.vector.toArray(), testValues.testGenerateEmbeddingExpectedValue.toArray());
+ assertEquals(embedding.vector().size(), testValues.testGenerateEmbeddingExpectedValue.size());
+ assertArrayEquals(embedding.vector().toArray(), testValues.testGenerateEmbeddingExpectedValue.toArray());
}
}
diff --git a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/EmbeddingsStore.java b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/EmbeddingsStore.java
index 7bb7977..66f7f49 100644
--- a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/EmbeddingsStore.java
+++ b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/EmbeddingsStore.java
@@ -5,8 +5,11 @@
import com.theagilemonkeys.ellmental.core.schema.Embedding;
+/**
+ * Abstract class that defines the expected interface for a persistence mechanism capable of storing and querying embeddings.
+ */
public abstract class EmbeddingsStore {
//TODO: check if there is an issue using a map instead of a metadata class
- public abstract void store(Embedding embedding, Map metadata);
+ public abstract void store(Embedding embedding);
public abstract List similaritySearch(Embedding reference, int limit);
}
\ No newline at end of file
diff --git a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStore.java b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStore.java
index 75ea335..5af1b82 100644
--- a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStore.java
+++ b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStore.java
@@ -12,67 +12,53 @@
import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
import io.github.cdimascio.dotenv.Dotenv;
+/**
+ * Implementation for Pinecone EmbeddingsStore
+ */
public class PineconeEmbeddingsStore extends EmbeddingsStore {
-
private final String url;
private final String apiKey;
private final String namespace;
- private static OkHttpClient client;
+ /**
+ * Constructor that initializes the Pinecone embeddings store loading the configuration from environment variables:
+ * It will load the API key from the environment variable `PINECONE_API_KEY`.
+ * It will load the URL from the environment variable `PINECONE_URL`.
+ * It will load the namespace from the environment variable `PINECONE_NAMESPACE`.
+ */
public PineconeEmbeddingsStore() {
- var dotenv = Dotenv
- .configure()
- .ignoreIfMissing()
- .ignoreIfMalformed()
- .load();
- url = dotenv.get("PINECONE_URL");
- apiKey = dotenv.get("PINECONE_API_KEY");
- namespace = dotenv.get("PINECONE_NAMESPACE");
-
- if (url == null) {
- throw new EnvironmentVariableNotDeclaredException("Environement variable PINECONE_URL is not declared.");
- } else if (apiKey == null) {
- throw new EnvironmentVariableNotDeclaredException(
- "Environement variable PINECONE_API_KEY is not declared.");
- } else if (namespace == null) {
- // TODO: need to test code using pinecone with namespace
- throw new EnvironmentVariableNotDeclaredException(
- "Environement variable PINECONE_NAMESPACE is not declared.");
- }
-
- client = new OkHttpClient();
+ this(null, null, null);
}
- private String post(String path, String bodyString) throws IOException {
- MediaType JSON = MediaType.parse("application/json; charset=utf-8");
-
- RequestBody body = RequestBody.create(bodyString, JSON);
-
- Request request = new Request.Builder()
- .url(url + path)
- .header("accept", "application/json")
- .header("content-type", "application/json")
- .header("Api-Key", apiKey)
- .post(body)
- .build();
-
- try (Response response = client.newCall(request).execute()) {
- if (response.code() >= HTTP_BAD_REQUEST) {
- throw new IOException(url);
- }
-
- ResponseBody responseBody = response.body();
-
- if (responseBody != null) {
- return responseBody.string();
- } else {
- return null;
- }
+ /**
+ * Constructor that initializes the Pinecone embeddings store with an explicit url, apiKey and namespace.
+ *
+ * @param url Pinecone URL.
+ * @param apiKey Pinecone API key.
+ * @param namespace Pinecone namespace.
+ */
+ public PineconeEmbeddingsStore(String url, String apiKey, String namespace) {
+ if (url == null || apiKey == null || namespace == null) {
+ var dotenv = Dotenv
+ .configure()
+ .ignoreIfMissing()
+ .ignoreIfMalformed()
+ .load();
+ if (url == null) url = dotenv.get("PINECONE_URL");
+ if (apiKey == null) apiKey = dotenv.get("PINECONE_API_KEY");
+ if (namespace == null) namespace = dotenv.get("PINECONE_NAMESPACE");
}
+ this.url = url;
+ this.apiKey = apiKey;
+ this.namespace = namespace;
}
- public void store(Embedding embedding, Map metadata) {
- UpsertVectorSchema schema = new UpsertVectorSchema(embedding, metadata);
+ /**
+ * Stores an embedding in the embeddings store.
+ * @param embedding Embedding object to store.
+ */
+ public void store(Embedding embedding) {
+ UpsertVectorSchema schema = new UpsertVectorSchema(embedding);
String requestBodyJson = new Gson().toJson(schema);
try {
@@ -88,8 +74,8 @@ public List similaritySearch(Embedding reference, int limit) {
limit,
true,
true,
- reference.vector,
- null);
+ reference.vector(),
+ namespace);
String requestBodyJson = new Gson().toJson(body);
try {
@@ -97,8 +83,8 @@ public List similaritySearch(Embedding reference, int limit) {
QueryVectorResponseSchema response = new Gson().fromJson(responseString, QueryVectorResponseSchema.class);
ArrayList matchEmbeddings = new ArrayList<>();
- for (Match m : response.matches) {
- matchEmbeddings.add(new Embedding(m.values));
+ for (Match match : response.matches) { // TODO: Make sure this array is sorted by similarity using the score field
+ matchEmbeddings.add(new Embedding(match.id, match.values, match.metadata));
}
return matchEmbeddings;
@@ -107,4 +93,46 @@ public List similaritySearch(Embedding reference, int limit) {
return null;
}
}
+
+ private boolean validateEnvironment() {
+ if (url == null) {
+ throw new EnvironmentVariableNotDeclaredException("Environment variable PINECONE_URL is not declared.");
+ } else if (apiKey == null) {
+ throw new EnvironmentVariableNotDeclaredException(
+ "Environment variable PINECONE_API_KEY is not declared.");
+ }
+ // TODO: check if namespace is required. From Pinecone documentation this doesn't seem to be the case, so I removed the check here.
+ return true;
+ }
+
+ private String post(String path, String bodyString) throws IOException {
+ if (!validateEnvironment()) {
+ return null;
+ }
+ MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+
+ RequestBody body = RequestBody.create(bodyString, JSON);
+
+ Request request = new Request.Builder()
+ .url(url + path)
+ .header("accept", "application/json")
+ .header("content-type", "application/json")
+ .header("Api-Key", apiKey)
+ .post(body)
+ .build();
+
+ try (Response response = new OkHttpClient().newCall(request).execute()) {
+ if (response.code() >= HTTP_BAD_REQUEST) {
+ throw new IOException(url);
+ }
+
+ ResponseBody responseBody = response.body();
+
+ if (responseBody != null) {
+ return responseBody.string();
+ } else {
+ return null;
+ }
+ }
+ }
}
diff --git a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/QueryVectorResponseSchema.java b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/QueryVectorResponseSchema.java
index 684a45f..47b5ef5 100644
--- a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/QueryVectorResponseSchema.java
+++ b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/QueryVectorResponseSchema.java
@@ -2,6 +2,7 @@
import java.util.List;
import java.util.Map;
+import java.util.UUID;
public class QueryVectorResponseSchema {
String namespace;
@@ -9,7 +10,7 @@ public class QueryVectorResponseSchema {
}
class Match {
- String id;
+ UUID id;
Double score;
List values;
Map metadata;
diff --git a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/UpsertVectorSchema.java b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/UpsertVectorSchema.java
index f0ddfae..5559adc 100644
--- a/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/UpsertVectorSchema.java
+++ b/modules/embeddingsstore/src/main/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/UpsertVectorSchema.java
@@ -4,16 +4,16 @@
import com.theagilemonkeys.ellmental.core.schema.Embedding;
import java.util.List;
import java.util.Map;
-import java.util.UUID;
import java.util.ArrayList;
+import java.util.UUID;
public class UpsertVectorSchema {
List vectors;
- UpsertVectorSchema(Embedding embedding, Map metadata ) {
+ UpsertVectorSchema(Embedding embedding) {
vectors = new ArrayList<>();
- vectors.add(new Vector(UUID.randomUUID().toString(), embedding.vector, metadata));
+ vectors.add(new Vector(embedding.id(), embedding.vector(), embedding.metadata()));
}
}
@@ -23,7 +23,7 @@ class SparseValues {
}
class Vector {
- Vector (String id, List values, Map metadata) {
+ Vector (UUID id, List values, Map metadata) {
this.id = id;
this.values = values;
this.metadata = metadata;
@@ -32,5 +32,5 @@ class Vector {
public SparseValues sparseValues;
public Map metadata;
public List values;
- public String id;
+ public UUID id;
}
diff --git a/modules/embeddingsstore/src/test/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStoreTest.java b/modules/embeddingsstore/src/test/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStoreTest.java
index c484fe4..d176196 100644
--- a/modules/embeddingsstore/src/test/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStoreTest.java
+++ b/modules/embeddingsstore/src/test/java/com/theagilemonkeys/ellmental/embeddingsstore/pinecone/PineconeEmbeddingsStoreTest.java
@@ -9,6 +9,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
public class PineconeEmbeddingsStoreTest {
//TODO: add mock reponse to improve store test
@@ -16,16 +17,17 @@ public class PineconeEmbeddingsStoreTest {
public void testStore(){
EmbeddingsStore embeddingStore = new PineconeEmbeddingsStore();
TestValues testValues = new TestValues();
- Embedding embedding = new Embedding(testValues.testGenerateEmbeddingExpectedValue);
Map metadata = new HashMap<>();
metadata.put("key1", "value1");
metadata.put("key2", "value2");
- embeddingStore.store(embedding, metadata);
+ Embedding embedding = new Embedding(UUID.randomUUID(), testValues.testGenerateEmbeddingExpectedValue, metadata);
- assertEquals(embedding.vector.size(), testValues.testGenerateEmbeddingExpectedValue.size());
- assertArrayEquals(embedding.vector.toArray(), testValues.testGenerateEmbeddingExpectedValue.toArray());
+ embeddingStore.store(embedding);
+
+ assertEquals(embedding.vector().size(), testValues.testGenerateEmbeddingExpectedValue.size());
+ assertArrayEquals(embedding.vector().toArray(), testValues.testGenerateEmbeddingExpectedValue.toArray());
}
}