diff --git a/api/src/main/java/com/theokanning/openai/answer/AnswerResult.java b/api/src/main/java/com/theokanning/openai/answer/AnswerResult.java index 19f9c0c..4002d48 100644 --- a/api/src/main/java/com/theokanning/openai/answer/AnswerResult.java +++ b/api/src/main/java/com/theokanning/openai/answer/AnswerResult.java @@ -6,7 +6,7 @@ import java.util.List; /** * An object containing a response from the answer api - *

+ * * https://beta.openai.com/docs/api-reference/answers/create */ @Data diff --git a/api/src/main/java/com/theokanning/openai/embedding/Embedding.java b/api/src/main/java/com/theokanning/openai/embedding/Embedding.java new file mode 100644 index 0000000..5fc423f --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/embedding/Embedding.java @@ -0,0 +1,29 @@ +package com.theokanning.openai.embedding; + +import lombok.Data; + +import java.util.List; + +/** + * Represents an embedding returned by the embedding api + * + * https://beta.openai.com/docs/api-reference/classifications/create + */ +@Data +public class Embedding { + + /** + * The type of object returned, should be "embedding" + */ + String object; + + /** + * The embedding vector + */ + List embedding; + + /** + * The position of this embedding in the list + */ + Integer index; +} diff --git a/api/src/main/java/com/theokanning/openai/embedding/EmbeddingRequest.java b/api/src/main/java/com/theokanning/openai/embedding/EmbeddingRequest.java new file mode 100644 index 0000000..ea989ec --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/embedding/EmbeddingRequest.java @@ -0,0 +1,34 @@ +package com.theokanning.openai.embedding; + +import lombok.*; + +import java.util.List; + +/** + * Creates an embedding vector representing the input text. + * + * Documentation taken from + * https://beta.openai.com/docs/api-reference/embeddings/create + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class EmbeddingRequest { + + /** + * Input text to get embeddings for, encoded as a string or array of tokens. + * To get embeddings for multiple inputs in a single request, pass an array of strings or array of token arrays. + * Each input must not exceed 2048 tokens in length. + *

+ * Unless your are embedding code, we suggest replacing newlines (\n) in your input with a single space, + * as we have observed inferior results when newlines are present. + */ + @NonNull + List input; + + /** + * A unique identifier representing your end-user, which will help OpenAI to monitor and detect abuse. + */ + String user; +} diff --git a/api/src/main/java/com/theokanning/openai/embedding/EmbeddingResult.java b/api/src/main/java/com/theokanning/openai/embedding/EmbeddingResult.java new file mode 100644 index 0000000..6669717 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/embedding/EmbeddingResult.java @@ -0,0 +1,29 @@ +package com.theokanning.openai.embedding; + +import lombok.Data; + +import java.util.List; + +/** + * An object containing a response from the answer api + * + * https://beta.openai.com/docs/api-reference/embeddings/create + */ +@Data +public class EmbeddingResult { + + /** + * The GPT-3 model used for generating embeddings + */ + String model; + + /** + * The type of object returned, should be "list" + */ + String object; + + /** + * A list of the calculated embeddings + */ + List data; +} diff --git a/client/src/main/java/com/theokanning/openai/OpenAiApi.java b/client/src/main/java/com/theokanning/openai/OpenAiApi.java index ec6dc0a..48ac354 100644 --- a/client/src/main/java/com/theokanning/openai/OpenAiApi.java +++ b/client/src/main/java/com/theokanning/openai/OpenAiApi.java @@ -6,6 +6,8 @@ import com.theokanning.openai.classification.ClassificationRequest; import com.theokanning.openai.classification.ClassificationResult; import com.theokanning.openai.completion.CompletionRequest; import com.theokanning.openai.completion.CompletionResult; +import com.theokanning.openai.embedding.EmbeddingRequest; +import com.theokanning.openai.embedding.EmbeddingResult; import com.theokanning.openai.engine.Engine; import com.theokanning.openai.file.File; import com.theokanning.openai.finetune.FineTuneEvent; @@ -72,4 +74,8 @@ public interface OpenAiApi { @DELETE("/v1/models/{fine_tune_id}") Single deleteFineTune(@Path("fine_tune_id") String fineTuneId); + @POST("/v1/engines/{engine_id}/embeddings") + Single createEmbeddings(@Path("engine_id") String engineId, @Body EmbeddingRequest request); + + } diff --git a/client/src/main/java/com/theokanning/openai/OpenAiService.java b/client/src/main/java/com/theokanning/openai/OpenAiService.java index a8ed988..8b73636 100644 --- a/client/src/main/java/com/theokanning/openai/OpenAiService.java +++ b/client/src/main/java/com/theokanning/openai/OpenAiService.java @@ -10,6 +10,8 @@ import com.theokanning.openai.classification.ClassificationRequest; import com.theokanning.openai.classification.ClassificationResult; import com.theokanning.openai.completion.CompletionRequest; import com.theokanning.openai.completion.CompletionResult; +import com.theokanning.openai.embedding.EmbeddingRequest; +import com.theokanning.openai.embedding.EmbeddingResult; import com.theokanning.openai.engine.Engine; import com.theokanning.openai.file.File; import com.theokanning.openai.finetune.FineTuneEvent; @@ -122,4 +124,8 @@ public class OpenAiService { public DeleteResult deleteFineTune(String fineTuneId) { return api.deleteFineTune(fineTuneId).blockingGet(); } + + public EmbeddingResult createEmbeddings(String engineId, EmbeddingRequest request) { + return api.createEmbeddings(engineId, request).blockingGet(); + } } diff --git a/client/src/test/java/com/theokanning/openai/EmbeddingTest.java b/client/src/test/java/com/theokanning/openai/EmbeddingTest.java new file mode 100644 index 0000000..2bbce12 --- /dev/null +++ b/client/src/test/java/com/theokanning/openai/EmbeddingTest.java @@ -0,0 +1,29 @@ +package com.theokanning.openai; + +import com.theokanning.openai.embedding.Embedding; +import com.theokanning.openai.embedding.EmbeddingRequest; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertFalse; + + +public class EmbeddingTest { + + String token = System.getenv("OPENAI_TOKEN"); + OpenAiService service = new OpenAiService(token); + + @Test + void createEmbeddings() { + EmbeddingRequest embeddingRequest = EmbeddingRequest.builder() + .input(Collections.singletonList("The food was delicious and the waiter...")) + .build(); + + List embeddings = service.createEmbeddings("text-similarity-babbage-001", embeddingRequest).getData(); + + assertFalse(embeddings.isEmpty()); + assertFalse(embeddings.get(0).getEmbedding().isEmpty()); + } +}