From 94fe080043f7a020ff00240f1a281e6d15e5d514 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:01:33 -0500 Subject: [PATCH 1/8] Shorten example class. --- .../java/example/OpenAiAssistantExample.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 example/src/main/java/example/OpenAiAssistantExample.java diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java new file mode 100644 index 00000000..b62fb491 --- /dev/null +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -0,0 +1,79 @@ +package example; + +import com.theokanning.openai.OpenAiResponse; +import com.theokanning.openai.assistants.Assistant; +import com.theokanning.openai.assistants.AssistantRequest; +import com.theokanning.openai.messages.Message; +import com.theokanning.openai.messages.MessageRequest; +import com.theokanning.openai.runs.CreateThreadAndRunRequest; +import com.theokanning.openai.runs.Run; +import com.theokanning.openai.runs.RunCreateRequest; +import com.theokanning.openai.service.OpenAiService; +import java.time.Duration; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +final class OpenAiAssistantExample { + private static void waitForRunToComplete(OpenAiService service, String runId, String threadId) + throws InterruptedException { + Run run; + do { + run = service.retrieveRun(threadId, runId); + // Or do something better to wait for the status to change. + TimeUnit.SECONDS.sleep(1); + } while (!Objects.equals(run.getStatus(), "completed")); + } + + private static void print(OpenAiResponse messageOpenAiResponse) { + for (Message message : messageOpenAiResponse.getData()) { + System.out.printf("[%s] %s%n", message.getRole(), message.getContent().get(0)); + } + } + + public static void main(String... args) throws InterruptedException { + String token = System.getenv("OPENAI_TOKEN"); + OpenAiService service = new OpenAiService(token, Duration.ofSeconds(30)); + System.out.println("\nCreate a new assistant...."); + Assistant assistant = + service.createAssistant( + AssistantRequest.builder() + .name("Daniel Beta Alpha") + .model("gpt-4-1106-preview") + .instructions("A math expert") + .build()); + String assistantId = assistant.getId(); + + System.out.println( + "\nAttach a new thread to the assistant, and run it to create the first message from the\n" + + " assistant..."); + CreateThreadAndRunRequest createThreadAndRunRequest = + CreateThreadAndRunRequest.builder().assistantId(assistantId).build(); + + Run run = service.createThreadAndRun(createThreadAndRunRequest); + System.out.println( + "\nKeep the thread id which is a persistent id for the conversation between the user and the\n" + + " assistant..."); + String threadId = run.getThreadId(); + + System.out.println("\nWait for gpt to process the new thread..."); + waitForRunToComplete(service, run.getId(), threadId); + + System.out.println("\nGet the latest messages list, the one message should be from the assistant..."); + OpenAiResponse messageOpenAiResponse = service.listMessages(threadId); + print(messageOpenAiResponse); + + System.out.println("\nAdd a new message to the thread..."); + service.createMessage( + threadId, MessageRequest.builder().content("Can you solve 1+1?").role("user").build()); + + System.out.println("\nCreate a new run for gpt to response to the message..."); + run = service.createRun(threadId, RunCreateRequest.builder().assistantId(assistantId).build()); + + System.out.println("\nWait again to the run to complete..."); + waitForRunToComplete(service, run.getId(), threadId); + + System.out.println("\nObserve the latest messages after the second run..."); + messageOpenAiResponse = service.listMessages(threadId); + print(messageOpenAiResponse); + } +} From ceb460b81f39fbf5b956ffb21b586e736617917a Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:06:37 -0500 Subject: [PATCH 2/8] Refine the messages print. --- .../java/example/OpenAiAssistantExample.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index b62fb491..f4bd9308 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -4,6 +4,7 @@ import com.theokanning.openai.assistants.Assistant; import com.theokanning.openai.assistants.AssistantRequest; import com.theokanning.openai.messages.Message; +import com.theokanning.openai.messages.MessageContent; import com.theokanning.openai.messages.MessageRequest; import com.theokanning.openai.runs.CreateThreadAndRunRequest; import com.theokanning.openai.runs.Run; @@ -19,20 +20,27 @@ private static void waitForRunToComplete(OpenAiService service, String runId, St Run run; do { run = service.retrieveRun(threadId, runId); - // Or do something better to wait for the status to change. + // Or do something better to wait for the status to change. As for EOY 2023 it takes a few + // seconds. TimeUnit.SECONDS.sleep(1); } while (!Objects.equals(run.getStatus(), "completed")); } - private static void print(OpenAiResponse messageOpenAiResponse) { - for (Message message : messageOpenAiResponse.getData()) { - System.out.printf("[%s] %s%n", message.getRole(), message.getContent().get(0)); + private static void print(OpenAiResponse messages) { + for (Message message : messages.getData()) { + StringBuilder sb = new StringBuilder(); + for(MessageContent content : message.getContent()) { + sb.append(content); + } + + System.out.printf("[%s] %s%n", message.getRole(), sb); } } public static void main(String... args) throws InterruptedException { String token = System.getenv("OPENAI_TOKEN"); OpenAiService service = new OpenAiService(token, Duration.ofSeconds(30)); + System.out.println("\nCreate a new assistant...."); Assistant assistant = service.createAssistant( @@ -48,32 +56,33 @@ public static void main(String... args) throws InterruptedException { + " assistant..."); CreateThreadAndRunRequest createThreadAndRunRequest = CreateThreadAndRunRequest.builder().assistantId(assistantId).build(); - Run run = service.createThreadAndRun(createThreadAndRunRequest); + System.out.println( "\nKeep the thread id which is a persistent id for the conversation between the user and the\n" + " assistant..."); String threadId = run.getThreadId(); - System.out.println("\nWait for gpt to process the new thread..."); + System.out.println("\nWait for GPT to process the new thread..."); waitForRunToComplete(service, run.getId(), threadId); - System.out.println("\nGet the latest messages list, the one message should be from the assistant..."); - OpenAiResponse messageOpenAiResponse = service.listMessages(threadId); - print(messageOpenAiResponse); + System.out.println( + "\nGet the latest messages list, should contain a single message from the assistant..."); + OpenAiResponse messages = service.listMessages(threadId); + print(messages); - System.out.println("\nAdd a new message to the thread..."); + System.out.println("\nAdd a new user message to the thread..."); service.createMessage( threadId, MessageRequest.builder().content("Can you solve 1+1?").role("user").build()); - System.out.println("\nCreate a new run for gpt to response to the message..."); + System.out.println("\nCreate a new run for GPT to response to the message..."); run = service.createRun(threadId, RunCreateRequest.builder().assistantId(assistantId).build()); System.out.println("\nWait again to the run to complete..."); waitForRunToComplete(service, run.getId(), threadId); System.out.println("\nObserve the latest messages after the second run..."); - messageOpenAiResponse = service.listMessages(threadId); - print(messageOpenAiResponse); + messages = service.listMessages(threadId); + print(messages); } } From 3a74b66faa54db6073d6db17847535b097b80b69 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:09:18 -0500 Subject: [PATCH 3/8] Add class javadoc. --- example/src/main/java/example/OpenAiAssistantExample.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index f4bd9308..9046bff8 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -14,6 +14,13 @@ import java.util.Objects; import java.util.concurrent.TimeUnit; +/** Example code to use the assistant feature: + * 1. Create a new assistant + * 2. Attach a thread + * 3. Wait for messages to process + * 4. Attach a new user message + * 5. Wait for messages to process + */ final class OpenAiAssistantExample { private static void waitForRunToComplete(OpenAiService service, String runId, String threadId) throws InterruptedException { From 878593d032278de0a1142b3d23e253edf1016e35 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:09:51 -0500 Subject: [PATCH 4/8] Rename print private method to printMessages --- example/src/main/java/example/OpenAiAssistantExample.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index 9046bff8..43029356 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -33,7 +33,7 @@ private static void waitForRunToComplete(OpenAiService service, String runId, St } while (!Objects.equals(run.getStatus(), "completed")); } - private static void print(OpenAiResponse messages) { + private static void printMessages(OpenAiResponse messages) { for (Message message : messages.getData()) { StringBuilder sb = new StringBuilder(); for(MessageContent content : message.getContent()) { @@ -76,7 +76,7 @@ public static void main(String... args) throws InterruptedException { System.out.println( "\nGet the latest messages list, should contain a single message from the assistant..."); OpenAiResponse messages = service.listMessages(threadId); - print(messages); + printMessages(messages); System.out.println("\nAdd a new user message to the thread..."); service.createMessage( @@ -90,6 +90,6 @@ public static void main(String... args) throws InterruptedException { System.out.println("\nObserve the latest messages after the second run..."); messages = service.listMessages(threadId); - print(messages); + printMessages(messages); } } From b0a1a3da2cb56fd5e19d671b031426007b630995 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:10:10 -0500 Subject: [PATCH 5/8] Rename print private method to printMessages --- example/src/main/java/example/OpenAiAssistantExample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index 43029356..802a0b47 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -40,7 +40,7 @@ private static void printMessages(OpenAiResponse messages) { sb.append(content); } - System.out.printf("[%s] %s%n", message.getRole(), sb); + System.out.printf("[%s] %s", message.getRole(), sb); } } From 341c683766dc5e8f8cebb7e75e8b94f8971a74d9 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:11:25 -0500 Subject: [PATCH 6/8] Rename print private method to printMessages --- example/src/main/java/example/OpenAiAssistantExample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index 802a0b47..43029356 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -40,7 +40,7 @@ private static void printMessages(OpenAiResponse messages) { sb.append(content); } - System.out.printf("[%s] %s", message.getRole(), sb); + System.out.printf("[%s] %s%n", message.getRole(), sb); } } From ba393f0edc309bb571a5182f4dfde13d8c02fd70 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:12:34 -0500 Subject: [PATCH 7/8] Change some of the prints to match the pattern in the codebase. --- .../java/example/OpenAiAssistantExample.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index 43029356..88af0559 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -48,7 +48,7 @@ public static void main(String... args) throws InterruptedException { String token = System.getenv("OPENAI_TOKEN"); OpenAiService service = new OpenAiService(token, Duration.ofSeconds(30)); - System.out.println("\nCreate a new assistant...."); + System.out.println("\nCreating a new assistant...."); Assistant assistant = service.createAssistant( AssistantRequest.builder() @@ -59,37 +59,39 @@ public static void main(String... args) throws InterruptedException { String assistantId = assistant.getId(); System.out.println( - "\nAttach a new thread to the assistant, and run it to create the first message from the\n" + "\nAttaching a new thread to the assistant, and run it to create the first message from the\n" + " assistant..."); CreateThreadAndRunRequest createThreadAndRunRequest = CreateThreadAndRunRequest.builder().assistantId(assistantId).build(); Run run = service.createThreadAndRun(createThreadAndRunRequest); System.out.println( - "\nKeep the thread id which is a persistent id for the conversation between the user and the\n" + "\nKeeping the thread id which is a persistent id for the conversation between the user and the\n" + " assistant..."); String threadId = run.getThreadId(); - System.out.println("\nWait for GPT to process the new thread..."); + System.out.println("\nWaiting for GPT to process the new thread..."); waitForRunToComplete(service, run.getId(), threadId); System.out.println( - "\nGet the latest messages list, should contain a single message from the assistant..."); + "\nGetting the latest messages list, should contain a single message from the assistant..."); OpenAiResponse messages = service.listMessages(threadId); printMessages(messages); - System.out.println("\nAdd a new user message to the thread..."); + System.out.println("\nAdding a new user message to the thread..."); service.createMessage( threadId, MessageRequest.builder().content("Can you solve 1+1?").role("user").build()); - System.out.println("\nCreate a new run for GPT to response to the message..."); + System.out.println("\nCreating a new run for GPT to response to the message..."); run = service.createRun(threadId, RunCreateRequest.builder().assistantId(assistantId).build()); - System.out.println("\nWait again to the run to complete..."); + System.out.println("\nWaiting again to the run to complete..."); waitForRunToComplete(service, run.getId(), threadId); - System.out.println("\nObserve the latest messages after the second run..."); + System.out.println("\nObserving the latest messages after the second run..."); messages = service.listMessages(threadId); printMessages(messages); + + service.shutdownExecutor(); } } From 110e72871b83d87a773f32590e12076d9eab5ae9 Mon Sep 17 00:00:00 2001 From: barak Date: Sun, 24 Dec 2023 22:13:37 -0500 Subject: [PATCH 8/8] Change some of the prints to match the pattern in the codebase. --- example/src/main/java/example/OpenAiAssistantExample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/main/java/example/OpenAiAssistantExample.java b/example/src/main/java/example/OpenAiAssistantExample.java index 88af0559..ddf8ffef 100644 --- a/example/src/main/java/example/OpenAiAssistantExample.java +++ b/example/src/main/java/example/OpenAiAssistantExample.java @@ -16,7 +16,7 @@ /** Example code to use the assistant feature: * 1. Create a new assistant - * 2. Attach a thread + * 2. Create a new thread and attach it to the assistant * 3. Wait for messages to process * 4. Attach a new user message * 5. Wait for messages to process