From 7f39df6e0b978dd14713398a52d4fdbd5c926559 Mon Sep 17 00:00:00 2001 From: Theo Kanning Date: Thu, 28 Apr 2022 16:48:33 -0500 Subject: [PATCH] Add Edit request functionality (#14) --- .../openai/completion/CompletionChoice.java | 2 +- .../openai/completion/CompletionRequest.java | 11 +++-- .../openai/completion/CompletionResult.java | 8 ++-- .../theokanning/openai/edit/EditChoice.java | 22 ++++++++++ .../theokanning/openai/edit/EditRequest.java | 43 +++++++++++++++++++ .../theokanning/openai/edit/EditResult.java | 29 +++++++++++++ .../openai/search/SearchRequest.java | 2 +- .../openai/search/SearchResult.java | 2 +- .../com/theokanning/openai/OpenAiApi.java | 5 +++ .../com/theokanning/openai/OpenAiService.java | 6 +++ .../java/com/theokanning/openai/EditTest.java | 27 ++++++++++++ .../main/java/example/OpenAiApiExample.java | 1 - 12 files changed, 144 insertions(+), 14 deletions(-) create mode 100644 api/src/main/java/com/theokanning/openai/edit/EditChoice.java create mode 100644 api/src/main/java/com/theokanning/openai/edit/EditRequest.java create mode 100644 api/src/main/java/com/theokanning/openai/edit/EditResult.java create mode 100644 client/src/test/java/com/theokanning/openai/EditTest.java diff --git a/api/src/main/java/com/theokanning/openai/completion/CompletionChoice.java b/api/src/main/java/com/theokanning/openai/completion/CompletionChoice.java index c635165..f46f30e 100644 --- a/api/src/main/java/com/theokanning/openai/completion/CompletionChoice.java +++ b/api/src/main/java/com/theokanning/openai/completion/CompletionChoice.java @@ -5,7 +5,7 @@ import lombok.Data; /** * A completion generated by GPT-3 * - * https://beta.openai.com/docs/api-reference/create-completion + * https://beta.openai.com/docs/api-reference/completions/create */ @Data public class CompletionChoice { diff --git a/api/src/main/java/com/theokanning/openai/completion/CompletionRequest.java b/api/src/main/java/com/theokanning/openai/completion/CompletionRequest.java index 33fb5bb..f6c80bc 100644 --- a/api/src/main/java/com/theokanning/openai/completion/CompletionRequest.java +++ b/api/src/main/java/com/theokanning/openai/completion/CompletionRequest.java @@ -11,8 +11,7 @@ import java.util.List; * A request for OpenAi to generate a predicted completion for a prompt. * All fields are nullable. * - * Documentation taken from - * https://beta.openai.com/docs/api-reference/create-completion + * https://beta.openai.com/docs/api-reference/completions/create */ @Builder @NoArgsConstructor @@ -41,7 +40,7 @@ public class CompletionRequest { * What sampling temperature to use. Higher values means the model will take more risks. * Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. * - * We generally recommend using this or {@link top_p} but not both. + * We generally recommend using this or {@link CompletionRequest#topP} but not both. */ Double temperature; @@ -50,7 +49,7 @@ public class CompletionRequest { * the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are * considered. * - * We generally recommend using this or {@link temperature} but not both. + * We generally recommend using this or {@link CompletionRequest#temperature} but not both. */ Double topP; @@ -58,7 +57,7 @@ public class CompletionRequest { * How many completions to generate for each prompt. * * Because this parameter generates many completions, it can quickly consume your token quota. - * Use carefully and ensure that you have reasonable settings for {@link max_tokens} and {@link stop}. + * Use carefully and ensure that you have reasonable settings for {@link CompletionRequest#maxTokens} and {@link CompletionRequest#stop}. */ Integer n; @@ -105,7 +104,7 @@ public class CompletionRequest { * (the one with the lowest log probability per token). * Results cannot be streamed. * - * When used with {@link n}, best_of controls the number of candidate completions and n specifies how many to return, + * When used with {@link CompletionRequest#n}, best_of controls the number of candidate completions and n specifies how many to return, * best_of must be greater than n. */ Integer bestOf; diff --git a/api/src/main/java/com/theokanning/openai/completion/CompletionResult.java b/api/src/main/java/com/theokanning/openai/completion/CompletionResult.java index 48773c0..7ba9fdd 100644 --- a/api/src/main/java/com/theokanning/openai/completion/CompletionResult.java +++ b/api/src/main/java/com/theokanning/openai/completion/CompletionResult.java @@ -7,12 +7,12 @@ import java.util.List; /** * An object containing a response from the completion api * - * https://beta.openai.com/docs/api-reference/create-completion + * https://beta.openai.com/docs/api-reference/completions/create */ @Data public class CompletionResult { /** - * A unique id assigned to this completion + * A unique id assigned to this completion. */ String id; @@ -27,12 +27,12 @@ public class CompletionResult { long created; /** - * The GPT-3 model used + * The GPT-3 model used. */ String model; /** - * A list of generated completions + * A list of generated completions. */ List choices; } diff --git a/api/src/main/java/com/theokanning/openai/edit/EditChoice.java b/api/src/main/java/com/theokanning/openai/edit/EditChoice.java new file mode 100644 index 0000000..bde7892 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/edit/EditChoice.java @@ -0,0 +1,22 @@ +package com.theokanning.openai.edit; + +import lombok.Data; + +/** + * An edit generated by GPT-3 + * + * https://beta.openai.com/docs/api-reference/edits/create + */ +@Data +public class EditChoice { + + /** + * The edited text. + */ + String text; + + /** + * This index of this completion in the returned list. + */ + Integer index; +} diff --git a/api/src/main/java/com/theokanning/openai/edit/EditRequest.java b/api/src/main/java/com/theokanning/openai/edit/EditRequest.java new file mode 100644 index 0000000..9829cfd --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/edit/EditRequest.java @@ -0,0 +1,43 @@ +package com.theokanning.openai.edit; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Given a prompt and an instruction, OpenAi will return an edited version of the prompt + * + * https://beta.openai.com/docs/api-reference/edits/create + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class EditRequest { + + /** + * The input text to use as a starting point for the edit. + */ + String input; + + /** + * The instruction that tells the model how to edit the prompt. + * For example, "Fix the spelling mistakes" + */ + String instruction; + + /** + * What sampling temperature to use. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 (argmax sampling) for ones with a well-defined answer. + * + * We generally recommend altering this or {@link EditRequest#topP} but not both. + */ + Double temperature; + + /** + * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. + * + * We generally recommend altering this or {@link EditRequest#temperature} but not both. + */ + Double topP; +} diff --git a/api/src/main/java/com/theokanning/openai/edit/EditResult.java b/api/src/main/java/com/theokanning/openai/edit/EditResult.java new file mode 100644 index 0000000..b2b3b54 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/edit/EditResult.java @@ -0,0 +1,29 @@ +package com.theokanning.openai.edit; + +import lombok.Data; + +import java.util.List; + +/** + * A list of edits generated by GPT-3 + * + * https://beta.openai.com/docs/api-reference/edits/create + */ +@Data +public class EditResult { + + /** + * The type of object returned, should be "edit" + */ + String object; + + /** + * The creation time in epoch milliseconds. + */ + long created; + + /** + * A list of generated edits. + */ + List choices; +} diff --git a/api/src/main/java/com/theokanning/openai/search/SearchRequest.java b/api/src/main/java/com/theokanning/openai/search/SearchRequest.java index ba80f57..b2845e0 100644 --- a/api/src/main/java/com/theokanning/openai/search/SearchRequest.java +++ b/api/src/main/java/com/theokanning/openai/search/SearchRequest.java @@ -12,7 +12,7 @@ import java.util.List; * GPT-3 will perform a semantic search over the documents and score them based on how related they are to the query. * Higher scores indicate a stronger relation. * - * https://beta.openai.com/docs/api-reference/search + * https://beta.openai.com/docs/api-reference/searches */ @Builder @NoArgsConstructor diff --git a/api/src/main/java/com/theokanning/openai/search/SearchResult.java b/api/src/main/java/com/theokanning/openai/search/SearchResult.java index f2dcd18..a3bfa11 100644 --- a/api/src/main/java/com/theokanning/openai/search/SearchResult.java +++ b/api/src/main/java/com/theokanning/openai/search/SearchResult.java @@ -5,7 +5,7 @@ import lombok.Data; /** * A search result for a single document. * - * https://beta.openai.com/docs/api-reference/search + * https://beta.openai.com/docs/api-reference/searches */ @Data public class SearchResult { diff --git a/client/src/main/java/com/theokanning/openai/OpenAiApi.java b/client/src/main/java/com/theokanning/openai/OpenAiApi.java index 48ac354..a262da0 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.edit.EditRequest; +import com.theokanning.openai.edit.EditResult; import com.theokanning.openai.embedding.EmbeddingRequest; import com.theokanning.openai.embedding.EmbeddingResult; import com.theokanning.openai.engine.Engine; @@ -31,6 +33,9 @@ public interface OpenAiApi { @POST("/v1/engines/{engine_id}/completions") Single createCompletion(@Path("engine_id") String engineId, @Body CompletionRequest request); + @POST("/v1/engines/{engine_id}/edits") + Single createEdit(@Path("engine_id") String engineId, @Body EditRequest request); + @POST("/v1/engines/{engine_id}/search") Single> search(@Path("engine_id") String engineId, @Body SearchRequest request); diff --git a/client/src/main/java/com/theokanning/openai/OpenAiService.java b/client/src/main/java/com/theokanning/openai/OpenAiService.java index 8b73636..41848f9 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.edit.EditRequest; +import com.theokanning.openai.edit.EditResult; import com.theokanning.openai.embedding.EmbeddingRequest; import com.theokanning.openai.embedding.EmbeddingResult; import com.theokanning.openai.engine.Engine; @@ -64,6 +66,10 @@ public class OpenAiService { return api.createCompletion(engineId, request).blockingGet(); } + public EditResult createEdit(String engineId, EditRequest request) { + return api.createEdit(engineId, request).blockingGet(); + } + public List search(String engineId, SearchRequest request) { return api.search(engineId, request).blockingGet().data; } diff --git a/client/src/test/java/com/theokanning/openai/EditTest.java b/client/src/test/java/com/theokanning/openai/EditTest.java new file mode 100644 index 0000000..39836de --- /dev/null +++ b/client/src/test/java/com/theokanning/openai/EditTest.java @@ -0,0 +1,27 @@ +package com.theokanning.openai; + +import com.theokanning.openai.edit.EditRequest; +import com.theokanning.openai.edit.EditResult; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Disabled // disabled until edit example CURL works +public class EditTest { + + String token = System.getenv("OPENAI_TOKEN"); + OpenAiService service = new OpenAiService(token); + + @Test + void edit() { + EditRequest request = EditRequest.builder() + .input("What day of the wek is it?") + .instruction("Fix the spelling mistakes") + .build(); + + EditResult result = service.createEdit("text-ada-001", request); + + assertEquals("What day of the week is it?", result.getChoices().get(0).getText()); + } +} diff --git a/example/src/main/java/example/OpenAiApiExample.java b/example/src/main/java/example/OpenAiApiExample.java index f1ba34f..bd9d9a0 100644 --- a/example/src/main/java/example/OpenAiApiExample.java +++ b/example/src/main/java/example/OpenAiApiExample.java @@ -20,7 +20,6 @@ class OpenAiApiExample { System.out.println(ada); System.out.println("\nCreating completion..."); - CompletionRequest completionRequest = CompletionRequest.builder() .prompt("Somebody once told me the world is gonna roll me") .echo(true)